EOS智能合约中的权限控制
一、EOS中的权限介绍
权限这个概念对于人们来说并不陌生,做开发的人更是绕不过去。EOS中的权限和人们认知的权限基本一致,没有什么特殊之处。但是在区块链中,对帐户中明确的提出权限控制和管理的,EOS算是比较完善的。举一个简单的例子,在比特币和以太坊中,如果私钥被盗,基本上币就没了。可是在EOS中却可以申请把帐户恢复过来。
同样,在EOS中,权限也可以自己组合定义,以更加细粒度的来控制整个操作。比如转帐时可以设置帐户的权限权重,防止一个帐户损失,导致币全部被盗。
二、权限的种类
在EOS中有以下几种权限,其中前两个是帐户默认自带的:
1、Owner:最高权限,可以支配其它权限,一般来说,这个权限只有持有人掌握。
2、Active:可以执行有权限的合约。
3、Recovery:可以恢复被盗的帐户。
4、其它:任意自定义的权限。
举一个恢复帐户的例子,比如在Recovery权限下,权限的阈值设置为2,假如其下有三个帐户,每个帐户的阈值设置为1,那么如果只有一个帐户被盗或丢失,那么利用另外的两个帐户可以执行该权限。为了保证权限的合理使用,EOS对权限与相关的Action允许自定义。首先通过前面的帐户分级,然后再对帐户中的Action进行分级,然后将用户的权限与Action自由映射起来。
那么这样做的好处是什么呢?就是让渡一些不重要的功能(权限),比如一些智能合约对外开放的查询之类,如果每次都必须使用自己的权限来处理,既麻烦又不安全,这时就可以把一部分的权限开放出来,既不影响自己的安全,又提高了使用效率。
当然,这还是有一些风险的,至少目前在EOS上已经发生过了相关的处理引起的帐户被盗。凡事,有一利则必有一弊。
这里需要提醒注意的是:在EOS的帐户创建过程中,是允许Owner和Active两个使用同一把私钥的,但是EOS中并不推荐这样做(不过默认的帐户好像是同一个),也就是说EOS推荐使用双私钥制,为啥?能为啥,安全。包括前面提到的阈值的设置,也是为了安全。举一个例子,在一个大额的交易中,为了安全,可以设置多重签名,也就是说一个帐户签名后并不能够把币转移,只有多个帐户总的权限阈值达到设定的标准后,才可以把币转移到指定方。
三、应用实例
先看一下例子:
1、生成两对密钥(可参照开发之一):
1$ ./cleos create key -f myKey.txt
2$ ./cleos create key --to-console
生成的私钥保存在文本或者控制台。调用两次即可生成两个,一个做为Owner,一个做Active的私钥。
例如:
1Private key: 5KCkcSxYKZfh5Cr8CCunS2PiUKzNZLhtfBjudaUnad3PDargFQo
2Public key: EOS5uHeBsURAT6bBXNtvwKtWaiDSDJSdSmc96rHVws5M1qqVCkAm6
2、生成帐户(后面两个KEY是公钥,公钥是把私钥导入钱包是自动生成的):
1./cleos create account [OPTIONS] creator name OwnerKey ActiveKey
这里需要注意的是帐户名字的一些要求,比如长度(新的取消了),大小写,非法字符等。
例如:
1$ ./cleos create account inita tester EOS4toFS3YXEQCkuuw1aqDLrtHim86Gz9u3hBdcBw5KNPZcursVHq EOS7d9A3uLe6As66jzN8j44TXJUqJSK3bFjjEEqR4oTvNAB3iM9SA
3、查看帐户:
1$ cleos get account eosio [option]
2option:-j,--josn提供JOSN的格式
例如:
1$ cleos get account eosio
2privileged: true
3permissions:
4 owner 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
5 active 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
6memory:
7 quota: -1 bytes used: 1.22 Mb
8
9net bandwidth: (averaged over 3 days)
10 used: -1 bytes
11 available: -1 bytes
12 limit: -1 bytes
13
14cpu bandwidth: (averaged over 3 days)
15 used: -1 us
16 available: -1 us
17 limit: -1 us
18
19producers: <not voted>
4、设置权限
1$ ./cleos set account permission testaccount active EOSPUBLICKEY owner -p testaccount@owner
说明:
1account TEXT - The account to set/delete a permission authority for
2permission TEXT - The permission name to set/delete an authority for
3authority TEXT - [delete] NULL, [create/update] public key, JSON string, or filename defining the authority
4parent TEXT - [create] The permission name of this parents permission (Defaults to: "Active")
例如:
设置新KEY
1$ ./cleos set account permission testaccount active EOSPUBLICKEY owner -p testaccount@owner
修改KEY:
1$ ./cleos set account permission testaccount active diffaccount owner -p testaccount@owner
高级用法(权重、阈值):
1$ ./cleos set account permission testaccount active '{"threshold" : 100, "keys" : [], "accounts" : [{"permission":{"actor":"user1","permission":"active"},"weight":25}, {"permission":{"actor":"user2","permission":"active"},"weight":75}]}' owner -p testaccount@owner
详细的Options可参看帮助文件,Action亦同。
5、设置action的权限
1#cleos set action permission @ACCOUNT @CONTRACT ACTION_NAME PERMISSION_NAME
2#Link a `voteproducer` action to the 'vote' permissions
3cleos set action permission sandwichfarm eosio.system voteproducer voting -p sandwichfarm@voting
4#Now can execute the transaction with the previously set permissions.
5cleos system voteproducer approve sandwichfarm someproducer -p sandwichfarm@voting
6
7account TEXT - The account to set/delete a permission authority for (required)
8code TEXT - The account that owns the code for the action
9type TEXT the type of the action
10requirement TEXT - The permission name require for executing the given action
例如绑定权限和action:
1cleos set action permission eosiodtest eosio.token transfer mytest
绑定权限后就可以用这个权限进行交易了
1cleos push action eosio.token transfer '["eosiodtest","mywallets","10.0000 EOS","transfer"]' -p eosiodtest@mytoken
6、修改权限(删除)
取消权限绑定(就无法用这个权限转帐):
1cleos set action permission mytest eosio.token transfer NULL
7、恢复密钥
EOS允许恢复被盗窃的密钥,方法是使用30天内的任意Owner权限的密钥(即使这个密钥被黑客换过了),并指定合作伙伴才能恢复密钥,这里面合作伙伴不能在没有Owner协助的基础上恢复密钥,合作伙伴也不会参与任何日常交易,从而降低法律上的风险。
四、权限的问题
既然存在超级权限,就会有隐形的漏洞,包括在EOS主网忘却前的智能合约提权的问题。后来发现的转帐代码的问题以及可以通过DAPP从客户的帐户中转回资金的问题,都或多或少存在着权限的控制问题。EOS从主网忘却到现今,出现的BUG和漏洞太多了。且行且看且珍惜吧。
六、总结
EOS的权限管理,目前看来方向还是正确的,虽然可能还有这种那种的问题,慢慢再补吧。没有任何一个新事物一产生就是完美的。正如上面所说,且行且珍惜,让实际的环境来检验它的合理性。