源代码解读 [EOS 源码分析] 18 - cleos 如何通过 packed_transaction 打包交易?

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

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

img

上一篇文章介绍了cleos如何通过sign_transaction对交易进行签名,签名后的交易需要打包,再广播到p2p网络上。打包交易的操作是通过packed_transaction结构体来完成的,这篇文章来介绍packed_transaction的相关内容。

cleos如何通过packed_transaction打包交易?

回到main.cpp(eos/programs/cleos/main.cpp),来看push_transaction函数最后一部分代码:

img

通过变量tx_dont_broadcast(--dont-broadcast)判断交易是否需要广播到网络,需要广播则使用httpc访问RPC API,否则直接返回fc::variant对象。

非调试的情况下交易都会广播到网络,访问的API是/v1/chain/push_transaction,调用call函数通过httpc发送请求:

call(push_txn_func, packed_transaction(trx, compression));

packed_transaction声明在transaction.hpp(eos/libraries/chain/include/eosio/chain/transaction.hpp)中:

img

packed_transaction有多个构造函数,push_transaction中使用的是:

explicit packed_transaction(signed_transaction&& t, compression_type _compression = none)
:signatures(t.signatures), compression(_compression), unpacked_trx(std::move(t))
{
  local_pack_transaction();
  local_pack_context_free_data();
}

构造函数对成员变量signatures、compression、unpacked_trx赋了初始值,私有成员变量声明如下:

img

transaction.cpp中来看local_pack_transaction和local_pack_context_free_data函数的实现代码:

img

根据不同的数据压缩类型调用不同的函数进行处理,传入的压缩类型是none,分别调用:

pack_transaction(unpacked_trx)

和:

pack_context_free_data(unpacked_trx.context_free_data)

压缩交易数据和无需签名的Action数据(context_free_data)。

两个函数的定义如下:

img

它们都调用了fc::raw::pack函数打包数据,返回bytes(vector)类型的数据。

更多内容

币圈信息站开发目录

EOS开发系列目录

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