Zihao

Make small but daily progress

0%

EOS合约基础教程-创建钱包私钥及账户

可以将钱包想象为支付宝。

一.钱包

1. 创建钱包

使用 EOS 的第一步就是创建一个钱包,我们可以使用 cleos wallet create 命令来创建钱包。例如,下面的命令创建了一个 default 钱包

1
cleos wallet create --to-console

命令执行结果如下

1
2
3
4
Creating wallet: default
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"PW5JQG1aKezEipheSq4yC3MrC6H5S127tbNGZCzXmhbxVWgXgEutz"

上面的提示语句告诉我们,刚刚我们创建了一个钱包 default ,密码是

1
PW5JQG1aKezEipheSq4yC3MrC6H5S127tbNGZCzXmhbxVWgXgEutz

--to-console 的意思是把创建的钱包的所有信息输出到命令行(控制台),包括钱包的密码

如果是生产环境,我们建议你使用 --to-file 代替 --to-console,这样钱包的密码就不会保留在钱包的历史记录中。

注意:命令行的执行历史可以通过 history 命令查看

对于开发来说,--to-console 是比较简单快捷,而且方便接下来复制,因为下面的章节有很多地方需要用到这个密码。

关于钱包 ( wallet )

对于加密货币中的钱包,常见的误解就是钱包是用来存储令牌 ( token ) 的。

而实际上呢,钱包并不存储令牌。

钱包的作用是将私钥存储在加密文件中并 签署 交易。

用户通常通过接口构建事务 ( transaction ) 对象,将该对象发送到要签名的钱包,然后钱包返回具有签名的该事务对象,然后该签名被广播到网络。 如果网络确认交易有效,则将其包含在区块链的块中。

2. 打开钱包

默认情况下,启动 keosd 时钱包默认是关闭的。要打开钱包,可以使用下面的命令

1
cleos wallet open

运行结果如下

1
Opened: default

列出钱包

钱包打开之后,我们才能查看有哪些钱包。我们可以使用下面的命令查看当前打开的所有钱包

1
cleos wallet list

返回信息如下

1
2
3
4
Wallets:
[
"default"
]

解锁钱包

我们已经使用 cleos wallet open 命令打开了钱包,但钱包还是锁着的。如果要打开锁,那么就要使用刚刚创建钱包时提供的密码。

1
cleos wallet unlock

运行上面的命令,会被提示需要输入密码,输入刚刚创建钱包时的密码,比如我的是 PW5JQG1aKezEipheSq4yC3MrC6H5S127tbNGZCzXmhbxVWgXgEutz,完成后回车,显式结果如下

1
2
password: 
Unlocked: default

这时候,我们再使用 cleos wallet list 命令列出钱包,就会发现 default 后面有一个星号 ( * )

1
2
3
4
Wallets:
[
"default *"
]

星号 * 的意思是钱包的状态是已解锁的。

二.私钥和公钥

数字货币中的密钥分为公钥和私钥两部分。一个账号可以对应多个密钥,一个密钥也可以对应多个账号。

EOS cleos 提供了 cleos wallet create_key 命令用来创建密钥。

运行该命令,显式结果如下

1
Created new private key with a public key of: "EOS6osBZxznyq9oSvCPQEiV35SfCS25E3kEzwp9GwTU5rAdbJ3kUE"

如果命令的运行结果为

1
2
Error 3120003: Locked wallet
Ensure that your wallet is unlocked before using it!

则首先需要使用解锁的命令解锁钱包

1
cleos wallet unlock

系统会把私钥直接放入钱包,所以只显示了公钥。

导入开发密钥

每个新的 EOSIO 链都有一个名为 eosio 的默认 系统 用户。所有其它用户都从该用户派生,也就是该用户是所有其它用户的祖先用户。

eosio 系统用户的一个重要作用就是用于加载系统合约来设置链,这些合约规定了 EOSIO 链的治理和共识。

eosio 系统用户的另一个重要作用就是创建其它用户。

每个新的 EOSIO 链都带有一个开发密钥,而且不管是哪个新链,这个密钥都是相同的。

不过,在生产环境上,一旦设置 EOSIO 链完毕,eosio 用户就会被没收,也就是用户再也没法使用 eosio 用户了。

在开发环境上,我们可以通过给 eosio 用户导入这个开发密钥来签名事务( transactions )。

导入密钥到钱包的命令如下

1
cleos wallet import

然后复制粘贴下面的密钥,按下回车以完成导入

1
5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

千万要注意,不要在生产环境上使用该开发密钥。因为该密钥是公开的,人人都知道,可能会给你带来意想不到的损失

三.账户

EOS 中,帐户(账户)是存储在区块链上的授权集合,用于标识发送者 / 接受者。
对于EOS的权限和许可,分得非常细。一个授权,既可以由一个人拥有,也可以由一组个人拥有,具体取决于如何配置权限。

「Permission」我没有翻译成权限,我这里觉得它更像一种叫做「许可」,它是一个操作允许的权限,可以建立很多permission。比如允许你转账,允许你发微博或者允许你做其他事。它是通过permission来控制你的操作,可能不同的用户有不同的permission。

Threshold是某个许可需要的阈值。比如你要做一件事儿,它可能有个阈值,这个阈值是一个量化,你必须要达到这个阈值才可以进行相应的操作。

Weight表示权重。账号必须对应某个许可拥有的权重,就是你的权重要大于你的阈值,然后这件事儿你就可以做。

在permission许可里面有两种许可:

  • -owner许可;
  • -active许可。

这两个叫native(原生)的permission,另外还有public的permission。
下面通过两个例子来解释他们之间的关系与区别:

permission account weight threshold
owner 1
EOS5EzTZZQQxdrDaJAPD9pDzGJZ5bj34HaAb8yuvjFHGWzqV25Dch 1
active 1
EOS61chK8GbH4ukWcbom8HgK95AeUfP8MBPn7XRq8FeMBYYTgwmcX 1

第一个例子, owner许可的阈值是1,它里面有一个账号,这个账号是用它的公钥来代表的,然后这个账号的权重是1,这样你的权重是大于等于阈值的,所以可以用owner的账号和权限。

active许可里面有一个账号,它的权重也是等于这个阈值,所以可以用active的账号和权限。

这两个账号,一个是有owner权限,一个是有active权限,因为它们的权重和阈值是大于等于这个值的,对应的账号与权限都是可以使用的。

permission account weight threshold
owner 2
@bob 1
@stracy 1
active 2
@bob 1
@stracy 1
publish 2
@bob 2
@stracy 2

第二个例子,除了owner的permission之外,你还可以有一个publish permission。它们之间有什么区别呢?

当你创建任何一个账号,这个账号都有owner的许可和active的许可。其他的许可就是你可以自己定义,来让不同的用户,拥有不同的许可组合,这样就可以很灵活的去管理不同的账号。

所以这一点,EOS考虑的比较比较细致一点,但是以太坊或者比特币没有做到这么细致,以太坊或者比特币拥有一个账号就可以做任何事情。

这里面再细一点来讲,这里面的owner的阈值是R,bob账号的权重只有1,stracy账号的权重也只有1,如果它俩单独的去获得owner许可相关的操作,它们是获得不了的。但是,如果bob和stracy加起来大于等于2,就是这两个账号联合起来大于等于2的,这两个账号就可以做这个操作的,其实这有点像投票。

我觉得这个权限或许可的限制,和我们传统的操作系统是不太一样的。我们传统的操作系统好像没有这种联合签名可以达到两个权重来执行owner的相关操作。

active这也是一样的,如果bob账号是1,stracy账号是1,如果active需要的阈值是1的话, bob账号和stracy账号是单独都可以做active许可相关的操作,就是转移资金。

另外,publish就是一个定制化许可。我们每个用户也可以定义自己某些允许的一些操作。publish这里面的阈值是2,bob账号是2,stracy账号是2,这两个账号也可以单独做publish许可相关的操作。而publish的权限可能是比如发布一些消息、发布一些微博的操作。

列出当前钱包下的所有密钥对

我们可以使用 cleos wallet private_keys 列出当前钱包下的所有密钥对

1
2
3
4
5
6
7
8
9
10
$ cleos wallet private_keys

password: [[
"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
"5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"
],[
"EOS6osBZxznyq9oSvCPQEiV35SfCS25E3kEzwp9GwTU5rAdbJ3kUE",
"5JPW9xZHiQ1tGWbMn7mnaWndscJ6p2tsWjjLtLLguyoeeaqbDAj"
]
]

注意: 你的钱包下的密钥可能和我不一样,不过没关系

在我上面的钱包中,总共有三个密钥对,所有以 EOS 开头的都是公钥,而第二个则都是私钥。

注意,私钥很重要,千万不要轻易告诉别人

创建账户

在前面的章节中,我们已经创建了一个钱包和一个密钥对。接下来我们创建的账户会用到上一章节中创建的密钥对。

然后我们就可以使用 cleos wallet create account 来创建账号了,该命令语法如下

1
2
3
4
5
6
cleos create account [OPTIONS] creator name OwnerKey [ActiveKey]
──┬─── ──┬── ───┬─── ──┬──
│ │ │ └ active 权限公钥,可选
│ │ └─ owner 权限公钥
│ └ 要创建的账号,只能是 [0-5a-z.]{1,12}
└──创建者,必须是已经存在的账号

下面的命令使用 eosio 作为创建者,使用 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV 作为公钥,创建 a 账户

1
cleos create account eosio a EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV

该命令执行后,会输出创建账号的事务

1
2
3
executed transaction: ab4152fa1d85a1b01339f3e7b8bdc2b4a162b5ab28ee952880426020d8a4ff73  200 bytes  3954 us
# eosio <= eosio::newaccount {"creator":"eosio","name":"a","owner":{"threshold":1,"keys":[{"key":"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpsc...
warning: transaction executed locally, but may not be confirmed by the network yet ]

类似的,我们可以使用相同的密钥对创建多个其它账号

注意: 开发环境可以使用一个密钥对创建多个账号,这样更方便,但是,生产环境,请不要这么做

创建 b 账户

1
cleos create account eosio b EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV

创建 c 账户

1
cleos create account eosio c EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV

ower 权限和 active 权限的区别?

EOSIO 具有独特的授权结构,为我们的帐户增加了安全性。
一般的交易使用 active 权限即可,该权限可以执行大部分的操作,除了更改账户本身。
owner 权限,可以修改账户,添加或者删除权限,更改密钥等等操作。
在日常生产环境中,我们应该保持 ower 权限和 active 权限使用不同的密钥对。这样可以最小化账户的风险。
这样,一旦我们的 active 权限泄露,我们可以使用 ower 权限来重置它

故障排除

如果你在创建账号时触发了钱包已经锁定的错误。可以使用下面的命令来解锁

1
cleos wallet unlock --password PW5Jz2M3EoVA1uhnSHAGTN6WpvrE7Eef62LU85LsbFxeQDSfQhgRq

注意: PW5Jz2M3EoVA1uhnSHAGTN6WpvrE7Eef62LU85LsbFxeQDSfQhgRq 要替换成你自己的钱包密钥

欢迎关注我的其它发布渠道