北大肖臻老师《区块链技术与应用》系列课程学习笔记[4]BTC的工作原理

目录

一、BTC网络

1.BTC网络的工作原理

2.新交易的传播

3.新的区块的传播

二、BTC挖矿难度

1.什么是mining难度

2.为什么要调整挖矿难度

3.如何调整挖矿难度

4.如果出现恶意节点不调整target

一、BTC网络

1.BTC网络的工作原理

        比特币工作在应用层(Application Layer),其底层是一个P2P网络。也就是说比特币系统中是在应用层运行比特币协议,其底层也就是网络层运行的是P2P Overlay Network。比特币系统的网络层中的P2P网络是相对简单的,所有节点之间都是相对平等的,没有超级节点(Super Node或Master Node)。想要加入这个网络,至少需要一个种子节点(Seed Node),和种子节点联系,它会将它所知道的网络中的其它节点告知你。各个节点之间通过TCP来通信,这样有利于穿透防火墙。当你需要离开网络的时候,也不必通知其它节点,只需要直接退出应用程序,其它结点一直没有听到你的消息,过一段时间就会将你删除掉。

        比特币网络的设计原则是简单、鲁棒,而不是高效(Simple,robust,but not efficient)。每个节点维护一个邻居节点的集合,消息在网络中采取以flooding的方式传播,节点第一次听到某个消息,会将它传播给所有邻居节点,同时记录一下自己已经收到过这个消息了,下一次再收到这个消息时就不用再转发给邻居节点了。邻居节点的选取是随机的,没有考虑底层的拓扑结构。比如一个加利福尼亚州的节点可能跟一个阿根廷的节点是邻居节点。这样设计的好处是很大程度上增强了鲁棒性,但是牺牲了效率。在计算机科学中,鲁棒性是指一个计算机系统在执行过程中处理错误或者算法在遭遇输入、运算等异常时继续正常运行的能力

        比特币网络的传播属于Best Effort:一个交易发布到BTC网络上,未必所有节点都能收到,有的节点不一定按照比特币协议的要求来转发,可能合法的不转发,不合法的又转发了。而且不同节点收到交易的顺序也很可能是不一样的(网络传输中的延迟可能很大)。这是一个去中心化的系统中要面临的实际问题,只能尽力而为。

2.新交易的传播

        比特币系统中,每个节点要维护一个等待上链的交易的集合。如果说某个集合中的交易都是要写入区块链的合法的交易(要有合法的签名),节点第一次收到这个交易的时候就会把它写入这个集合,并转发给所有邻居,以后再收到这个交易的时候,就不用再次转发给邻居节点了,以避免交易会在网络上无线地传输下去。

        如果有两个有冲突的交易,几乎同时发布到网络上,每个节点根据其位置的不同,可能先收到的交易是不同的,那么另一个交易对于这个节点而言就是非法的了,不会被收纳到集合中。例如,现在有A→B的交易与A→C的交易大约同时发出,有些节点先听见A→B,将其加入自己的交易集合中,就不会再加入A→C的交易,直到有新的区块链发布,其中包含A→B的交易,那么将会在交易集合中将A→B删除。还有一种可能,就是有些节点先听见的使A→C这个交易,那么他们就会将A→C加入自己的交易集合中,但是产生了新的区块链,其中包含A→B的交易,那么也会将A→C删除掉,因为此时的A→C是与A→B冲突的非法交易。也就是说,认定哪个交易属于合法交易主要看接收A→B交易的节点先获得记账权,还是接收A→C交易的节点先获得记账权。

3.新的区块的传播

        新区块的传播和新发布的交易的传播方式是类似的,不过每个节点除了要检查区块的内容是不是合法的,还要检查区块是不是在最长合法链上。越大的区块在网络上传播越慢,比特币协议要求区块大小不能超过1M字节。因为BTC网络的效率比较低,一个1M大小的区块可能要几十秒才能传播给比特币网络上的绝大多数节点。

二、BTC挖矿难度

1.什么是挖矿难度

        比特币系统中的挖矿就是通过不断修改区块块头中的nonce和extra nonce的值,使得:
H ( Block Header ) ≤ target。目标阈值target越小,则mining的难度就越大。所以调整mining难度就是在调整target,以调整目标空间在整个输出空间中所占的比例。比特币中使用的哈希函数是SHA-256,产生的哈希值是256位的,所以整个输出空间是2^{256} ,调整目标空间所占的比例,直观地看就是最后得到的哈希值的前面有多少个0,这个0越多显然值就越小,也就是挖矿的难度越大。

        挖矿难度跟目标阈值成反比difficulty = \frac{difficulty1target}{target}。difficulty1target是指挖矿难度difficulty定义为1时所对应的目标阈值target的值。挖矿难度最小就是1,所以这个常量也就是target允许的最大值

2.为什么要调整挖矿难度

        随着系统中的总算力的不断增强,如果挖矿难度始终保持不变的话,比特币系统中的平均出块时间就会越来越短,那么平均出块时间总会减小到1s甚至更小。假设比特币系统的出块时间为1s时,也就是说每隔1秒左右时间就有一个新的区块携带着一些列交易被发布到比特币网络上,但是在比特币网络中,区块传播给大多数节点需要几十秒。如果有两个节点几乎同时发布了区块,那么就会出现分叉,如果出块时间很短,就会导致这种分叉成为常态。而且不仅仅是二分叉,可能会出现很多分叉

        分叉过多对BTC系统达成共识没有好处,并且会危害比特币系统的安全性,比特币协议假设大部分算力存放在诚实的节点中,系统中算力越强安全性就越好,因为恶意节点进行攻击需要掌握的51%以上的算力的难度就会更大。如果出块时间很短,就会导致分叉过多,这样诚实节点的算力就被分散了,这时恶意节点就可以集中算力扩展恶意的分叉,这样就会导致恶意节点可能不需要掌握51%的算力,就可以达到分叉攻击的目的,这样大大降低了BTC系统的安全性。

        实际上,比特币系统中的平均出块时间也不一定是最优的,例如以太坊的出块时间是15秒。大幅降低了出块时间,所以以太坊设计了一个新的共识协议——Ghost。在这个协议中,分叉产生的Orphan Block就不能像比特币系统中那样简单丢弃了,而是也要给予一定奖励Uncle Reward。所以,在不同的区块链系统中,不管出块时间设计成多长,都要使其保持稳定,不能允许它无限减少下去。

3.如何调整挖矿难度

        比特币协议中规定,每隔2016个区块(大约每14天)要重新调整一下挖矿难度,即调整目标阈值target,具体的迭代更新公式是:target = target*\frac{actuallytime}{expectedtime},这里的expected time为2016*10,actually time是系统中产生最近的2016个区块实际花费的时间。实际的时间越大,就越需要降低难度,即提高target;实际的时间越小,就越需要提高难度,即降低target。为了避免系统中出现某些意外情况,导致系统出现非常大的波动,每次对目标阈值target的调整最大不能超过4倍。相对地target的调整最小也不能小于\frac{1}{4}

4.如果出现恶意节点不调整target

        target是写在BTC系统的代码里的,每产生2016个区块就需要调整target,代码也都是开源的,但是如果存在恶意节点到了该调整的时候不调整target怎么办。这也是一个大部分节点诚实的问题,发布的区块的块头里有个经过“32字节的target压缩编码后”形成的“4字节的nBits域”,如果不按照协议调整target,那么发布的区块的块头里这个4字节的nBits域就是不正确的,诚实的节点不会接收这样的区块。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值