区块链拜占庭容错共识机制,树图科技区块链共识机制

  

  #冬季生活潘趣酒季#   

  

  基于区块链的基本特征,区块链通常由几个街区组成。在这些块中,分别记录了与块的创建时间相对应的时间戳,并且所有块严格遵循块中记录的时间戳,以形成在时间上有序的数据链。   

  

  对于物理世界中产生的真实数据,可以将其构造成区块链支持的标准交易格式,然后发布给区块链。达成一致后,区块链的节点设备对接收到的交易进行处理,达成一致后,作为区块链记账节点的节点设备将该交易打包到区块链,并永久存放在区块链。   

  

  其中,区块链支持的共识算法可以包括:   

  

  第一种共识算法,即节点设备需要争夺每个计费周期计费权的共识算法;比如工作证明(POW)、利害关系证明(POS)、委托利害关系证明(DPOS)等共识算法;   

  

  第二种共识算法,即预先为每个记账周期选举记账节点的共识算法(不争夺记账权);例如,实用的拜占庭容错(PBFT)和其他共识算法。   

  

  在使用第一种一致性算法的区块链网络中,竞争记账权的所有节点设备在接收到交易后都可以执行交易。其中一个争夺计费权的节点设备可能会在这一轮计费权争夺中胜出,成为一个计费节点。计费节点可以将接收到的事务与其他事务打包在一起生成最新块,并将生成的最新块或最新块的块头发送给其他节点设备进行协商。   

  

  在采用第二种协商一致算法的区块链网络中,具有计费权限的节点设备在这一轮计费之前已经协商好了。因此,节点设备接收到交易后,如果不是当前轮的计费节点,可以将交易发送给计费节点。对于当前回合的会计节点,可以在将该事务与其他事务打包生成最新块的过程中或之前执行该事务。计费节点生成最新块后,可以将最新块或最新块的块头发送给其他节点设备进行协商。   

  

  如上所述,无论区块链采用哪种一致性算法,本轮的计费节点都可以对接收到的事务进行封装,生成最新块,并将生成的最新块或者最新块的块头发送给其他节点设备进行一致性验证。如果其他节点设备接收到最新块或最新块的块头,并验证没有问题,则可以将最新块附加到原始区块链的末尾,从而完成区块链的计费过程。当其他节点验证由记账节点发送的新块或块头时,块中包括的事务也可以被执行。   

  

  在实际应用中,公有链、私有链或联盟链都可能提供smartcontract的功能。区块链的智能合约是可以由区块链的交易触发和执行的合约。智能合约可以以代码的形式定义。   

  

  以以太坊为例,用户可以在以太坊网络中创建和调用一些复杂的逻辑。以太坊作为一个可编程的区块链,其核心是以太坊虚拟机(EVM),每个以太坊节点都可以运行EVM。EVM是一个图灵完全虚拟机,通过它可以实现各种复杂的逻辑。以太坊中智能合约的发布和调用在EVM上运行。实际上,EVM直接运行虚拟机代码(虚拟机字节码,以下简称“字节码”),所以部署在区块链上的智能合约可以是字节码。   

  

     

  

  如图1所示,在Bob向以太网发送包含创建智能合同信息的事务后,每个节点可以在EVM执行该事务。其中,图1中交易的From字段用于记录发起创建智能合约的账户地址,交易的Data字段的字段值中存储的合约代码可以是字节码,交易的To字段的字段值为空账户。当节点通过共识机制达成一致时,这个智能契约就创建成功了,后续用户可以调用这个智能契约。   

  

  智能合约创建后,区块链上出现智能合约对应的合约账户,并有具体地址;例如,图1中每个节点中的“0x68e12cf284…”代表创建的合同帐户的地址;合同代码和账户存储将保存在合同账户的账户存储中。智能合约的行为由合约代码控制,而智能合约的账户存储保存合约的状态。换句话说,智能合约使虚拟账户包含在区块链上生成的合约代码和账户存储。   

  

  如上所述,包含用于创建智能合同的事务的数据字段可以存储智能合同的字节码。一个代码由一系列字节组成,每个字节可以标识一个操作。基于开发效率、可读性等考虑,开发人员可以选择一种高级语言来编写智能合约代码,而不是直接编写字节码。例如,高级语言可以是Solidity、Serpent、LLL等。对于用高级语言编写的智能合约代码,可以通过编译器编译生成可以部署在区块链上的字节码。   

  

  以Solidity语言为例,用它编写的契约代码非常类似于面向对象编程语言中的类,一个契约中可以声明多种成员,包括状态变量、函数、函数修饰符、事件等。状态变量永久存储在智能合约的帐户存储中。   

字段中的值,用于保存合约的状态。

  


  

  

如图2所示,仍以以太坊为例,Bob将一笔包含调用智能合约信息的交易发送到以太坊网络后,各节点均可以在EVM中执行这笔交易。其中,图2中交易的From字段用于记录发起调用智能合约的账户的地址,To字段用于记录被调用的智能合约的地址,交易的Data字段用于记录调用智能合约的方法和参数。调用智能合约后,合约账户的账户状态可能改变。后续,某个客户端可以通过接入的区块链节点(例如图2中的节点1)查看合约账户的账户状态。

  

智能合约可以以规定的方式在区块链网络中每个节点独立的执行,所有执行记录和数据都保存在区块链上,所以当这样的交易执行完毕后,区块链上就保存了无法篡改、不会丢失的交易凭证。

  

创建智能合约和调用智能合约的示意图如图3所示。以太坊中要创建一个智能合约,需要经过编写智能合约、变成字节码、部署到区块链等过程。以太坊中调用智能合约,是发起一笔指向智能合约地址的交易,各个节点的EVM可以分别执行该交易,将智能合约代码分布式的运行在以太坊网络中每个节点的虚拟机中。

  

智能合约的事件机制,是智能合约与链外实体进行交互的一种方式。对于区块链上部署的智能合约来说,通常无法直接与链外实体进行交互;例如,智能合约在调用完成后,通常无法将智能合约的调用结果,点对点的发送给智能合约的调用发起方。

  

智能合约在调用的过程中产生的调用结果(包括中间结果和最终的调用结果),通常都会以事件(event)的形式,记录到调用该智能合约的那笔交易的交易日志(transaction logs),在节点设备的存储空间中进行存储。而需要与智能合约进行交互的链外实体,则可以通过监听节点设备的存储空间中存储的上述交易日志的方式,来获取智能合约的调用结果;

  

例如,以以太坊为例,交易日志最终会作为调用该智能合约的那笔交易笔交易的收据(receipt)的一部分内容,存储在以上描述的MPT收据树中。而与智能合约进行交互的链外实体,可以监听节点设备的存储空间中存储的MPT收据树上的交易收据,并从监听到的交易收据中,来获取智能合约生成的事件。

  

在跨链场景下,多个区块链可以通过跨链中继实现跨链对接。

  

其中,跨链中继,可以通过桥接接口与多个区块链分别进行对接,并基于实现的数据搬运逻辑,完成该多个区块链之间的跨链数据同步。

  

在实现上述跨链中继时所采用的跨链技术,在本说明书中不进行特别限定;例如,在实际应用中,可以通过侧链技术、公证人技术等跨链机制,将多个区块链连接起来。

  

当多个区块链通过跨链中继实现对接之后,区块链之间就可以去读取并认证其它区块链上的数据,也可以通过跨链中继去调用其它区块链上部署的智能合约。

  

需要说明的是,跨链中继仅用于多个区块链之间搬运数据,并不需要对搬运的数据进行持久化存储,也不需要维护所搬运的数据的数据状态。在实际应用中,跨链中继可以配置在其所连接的多个区块链之外的设备、节点或平台等处,也可以配置在其所连接的多个区块链的节点设备上,在本说明书中不进行特别限定。

  

区块链上部署的智能合约,通常只能引用区块链上存储的数据内容;而在实际应用中,对基于智能合约技术实现的一些复杂的业务场景,智能合约可能还需要引用一些链外的数据实体上的外部数据。

  

在这种场景下,区块链上部署的智能合约,可以通过Oracle预言机,来引用链外的数据实体上的数据,进而实现智能合约与真实世界的数据实体之间的数据交互。其中,链外的数据实体,可以包括诸如部署在链外的中心化的服务器或者数据中心,等等。

  

需要说明的是,跨链中继用于连接两个区块链,而Oracle预言机用于连接区块链与链外的数据实体,实现区块链与真实世界的数据交互。

  

在实际应用中,在为区块链上的智能合约部署预言机时,可以先在区块链上部署一个与预言机对应的预言机智能合约;其中,该预言机智能合约用于维护预言机发给区块链上的智能合约的外部数据;例如,预言机发给区块链上的智能合约的外部数据,可以存储在预言机智能合约的账户存储空间中。

  

当区块链上的目标智能合约被调用时,可以从该预言机智能合约的账户存储空间中,来读取该目标智能合约所需的外部数据,来完成智能合约的调用过程。

  

需要说明的是,预言机在向区块链上的智能合约发送外部数据时,可以采用主动发送的方式,也可以采用被动发送的方式。

  

在一种实现方式中,链外的数据实体可以将需要提供给目标智能合约的外部数据,利用预言机的私钥进行签名后,发送给上述预言机智能合约;例如,在时间时,可以采用周期性发送的方式,将签名后的上述外部数据发送给上述预言机智能合约;

  

而在上述预言机智能合约可以维护预言机的CA证书,在收到链外的数据实体发送的外部数据后,可以使用该CA证书中维护的该预言机的公钥,对该外部数据的签名进行验证,并在验证通过后,将链外的数据实体发送的外部数据在该预言机智能合约的账户存储空间中进行存储。

  

在另一种实现方式中,当区块链上的目标智能合约被调用时,如果从该预言机智能合约的账户存储空间中,并未读取到该目标智能合约所需的外部数据,此时该预言机智能合约,可以利用智能合约的事件机制,与上述预言机进行交互,并由上述预言机将该目标智能合约所需的外部数据,发送至该预言机智能合约的账户存储空间中。

  


  

----pic---

  

例如,当区块链上的目标智能合约被调用时,如果从该预言机智能合约的账户存储空间中,并未读取到该目标智能合约所需的外部数据,此时该预言机智能合约,可以生成一个外部数据获取事件,并将该外部数据获取事件记录到调用该智能合约的那笔交易的交易日志中,并将该交易日志存储到节点设备的存储空间;而上述预言机可以监听节点设备的存储空间中存储的该预言机智能合约产生的交易日志,并在监听到交易日志中的外部数据获取事件后,响应监听到的该外部数据获取事件,将上述目标智能合约所需的外部数据,发送给上述预言机智能合约。

相关文章