源代码解读 [EOS 源码分析] 19 - EOS 账户创建的服务端处理流程 (eosio.system 合约解析)

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

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

img

上一篇文章介绍了cleos如何通过packed_transaction打包交易,至此创建EOS账户的cleos部分就解析完了。

cleos system newaccount命令为例,通过分析源码得知,这些封装好的命令底层都是调用push_actions,进而调用push_transaction发送HTTP请求;

使用cleos push action直接向合约发送请求,底层也是调用的send_actions函数,这些请求被发送给EOS智能合约进行处理;

部署在EOS区块链上的合约可以看成是cleos命令的“服务端”,处理cleos system newaccount命令使用的是eosio.system合约的代码,部署在eosio账户上。接下来就分析一下EOS账户创建功能在eosio.system合约上的处理流程。

eosio.system

eosio.system合约是EOS的基础系统合约之一,使用eosio账户部署,在EOS区块链浏览器上查询eosio账户信息可以看到eosio.system合约的所有Action:

img

下面要研究的就是newaccount这个Action。

eosio.system newaccount

eosio.system newaccount Action声明在native.hpp(eosio.contracts/contracts/eosio.system/include/eosio.system/native.hpp)中:

img

实现代码位于eosio.system.cpp(eosio.contracts/contracts/eosio.system/src/eosio.system.cpp):

img

合约代码比较简单,先验证了新创建的账户名是否符合EOS账户命名规则,然后读取用户资源multi_index数据表,然后调用set_resource_limits设置用户资源:

set_resource_limits( newact, 0, 0, 0 );

set_resource_limits是eosio.cdt提供的函数,声明在privileged.hpp中,实现在wasm_interface.cpp中。

这里的用户资源都被设置为了0(无限制),并没有资源设置的相关代码,这是因为创建EOS账户时push的交易同时打包了多个Action:

img

可以看到,除了内联(inline)调用的eosio.token::transfer,共调用了3个Action:

eosio::newaccount
eosio::buyrambytes
eosio::delegatebw

而资源设置相关的操作是由eosio::buyrambytes(RAM)和eosio::delegatebw(CPU/NET)这两个Action来实现的。

这两个Action的源码实现都位于eosio.contracts/contracts/eosio.system/src/delegate_bandwidth.cpp中,就不展开讲了,感兴趣的读者可以自行查阅。

更多内容

币圈信息站开发目录

EOS开发系列目录

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