全面理解EOS——3.cleos使用详解
Posted w7849516230
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全面理解EOS——3.cleos使用详解相关的知识,希望对你有一定的参考价值。
之前的文章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命令):
- 查看版本信息
- 生成EOS公私钥对
- 创建钱包,导入私钥
- 查询链上数据
- 创建新账号
- 转账
- 购买和出售RAM
- 抵押和赎回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,欢迎关注微信公众号“编程阳光”
以上是关于全面理解EOS——3.cleos使用详解的主要内容,如果未能解决你的问题,请参考以下文章