源代码解读 [EOS 源码分析] 15 - cleos 如何通过 send_actions 发送 Action?

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

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

img

上一篇文章介绍了cleos调用create_account_subcommand函数创建EOS账户时如何初始化资源参数,根据创建EOS账户时是否购买RAM或抵押EOS换取CPU/NET,会为send_actions函数提供不同的Action数据列表,这些Action会被打包到交易并广播到EOS区块链,这篇文章介绍send_actions函数及其相关函数的实现细节。

send_actions

send_actions函数在main.cpp(eos/programs/cleos/main.cpp)中的定义如下:

img

send_actions接收两个参数:

  • std::vector&& actions:一组Action数据;

  • packed_transaction::compression_type compression:交易数据压缩类型,有一个默认值packed_transaction::none。

packed_transaction::compression_type是枚举类型,定义如下:

img

send_actions函数中的关键代码是:

auto result = push_actions( move(actions), compression);

调用push_actions获取执行结果后,按照tx_print_json(使用交易通用选项--json指定)决定是否以JSON格式打印结果。

push_actions函数的定义如下:

img

push_actions函数内部新建了一个signed_transaction对象(trx),把要发送的actions赋值给trx.actions,实际上是构造了一个要发送的交易(transaction),Action需要被包装在交易中进行发送。

push_actions返回了push_transaction的执行结果,是一个fc::variant类型,它可以存储各种数据类型的对象。

push_transaction函数的定义如下:

img

push_transaction主要执行了以下代码:

1、调用get_info函数获取EOS区块链的基本信息(get_info在之前的文章:cleos get info在EOS源码中是如何实现的?有介绍);

2、通过trx.signatures.size()判断交易是否包含签名,如果交易未签名则重新构造trx数据,如果已签名则不能修改trx数据(这部分内容有一些TAPOS的原理,放到下一篇文章中进行介绍);

3、若tx_skip_sign为false(不跳过签名),调用sign_transaction函数对交易签名;

4、根据tx_dont_broadcast返回执行结果,若tx_dont_broadcast为true,则不广播直接返回fc::variant类型的交易数据,若tx_dont_broadcast为false,则返回call函数的调用结果:

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

call函数在之前的文章中介绍过,内部调用do_http_call向nodeos发送HTTP请求,通过httpc实现。

更多内容

币圈信息站开发目录

EOS开发系列目录

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