3.9.1. 用户和权限
3.9.1.1.账户
帐户是存储在区块链中的可读标识符。它可能属于一个个人或者组织,这取决于账户的权限配置,需要账户才能将交易或将交易以其他方式推送到区块链。
3.9.1.2.授权和权限
每个账户有两个默认的权限名称:
- owner 象征着一个账户的所有权。 只有少数交易需要这种权力,但最值得注意的是对owner权力作出任何改变的行为。 一般而言,建议所有者保持冷藏并且不与任何人共享。owner可用于恢复可能已被泄露的另一个权限。
- active 用于转移资金,为生产者投票并进行其他高级账户更改。
3.9.1.3.单个签名
这是帐户在创建后的配置,它的owner和active权限只有一个key,两个key的权重都是1并且两个权限的阀值都是1。对于账户的默认权限配置只需要单个签名来授权操作。
权限 | 账户/key | 权重 | 阀值 |
---|---|---|---|
owner | 1 | ||
EOS5EzTZZQQxdrDaJAPD9pDzGJZ5bj34HaAb8yuvjFHGWzqV25Dch | 1 | ||
active | 1 | ||
EOSh61chK8GbH4ukWcbom8HgK95AeUfP8MBPn7XRq8FeMBYYTgwmcX | 1 |
3.9.1.4.多签名账户和自定义权限
以下示例是名为@multisig的虚构帐户的权限。 在这种情况下,两个用户被授权为虚构的@multisig帐户的owner和active,三个用户被授予权重不同的自定义publish权限。
权限 | 账户/key | 权重 | 阀值 |
---|---|---|---|
owner | 2 | ||
@bob | 1 | ||
@stacy | 1 | ||
active | 1 | ||
@bob | 1 | ||
@stacy | 1 | ||
publish | 2 | ||
@bob | 2 | ||
@stacy | 2 | ||
EOS7Hnv4iBWo1pcEpP8JyFYCJLRUzYcXSqt.. | 1 |
owner需要权重阈值2来更改所有者权限级别,这意味着由于所有方都具有权重1,因此所有用户都必须签署交易才能获得完全授权。要发送交易需要active权限,阈值设置为1.这意味着只需要1个签名即可授权来自帐户active权限的操作。还有一个名为publish的自定义命名权限。 发布权限的阈值为2,@bob和@stacy的权重均为2,公钥的权重为1.这意味着@bob和@stacy可以在没有额外签名的情况下发布,而公钥需要额外签名才能在公共许可下进行授权操作。
3.9.1.5.权限多级管理
权限和action的绑定关系,极大的增加了eos网络权限的灵活性,通过单个权限的绑定,我们可以将一个账户的权限分层管理,甚至一个公司的所有人都可以使用一个EOS账户来进行权限分离。
- owner:公司的所有者,或者股东,根据权限分配给每个股东相应的权限。
- active:管理阶层,可添加部门如active,转账,等除拥有者以外的所有操作。
- hello:财务部门,具有转账权限。
- oo:部门小组,可以有相应的转账权限。
- o:员工,特定权限。
3.9.1.6.应用实例
给账户s1增加权限transfer,使s1的transfer权限只有转账权限
(1)设置transfer权限
./cleos set account permission s1 transfer '{"threshold": 1, "keys":[{"key":"EOS6u2pwUiUiyhLCe7kSNeBeCqQZZsbDT7w1MfTBkty6FVU8fbSFU","weight":1}],"accounts":[],"waits":[]}' active
(2)查看用户权限发现已经新增transfer
(3)给s1的transfer权限绑定转账权限
./cleos set action permission s1 eosio.token transfer transfer
(4)用transfer权限进行转账,发现转账成功
./cleos push action eosio.token transfer '["s1","s2","10.0000 HHH","transfer"]' -p s1@transfer
(5)删除特殊权限
./cleos set action permission s1 eosio.token transfer null
(6)执行转账则操作失败
3.9.2.msig多重用户认证
3.9.2.1.概述
msig多用户认证是一种仲裁机制,当用户没有执行某个具体操作的权限时,用户可以提出提议向仲裁机构申请该权限,当仲裁机构成员审批通过后,该用户就有执行该操作权限。
3.9.2.2.应用实例
s1要申请a1的权限,从a1向s2转账,需要提交申请,当审批通过后,就可执行转账操作
(1)创建账户
./cleos create account eosio eosio.msig EOS7Lt29QXj4cgYNjffi2kJy3pg38Lc1rmUbqCLo1efznLKhdohjJ
./cleos create account eosio eosio.token EOS7Lt29QXj4cgYNjffi2kJy3pg38Lc1rmUbqCLo1efznLKhdohjJ
./cleos create account eosio a1 EOS7Lt29QXj4cgYNjffi2kJy3pg38Lc1rmUbqCLo1efznLKhdohjJ
./cleos create account eosio s1 EOS7Lt29QXj4cgYNjffi2kJy3pg38Lc1rmUbqCLo1efznLKhdohjJ
./cleos create account eosio s2 EOS7Lt29QXj4cgYNjffi2kJy3pg38Lc1rmUbqCLo1efznLKhdohjJ
(2)加载相关合约发行系统token
./cleos set contract eosio.token ~/eos/build/contracts/eosio.token/
./cleos set contract eosio.msig ~/eos/build/contracts/eosio.msig/
./cleos push action eosio.token create '["eosio", "1000000000.0000 HHH"]' -p eosio.token
./cleos push action eosio.token issue '["eosio", "1000000000.0000 HHH", "memo"]' -p eosio
./cleos push action eosio.token transfer '[ "eosio", "a1", "10000.0000 HHH", "m" ]' -p eosio
./cleos set contract eosio ~/eos/build/contracts/eosio.system/
./cleos push action eosio setpriv '["eosio.msig", 1]' -p eosio@active
(3)提案获取a1的权限,需要s1,a1,s2进行审批
./cleos multisig propose payme '[{"actor": "s1", "permission": "active"},{"actor": "a1", "permission": "active"},{"actor": "s2", "permission": "active"}]' '[{"actor": "a1", "permission": "active"}]' eosio.token transfer '{"from":"a1", "to":"s2", "quantity":"20.0000 HHH", "memo":"Pay"}' -p s1@active
(4)查看提案交易
./cleos multisig review s1 payme
(5)查看提案审批情况,provided_approvals为空表示尚未审批,request_approvals表示需要哪些权限进行审批
./cleos get table eosio.msig s1 approvals
(6)审批权限
./cleos multisig approve s1 payme '{"actor": "s1", "permission": "active"}' -p s1@active
./cleos multisig approve s1 payme '{"actor": "a1", "permission": "active"}' -p a1@active
./cleos multisig approve s1 payme '{"actor": "s2", "permission": "active"}' -p s2@active
(7)再次查看提案审批情况,权限已经审批
./cleos get table eosio.msig s1 approvals
(8)执行转账
./cleos multisig exec s1 payme -p s1
(9)查询执行结果,发现已经转账成功
./cleos get table eosio.token s2 accounts
链接
转载于:https://blog.51cto.com/14267585/2399417