源代码解读 [EOS 源码分析] 17 - cleos 如何通过 sign_transaction 对交易进行签名?

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

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

img

上一篇文章介绍了cleos中push_transaction函数构造交易数据的流程,交易(transaction)构造好后需要对其进行签名,这篇文章介绍交易签名函数sign_transaction及其相关内容。

cleos如何通过sign_transaction对交易进行签名?

回到push_transaction函数:

img

这部分代码先通过tx_skip_sign判断是否需要签名(通过--skip-sign选项设置,设置了就不需要签名),再执行sign_transaction的相关代码。

sign_transaction的流程有两步,

1、调用determine_required_keys函数获取签名需要的密钥:

auto required_keys = determine_required_keys(trx);

determine_required_keys函数定义如下:

img

从RPC API路径/v1/wallet/get_public_keys获取public_keys;再把交易对象trx和public_keys组装成post参数,使用httpc访问/v1/chain/get_required_keys获取签名需要的密钥(required_keys)。

2、调用sign_transaction函数对交易进行签名

sign_transaction(trx, required_keys, info.chain_id);

sign_transaction接收三个参数:待签名的交易对象、密钥、区块链ID。

sign_transaction函数定义如下:

img

通过trx、required_keys、info.chain_id构造出postdata后,访问/v1/wallet/sign_transaction对交易进行签名,然后将RPC接口的返回结果转为signed_transaction类型,赋值给trx,因为trx的参数传递方式是传引用,所以外部的trx对象的属性值也发生了变化。

cleos在实现sign_transaction的过程中,多次通过httpc调用了远程RPC接口,服务端代码是在nodeos加载的插件中实现的,这部分内容后续再进行介绍。

更多内容

币圈信息站开发目录

EOS开发系列目录

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