admin管理员组

文章数量:1648350

    我们知道在部署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/itleaks
***************************************************|

如果你对EOS,ETH技术及开发感兴趣,请入QQ群讨论: 829789117


如需实时查看最新文章,请关注公众号"区块链斜杠青年",一起探索区块链未来

 

本文标签: 源码账号EOSAccountcreate