[EOS源码分析]11.cleos create account创建账号失败源码分析

    我们知道在部署eosio.system合约之前,cleos new account都是可以好好使用的,一旦eosio.system部署完成,再执行该命令就会报如下错误。

$cleos create account eosio itleaks EOS8Znrtgwt8TfpmbVpTKvA2oB8Nqey625CLN8bCN3TEbgx86Dsvt
Error 3080001: account using more than allotted RAM usage
    这时必须使用如下命令创建对象
$cleos system newaccount eosio itleaks EOS8Znrtgwt8TfpmbVpTKvA2oB8Nqey625CLN8bCN3TEbgx86Dsvt —stake-net-bandwidth xxx
    其实system newaccount也是调用createaccount命令来创建账号,只不过又多执行一个buyram action

    也就是通过新增一个buyram action来解决RAM不够问题,那这里就存在一个问题了?为啥eosio.system部署前不报这个ram不够的错呢?
   这个是因为newaccount这个action有两个执行者,一个是native handler函数create_native_account,一个是eosio.system的newaccount函数(原理具体可看我的博文【EOS特殊智能合约eosio】)。create_native_account函数负责创建账号,初始化账号数据。经过create_native_account函数处理后,账号的cpu_resource_limit中的cpu,ram, net都是-1,意味着账号拥有无限的ram, cpu, net, 所以不会报错。而eosio.system部署后,“newaccount”这个action还会执行eosio.system的newaccount函数,这个函数做了一个很重要的事,就是将账号的cpu_resource_limit中的ram,cpu, net都赋值为0,这样该账号就没有任何资源了,因而在后面的检测阶段因为ram不够而报错。

源码分析

"newaccount"的两个处理函数逻辑如下:

native handler的处理函数


eosio.system的处理函数newaccount



/********************************
* 本文来自CSDN博主"爱踢门"
* 转载请标明出处:http://blog.csdn.net/itleaks
******************************************/

EOS互助社区:Eosfavor.com, 免费购买EOS CPU,创建账号

EOS技术交流群,EOS开发群,以太坊技术群:787804520



    

猜你喜欢

转载自blog.csdn.net/itleaks/article/details/80882017
今日推荐