赞
踩
BTC区块链运行在应用层,其网络层是一个P2P网络。
BTC网络中的P2P网络是很简单的,所有结点之间都是对等的,没有超级结点(super node或master node)。要加入这个网络,至少要有一个种子结点(seed node),和种子结点联系,它会告知它所知道的网络中的其它结点。结点之间通过TCP来通信,有利于穿透防火墙。要离开网络也不必通知其它结点,只需要直接退出应用程序,其它结点一直没有听到你的消息,过一段时间就会将你删除掉。
BTC网络的设计原则是简单、鲁棒,而不是高效。每个结点维护一个邻居结点的集合,消息在网络中采用flooding
方式传播,结点第一次听到某个消息,会将它传播给所有邻居结点,同时记录一下自己已经收到过这个消息了,下一次再收到这个消息时就不用再转发给邻居节点了。邻居结点的选取是随机的,没有考虑底层的拓扑结构。比如越南的一个结点可能和美国的一个结点是邻居结点。这样设计的好处是增强鲁棒性,牺牲了效率。
BTC网络中,每个结点要维护一个等待上链的交易的集合,这个集合中的交易都是要写入区块链的合法的交易,结点第一次收到这个交易的时候就会把它写入这个集合,并转发给所有邻居。
如果有两个有冲突的交易,几乎同时发布到网络上,每个结点根据其位置的不同,可能先收到的交易是不同的,那么另一个交易对于这个结点而言就是非法的了,不会被收纳到集合中。
如上图,结点先听到A->B的消息,将其加入到自己的交易集合中,不加入A->C,如果接下来收到一个新发布的区块。其中包含A->B,说明这个交易已经上链了,所以要将其删除掉。如果这个结点收到的新发布的区块中的交易是A->C,这时也要将集合中的A->B删除掉,因为检查可以发现此时集合中的A->B这个交易是非法交易,因为它和新发布的区块中的A->C这个交易冲突了。
也就是说要看接收A->B交易的结点先获得记账权,还是接收A->C交易的结点先获得记账权。
best effort:一个交易发布到BTC网络上,未必所有结点都能收到(有的结点不一定按照BTC协议的要求来转发,可能合法的不转发,不合法的又转发了),而且不同结点收到交易的顺序也很可能是不一样的(网络传输中的延迟可能很大)。这是一个去中心化的系统中要面临的实际问题,只能尽力而为。
和新发布的交易的传播方式是类似的,不过每个结点除了要检查区块的内容是不是合法的,还要检查区块是不是在最长合法链上。
越大的区块在网络上传播越慢,BTC协议要求区块大小不能超过1M,因为BTC网络的效率比较低,一个1M大小的区块可能要几十秒才能传播给BTC网络上的大多数结点。
BTC中的mining就是不断尝试区块块头中的nonce和extra nonce的值,使得:
H
(
block header
)
≤
target
H(\text{block\ header})\le \text{target}
H(block header)≤target
目标阈值target越小,则mining的难度就越大。所以调整mining难度就是在调整target,以调整目标空间在整个输出空间中所占的比例。
BTC中使用的哈希函数是SHA-256,产生的哈希值是256位的,所以整个输出空间是 2 256 2^{256} 2256 ,调整目标空间所占的比例,在这个问题里直观的来看就是最后得到的哈希值前面有多少位0(这只是通俗直观来看的),这个0越多显然值就越小,也就是mining难度越大了。
所以mining难度跟目标阈值成反比
d
i
f
f
i
c
u
l
t
y
=
d
i
f
f
i
c
u
l
t
y
_
1
_
t
a
r
g
e
t
t
a
r
g
e
t
difficulty=\frac{difficulty\_1\_target}{target}
difficulty=targetdifficulty_1_target
difficulty_1_target
是指mining难度difficulty定义为1时所对应的目标阈值target的值。mining难度最小就是1,所以这个常量也就是target允许的最大值。
系统中的总算力越来越强,如果mining难度保持不变,那么平均出块时间会越来越短,这会造成一些问题。假设平均出块时间减小到了1秒钟,也就是每隔1秒左右就有一个新的区块携带一些列交易被发布到BTC网络上,而在BTC网络上这个区块传播给大多数结点可能就要几十秒。如果有两个结点几乎同时发布了区块,那么就会出现分叉:
如果出块时间很短,就会导致这种分叉成为常态。而且不仅仅是二分叉,可能会出现很多分叉:10分叉都有可能。
分叉过多对BTC系统达成共识没有好处,并且会危害BTC系统的安全性,BTC假设大部分算力存放在诚实的结点中。如果出块时间很短,就会导致分叉过多(因为相比于出块时间,可以认为网络上传输的时间变长了),这样诚实结点的算力就被分散了,这时恶意结点要进行51% attack很可能就不需要50%以上的算力了,可能百分之十几就足够了,这样大大降低了BTC系统的安全性。
实际上,BTC中的平均出块时间未必是最优的,后面要学的以太坊的出块时间就降低到了15秒。大幅降低了出块时间,所以以太坊就要设计一个新的共识协议——GHOST
。在这个协议中,分叉产生的orphan block
不能简单丢弃掉,而是也要给予一些奖励——uncle reward
。
所以,在不同的区块链帐本系统中,不管出块时间设计成多长,都要使其保持稳定,而不能允许它无限减少下去。
BTC协议中规定,每隔2016个区块(大约每2个星期)要重新调整一下目标阈值target,具体的迭代更新公式是:
t
a
r
g
e
t
=
t
a
r
g
e
t
×
a
c
t
u
a
l
t
i
m
e
e
x
p
e
c
t
u
a
l
t
i
m
e
target=target\times \frac{actual\ time}{expectual\ time}
target=target×expectual timeactual time
expected time
就是预期的两次调整的间隔时间,即2016乘以10分钟;而actual time
是系统中产生最近的2016个区块实际花费的时间。
实际的时间越大,就越需要降低难度,即提高target;实际的时间越小,就越需要提高难度,即降低target
为了避免系统中出现某些意外情况,导致系统出现非常大的波动,每次对目标阈值target的调整最大不能超过4倍,最小不能小于1/4
恶意结点不调整target
target是写在BTC系统的代码里的,代码也都是开源的,如果有结点到了该调整的时候不调整target怎么办。这也是一个大部分结点诚实的问题,**如果不调整target,那么发布的区块块头里的4字节nBits域(32字节的target压缩编码后的版本)**就不是正确的,诚实的结点不会接收这样的区块。
关于BTC中的一些参数,如1M、10分钟等,不一定都是最好的。BTC是比较保守的,这些参数可能是创造者通过调查得到的。
算力增长的情况
挖矿难度的变化情况(不是目标阈值)
1、BitCoin and Cryptocurrency Technologies:A Comprehensive Introduction
2、以太坊白皮书、黄皮书、源代码
3、Solidity文档
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。