在eos中,賬戶是一個非常重要的概念。 賬戶分為兩部分組成 一種是active 一種是action. 智能合約本質上來講就是一個action加上一個回饋腳本程序。任何智能合約都有這倆個部分組成。
那么有一個問題出現了: 對不同賬戶所做的事情不同, 有一些敏感的操作就要求最高權限才能使用。
用戶賬戶可以自定義分級 :創建賬戶eos默認分為owner和active 。不過為了方便起見,一般設置兩個相同。 active就是之前說的操作智能合約的權限。權限是基於權重管理的。
在這個權限下面的action可以做任何事情。權限區分使用/ 區分或者.來進行區分。
智能合約賬戶分級和分組:這里需要主要如果用戶擁有了某種權限。 就可以執行當前所在組的所有操作。
權限和賬戶action的映射關系: 賬戶 active action 權限
合約即賬戶 賬戶及合約。 action active 即權限和動作兩部分組成。
原文:名詞解釋:本篇文章出現很多 “Action” 和 “Active”,Action (動作)為 EOS 中賬戶可以接受的動作,也就是別人可以對你做什么;Active 為 EOS 賬戶權限的一種。
在 EOS 里,不論是真人用戶還是智能合約,本質上都是一個賬戶(Account)。或者說,真人賬戶也是一個智能合約,都可以對外聲明別人可以對他做什么動作(比如社交合約里的發帖),EOS 官方稱之為 “Action”。比如某個賬戶可以聲明一個叫 “SayHi” 的 Action,別的賬戶就可以使用 Active 權限(這里可以參考之前的文章)對他執行 SayHi 動作。賬戶還可以聲明對 Action 的回應方式,比如別人對他 SayHi 后可以回送一個金幣什么的。所以 EOS 里 “智能合約” 的定義就是:賬戶定義的 Action,以及對 Action 的回應腳本(程序)。任何智能合約都是由這兩個要素組成的。
這種架構自然而然引發了一個問題:對於復雜的智能合約賬戶,有些 Action 功能比較簡單,比如就是一個查詢,安全性要求不高,便利性要求高。還有些 Action 非常敏感,比如提現,便利性要求不高,安全性要非常高。用戶賬戶使用自己的 Active 權限就可以執行所有智能合約的 Action,顯然是不合理的。EOS 為了解決這個問題,采取了三步:1.(用戶)賬戶自定義分級權限。2.(智能合約)賬戶 Action 分級。3.用戶權限與智能合約 Action 之間的映射(mapping)。再次強調,這里只是為了表達方便,將賬戶分為“用戶”與“智能合約”,其實這二者在 EOS 里沒有區別。用戶本身就是智能合約,智能合約也是其他智能合約的“用戶”。
(用戶)賬戶自定義分級權限
EOS 里,賬戶默認會有兩種權限:Owner 和 Active。Owner 是最高權限,Active 就是之前提到的操作智能合約權限。所有權限都是基於權重和閾值管理的(詳見之前的文章 URL)。EOS 在此基礎上,增加了分級並分組的自定義權限,如下圖所示。
途中箭頭方向就是指向“母權限”或者更高級權限。圖中不難看出,Owner 權限是賬戶最高權限,可以執行 Active 權限。Active 權限可以執行 Family 權限和 Lawyer 權限。 Family 權限可以執行 Friends 權限。反過來,低級權限不能代替執行更高級的權限。不同級別的權限用 "/" 或"." 分隔,比如圖中的 Friends 權限就可以表示為 “@User.Active.Family.Friends”。
(智能合約)賬戶 Action 分級
與權限分級類似,賬戶 Action 也可以分級並分組,如下圖所示(圖中的 Message 也就是 Action)。
這個智能合約賬戶叫“@Exchange.Contract”,首先定義了 Withdraw(提現) Action,接下來是一組 Action 名叫 “Trade(交易)組”,組里有三個 Action:Buy(買入)、Sell(賣出)、Cancel(取消)。Action 同樣遵循“向下兼容”,也就是如果某用戶賬戶的某權限擁有“Trade組”的映射,就可以執行“Trade組”的所有 Action。不同級別的 Action 用 "/" 或"." 分隔,比如圖中的 Buy Action 就可以表示為 “@Exchange.Contract/Trade/Buy”。
權限與 Action 之間的映射
最后一步,我們要將前兩步連接起來,也就決定什么權限能執行什么 Action,如下如的左下部分。
首先看映射1,我們將 @Exchange.Contract 合約的所有 Action 映射到了 Family 權限,也就是使用 @User 用戶的 Family 權限(或者更高權限)可以執行 @Exchange.Contract 合約的所有 Action。映射2表示將 @Exchange.Contract 合約的 Withdraw(提現)Action 映射到了 Lawyer 權限,所以 Lawyer 權限可以執行 Withdraw Action。但無法執行其他 Action。3 表示 Trade 組並沒有特殊映射,不過因為 @Exchange.Contract 合約的所有 Action 都映射到了 Family 權限,可以直接通過 Family 權限執行,或者使用更高級的 Active 甚至 Owner 權限。
如果 @User 賬戶想執行 @Exchange.Contract/Trade/Buy 這個 Action,系統會檢查 @User 賬戶是否定義了 @Exchange.Contract/Trade/Buy 映射,沒有的話會檢查 @Exchange.Contract/Trade 映射,接着會檢查 @Exchange.Contract 映射,發現 @Exchange.Contract 映射到了 Family 權限,就會檢查本次執行是否滿足了 @User.Family 權限(達到閾值),若 Family 權限不足會檢查 @User.Active,接着會檢查 @User.Owner。
如果沒有發現任何符合的映射,會直接檢查本次執行是否滿足了 @User.Active 權限,若不足,會檢查 @User.Owner。
作者:許小笛
溝通交流:1354439
