本文由币乎社区(http://bihu.com)内容支持计划奖励。
本篇讲的是白皮书的第八节——简化的支付验证。第八节和第七节合起来构建了轻量节点的解决方案,是完整节点的扩展情况或者说特例。白皮书中涉及到完整节点和轻量节点的章节及它们的关系如下图所示。
1 译文
第八节 简化的支付验证
在没有运行完整的网络节点的情况下进行支付验证是可能的。使用者需要的仅是一份最长「工作证明链」的区块头的完整拷贝——他可以持续的请求网络节点直到他确认他拥有最长的链,同时获得一条Merkle树的分支,该分支将交易和打上时间戳的区块连接起来。他不能自行检查这次交易(因为用户的区块链仅包含区块头),但是通过将这次交易链接到区块链中的一个位置,他可以看到网络节点曾经接收了它,同时在这个区块之后增加的区块确保了整个网络曾经接受过它。
同样地,当诚实节点控制网络时,验证是可靠的。但是当一个算力占优的攻击者控制网络的时候,网络就变得脆弱。当网络节点(network nodes)可以自行验证交易时,只要攻击者持续拥有占有的算力,就可能通过伪造交易来愚弄这个简化方法(例如在一个局域内,攻击者伪造虚假节点)。一个从攻击者中保护系统的策略是,当网络节点发现无效的区块的时候,提醒用户的软件区下载所有的区块,并警告该交易去确认区块是否一致。接收频繁支付的企业可能仍然想要运行他们自己的全节点,以获得更多独立的安全性和更快的验证。
2 解读
2.1 SPV轻量节点的意义
并非所有的节点都有能力储存完整的区块链。许多比特币客户端被设计成运行在空间和效率受限的设备上,如智能电话、平板电脑、嵌入式系统等。通过简化的支付验证方式可以使它们在不必存储完整区块链的情况下进行工作。
——《精通比特币第二版》八章八节
2.2 SPV轻量节点和全节点的区别
SPV只需下载区块头,而不用下载包含在每个区块中的交易信息。由此产生的不含交易的区块链,大小只有完整区块链的1/1000。SPV节点不能构建所有可用于消费的UTXO(指在账户中,未花费的比特币)的全貌,这是由于它们并不知道网络上所有交易的完整信息。SPV节点验证交易时所有的方法略有不同,这个方法需要依赖其余节点「按需」提供区块链相关部分的局部视图。
打个比方来说,每个全节点就像是一个在陌生城市里的游客,他带着一张包含每条街道、每个地址的详细地图。相比之下,SPV节点就像是这名陌生城市里的游客只知道一条主干道的名字(主干道=交易信息),通过随机询问该城市的陌生人来获取分段道路指示(分段道路=连接交易信息和区块的Merkle树的分支)。虽然两种游客都可以通过实地考察来验证一条街是否存在,但没有地图的游客不知道每个小巷中有哪些街道,也不知道附近还有什么其他街道。没有地图的游客在「教堂街23号」(地点=某区块头的交易信息总hash)前,并不知道这个城市里是否还有其他若干条「教堂街23号」,也不知道面前的是否是要找的那个。对他来说,最好的方式就是向足够多的人问路,并且希望其中一部分人不是要试图抢劫他。
——《精通比特币第二版》八章八节(黑字为补充说明)
通过Merkle树验证交易=知道主干道,通过问路找到目的地
2.3 SPV节点的安全性
SPV可以验证某个交易是存在的(知道「教堂街23号」存在),但是它无法验证某个交易不存在(无法得知这个「教堂街23号」是否唯一)。因此SPV节点可能面临双重支付式攻击或者虚假节点式攻击。
但在大多数的实际情况中,具有良好连接的SPV节点是足够安全的(例如我们在家里使用SPV钱包)。当然,如本节最后一句所说,如果想要保证万无一失的安全性,最可靠的方法还是运行全节点。
3 原文
8. Simplified Payment Verification
It is possible to verify payments without running a full network node. A user only needs to keep a copy of the block headers of the longest proof-of-work chain, which he can get by querying network nodes until he’s convinced he has the longest chain, and obtain the Merkle branch linking the transaction to the block it’s timestamped in. He can’t check the transaction for himself, but by linking it to a place in the chain, he can see that a network node has accepted it, and blocks added after it further confirm the network has accepted it.
As such, the verification is reliable as long as honest nodes control the network, but is more vulnerable if the network is overpowered by an attacker. While network nodes can verify transactions for themselves, the simplified method can be fooled by an attacker’s fabricated transactions for as long as the attacker can continue to overpower the network. One strategy to protect against this would be to accept alerts from network nodes when they detect an invalid block, prompting the user’s software to download the full block and alerted transactions to confirm the inconsistency. Businesses that receive frequent payments will probably still want to run their own nodes for more independent security and quicker verification.
领取专属 10元无门槛券
私享最新 技术干货