源代码解读 [EOS 源码分析] 14 - cleos 创建 EOS 账户时如何初始化资源?

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

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

img

上一篇文章介绍了create_account_subcommand函数创建EOS账户的主要流程,这篇文章介绍一下创建账户时资源初始化相关的细节。

cleos创建EOS账户时如何初始化资源?

回到create_account_subcommand函数,资源相关的选项被封装到相应的变量中:

img

set_callback中最后部分的代码如下:

img

create是一个action类型的数据对象,需要初始化资源的模式(!simple)下进行了如下断言:

  • RAM购买量是必选参数,单位可以是EOS、Byte(字节)、KB
EOSC_ASSERT( buy_ram_eos.size() || buy_ram_bytes_in_kbytes || buy_ram_bytes, "ERROR: One of --buy-ram, --buy-ram-kbytes or --buy-ram-bytes should have non-zero value" );
  • 购买RAM时,Byte和KB两种单位不可同时传入:
EOSC_ASSERT( !buy_ram_bytes_in_kbytes || !buy_ram_bytes, "ERROR: --buy-ram-kbytes and --buy-ram-bytes cannot be set at the same time" );

和create一样,buyram也是一个Action数据对象,根据购买RAM时使用的单位是EOS还是字节,main.cpp定义了两个函数来创建Action:

  • create_buyram

img

  • create_buyrambytes

img

购买的RAM数额用来构建act_payload(Action的数据负载),再调用create_action创建Action对象。

create_action函数的定义如下:

img

如果创建EOS账户时指定了抵押的CPU或NET资源大于0,则会创建第3个Action:

action delegate = create_delegate( creator, account_name, net, cpu, transfer);

** **

create_delegate函数的定义如下:

img

和create_buyram、create_buyrambytes类似,最终也是调用create_action创建Action。

在终端使用cleos命令创建一个EOS账户成功后会打印如下信息:

img

从这些信息中可以看到这笔交易包含了多个Action,除了内联(inline)调用的eosio.token::transfer,还调用了3个Action:

  • eosio::newaccount

  • eosio::buyrambytes

  • eosio::delegatebw

这3个Action都是eosio.system合约的Action,部署在eosio账户上。

根据不同的情况创建出不同的Action组合后,会调用send_actions函数发送这些Action:

send_actions( { create, buyram, delegate } );
// or
send_actions( { create, buyram } );
// or
send_actions( { create } );

send_actions函数也定义main.cpp(eos/programs/cleos/main.cpp)中,它可以接收一组Action并发送,更多细节放到下一篇文章中介绍。

更多内容

币圈信息站开发目录

EOS开发系列目录

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