# [ERC7513] コントラクトの実行ロジックとNFTを組み合わせたスマートNFTの仕組みを理解しよう！

> スマートNFTというのは、NFT（Non-Fungible Token、非代替トークン）とスマートコントラクトを組み合わせたものです。

- URL: https://cardene.dev/articles/816307d468f85f68d5dd
- 公開日: 2024-03-23
- 更新日: 2024-03-23
- トピック: Blockchain
- タグ: ethereum, solidity, smartcontract, ブロックチェーン

## はじめに

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

https://cryptogames.co.jp/

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

https://cryptospells.jp/

今回は、コントラクトとNFTを組み合わせて、IA-NFTという仕組みでセキュリティを担保しながらNFT自体が特定位の処理を実行できる、スマートNFTの仕組みを提案している**ERC7513**についてまとめていきます！

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

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

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

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

## 概要

スマートNFTというのは、NFT（Non-Fungible Token、非代替トークン）とスマートコントラクトを組み合わせたものです。
この組み合わせによって、NFT自体が特定のロジックやプログラムを実行できるようになり、ブロックチェーン上でさまざまな相互作用を行うことが可能になります。

NFTとは、デジタルアートや音楽、動画などのデジタルアセットを一意に識別するためのトークンで、それぞれがユニークな価値を持ち、交換可能ではない（つまり、1つ1つが独自のアイテムとして認識される）特徴があります。

一方で、スマートコントラクトはブロックチェーン上で自動的に実行される契約やプログラムです
事前に定義された条件が満たされると、自動的に特定のアクション（例えば、支払いの実行や権利の移転など）が実行されます。

従来のNFTは、所有権の証明やデジタルアイテムの識別に使用されるだけでしたが、スマートNFTでは、これらのNFTにスマートコントラクトのロジックを組み込むことで、より複雑な機能や相互作用を実現できるようになります。
例えば、特定の条件下でのみアクセスを許可するデジタルコンテンツの管理や、自動的にロイヤリティを分配する機能などが考えられます。

この変化を「**一般的な固定電話からスマートフォンへの進化**」と例えています。
固定電話が基本的な通話機能に限定されていたのに対して、スマートフォンでは通話だけでなくアプリを通じてさまざまな機能やサービスにアクセスできるようになったことに似ています。
つまり、スマートNFTは従来のNFTよりもはるかに多様でインテリジェントな活用が可能になる、ということです。

## 動機

Ethereumはスマートコントラクトを導入し、ブロックチェーンの革命をもたらし、分散型アプリケーション（dApps）の繁栄するエコシステムの道を開きました。
さらに、**ERC721**を通じて非代替トークン（NFT）の概念が導入され、所有権確認のための新しいパラダイムが提供されました。

:::message
**ERC721**については以下の記事を参考にしてください。
:::

https://chaldene.net/erc721

しかし、スマートコントラクトはまだ多くのユーザーにとって大きな障壁を持っており、NFTは主にアート、ゲーム、リアルワールドアセットの分野内での反復的な探求に限定されています。

スマートコントラクトとNFTの機能的な応用の広範な普及は、依然として大きな課題に直面しています。
この矛盾から次のような事実が浮かび上がっています。

- **インテリジェンスと利便性への強い願望が、ユーザーにセキュリティの犠牲を強いてる**
    - 例えば、ユーザーが自分のプライベートキーをボットと共有することで、使いやすさを求めてセキュリティを犠牲にしています。
- **個々の開発者にとって、機能を市場で売り出せる製品に変えるプロセスは、十分なリソースの不足によって妨げになる**
    - 開発者が革新的なアイデアを実現し、広く市場に提供するには、大きなリソースが必要ですが、これが足りないことが問題となっています。
- **「コードが法律である」という哲学の文脈において、スマートコントラクト/コードの所有権を安全に移転するためのオンチェーンインフラストラクチャが不足している**
    - この哲学は、ブロックチェーン上で実行されるすべてのコードが最終的なルールであるという考え方ですが、この環境で安全に権利を移転するための十分な基盤がないという問題があります。

:::message
Ethereumとその革新的な技術は巨大な可能性を秘めていますが、それを最大限に活用するための課題も多く存在します。
利便性とセキュリティのバランス、開発者のリソース不足、そして「**コードが法律**」という哲学がある環境での安全な権利移転の確保など、解決すべき問題があります。
:::

IA-NFT（Intent Abstraction Non-Fungible Token）という新しい概念について説明しています。
これは、従来のNFTの使用方法と、ブロックチェーン上のスマートコントラクトとの相互作用を革新する試みです。

#### セキュリティと利便性
IA-NFTはスマートコントラクトの鍵として機能します。
プライベートキーがないため、プライベートキーの漏洩リスクがありません。
従来のブロックチェーン取引では、プライベートキーはアカウントのセキュリティと直接結びついており、このキーが漏洩すると資産が盗まれるリスクがありました。
IA-NFTを使用することで、このリスクを排除し、同時にスマートコントラクトへのアクセスを簡単にすることができます。

#### ネイティブオンチェーンアセットとしてのIA-NFT
長年、NFTは画像、アート作品、ゲームアイテム、リアルワールドアセットの所有権を表すものとして立ってきました。
しかし、これらのアセットは実際には暗号ネイティブではありません。
IA-NFTは、コード片やスマートコントラクトの所有権を検証することで、これを変えます。
これにより、ブロックチェーン上の資産やロジックそのものの所有権を直接的に表現できるようになります。

#### Intentの抽象化のためのインタラクション抽象化
オンチェーンの相互作用は、多くの機能モジュールIA-NFTに抽象化することができ、その結果、インタラクションプロセスをより効果的にします。
ユーザーは、異なるdApps間でどのように操作するかについて心配することなく、自分のしたいことにより集中できるようになります。
これは、ブロックチェーンの技術を使って特定の目的を達成しようとする際に、ユーザーが直面する複雑さを減少させます。

:::message
ブロックチェーンの文脈での「**インテント（Intent）**」は、ユーザーやシステムが達成したい具体的な目的や意図を指します。
ブロックチェーン技術において、特にスマートコントラクトやトランザクションを通じて、この「**インテント**」は非常に重要な役割を果たします。

#### インテントの基本
- **ユーザーの意図**
    - ユーザーがブロックチェーン上で行いたい具体的なアクション。
    - 例えば、ある暗号通貨を別のアドレスに送信する、特定の条件下でスマートコントラクトを実行するなどがあります。
- **システムの意図**
    - アプリケーションやスマートコントラクトが自動的に実行するアクション。
    - 例えば、特定のトリガーが発生したときに自動的にトランザクションを実行するなどです。

#### ブロックチェーンにおけるインテントの役割
- **トランザクションの実行**
    - ユーザーは、特定のトランザクションを送信することで、自身のインテント（例: 送金、購入、コントラクトの実行）をブロックチェーン上で実現します。
    - トランザクションは、このインテントをコード化し、ネットワーク上で実行可能にします。

- **スマートコントラクトの活用**
    - スマートコントラクトは、インテントをプログラム可能なロジックとして表現します。
    - これにより、ユーザーはより複雑な条件や契約を自動的に実行させることができます。

- **ディセントラライズドアプリケーション (dApps) との相互作用**
    - dAppsは、複数のスマートコントラクトとユーザーインターフェイスを組み合わせたアプリケーションです。
    - ユーザーのインテントは、dAppsを通じてブロックチェーン上のスマートコントラクトと相互作用することで実現されます。

#### インテントの重要性
ブロックチェーンの文脈におけるインテントの明確化は、セキュリティ、透明性、効率性を確保するために重要です。
インテントに基づいて設計されたスマートコントラクトやトランザクションは、ユーザーが期待する結果を正確に反映し、意図しないアクションの実行を防ぎます。

ブロックチェーンにおける「**インテント**」は、ユーザーやシステムが特定のアクションを実行しようとする時の基本的な目的や目標を表します。
この明確な目的の表現により、トランザクションやスマートコントラクトを通じて、より安全で信頼性の高いブロックチェーンの利用が可能になります。
:::

IA-NFTはブロックチェーンとスマートコントラクトの相互作用をより安全で、直感的で、ユーザーフレンドリーにするための新しい手法です。
これにより、ユーザーは自分の資産とアクションをより直接的かつ安全にコントロールできるようになり、ブロックチェーンテクノロジーのさらなる普及と応用が期待されます。

## 仕様

スマートNFT（Smart-NFT）、スマートマネージャー（Smart-Manager）、Intentプロキシ（Intent-Proxy）という3つの主要なオブジェクトのインターフェース仕様を定義し、開発者（developer）、検証者（verifier）、ユーザー（user）という3つの主要なロールとこれらのオブジェクトとの間の相互作用関係を確立します。

#### 主要オブジェクト
- **スマートNFT (Smart-NFT)**
    - スマートコントラクトのロジックを実行可能なNFTです。
    - これにより、NFTは単なるデジタルアセットの証明以上の機能を持ち、特定の条件下でアクションを自動実行する能力を持ちます。

- **スマートマネージャー (Smart-Manager)**
    - スマートNFTや他のブロックチェーンオブジェクトの管理を行うためのシステムまたはプログラムです。
    - これは、スマートNFTの作成、更新、削除などを含む管理機能を提供します。

- **Intentプロキシ (Intent-Proxy)**
    - ユーザーのしたいことをオンチェーンのアクションに変換するためのインターフェイスです。
    - ユーザーが何を達成したいかという意図を受け取り、それに基づいて適切なスマートNFTのアクションを実行します。

#### 主要役割と相互作用
- **開発者 (Developer)**
    - スマートNFTやスマートマネージャーの開発を行います。
    - これらのオブジェクトがどのように機能するか、どのようなインターフェースを持つかを定義します。

- **検証者 (Verifier)**
    - スマートNFTやスマートマネージャーの機能が正しく動作することを検証します。
    - これは、セキュリティの検証やバグの検出を含むことがあります。

- **ユーザー (User)**
    - スマートNFTやIntentプロキシを通じて特定のアクションを実行するエンドユーザーです。
    - 彼らのIntentは、Intentプロキシを介してスマートNFTに伝えられ、適切なアクションが実行されます。

スマートNFTエコシステムは複数のコンポーネントとロールから成り立っており、それぞれが相互に作用しながら全体としての機能を実現していることがわかります。
開発者、検証者、ユーザーはそれぞれ異なる責任を持ち、スマートNFT、スマートマネージャー、Intentプロキシというオブジェクトは、ブロックチェーン上でよりインテリジェントかつ効率的な相互作用を実現するために設計されています。

![workflow.png](/images/qiita-4f753786-e314-a9dd-6c0f-2d88278db10a.webp)
引用: https://eips.ethereum.org/EIPS/eip-7513

### Smart-NFTインターフェース

スマートNFTを作成し、スマートマネージャーに登録リクエストを送信する前に、開発者はスマートNFTで以下の二つのインターフェイスを実装する必要があります。

#### `execute`関数
この関数は、特定のスマートNFTに必要なパラメータをカプセル化した`bytes`型の単一パラメータのみを含む必要があります。
実装中に`validatePermission`を呼び出して、この呼び出しが正当かどうかを判断する必要があります。
これにより、スマートNFTが特定のアクションを実行する前に、権限が適切に検証されることを確保します。

#### `validatePermission`関数
この関数は、呼び出し元がスマートNFTを呼び出す権限があるかどうかを判断するために、スマートマネージャーに問い合わせます。
スマートNFTが正常に検証され、呼び出し可能であるかどうかを確認するために使用されます。

```ts
interface ISmartNFT {
  function execute(bytes memory data) external payable returns (bool);

  function validatePermission() external view returns (bool);
}
```

このインターフェイスは、スマートNFTがどのように機能するか、そしてスマートマネージャーとどのように連携するかについてのコントラクトを定義しています。
`execute`関数によってスマートNFTの主要なロジックが実行され、`validatePermission`関数によってそのロジックの実行が許可されているかどうかが確認されます。
これらの関数は、スマートNFTが正しく、安全に動作するための基盤を提供します。

### Smart-Managerインターフェース

このインターフェイスは、スマートNFTの管理とその状態の管理を担うものです。
スマートNFTには、以下の5つの状態が定義されています.

- **UNREGISTERED（未登録）**
    - スマートマネージャーにまだ登録されていないスマートNFTを指します。
- **DEREGISTERED（登録解除）**
    - 以前に登録されたが、スマートマネージャーから削除されたり登録解除されたりしたスマートNFTを示します。
- **UNVERIFIED（未検証）**
    - スマートマネージャーに登録されているが、まだ検証プロセスを経ていないスマートNFTを意味します。
- **VERIFIED（検証済み）**
    - スマートマネージャーに登録され、検証プロセスに成功したスマートNFTを表します。
    - これは、使用しても安全であることを示します。
- **DENIED（拒否）**
    - 登録はされたものの、検証プロセスに失敗したスマートNFTを指します。
    - セキュリティリスクをもたらす可能性があるため、使用すべきではありません。

スマートマネージャーは、以下の3つの核心的なインターフェイスを実装する必要があります。

#### register（登録）
開発者は、このインターフェイスを通じてスマートNFTの登録リクエストを行い、スマートNFTの作成コードを提供できます。
リクエストが成功すると、スマートNFTは「**UNVERIFIED（未検証）**」としてマークされる必要があります。

#### auditTo（監査）
信頼された検証者のみがこのインターフェイスを使用してスマートNFTを監査し、その状態を「**Verified（検証済み）**」または「**Denied（拒否）**」に変更できるようにする必要があります。

#### isAccessible（アクセス可能か）
特定のスマートNFTをユーザーが使用できるかどうかを判断するために使用されるインターフェイスです。
判断には、対応するtokenId NFTの所有権と、スマートNFTが正常に検証されたかどうかの両方を考慮する必要があります。

#### verificationStatusOf（検証状況）
指定されたスマートNFTの現在の検証段階を返す関数です。

これらのインターフェイスと状態は、スマートNFTが安全に管理され、適切に検証されることを保証するために重要です。
これにより、ユーザーと開発者は、使用するスマートNFTが信頼できるかどうかを容易に判断できます。

Smart-Managerの実装は**ERC1155**を継承する必要があります。

:::message
**ERC1155**については以下の記事を参考にしてください。
:::

https://chaldene.net/erc1155

```ts
interface ISmartManager {
  enum VerificationStatus {
      UNREGISTERED,
      DEREGISTERED,
      UNVERIFIED,
      VERIFIED,
      DENIED
  }

  function register(
      bytes calldata creationCode,
      uint256 totalSupply
  ) external returns (uint256 tokenId, address implAddr);

  function auditTo(uint256 tokenId, bool isValid) external returns (bool);

  function isAccessible(
      address caller,
      uint256 tokenId
  ) external view returns (bool);

  function verificationStatusOf(
      uint256 tokenId
  ) external view returns (VerificationStatus);
}
```

#### `register`

```javascript
function register(
    bytes calldata creationCode,
    uint256 totalSupply
) external returns (uint256 tokenId, address implAddr);
```

**概要**

スマートNFTを登録する関数。

**詳細**

この関数は、新しいスマートNFTをスマートマネージャーに登録するために使用されます。
登録プロセスが成功すると、スマートNFTは「**UNVERIFIED（未検証）**」の状態になります。
この関数を通じて、スマートNFTの作成コードと総供給量を提供する必要があります。

**引数**

- `creationCode`
	- スマートNFTの作成に使用されるバイトコード。
- `totalSupply`
	- スマートNFTの総供給量。

**戻り値**

- `tokenId`
	- 登録されたスマートNFTのトークンID。
- `implAddr`
	- スマートNFTの実装アドレス。

---

#### `auditTo`

```javascript
function auditTo(uint256 tokenId, bool isValid) external returns (bool);
```

**概要**

スマートNFTの検証状態を更新する関数。

**詳細**

信頼された検証者が、特定のスマートNFTの検証状態を「**VERIFIED（検証済み）**」または「**DENIED（拒否）**」に変更するために使用します。
`isValid`パラメータが`true`の場合は「**VERIFIED**」に、`false`の場合は「**DENIED**」に状態が変更されます。

**引数**

- `tokenId`
	- 検証状態を更新するスマートNFTのトークンID。
- `isValid`
	- 検証が成功したかどうかを示すブール値。

**戻り値**

- 成功した場合は`true`を返します。

---

#### `isAccessible`

```javascript
function isAccessible(
    address caller,
    uint256 tokenId
) external view returns (bool);
```

**概要**

特定のスマートNFTが指定されたアドレスによってアクセス可能か判断する関数。

**詳細**

この関数は、特定のユーザー（**caller**）が指定されたスマートNFTにアクセスする権限があるかどうかを確認するために使用されます。
アクセス権の判断は、ユーザーがそのスマートNFTの所有者であるか、およびスマートNFTが「**VERIFIED（検証済み）**」の状態であるかに基づいて行われます。

**引数**

- `caller`
	- アクセス権を確認するアドレス。
- `tokenId`
	- アクセス権を確認するスマートNFTのトークンID。

**戻り値**

- 指定されたアドレスがスマートNFTにアクセス可能である場合は`true`、そうでない場合は`false`を返します。

---

#### `verificationStatusOf`

```javascript
function verificationStatusOf(
    uint256 tokenId
) external view returns (VerificationStatus);
```

**概要**

指定されたスマートNFTの現在の検証状態を返す関数。

**詳細**

この関数は、指定されたスマートNFTの現在の検証状態（「**UNREGISTERED**」、「**DEREGISTERED**」、「**UNVERIFIED**」、「**VERIFIED**」、「**DENIED**」のいずれか）を取得するために使用されます。

**引数**

- `tokenId`
    - 検証状態を取得したいスマートNFTのトークンID。

**戻り値**

指定されたスマートNFTの検証状態です。

### Intent-Proxyインターフェース

```ts
interface IIntentProxy {
  struct Action {
      uint256 tokenId;
      bytes executeParam;
  }

  function executeIntent(
      Action[] calldata actions
  ) external payable returns (bool);
}
```

Intent-Proxyインターフェイスは、特定のスマートNFTに対するアクションを実行するための仕組みを定義します。
このインターフェイスにより、ユーザーは複数のスマートNFTを効率的に利用することができるようになります。

#### Action構造体

Intent-Proxyインターフェイスでは、`Action`という構造体を定義しています。
この構造体は以下のフィールドを持ちます：

- `tokenId`
    - 対象のスマートNFTのNFT IDを表します。
    - これにより、どのスマートNFTに対してアクションを実行するかを指定します。
- `executeParam`
    - 対象のスマートNFTの`execute`関数に渡されるパラメータです。
    - このパラメータは、実行したいアクションの詳細をエンコードしたものです。

#### `executeIntent`関数

```javascript
function executeIntent(
    Action[] calldata actions
) external payable returns (bool);
```

**概要**

ユーザーが指定した複数のスマートNFTに対してバッチ処理としてアクションを実行できるようにする関数。

**詳細**

`executeIntent`関数を使うことで、ユーザーは一度の呼び出しで複数のアクションを指定し、それらをバッチ処理として実行することができます。
これは、特定のスマートNFTに対する操作を一括で行いたい場合に特に便利です。
例えば、複数のスマートNFTに同じ操作を適用する、または異なる操作を一連の流れとして実行する場合などです。

**引数**

- `actions`
    - 実行したいアクションの配列。
    - 各アクションは`Action`構造体で定義され、対象のスマートNFTのIDと実行するアクションのパラメータを含みます。

**戻り値**

- アクションが成功した場合は`true`を返します。

このインターフェイスにより、ユーザーは複数のスマートNFTに対する複雑な操作を簡単かつ効率的に行うことが可能になります。
これは、ブロックチェーン上でのインタラクションの柔軟性と効率性を大きく向上させるものです。

## 補足

### ERC1155を使用する理由

**ERC1155**をスマートNFTのメインコントラクトとして選択した理由について説明します。
技術実装の側面で、スマートNFTの再利用性を高めるために、**ERC1155**が選ばれました。
この選択の背景には、**ERC721**と**ERC1155**がどちらもNFTを指し示す「**トークンID**」という概念に基づいている点があります。
ただし、重要な違いは、**ERC1155**が「**シェア**」という概念を導入している点です。
少なくとも一つのシェアを持っていることが、そのスマートNFTの機能を使用する権利を与えることを意味します。
この概念は、同じモデルの複数のスマートフォンを所有している場合に似ており、複数のスマートフォンを持っていても追加の機能が与えられるわけではなく、各個別のデバイスの機能を使用できるだけです。

新しいNFT標準を定義する代わりに直接**ERC1155**を使用するもう一つの理由は、スマートNFTのトランザクション挙動を既存のマーケットにシームレスに統合することができる点です。
このアプローチは、開発者とユーザーの双方に利益をもたらし、現在のエコシステムへのスマートNFTの採用を簡素化します。

:::message
**ERC1155**はスマートNFTの機能をより効率的に、また再利用可能な方法で利用することを可能にします。
また、既存のマーケットとの統合を容易にすることで、スマートNFTの普及と採用を促進します。
:::

### 検証者

スマートNFTコードを監査・検証する役割として、検証者（Verifiers）が重要な役割を果たすプロトコルについて説明しています。
しかし、分散型の検証者が直面するいくつかの課題も指摘しています。

#### 検証者の責務
検証者は、スマートコントラクトコードのセキュリティ、機能性、およびコンプライアンスを評価する責任があります。
この業務は、プロのプログラミングスキル、ブロックチェーン技術に関する知識、コントラクトの専門知識を要求します。
検証者は、コードに脆弱性がないことを保証する必要があります。

#### 分散型検証者が直面する課題
- **専門知識の必要性**
    - 検証者の役割には特化した専門知識が必要であり、一般の人々には容易にアクセスできるものではありません。
   
- **権威と信頼性に関する課題**
    - 中央集権的なモデルでは、特定の監査機関や専門家がこのタスクを遂行することを信頼できます。
    - しかし、分散型環境では、検証者の専門知識と誠実さを判断することが難しくなります。
    - これは、誤った監査を招く可能性があり、全体の安定性と信頼性を損なうことさえあり得ます。

- **調整と管理の課題**
    - 中央集権的なモデルでは、検証者の管理と監督の責任は比較的単純です。
    - しかし、分散型環境では、さまざまな検証者の作業を調整し、異なる契約とコードにわたって監査の一貫性を確保することが大きな課題となります。

:::message
このプロトコルでは検証者が非常に重要な役割を担っていますが、特に分散型環境では様々な課題に直面しています。
これらには、必要な専門知識のアクセシビリティ、権威と信頼性の確保、そして調整と管理の効率化が含まれます。
:::

### 著作権侵害問題

コードの著作権侵害という問題についての2つの主要な観点を提供しています。

#### 単純過ぎるコードの著作権侵害は無意味

最初の観点は、非常に単純なコードについては、著作権侵害の議論がほとんど無意味であるということです。
例えば、「**Hello World**」プログラムのような基本的なコードは、非常にシンプルであるため、誰もが独立して作成可能です。
このようなコードは、十分な革新性や価値がなく、法的保護を必要としないため、その著作権侵害について議論することは時間とリソースの無駄です。

#### 複雑または創造的なコードはオープンソースライセンスによって保護される

二番目の観点は、コードが十分に複雑であるか創造的であれば、オープンソースライセンス（OSI）を通じて法的保護を得ることができるということです。
オープンソースライセンスは、開発者が自分のコードを共有し、使用条件を指定する方法です。
GNU一般公衆ライセンス（GPL）やマサチューセッツ工科大学（MIT）ライセンスなどの一般的なオープンソースライセンスにより、元のコードの作成者は知的財産権を保持しつつ、他の人がコードを使用・変更できるようになります。
このアプローチは、複雑で価値のあるコードを保護しながら、イノベーションと共有を促進します。

:::message
非常にシンプルなコードに対する著作権侵害の懸念はほとんど意味をなさず、複雑または創造的なコードはオープンソースライセンスによって効果的に保護されることができます。
これにより、開発者は自分の作業を安心して共有し、コミュニティ全体の成長とイノベーションを促進することができます。
:::

## 互換性

この提案は、既存の**ERC1155**プロトコルとのできる限り高い互換性を確保することを目指しています。
**ERC1155**に存在する全ての機能、**ERC165**の検出やスマートNFTのサポートを含め、保持されます。
これには、現在のNFT取引プラットフォームとの互換性も含まれます。

:::message
**ERC165**については以下の記事を参考にしてください。
:::

[\[ERC165\] コントラクトが特定のインターフェースをサポートしているか確認する仕組みを理解しよう！](/articles/541184977a5cba51b759)

スマートNFTに関して、この提案は`execute`関数の提供のみを要求します。
これは、既存のプロキシコントラクトがこのインターフェイスにのみ焦点を当てる必要があることを意味し、スマートNFTの統合をより簡単かつ効率的にします。

:::message
この提案は、既存の**ERC1155**プロトコルの機能をそのまま維持しつつ、スマートNFTをサポートする新たな機能を追加することを目指しています。
重要な点は、スマートNFTをよりシンプルに統合するために、`execute`関数の実装のみが必要であるということです。
これにより、開発者はスマートNFTを既存のシステムやプラットフォームに簡単に組み込むことができ、NFT取引プラットフォームとの互換性も保証されます。
:::

## 実装

以下に実装コードが格納されています。

https://github.com/TsengMJ/EIP-7513_Example

## セキュリティ

スマートNFTのセキュリティに関する検討事項について説明しています。

#### 悪意のある検証者

プロトコルにおいて、スマートNFTの検証フェーズでは外部の検証者が保証を提供しますが、この構造は悪意のある検証者が意図的に悪質なスマートNFTを承認する可能性に関する懸念を引き起こします。
このリスクを軽減するためには、より厳格な検証メカニズムの実装、検証者のフィルタリング、罰則措置の導入、あるいはより厳しいコンセンサス基準の設定が必要です。
これにより、悪意のある行為を抑制し、システム全体の信頼性を高めることができます。

#### 予期せぬ検証エラー

悪意のある検証者の問題とは別に、スマートNFTの実装が複雑すぎる場合やSolidityコンパイラに脆弱性がある場合など、検証フェーズでの検出漏れが発生する可能性もあります。
この問題に対処するためには、コントラクトの監査を支援する追加のツールを使用するか、`auditTo`インターフェースに対する複数の検証者による監査を実施することで、その発生確率を減らすことができます。
これにより、システムが予期しないエラーによって危険にさらされるリスクを低減することができます。

:::message
これらのセキュリティ検討事項は、スマートNFTシステムの信頼性と安全性を保持するために不可欠です。
悪意のある検証者によるリスクと予期せぬ検証エラーの可能性を最小限に抑えることによって、より安全で信頼性の高いブロックチェーンエコシステムの構築に貢献します。
:::

## 引用

MJ Tseng (@TsengMJ) <tsngmj@gmail.com>, Clay (@Clay2018) <clay.uw@outlook.com>, Jeffery.c <jeffery.c@a3sprotocol.xyz>, Johnny.c <johnny.c@a3sprotocol.xyz>, "ERC-7513: Smart NFT - A Component for Intent-Centric [DRAFT]," Ethereum Improvement Proposals, no. 7513, September 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7513.

## 最後に

今回は「コントラクトとNFTを組み合わせて、IA-NFTという仕組みでセキュリティを担保しながらNFT自体が特定位の処理を実行できる、スマートNFTの仕組みを提案している**ERC7513**」についてまとめてきました！
いかがだったでしょうか？

質問などがある方は以下の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
