源代码解读 [EOS 源码分析] 22 - 交易 (Transaction) 的数据结构

Admin · 2019年12月21日 · 31 次阅读
本帖已被设为精华帖!

EOS 源码分析系列文章,由技术作者松果撰写。为帮助更多开发者了解,特获授权转载至此。感谢松果兄支持。

img

上一篇文章介绍了EOS区块的数据结构,EOS的区块类使用了继承体系,继承关系是signed_block->signed_block_header->block_header。signed_block的成员变量transactions保存了(打包后的)交易列表,这篇文章来介绍交易(Transaction)的数据结构。

交易(Transaction)的数据结构

transaction_receipt_header

首先从signed_block开始,来看transaction_receipt的数据结构:

struct transaction_receipt : public transaction_receipt_header {//...}

transaction_receipt继承自transaction_receipt_header,先看后者的数据结构定义:

img

transaction_receipt表示经过打包、广播、验证后的交易,下面还会介绍本地保存的交易类型transaction,要注意这两者的区别。

transaction_receipt用于记录交易执行的状态和资源的开销情况,有三个字段:

1、status(当前的交易状态)

status是枚举类型,包括以下5个状态:

enum status_enum {
  executed  = 0, // 成功执行
  soft_fail = 1, // 软失败,未执行
  hard_fail = 2, // 硬失败,执行失败
  delayed   = 3, // 交易被延迟执行
  expired   = 4  // 交易过期
};

2、cpu_usage_us(CPU使用量,单位为微秒)

** **

3、net_usage_words(NET使用量,单位为字)

网络(NET)使用量的单位是字(word),在EOS系统中1个Word等于8个字节(Byte)。

transaction_receipt

transaction_receipt是transaction_receipt_header的子类:

img

之前介绍的区块头(block_header)中的交易默克尔树根哈希(transaction_mroot)就是区块中包含的所有transaction_receipt的默克尔树根哈希。

transaction_receipt增加了一个字段trx(打包后的交易数据)和一个函数digest用来获取摘要(哈希值)。

成员变量trx声明如下:

fc::static_variant<transaction_id_type, packed_transaction> trx;

它保存的是一个打包后的交易类型packed_transaction,打包就是把交易数据进行序列化,便于网络通信和数据上链。

transaction_receipt_headertransaction_receipt保存的是链上的交易信息,本地交易信息则保存在transaction_headertransaction等数据类型中。

transaction_header

本地交易的各种数据类型声明在transaction.hpp(eos/libraries/chain/include/eosio/chain/transaction.hpp)中,交易头(transaction_header)定义如下:

img

和比特币的区块头类似,EOS中交易头的大小是固定的,便于区块链上的节点解析交易数据。交易头包含如下成员变量:

  • expiration:交易过期时间;

  • ref_block_num:引用的区块号(用于TAPOS机制);

  • ref_block_prefix:引用的区块哈希前缀(用于TAPOS机制);

  • max_net_usage_words:交易使用的网络资源上限,单位为字(word),1个字等于8字节(byte);

  • max_cpu_usage_ms:交易使用的CPU资源上限,单位为毫秒;

  • delay_sec:延迟交易的延迟时间,单位为秒。

transaction

交易(transaction)继承自transaction_header,EOS的交易具有数据库事务的性质,内部包含的Action要么全部执行成功,要么全部执行失败。

transaction的数据结构如下:

img

扩展了三个成员变量:

  • context_free_actions:上下文无关的Action列表,不需要参与签名;

  • actions:普通Action列表;

  • transaction_extensions:交易的扩展内容,和header_extensions、block_extensions类似。

可以看到transaction数据结构的主要功能是保存Action列表,Action的数据结构在后续文章中介绍,transaction类中还声明了和交易签名相关的函数get_signature_keyssig_digest等。

signed_transaction

签名的交易(signed_transaction)继承自transaction,数据结构如下:

img

signed_transaction扩展了两个成员变量:

  • signatures:交易的签名数据;

  • context_free_data:上下文无关的数据,不参与签名,数据从context_free_actions获得。

packed_transaction

packed_transaction负责打包交易,内部定义了多个函数,可以打包transactionsigned_transaction

packed_transaction在之前的文章:cleos如何通过packed_transaction打包交易?中有详细介绍。

更多内容

币圈信息站开发目录

EOS开发系列目录

共收到 0 条回复
Admin 将本帖设为了精华贴 12月21日 17:49
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册