创建好钱包和密钥后,我们就需要创建账户。为什么创建账户,为了方便人与区块链交互。以太坊40位地址,让我们非常难以记忆。EOS有账户概念,我们就可以定义账户权限。
在区块链上执行操作,需要使用到账号。我们使用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 --max-transaction-time=1000 --plugin eosio::wallet_api_plugin --plugineosio::chain_api_plugin --plugin eosio::account_history_api_plugin --plugin eosio::producer_plugin --plugin eosio::net_plugin
现在我们可以使用"cleos create account"创建一个账号了。
$ cleos create account eosio ${new_account} ${owner_key} ${active_key}
#或者
$ cleos create account ${authorizing_account} ${new_account} ${owner_key} ${active_key}
在这里,“eosio”是一个可授权账号。当在区块链上进行操作时必须使用eosio账号进行签名。eosio账号同时还是特殊的账号用来启动EOSIO节点,它的密码对信息信息可以在nodeos的配置文件中找到(默认在 “~/.local/shared/eosio/config/config.ini”).
至于这两个认证,我后面会给详细介绍,这是两个主要的权限。我创建一个账号,如果这个账号要有Owner的权限和Active的权限,就必须要用这两个key才能实现。
我们需要为新账号定一个名称。账号名称必须遵循以下两个准则:
必须短于13个字符
仅能包含以下字符:.12345abcdefghijklmnopqrstuvwxyz
我们采用“myaccount”作为新账号名称
介绍Owner key和Active key的概念。
Owner key的概念就是你账号的所有控制权限,你只要有了Owner key,你可以对这个账号的任何东西做任何的事儿,这是它的所有控制权。
而Active key只掌握了你的账号资金的访问权限,也就是你如果有了Active这个权限的话,你可以对这个账号的资金进行转移,但是你不能转移这个账号的所有权,或者不能做超过这个Active权限其它的权利。
简单的理解,Owner key就是对这个账号的最高权限,Active只是用来转移资金而已。这也是与以太坊智能合约开发的一个区别,以太坊账号的权限其实没有这么细分,它就只有一个账号,我只要有这个账号的公钥和私钥,我就可以做任何事情。
注意:导入初始账户eosio的主秘钥到钱包非常关键
# 值为[公钥,私钥WIF编码的]
signature-provider = EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV=KEY:5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
我们从创建钱包,创建私钥,创建账号做一个流程,命令如下:
#创建两个私钥
cuijb@cuijb-VirtualBox:~$ cleos create key --to-console
Private key: 5KVHPyt2k95JAc7hJuVVHu1BoWaKYUgzSaNpcFEjGK7eXsh1wfY
Public key: EOS8KwXkVMxwbWeKs4KyUaTW1oMxZeuawGLa2uH8PSRLRV8BhVYhG
cuijb@cuijb-VirtualBox:~$ cleos create key --to-console
Private key: 5KiLgUMzRSwkfh6qm8kDUDY9dCxBs6LDh7ayu92VVaE1gryeYsN
Public key: EOS6yEfHLXgWkR24CxL1SH9EsDVa83jdtmXQvz9Ahy3gJJuqFGSEH
#创建钱包
cuijb@cuijb-VirtualBox:~$ cleos wallet create -n gxk --to-console
Creating wallet: gxk
Save password to use in the future to unlock this wallet.
Without password imported keys will not be retrievable.
"PW5KdyyBpCX7qShsniZnUT1CRd1anJqvQooDVBYHNUSuPYqc8vTt8"
#将私钥导入钱包
cuijb@cuijb-VirtualBox:~$ cleos wallet import --private-key 5KVHPyt2k95JAc7hJuVVHu1BoWaKYUgzSaNpcFEjGK7eXsh1wfY -n gxk
imported private key for: EOS8KwXkVMxwbWeKs4KyUaTW1oMxZeuawGLa2uH8PSRLRV8BhVYhG
cuijb@cuijb-VirtualBox:~$ cleos wallet import --private-key 5KiLgUMzRSwkfh6qm8kDUDY9dCxBs6LDh7ayu92VVaE1gryeYsN -n gxk
imported private key for: EOS6yEfHLXgWkR24CxL1SH9EsDVa83jdtmXQvz9Ahy3gJJuqFGSEH
#注意!默认账号eosio需要导入私钥,必须执行以下代码。
#必须导入5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
#所有新的blockchains,都是通过主秘钥启动,唯一初始账户:eosio。要与区块链交互,需要将这个初始账户的私钥导入到你的钱包。
#private-key可以再~/.local/share/eosio/nodeos/config文件夹下的config.ini找到。
cuijb@cuijb-VirtualBox:~$ cleos wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3 -n gxk
imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
#开始创建 账户 myaccount
cuijb@cuijb-VirtualBox:~$ cleos -u http://192.168.0.107:8888 create account eosio myaccount --to-console
EOS8KwXkVMxwbWeKs4KyUaTW1oMxZeuawGLa2uH8PSRLRV8BhVYhG EOS6yEfHLXgWkR24CxL1SH9EsDVa83jdtmXQvz9Ahy3gJJuqFGSEH
executed transaction: 6445ba5bf96e7534c8f6ed7255e08a3e7d2d0e822d32b4070d26d325c4abf073 200 bytes 20758 us
# eosio <= eosio::newaccount {"creator":"eosio","name":"myaccount","owner":{"threshold":1,"keys":[{"key":"EOS8KwXkVMxwbWeKs4KyUaT...
warning: transaction executed locally, but may not be confirmed by the network yet
#开始创建 账户 myaccount1
cuijb@cuijb-VirtualBox:~$ cleos -u http://192.168.0.107:8888 create account eosio myaccount1 --to-console
EOS8KwXkVMxwbWeKs4KyUaTW1oMxZeuawGLa2uH8PSRLRV8BhVYhG EOS6yEfHLXgWkR24CxL1SH9EsDVa83jdtmXQvz9Ahy3gJJuqFGSEH
executed transaction: 721fb19a01ff14b2baa193d5d364c2defc68aedcc063f05ff9942d0e2b190fb1 200 bytes 180 us
# eosio <= eosio::newaccount {"creator":"eosio","name":"myaccount1","owner":{"threshold":1,"keys":[{"key":"EOS8KwXkVMxwbWeKs4KyUa...
warning: transaction executed locally, but may not be confirmed by the network yet
#查询我建立的所有用户
cuijb@cuijb-VirtualBox:~$ cleos -u http://192.168.0.107:8888 get accounts EOS8KwXkVMxwbWeKs4KyUaTW1oMxZeuawGLa2uH8PSRLRV8BhVYhG --to-console
{
"account_names": [
"myaccount",
"myaccount1"
]
}
注意,创建账户命令的格式是:cleos create account [OPTIONS] creator name OwnerKey
ActiveKey
账号相关操作
使用cleos还可以针对账号进行以下操作。
cleos命令 描述
create account 在区块链上创建新账号
get account 从区块链上获取一个账号
get code 查找一个账号的代码和ABI
get accounts 查询与一个公钥关联的账号信息
get servants 查找一个给定账号之下的服务账号
get transactions 查询与一个账号关联的所有的交易
set contract 使用一个账号创建或修改合约
set account 设置或修改区块链上账号的状态
transfer 将数字币从一个账号转账到另一个账号
EOS的权限和许可
对于EOS的权限和许可,分得非常细。
【Permission】叫做「许可」,它是一个操作允许的权限,可以建立很多permission。比如允许你转账,允许你发微博或者允许你做其他事。它是通过permission来控制你的操作,可能不同的用户有不同的permission。
Threshold是某个许可需要的阈值。比如你要做一件事儿,它可能有个阈值,这个阈值是一个量化,你必须要达到这个阈值才可以进行相应的操作。
Weight表示权重。账号必须对应某个许可拥有的权重,就是你的权重要大于你的阈值,然后这件事儿你就可以做。
在permission许可里面有两种许可:
-owner许可;
-active许可。
这两个叫native(原生)的permission,另外还有public的permission。
下面通过两个例子来解释他们之间的关系与区别:
第一个例子, owner许可的阈值是1,它里面有一个账号,这个账号是用它的公钥来代表的,然后这个账号的权重是1,这样你的权重是大于等于阈值的,所以可以用owner的账号和权限。
active许可里面有一个账号,它的权重也是等于这个阈值,所以可以用active的账号和权限。
这两个账号,一个是有owner权限,一个是有active权限,因为它们的权重和阈值是大于等于这个值的,对应的账号与权限都是可以使用的。
第二个例子,除了owner的permission之外,你还可以有一个publish permission。它们之间有什么区别呢?
当你创建任何一个账号,这个账号都有owner的许可和active的许可。其他的许可就是你可以自己定义,来让不同的用户,拥有不同的许可组合,这样就可以很灵活的去管理不同的账号。
所以这一点,EOS考虑的比较细致一点,但是以太坊或者比特币没有做到这么细致,以太坊或者比特币拥有一个账号就可以做任何事情。
这里面再细一点来讲,这里面的owner的阈值是2,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的权限可能是比如发布一些消息、发布一些微博的操作。
通过以上两个例子,给大家展示了EOS对权限设置的设计有多细致。
2018年7月10日整理于深圳