EOS 开发:钱包

May 13, 2018

EOS 中有两种方式启动钱包:

  1. 一个用 nodeos server 启动的插件
  2. 一个独立的后台程序,能够运行在一个独立于 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 并重启钱包程序即可。

Reference


Profile picture

Written by Armin Li , a venture capitalist. [Weibo] [Subscribe]