这几天很多朋友都在问我他们账号里的EOS为啥没法转账,且都是staked状态。今天就和大家一起来分析一下EOS账号的各种操作及状态信息,比如balance, staked, delegated, cpu bandwidth, net bandwidth, memory,然后你就懂了。
先看下下面的图
这里的余额和网上所说的unstaked eos是一个东西,即用户可以自由转账的EOS数值。
这两部分都是抵押的EOS,都是通过delegatebw命令来实现的,用来预购买cpu bandwidth和net bandwidth的。staked对应的是from=to, 而delegated对应的是from!=to。同时,用户可以通过undelegatedbw把这部分EOS提现到balance里的,让这些EOS恢复自由。但是需要注意的是,提现只能提回原始账号。比如staked部分EOS就是提回自己的账号,而delegated部分就提回到别人账号。这个和我们现实生活中的退票退费一样的道理。alice用自己的银行卡帮bob买了一张火车票,退票时资金是原路退回到alice的银行卡,而不是退到火车票的拥有者bob手里。目前这个提现是有时间延时的,3天后才能退回到balance里。同时已经花掉的eos没法立马提现,必须随着系统总带宽增加慢慢提现,比如下图
memory就是ram, 新建账号时,账号数据会写到数据库里, 因而需要购买ram。这也是为啥如下命令会失败的原因
$ ./cleos.sh create account itleakstoken tokenitleaks EOS5TywWpHzgUxsjvEQHuEoezKvgWRkKnbc1HgYHuGQWiorU4yG6C EOS5TywWpHzgUxsjvEQHuEoezKvgWRkKnbc1HgYHuGQWiorU4yG6C -p itleakstoken
Error 3080001: account using more than allotted RAM usage
Error Details:
account tokenitleakt has insufficient ram; needs 2996 bytes has 0 bytes
但是先有账号才能购买ram, 而创建账号又必须要有ram,所以这里存在一个先有鸡还是先有蛋的问题。使用如下命令即可解决这个问题。
$ ./cleos.sh system newaccount --stake-net "0.0000 EOS" --stake-cpu "0.0000 EOS" --buy-ram-kbytes 8 itleakstoken tokenitleaks EOS5TywWpHzgUxsjvEQHuEoezKvgWRkKnbc1HgYHuGQWiorU4yG6C
该命令会创建3个action:newaccount, delegatebw, buyram, 并打包在同一个transaction里面。由于检测ram逻辑是在transaction结束的时候,而此时buyram已经生效了,自然不会报错了。
这里的stake-net, stake-cpu我故意设置为0来说明这两个stake不是必须的。但是为了方便新账号可以立马执行action,通常这里会转一些stake-net和stake-cpu。
当我们通过delegatebw命令抵押一部分EOS时,其实会引发一次转账。会从当前账号转走对应的EOS至eosio.stake账号(可认为是往eosio.stake账号充值),同时记录来源,方便后期从eosio.stake提现。
具体源码如下
核心逻辑changbw:
比如一位同学的账号信息如下:(该信息可以在https://eosflare.io/account查询,下图中的total balance和上面通过cleos获取到的balance含义不一样,这里unstaked才是上文的balance), 尽管总量有1778个,但是可转账的只有0.3738个,其他的都处于staked状态。
对于EOS都是staked状态这种情况,我找到如下一个解释:
这段话告诉我们是启动团队在分发EOS币的时候自动将EOS转变为staked状态了,这样做的目的当然是鼓励大家投票而不是忙着转账啦。当然这个文章也只是部分正确。从上图我们可以看出,EOS并不是完全100% staked, 还有0.4EOS,所以还是可以转账的。且unstake必须等到21个超级节点竞选完成后是通过如下代码实现的
转账
从账号itleakstoken转7个EOS给tokenitleaks账号, 需要有itleakstoken账号的私钥
$./cleos.sh push action eosio.token transfer '["itleakstoken", "tokenitleaks", "7 EOS", "transfer test"]' -p itleakstoken
抵押EOS购买cpu bandwidth或者net bandwidth
itleakstoken账号帮tokenitleaks账号抵押4个EOS,其中2个用作CPU资源抵押,另外两个用作NET资源抵押, 需要有itleakstoken账号的私钥
$./cleos.sh system delegatebw itleakstoken tokenitleaks "2.0000 EOS" "2.000 EOS" -p itleakstoken
取消代理即提现
和delegatebw参数一样
$./cleos.sh system undelegatebw itleakstoken tokenitleaks "2.0000 EOS" "2.000 EOS" -p itleakstoken
购买ram
为账号tokenitleaks购买ram, 消耗的费用从itleakstoken扣, 需要有itleakstoken账号的私钥
$./cleos.sh system buyram itleakstoken tokenitleaks "1 EOS" -p itleakstoken
上面所有命令中的itleakstoken和tokenitleaks两个账号可以是同一个账号。
原文:https://blog.csdn.net/itleaks/article/details/80673417
EOS技术交流,主网账户代创建,ram买卖,钱包开发