基本概念
先看看這篇文章,了解下EOS.IO權(quán)限模型的三個基本概念:
- Wallets(錢包)——錢包是EOS.IO提供的用于管理密鑰對的客戶端,錢包支持鎖定和密碼解鎖。
- Accounts (賬戶)——賬戶是公示在區(qū)塊鏈上的人工易讀(不是公鑰或短地址?。。。┑拿?。
- Authorities and Permissions(權(quán)限及授權(quán)驗證)——每個賬戶都內(nèi)置
owner和active權(quán)限,owner冷藏用于恢復(fù)其他權(quán)限。
權(quán)限(Permission)定義的目標
EOSIO的賬戶權(quán)限定義的目標在白皮書中這樣敘述:
EOS.IO software allows each account to define a mapping between a Named Message Handler Group of any account and their own Named Permission Level. For example, an account holder could map the account holder's social media application to the account holder's "Friend" permission group. With this mapping, any friend could post as the account holder on the account holder's social media. Even though they would post as the account holder, they would still use their own keys to sign the message. This means it is always possible to identify which friends used the account and in what way.
這段話明確了EOSIO允許賬戶持有者部分讓度權(quán)限,而且權(quán)限受讓者是用自己持有的密鑰簽名,以便明確區(qū)分授權(quán)行為是如何發(fā)生的。
賬戶(Account)如何生成
權(quán)限是建立在賬戶的基礎(chǔ)之上的,那么賬戶又是如何產(chǎn)生的呢?
首先要明確的一點是:
無論賬戶還是權(quán)限,它們一定是通過簽名交易(signed transaction)來定義并在區(qū)塊鏈中公示的。——這是其他節(jié)點在執(zhí)行合約時進行權(quán)限驗證(Authorities)的基礎(chǔ)。
來看看利用EOSIO的命令交互,如何生成一個新賬戶:
$ eosc create account inita tester EOS4toFS3YXEQCkuuw1aqDLrtHim86Gz9u3hBdcBw5KNPZcursVHq EOS7d9A3uLe6As66jzN8j44TXJUqJSK3bFjjEEqR4oTvNAB3iM9SA
命令的說明及返回在這里
返回JSON文本比較長,不過讀懂它的每一部分含義你也就理解了EOSIO權(quán)限模型的設(shè)計思路。這里我們先看看與本文相關(guān)的幾處:
- 每個賬戶默認攜帶
owner和active兩個權(quán)限,分別對應(yīng)一對密鑰(*其中owner密鑰冷藏保存,通常用active來干活,方便用owner恢復(fù)active) - 該命令用賬戶
inita的active權(quán)限簽名提交了一個交易 - 交易調(diào)用了內(nèi)置合約
eos的newaccount行為 - 命令傳入的公鑰分別作為新產(chǎn)生的tester賬戶的
owner和active權(quán)限公鑰
這里一定有人會問:那么這個最初的賬戶inita是由什么賬戶來簽名生成的呢?——它是在啟動區(qū)塊鏈時,在創(chuàng)世區(qū)塊的配置config.ini中直接定義的。
參考文檔在這里
權(quán)限(Permission)如何定義
上面我們看到,對于賬戶默認攜帶的owner和active權(quán)限,只需要在建立賬戶時指定就好。那么賬戶如何自定義權(quán)限呢?
看這里 后續(xù)的Create or Modify Permissions 章節(jié)。
權(quán)限定義的關(guān)鍵在于那個描述權(quán)重的JSON:
{
"threshold" : 100, /*An integer that defines cumulative signature weight required for authorization*/
"keys" : [], /*An array made up of individual permissions defined with an EOS PUBLIC KEY*/
"accounts" : [] /*An array made up of individual permissions defined with an EOS ACCOUNT*/
}
-
threshold給出滿足此權(quán)限驗證至少要達到(當然比它高也滿足驗證)的權(quán)重。 -
keys定義了在本權(quán)限定義中,可獲得的權(quán)重的密鑰集合。 -
accounts定義了可獲得權(quán)重的賬戶+權(quán)限公鑰簽名集合。
即是說,后兩者是以不同的形式給出可獲得權(quán)重的簽名集合,實施中可根據(jù)具體情況靈活運用。
另外可以看出,目前的權(quán)限定義采用了覆蓋的形式,即:對同一權(quán)限的重復(fù)定義,后者會覆蓋前者。