全面理解EOS——3.cleos使用详解

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/w7849516230/article/details/80963115

之前的文章EOS流行之痛——RAM机制设计缺陷?EOS数据分析——让RAM再飞一会儿 从原理和数据理解EOS上的RAM资源及价格形成。原本想马上写一篇警示RAM投机的文章,朋友提醒,可能会被认为是做空之后就搁置了。本文回归技术本身,详解cleos的使用,并理解EOS资源的使用和限制。当然,你也可以用来做自动化交易机器人。

环境准备

本人测试过的环境:
Ubuntu 16.04 LTS
Ubuntu 16.04.4 LTS
macOS High Sierra(10.13.3)

编译完成的EOSIO软件 v1.0.6或 v1.0.7(90fefdd1)
具体编译过程参考全面理解EOS——1.源码编译及运行

选择使用的网络,主网或测试网
参考全面理解EOS——2.加入EOS主网和测试网
本文使用同步全量数据的JungleTestnet
下载及编译说明也可看EOS-Jungle-Testnet

EOSIO软件组成

首先还是先借用官网的图,理解EOSIO软件的构成:
这里写图片描述
编译完成的软件,在build目录中的programs中有cleos,keosd,nodeos。我们操作的命令行cleos连接了keosd和nodeos,也就是本地密钥管理和完成信息上传至EOS主链。其中nodeos可以是本地的(同步全量数据),也可以是BP提供的HTTP(s)的API节点。

cleos命令使用详解

查看cleos的帮助,保留常用功能信息如下:

选项:
  -h,--help            打印帮助信息并退出
  -u,--url TEXT=http://localhost:8888/
                       连接的nodeos的URL,本地或者远端
  --wallet-url TEXT=http://localhost:8900/
                       连接的钱包地址(keosd),一般是本地

 子命令:
  version              查看版本信息
  create               生成密钥对(其他命令在使用主网中不可用)
  get                  查询EOS链上数据
  set                  设置或更新链上数据
  transfer             EOS转账
  net                  管理本地p2p地址
  wallet               钱包管理相关
  push                 推送transaction到EOS链上
  multisig             多签名合约相关
  system               和系统eosio.system合约交互相关命令

我使用的JungleTestnet封装了下cleos,结合上面信息看他的cleos.sh脚本你也能明白,仅是设置了连接的nodeos和wallet的URL地址。

$NODEOSBINDIR/cleos/cleos -u http://$NODEHOST:$NODEPORT --wallet-url http://$WALLETHOST:$WALLETPORT "$@"

下面结合一次完整的创建账号到购买和销售RAM,抵押和赎回资源,详细说明cleos使用步骤(cleos.sh可替换为个人环境的cleos命令):

  1. 查看版本信息
  2. 生成EOS公私钥对
  3. 创建钱包,导入私钥
  4. 查询链上数据
  5. 创建新账号
  6. 转账
  7. 购买和出售RAM
  8. 抵押和赎回CPU,Net

下面是详细的使用步骤

1.查看版本信息

$ ./cleos.sh version client
Build version: 90fefdd1

2.生成EOS公私钥对

$ ./cleos.sh create key
Private key: 5Jh8oJvKWcFxPUmGzkVjeLSSBZBYfuHRa1Ekmkh14zUMUGVZYQf
Public key: EOS6FmwJ6FEh23ustzPDuaj1FBvupkZitfN5zU5Us5Sn3rPBaZxNp

不管你是否设置或启动了nodeos,该命令都可执行。

3.创建钱包,导入私钥
有了私钥,需要用钱包管理起来
(1)创建命名钱包
-n参数后面跟着钱包名称,如果不指定,默认是default(后续的解锁,导入私钥都需要-n指定操作的钱包名称);另外通过list,可查看已有的钱包名。

$ ./cleos.sh wallet create -n bcwallet
Creating wallet: bcwallet
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"PW5KA1hVFNCqSB3KSmEHACPxEWinpy5SpAStdYmH7kuufHAAKAFrD"

(2)解锁钱包
导入私钥前,需要先解锁钱包(如果是直接创建的,暂不需要解锁)

./cleos.sh wallet unlock -n bcwallet --password PW5KA1hVFNCqSB3KSmEHACPxEWinpy5SpAStdYmH7kuufHAAKAFrD

(3)导入私钥
后续的转账,创建账号等操作都要用到钱包中保存的私钥

$ ./cleos.sh wallet import 5Jh8oJvKWcFxPUmGzkVjeLSSBZBYfuHRa1Ekmkh14zUMUGVZYQf -n bcwallet
imported private key for: EOS6FmwJ6FEh23ustzPDuaj1FBvupkZitfN5zU5Us5Sn3rPBaZxNp

3.查询链上数据
(1)查询连接的nodeos信息

$ ./cleos.sh get info
{
  "server_version": "90fefdd1",
  "chain_id": "038f4b0fc8ff18a4f0842a8f0564611f6e96e8535901dd45e43ac8691a1c4dca",
  "head_block_num": 4670508,
  "last_irreversible_block_num": 4670187,
  "last_irreversible_block_id": "004742ebb3f7a97968fccd969012c57724fe4374d08861678ee985bb344af695",
  "head_block_id": "0047442c2d001a953ccd94ba99eb3325974baef62878c0e4e7923e3039cb0e86",
  "head_block_time": "2018-07-08T23:41:22.000",
  "head_block_producer": "eosninecatmx",
  "virtual_block_cpu_limit": 200000000,
  "virtual_block_net_limit": 1048576000,
  "block_cpu_limit": 199900,
  "block_net_limit": 1048576
}

本文测试的是v1.0.7版本,可以看到eosio的git中tag为v1.0.7的commit id是90fefdd12a4797e47890910f11dd7b60f1435ed4,和自己的cleos版本信息以及nodeos信息都能对应上。如果连接的是远端节点,可以看看他的信息。
但是chain_id一定要一致,不管连接哪里的nodeos,都是相同的,才说明加入到一个主网中,此处为JungleTestnet的测试网chain_id。(主网chain_id为aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906)
(2)查看在EOS Jungle Testnet Monitor 上的块信息。

$ ./cleos.sh get block 1
{
  "timestamp": "2018-06-09T00:00:00.000",
  "producer": "",
  "confirmed": 1,
  "previous": "0000000000000000000000000000000000000000000000000000000000000000",
  "transaction_mroot": "0000000000000000000000000000000000000000000000000000000000000000",
  "action_mroot": "038f4b0fc8ff18a4f0842a8f0564611f6e96e8535901dd45e43ac8691a1c4dca",
  "schedule_version": 0,
  "new_producers": null,
  "header_extensions": [],
  "producer_signature": "SIG_K1_111111111111111111111111111111111111111111111111111111111111111116uk5ne",
  "transactions": [],
  "block_extensions": [],
  "id": "00000001536fe4bec69c38d68e1b3048ac6896d12a9007ad0d471a575380d82a",
  "block_num": 1,
  "ref_block_prefix": 3594034374
}

block后的参数可以是块号(即第几块),也可以是块id(块信息json中的id)
(3)查询账号信息
tsjungletest为账号名

$ ./cleos.sh get account tsjungletest
permissions: 
     owner     1:    1 EOS7M5pVfkEysTmW28fp7bzfHFxxQwcd1DpZeo4NTAdHTAChpjgpd
        active     1:    1 EOS7M5pVfkEysTmW28fp7bzfHFxxQwcd1DpZeo4NTAdHTAChpjgpd
memory: 
     quota:     624.8 KiB    used:     3.051 KiB  

net bandwidth: 
     delegated:      50.0000 EOS           (total staked delegated to account from others)
     used:               113 bytes
     available:        9.564 MiB  
     limit:            9.564 MiB  

cpu bandwidth:
     delegated:      50.0000 EOS           (total staked delegated to account from others)
     used:             5.009 ms   
     available:        1.908 sec  
     limit:            1.913 sec  

EOS balances: 
     liquid:           10.1668 EOS
     staked:            0.0000 EOS
     unstaking:         0.0000 EOS
     total:            10.1668 EOS

可以看账号的Owner和Active权限对应的公钥地址
持有和使用的RAM情况,网络带宽、CPU的抵押和可用信息
如果账号不存在,将会提示出错
4. 创建新账号
测试网上通过网页接口能直接创建账号,无需花费。主网创建账号,需要一个已存在的账号来创建新账号,同时需要为新账号购买RAM和抵押获得网络带宽和CPU,如果资源获取不够,会导致即使账号创建成功,但不能转账和抵押等操作。
要使用旧账号创建新账号,需要给钱包导入旧账号的私钥。

$ ./cleos.sh system newaccount --stake-net "1.0000 EOS" --stake-cpu "1.0000 EOS" --buy-ram-kbytes 8 tsjungletest t1jungletest EOS6FmwJ6FEh23ustzPDuaj1FBvupkZitfN5zU5Us5Sn3rPBaZxNp EOS6FmwJ6FEh23ustzPDuaj1FBvupkZitfN5zU5Us5Sn3rPBaZxNp

创建账号、转账等操作都是调用系统合约来实现;从命令中可以看到抵押获取网络带宽、CPU,以及购买了8k的内存,最后带了新账号的owner和active权限使用的EOS公钥地址。
注意的是Owner和Active权限可以使用相同或不同的公钥,另外记住让别人创建账号,一定是给别人公钥;并且在创建完后,检查Owner和Active权限对应公钥都是自己的,因为Owner权限可以修改Active权限的地址;而Active权限可以转账,购买资源等操作。
5. 转账
新账号还没EOS余额,可以从其他账号转账
tsjungletest为转账人,t1jungletest为接收人, “1 EOS”为数量和代币名称

$./cleos.sh transfer tsjungletest t1jungletest "1 EOS"
executed transaction: 261bcdca942070a2014f2cd4d7057004d891643fbe976cffe0832ee3356d7371  128 bytes  1867 us
#   eosio.token <= eosio.token::transfer        {"from":"tsjungletest","to":"t1jungletest","quantity":"1.0000 EOS","memo":""}
#  tsjungletest <= eosio.token::transfer        {"from":"tsjungletest","to":"t1jungletest","quantity":"1.0000 EOS","memo":""}
#  t1jungletest <= eosio.token::transfer        {"from":"tsjungletest","to":"t1jungletest","quantity":"1.0000 EOS","memo":""}
warning: transaction executed locally, but may not be confirmed by the network yet

6. 购买和出售RAM
购买资源前,可以先查账号的信息,看看资源使用情况
(1)购买RAM
购买RAM可以购买指定EOS数量的,也可在创建账号时购买指定KB大小的。
也是通过调用系统合约,为自己或者为他人购买RAM。

$ ./cleos.sh system buyram t1jungletest t1jungletest "0.5 EOS"
276992ms thread-0   main.cpp:429                  create_action        ] result: {"binargs":"90b1ca2ab2a95fc890b1ca2ab2a95fc8881300000000000004454f5300000000"} arg: {"code":"eosio","action":"buyram","args":{"payer":"t1jungletest","receiver":"t1jungletest","quant":"0.5000 EOS"}} 
executed transaction: f5cfad9501c6a4e4a82fa8953dbf928e0094041723b113820993b808a6b65617  128 bytes  4672 us
#         eosio <= eosio::buyram                {"payer":"t1jungletest","receiver":"t1jungletest","quant":"0.5000 EOS"}
#   eosio.token <= eosio.token::transfer        {"from":"t1jungletest","to":"eosio.ram","quantity":"0.4975 EOS","memo":"buy ram"}
#  t1jungletest <= eosio.token::transfer        {"from":"t1jungletest","to":"eosio.ram","quantity":"0.4975 EOS","memo":"buy ram"}
#     eosio.ram <= eosio.token::transfer        {"from":"t1jungletest","to":"eosio.ram","quantity":"0.4975 EOS","memo":"buy ram"}
#   eosio.token <= eosio.token::transfer        {"from":"t1jungletest","to":"eosio.ramfee","quantity":"0.0025 EOS","memo":"ram fee"}
#  t1jungletest <= eosio.token::transfer        {"from":"t1jungletest","to":"eosio.ramfee","quantity":"0.0025 EOS","memo":"ram fee"}
#  eosio.ramfee <= eosio.token::transfer        {"from":"t1jungletest","to":"eosio.ramfee","quantity":"0.0025 EOS","memo":"ram fee"}

从上面的执行输出也能看到从eosio.ram获取RAM,并把手续费给了eosio.ramfee,手续费为0.5%
(2)出售RAM
出售RAM时,只能将卖出的RAM所得给自己,并不能直接将RAM转给其他人。
出售RAM也收取了手续费

$ ./cleos.sh system sellram t1jungletest 1024
1146585ms thread-0   main.cpp:429                  create_action        ] result: {"binargs":"90b1ca2ab2a95fc80004000000000000"} arg: {"code":"eosio","action":"sellram","args":{"account":"t1jungletest","bytes":1024}} 
executed transaction: 971ba2bb064b8e040a0c9c90eba1359aeb0eaf89c933d11470edd4547ba096ab  112 bytes  4365 us
#         eosio <= eosio::sellram               {"account":"t1jungletest","bytes":1024}
#   eosio.token <= eosio.token::transfer        {"from":"eosio.ram","to":"t1jungletest","quantity":"0.0492 EOS","memo":"sell ram"}
#     eosio.ram <= eosio.token::transfer        {"from":"eosio.ram","to":"t1jungletest","quantity":"0.0492 EOS","memo":"sell ram"}
#  t1jungletest <= eosio.token::transfer        {"from":"eosio.ram","to":"t1jungletest","quantity":"0.0492 EOS","memo":"sell ram"}
#   eosio.token <= eosio.token::transfer        {"from":"t1jungletest","to":"eosio.ramfee","quantity":"0.0003 EOS","memo":"sell ram fee"}
#  t1jungletest <= eosio.token::transfer        {"from":"t1jungletest","to":"eosio.ramfee","quantity":"0.0003 EOS","memo":"sell ram fee"}
#  eosio.ramfee <= eosio.token::transfer        {"from":"t1jungletest","to":"eosio.ramfee","quantity":"0.0003 EOS","memo":"sell ram fee"}

7. 抵押和赎回CPU,Net
(1)抵押获取CPU和Net带宽、
可以给自己或他人抵押获取CPU和网络带宽

$ ./cleos.sh system delegatebw t1jungletest t1jungletest "1.0000 EOS" "1.0000 EOS"
或者
$ ./cleos.sh system delegatebw tsjungletest t1jungletest "0.5000 EOS" "0.5000 EOS"

(2)赎回抵押出去的EOS

把给自己抵押的EOS赎回来,会在72小时后回到自己账号;如果赎回别人帮你抵押获取的资源,赎回后EOS返回到帮你抵押人账号下。如果赎回接收的人非抵押人,则赎回不成功

$ ./cleos.sh system undelegatebw t1jungletest t1jungletest "0.5000 EOS" "0.5000 EOS"

总结

其实完整的操作和部分实例信息,cleos官方文档说明里都有,此处这么繁琐的展示操作和返回结果,希望能有助于理解。另外有几点需要明白
1.RAM购买与出售
RAM的购买可以为自己,也可以为他人;但是一旦购买后,出售RAM只能给自己,并不能帮别人存放。因此大量的囤积,对自己本身没太多好处,如果用不完,一是不能直接出售给他人获利;二是也无法通过租赁给别人使用
2.自动化波段操作
从上述的命令中可以看到实现自动化波段操作的基本方法,比如定时查询RAM市场价格或者根据查询获得的RAM余量和eosio.ram余额也可计算获得RAM价格,然后在指定条件下购买和出售RAM。
3.交易所中的RAM
像部分交易所RAMCORE纯属虚的概念,仅是在价格上锚定了RAM,其他任意的操作都不影响实际的RAM价格和数量变化。

最后说明下,最近在整理EOS上的数据,大家有感兴趣的方面可以给我留言。比如看到6月25号之前购买RAM超过10000EOS的账号数量非常少等等(具体数值后续统一放出)。

为自己能读到这里点个赞吧。

转载请注明出处:http://blog.csdn.net/w7849516230,欢迎关注微信公众号“编程阳光”
这里写图片描述

阅读更多

扫码向博主提问

w7849516230

非学,无以致疑;非问,无以广识
去开通我的Chat快问

没有更多推荐了,返回首页