1703865563
1703865564
因此,费用替代策略受到了不少争议,这些争议一方面从技术层面讨论在费用替代策略中是否可以真正阻止多重支付;另一方面从哲学层面讨论比特币是不是应该要尽可能支持零验证,或直接放弃费用替代策略。我们这里就不再赘述这些讨论了很久的争议了,但最近比特币核心代码倒选用了“有选择权的”(opt-in)费用替代策略的做法,也就是交易可以标记自己是否适用费用替代策略。
1703865565
1703865566
上面说的是交易的传播。至于区块的传播,即矿工挖到一个矿(打包一个区块),然后将区块加入区块链,这个过程与新交易的传播过程类似,也受同样竞态条件的限制。如果两个有效的区块同时被挖到(也就是有两个矿工同时获得了记账权力时),只有其中一个区块可以进入长期共识链,哪个区块被最终纳入长期共识链取决于其他节点选择在哪个区块上扩展区块链,未被纳入的一个即被丢弃。
1703865567
1703865568
核验一个区块要比核验一个交易复杂得多。除了确认区块头部,确定里面的哈希值是在可以接受的范围内,节点还必须确认区块里的每个交易。最后,一个节点往外传播的区块必须是最长的一条区块链上新加入的区块(当然,“最长的区块链”取决于节点对区块链当前状态的认识)。只有这样才可以防止区块链分叉。但就像传播交易时一样,节点同样可以执行它自己的逻辑:它可以选择传递无效的区块,也可以选择传递在共识链上更早加入的区块而不是最新加入的区块。这样就会造成一个分叉,不过这种情况是协议可以承受的。
1703865569
1703865570
泛洪算法(flooding algorithm)的延迟情况到底怎样呢?我们一起看一下图3.9,这张图展示了区块被网络中不同数量的节点接收所花费的时间(秒)。三条线分别代表区块被网络中25%、50%、75%的节点接收到所需要的时间。可以看到,由于网络带宽的限制,比较大的区块需要30秒左右才能传播到大部分的节点。所以这个协议不是很有效率。在互联网上30秒是比较长的时间了,在比特币的设计里,简便是第一位的(简单的网络、节点可随时加入或退出),而效率是第二位的,所以在比特币网络里,一个区块可能需要经过很多节点才到达最远的节点。如果网络采取自上而下的设计,那我们就需要使任何两个节点的距离都很短。
1703865571
1703865572
网络大小
1703865573
1703865574
比特币网络大小很难测量,因为它随时都在变化,而且没有一个中央权威机构。有些人通过研究给了一些估计:往高说,每个月可能有100万个IP地址成为比特币网络的节点(也可能是临时成为节点)。往低说,大约只有5 000~10 000节点永远在线并处理交易。这个数字有点出乎意料得小,但是截至本书完成时,并没有证据表明永远在线的节点数量在升高或降低。
1703865575
1703865576
1703865577
1703865578
1703865579
图3.9 区块传播时间
1703865580
1703865581
注:展示了区块被网络中不同数量(百分比)的节点接受所花费的时间。
1703865582
1703865583
资料来源: Yonatan Sompolinsky和Aviv Zohar, 加快比特币交易的传播速度 (Accelerating Bitcoin’s Transaction Processing,2014)。可从下述网址获得https://eprint.iacr.org/2013/881。数据由Yonatan Sompolinsky和Aviv Zohar授权使用
1703865584
1703865585
存储空间需求
1703865586
1703865587
完全有效的节点必须永久在线,这样才能接收到所有的交易数据。一个节点离线时间越久,当它重新连接到网络的时候,就需要越多时间来更新所有交易。这些节点还需要把完整的共识区块链都存储下来,也需要有好的网络连接,确保可以接收到所有交易并将其转播给其他节点。目前的存储空间大约要几十个GB(见图3.10),一台台式机就能满足要求。
1703865588
1703865589
最后,完全有效节点必须维护在交易中产生的(交易的输出)、未被消费掉的比特币的完整列表,这个列表最好放在内存而非硬盘里,这样,在接收到一个交易信息的时候,节点才能快速查看、运行脚本,验证签名是否有效,然后把交易放入交易池。到2014年年中,大约有4 400万的交易被纳入区块链,其中有1 200万个交易产生的比特币没有被使用。还好,这个数据不大,可以很容易地放进1G内存里。
1703865590
1703865591
1703865592
1703865593
1703865594
图3.10 区块链的大小
1703865595
1703865596
注:全节点必须保持整个区块链,在2015年年底,区块链大小在50GB以上。
1703865597
1703865598
轻量节点
1703865599
1703865600
除了完全有效节点之外,还有一种轻量节点(nightweight nodes),或者称为轻客户端,也叫简单付款验证(Simple Payment Verification,简称SPV)客户端。事实上,在比特币系统里的大部分节点都是轻量节点。这些节点不会存储整个比特币区块链,它们只存储它们所关心的、需要进行核验的部分交易。如果你使用一个钱包软件,那里面就会有一个SPV节点,这个节点只会下载向你的账户付款的交易及区块头部。
1703865601
1703865602
一个SPV节点的安全等级远不如全节点。它可以核验那些很难被挖到的区块——因为它有区块头部数据,但它不能核验一个区块里所有交易记录的有效性——因为它没有所有的交易历史记录,也没有那些未被消费的比特币的列表。SPV节点只验证那些和它们相关的交易,所以它们必须依赖那些全节点去验证网络上的其他所有交易。这虽然是一种安全性上的妥协,却不是个坏主意:轻量节点依赖全节点去处理那些比较难的工作,但当某个区块由于某些原因未被矿工挖出来时(挖矿成本巨大),这些轻量节点也会做一些核验来确保这个区块不会被拒绝。
1703865603
1703865604
作为一个SPV节点可以节省很多资源。区块头部的大小只是整个区块链的千分之一。所以轻量节点不需要几十G的存储空间,只需要几十MB即可,即使一部智能手机也能成为比特币网络的轻量节点。
1703865605
1703865606
比特币是一个开源协议,比特币网络一定是由实现方式各不相同的软件系统在无缝交互。这样,即使有些软件系统有缺陷,也不至于使整个比特币网络瘫痪。比较好的现象是,人们用不同的语言不断地重新实现协议,有些人用C++、有些人用Go语言,还有不少人用其他语言。不好的现象是,绝大部分的节点都会调用比特币官方客户端的资源库(bitcoind library),这个库是比特币核心代码开发者们用C++开发的库,而且有些节点用的是过时的版本。所以,即使在同一时间,大家运行的客户端都略有不同。
1703865607
1703865608
[1]竞态条件也可理解为紊乱情况。——译者注
1703865609
1703865610
1703865611
1703865612
[
上一页 ]
[ :1.703865563e+09 ]
[
下一页 ]