到底什麼叫“智慧合約”?
名詞解釋:本篇文章出現很多 “Action” 和 “Active”,Action (動作)為 EOS 中賬戶可以接受的動作,也就是別人可以對你做什麼;Active 為 EOS 賬戶許可權的一種。閱讀本文前建議先閱讀之前的文章:https://mp.weixin.qq.com/s/K6…
在 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 就是之前提到的操作智慧合約許可權。所有許可權都是基於權重和閾值管理的。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。
相關文章和視訊推薦
圓方圓學院彙集大批區塊鏈名師,打造精品的區塊鏈技術課程。 在各大平臺都長期有優質免費公開課,歡迎報名收看。