はじめに

初めまして。 CryptoGamesというブロックチェーンゲーム企業でエンジニアをしている cardene(かるでね) です! スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。

代表的なゲームはクリプトスペルズというブロックチェーンゲームです。

今回は、SBT(ソウル・バウンド・トークン)のMint(発行)にBurn(破棄)できる権限を付与できるERC5484について説明していきます!

以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。

SBT(ソウル・バウンド・トークン)とは、Transfer(送付)できないNFTのことを指します。

以下からSBT表記になります。

NFT(ERC721)については以下を参考にしてください。

要約

このEIPは、EIP721を拡張してSBTを作成するインターフェースを定義します。

「そもそもインターフェースって何?」という方は以下の記事を参考にしてください!

NFTのMint(発行)前に発行アドレスと受け取りてアドレスの両方が、このトークンをBurn(破棄)する権限を持つアドレスの合意が必要になります。 Burn(破棄)の権限の決定後、変更は不可能です。 NFTのMint(発行)後、SBTは他アドレスにTransefer(送付)はできませんが、Burn(破棄)する権限を持っていればBurn(破棄)を実行することはできます。

動機

SBTのアイデアは提案されてからかなりの注目を集めています。 ただし、標準的なインターフェースがないため、SBTは互換性がありません。 SBTの実装について標準的なものがないと、SBTを対象とした汎用サービスを開発することは難しいです。

このEIPでは、SBTを特殊なNFTとして位置付け、資格情報、信用記録、融資履歴、会員資格などの個人情報などを判別する役割になることを想定しています。 また、柔軟性を提供するために、SBTはアプリケーション固有のBurn(破棄)権限を持ち、通常のEIP721規格のNFTと区別する方法を持つ必要があります。

仕様

提案するは、EIP721規格のNFTでは以下のインターフェースを実装する必要があります。

  • ERC165(0x01ffc9a7)。
  • ERC721(0x80ac58cd)。
  • Mint(発行)前にburnAuthを受け取り手アドレスに提示する。
  • Mint(発行)後はburnAuthを変更不可にする。
  • burnAuthのみでNFTをBurn(破棄)できる権限を判別する。
  • NFTの発行アドレスはMint(発行)前にNFTのメタデータを受け取り手アドレスに提示し、受け取り手アドレスの署名を取得する。
  • Mint(発行)後に発行アドレスはNFTのメタデータを変更してはいけない。

インターフェース

javascript
// SPDX-License-Identifier: CC0-1.0
pragma solidity ^0.8.0;

interface IERC5484 {
    enum BurnAuth {
        IssuerOnly,
        OwnerOnly,
        Both,
        Neither
    }

    event Issued (
        address indexed from,
        address indexed to,
        uint256 indexed tokenId,
        BurnAuth burnAuth
    );

    function burnAuth(uint256 tokenId) external view returns (BurnAuth);
}

BurnAuth

Burn(破棄)権限の種類を列挙した型定義。

  • IssuerOnly
    • NFTの発行アドレスにのみBurn(破棄)権限がある。
  • OwnerOnly
    • NFTの所有者アドレスにのみBurn(破棄)権限がある。
  • Both
    • NFTの発行アドレスと所有者アドレスにのみBurn(破棄)権限がある。
  • Neither
    • NFTのBurn(破棄)権限はどのアドレスにもない。

Issued

SBTがMint(発行)されたときに発行されるイベント。 ERC721規格のNFTのTransferイベントに追加されます。

  • from
    • NFTの発行者アドレス。
  • to
    • NFTの受け取り手アドレス。
  • tokenId
    • 発行されたNFTのトークンID。
  • burnAuth
    • 発行されたNFTのBurn(破棄)権限。

burnAuth

特定のNFTにBurn(破棄)権限を取得する関数。 引数に渡されたtokenIdのNFTに付与されているBurn(破棄)権限を確認できます。

#補足 SBTは、既存のEIP721規格のNFTの特殊なサブセットとしての役割を果たします。 この設計の利点は、既存のNFTサービスとのシームレスな互換性です。 サービスプロバイダーはSBTをNFTのように扱い、既存のコードを大幅に変更する必要がありません。

非譲渡性

EIP721を拡張した現在のSBTを実装する上での1つの問題は、すべてのTransfer(送付機能)がエラーを投げることです。 より洗練されたアプローチとして、Transfer(送付機能)は引き続きエラーを投げるが、事前にコントラクトに対してSBTインターフェースを実装しているかを確認し、Transfer(送付機能)を呼び出さないようにすることが挙げられます。

Burn権限

インターフェースの使用に関しては最大限柔軟にしています。 そのため、事前に定められたBurn(破棄)ルールは重要です。 以下は異なるBurn(破棄)権限のサンプルシナリオです。

  • IssuerOnly
    • ローン履歴
  • ReceiverOnly
    • 有料会員資格
  • Both
    • 資格情報
  • Neither
    • 信用履歴

Burn(破棄)権限は1つのトークンに関連付けられ、Mint(発行)後に変更はできません。 したがって、トークンがMint(発行)される前に、NFTの受け取り手アドレスに通知し、受け取り手アドレスの同意を得ることが重要です。

Mintイベント

Mint(発行)時には、EIP721のTransferイベントとともにIssuedイベントが発行されます。 この設計により、後方互換性が保持される一方で、これがSBTの発行イベントであることを明確に示すことができます。

キーローテーション

Ethereumのユーザーが抱える懸念は、Burn(破棄)可能なSBTを持つことで、キーローテーションを実現できてしまうことです。

ここでのキーローテーションとは、NFTの所有者が変更できないことを想定しているのに、変更できてしまうことを指します。

SBTの所有者は、NFTの発行者アドレスに通知し、Burn(破棄)権限を持つアドレスがNFTをBurn(破棄)し、発行者アドレスが新しい別のアドレスにレプリカをMint(発行)できます。

後方互換性

この提案は、EIP721と完全に後方互換性があります。

最後に

今回は「SBT(ソウル・バウンド・トークン)のMint(発行)にBurn(破棄)できる権限を付与できるERC5484」についてまとめてきました! いかがだったでしょうか?

実装については今後追記していきます。

質問などがある方は以下のTwitterのDMなどからお気軽に質問してください!

採用強化中!

CryptoGamesでは一緒に働く仲間を大募集中です。

この記事で書いた自分の経験からもわかるように、裁量権を持って働くことができて一気に成長できる環境です。 「ブロックチェーンやWeb3、NFTに興味がある」、「スマートコントラクトの開発に携わりたい」など、少しでも興味を持っている方はまずはお話ししましょう!