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

账户和权限,在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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容