比特币和以太坊只有私钥和地址的概念,而EOS账户可以是用户自定义的字符串[12个],但是EOS的账户需要付费才能创建,不像比特币、ETH,
EOS账户的功能:
1.每个账户可以发送结构化的消息给任意其他账户
2.每个账户可以定义处理消息的脚本
3.消息处理脚本也可以给其他账户发消息
4.每个账户有自己的私有数据库
5.最终消息和消息处理脚本就是EOS的智能合约
有了账户就可以通过角色、权限控制来管理,也可以通过合理的权限控制来管理账户.
EOS为权限级别进行了命名比如说Owner、Active、Friend。这些命名可以是系统默认的比如Owner和Active,有些是可以自定义的比如Friend的。
可以将某个消息处理群组分配到某个权限级别上,或者反过来说,可以在某个权限级别上定义很多消息处理群组。
举个例子:一个帐户所有者可以将自己社交媒体应用与自己的“朋友”权限群组建立映射。 有了这个映射,任何朋友可以以这一帐户的身份在这一帐户的社交媒体上发帖。 尽管他们将以帐户所有者的身份发帖,他们仍然使用自己的密钥来签名消息。
如何进行权限评估,简单的来讲就是从小到大进行逐级匹配,比如:当 @alice 以 "Action" 类型发送一条消息给 @bob 时,首先会检查 @alice 是否为 @bob.groupa.subgroup.Action 定义过权限映射。 如果什么都没有找到,紧接着检查 @bob.groupa.subgroup 映射,然后是 @bob.groupa,最后 @bob 将被检查。 如果都没有找到,那么假定映射为命名的权限群组 @alice.active。
一旦一个映射被识别,则使用相关联的签名验证权限。 如果失败了,则跃迁至父权限,直至拥有者权限@alice.owner
EOS的默认权限群组,默认的权限组上面我们也有讲到,是Owner和Active,Owner可以做任何事情,这个权限一般来说不用来做具体的工作,一般用来做冷备份,比如说Active权限丢了,就可以是用Owner权限来恢复。
Active权限可以做除了修改Owner以外的所有事情,一般业务都是有Active权限来完成。其他的所有权限组也都是从Active权限派生出来的。
EOS允许有时间延时的消息,在特别的时间范围内可以取消消息。这点是比特币和以太坊不能实现的,特别是在网络拥堵的情况下,若手续费比较低,往往一笔交易很长时间得不到确认,而用户完全没有办法取消交易。这种延时消息具体延时多长时间完全有消息的敏感程度决定,比如说买咖啡可能是几秒钟,买房可能是几天,转移整个账户可能是一个月,确切的时间取决于应用开发者和用户
EOS允许恢复被盗窃的密钥,这在比特币和以太坊上是不可能的,在比特币和以太坊上一旦密钥丢失那么整个账户也随之丢失,EOS提供了恢复密钥的机制。具体来说就是可以使用30天内的任意Owner权限的密钥,注意这个密钥可能已经被黑客换过了,但是在这个场景下这个密钥还是可以使用的;使用任意30天内的Owner密钥和指定的合作伙伴才能恢复密钥。这里面合作伙伴不能在没有Owner协助的基础上恢复密钥。合作伙伴也不会参与任何日常交易,这样可以大大降低法律上的风险。
钱包用来存储一组公钥-私钥的对。这些密钥对将参与区块链的上的操作签名。keosd管理着钱包和其中的内容。我们通过cleos来使用这些钱包。
一个账户可视为在线的访问凭证。nodeos管理着在区块链上发布账户以及与账户相关联的行为。我们通过cleos与nodeos的交互,来实现账户的管理。
钱包与账户之间没有天然的内在联系。账户并不知道钱包的存在,反之钱包也不知道账户的存在。所以,nodeos与keosd之间也没有内在的关联。他们(nodeos与keosd)基础函数是有着本质的不同。(在部署配置过程中可能会模糊化他们之间的区别,所以在这里特别提醒下)
在对一个交易进行签名时,nodeos与keosd之间会发生交互。钱包通过将锁定的键值本地化存储的方式,实现以安全的方式活动签名。cleos作为一个中介,实现keosd(从本地获取)键值到nodeos使用这些键进行账户(以及其他)区块链签名相关的操作。
创建和管理钱包
使用cleos的"wallet create"命令:
$ cleos wallet create
此时keosd中创建了称之为“default”(默认)的钱包,并提示密码(mater password)。该密码是用来解锁(解密)你的钱包文件,请务必妥善保管。
钱包文件被命名为"deafult.wallet"。默认情况下,keosd将此文件保存在"~/eosio-wallet"目录下。这个目录可以通过在keosd命令行中添加"--data-dir"参数来指定。
管理多个钱包和钱包名称
cleos可以用来管理多个钱包。每个不同的钱包都通过不同的钱包密码进行保护。下面的例子将展示如何通过"-n"(定义钱包明确)传参创建另一个钱包。
-
$ cleos wallet create -n periwinkle
使用wallet list命令可以获取本地所有钱包列表
-
$ 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}
-
authorizing_account: 授权的账号名称,用来支付账号创建以及后续其他新账号的费用。
-
new_account:希望创建的新账号
-
owner_key:拥有拥有者权限的账号的公钥
-
active_key:希望分配给活跃权限公钥
在这里,“eosio”是一个可授权账号。当在区块链上进行操作时必须使用eosio账号进行签名。eosio账号同时还是特殊的账号用来启动EOSIO节点,它的密码对信息信息可以在nodeos的配置文件中找到(默认在 "~/.local/shared/eosio/config/config.ini").
我们需要为新账号定一个名称。账号名称必须遵循以下两个准则:
-
必须短于13个字符
-
仅能包含以下字符:.12345abcdefghijklmnopqrstuvwxyz
我们采用“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 | 将数字币从一个账号转账到另一个账号 |