EOS主网刚上线,账号却没法转账,EOS账号那些事

这几天很多朋友都在问我他们账号里的EOS为啥没法转账,且都是staked状态。今天就和大家一起来分析一下EOS账号的各种操作及状态信息,比如balance, staked, delegated, cpu bandwidth, net bandwidth, memory,然后你就懂了。

账号状态信息

先看下下面的图

balance(余额)

这里的余额和网上所说的unstaked eos是一个东西,即用户可以自由转账的EOS数值。

staked, delegated:

这两部分都是抵押的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:

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.0000EOS" --stake-cpu "0.0000EOS"--buy-ram-kbytes8 itleakstoken tokenitleaks EOS5TywWpHzgUxsjvEQHuEoezKvgWRkKnbc1HgYHuGQWiorU4yG6C

该命令会创建3个action:newaccount, delegatebw, buyram, 并打包在同一个transaction里面。由于检测ram逻辑是在transaction结束的时候,而此时buyram已经生效了,自然不会报错了。

这里的stake-net, stake-cpu我故意设置为0来说明这两个stake不是必须的。但是为了方便新账号可以立马执行action,通常这里会转一些stake-net和stake-cpu。

stake抵押原理分析

当我们通过delegatebw命令抵押一部分EOS时,其实会引发一次转账。会从当前账号转走对应的EOS至eosio.stake账号(可认为是往eosio.stake账号充值),同时记录来源,方便后期从eosio.stake提现。

具体源码如下

核心逻辑changbw:

EOS初始随机账号staked状态分析

比如一位同学的账号信息如下:(该信息可以在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个超级节点竞选完成后,而是通过undelegatebw命令3天后就可以变为unstaking状态。

其他相关命令汇总

转账

$./cleos.sh push action eosio.token transfer '["itleakstoken", "tokenitleaks", "7 EOS", "transfer test"]' -p itleakstoken

抵押EOS购买cpu bandwidth或者net bandwidth

$./cleos.sh system delegatebw itleakstoken tokenitleaks "2.0000 EOS" "2.000 EOS" -p itleakstoken

取消代理即提现

$./cleos.sh system undelegatebw itleakstoken tokenitleaks "2.0000 EOS" "2.000 EOS" -p itleakstoken

购买ram

$./cleos.sh system buyram itleakstoken tokenitleaks "1 EOS"

附录:

EOS 1.0.2 查询账号信息self_delegated_bandwidth错误

$ ./cleos.sh get account itleakstoken

977833ms thread-0 main.cpp:2659 main ] Failed with error: Assert Exception (10)

itr != structs.end():Unknown struct self_delegated_bandwidth

这个错误可参考这个修复

https://garanto.org/eosio-eos-finish-the-delegated_bandwidth-self_delegated_bandwidth-3981.html

声明:

目前主网仍处于启动初级阶段,本文操作也只是个人的环境实践,并不一定适合读者的环境。因此请谨慎操作你的账号,由此引起的任何风险,本文作者不负任何责任

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180613G0AA6300?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券