BlockChain学习——比特币区块结构与网络

区块链的Hash结构

我们知道,区块其实是由大量的交易打包放入的,这样能够增加提议区块的效率并且Hash链更短,增加验证区块链数据结构的效率
比特币的区块链由两个Hash结构
BlockChain学习——比特币区块结构与网络
第一个是区块联结在一起的Hash链。除了Hash指针外,区块的头部还包含Hash谜题相关的信息:临时随机数、时间戳和一个点数(点数用来表示找到这个区块的难度)。

第二个是记录内部交易Hash值的Merkle树。这样为了证明某个交易在某个区块内,可以通过树形结构O(logn)的复杂度来搜索。每个区块的Merkle数都有一个币基交易,也就是财奴币的造币。其JSON字符串如下:
BlockChain学习——比特币区块结构与网络

比特币网络

比特币交易网络是一个点对点的网络,网络节点的分布其实是多变的,由于随时有新的节点进入以及旧的节点离开,所以并不存在一个确定的地理学意义上的拓扑结构。那么一个节点是如何加入网络的呢?当你启动一个新节点的时候,先向一个你知道的节点发送一个简单的消息。这个节点就是你的种子节点,当然,有多种不同的方法可以查找种子节点。在链接到一个新的节点后,你可以重复这个过程许多次,最后你可以选择和哪些节点相连,这时, 你就成为比特币网络里一个完全合格的节点了。这些步骤里有很多随机性,理想的情况就是你能和一些随机组的节点相连。为了加入网络成为网络节点,你只需知道一开始怎么和 中一个节点链接就行了。

当我们发起一个交易的时候, 我们想让整个网络都知道。这是通过一个“泛洪”(flooding)的算法完成的。这些节点会进行一系列核验,决定是否接受并转播这笔交易。如果核验通过,这些节点会将这笔交易信息传播给与其相连的其他节点。当节点接收到一个交易信息后,会把交易放入一个交易池,但需要注意的是,交易池里的交易还没有被打包进区块链。如果节点接收到的交易在交易池里已经存在,就不会再次把它传播出去。这样,就确保了泛洪协议会自动终结。

当有双重支付攻击的时,假设由于网络原因,Alice几乎同时发出两笔交易。有些节点先听到Alice→Oscar交易,有些则先听到Alice→Bob交易。结果就是众多的节点会对“哪一个交易应该被纳入区块链”产生分歧。这种情况被称为竞态条件(race condition)。好在对于比特币来说,这完全不是问题:打包下一个区块的矿工会打破这个僵局,他会决定哪个交易会最终打包进这个区块。如果Alice→Bob的交易进入区块,那些听到Alice→Oscar的节点会把Alice→Oscar的交易从交易池里剔除,因为那是一个双重支付。

完全有效的节点必须永久在线,这样才能接收到所有的交易数据。一个节点离线时间越久,当它重新连接到网络的时候,就需要越多时间来更新所有交易。所以完全有效的节点需要的存储空间是比较大的(2015年50g)。
除了完全有效节点之外,还有一种轻量节点,也叫简单付款验证(PSV)。事实上,在比特币系统里的大部分节点都是轻量节点。这些节点不会存储整个比特币区块链,它们只存储它们所关心的、需要进行核验的部分交易。**SPV节点只验证那些和它们相关的交易,所以它们必须依赖那些全节点去验证网络上的其他所有交易。**作为一个SPV节点可以节省很多资源。区块头部的大小只是整个区块链的千分之一。所以轻量节点不需要几十G的存储空间,只需要几十MB即可。