EOS智能合约中的权限控制

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的权限管理,目前看来方向还是正确的,虽然可能还有这种那种的问题,慢慢再补吧。没有任何一个新事物一产生就是完美的。正如上面所说,且行且珍惜,让实际的环境来检验它的合理性。

发布了104 篇原创文章 · 获赞 12 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/fpcc/article/details/86764243