SPV、SPV节点和SPV钱包

当前位置:首页 > 币圈百科 > SPV、SPV节点和SPV钱包

SPV、SPV节点和SPV钱包

2022-12-23币圈百科332

一、什么是SPV

SPV是“简化支付验证”的简称。中本聪简要提到了这个概念,指出支付可以在不运行完整节点的情况下进行验证,用户只需要保存所有的块头。虽然用户不能自己验证交易,但是如果他可以在区块链的某个地方找到匹配的交易,他就可以知道网络已经批准了该交易以及它已经收到了多少确认。

payments蓑衣网小编2022根据中本聪的原文,这里有一个细节需要注意。SPV指的是“支付验证”,不是“交易验证”。这两种验证有很大的区别。“交易验证”很复杂,涉及验证是否有足够的余额支付,是否有双花,脚本是否可以通过等。通常由运行完整节点的挖掘器来完成。“支付验证”相对简单。它只判断用于“支付”的交易是否经过验证,获得了多少计算能力保护(多少确认)。

考虑这样一种情况,A收到B的通知,B声称自己从某某账户给A汇了一定的钱,在去中心化模式下,没有人能证明B是可靠的。收到这个通知后,A怎么判断B说的是真的?

在比特币系统中,这种通知实现为一种固定格式的“交易”,包含B的汇款账户支票、B的签名、汇给A的金额、A的地址。

如果A想亲自核实这笔交易,首先A要遍历区块链账本,定位到B的账户上,以此来查看B曾经给的账户支票是否有足够的金额;接下来,A要遍历后续的所有账本,看B是否已经把这张账户支票上的钱付给了别人(是否存在双花作弊);然后验证脚本,确定B是否有权限控制账户。这个过程要求A必须获得完整的区块链。

但是,如果A只想知道这笔款项是否经过验证(如果经过验证,就会发货),他可以依靠比特币系统快速验证。也就是说,检查发生该支付的交易是否包括在区块链中,以及获得了多少确认。

原理:块头有三个关键字段。一个是prev_block_hash(前一个块的hash值保证了区块链记录的交易顺序);二是bits(当前块的计算难度),三是merkle_root_hash(借助merkle树算法,保证块内所有事务的真实性)。

在验证一个事务是否真的存在时,理论上用户可以通过以下方式进行验证:

(为了简化模型,我们假设使用tx_hash来定位块。这种方法有被“事务延展性”攻击的风险,在实际应用中可以根据output_point进行定位。)

0蓑衣网小编2022。获取并保存从网络到本地的所有链最长的blockheaders1.计算哈希值tx _ hash交易的;2.定位包含tx_hash的块,并验证块头是否包含在最长的已知链中;3.从块中获取构建merkle树所需的哈希值;4.根据这些哈希值计算merkle _ root _ hash5.如果计算结果等于块头中的merkle_root_hash,则该事务是真实的。6.根据块标题的位置,确定事务处理收到了多少个确认。

优点:大大节省存储空间。减轻最终用户的负担。不管以后的交易量有多大,块头的大小都是一样的,只有80字节。以每小时6块的速度,每年生产52560块。仅保存块头时,每年新增存储需求约4兆,100年后累计存储需求只有400兆。即使用户使用的是最低端的设备,正常情况下也能满载。

问题:如何通过tx_hash定位这个交换所在的块?过去,比特币协议缺乏对此的支持。

二。比特币钱包

在进一步讨论SPV的实现之前,我们先来解释一下比特币钱包里存储了什么,钱包和私钥是什么关系?

既然用了“钱包”这个词,那它应该和我们日常生活中使用的钱包有一些相似之处。为了更直观的解释,我们来和日常生活中使用的钱包对比一下。

钱包

日常生活中,可能会有纸币、支票、印章等。(为简化解释,我们排除银行卡,银行卡涉及中间环节多,增加了表达的复杂性)。用纸币购物时,1。从钱包里装满多张不同面值的纸币,计算总面值是否大于所需金额,应返还多少零钱;2.把这些纸币直接交给卖家;3.卖方验证这些钞票的真实性;4.卖家计算这些纸币的面值是否大于等于商品价格,得到相应的零钱。5.把收到的零钱放回钱包。

比特币的钱包里储存着相当于“一次性支票”的面值和相应的“印章”。付款时,1。用户从钱包里拿出几张“一次性支票”,计算总面值是否大于所需金额以及应该拿回多少零钱,并注意扣除比特币系统收取的手续费;2.给卖家写一张支票,写明卖家地址和付款金额;如果需要零钱,给自己写一张零钱支票(写上地址和零钱金额);3.在从钱包中取出的每张支票上加盖相应的印章,以确认支付权;4.将这些账单提交给比特币系统,该系统将验证支票的真实性以及支付是否有效。5.如果比特币系统验证通过,收款人会将收到的支票放入钱包。用户钱包中已支付的支票将被丢弃(这些支票已被比特币系统视为无效,不能再使用)。

即使是刚接触比特币的人也能猜到“封印”指的是“私钥”。但什么是“一次性支票”?

在比特币系统中,这种“一次性支票”的术语是UTXO,全称是Unspent Transaction Outputs。区块链是记录所有历史交易的总账,每个区块包含若干交易记录。

每条交易记录由两部分组成:资金来源(可以有多个来源)和资金去向(可以有多个去向)。术语是Tx_in(事务输入)和Tx_out(事务输出)。也就是说,每个事务TX包含几个tx _ ins和几个tx _ outs。

除了创世纪区块的交易,每笔交易都要有资金来源。资金来源有两种,一种是挖矿奖励(按照固定算法的货币发行),出现在每个区块的第一笔交易中;另一个是之前的事务中没有使用过的Tx_out(事务输出),即UTXO。挥金者要拿出证据证明自己对Tx_out的所有权,而比特币系统要验证Tx_out是否真的没有被消费过(是否是UTXO),挥金者是否有权消费。

资金去向(TX_out)包含两个部分,一个是转出的金额,一个是控制权(谁可以使用)。提现权是通过比特币的脚本系统实现的。如果收款人地址是以1开头的普通地址,脚本会包含地址对应的公钥的hash值(hash160),使用货币时一般需要用对应的私钥签名;如果收款人的地址是从3开始的多重签名地址,脚本将包含特定脚本的哈希值(hash160)。用钱的时候一般需要根据具体的脚本用多个私钥签名。

用户钱包中的比特币,实际上是用户有权支配且尚未消费的Tx_out中记录的金额之和,即用户支配的所有UTXO金额之和。

一个完整的钱包应该包含几个UTXO和控制每个UTXO时对应的私钥。当然,有时候,从安全的角度来说,钱包可能会被分成两部分。在线钱包里只有UTXO,而离线钱包里只有私钥。

但是,如何让用户把所有的UTXO都放进钱包里呢?

三。用户如何收集自己的UTXO

(一)去中心化方法:1。建立本地存储UTXO的数据库;2.设置块扫描的起点(区块链上的扫描起点高度),从这个点开始,依次下载这个点之后所有块的完整数据。3.分析每个块的所有TX数据,依次读取每个Tx_in的prev _ Tx_out([TX hash][TX _ OUT的序列号]),搜索UTXO数据库中是否存在这个TX _ OUT。如果是这样,从UTXO数据库中删除它(或者将其标记为删除)。4.依次分析每个Tx_out的脚本,如果与用户相关,记录[Tx hash][tx_out的序列号]和整个Tx _ OUT在UTXO数据库中的内容;

utxo

备注:如果钱包里只有新创建的私钥,可以从最新的块开始扫描(由于私钥碰撞的可能性可以视为0,所以在你把比特币地址告诉别人之前,这个私钥对应的地址不会有收入)

优点:不依赖信任;准确的数据。缺点:速度慢,需要从比特币网络下载大量数据,对网络压力大。

(二)集权方式:1。一个中心化的机构(或个人)运行一个完整的比特币节点,建立一个包含所有UTXO的数据库。2.用户使用集中式组织提供的api来请求与自己相关的UTXO数据。

优点:速度快,不拖累比特币网络;缺点:依赖信任;数据不一定准确(有可能是集中式服务器出现故障,或者与中央服务器的会话被劫持,数据被篡改)

IV。什么是瘦客户端、SPV轻钱包、SPV节点?

瘦客户端:参考SPV的机制,客户端在监控收款地址时,只需要将用户可支配交易的相关数据保存在本地即可。由于当地没有完整的区块链,也缺乏汇款人的相关数据,客户无法亲自核实交易是否合法,只能判断交易是否包含,已经确认了几次。与SPV有很多相似之处,所以这种瘦客户端在很多场合常被称为“SPV客户端”。但与SPV不同的是,在去中心化模式下,这些客户端仍然需要下载并分析每个新块的所有数据,只是不需要将所有数据保存在本地。“轻型钱包”是一种以瘦客户机模式实现的钱包。因为没有存储完整的区块链,所以涉及到如何获取UTXO的问题。不同的开发人员可能有自己的实现方法,但是从效率的角度来看,他们往往采用集中式的方式来实现。

SPV节点:支持使用Bloom filter快速检索并返回相关数据的节点。

SPV在执行中涉及到一个问题。如何通过交易特征值(比如tx_hash)定位支付交换所在的区块?中心化是一个很好的解决方案,但是去中心化就没那么简单了,因为之前的比特币系统协议缺乏对SPV的支持。要在分散模式下获取数据,必须做到以下两点:1 .客户端和节点通过接受的协议相互通信;2.数据真实性的自验证3354客户端不需要信任节点是否是诚实节点,返回的数据本身就可以证明数据的真实性。

在原协议中,可以通过getheaders命令获得块头,通过getdata命令获得指定的块,但是不支持块的tx_hash反向查找。为了定位块,客户通常必须下载整个区块链。

新的比特币协议增加了蓑衣网小编2022Bloom filter的功能,解决了客户端检索的问题。其原理是Bloom filter可以快速确定某个检索值一定不存在于指定集合中,从而过滤掉大量无关数据,减少客户端不必要的下载。这样的节点可以为分散式SPV查询提供必要的支持。

如前所述,SPV的目的是验证某笔支付是否实际存在,以及获得了多少确认。钱包的目的是管理自己的资产,进行支付。 简而言之,SPV的应用往往是准备发货(知道钱到了),而“轻钱包”的应用往往是数钱或者花钱。虽然SPV的机制部分借鉴了“轻钱包”,但是和SPV是完全没有用过的应用方向,所以直接把这两个词联系起来有点牵强。这种钱包要么采用集中式的方式提高效率,但引入了信任风险;要么分散模式——不需要信任,但是效率低,增加了网络负担。

SPV节点的出现,使得以去中心化的方式实现高效低负载的“轻钱包”成为可能。我觉得简称“SPV轻钱包”可能更合适,它是基于SPV节点的。文/CHEHW

2015年3月23日

BTC地址:1 chep 8 qzftfvwxrroea 6 wmkc 7 cuwd 3kv

邮箱:HTC . CHEHW @ gmail.com[x

SPV、SPV节点和SPV钱包 | 分享给朋友: