美文网首页区块链
EOS智能合约开发系列(八): 账户和权限

EOS智能合约开发系列(八): 账户和权限

作者: 鹏飞_3870 | 来源:发表于2018-08-20 21:31 被阅读114次

    账户和权限,在EOS中非常重要。EOS在这方面的设计也是不错的,为了后面深入的理解合约,我们需要先搞清楚账户和权限的内容。下面就来详细介绍。

    账户

    帐户是存储在区块链上的人类可读的标志符。它可以由个人或一组个人授权拥有,具体取决于权限配置。账户的概念是EOS相对于其他公链的独创。对比ETH和BTC,它们的账户实际就是地址,是一串没有规律的数字和字母,而EOS上引入了账户的概念,转账的时候,你不用再抄写那一堆看不懂的字符串了,只需要输入12位的账户名就好了。

    在EOS上,每个帐户都有两个默认的许可权限:所有者许可(owner)和活动许可(active)。开发人员还可以自定义许可权限,这个我们后面介绍。每个许可都具有一个阈值,当你的签名授权的权重达到了被签名交易所要求的阀值,交易才算是合法的;签名是由加载和解锁钱包的客户端来进行的,而钱包则是保护和使用您的密钥的软件。

    还记得我们创建账户的命令吧?我们可以在创建账户的时候给该账户指定owner和active的key:

    cleos create account eosio user EOS83sN8bfKGk3jTBezN41UN7LfXSVFa1w3YQcGApE67J26t3HLcr EOS83sN8bfKGk3jTBezN41UN7LfXSVFa1w3YQcGApE67J26t3HLcr
    

    这个命令的格式是:

    cleos creat account <creator> <name> <OwnerKey> <ActiveKey>
    

    creator: 是用来支付创建费用的账号
    name: 是新的账号,要创建的账号
    OwnerKey: 这个key可以拥有新账号最高的权限,可以执行这个账号的所有action。只有少数交易非此权限不可,比如对所有者权限进行任何类型更改的操作。通常,建议所有者把这个key放在冷钱包里,不要与任何人共享,当其他权限被泄漏的时候,可以用ownerkey重置权限设置。
    ActiveKey: 这个key通常给这个账号做常规的交易签名,比如转账、选举或者合约定义的其他action等。

    我们看看user的账号信息,注意前面几行的权限信息:

    ~ cleos get account user
    permissions:
         owner     1:    1 EOS83sN8bfKGk3jTBezN41UN7LfXSVFa1w3YQcGApE67J26t3HLcr
            active     1:    1 EOS83sN8bfKGk3jTBezN41UN7LfXSVFa1w3YQcGApE67J26t3HLcr
    memory:
    

    你可以看到 active许可这里有个缩进,也就代表owner权限是active的父权限,拥有active权限的一切权限。另外你还可以看到有两个1,它们分别代表权重和阀值,这里权重和阀值相等,说明只需要一个key的签名,即可获得对应的许可权限。关于这一点,言语还是太抽象,下面会有具体的例子。

    你应该发现了,一个账户是由key来管理,key是一个公钥私钥对,私钥可以对交易进行签名,别人以及BP节点可以用公钥对签名进行验证。每个账户可以定义一些许可权限,每个许可权限对于不同的key。

    我们上面的例子中,因为是个例子,我使用的ownerkey和activekey都是同一个;如果要安全一点的话,我们应该使用不同的key;如果要更安全,我们还可以用给多个key授权一个许可权限。比如,可以让多个key共同承担ownerkey,只有当这些ownerkey都对交易进行签名时,才能获得owner权限,而任何单个key都不行。

    更改ownerKey

    不知道你有没有这样的困惑:“我之前看了你的教程,给我的一个账号也设置了相同key,现在你又告诉我说,安全的做法应该是activekey和ownerkey设置成不同的,我现在该怎么做才能把ownerkey修改成另外一个key呢?”,不着急,现在我就告诉你方法:

    cleos set account permission tester owner EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV   -p tester@owner
    

    注意,你要EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV替换成你新的key,并且你确保你拥有它对应的私钥。

    更改activekey的方法也是类似的,这里就不赘述了。

    钱包

    钱包是存储key的客户端,当你创建账户的时候,或者给账户设置权限的时候,就可以把这些key与账户的权限相关联。
    值得注意的是,账户是存储在区块链上的,而key是在你自己的钱包里的。

    自定义权限

    除了系统自带权限之外,帐户还可以拥有可用于进一步扩展帐户管理的自定义命名权限。自定义权限非常灵活,下一篇我们会详细讲解。

    还记得上面我们修改ownerKey所用的命令吗?实际上,我不仅仅是修改,我们还可以用它来新建一个许可。我举个例子,并把新的许可名字就命名为vote

    cleos set account permission tester vote EOS83sN8bfKGk3jTBezN41UN7LfXSVFa1w3YQcGApE67J26t3HLcr  active -p tester@active
    

    这个命令的格式是这样的:

    cleos set account permission <account-name> <permission-name> <KEY> <parent-permission> -p accountname@active
    

    对照着格式,其意自明,我就不解释了。我们看下这时候tester的权限情况:

    ~ cleos get account tester
    permissions:
         owner     1:    1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
            active     1:    1 EOS83sN8bfKGk3jTBezN41UN7LfXSVFa1w3YQcGApE67J26t3HLcr
               vote     1:    1 EOS83sN8bfKGk3jTBezN41UN7LfXSVFa1w3YQcGApE67J26t3HLcr
    

    你会发现多了一个voter权限,并且它是active的子权限;因为我在设置这个许可的时候用的是-p tester@active

    自定义权限本身只是个设置项,它本身没有意义,只有与某个账户或者action关联之后才有意义。

    你猜猜,现在我们可以用voter来转账吗?

    ~ cleos push action eosio.token transfer \
            '[ "tester", "user", "0.5000 SYS", "I love you" ]' -p tester@vote
    Error 3090005: Irrelevant authority included
    Please remove the unnecessary authority from your action!
    

    注意最后一个参数-p tester@vote,我们使用的vote许可,你会发现不能转账成功。因为我们新创建的这个许可vote没有与transfer这个action关联,也就是说它没有取得transfer的授权。

    我们可以这样来关联transfer:

    cleos set action permission tester eosio.token transfer vote
    

    它的格式是这样的:

    cleos set action permission <account> <contract> <action_name> <permission_name>
    

    上面这个命令中,我就把tester上的vote许可,与eosio.token合约中transfer action关联起来了,这样在使用tester账户时,就可以使用vote许可权限来对transfer交易进行签名了。

    你可以再用上面用vote权限转账试试,你会发现它可以成功了。

    删除自定义的命名许可

    还记得我们上面创建命名许可的过程吗?分为两步:

    1. 首先先在账户上设置许可
    2. 把这个许可与需要授权的action关联

    所以我们删除许可也要分两步,顺序是反过来的:

    1. 先解除许可与action的关联
    2. 再在账户上删除许可

    解除关联的命令:

    ~ cleos set action permission tester eosio.token transfer NULL
    executed transaction: 5fa2f0f5c56f9f0bafe85b58d03ed8022e03fe26981ef37efcd241f474e1a94e  120 bytes  2864 us
    #         eosio <= eosio::unlinkauth            {"account":"tester","code":"eosio.token","type":"transfer"}
    2018-08-21T08:10:43.999 thread-0   main.cpp:432                  print_result   warning: transaction executed locally, but may not be confirmed by the network yet
    

    注意最后一个参数是NULL。从命令的形式可以看出,这种方法会把tester账户上与transfer action所有的关联的都解除。意思是,如果你有多个自定义的许可,都关联了transfer,那么上面这个命令,会把这些关联都解除。

    然后,我们用下面的命令删除tester的上vote许可:

    ~ cleos set account permission tester vote NULL active -p tester@active
    executed transaction: 20337eb0a886b3aad024d972c6d2515f3adf99f9166ef3f614c8c27c5667501f  112 bytes  1797 us
    #         eosio <= eosio::deleteauth            {"account":"tester","permission":"vote"}
    

    我们检查一下tester账户的权限信息:

    ~ cleos get account tester
    permissions:
         owner     1:    1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
            active     1:    1 EOS83sN8bfKGk3jTBezN41UN7LfXSVFa1w3YQcGApE67J26t3HLcr
    

    可以看到,我们已经没有了vote许可。


    好了,今天就到这里了。本文介绍账户和权限的概念,以及一些基础命令,明天我们介绍点高级一点的。

    简介:不羁,一名程序员;专研EOS技术,玩转EOS智能合约开发。
    微信公众号:know_it_well
    知识星球地址:https://t.zsxq.com/QvbuzFM

    相关文章

      网友评论

        本文标题:EOS智能合约开发系列(八): 账户和权限

        本文链接:https://www.haomeiwen.com/subject/vwcriftx.html