2023.10.02
次世代のNFT〜トークンバウンドアカウント(ERC-6551)の解説
こんにちは。次世代システム研究室のL.C.A.です。
はじめに
2017年のNFTスタンダード、ERC721の誕生以来、NFTの開発には大きなブレイクスルーがありませんでした。今年(2023年初)、Future PrimitiveチームのJayden WindleやBenny Giangなどは、Token Bound Accounts(EIP-6551)の提案を行いました(Bennyはまた、CryptoKittiesの共同創設者でもあります)
EIP-6551の提案は、以前の私たちのNFTに対する固有の概念、つまり単なる静的なデジタルアート作品であるという考え方を打ち破ります。NFTの所有者はNFTと紐つけるアカウントを作成することができ、さらにNFTをデジタルウォレット(NFT as a wallet)として考えることもできます。
今回のブログ記事ではToken Bound Accounts(TBA)の詳細な技術的内容に少し掘り下げ、現在のTBA関連のサービスと将来的な発展の可能性について紹介したいと思います。

出典:https://medium.com/@lootadventureweb3/erc6551-is-the-future-bbc2b69f8e2b
ERC-6551の概要
Token Bound Accounts(TBA)は大まかに下記のように理解できます:
- ERC-6551は、NFTにスマートコントラクトアカウントシステムを提供し、これらの作成されたスマートコントラクトアカウント(CA)をToken Bound Accounts(TBA)と呼ぶことができる
- TBAの制御権は基本的にNFTの所有者に結び付けられる
- TBAはスマートコントラクトアカウントのため、ERC-4337のアカウント抽象化の概念を組み合わせることもでき、ユーザーはEoA(外部所有者)を直接保有する必要はなく、コントラクトアカウントを介してTBAを操作することができます。これにより、TBAシステム全体のセキュリティと利便性が向上できる。
簡単的にTBAにもたらされるNFTの変革を紹介します:
- TBAのないNFT
- NFTの所有権を譲渡する場合、単純にそのNFTを譲渡するだけです。
- TBAを使用したNFT
- NFTに関連する情報やデジタル身分と結び付けたTBAは、全て新しいNFTの所有者に直接譲渡されます。

出典:https://www.odaily.news/post/5186273
ERC-6551の応用例
既存NFTの拡張
NFT最大の取引所である「Opensea」では、すでにToken Bound Accounts(TBA)が利用可能です。TBAが付与されたNFTは、TBAを通じて他のNFTやデジタル資産を受け取ることができます。
以下の図のように、NFTの左上にはリュックサックのアイコンが表示されており、クリックするとそのNFTのTBAが所有する関連する資産を確認することができます。

出典:Opensea

出典:Opensea
ブロックチェーンゲーム
NFTを使用してゲームキャラクターを代理することで、ゲームから得られる資産や能力をユーザーのウォレットに蓄積せず、キャラクター自体に結び付けることができます。
投資ポートフォリオ
TBA内でさまざまなNFTや他の暗号資産を保有し、TBAを介して直接資産取引を行うことができます。
デジタル身分証明書
TBAを介して、NFTをデジタル身分証明書として扱うこともできます。
このデジタル身分証明書はさまざまなデジタル身分と結び付けることができ、NFTの所有者の身分を確認するために使用されます。

ERC-6551技術解析
> この部分は、ERC-6551の提案内容に基づいて説明します。
overview
- ERC-6551では、主に2つのコンポーネントが提案されています。
- Registry Contract
- A singleton registry for token bound accounts (TBAのためのシングルトンレジストリ)
- Account Contract
- A common interface for token bound account implementations(TBAの実装に共通のインターフェース)
- Registry Contract
- 以下の図は、NFT、NFT所有者、TBA、およびRegistryの関係を説明しています。
- NFT(ERC-721トークン)は複数のTBAを所有できる
- TBAはプロキシコントラクトであり、詳細なロジックはimplementationコントラクトに実装する必要がある
- ユーザーアカウント(EoAまたはCA)はNFTを所有し、それに関連するTBAを制御できる

出典:https://eips.ethereum.org/EIPS/eip-6551
ERC-6551コントラクト解析
Registry Interface
NFTのTBAを作成や登録し、TBAアドレスを計算するために使用されます。主に2つ関数の実装が必要:
- 1. createAccount関数
- 特定のimplementationアドレスに基づいて、NFT結ぶTBAコントラクトをデプロイや登録する。
- TBAはProxyコントラクトであり、Bytecodeレベルで実装している(ガス代を節約するため)
- TBAコントラクトは、implementationコントラクトを操作するためのエントリーポイントとして機能します。
- 実際TBAの例:とても簡潔なProxyコントラクトですね
-

出典:Etherscan
-
- 2. account 関数
- 特定のimplementationアドレスやパラメータに基づいて、事前にのアドレスを計算できます
- Ethereum上でデプロイされたRegistry Contract例:
- Registryのインタフェース(IERC6551Registry )の解析は下記となります
interface IERC6551Registry {
/**
* @dev The registry SHALL emit the AccountCreated event upon successful account creation
*/
event AccountCreated(
address account,
address indexed implementation,
uint256 chainId,
address indexed tokenContract,
uint256 indexed tokenId,
uint256 salt
);
/**
* @dev NFTに対するTBAを作成する
*
* TBAが既に作成されている場合は、create2を呼び出さずにアカウントのアドレスを返します。
* create2は新しいTBA contractを作成するための関数
*
* initDataが空でなく、アカウントがまだ作成されていない場合は、
* 作成後に提供されたinitDataを使用してアカウントを呼び出します。
*
* AccountCreated eventを発火する
*
* @return TBAのアドレス
*/
function createAccount(
address implementation,
uint256 chainId,
address tokenContract,
uint256 tokenId,
uint256 salt,
bytes calldata initData
) external returns (address);
/**
* @dev TBAのアドレスを計算して返す
*
* @return TBAのアドレス
*/
function account(
address implementation,
uint256 chainId,
address tokenContract,
uint256 tokenId,
uint256 salt
) external view returns (address);
}
Account Interface
ERC-6551では、TBAのimplementationコントラクトのためにもAccount インターフェースが提供されています。
- ERC-6551提案では、以下の制限がaccount implementationにあります。
- All token bound accounts SHOULD be created via the registry.
- All token bound account implementations MUST implement ERC-165 interface detection.
- All token bound account implementations MUST implement ERC-1271 signature validation.
- All token bound account implementations MUST implement the Account interface.
- Accountインターフェースのポイントをまとめしてみます:
- ETHを受け入れる必要がある
- バインドされたNFTの情報を返す必要がある
- 特定のトランザクション(署名者ががサインした低レベルのオペレーション)を実行できる必要がある
- 特定のトランザクションを実行する前に、署名者を検証できる関数の必要があります。
- Account Interface(IERC6551Account、IERC6551Executable )の解析は下記となります
/// @dev the ERC-165 identifier for this interface is `0x6faff5f1`
interface IERC6551Account {
/**
* @dev アカウントがEtherを受け取ることを可能にする
*
* アカウントは`receive`関数を実装する必要がある
*
* Etherを受け取る条件を制限するための任意のロジックを実行することができる
*/
receive() external payable;
/**
* @dev TBAを所有しているNFTのidentifierを返す
*
* この関数の戻り値は常に同じでなければならず、時間の経過と共に変更してはならない
*
* @return chainId トークンが存在するチェーンのEIP-155 ID
* @return tokenContract The contract address of the token
* @return tokenId The ID of the token
*/
function token()
external
view
returns (
uint256 chainId,
address tokenContract,
uint256 tokenId
);
/**
* @dev 特定の署名者の行動を許可するかどうかを示すマジック値を返す
*
* その署名者が有効である場合、bytes4マジック値0x523e3260を返さなければならない
*
* デフォルトでは、NFTの保持者は、有効な署名者と見なされなければなりません
*
* Accounts MAY implement additional authorization logic which invalidates the holder as a
* signer or grants signing permissions to other non-holder accounts
*
* @param signer The address to check signing authorization for
* @param context Additional data used to determine whether the signer is valid
* @return magicValue Magic value indicating whether the signer is valid
*/
function isValidSigner(address signer, bytes calldata context)
external
view
returns (bytes4 magicValue);
}
interface IERC6551Executable {
/**
* @dev Callerは有効な署名者である場合、低レベルの操作を実行できる
*
* Reverts and bubbles up error if operation fails
*
* @param to 操作の対象アドレス
* @param value 対象に送られるEtherの値
* @param data The encoded operation calldata
* @param operation A value indicating the type of operation to perform
*
* Accounts implementing this interface MUST accept the following operation parameter values:
* - 0 = CALL
* - 1 = DELEGATECALL
* - 2 = CREATE
* - 3 = CREATE2
*
* Accounts implementing this interface MAY support additional operations or restrict a signer's
* ability to execute certain operations
*
* @return The result of the operation
*/
function execute(
address to,
uint256 value,
bytes calldata data,
uint256 operation
) external payable returns (bytes memory);
}
まとめ
この記事では、ERC-6551 Token Bound Accountの概要、応用例、および関連する技術について説明しました。
2017年にERC-721が誕生して以来、NFTの発展にはEIP-6551のような重要なイノベーションがほとんどありませんでした。NFTコミュニティはNFTに機能を追加する能力を持っていますが、それはほとんどがオフチェーンでの利用に限定されており、NFTは他のDAppと直接的に連携することが困難でした。
EIP-6551 TBAの概念によって、NFTはデジタルアートだけでなく、デジタルウォレットとしても利用できるようになりました。また、ブロックチェーン上での送金やスマートコントラクトの操作も可能であり、さらにはデジタル身分証明書としても活用できます。
これらの進展により、NFTとブロックチェーンの将来にはさらなる期待が持てると考えられます。
参考
- 【完全保存版】ERC6551とは何か。トークンバウンドアカウントについて学びましょう。
- ERC6551(トークンバウンドアカウント)を学ぼう!
- ERC-6551: Non-fungible Token Bound Accounts
- ERC6551 is the future
- 一文读懂ERC 6551:NFT与DID新范式
最後に
グループ研究開発本部 次世代システム研究室では、最新のテクノロジーを調査・検証しながらインターネット上の高度なアプリケーション開発を行うエンジニア・アーキテクトを募集しています。募集職種一覧 からご応募をお待ちしています。
グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。
Follow @GMO_RD


