EOS智能合約開發(fā)系列(八): 賬戶和權(quán)限

賬戶和權(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ò)程嗎诲宇?分為兩步:

  1. 首先先在賬戶上設(shè)置許可
  2. 把這個(gè)許可與需要授權(quán)的action關(guān)聯(lián)

所以我們刪除許可也要分兩步,順序是反過(guò)來(lái)的:

  1. 先解除許可與action的關(guān)聯(lián)
  2. 再在賬戶上刪除許可

解除關(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市卧惜,隨后出現(xiàn)的幾起案子厘灼,更是在濱河造成了極大的恐慌夹纫,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件设凹,死亡現(xiàn)場(chǎng)離奇詭異舰讹,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)闪朱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門月匣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人奋姿,你說(shuō)我怎么就攤上這事锄开。” “怎么了称诗?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵院刁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我粪狼,道長(zhǎng)退腥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任再榄,我火速辦了婚禮狡刘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘困鸥。我一直安慰自己嗅蔬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布疾就。 她就那樣靜靜地躺著澜术,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猬腰。 梳的紋絲不亂的頭發(fā)上鸟废,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音姑荷,去河邊找鬼盒延。 笑死,一個(gè)胖子當(dāng)著我的面吹牛鼠冕,可吹牛的內(nèi)容都是我干的添寺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼懈费,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼计露!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤票罐,失蹤者是張志新(化名)和其女友劉穎叉趣,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胶坠,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年繁堡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沈善。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡椭蹄,死狀恐怖闻牡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绳矩,我是刑警寧澤罩润,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站翼馆,受9級(jí)特大地震影響割以,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜应媚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一严沥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧中姜,春花似錦消玄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至携龟,卻和暖如春兔跌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背峡蟋。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工浮定, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人层亿。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓桦卒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親匿又。 傳聞我的和親對(duì)象是個(gè)殘疾皇子方灾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容