go-loomのコントラクトでの権限の使用

go-loomを使って書かれたコントラクトは、任意のトークンに対する権限の設定とチェックをするためのヘルパー関数を使用することができる。

これはSolidityだとOpenZeppelin のOwnableのコンセプトに少し似ている。

それぞれの権限が以下の3つの要素を持っている:

  1. address
  2. token
  3. role

トークンは、オブジェクトが所有されていることを表す何かしらの文字列、もしくはバイトシーケンスとすることができる。 例えば、ある人物のユーザー名をトークンとして、その人がその所有権を持つことが可能だ。 トークンのようなその他のものにも、所有権を持たせることができる。

tokenに対する権限roleは、addressに付与される。 例えばアカウント作成時、usernameトークンに対するowner権限を送信者アドレスに与えることができる。

例えば

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

これはuserName (トークン)に対するowner権限を、トランザクションの送信者アドレスに付与することになる。 このロールは、複数の権限を1回のコールで付与するための配列だ。

トランザクションの送信者のアクセス権限をチェックするには、

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

HasPermissionでは、(一致について示す)bool値と、addressroleの組み合わせと一致したロールのサブセットが返される。

他に2つ、任意のアドレスの権限を使って動く低レベル関数がある。

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