EOS学习之路004--EOS的账户系统

比特币和以太坊只有私钥和地址的概念,而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"(定义钱包明确)传参创建另一个钱包。

 
  1. $ cleos wallet create -n periwinkle

使用wallet list命令可以获取本地所有钱包列表

 
  1. $ cleos wallet list

  2. Wallets:

  3. [

  4. "default *",

  5. "periwinkle *"

  6. ]

注意,当我们钱包被解锁时,钱包名称后面都会标记有"*"符号。我们使用"wallet create"生成钱包时,处于方便会默认解锁我们的钱包。如果对第二个钱包进行加锁,可以执行"wallet lock"命令:

 
  1. $ cleos wallet lock -n periwinkle

  2. Locked: 'periwinkle'

再次执行"wallet list"命令,我们可以看到第二个钱包的"*"符号消失了,这说明该钱包已经加锁

 
  1. $ cleos wallet list

  2. Wallets:

  3. [

  4. "default *",

  5. "periwinkle"

  6. ]

解锁一个命名钱包需调用"wallet unlock -n",后面跟着钱包名称。在执行过程中需输入钱包的私钥。我们也可以通过在命令行中增加"--password"以及主密码的传参,来直接完成私钥验证过程,但这样会导致在console中将密钥完整的显示出来。

注:如果我们针对"default"钱包进行加解锁的操作,则默认的无需使用"-n"传参指定钱包名称。

当我们重启keosd,然后再次通过cleos查看钱包信息:

 
  1. $ cleos wallet list

  2. "/usr/local/bin/keosd" launched

  3. Wallets:

  4. []

注:如果keosd未启动,在使用cleos第一次与keosd交互时(比如,查询钱包信息),就好自动启动keosd进程。

可以发现此时钱包信息为空。这是因为钱包在使用之前(包括展示钱包列表)必须首先先打开钱包。当keosd关闭时,钱包会被锁定;当keosd被重启后,钱包并未自动开启。执行“wallet open”来开启钱包。

 
  1. $ cleos wallet open

  2. $ cleos wallet list

  3. Wallets:

  4. [

  5. "default"

  6. ]

如果需要打开其他非默认钱包,则需要添加"-n"来指定钱包名称进行开启钱包的操作。

生成和导出EOSIO密码

有多种方式可以创建EOSIO的密码对,但这里仅仅侧重介绍"create key"命令。创建两组公钥/私钥对,留意一下密码对的通常的格式如下:

 
  1. $cleos create key

  2. Private key: 5K6tXmW7FQEBWqwG9fsAAjSMLgBMMDPjqE1ATFk2HGaHWjAjsgE

  3. Public key: EOS7jZNeuZmqt4fAt4NLoZtLXTXDYEB3eo1QZgg7K19DKbyJaSPMr

  4. $cleos create key

  5. Private key: 5KYNz1WRZRt9882n1ebA2q5NYQ3oYvzxxAT48i2tyReYHnR49yu

  6. Public key: EOS73bzXNHx481Kcg64g4YKS7FxSDYJVYZNiPVZutc3CbXQxW2czc

这些密码对是随意的密码对,并无任何的授权。

接下来的操作,需要确认默认(default)钱包必须是开启和解锁状态的。

cleos指令是可以串联使用,实现default钱包的开启与解锁。甚至只需执行"cleos unlock"即可一步到位实现keosd的开启、钱包开启以及解锁操作。比如执行:

 
  1. $cleos wallet open unlock

  2. Opened: default

  3. password: Unlocked: default

我们现在使用"wallet import"将私钥导入钱包中

 
  1. $ cleos wallet import 5K6tXmW7FQEBWqwG9fsAAjSMLgBMMDPjqE1ATFk2HGaHWjAjsgE

  2. imported private key for: EOS7jZNeuZmqt4fAt4NLoZtLXTXDYEB3eo1QZgg7K19DKbyJaSPMr

  3. $ cleos wallet import 5KYNz1WRZRt9882n1ebA2q5NYQ3oYvzxxAT48i2tyReYHnR49yu

  4. imported private key for: EOS73bzXNHx481Kcg64g4YKS7FxSDYJVYZNiPVZutc3CbXQxW2czc

导入成功的情况下,cleos会提示正确的公钥信息。

我们可以通过输入“wallet keys”指令,查阅上述信息。

 
  1. $ cleos wallet keys

  2. [[

  3. "EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV",

  4. "5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3"

  5. ],[

  6. "EOS7jZNeuZmqt4fAt4NLoZtLXTXDYEB3eo1QZgg7K19DKbyJaSPMr",

  7. "5K6tXmW7FQEBWqwG9fsAAjSMLgBMMDPjqE1ATFk2HGaHWjAjsgE"

  8. ]

  9. ]

钱包文件本身是加密的,当钱包加锁时上述密码对信息会得到相应的保护。访问这些密码对信息,需要借助钱包的密码。

备份钱包

为防止钱包文件的损坏,一个良好的习惯是将钱包备份到一个U盘或其他媒介中去。钱包文件采用高度加密的机制,以确保其中的密码对难以访问。

你可以在"data-dir"目录中找到这些钱包文件。如果你在启动eos过程中未指定"--data-dir"参数,你的钱包文件默认保存在"~/eosio-wallet"目录下。

 
  1. $ cd eosio-wallet/

  2. $ ll

  3. 总用量 12

  4. -rw-r--r--. 1 root root 1533 5月  28 12:02 config.ini

  5. -rw-------. 1 root root  439 5月  28 17:24 default.wallet

  6. -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。

 
  1. $ cd ~/eosio-wallet

  2. $ vim config.ini

  3. # 修改端口为8899,保存并退出vim

  4. $ pkill keosd

  5. $ keosd

2. 使用keosd命令行参数

 
  1. $ pkill keosd

  2. $ keosd --http-server-address=localhost:8899

或者通过cleos携带"--wallet-port=8899"执行钱包操作

$ cleos --wallet-port=8899 wallet unlock

要启动nodeos,打开一个终端窗口,找到nodeos可执行文件所在的目录,执行:

 
  1. $ cd eos/build/programs/nodeos

  2. $ 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}

如果创建成功了,我们将看到反馈以下信息。

 
  1. executed transaction: 7f1c6b87cd6573365a7bb3c6aa12f8162c3373d57d148f63f2a2d3373ad2fd54  352 bytes  102400 cycles

  2. #         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将数字币从一个账号转账到另一个账号

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值