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.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。

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个超级节点竞选完成后是通过如下代码实现的

其他相关命令汇总

转账

    从账号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两个账号可以是同一个账号。

附录:

    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

    这个错误可参考这个修复

解决方案:

     参考这篇文章【EOS互助平台】

声明:
    目前主网仍处于启动初级阶段,本文操作也只是个人的环境实践,并不一定适合读者的环境。因此请谨慎操作你的账号,由此引起的任何风险,本文作者不负任何责任
/********************************
* 本文来自CSDN博主"爱踢门"
* 转载请标明出处:http://blog.csdn.net/itleaks
******************************************/

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

猜你喜欢

转载自blog.csdn.net/itleaks/article/details/80673417