区块链核心技术与应用
上QQ阅读APP看书,第一时间看更新

2.3 网络通信层关键技术

和传统应用运行在有中心化的服务器节点或集群环境不一样,区块链应用运行在去中心化的分布式网络,一般采用P2P的组网方式。P2P的组网方式决定了区块链具有与传统网络不同的网络协议、消息传播方式以及数据验证机制。各种应用正是通过网络层的消息传播机制和数据验证机制,来确保区块链应用中的每个参与者(节点)都能参与区块链中的交易校验和创建数据区块。

1.P2P网络

P2P是peer-to-peer的缩写,又称“对等网络”,可以简单地定义成通过直接交换来共享计算机资源和服务,对等计算模型应用层形成的网络通常称为对等网络。在P2P网络环境中,成千上万台彼此连接的计算机都处于对等的地位,整个网络一般来说不依赖专用的集中服务器。网络中的每一台计算机既能充当网络服务的请求者,又能对其他计算机的请求做出响应、提供资源和服务。通常这些资源和服务包括信息的共享和交换、计算资源(如CPU的共享)、存储共享(如缓存和磁盘空间的使用)等。图2-6展示了一个区块链环境下的P2P网络架构。当然,不同的区块链平台的网络协议可能各不相同,例如比特币、以太坊和超级账本都有自己特殊的网络协议,公有链、联盟链、私有链也可以有各自的网络协议等。

图2-6 一个区块链应用的P2P网络示意图

从图2-8中可以看出,任何参与者(可以是单独的人或者公司)都可以是P2P网络中的节点。

图2-8 交易加密或者区块加密

理论上,所有的区块需要在所有的参与者中都存储一份,也就是说,图2-8所示的P2P网络中的每个节点都保存区块链中所有区块。但是,通常即使在P2P网络中,节点还分全节点和轻量级节点。全节点具有足够的资源,例如公司D的私有云,可以存储区块链的所有区块,而一些本地资源少的轻量级节点可能只存储一些关键的区块(例如张三的手机)。那些全节点可以自行完成各种交易的完整性验证,而轻量级节点需要从其他全节点处调用一些所需区块来帮助自己完成数据的验证工作等。

2.链接方式

当矿工生成一个有效区块,且被其他矿工确认有效后,就可以链接到当前区块链的末尾,形成新的区块链主链。但区块链并不完全以线性方式延长,有时会出现分叉。这是因为区块链系统中,各计算节点是以分布式并行计算来争取记账权的,所以可能会出现短时间内有两个计算节点同时生成有效区块的现象。此时,区块链系统选择将两个有效区块都链接到当前主链的末尾,这就形成了分叉。针对这种情况,区块链协议规定:当主链分叉时,计算节点总是选择链接到当前工作量证明最大的分支上,形成更长的新主链。

3.传播机制

一旦一个新的区块创建后,生成该区块的节点需要将该消息广播给其他所有节点。不同的应用可以设计不同的传播机制。比特币的传播机制可以简要描述如下。

1)发起比特币交易的节点将自己新的交易数据向所有的全网其他节点进行广播。

2)所有的节点将收集这些新的交易数据,并各自打包放进自己的预创建的区块中。

3)为了争夺账本创建权利,每个节点需要证明自己的努力工作,在比特币世界里使用的是找到一个工作量的难度证明(PoW)。

4)一旦找到了工作量的难度证明,立即对全网进行广播。

5)其他节点如果认可该工作量难度最大同时所有交易都是有效的交易,那么认可该节点创建的区块为有效区块。

6)一旦新创建的区块得到了认可,则其他所有节点将接受该新区块,并将该区块加入到自己区块链条的最后一个区块后。

图2-7展示了一个简单的区块传播机制。在本区块的应用中共有7个参与者,有3个参与者是个体参与者,有4个参与者是公司参与者。为了创建一个新的区块链,首先所有的参与者要搜集一段时间内比特币交易链采用约10分钟为限,其他基于区块链的应用也可以自行定义时间段。发生的大部分交易。由于所有的参与者都在搜集新的交易,希望自己夺得创建区块的权限,而同时在争取创建权限的参与者非常多,只有一个幸运者能够得到某一段时间内的创建权利。因此,需要一种公平的方法来帮助完成此项工作。创建权利将交给工作最勤奋、付出最多的参与者。也就是说在上述7个参与者中选择一个最努力的人。比特币采用了工作量证明的方法,给定一个随机数,让所有的参与者去找这个随机数(找这个随机数的难度很大),只有找到该随机数的人才能获得该区块的创建权。当然,机器计算能力越强的参与者获得创建权的可能性越大。我们假设公司B私有云的服务器、CPU、计算能力等最强,是按时找到该随机数的参与者,因此它获得了本次账本的创建权,并创建了一个区块,假设为区块x。此时,公司B私有云这个参与者需要将自己创建的区块x告诉所有其他节点,其他节点将会把区块x加到自己区块链的当前最后一个区块后。

4.共识机制

在完全去中心化的区块链系统中,如何保证各节点维持区块链数据的一致性和不可篡改性,是一个关键问题。比特币系统中的区块链技术采用了基于PoW的共识机制,通过在区块计算中加入算力竞争,使分布式的节点可以高效地达成共识。具体做法是在区块计算的最后一步要求解一个随机数,使区块的哈希函数值小于或等于某一目标哈希值,由于哈希运算结果的随机性和不可逆性,找到随机数的难度会很大。通常目标哈希值由多个前导零的数串构成。设定的前导零越多,目标哈希值设定得越小,找到符合条件随机数的难度就越大。比特币系统通过调整目标哈希值,通常将区块的生成时间动态地控制在10分钟左右 [3]

5.验证机制

数据验证是区块链技术极为重要的一环。所有的区块链网络中的参与者都要随时监听新的交易与新的区块。一旦接收到新的交易或者新的区块均需首先验证它们的正确性,如果正确后再向自己的临近节点进行传播。如果接收到的新交易无效,则需立即抛弃,不再将它们转给临近节点,以免浪费计算资源。对于新交易的验证,根据基于区块链应用事先达成的各种验证协议来进行,比如交易的格式、交易的数据结构、格式的语法结构、输入输出、数字签名的正确性等。所有的新交易数据一旦验证通过后,节点会将这些交易数据放在一个交易池中。当节点确认了上一个区块以后,节点将按一定优先级次序从交易池中选出交易计算Merkle根。节点通过自己强大的算力(工作量证明)找到符合难度目标的随机数后,并在第一时间将新挖出的区块广播给其他节点,以便其他节点确认该区块,并将获得验证的新区块加入到原有的区块链中。