[ERC7521] コントラクウォレットに対応した新しいIntent標準の仕組みを理解しよう！

# はじめに

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

https://cryptogames.co.jp/

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

https://cryptospells.jp/

今回は、ブロックチェーン上での意図(Intent)を管理するための標準化されたエントリーポイントコントラクトを提案し、スマートコントラクトウォレットが新しいIntent標準に対応するために頻繁にアップグレードする必要をなくし、代わりに一元的なエントリーポイントが署名の検証と意図データの処理の仕組みである**ERC7521**についてまとめていきます！

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

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

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

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

# 概要

ブロックチェーン技術、特にスマートコントラクトを使用してユーザーの意図（**UserIntent**）を効率的に処理する新しい方法について述べています。
具体的には、Ethereumなどのブロックチェーン上で、ユーザーの意図を処理し、最大限の価値抽出（MEV: Miner Extractable Value）を実現するためのシステムを説明しています。

### 全体像

ブロックチェーン上でユーザーは様々な意図（例えば、通貨の送金、スマートコントラクトの実行など）を持ちます。
これらの操作を実行するためには、通常、特定のスタンダード（規格やプロトコル）に基づいたスマートコントラクトを使用します。
しかし、新しいスタンダードが次々と登場する中で、これらに対応するためにはスマートコントラクトを常に更新し続ける必要があります。
この問題を解決するために、「**generalized intent specification entry point contract**」が提案されています。

### プロセス

1. **一般化されたエントリポイントコントラクト**
    - これは、ユーザーが意図（**UserIntent**）に署名する時に指定するスマートコントラクトです。
    - このコントラクトは、新しい標準に対応するための中央集権的な更新を必要とせず、署名の検証を行い、低レベルのIntentデータの処理をユーザーが指定した他のコントラクトに委任します。

2. **UserIntentのゴシップ**
    - 署名されたメッセージ（**UserIntent**）は、MEVサーチャーが調査し、自身の**UserIntent**と組み合わせて「**IntentSolutionオブジェクト**」を作成して実行します。

:::note info
### MEVサーチャー
MEVとは「**Miner Extractable Value**」の略で、ブロックチェーンの取引からマイナーやバリデーターが追加で利益を得ることができる価値のことを指します。
これを行う人たちをMEVサーチャーと呼びます。

### MEVサーチャーの活動

MEVサーチャーの主な活動は、ブロックチェーン上で未確認の取引を探し、これらの取引から追加の利益を得る方法を見つけることです。
これには以下のような方法があります。

- **取引の先回り（Front-running）**
    - 他の人が行おうとしている取引を見て、自分が先に同じ取引を行い利益を得る行為です。
- **バックランニング**
    - 特定の取引の直後に自分の取引を行うことで利益を得る行為です。
- **取引の組み合わせ**
    - 複数の取引を組み合わせることで、それぞれ単独で行うよりも高い利益を得ることです。
- **アービトラージ**
    - 異なる取引所間での価格差を利用して利益を得ることです。

### MEVサーチャーの重要性

MEVサーチャーはブロックチェーンのエコシステムにおいて重要な役割を担っています。
市場の効率性を高め、価格の一貫性を保つのに役立ちます。
しかし、MEVの追求が過度になると、ネットワークの過負荷や取引の不公平な優先順位付けなど、いくつかの問題を引き起こす可能性もあります。
:::

https://ethereum.org/ja/developers/docs/mev/#mev-extraction

https://medium.com/@vita.research00/%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%AA%E3%82%A2%E3%83%A0%E3%81%AE%E5%BF%9C%E7%94%A8-mev%E7%B7%A8-7ab4510646d8

:::note info
ブロックチェーンでは、ユーザーが行いたい操作（例えば、トークンの送金やスマートコントラクトとのやり取りなど）を「**Intent（意図）**」として表現します。
これらのIntentをブロックチェーン上で実行するためには、まず「**署名**」する必要があります。
これにより、操作がそのユーザーによって本当に望まれているものであることが証明されます。
この署名されたIntentを「**UserIntent**」と呼びます。

### UserIntentのゴシップについて

- **ゴシップ**
    - ネットワーク上で情報を広めるプロセスのことです。
    - 友達に秘密を教えて、その友達が別の友達にその秘密を教える、というように情報が伝わっていくことです。

- **MEVサーチャー**
    - これは特殊なアクターで、ブロックチェーン上での取引から利益を最大化する方法を探しています。
    - 彼らは、ユーザーがブロックチェーン上で実行したいと考えている意図（**UserIntent**）を探し、それを使って何か利益を生み出すことができるかを見極めます。

- **UserIntentとIntentSolutionオブジェクト**
    - MEVサーチャーは、ネットワーク上で拾った複数の**UserIntent**（ユーザーの操作意図）を組み合わせて、「**IntentSolution**」と呼ばれる新しいオブジェクトを作ります。
    - これは、単に複数のユーザーの意図を組み合わせて、それらを一緒に実行するような計画のことです。

### どういう意味があるのか

この「**UserIntentのゴシップ**」というプロセスは、ブロックチェーン上での操作をより効率的かつ効果的に行うためのものです。
MEVサーチャーは、ユーザーの意図（**UserIntent**）を集めて最適な実行計画（**IntentSolution**）を作ることで、取引がスムーズに進み、ガス代（取引に必要な手数料）も節約できるようにします。
これにより、ユーザーは自分の操作がより速く、より安く実行されることを期待できます。
:::

3. **IntentSolutionの処理**
    - MEVサーチャーは、**IntentSolution**オブジェクトを作成し、特別なコントラクトに対して`handleIntents`コールを行うトランザクションにパッケージ化します。
    - このトランザクションは、通常のMEVチャネルを通じて最終的にブロックに含まれます。

:::note info
### IntentSolutionオブジェクトの作成

まず、「**IntentSolution**」は、MEVサーチャー（ブロックチェーン上での取引を最適化しようとする人たち）が、複数のユーザーの意図（**UserIntent**）を組み合わせて作成した計画です。
この計画は、それらのIntentを一緒に実行することで、より効率的な取引を目指します。

### handleIntentsコール

MEVサーチャーは、作成した**IntentSolution**オブジェクトを特別なスマートコントラクトに送信します。
これを「`handleIntents`コール」と呼びます。
簡単に言うと、MEVサーチャーは、「**こういう計画を立てました。これを実行してください。**」とブロックチェーンにリクエストを送ります。
「**特別なスマートコントラクト**」とは、このような計画（**IntentSolution**）を受け取り、処理するために設計されたプログラムのことです。
このコントラクトは、MEVサーチャーが提案する計画がブロックチェーンのルールに従って実行されるようにします。

### トランザクションのブロックへの含まれ方

提案された計画（**IntentSolution**）を含むトランザクションは、最終的にブロックチェーンの「**ブロック**」に含まれます。
ブロックとは、ブロックチェーン上で行われる一連の取引をグループ化したものです。

「**通常のMEVチャネル**」とは、MEVサーチャーがこのような計画をブロックに含めるために利用する方法や経路のことを指します。
つまり、MEVサーチャーは、自分たちが考えた計画が実際にブロックチェーン上で実行されるように、それをブロックに含めるためのプロセスを進めるわけです。

このプロセスの目的は、ユーザーの意図（**UserIntent**）をより効率的に、そして可能な限り最適な形でブロックチェーン上で実現することです。
MEVサーチャーが作成した計画（**IntentSolution**）は、特定のスマートコントラクトを通じて処理され、最終的にはブロックチェーンのブロックに含まれることで、その計画が実行されます。
これにより、取引がスムーズに進み、コストが削減されることが期待されます。
:::

### 目的

このシステムの目的は、スマートコントラクトの常時更新の必要性を減らし、ユーザーが新しいスタンダードやプロトコルに迅速に対応できるようにすることです。
また、MEVサーチャーがユーザーの意図をより効率的に探索し、組み合わせることで、ブロックチェーン上での操作の効率と価値の最大化を目指します。

# 動機

提案されている「**ERC-4337: Account Abstraction via Entry Point Contract specification**」は、スマートコントラクトウォレットが将来のIntentsの進化に対応できるようにするための統一インターフェースを提供するというアイデアに基づいています。
この提案は、ユーザーが任意の検証ロジックを含むスマートコントラクトウォレットを使用して、様々な他のIntent標準コントラクトによって説明され、処理されるIntentの実行を指定できるようにすることを主な目標としています。

## 主な目標と特徴

### ユーザーのIntentを可能にする
ユーザーがスマートコントラクトウォレットを使用して、任意の検証ロジックに基づいて意図の実行を指定できるようにします。

### 分散化
任意のMEV（Maximal Extractable Value）サーチャーが署名された意図の解決プロセスに参加できるようにします。
開発者が自身のIntent標準定義を追加し、ユーザーが署名時にそれらを選択できるようにします。

### 将来のIntent標準との互換性を考慮
将来のIntent標準を定義するコントラクトが、現在の`handleIntents`実行コンテキストに関する可能な限り多くの情報にアクセスできるように、Intent標準インターフェースを定義します。

### ガスコストの最小化
Intentセグメントの実行順序など、重要なIntent処理ロジックをエントリポイントコントラクト自体に含めることで、最も一般的な使用例におけるガス効率を最適化します。

### 良いユーザーエクスペリエンスの実現
ユーザーが新しく開発されたIntent標準を使用したい場合にスマートコントラクトウォレットのアップグレードが不要になります。
1つの署名だけで複雑なIntentの構成が可能になります。

### 意義

この提案によって、スマートコントラクトウォレットの柔軟性と将来性が大幅に向上します。
ユーザーは、新しいIntent標準やプロトコルが開発されたとき、ウォレットをアップグレードすることなく、即座にそれらを利用できるようになります。
また、MEVサーチャーや開発者は、分散化されたプラットフォームにより積極的に貢献し、ブロックチェーンエコシステムの革新と成長を促進することができます。
ガスコストの最小化により、トランザクションの効率が向上し、ユーザー体験が改善されます。
全体として、この提案はブロックチェーン技術の柔軟性、アクセシビリティ、効率性を大きく前進させる可能性を秘めています。

# 仕様

ブロックチェーン上でユーザーが自分のウォレットを介して参加したい操作（Intent）をパッケージ化する方法です。
これを実現するために、「**UserIntent**」というABIエンコードされた構造体が使用されます。
また、MEVサーチャーの特殊なクラスである「`solvers`」が、これらのIntentを見つけ、他のIntentと組み合わせて「**IntentSolution**」という別のABIエンコードされた構造体を作成するプロセスも説明されています。

### UserIntent構造体

| Field      | Type      | Description                                                        |
|------------|-----------|--------------------------------------------------------------------|
| sender     | address   | Intentを作成するウォレットのアドレス                                 |
| intentData | bytes[]   | 実行するために分割された複数のセグメントによって定義されたIntentデータ |
| signature  | bytes     | 検証ステップ中にウォレットとともに渡されるデータ                   |

`intentData`パラメータは、任意のバイトの配列で、その使用方法はIntent標準によって定義されます。
この配列内の各アイテムは「**Intentセグメント**」と呼ばれます。
各セグメントの最初の`32`バイトは、セグメントデータが属するIntent標準IDを指定するために使用されます。
ユーザーは、使用される意図標準に最適なメンプール戦略に**UserIntent**オブジェクトを送信します。

### IntentSolution構造体

| Field     | Type           | Description                                 |
|-----------|----------------|---------------------------------------------|
| timestamp | uint256        | Intentが評価されるべき時刻                    |
| intents   | UserIntent[]   | 実行するIntentのリスト                        |
| order     | uint256[]      | 含まれるIntentの実行順序                      |

「`solvers`」と呼ばれるMEVサーチャーのクラスは、**UserIntent**オブジェクトを検索し、それらを他のIntent（自分のも含む）と組み合わせて、Intentが実行されるべき順序を含む`IntentSolution`構造体を作成します。
このプロセスは、ブロックチェーン上での操作をより効率的に実行するためのもので、様々なユーザーのIntentを組み合わせて処理することを可能にします。

ブロックチェーンのスマートコントラクトを用いた高度な取引処理システムで、特にユーザーの操作意図（**UserIntent**）とそれらを組み合わせた解決策（**IntentSolution**）を管理するための構造です。
このシステムは、特定の意図を持つトランザクションを効率的に処理するために、「`solver`」と呼ばれるエージェントが作成した「**solution transaction**」を通じて行われます。

### エントリポイントコントラクトのコアインターフェース

```ts
function handleIntents
    (IntentSolution calldata solution)
    external;

function validateIntent
    (UserIntent calldata intent)
    external view;

function registerIntentStandard
    (IIntentStandard intentStandard)
    external returns (bytes32);

function verifyExecutingIntentForStandard
    (IIntentStandard intentStandard)
    external returns (bool);
```

エントリポイントコントラクトは、全体的な取引処理システムの中核を成すスマートコントラクトで、以下の主要な機能を持っています。

- **handleIntents**
    - `IntentSolution`オブジェクトを受け取り、それに含まれるすべてのIntentを適切に処理します。
- **validateIntent**
    - 特定の`UserIntent`が有効かどうかを検証します。
- **registerIntentStandard**
    - 新しいIntent標準（`IIntentStandard`）を登録し、それを識別するためのユニークなID（`bytes32`）を返します。
- **verifyExecutingIntentForStandard**
    - 特定のIntent標準に対する実行中のIntentが有効かどうかを検証します。

:::note info
### エントリーポイントコントラクト　

エントリーポイントコントラクトは、ブロックチェーン（特にイーサリアムのようなスマートコントラクトをサポートするプラットフォーム）上で、複数のユーザーIntentやその他の操作を一元的に処理するためのスマートコントラクトです。
これは、ブロックチェーン上での取引や操作をより柔軟に、そして効率的に実行するためのソリューションを提供します。

### エントリーポイントコントラクトの主な役割

- **統一されたアクセスポイント**
    - ユーザーまたはアプリケーションがブロックチェーン上で特定の操作を実行したい場合、エントリーポイントコントラクトを通じてこれらの操作を一元的に管理します。
    - これにより、各ユーザーや開発者が個別にスマートコントラクトをデプロイする手間を省きます。

- **Intent処理**
    - ユーザーが自分のウォレットを使用して参加したい様々なIntentをパッケージ化し、エントリーポイントコントラクトに送信します。
    - このコントラクトは、送信されたIntentを適切な方法で処理し、必要に応じて他のコントラクトに転送します。

- **標準化と互換性**
    - 新しいIntent標準やプロトコルが開発された場合、エントリーポイントコントラクトを介してこれらの新しい標準に対応することができます。
    - これにより、ウォレットやアプリケーションが常に最新の機能や標準に対応できるようになります。

- **セキュリティと検証**
    - エントリーポイントコントラクトは、送信されたIntentが正しいフォーマットであり、適切に署名されているかどうかを検証します。
    - これにより、不正な操作や不正確なIntentの実行を防ぎます。

- **ガス効率の最適化**
    - 複数のIntentを一つのトランザクションで処理することで、ガスコスト（トランザクションを実行するために必要な手数料）を削減します。

### エントリーポイントコントラクトのメリット

エントリーポイントコントラクトを使用することで、ブロックチェーンの操作がより柔軟になり、開発者やユーザーは新しい機能や標準を容易に取り入れることができます。
また、トランザクションのセキュリティを強化し、全体的なガスコストを削減することが可能になります。

総じて、エントリーポイントコントラクトはブロックチェーンのエコシステムにおいて、効率的でセキュアな方法で様々な操作を処理するための中心的な役割を果たします。
:::

### Intent標準のためのコアインターフェース

```ts
function validateUserIntent
    (UserIntent calldata intent)
    external;

function executeUserIntent
    (IntentSolution calldata solution, uint256 executionIndex, uint256 segmentIndex, bytes memory context)
    external returns (bytes memory);
```

Intent標準は、ユーザーIntentの検証と実行に必要な特定のロジックを定義するためのインターフェースを提供します。
これには以下の関数が含まれます。

- **validateUserIntent**
    - 特定の`UserIntent`がそのIntent標準に基づいて有効かどうかを検証します。
- **executeUserIntent**
    - `IntentSolution`オブジェクトと、その中での実行インデックスおよびセグメントインデックスに基づいて、`UserIntent`を実行します。
    - この関数は実行コンテキストを受け取り、その結果を返します。

### ウォレットのためのコアインターフェース

```ts
function validateUserIntent
    (UserIntent calldata intent, bytes32 intentHash)
    external view returns (address);

function generalizedIntentDelegateCall
    (bytes memory data)
    external returns (bool);
```

ウォレットは、ユーザーのIntentを検証し、代行呼び出しを実行するためのインターフェースが必要です。
これには以下の関数が含まれます。

- **validateUserIntent**
    - 特定の`UserIntent`とそのIntentハッシュが有効かどうかを検証し、そのIntentを作成したウォレットのアドレスを返します。
- **generalizedIntentDelegateCall**
    - 指定されたデータに基づいて代行呼び出しを行い、成功したかどうかを返します。

:::note info
このシステムでは、ユーザーの操作意図（**UserIntent**）を効率的に処理し、ブロックチェーン上でのトランザクションを最適化するために、複数のインターフェースとスマートコントラクトが組み合わせられています。
`solver`はこれらのIntentを組み合わせて「**solution transaction**」を作成し、エントリポイントコントラクトを通じてそれらを処理します。
このシステムは、ブロックチェーンの効率性と柔軟性を大幅に向上させることが期待されます。
:::

## 必要なエントリーポイントコントラクト機能

ブロックチェーンのエントリーポイントコントラクトが実行する必要がある特定の機能について説明しています。
具体的には、`handleIntents`関数がどのように**UserIntent**オブジェクトを処理するかについての手順が述べられています。
この処理には大きく分けて2つのループ、すなわち検証ループと実行ループがあります。

### 検証ループ

#### タイムスタンプの検証
`IntentSolution`に含まれるタイムスタンプが、`block.timestamp`（現在のブロックのタイムスタンプ）の許容範囲内、またはそれ以前であることを確認します。

#### ユーザー意図の検証
各`UserIntent`に対して、そのウォレットが`validateUserIntent`関数を呼び出し、**UserIntent**とIntentのハッシュを渡します。
この関数は意図の署名を検証し、検証に失敗した場合は、そのIntentの実行をスキップし、全体を`revert`することもできます。

### 実行ループ

#### Intentセグメントの実行
`UserIntent`の`intentData`バイト配列パラメーターに含まれるすべてのセグメントに対して、`intentData`の最初の32バイト（Intent標準ID）に指定されたIntent標準に`executeUserIntent`関数を呼び出します。
この関数は`IntentSolution`全体、現在の実行インデックス、セグメントインデックス、およびコンテキストデータを受け取ります。
実行された結果は次の`executeUserIntent`呼び出しに渡されます。

#### セグメントの解析とコンテキストデータの利用
Intent標準は、`intentData`セグメントバイトをどのように解析し、実行間で持続するコンテキストデータブロブをどのように利用するかを決定します。

### 実行順序

`UserIntent`内のセグメントは、`intentData`パラメーターで定義された順序に従って常に同じ順序で実行されます。
`UserIntent`オブジェクト間のセグメントの実行順序は、`IntentSolution`オブジェクトの`order`パラメーターによって指定できます。
順序が指定されていない場合や、順序配列の終わりに到達した後にすべてのInitentのすべてのセグメントが処理されていない場合は、デフォルトの順序が使用されます。

### UserIntentの受け入れ前の検証

`UserIntent`を受け入れる前に、solverはRPCメソッドを使用してエントリーポイントの`validateIntent`関数をローカルで呼び出し、署名とデータフォーマットが正しいことを確認する必要があります。

これらの手順は、ブロックチェーン上でUserIntentを安全かつ効率的に処理するために必要な詳細な指示を提供します。
これにより、Intentの正確な実行と、ブロックチェーンの透明性とセキュリティが保証されます。

### 新規エントリーポイント・インテント規格の登録

エントリーポイントコントラクトが新しいIntent標準（Intent Standard）を登録するためのプロセスについて述べています。
このプロセスは、誰でも新しいIntent標準コントラクトを登録できるように、許可なしで（permissionless）行われます。

#### 登録プロセスの手順

1. **意図標準契約の検証**
    - エントリーポイントコントラクトの`registerIntentStandard`関数が新しいIntent標準コントラクトを登録しようとするとき、最初にそのIntent標準コントラクトが実際に登録されているか確認する必要があります。
    - これは、Intent標準コントラクト上の`isIntentStandardForEntryPoint`関数を呼び出すことによって行われます。

2. **エントリーポイントコントラクトアドレスの確認**
    - `isIntentStandardForEntryPoint`関数には、エントリーポイントコントラクトのアドレスが渡されます。
    - Intent標準コントラクトはこのアドレスを検証し、Intent標準がそのエントリーポイントコントラクトに対して使われるべきものであるかどうかを`true`または`false`で返します。

3. **標準IDの付与と登録**
    - Intent標準コントラクトが`true`を返した場合、エントリーポイントコントラクトはそのIntent標準を登録し、それに一意の標準IDを付与します。
    - このIDは、Intent標準コントラクト、エントリーポイントコントラクト、およびチェーンIDに固有のものです。

#### 重要性

このプロセスにより、新しいIntent標準を容易に追加し、ブロックチェーンエコシステム内での柔軟性と拡張性を高めることができます。
許可なしで登録できることは、開発者が中央機関の介入なしに自由に新しい標準を提案し、ブロックチェーン技術の革新を促進できることを意味します。
一意の標準IDを使用することで、様々な意図標準間での区別が容易になり、エントリーポイントコントラクトによる処理がより効率的になります。

## Intent標準の実行時の振る舞い

### executeUserIntent関数
Intent標準には`executeUserIntent`関数が与えられ、これは全ての`IntentSolution`へのアクセス権を含め、広範なデータセットへのアクセスを提供します。
これにより、将来的に有用と考えられるあらゆる種類のロジックを実装できるようになります。
各Intent標準コントラクトは、`UserIntent`オブジェクトの`intentData`パラメータを解析し、その標準に関連する任意の制約を検証したり、行動を実行したりすることが期待されます。

### コンテキストデータ
Intent標準は、`executeUserIntent`関数の実行終了時にコンテキストデータを返すことができます。
このデータはエントリーポイントによって保持され、次にそのイベントに対して`executeUserIntent`関数が呼び出される時にパラメータとして渡されます。
これにより、他のIntentが実行される間に永続的なデータストアへのアクセスが可能になります。

## スマートコントラクトウォレットの実行時の振る舞い

スマートコントラクトウォレットは、検証後およびIntent実行中にエントリーポイントから特に期待されることはありませんが、Intent標準によって実行中に何らかのアクションを行うことが望まれる場合があります。
この場合、ウォレットは`generalizedIntentDelegateCall`関数を使用して、与えられた`calldata`で`delegatecall`を実行する必要があります。
ウォレットが`delegatecall`を信頼して実行するためには、エントリーポイントコントラクト上の`verifyExecutingIntentForStandard`関数を呼び出して、現在`executeUserIntent`を呼び出しているIntent標準コントラクトが`generalizedIntentDelegateCall`の`msg.sender`であること、およびスマートコントラクトウォレットが`UserIntent`の送信者であることを検証する必要があります。

## スマートコントラクトウォレットの検証時の振る舞い

エントリーポイントは、各`UserIntent`についてその`sender`フィールドに指定されたスマートコントラクトウォレットで`validateUserIntent`関数を呼び出します。
この関数は、`UserIntent`オブジェクト全体とIntentの事前計算されたハッシュを提供し、ウォレットはこのデータを分析して、実際に指定された送信者から送信されたものであることを確認することが期待されます。
Intentが無効である場合、スマートコントラクトウォレットは`validateUserIntent`関数でエラーを投げるべきです。
ただし、`validateUserIntent`関数は`view`（閲覧）専用に制限されており、`nonce`管理などの状態更新はIntent自体の個別のセグメントで行うべきです。

このプロセスは、ブロックチェーン上でのIntentの安全で効率的な実行と検証を保証するために設計されています。

## SolverによるIntentの検証

### **Intentの検証**
Solverは、エントリーポイントコントラクト上の`validateIntent(intent)`関数に対してビューコール（読み取り専用のトランザクション）を実行し、UserIntentが適切な署名の検証を通過し、Intentのセグメントが適切にフォーマットされているかどうかを確認します。
この関数呼び出しがエラーで`revert`した場合、SolverはそのUserIntentを拒否するべきです。

## シミュレーション

### **MEVワークフローにおけるシミュレーション**
Solverは、典型的なMEV（Maximal Extractable Value: 最大抽出価値）のワークフローにおいて、シミュレーションを行うことが期待されます。
これは通常、現在のブロック高さで自身の解決策をドライラン（実際には実行せずに試行）して、期待される結果を得られるかを判断することを意味します。
解決策は、次のブロックに含まれるようにブロックビルダーへのバンドルとして提出されることができます。

## 拡張機能

#### 追加機能
エントリーポイントコントラクトは、一般的なシナリオでのガスコストを削減するために追加機能を有効にすることがあります。
これにより、より多くのシナリオで効率的にトランザクションを処理することが可能になり、全体的なネットワークのパフォーマンスを向上させることができます。

上記の説明は、ブロックチェーンのエントリーポイントコントラクトに新しい機能を追加する提案に関するものです。この機能は`handleIntentsAggregated`と呼ばれ、複数のUserIntent（ユーザー意図）の署名を個別に検証する代わりに、集約された署名を提供することを可能にします。また、集約された署名の検証ロジックを処理するための新しいインターフェース、つまり署名アグリゲーター（集約器）を導入しています。

提案されているエクステンションは、ブロックチェーンのエントリーポイントコントラクトの機能と効率をさらに高めるためのものです。
これらの拡張機能は、ガスコストを削減し、より柔軟で効率的なトランザクション処理を可能にすることを目的としています。

### `handleIntentsAggregated`関数

```ts
handleIntentsAggregated(
        IntentSolution[] calldata solutions,
        IAggregator aggregator,
        bytes32 intentsToAggregate,
        bytes calldata signature
    ) external;
```

- **パラメータ**
    - `solutions`
        - 解決策のリスト。
    - `aggregator`
        - アグリゲーターコントラクトのアドレス。
    - `intentsToAggregate`
        - 集約署名が表すIntentを示すビットフィールド（含まれる場合は1、除外される場合は0）。
    - `signature`
        - 集約された署名自体。

この関数は、集約された署名に含まれるIntentについて、アグリゲーターコントラクトを通じてその署名を検証します。
その後、エントリーポイントコントラクトは通常の検証プロセス中に、集約された署名に含まれるIntentを送信したスマートコントラクトウォレットがすべて、使用された署名アグリゲーターコントラクトのアドレスを返すことを検証します。

### アグリゲーターのコアインターフェース

```ts
function validateSignatures
    (UserIntent[] calldata intents, bytes calldata signature)
    external view;

function aggregateSignatures
    (UserIntent[] calldata intents)
    external view returns (bytes memory aggregatedSignature);
```

- **関数**
    - `validateSignatures`
        - エントリーポイントコントラクトが集約された署名を検証するために呼び出す主要な関数です。
    - `aggregateSignatures`
        - Solverがオフチェーンで集約された署名を計算するために使用できる関数です。
        - 既に最適化されたカスタムコードを持っていない場合に便利です。

#### 概要

この提案により、複数のIntentの署名を個別に検証する代わりに、集約された署名を利用することができるようになります。
これにより、トランザクションの処理をより効率的に行うことが可能になり、特に多数のIntentが絡む操作でのガスコストの削減が期待されます。
署名アグリゲーターコントラクトは、これらの集約された署名の検証ロジックを担い、ブロックチェーンエコシステム内での新たな拡張性と柔軟性を提供します。

### 埋め込みIntent標準の拡張

エントリーポイントロジックは、いくつかの共通のIntent標準のロジックを含むように拡張されます。
これらの標準は、エントリーポイントコントラクト作成時に独自の標準IDで登録されます。
`validateUserIntent`および`executeUserIntent`関数をエントリーポイントコントラクトのコードに含めることで、外部呼び出しを減らし、ガスを節約します。

### handleMultiの拡張

エントリーポイントコントラクトに`handleIntentsMulti(IntentSolution[] calldata solutions)`関数を追加します。
これにより、複数の**solution**を単一のトランザクションで実行できるようになり、類似のストレージ領域に触れるIntentでガスを節約できます。

### ノンス管理の拡張

エントリーポイントコントラクトに`getNonce(address sender, uint256 key)`および`setNonce(uint256 key, uint256 nonce)`関数を追加します。
これらの関数により、ノンスデータをエントリーポイントコントラクトのストレージに格納できます。
ノンスは送信者ごとに格納され、誰でも読み取ることができますが、実行中のIntent標準によってのみ、かつ現在実行中のIntentの送信者に対してのみ設定できるようになっています。

### データブロブの拡張

エントリーポイントコントラクトが`sender`フィールドがaddress(0)である、または`intentData`フィールドが空であるUserIntentオブジェクトの検証をスキップできるようにします。
`intentData`フィールドまたは`sender`フィールドは、Intent実行に任意のデータを注入するために使用できます。
このデータは、ある秘密を知っていてそれを証明する必要があるIntent標準を解決する場合や、周囲の他のIntentによってその振る舞いが変わる可能性のあるIntentに有用です。

これらの拡張機能により、エントリーポイントコントラクトはより多くのシナリオに対応でき、ユーザーが定義するIntentのカスタマイズ性が向上します。
また、トランザクションのガスコストを削減し、ブロックチェーン上でのトランザクション処理の全体的な効率を高めることが期待されます。

# 補足

この提案は、ブロックチェーン上でのユーザーIntent（意図）の柔軟かつ進化する世界に適応できる一般化されたIntent標準の取り扱いに関するものです。
ユーザーは、スマートコントラクトウォレットを常に更新することなく、自分のIntentをシームレスに表現する方法が必要です。

## 提案の概要

### ウォレットの機能
`validateUserIntent`関数を持ち、これは`UserIntent`を入力として受け取り、署名を検証します。
`generalizedIntentDelegateCall`関数も持ち、これによりウォレットはIntent標準コントラクトからIntentに関連するアクションを実行できます。

### エントリーポイントコントラクトの役割 
`UserIntent`の`intentData`配列フィールド内の各セグメントの最初の32バイトで指定されたIntent標準コントラクトに、Intent処理ロジックを転送します。
セキュリティを確保するために、ウォレットがIntent標準コントラクトからのアクションを実行する時には、`verifyExecutingIntentForStandard`関数を使用します。

### 提案の利点

#### 検証と実行の分離
このアプローチにより、検証とIntent実行の間にクリアな分離が可能となります。
これにより、ウォレットが最新のIntent標準構成をサポートするために常に更新される必要がなくなります。

#### ユーザー主導のIntent定義
新しいIntent標準を開発する開発者が、ウォレットのソフトウェア開発者を説得して新しいIntent標準をサポートさせる必要がなくなります。
この提案により、Intentの核心的な定義が署名時にユーザーの手に委ねられます。

:::note info
この提案は、ブロックチェーン上でのIntent処理の進化と柔軟性に対応するための効果的な方法を提供します。エントリーポイントベースのアプローチは、開発者とユーザーの双方にメリットをもたらし、ユーザーが自分のIntentをより簡単に、そして効率的に表現できるようにします。
:::

## Solvers

Solversは、ユーザーのIntentを実行し、自身のMEVを追求するために存在します。
彼らはチェーン上でIntentを実行するトランザクションの発信者となり、通常ユーザーが負担するガス料金を前払いすることで、その負担を軽減します。
Solversは、Intent自体の性質と使用される個々のIntent標準によって決定されるゴシップネットワークと解決アルゴリズムに依存します。

:::note info
「**Solvers**」とは、ブロックチェーン上でユーザーが持つIntent（意図や目的）を実現するために活動するアクターのことを指します。
ここでのIntentとは、例えばあるトークンを別のトークンに交換する、ある特定の操作をスマートコントラクトに対して行うなど、ユーザーがブロックチェーン上で達成したいと考えるあらゆるアクションを意味します。

SolversがどのようにしてこれらのIntentを処理するかは、主に2つの要素に依存します。

1. **Intent自体の性質**
    - 各Intentは、それを達成するために必要な特定のアクションや条件を持っています。
    - 例えば、あるトークンの交換Intentは、市場の流動性や交換レートといった要因を考慮する必要があります。
    - そのため、Solversは、これらの特定の条件を満たすために必要な情報や戦略を理解し、適用する必要があります。

2. **使用される個々のIntent標準**
    - Intentを表現するためには、特定のフォーマットやプロトコル（Intent標準と呼ばれる）が使用されます。
    - これらの標準は、Intentの種類によって異なり、その検証や実行方法を定義します。
    - Solversは、これらの標準に従って、Intentを正しく解釈し、実行する方法を知っている必要があります。

Solversは、これらのIntentを処理するために、ゴシップネットワークと呼ばれる情報交換システムを使用します。
このネットワークを通じて、Solversは他のSolversやユーザーからIntentに関する情報を収集し、最適な解決策を見つけるためのアルゴリズムや戦略を適用します。ゴシップネットワークと解決アルゴリズムは、Intentの種類や要件、および使用されるIntent標準に基づいて変化するため、Solversはこれらの要因に柔軟に対応する能力が求められます。

SolversはユーザーのIntentを効率的に実現するために、Intentの性質とそれを定義する標準に基づいた情報交換ネットワークとアルゴリズムを利用します。
これにより、ユーザーの意図したアクションがブロックチェーン上で実現されます。

ゴシップネットワークと解決アルゴリズムは、情報の伝播と問題解決のためのメカニズムです。
これらは、特にブロックチェーンの文脈で、SolversがユーザーのIntent（目的や意図）を理解し、実行するために使用します。

### ゴシップネットワーク

ゴシップネットワークは、情報をネットワークの参加者間で効率的に伝播させるための手法です。
このネットワークでは、各参加者（ノード）が受け取った情報を他の複数の参加者に伝えることによって、情報が迅速に広がります。
このプロセスは、うわさ話が人から人へと広がる様子に似ているため「**ゴシップ**」と呼ばれます。

ブロックチェーンの文脈では、Solversはゴシップネットワークを使用して、新しいトランザクション、Intent、または市場の動向などの情報を収集します。
これにより、現在の状況を迅速に把握し、その情報を基に意思決定を行うことができます。

### 解決アルゴリズム

解決アルゴリズムは、与えられた問題（この場合はユーザーのIntentをどのように実現するか）に対する解決策を見つけるための計算手順です。
Solversは、ゴシップネットワークから収集した情報を元に、特定のIntentをどのように効率的に、かつ成功させるかを計算します。

例えば、あるユーザーが特定のトークンを別のトークンに交換したいというIntentを持っている場合、Solverは利用可能な流動性、スリッページ（価格変動リスク）、ガス料金などを考慮して、最適な交換ルートを算出する解決アルゴリズムを実行します。

### ゴシップネットワークと解決アルゴリズムの関係

ゴシップネットワークは解決アルゴリズムにとって重要な情報源です。
Solversは、このネットワークから最新の市場データや他のユーザーのIntentなどの情報を収集し、それを解決アルゴリズムに供給します。
このプロセスを通じて、Solversは最適な解決策を導き出し、ユーザーのIntentを効果的に実行することができます。

ゴシップネットワークは情報の収集ツールであり、解決アルゴリズムはその情報を元に最適な行動を計算するツールです。
これらは相互に依存し合いながら、ブロックチェーン上での複雑な意図の実現を可能にしています。
:::

## エントリーポイントのアップグレード

### ウォレットの役割
ウォレットは、ガス効率を向上させ、ウォレットのアップグレード可能性を提供するために、`DELEGATECALL`転送コントラクトとして機能することが推奨されます。
ウォレットコードは、ガス効率を高めるために、そのコード内にエントリーポイントをハードコードすることが期待されています。

### アップグレードプロセス
新しいエントリーポイントが導入された場合（新機能の追加、ガス効率の改善、または重大なセキュリティバグの修正のため）、ユーザーは自己呼び出しを行い、新しいエントリーポイントを指す新しいコードアドレスを含む自分のウォレットのコードアドレスを置き換えることができます。
アップグレードプロセス中には、Intent標準契約も新しいエントリーポイントに再登録する必要があります。

## Intent標準のアップグレード

### ウォレットへの影響
Intent標準はウォレットにハードコードされていないため、ユーザーは新しく登録されたIntent標準を使用するために何も操作をする必要がありません。
ユーザーは単に新しいIntent標準でIntentを署名することができます。

このシステムは、ユーザーが自分の意図を簡単に、かつ効率的にブロックチェーン上で表現できるようにすることを目的としています。
同時に、SolversがMEVを追求する過程でユーザーIntentの実行を支援し、全体的なネットワークの効率とセキュリティを向上させる構造を提供します。

# 互換性

このERCがイーサリアムのコンセンサス層を変更しないため、イーサリアム全体の後方互換性の問題は発生しません。
つまり、この提案は既存のイーサリアムネットワークの動作に直接影響を与えるものではなく、既存のプロトコルや契約に影響を及ぼす変更を伴いません。

しかし、既存のスマートコントラクトウォレットとの統合を試みる時には、いくつかの問題が生じる可能性があります。
具体的には、ウォレットがすでに**ERC4337**（アカウント抽象化およびエントリーポイント契約仕様に関するERC）に対応している場合、新しく提案された`validateUserIntent`関数の実装は既存の`validateUserOp`関数と非常に類似していると予想されます。
しかし、この新しい関数をウォレットに組み込むためには、ユーザー自身によるウォレットのアップグレードが必要となります。

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

https://qiita.com/cardene/items/8c97ca7c93c4557ebfc2

### コンセンサス層への影響なし
提案はイーサリアムの基本的な動作や合意形成プロセスに変更を加えないため、ネットワーク全体の後方互換性に関する問題はありません。

### スマートコントラクトウォレットとの統合
既存の**ERC4337**対応ウォレットに`validateUserIntent`関数を組み込むことは技術的には類似しているものの、実際にこれを実装するにはユーザーが自分のウォレットをアップグレードする必要があります。

:::note info
新しいERC提案が既存のイーサリアムエコシステムにスムーズに統合されるように設計されていることが分かりますが、ウォレットのアップグレードという形でユーザー側にもある程度の行動が求められることが明らかにされています。
このプロセスを通じて、より柔軟でセキュアなウォレットの機能がユーザーに提供されることが期待されます。
:::

# 実装

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

https://github.com/essential-contributions/ERC-7521

# セキュリティ

提案された**ERC7521**アーキテクチャにおいて、エントリーポイントコントラクトは非常に重要な役割を担っています。
このコントラクトは、すべての**ERC7521**をサポートするウォレットにとっての中央信頼点として機能するため、非常に厳密な監査と形式的検証が必要とされます。
ここでは、その理由と重要性について説明します。

## エントリーポイントコントラクトの監査と検証

### 中央信頼点としての役割
エントリーポイントコントラクトは、多くの異なるウォレットやIntent標準に対して共通の処理ポイントを提供します。
これにより、ウォレットは`validateUserIntent`関数のロジック（特に署名の検証）だけを検証すれば良く、他の全ての標準的な処理はエントリーポイントに委ねられます。

### 監査と検証の負担の軽減
このアーキテクチャにより、エコシステム全体の監査と形式的検証の負担が軽減されます。
個々のウォレットやIntent標準に対する監査作業が減るため、エントリーポイントコントラクトにセキュリティのリスクが集中します。

### 集中したセキュリティリスクの検証
エントリーポイントのセキュリティは極めて重要です。
このコントラクトに対する攻撃や弱点は、サポートされている全ウォレットに影響を与える可能性があります。
そのため、エントリーポイントは「**任意のハイジャックに対する安全性**」を含む重要なクレームに対して、非常に堅牢であることが検証される必要があります。

## 検証の焦点

### 任意のハイジャックに対する安全性
エントリーポイントは、`UserIntent`の署名が正しく検証され、かつ`executeUserIntent`が呼び出されている最中である（つまり、`intentData`フィールドで指定された標準に基づいており、かつ`msg.sender`ウォレットが送信者と同じである）場合にのみ、`verifyExecutingIntentForStandard`で`true`を返すように機能する必要があります。

## 追加の監査と検証

### Intent標準コントラクトの監査
ユーザーがインタラクトするIntent標準コントラクトもまた、重要な監査と形式的検証が必要です。
これにより、エントリーポイントを通じて安全に操作を実行できるようになります。

エントリーポイントコントラクトとIntent標準の堅牢な監査と検証により、**ERC7521**アーキテクチャは、ユーザーIntentの効率的かつ安全な実行を支援し、ブロックチェーンエコシステムにおける信頼性と安全性を高めることが期待されます。

# 引用

Stephen Monn (@pixelcircuits), Bikem Bengisu (@supiket), "ERC-7521: General Intents for Smart Contract Wallets [DRAFT]," Ethereum Improvement Proposals, no. 7521, September 2023. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7521.

# 最後に

今回は「ブロックチェーン上での意図(Intent)を管理するための標準化されたエントリーポイントコントラクトを提案し、スマートコントラクトウォレットが新しいIntent標準に対応するために頻繁にアップグレードする必要をなくし、代わりに一元的なエントリーポイントが署名の検証と意図データの処理の仕組みである**ERC7521**」についてまとめてきました！
いかがだったでしょうか？

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