賬戶和權(quán)限,在EOS中非常重要睦疫。EOS在這方面的設(shè)計(jì)也是不錯(cuò)的害驹,為了后面深入的理解合約,我們需要先搞清楚賬戶和權(quán)限的內(nèi)容蛤育。下面就來(lái)詳細(xì)介紹宛官。
賬戶
帳戶是存儲(chǔ)在區(qū)塊鏈上的人類可讀的標(biāo)志符。它可以由個(gè)人或一組個(gè)人授權(quán)擁有瓦糕,具體取決于權(quán)限配置底洗。賬戶的概念是EOS相對(duì)于其他公鏈的獨(dú)創(chuàng)。對(duì)比ETH和BTC咕娄,它們的賬戶實(shí)際就是地址亥揖,是一串沒(méi)有規(guī)律的數(shù)字和字母,而EOS上引入了賬戶的概念圣勒,轉(zhuǎn)賬的時(shí)候费变,你不用再抄寫那一堆看不懂的字符串了,只需要輸入12位的賬戶名就好了圣贸。
在EOS上挚歧,每個(gè)帳戶都有兩個(gè)默認(rèn)的許可權(quán)限:所有者許可(owner)和活動(dòng)許可(active)。開發(fā)人員還可以自定義許可權(quán)限旁趟,這個(gè)我們后面介紹昼激。每個(gè)許可都具有一個(gè)閾值庇绽,當(dāng)你的簽名授權(quán)的權(quán)重達(dá)到了被簽名交易所要求的閥值锡搜,交易才算是合法的;簽名是由加載和解鎖錢包的客戶端來(lái)進(jìn)行的瞧掺,而錢包則是保護(hù)和使用您的密鑰的軟件耕餐。
還記得我們創(chuàng)建賬戶的命令吧?我們可以在創(chuàng)建賬戶的時(shí)候給該賬戶指定owner和active的key:
cleos create account eosio user EOS83sN8bfKGk3jTBezN41UN7LfXSVFa1w3YQcGApE67J26t3HLcr EOS83sN8bfKGk3jTBezN41UN7LfXSVFa1w3YQcGApE67J26t3HLcr
這個(gè)命令的格式是:
cleos creat account <creator> <name> <OwnerKey> <ActiveKey>
creator: 是用來(lái)支付創(chuàng)建費(fèi)用的賬號(hào)
name: 是新的賬號(hào)辟狈,要?jiǎng)?chuàng)建的賬號(hào)
OwnerKey: 這個(gè)key可以擁有新賬號(hào)最高的權(quán)限肠缔,可以執(zhí)行這個(gè)賬號(hào)的所有action夏跷。只有少數(shù)交易非此權(quán)限不可,比如對(duì)所有者權(quán)限進(jìn)行任何類型更改的操作明未。通常槽华,建議所有者把這個(gè)key放在冷錢包里,不要與任何人共享趟妥,當(dāng)其他權(quán)限被泄漏的時(shí)候猫态,可以用ownerkey重置權(quán)限設(shè)置。
ActiveKey: 這個(gè)key通常給這個(gè)賬號(hào)做常規(guī)的交易簽名披摄,比如轉(zhuǎn)賬亲雪、選舉或者合約定義的其他action等。
我們看看user
的賬號(hào)信息疚膊,注意前面幾行的權(quán)限信息:
~ cleos get account user
permissions:
owner 1: 1 EOS83sN8bfKGk3jTBezN41UN7LfXSVFa1w3YQcGApE67J26t3HLcr
active 1: 1 EOS83sN8bfKGk3jTBezN41UN7LfXSVFa1w3YQcGApE67J26t3HLcr
memory:
你可以看到 active
許可這里有個(gè)縮進(jìn)义辕,也就代表owner
權(quán)限是active
的父權(quán)限,擁有active
權(quán)限的一切權(quán)限寓盗。另外你還可以看到有兩個(gè)1
灌砖,它們分別代表權(quán)重和閥值,這里權(quán)重和閥值相等贞让,說(shuō)明只需要一個(gè)key
的簽名周崭,即可獲得對(duì)應(yīng)的許可權(quán)限。關(guān)于這一點(diǎn)喳张,言語(yǔ)還是太抽象续镇,下面會(huì)有具體的例子。
你應(yīng)該發(fā)現(xiàn)了销部,一個(gè)賬戶是由key來(lái)管理摸航,key是一個(gè)公鑰私鑰對(duì),私鑰可以對(duì)交易進(jìn)行簽名舅桩,別人以及BP節(jié)點(diǎn)可以用公鑰對(duì)簽名進(jìn)行驗(yàn)證酱虎。每個(gè)賬戶可以定義一些許可權(quán)限,每個(gè)許可權(quán)限對(duì)于不同的key擂涛。
我們上面的例子中读串,因?yàn)槭莻€(gè)例子,我使用的ownerkey和activekey都是同一個(gè)撒妈;如果要安全一點(diǎn)的話恢暖,我們應(yīng)該使用不同的key;如果要更安全狰右,我們還可以用給多個(gè)key授權(quán)一個(gè)許可權(quán)限杰捂。比如,可以讓多個(gè)key共同承擔(dān)ownerkey棋蚌,只有當(dāng)這些ownerkey都對(duì)交易進(jìn)行簽名時(shí)嫁佳,才能獲得owner權(quán)限挨队,而任何單個(gè)key都不行。
更改ownerKey
不知道你有沒(méi)有這樣的困惑:“我之前看了你的教程蒿往,給我的一個(gè)賬號(hào)也設(shè)置了相同key盛垦,現(xiàn)在你又告訴我說(shuō),安全的做法應(yīng)該是activekey和ownerkey設(shè)置成不同的瓤漏,我現(xiàn)在該怎么做才能把ownerkey修改成另外一個(gè)key呢情臭?”,不著急赌蔑,現(xiàn)在我就告訴你方法:
cleos set account permission tester owner EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV -p tester@owner
注意俯在,你要EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
替換成你新的key,并且你確保你擁有它對(duì)應(yīng)的私鑰娃惯。
更改activekey的方法也是類似的跷乐,這里就不贅述了。
錢包
錢包是存儲(chǔ)key的客戶端趾浅,當(dāng)你創(chuàng)建賬戶的時(shí)候愕提,或者給賬戶設(shè)置權(quán)限的時(shí)候,就可以把這些key與賬戶的權(quán)限相關(guān)聯(lián)皿哨。
值得注意的是浅侨,賬戶是存儲(chǔ)在區(qū)塊鏈上的,而key是在你自己的錢包里的证膨。
自定義權(quán)限
除了系統(tǒng)自帶權(quán)限之外如输,帳戶還可以擁有可用于進(jìn)一步擴(kuò)展帳戶管理的自定義命名權(quán)限。自定義權(quán)限非常靈活央勒,下一篇我們會(huì)詳細(xì)講解不见。
還記得上面我們修改ownerKey所用的命令嗎?實(shí)際上崔步,我不僅僅是修改稳吮,我們還可以用它來(lái)新建一個(gè)許可。我舉個(gè)例子井濒,并把新的許可名字就命名為vote
灶似。
cleos set account permission tester vote EOS83sN8bfKGk3jTBezN41UN7LfXSVFa1w3YQcGApE67J26t3HLcr active -p tester@active
這個(gè)命令的格式是這樣的:
cleos set account permission <account-name> <permission-name> <KEY> <parent-permission> -p accountname@active
對(duì)照著格式,其意自明瑞你,我就不解釋了酪惭。我們看下這時(shí)候tester
的權(quán)限情況:
~ cleos get account tester
permissions:
owner 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
active 1: 1 EOS83sN8bfKGk3jTBezN41UN7LfXSVFa1w3YQcGApE67J26t3HLcr
vote 1: 1 EOS83sN8bfKGk3jTBezN41UN7LfXSVFa1w3YQcGApE67J26t3HLcr
你會(huì)發(fā)現(xiàn)多了一個(gè)voter權(quán)限,并且它是active的子權(quán)限捏悬;因?yàn)槲以谠O(shè)置這個(gè)許可的時(shí)候用的是-p tester@active
撞蚕。
自定義權(quán)限本身只是個(gè)設(shè)置項(xiàng)润梯,它本身沒(méi)有意義过牙,只有與某個(gè)賬戶或者action關(guān)聯(lián)之后才有意義甥厦。
你猜猜,現(xiàn)在我們可以用voter
來(lái)轉(zhuǎn)賬嗎寇钉?
~ 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!
注意最后一個(gè)參數(shù)-p tester@vote
刀疙,我們使用的vote許可,你會(huì)發(fā)現(xiàn)不能轉(zhuǎn)賬成功扫倡。因?yàn)槲覀冃聞?chuàng)建的這個(gè)許可vote
沒(méi)有與transfer
這個(gè)action關(guān)聯(lián)谦秧,也就是說(shuō)它沒(méi)有取得transfer
的授權(quán)。
我們可以這樣來(lái)關(guān)聯(lián)transfer
:
cleos set action permission tester eosio.token transfer vote
它的格式是這樣的:
cleos set action permission <account> <contract> <action_name> <permission_name>
上面這個(gè)命令中撵溃,我就把tester上的vote
許可疚鲤,與eosio.token
合約中transfer
action關(guān)聯(lián)起來(lái)了,這樣在使用tester賬戶時(shí)缘挑,就可以使用vote許可權(quán)限來(lái)對(duì)transfer交易進(jìn)行簽名了集歇。
你可以再用上面用vote權(quán)限轉(zhuǎn)賬試試,你會(huì)發(fā)現(xiàn)它可以成功了语淘。
刪除自定義的命名許可
還記得我們上面創(chuàng)建命名許可的過(guò)程嗎诲宇?分為兩步:
- 首先先在賬戶上設(shè)置許可
- 把這個(gè)許可與需要授權(quán)的action關(guān)聯(lián)
所以我們刪除許可也要分兩步,順序是反過(guò)來(lái)的:
- 先解除許可與action的關(guān)聯(lián)
- 再在賬戶上刪除許可
解除關(guān)聯(lián)的命令:
~ 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
注意最后一個(gè)參數(shù)是NULL
惶翻。從命令的形式可以看出姑蓝,這種方法會(huì)把tester賬戶上與transfer
action所有的關(guān)聯(lián)的都解除。意思是吕粗,如果你有多個(gè)自定義的許可纺荧,都關(guān)聯(lián)了transfer,那么上面這個(gè)命令颅筋,會(huì)把這些關(guān)聯(lián)都解除虐秋。
然后,我們用下面的命令刪除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賬戶的權(quán)限信息:
~ cleos get account tester
permissions:
owner 1: 1 EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
active 1: 1 EOS83sN8bfKGk3jTBezN41UN7LfXSVFa1w3YQcGApE67J26t3HLcr
可以看到垃沦,我們已經(jīng)沒(méi)有了vote許可客给。
好了,今天就到這里了肢簿。本文介紹賬戶和權(quán)限的概念靶剑,以及一些基礎(chǔ)命令,明天我們介紹點(diǎn)高級(jí)一點(diǎn)的池充。
簡(jiǎn)介:不羈桩引,一名程序員;專研EOS技術(shù)收夸,玩轉(zhuǎn)EOS智能合約開發(fā)坑匠。
微信公眾號(hào):know_it_well
知識(shí)星球地址:https://t.zsxq.com/QvbuzFM