5、BTC-网络
用户将交易发布到比特币网络上,节点收到交易后打包到区块中,然后将区块发布到比特币网络上,那么新发布的交易和区块在比特币网络上是如何传播的呢?
比特币工作于网络应用层,其底层(网络层)是一个P2P Overlay Network(P2P覆盖网络)
- 应用层:Bitcoin Blockchain
- 网络层:P2P Overlay Network
比特币系统中所有节点都是对等的,不像一些其他网络存在超级节点(super node或master node)。要加入网络,至少需要知道一个种子节点(seed node),通过种子节点告知自己它所知道的节点。节点之间的通信采用了TCP协议,便于穿透防火墙。当节点离开时,只需要自行退出即可,其他节点在一定时间后仍然没有收到该节点消息,便会将其删掉
比特币网络设计原则:简单、鲁棒(最坏情况下能达到最优状况,即健壮性)而非高效(simple,robust,but not efficient)
每个节点维护一个邻居节点集合,消息传播在网络中采用洪泛法(flooding),某个节点在收到一条消息会将其发送给所有邻居节点并标记,下次再收到便不会再发送该消息。邻居节点选取随机,没有考虑网络底层拓扑结构,也与现实世界物理地址无关。该网络具有极强鲁棒性,但牺牲了网络效率
1)、新发布的交易的传播
比特币系统中,每个节点要维护一个等待上链的交易集合。第一次听到交易,如果是合法交易,则将其加入该交易集合并转发给邻居节点,以后再收到该交易就不再转发(避免网络上交易无限传输)
如果有冲突的交易几乎同时发布到网络上,每个节点根据其位置的不同,可能先收到的交易是不同的,那么另一个交易对于这个节点来说就是非法的了,不会放到集合中
如上图,以左边的节点为例,它先听到A->B的交易,将其写入到了自己的交易集合中
如果它收到了一个新发布的区块,其中包含A->B这个交易,说明这个交易已经被写入区块链了,所以就要在自己的交易集合中将其删除掉
如果它收到了一个新发布的区块中包含A->C这个交易,这时也要将集合中A->B的交易删除掉,因为检查可以发现此时集合中的A->B这个交易是非法交易,它和新发布的区块中的A->C这个交易冲突了
2)、新发布的区块的传播
新发布区块在网络中传播方式与新发布交易传播方式类似,每个节点除检查该区块内容是否合法,还要检查是否位于最长合法链上。区块越大,则网络上传输越慢。BTC协议对于区块大小限制为不大于1M大小
区块大小越大,网络上传播时延越长;区块大小越小,则可以包含的交易数目越少
此外,比特币网络传播属于Best effort(尽力而为),不能保证一定传输成功。以一个交易发布到网络上,未必所有节点都能收到,也未必所有节点收到交易顺序都一致
6、BTC-挖矿难度
1)、挖矿难度?
挖矿就是不断尝试block header中的nonce值,使得整个block header的哈希值小于等于给定的目标阈值。即H(block header)<=target(target是目标阈值,target越小,目标难度就越大)。调整挖矿难度就是调整目标空间在整个输出空间中所占比例大小
比特币系统采用的哈希算法是SHA-256,所以整个输出空间大小是 2 256 2^{256} 2256,调整目标空间所占比例简单的说需要目标值前需要多少个0
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为是挖矿难度为1时候的target,即最小挖矿难度
2)、为什么要调整挖矿难度?
系统中的总算力越来越强,如果挖矿难度保持不变,那么平均出块时间会越来越短。出块时间缩短,那么交易可以很快便被写入区块链,并且提高了系统响应时间,增加了区块链系统效率。但是,出块时间不是越短越好,出块时间太短也会造成一定的问题
假设平均出块时间减小到了1秒钟,但这个区块在比特币网络上传播给大多数节点可能就要几十秒,如果有两个节点几乎同时发布了区块,那么就会出现分叉
这是一个二分叉的情况,如果出块时间很短,就会导致这种分叉成为常态。而且不仅仅是二分叉,可能会出现很多分叉
分叉过多对于比特币系统达成共识没有好处,并且会危害比特币系统的安全
比如分叉攻击,正常情况下大部分节点是诚实的,有恶意的节点想要在6个确认后拿这段时间集中算力算出的新链去覆盖掉最长合法链是很难的,因为诚实节点也都在集中算力扩展最长合法链。如果出块时间很短,就会导致分叉过多,这样诚实节点的算力就被分散了,这时恶意节点要进行51% attack很可能就不需要50%以上的算力了,可能百分之十几就足够了,这样大大降低了比特币系统的安全性
10分钟的出块时间也不是最优解,只是说系统出块时间需要维持在一个定值附近,不能无限的减少下去。以太坊中平均出块时间仅为15秒左右,同样在以太坊中也有相应难度调整算法维持其平均出块时间,当然15s的时间明显会产生经常性的分叉,所以以太坊设计了新的共识协议Ghost。在这个协议中,分叉产生的orphan block(孤儿区块)不能简单丢弃掉,而是也要给予一些奖励(uncle reward)
3)、比特币中如何调整挖矿难度?
比特币协议中规定,每隔2016个区块需要调整一次目标阈值target,根据10分钟产生一个新区块,大概需要14天的时间,调整共识如下:
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 e d t i m e target = target \times \frac{actual \ time}{expected \ time} target=target×

本文详细阐述了比特币网络中交易和区块的传播机制,包括新交易与区块的洪泛法传播,以及挖矿难度的调整原理和目的。讨论了挖矿设备演进、矿池的作用与挑战,以及51%攻击的可能性。同时,介绍了比特币脚本和特殊脚本,如RETURN用于销毁和写入数据。
最低0.47元/天 解锁文章
6083

被折叠的 条评论
为什么被折叠?



