[北大肖臻-区块链技术与应用笔记]第五/六节课——BTC网络的工作原理与难度的调整

[北大肖臻-区块链技术与应用笔记]第五/六节课——BTC网络的工作原理与难度的调整

一、BTC网络层工作原理概述

BTC区块链运行在应用层,其网络层是一个P2P网络。

BTC网络中的P2P网络是很简单的,所有结点之间都是对等的,没有超级结点(super node或master node)。要加入这个网络,至少要有一个种子结点(seed node),和种子结点联系,它会告知它所知道的网络中的其它结点。结点之间通过TCP来通信,有利于穿透防火墙。要离开网络也不必通知其它结点,只需要直接退出应用程序,其它结点一直没有听到你的消息,过一段时间就会将你删除掉。

BTC网络的设计原则是简单、鲁棒,而不是高效。每个结点维护一个邻居结点的集合,消息在网络中采用flooding方式传播,结点第一次听到某个消息,会将它传播给所有邻居结点,同时记录一下自己已经收到过这个消息了,下一次再收到这个消息时就不用再转发给邻居节点了。邻居结点的选取是随机的,没有考虑底层的拓扑结构。比如越南的一个结点可能和美国的一个结点是邻居结点。这样设计的好处是增强鲁棒性,牺牲了效率。

二、传播

新交易的传播

BTC网络中,每个结点要维护一个等待上链的交易的集合,这个集合中的交易都是要写入区块链的合法的交易,结点第一次收到这个交易的时候就会把它写入这个集合,并转发给所有邻居。

如果有两个有冲突的交易,几乎同时发布到网络上,每个结点根据其位置的不同,可能先收到的交易是不同的,那么另一个交易对于这个结点而言就是非法的了,不会被收纳到集合中。

image-20220416200803961

如上图,结点先听到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难度

mining难度介绍

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

所以,在不同的区块链帐本系统中,不管出块时间设计成多长,都要使其保持稳定,而不能允许它无限减少下去。

如何调整mining难度

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是比较保守的,这些参数可能是创造者通过调查得到的。

四、BTC的实际情况

算力增长的情况

在这里插入图片描述

挖矿难度的变化情况(不是目标阈值)
在这里插入图片描述

参考资料

1、BitCoin and Cryptocurrency Technologies:A Comprehensive Introduction

2、以太坊白皮书、黄皮书、源代码

3、Solidity文档

4、北京大学肖臻老师《区块链技术与应用》公开课系列笔记

5、【区块链学习笔记】5:BTC网络的原理简述

6、【区块链学习笔记】6:BTCmining难度的调整

猜你喜欢

转载自blog.csdn.net/weixin_47692652/article/details/124222476