2. 区块链数据

在本章中,将介绍以下几种数据结构之间的关系:

  • 区块
  • 交易
  • 回执
  • 区块链
  • 非法交易记录

其中前两类数据结构在区块链网路中组成了“区块链数据“,是区块链网络中进行流转的“共识”数据;后三类数据结构由各节点维护在本地。以上五种数据结构组成了一个节点中所有的区块链数据。

区块

区块结构可以分成两部分:

  • 区块头信息;
  • 区块体信息;

区块头中主要包含一些区块链的元数据,包括:(1)区块高度(2)区块哈希(3)父区块哈希(4)账户状态哈希(5)交易集哈希(6)回执集哈希(7)时间戳(8)日志过滤数据。

区块体内包含所有的交易数据。

区块的主要作用是封装交易数据,记录区块链状态数据

交易

交易是由外部用户发起的,在交易体中记录了用户指定的调用信息。

交易根据是否执行智能合约可以分为两类:

  • 普通交易;
  • 合约交易;
  • 合约部署
  • 合约调用

前者表示交易执行过程中不触发智能合约的运行,仅进行hyperchain提供的token的转账;后者表示交易执行过程中会触发智能合约的运行。

后者又可以分为:(1)合约部署交易(2)合约调用交易。

交易体包含如下字段:

  • 版本号:指明该交易数据结构定义的版本信息,便于向后兼容;
  • 交易发起者:长度为20字节的交易发起者的标识信息;
  • 交易接收者:长度为20字节的交易接收者的标识信息,若本交易是合约调用交易,该字段为被调合约的地址,若该字段为空,则表明本交易为部署合约交易;
  • 调用信息:
  • 若本交易为普通交易,在调用信息中指定需要转账的token数量;
  • 若本交易为合约调用交易,在调用信息中指定需要调用的函数以及调用参数;
  • 若本交易为合约部署交易,则需要在调用信息中指定合约的二进制代码;
  • 随机值:uint64的随机值(避免产生哈希相同的交易,防止重放攻击);
  • 交易签名:用户利用自己的私钥对(1)交易发起者(2)交易接收者(3)调用信息(4)时间戳(5)随机值五个字段的内容进行签名,产生的签名内容填在该字段,防止交易的内容被篡改;
  • 交易哈希:将上述(1)-(5)字段加上交易签名一起进行哈希计算,获得一个哈希标识用于表示本交易。

回执

每一笔合法的交易,其执行结果都会被封装成一个交易回执存储在区块链上。交易回执包括:

  • 版本号:指明该回执数据结构定义的版本信息,便于向后兼容;
  • 交易哈希:与该回执相关的交易哈希;
  • 合约地址:若该交易为部署合约交易,则新部署的合约地址被放置在该字段,否则该字段为空;
  • 执行结果:若该交易为调用合约交易,则执行结果被放置在该字段,否则该字段为空;
  • 虚拟机日志:智能合约运行过程中,可能会产生一系列日志,这些日志数据被放置在该字段中;
  • 智能合约类型:用于表示智能合约的类型,EVM,JVM或是其他类型;

非法交易记录

每一笔非法的交易,其错误信息会被封装成一个非法交易记录,存储在节点本地。

除了与之相关的交易数据,非法记录中还会记载具体的错误原因,例如:(1)余额不足(2)合约调用参数错误(3)调用权限不够等。

区块链

一个本地的节点会维护一些区块链元数据以便用户进行查询,因此在hyperchain中,有个名为chain的数据结构,记录了这些数据,包括:

  • 最新父区块哈希
  • 最新区块哈希
  • 最新区块高度
  • 创世区块高度(默认为0,数据归档/数据恢复等操作会影响该高度的值)
  • 交易总数
  • 额外数据

共识比较

区块链节点在执行完一个区块中所有的交易后,需要将本次区块处理得到的“结果”在节点间进行比较,只有大多数节点(超过quorum个)拥有与之相同的结果时,才会将本次执行结果提交到数据库中。

而表示本区块执行结果的标识是由以下几个内容组成:

  • 世界状态哈希:交易执行过程中会更改账户状态数据,当一个区块中所有的交易执行结束后,会利用bucket tree对账户集合状态进行哈希重计算,计算结果便是世界状态哈希;
  • 交易集哈希:利用区块中每一笔交易的*重要字段*作为sha256算法的输入,计算得到一个用于表示整个交易集的哈希标识。重要字段为:(1)交易发起者(2)交易接收者(3)调用信息(4)时间戳(5)随机值;
  • 回执集哈希:利用区块中每一个回执的*重要字段*作为sha256算法的输入,计算得到一个用于表示整个回执集的哈希标识。重要字段为:(1)虚拟机执行计数器(2)执行结果(3)虚拟机执行日志;