一起学习EOS|EOS的命令行程序和工具超详细实战演习(附代码)

image

1

钱  包

先来体验下EOS的钱包。

如上篇说介绍,EOS的钱包是由keosd进程读取本地钱包文件,然后用cleos 与keosd的进程进行交互。

首先,我们进到keosd所在目录。

➜  programs git:(master) ✗ cd keosd
➜  keosd git:(master) ✗ ll
total 11576drwxr-xr-x  5 joe  staff   160B  4  8 00:32 CMakeFiles
-rw-r--r--  1 joe  staff   297B  4  8 00:29 CTestTestfile.cmake
-rw-r--r--  1 joe  staff   8.6K  4  8 00:29 Makefile
-rw-r--r--  1 joe  staff   1.8K  4  8 00:29 cmake_install.cmake
-rwxr-xr-x  1 joe  staff   5.6M  4  8 00:42 keosd
➜  keosd git:(master) ✗ pwd
/Users/joe/Workspace/eos/build/programs/keos

可以看到可执行程序keosd, 让我们运行它:

➜  keosd git:(master) ✗ ./keosd1306994ms thread-0   wallet_plugin.cpp:41          plugin_initialize    ] initializing wallet plugin1306994ms thread-0   http_plugin.cpp:141           plugin_initialize    ] host: 127.0.0.1 port: 88881306994ms thread-0   http_plugin.cpp:144           plugin_initialize    ] configured http to listen on 127.0.0.1:88881306994ms thread-0   http_plugin.cpp:213           plugin_startup       ] start listening for http requests1306995ms thread-0   wallet_api_plugin.cpp:70      plugin_startup       ] starting wallet_api_plugin1306995ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/create1306995ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/get_public_keys1306995ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/import_key1306995ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/list_keys1306995ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/list_wallets1306995ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/lock1306995ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/lock_all1306995ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/open1306995ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/set_timeout1306995ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/sign_transaction1306995ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/unlock

运行成功,我们仔细观察下输出日子,发现keosd监听了本地8888端口,并添加了一些了handler,并打印出了每个handler的api url。

于是我明白了keosd这个后台进程是为我们提供了RESTful API的访问方式。cleos 也正是通过基于http协议的RESTful API与 keosd 进行交互的。 

接下来,让我们与keosd 进行一些亲密接触。

keosd运行的时候,它默认会在当前用户的home目录下,创建一个eosio-wallet的文件夹。文件夹底下有一个config.ini文件:

➜  keosd git:(master) ✗ ls ~/eosio-wallet
config.ini
➜  keosd git:(master) ✗ cat ~/eosio-wallet/config.ini
# The local IP and port to listen for incoming http connections. (eosio::http_plugin)
http-server-address = 127.0.0.1:8888# Specify the Access-Control-Allow-Origin to be returned on each request. (eosio::http_plugin)
# access-control-allow-origin =

# Specify the Access-Control-Allow-Headers to be returned on each request. (eosio::http_plugin)
# access-control-allow-headers =

# Specify if Access-Control-Allow-Credentials: true should be returned on each request. (eosio::http_plugin)access-control-allow-credentials = false

# The path of the wallet files (absolute path or relative to application data dir) (eosio::wallet_plugin)
wallet-dir = "."# Timeout for unlocked wallet in seconds. Wallets will automatically lock after specified number of seconds of inactivity. Activity is defined as any wallet command e.g. list-wallets. (eosio::wallet_plugin)
# unlock-timeout =

# eosio key that will be imported automatically when a wallet is created. (eosio::wallet_plugin)
# eosio-key =

# Plugin(s) to enable, may be specified multiple times
# plugin =

config.ini, 是keods配置文件,可以配置访问地址,钱包数据存放地址等等。

看上面的配置文件的默认配置

wallet-dir = "."

也就是说,当我们创建钱包的时候,钱包数据,就存储在和config.ini一样的目录第下。

让我们创建一个钱包来验证一下吧:

首先创建一个钱包: 

➜  keosd git:(master) ✗ cd ../cleos
➜  cleos git:(master) ✗ ./cleos wallet create -n 'jc1991wallet'Creating wallet: jc1991walletSave password to use in the future to unlock this wallet.Without password imported keys will not be retrievable."PW5K9B4aHLkfB55ck69PGHFrq9ej31ZhRSWftboSW8qRhptAntV2v"

注意啦,是用cleos在和 keosd进行交互哦

  • 由keosd所在目录出来,进入到cleos所在目录

  • 创建了一个名为 jc1991wallet的钱包

  • 仔细看输出日志,除了告诉我们jc1991wallet这个钱包创建成功了。还警告我们,要好好保管好密码,丢失了这个钱包密码,以后想取回保存在钱包中的私钥不可能的!

  • 日志的最后一行,就是钱包的密码。非常非常重要,让我复制起来,先找个地方保存好,免得丢失了。

我把这个钱包密码保存在这里吧:

PW5K9B4aHLkfB55ck69PGHFrq9ej31ZhRSWftboSW8qRhptAntV2v

创建完钱包后,我们赶紧去看下,eos-wallet 目录下多了什么吧

➜  cleos git:(master) ✗ ls ~/eosio-wallet
config.ini          jc1991wallet.wallet
➜  cleos git:(master) ✗ cat ~/eosio-wallet/jc1991wallet.wallet
{
  "cipher_keys": "53df705d7eae43113c27af0359268a8f60f6cb246d64ced3b745a36c3549cfd08b3a9923ec346e9a8d904e81ca2a322a8b139ec6f2c709306298c9fa056bae2af13c15502971ccc779549280ffbbbb35c1854064471c899f0265a26cab3a3fdcb0c5540220a3d8d11c567ee99519746971b38581e586c5751835e87f45d4cf44e4f46a9a0afa0159042421ebb584524a"
}%

可以看到,多了一个* jc1991wallet.wallet* 文件,看里面的内容就知道,这是个钱包内容的加密文件,要记得常常备份保存哦。

科普下 在没有密码的情况下,要根据* jc1991wallet.wallet* 的文件内容,破解里面保存的私钥信息,是几乎不可能的。这就是为什么不能丢失钱包密码。

jc1991wallet.wallet , 可以看作一个小型数据库,保管了你的EOS私钥。任何人在没有钱包密码的情况下,无法访问里面的私钥。

接下来,看下我们创建的钱包:

➜  cleos git:(master) ✗ ./cleos wallet listWallets:[  "jc1991wallet *"]

cleos wallet list 可以列出所有的钱包。

注意看,”jc1991wallet ” 后面有个  号代表什么?

代表钱包是解锁状态的,钱包初次创建的时候,默认是解锁状态的,让我们试着锁住钱包:

➜  cleos git:(master) ✗ ./cleos wallet lock  -n jc1991walletLocked: jc1991wallet
➜  cleos git:(master) ✗ ./cleos wallet listWallets:
[  "jc1991wallet"]

运行 cleos wallet lock -n jc1991wallet之后,显示钱包已锁定。 再次查看的时候, * 号已经没有了。 此时钱包是锁定状态。

那接下来,让我们再次解锁钱包:解锁钱包需要用到创建钱包时给我们的密码。

➜  cleos git:(master) ✗ ./cleos wallet unlock  -n jc1991walletpassword:

运行 cleos wallet unlock -n jc1991wallet之后,程序等待我们输入钱包密码,我故意输入错误的密码,看看会发生什么:

➜  cleos git:(master) ✗ ./cleos wallet unlock  -n jc1991walletpassword: Error 3140005: Invalid wallet passwordAre you sure you are using the right password?Error Details:
Invalid password for wallet: "/Users/joe/eosio-wallet/./jc1991wallet.wallet"error during aes 256 cbc decrypt final

华丽的报错了,不知道密码还想打开钱包?没门!

接下来我输入正确的密码:

➜  cleos git:(master) ✗ ./cleos wallet unlock  -n jc1991walletpassword: Unlocked: jc1991wallet
➜  cleos git:(master) ✗ ./cleos wallet listWallets:
[  "jc1991wallet *"]

解锁成功!!再次查看钱包列表的时候,* 又回来了,此时钱包是解锁状态。我们可以对钱包进行各种操作!

来点额外探索 :

在进行下一步实战之前,我很想调皮一下,把keosd进程关闭掉,看看会发生什么 ?

➜  cleos git:(master) ✗ ./cleos wallet listWallets:Failed to connect

不出所料,提示不上啦。keosd进程已经被我关闭,http 请求自然达不到了。

接下来我重新了启动keosd进程。

➜  keosd git:(master) ✗ ./keosd1036886ms thread-0   wallet_plugin.cpp:41          plugin_initialize    ] initializing wallet plugin1036886ms thread-0   http_plugin.cpp:141           plugin_initialize    ] host: 127.0.0.1 port: 88881036886ms thread-0   http_plugin.cpp:144           plugin_initialize    ] configured http to listen on 127.0.0.1:88881036887ms thread-0   http_plugin.cpp:213           plugin_startup       ] start listening for http requests1036887ms thread-0   wallet_api_plugin.cpp:70      plugin_startup       ] starting wallet_api_plugin1036887ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/create1036887ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/get_public_keys1036887ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/import_key1036887ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/list_keys1036887ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/list_wallets1036887ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/lock1036887ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/lock_all1036887ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/open1036887ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/set_timeout1036893ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/sign_transaction1036893ms thread-0   http_plugin.cpp:242           add_handler          ] add api url: /v1/wallet/unlock

启动keosd进程,再来看看钱包列表怎么样?

➜  cleos git:(master) ✗ ./cleos wallet listWallets:[]

不看不知道,一看吓一跳,我的钱包呢?钱包呢?包呢?!!为何数组是空的?

别慌,原来使用钱包之前,还有需要一个额外操作:那就打开钱包(也可以理解为,加载钱包文件)

➜  cleos git:(master) ✗ ./cleos wallet open -n jc1991walletOpened: jc1991wallet
➜  cleos git:(master) ✗ ./cleos wallet listWallets:[  "jc1991wallet"]

运行 cleos wallet open -n jc1991wallet之后,再次查看 jc1991wallet钱包出现了, 但* 号没有了。 说明此时钱包是锁住的状态的。下一步操作之前,需要解锁:

➜  cleos git:(master) ✗ ./cleos wallet unlock  -n jc1991walletpassword: Unlocked: jc1991wallet

有了一个以解锁的钱包,接下来,我们往钱包里存放点私钥吧!

2

往钱包里倒入EOS私钥

首先看下钱包中的key把:

➜  cleos git:(master) ✗ ./cleos wallet keys[[    "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",    "5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"
  ]
]

运行 cleos wallet keys之后,列出了,当前所有解锁中钱包的key。

有人会有疑问,明明还没创建key,还没往钱包里存任何key。列出来的这个是哪儿来的?

问的好,这个key,是EOS这个版本给我们开发者专用的超级账号的key(超贴心的,上版本是要自己去申请,麻烦死了。)。后续我们创建account,部署智能合约时会用到它。这里我们先跳过它,回到正题。

往钱包倒入私钥之前,让我们创建一个吧,

➜  cleos git:(master) ✗ ./cleos create keyPrivate key: 5JwmoZrb9zTEQSt6xS3oJzk2ihho9W8bjZda6ZASN2NTUzHxt43Public key: EOS5KEYfYrQQHbqx2GqqGMFLeqywSj2TWig4dQLJMhyHHEmWSK7jt

运行 cleos create key之后 ,就创建了一副key对,看输出,上面一行是私钥,私钥是谨慎保存的,不对外泄漏的,等等我们就将它导入到我们的钱包里。

下面一行的是公钥。公钥可以对外公开。公钥的前缀带有“EOS” 别认错了哦。

接下来,就把私钥导入钱包吧:

➜  cleos git:(master) ✗ ./cleos wallet import -n jc1991wallet  5JwmoZrb9zTEQSt6xS3oJzk2ihho9W8bjZda6ZASN2NTUzHxt43
imported private key for: EOS5KEYfYrQQHbqx2GqqGMFLeqywSj2TWig4dQLJMhyHHEmWSK7jt

运行 cleos wallet import -n jc1991wallet ,我们将私钥导入了 jc1991wallet 这个钱包,导入成功,打印出了公钥地址。

由私钥可以推导出公钥 这个需要记住,考试要考的哦。 所以我们只是往钱包导入了私钥。钱包通过算法可以推导出这个私钥对于的公钥: 让我们来看下:

➜  cleos git:(master) ✗ ./cleos wallet keys
[[    "EOS5KEYfYrQQHbqx2GqqGMFLeqywSj2TWig4dQLJMhyHHEmWSK7jt",    "5JwmoZrb9zTEQSt6xS3oJzk2ihho9W8bjZda6ZASN2NTUzHxt43"
  ],[    "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",    "5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"
  ]
]

keys 列表,新增了一对key,正是我们上面导入钱包导那对key。钱包只保存私钥,打印出来的公钥,是由私钥算出来的。

3

总  结

这篇文章里,我们做了这么些事:

  • 启动keosd钱包进程

  • 浏览了由 keosd 钱包进程创建的 ~/eos-wallet 目录

  • 用cleos命令行工具,与keosd钱包进程进行交互。

  • 创建了第一个钱包,名字叫 jc1991wallet, 并把钱包的密码公然藏在这个文章里。(大家千万不要学着点,钱包密码一定要好好保存好。)

  • 接下来尝试了对 jc1991wallet 这个钱包的解锁、和锁定。

  • 关闭keosd钱包进程,再打开,发现jc1991wallet 不见了,交接到,原来使用钱包之前,需要先 open。

  • 创建了一对keys。

  • 将keys中的私钥,导入了到 jc1991wallet钱包。

本文内容作者:HiBlock区块链社区“一起写笔记”小伙伴——jc1991

原文首发于币乎

以下是我们的社区介绍,欢迎各种合作、交流、学习:)

image

猜你喜欢

转载自blog.csdn.net/hiblock/article/details/80087117