到底什么叫“智能合约”?
名词解释:本篇文章出现很多 “Action” 和 “Active”,Action (动作)为 EOS 中账户可以接受的动作,也就是别人可以对你做什么;Active 为 EOS 账户权限的一种。阅读本文前建议先阅读之前的文章:https://mp.weixin.qq.com/s/K6ClE1TDfH2hB7lbXOZUJA
在 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。
相关文章和视频推荐
圆方圆学院汇集大批区块链名师,打造精品的区块链技术课程。 在各大平台都长期有优质免费公开课,欢迎报名收看。