在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