使用go-loom合约中的权限

用go-loom编写的合约可以使用辅助函数来设置和检查任意标记的权限。

这有点类似于在Solidity里OpenZeppelin的 Ownable概念。

Every permission has three attributes:

  1. address
  2. token
  3. role

代币可以是任何字符或字节序列,表示要拥有的对象。 例如, 一个人用户名可以是代币, 那个人拥有所有权。 其他类似于代币的东西也可以拥有所有权。

权限 role 被授予给 token上的address。 例如, 创建帐户时, 可以将 owner 权限授予username 代币上的发件人地址。

例如

    ctx.GrantPermission([]byte(userName), []string{"owner"})

这会将userName (代币)的权限授予owner 到事务的发送者地址。这个角色是一个通过一次调用授予多个权限的数组。

要检查事务发送者的权限,

    if ok, _ := ctx.HasPermission([]byte(userName), []string{"owner"}); !ok {
        return errors.New("User unverified")
    }

HasPermission 返回一个布尔值(来表明匹配关系)和一个addressrole 组合匹配的角色子集。

还有另外两个低级函数以任意地址的权限运行。

    HasPermissionFor(addr loom.Address, token []byte, roles []string) (bool, []string)
    GrantPermissionTo(addr loom.Address, token []byte, role string)