[ERC4950] コントラクトアカウントの機能つきNFTの仕組みを理解しよう！

# はじめに

『DApps開発入門』という本や色々記事を書いているかるでねです。

https://amzn.asia/d/gxvJ0Pw

今回は、コントラクトアカウントの操作権限をERC721形式のNFTに委任する仕組みを提案している**ERC4950**についてまとめていきます！

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

https://eips.ethereum.org/EIPS/eip-4950

他にも様々なEIPについてまとめています。

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4

# 概要

**ERC4950**は、スマートコントラクトウォレットの操作権限を、ペアになった2つの**ERC721**トークンを使って委任（デリゲート）するインターフェースを提案しています。

この仕組みにより、NFTを購入した人がウォレットへのアクセス権を得るといったように、NFTを媒介にした所有権や使用権の移譲が可能になります。

# 動機

**ERC4950**は、NFTを通じてウォレットを共有・委譲する簡単な仕組みを提供しています。
具体的には、以下のような目的やユースケースが想定されています。

1. アーティストとNFT購入者との永続的な関係性の構築

    例えば、アーティストTが作品Pを作成し、それに紐づくNFTペア（AとB）を発行します。
    TはAを保有したまま、Bを購入者に譲渡します。
    このとき、AとBはエンタングルドトークンであるため、一方の動きが他方に可視化されるようになっています。
    これにより、作品の真正性や作者による証明がオンチェーンで行えるようになります。

2. アート作品と作者の永続的な紐づけ

    別のユースケースでは、ユーザーUが自身のアート作品を最初からエンタングルドトークンAとして発行して販売します。
    その時、対応するBはUのウォレットに残しておきます。
    こうすることで、作品の所有者が変わっても作者との関係が保たれ続けます。

## 応用例・期待される利用シーン

- NFTの著作証明・アート創作における作者性の保証

誰が作品を作ったか、トークンを通じて可視化される仕組みです。

- ロイヤリティ配布の基盤

作者が保有するエンタングルドトークンを基に、自動的なロイヤリティ分配が可能になります。

- 作品の真正性の担保

作者のみが正当なトークンを発行できるようにすれば、例えば「**限定1000枚**」のような発行数制限も容易に行えます。

- Usowner（使用者かつ部分的所有者）モデル

NFTの使用者がその一部を所有するという、新しい所有権の形を提供します。

- 所有権の再定義

物理的な引き継ぎを伴わず、NFTを購入するだけで所有権を得る構造を構築できます。

- アイデンティティとの関連付け

特定のエンタングルドトークンを持っていることで、ある人と証明書・資格などが紐づく設計が可能です。

- 価値保持者（Value Reservers）

トークンがある種の価値を保持し、価値の保管・証明に使えるようになります。

# 仕様

**ERC4950**で定義される「エンタングルドトークン」は、以下のような特徴と動作を持つ**ERC721**トークンです。

## トークンのミントは2つだけ

**ERC4950**で提案されているコントラクトは、デプロイ時にトークンID `0` と `1` の2つだけをMintします。
つまり、トークンの数は常に固定で増えることはありません。

この構造により、ペアとなる2つのNFTが互いに密接な関係を持ち、そのペアがコントラクトのアクセス制御や操作の基盤になります。

## ウォレット機能付きERC721

このエンタングルドトークンコントラクトは、通常のNFTコントラクトであると同時に、コントラクトウォレットとしても機能します。
つまり、コントラクト自体が**ERC20**トークンなどの資産を保有し、それをエンタングルドトークンの保有者が操作できる仕組みを持っています。

具体的には、トークンの所有者（`tokenId 0` または `tokenId 1` を持つアドレス）がウォレットを操作できるように設計されています。

## `tokenTransfer`

このコントラクトには、内部に保有している**ERC20**トークンを送金する関数が定義されています。

```solidity
function tokenTransfer(IERC20 token, address recipient, uint256 amount) public onlyOwners;
```

#### 引数

- `IERC20 token`
    - コントラクト内から送金したい**ERC20**トークンのコントラクトアドレス。
- `address recipient`
    - 送金先アドレス。
- `uint256 amount`
    - 送金するトークンの数量。

#### アクセス制御

この関数は `onlyOwners` 修飾子によって制限されており、`tokenId 0` または `tokenId 1` の所有者のみが実行可能です。
これにより、他のユーザーが勝手に資産を動かすことはできません。

# 補足

## ERC721を選んだ理由

**ERC721**は現在、OpenSeaやBlurなどの主要なNFTマーケットプレイスで最も広くサポートされているNFT規格です。
そのため、エンタングルドNFTもこの標準に準拠することで、以下のような利点が得られます。

- **既存のマーケットプレイスでそのままリスト可能**  

新しいインターフェースや独自規格ではなく、**ERC721**を使うことでそのままマーケットプレイスに出品できます。

- **購入者がNFTを受け取ることで、対応するウォレットの権限も自動的に得られる**  

トークンの送付によりコントラクトウォレットの権限が動的に移る仕組みが成り立ちます。

## ERC1155の選択肢もあるが今回は採用しない理由

**ERC1155**も技術的には利用可能で、複数のトークンタイプ（FTとNFT）を扱える点では利便性があります。
しかし、**ERC721**の方が以下の点で今回のユースケースに適していると判断されました。

- 各エンタングルドトークンが唯一無二のペアであることを明確に表現できる
- マーケットプレイスとの即時の互換性・実用性が高い

## ウォレット機能とマーケットプレイスの橋渡し

**ERC4950**のコアとなるのは、「NFTを購入する」という行為が、同時にウォレットの利用権限を手に入れることを意味する点です。
つまり、NFTが単なる画像ファイルの所有権ではなく、スマートコントラクトの機能（**ERC20**送金や他NFTの管理など）へのアクセスキーの役割を果たします。

このように、**ERC721**を使ってエンタングルドNFTを実現することで、ユーザーは通常のNFT取引の延長線上で、スマートウォレットのような高度な機能を簡単に扱えるようになります。
これはWeb3 UXの大きな改善にもつながります。

# 参考実装

`constructor`でトークンを2つだけ発行し、発行したトークンのプロパティを`true`に設定します。

```js
bool private _minted;

constructor(string memory name, string memory symbol, string memory base_uri) ERC721(name, symbol) {
        baseUri = base_uri;
        _mint(msg.sender,0);
        _mint(msg.sender,1);
        _minted = true;
    }

function _mint(address to, uint256 tokenId) internal virtual override {
    require(!_minted, "ERC4950: already minted");
    super._mint(to, tokenId);
}
```

NFTの所有者が、コントラクトが所有している他の**ERC20**トークンを操作できるように、機能を追加します。

```js
    modifier onlyOwners() {
        require(balanceOf(msg.sender) > 0, "Caller does not own any of the tokens");
        _;
    }

function tokenTransfer(IERC20 token, address recipient, uint256 amount) public onlyOwners {
        token.transfer(recipient, amount);
    }
```

# 引用

Víctor Muñoz (@victormunoz), Josep Lluis de la Rosa (@peplluis7), Easy Innova (@easyinnova), "ERC-4950: Entangled Tokens [DRAFT]," Ethereum Improvement Proposals, no. 4950, March 2022. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-4950.

# 最後に

今回は「コントラクトアカウントの操作権限をERC721形式のNFTに委任する仕組みを提案している**ERC4950**」についてまとめてきました！
いかがだったでしょうか？

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

[Twitter @cardene777](https://twitter.com/cardene777)

他の媒体でも情報発信しているのでぜひ他も見ていってください！

https://chaldene.net/

https://zenn.dev/heku

https://cardene.substack.com/

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4