EOSIO账户与钱包概述
下图给出了EOSIO中的账户(accounts)和钱包(wallets)的概念。
钱包用来存储一组公钥-私钥的对。这些密钥对将参与区块链的上的操作签名。keosd管理着钱包和其中的内容。我们通过cleos来使用这些钱包。
一个账户可视为在线的访问凭证。nodeos管理着在区块链上发布账户以及与账户相关联的行为。我们通过cleos与nodeos的交互,来实现账户的管理。
钱包与账户之间没有天然的内在联系。账户并不知道钱包的存在,反之钱包也不知道账户的存在。所以,nodeos与keosd之间也没有内在的关联。他们(nodeos与keosd)基础函数是有着本质的不同。(在部署配置过程中可能会模糊化他们之间的区别,所以在这里特别提醒下)
在对一个交易进行签名时,nodeos与keosd之间会发生交互。钱包通过将锁定的键值本地化存储的方式,实现以安全的方式活动签名。cleos作为一个中介,实现keosd(从本地获取)键值到nodeos使用这些键进行账户(以及其他)区块链签名相关的操作。
创建和管理钱包
打开终端并进入EOSIO的安装目录,我们使用cleos命令即可方便的与keosd和nodeos进行交互。
$ cd /path_to_eos/build/programs/cleos
我们要做的第一件事就是创建钱包。使用cleos的"wallet create"命令:
$ cleos wallet create
Creating wallet: default
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"A MASTER PASSWORD"
此时keosd中创建了称之为“default”(默认)的钱包,并提示要求输入密码(mater password)。该密码是用来解锁(解密)你的钱包文件,请务必妥善保管。
钱包文件被命名为"deafult.wallet"。默认情况下,keosd将此文件保存在"~/eosio-wallet"目录下。这个目录可以通过在keosd命令行中添加"--data-dir"参数来指定。
管理多个钱包和钱包名称
cleos可以用来管理多个钱包。每个不同的钱包都通过不同的钱包密码进行保护。下面的例子将展示如何通过"-n"(定义钱包明确)传参创建另一个钱包。
$ cleos wallet create -n periwinkle
Creating wallet: periwinkle
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"A MASTER PASSWORD"
现在可以确认下我们使用特定的名字生成的钱包。
$ cleos wallet list
Wallets:
[
"default *",
"periwinkle *"
]
注意,当我们钱包被解锁时,钱包名称后面都会标记有"*"符号。我们使用"wallet create"生成钱包时,处于方便会默认解锁我们的钱包。如果对第二个钱包进行加锁,可以执行"wallet lock"命令:
$ cleos wallet lock -n periwinkle
Locked: 'periwinkle'
再次执行"wallet list"命令,我们可以看到第二个钱包的"*"符号消失了,这说明该钱包已经加锁
$ cleos wallet list
Wallets:
[
"default *",
"periwinkle"
]
解锁一个命名钱包需调用"wallet unlock -n",后面跟着钱包名称。在执行过程中需输入钱包的私钥。我们也可以通过在命令行中增加"--password"以及主密码的传参,来直接完成私钥验证过程,但这样会导致在console中将密钥完整的显示出来。
注:如果我们针对"default"钱包进行加解锁的操作,则默认的无需使用"-n"传参指定钱包名称。
当我们重启keosd,然后再次通过cleos查看钱包信息:
$ cleos wallet list
"/usr/local/bin/keosd" launched
Wallets:
[]
注:如果keosd未启动,在使用cleos第一次与keosd交互时(比如,查询钱包信息),就好自动启动keosd进程。
可以发现此时钱包信息为空。这是因为钱包在使用之前(包括展示钱包列表)必须首先先打开钱包。当keosd关闭时,钱包会被锁定;当keosd被重启后,钱包并未自动开启。执行“wallet open”来开启钱包。
$ cleos wallet open
$ cleos wallet list
Wallets:
[
"default"
]
如果需要打开其他非默认钱包,则需要添加"-n"来指定钱包名称进行开启钱包的操作。
生成和导出EOSIO密码
有多种方式可以创建EOSIO的密码对,但这里仅仅侧重介绍"create key"命令。创建两组公钥/私钥对,留意一下密码对的通常的格式如下:
$cleos create key
Private key: 5K6tXmW7FQEBWqwG9fsAAjSMLgBMMDPjqE1ATFk2HGaHWjAjsgE
Public key: EOS7jZNeuZmqt4fAt4NLoZtLXTXDYEB3eo1QZgg7K19DKbyJaSPMr
$cleos create key
Private key: 5KYNz1WRZRt9882n1ebA2q5NYQ3oYvzxxAT48i2tyReYHnR49yu
Public key: EOS73bzXNHx481Kcg64g4YKS7FxSDYJVYZNiPVZutc3CbXQxW2czc
这些密码对是随意的密码对,并无任何的授权。
接下来的操作,需要确认默认(default)钱包必须是开启和解锁状态的。
cleos指令是可以串联使用,实现default钱包的开启与解锁。甚至只需执行"cleos unlock"即可一步到位实现keosd的开启、钱包开启以及解锁操作。比如执行:
$cleos wallet open unlock
Opened: default
password: Unlocked: default
我们现在使用"wallet import"将私钥导入钱包中。
$ cleos wallet import 5K6tXmW7FQEBWqwG9fsAAjSMLgBMMDPjqE1ATFk2HGaHWjAjsgE
imported private key for: EOS7jZNeuZmqt4fAt4NLoZtLXTXDYEB3eo1QZgg7K19DKbyJaSPMr
$ cleos wallet import 5KYNz1WRZRt9882n1ebA2q5NYQ3oYvzxxAT48i2tyReYHnR49yu
imported private key for: EOS73bzXNHx481Kcg64g4YKS7FxSDYJVYZNiPVZutc3CbXQxW2czc
导入成功的情况下,cleos会提示正确的公钥信息。
我们可以通过输入“wallet keys”指令,查阅上述信息。
$ cleos wallet keys
[[
"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",
"5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"
],[
"EOS7jZNeuZmqt4fAt4NLoZtLXTXDYEB3eo1QZgg7K19DKbyJaSPMr",
"5K6tXmW7FQEBWqwG9fsAAjSMLgBMMDPjqE1ATFk2HGaHWjAjsgE"
]
]
钱包文件本身是加密的,当钱包加锁时上述密码对信息会得到相应的保护。访问这些密码对信息,需要借助钱包的密码。
备份钱包
为防止钱包文件的损坏,一个良好的习惯是将钱包备份到一个U盘或其他媒介中去。钱包文件采用高度加密的机制,以确保其中的密码对难以访问。
你可以在"data-dir"目录中找到这些钱包文件。如果你在启动eos过程中未指定"--data-dir"参数,你的钱包文件默认保存在"~/eosio-wallet"目录下。
$ cd eosio-wallet/
$ ll
总用量 12
-rw-r--r--. 1 root root 1533 5月 28 12:02 config.ini
-rw-------. 1 root root 439 5月 28 17:24 default.wallet
-rw-------. 1 root root 311 5月 28 16:19 periwinkle.wallet
可以将上述*.wallet文件拷贝出来,保存在安全的媒介中。
创建一个账号
在区块链上执行操作,需要使用到账号。我们使用cleos向nodeos发起请求来创建账号并且将账号发布到区块链中。在执行创建账号操作之前,我们必须确保nodeos处于运行状态。在后面的例子中,我们需要在一台机器上同时运行keosd和nodeos两个进程,而上述两个进程默认配置的端口都是8888,因此需要进行简单修改确保keosd和nodeos运行在不同端口上。
通常有两种方式可以将keosd的端口改为8899:
1. 进入钱包文件所在的目录,并将config.ini文件中的端口改为8899,保存配置文件并重启keosd。
$ cd ~/eosio-wallet
$ vim config.ini
# 修改端口为8899,保存并退出vim
$ pkill keosd
$ keosd
2. 使用keosd命令行参数
$ pkill keosd
$ keosd --http-server-address=localhost:8899
或者通过cleos携带"--wallet-port=8899"执行钱包操作
$ cleos --wallet-port=8899 wallet unlock
要启动nodeos,打开一个终端窗口,找到nodeos可执行文件所在的目录,执行:
$ cd eos/build/programs/nodeos
$ nodeos -e -p eosio --plugin eosio::chain_api_plugin --plugin eosio::history_api_plugin
现在我们可以使用"cleos create account"创建一个账号了。
$ cleos create account ${authorizing_account} ${new_account} ${owner_key} ${active_key}
在这里,“eosio”是一个可授权账号。当在区块链上进行操作时必须使用eosio账号进行签名。eosio账号同时还是特殊的账号用来启动EOSIO节点,它的密码对信息信息可以在nodeos的配置文件中找到(默认在 "~/.local/shared/eosio/config/config.ini").
我们需要为新账号定一个名称。账号名称必须遵循以下两个准则:
我们采用“myaccount”作为新账号名称。
我们使用上面导入到钱包中的公钥(以"EOS"开头的字符串),这些公钥在未授权之前是随意的账号。这些账号一旦授权,这些账号就会变得异常重要。拥有者的密钥(owner key)拥有账号最高权限,而活跃权限账号(active key)将拥有使用账号资金的权利。
使用"cleos create account"来创建我们的账号。
$ cleos --wallet-port=8899 create account eosio myaccount ${public_key_1} ${public_key_2}
如果创建成功了,我们将看到反馈以下信息。
executed transaction: 7f1c6b87cd6573365a7bb3c6aa12f8162c3373d57d148f63f2a2d3373ad2fd54 352 bytes 102400 cycles
# eosio <= eosio::newaccount {"creator":"eosio","name":"myaccount","owner":{"threshold":1,"keys":[{"key":"EOS5kkAs8HZ88m2N7iZWy4J...
账号相关操作
使用cleos还可以针对账号进行以下操作。
cleos命令 | 描述 |
---|---|
create account | 在区块链上创建新账号 |
get account | 从区块链上获取一个账号 |
get code | 查找一个账号的代码和ABI |
get accounts | 查询与一个公钥关联的账号信息 |
get servants | 查找一个给定账号之下的服务账号 |
get transactions | 查询与一个账号关联的所有的交易 |
set contract | 使用一个账号创建或修改合约 |
set account | 设置或修改区块链上账号的状态 |
transfer | 将数字币从一个账号转账到另一个账号 |