EOS 中有两种方式启动钱包:
- 一个用 nodeos server 启动的插件
- 一个独立的后台程序,能够运行在一个独立于 nodeos server 的 server 上
我们将使用后者示范。
重要的概念
很多人认为钱包是存储 token 的,实际上这是一个错误的概念。
钱包实际上存储的是钥匙对(key pairs)。下图表明了 keosd daemon 有多个钱包,并且每个钱包有多个 public+private key pairs。
1. 启动 keosd 并创建钱包
在上一篇中我们已经在 5555 端口上面运行了钱包程序,但这里需要注意的是,在上一篇文章中启动 wallet 容器的方式是 —rm
,这意味着退出后容器会自动删除,当然创建的钱包文件也就不见了,所以我们需要去掉 —rm
,让这个容器持久化:
docker run --name wallet --network=eosnetwork -p 5555:5555 -i binaryfocus/eosdawn-2018-04-27-alpha-dev /bin/bash -c "keosd --http-server-address=0.0.0.0:5555"
然后创建钱包:
root@0ad6e73c14f2:/# cleos --wallet-url http://wallet:5555 wallet create
Creating wallet: default
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"PW5J7CKieZrxCCegG3DgFHUdcAc7YTJzxCGWDYQMW6ogyWJmvSfc7"
这时我们已经得到了这个默认钱包的密码,你需要把它保存起来。
默认钱包的地址是 ~/eosio-wallet/default.wallet
,注意这个地址是在 wallet 容器中,而不是我们当前操作的 tools 容器,你可以通过 docker exec -it wallet bash
开启一个 wallet 容器的终端来访问这个目录。
这时钱包里会有一个(publict+private)钥匙对:
root@0ad6e73c14f2:/# cleos --wallet-url http://wallet:5555 wallet keys
[[
"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
"5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"
]
]
2. 加载钱包
初次启动 keosd 时需要通过 open 加载钱包,然后钱包才能运行。
比如说,现在查看一下钱包的状态,它是正在运行的:
root@0ad6e73c14f2:/# cleos --wallet-url http://wallet:5555 wallet list
Wallets:
[
"default *"
]
然后重启 wallet 容器:
# ctrl+c 退出
docker start wallet
docker attach wallet
再次查看钱包状态:
root@0ad6e73c14f2:/# cleos --wallet-url http://wallet:5555 wallet list
Wallets:
[]
这时是空的,因为初次启动 keosd
其实需要先手动加载钱包:
root@0ad6e73c14f2:~# cleos --wallet-url http://wallet:5555 wallet open
Opened: default
root@0ad6e73c14f2:~# cleos --wallet-url http://wallet:5555 wallet list
Wallets:
[
"default"
]
3. 解锁钱包
当然,仅仅 open 钱包之后也什么都做不了,你还需要用密码 unlock:
root@0ad6e73c14f2:~# cleos --wallet-url http://wallet:5555 wallet unlock
password:
Unlocked: default
现在再 list 一下,钱包名会多出一个 * 代表它已经被解锁了。
root@0ad6e73c14f2:~# cleos --wallet-url http://wallet:5555 wallet list
Wallets:
[
"default *"
]
4. 添加 KEY
每个账户有两个权限:owner, active,因此多数情况下需要创建两个 key。
创建 key 并导入钱包:
root@0ad6e73c14f2:~# cleos create key
Private key: 5KRg9KJQhRzqBVppMuzWJooMTQP99Z8BpEwhpB4J3mXrivMd2HD
Public key: EOS5KSUCYnHgpxZwSnFNBkJ1LCdqU1iFwazQbEgQAbysV2FLFSBDB
root@0ad6e73c14f2:~# cleos --wallet-url http://wallet:5555 wallet import 5KRg9KJQhRzqBVppMuzWJooMTQP99Z8BpEwhpB4J3mXrivMd2HD
imported private key for: EOS5KSUCYnHgpxZwSnFNBkJ1LCdqU1iFwazQbEgQAbysV2FLFSBDB
root@0ad6e73c14f2:~# cleos create key
Private key: 5JguJAMAGq3oY5TYq3cMqhcJQBXZfkUdfkWVxG5F3z5guLw1MDv
Public key: EOS6twXkcVomuTH2rih8SgeSPATVLnKts1HR3Q76bvy7aoeC1Yv6L
root@0ad6e73c14f2:~# cleos --wallet-url http://wallet:5555 wallet import 5JguJAMAGq3oY5TYq3cMqhcJQBXZfkUdfkWVxG5F3z5guLw1MDv
imported private key for: EOS6twXkcVomuTH2rih8SgeSPATVLnKts1HR3Q76bvy7aoeC1Yv6L
这时钱包中就有了三个 key pair 啦,一个是 master key(创建钱包时生成的),另外两对是刚刚导入的。
root@0ad6e73c14f2:~# cleos --wallet-url http://wallet:5555 wallet keys
[[
"EOS5KSUCYnHgpxZwSnFNBkJ1LCdqU1iFwazQbEgQAbysV2FLFSBDB",
"5KRg9KJQhRzqBVppMuzWJooMTQP99Z8BpEwhpB4J3mXrivMd2HD"
],[
"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
"5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"
],[
"EOS6twXkcVomuTH2rih8SgeSPATVLnKts1HR3Q76bvy7aoeC1Yv6L",
"5JguJAMAGq3oY5TYq3cMqhcJQBXZfkUdfkWVxG5F3z5guLw1MDv"
]
]
但是这三个 key pair 的用处都不同,需要自己区分好,比如拿出笔记本记上:
eosio Public Key: "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV"
eosio Private Key: "5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"
MyAccount owner Public Key: "EOS5KSUCYnHgpxZwSnFNBkJ1LCdqU1iFwazQbEgQAbysV2FLFSBDB"
MyAccount owner Private Key: "5KRg9KJQhRzqBVppMuzWJooMTQP99Z8BpEwhpB4J3mXrivMd2HD"
MyAccount active Public Key: "EOS6twXkcVomuTH2rih8SgeSPATVLnKts1HR3Q76bvy7aoeC1Yv6L"
MyAccount active Private Key: "5JguJAMAGq3oY5TYq3cMqhcJQBXZfkUdfkWVxG5F3z5guLw1MDv"
5. 多钱包工作
keosd
能够让你操作多个钱包,在上述的例子中都省略了钱包的名字,你可以通过 -n
指定:
root@0ad6e73c14f2:~# cleos --wallet-url http://wallet:5555 wallet create -n MyTestWallet
Creating wallet: MyTestWallet
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"PW5JjXK7zpGBwBpspZ3gQDtvZwmPyDKADB5ja2bGFLfC3PqnsSVSb"
root@0ad6e73c14f2:~# cleos --wallet-url http://wallet:5555 wallet list
Wallets:
[
"MyTestWallet *",
"default *"
]
如果想要删除这个钱包直接在 wallet 的容器中直接 rm ~/eosio-wallet/MyTestWallet.wallet
并重启钱包程序即可。