📝

EIP-4337 study

2023/04/23に公開
1

今までのWalletと EOA 、 AccountAbstractionのWallet

従来のEOA(Externally Owned Account) アカウント抽象化
ウォレットアドレスの生成 公開鍵から一意に決定される スマートコントラクトのアドレス
方法 公開鍵をKeccak-256ハッシュ関数にかけ、最後の20バイトを使用 スマートコントラクトのデプロイ
セキュリティ 公開鍵/秘密鍵ペアのみで保護される スマートコントラクトでカスタマイズ可能なセキュリティルール
アカウント管理 シンプルで直接的な管理方法 柔軟で多様な管理方法をサポート

従来のEOAでは、ウォレットアドレスは公開鍵から一意に決定されます。具体的には、公開鍵をKeccak-256ハッシュ関数にかけ、その最後の20バイトを使用してアドレスを生成します。これにより、アドレスは簡単に計算できますが、セキュリティは公開鍵/秘密鍵ペアのみで保護されており、アカウント管理はシンプルで直接的なものになります。

一方、アカウント抽象化では、ウォレットアドレスはスマートコントラクトのアドレスになります。これは、スマートコントラクトをデプロイすることで生成されます。スマートコントラクトによって、カスタマイズ可能なセキュリティルールを実装できるため、アカウント管理が柔軟で多様な方法でサポートされます。

アカウント抽象化は、ユーザーがウォレットアドレスをより安全かつ簡単に管理できるようにすることを目的としています。これにより、ウォレットアドレスの生成と管理が従来のEOAとは異なる方法で行われることになります。

アカウント抽象化では、ウォレットアドレスはスマートコントラクトのアドレスになります。スマートコントラクトはデプロイされる際にアドレスが割り当てられますが、そのアドレスは公開鍵から直接導出されるわけではありません。代わりに、スマートコントラクトがデプロイされる際に、デプロイするアカウント(EOA)のアドレスとそのアカウントがデプロイしたスマートコントラクトの合計数(nonce)に基づいて計算されます。

スマートコントラクトアドレスの生成手順は以下の通りです:

  1. まず、デプロイするEOA(Externally Owned Account)のアドレスとnonce(そのアカウントがデプロイしたスマートコントラクトの合計数)を取得します。
  2. 次に、アドレスとnonceを連結します。
  3. 連結されたデータにKeccak-256ハッシュ関数を適用します。
  4. 最後に、生成されたハッシュの最後の20バイトを抽出して、スマートコントラクトアドレスとして使用します。

この方法により、スマートコントラクトのアドレスが生成されます。このアドレスは、アカウント抽象化におけるウォレットアドレスとして機能します。このアドレスは、公開鍵から直接導出されるわけではありませんが、デプロイするEOAのアドレスとnonceに基づいて一意に決定されます。

EIP-4337を 要約

Account Abstract (Smart wallet) の内容を理解していきます。
https://eips.ethereum.org/EIPS/eip-4337

項目 説明 備考
Account Abstraction ユーザが普通のアカウントの代わりに任意の検証ロジックを含むスマートコントラクトウォレットを使用できるようにする 一般的なアカウントから抽象化されたアカウントを提案
UserOperation ユーザーが送信する擬似トランザクションオブジェクトであり、アカウント抽象化で使用される主要なデータ構造 ユーザーはUserOperationオブジェクトを専用のmempoolに送信する
Bundler UserOperationオブジェクトをまとめて取引にパッケージ化し、特別なコントラクトに対してhandleOpsコールを行うアクターのクラス ブロックビルダーやバンドルマーケットプレイスを通じて取引を中継できるユーザーが含まれる
EntryPoint ユーザ操作のバンドルを実行するためのシングルトンコントラクト BundlerがUserOperationを取り扱うために使用される
IAccount Interface アカウントが持つべきインターフェイス validateUserOp関数が定義されている
IAggregator Interface 署名アグリゲータが持つべきインターフェイス validateUserOpSignature, aggregateSignatures, validateSignatures関数が定義されている
Paymaster ユーザーの代わりにトランザクション費用を支払うスポンサーとして機能する トランザクション費用をERC-20トークンで支払ったり、開発者がユーザーの費用を負担できるようになる
Consensus Layer 合意形成層への変更を回避するために、この提案はユーザ操作とブロックビルダーを利用している Ethereum合意形成層の開発はマージとスケーラビリティに集中しているため、変更を避ける
Signature Aggregator 複数のユーザ操作の署名を効率的に検証・集約することができる スマートコントラクトで実装されることが多いが、ネイティブライブラリを使用することも可能

stackupによる4337 説明の要約

https://docs.stackup.sh/docs/erc-4337-overview
ERC-4337の仕組みは以下のようにまとめられます。

ユーザーがアプリケーションを通じてUserOperationを作成します。
BundlerがUserOperationをmempoolから取得し、EntryPointに送信します。
EntryPointが検証ループを実行し、各UserOperationが有効かどうかをContract AccountとPaymasterとともに確認します。
EntryPointが実行ループを実行し、各UserOperationのcallDataをContract Accountに送信します。
このように、ERC-4337は、イーサリアム・ブロックチェーン上で効率的にスマートコントラクトアカウントを操作するための新しい規格であり、開発者がアプリケーションを構築する際に役立つ様々なコンポーネントが提供されています。また、ERC-4337は他のオープンソースパッケージとの組み合わせが可能で、柔軟性と拡張性が向上しています。

この規格は、UserOperation、Bundler、EntryPoint、Contract Accountという4つの主要なコンポーネントから構成されており、PaymasterとAggregatorによって補完されることがあります。

用語

  • UserOperation: ユーザーの意図を表現する擬似トランザクションオブジェクトです。スマートコントラクトアカウントを介して実行されるアクションを実行するために使用されます。

  • Bundler: UserOperationをmempoolから取得し、それらをイーサリアムブロックチェーン上のEntryPointコントラクトに送信する役割を担います。

  • EntryPoint: トランザクションの検証と実行ロジックを処理するシングルトンスマートコントラクトです。

  • Contract Account: ユーザーが所有するスマートコントラクトアカウントです。

  • Paymaster(オプション): トランザクションのガス料金をスポンサーすることができるスマートコントラクトアカウントです。

  • Aggregator(オプション): 複数のContract Accountの署名を検証できるスマートコントラクトです。

処理フロー

UserOperationには、送信者アドレス、ナンス、初期化コード、呼び出しデータ、ガス制限、検証ガス制限、事前検証ガス、最大料金/ガス、最大優先料金/ガス、ペイマスターとデータ、署名などのフィールドが含まれます。

Bundlerは、UserOperationのmempoolをリッスンし、シミュレーションを実行し、UserOperationの配列をバンドルし、EntryPointにバンドルを中継します。

EntryPointは、すべてのERC-4337アカウントとペイマスターに対する中心的なエンティティとして機能し、UserOperationの検証と実行を調整します。検証ループと実行ループの2つのフェーズがあります。

Contract Accountは、エンドユーザーのアカウントで、検証ループ中にUserOperationを受け入れるかどうかをチェックする必要があります。

Paymasterは、UserOperationのガス料金をスポンサーできるエンティティであり、検証ループ中にUserOperationを受け入れるかどうかをチェックし、実行ループ中に必要な料金ロジックを実行する必要があります。Paymasterのロジックの例としては、UserOperationが実行された後に、Contract Accountから特定の量のERC-20トークンを引き出すことが挙げられます。これにより、ユーザーは自分が選んだ通貨でガス料金を支払うことができます。

Aggregatorは、Contract Accountによって署名の検証が信頼されているエンティティです。複数のUserOperationからの署名をまとめるためによく使われます。

mempool とは?

EIP-4337におけるmempoolは、アカウント抽象化を実現するために導入された新しいコンポーネントです。従来のEthereumでは、トランザクションがネットワーク内の各ノードのmempoolに送信され、マイナーによってブロックに追加されるまで保持されます。しかし、アカウント抽象化を実現するために、EIP-4337ではUserOperationという新しいデータ構造を導入しています。

UserOperationは、擬似トランザクションオブジェクトであり、ユーザが送信するオブジェクトです。これにより、ユーザは任意の検証ロジックを含むスマートコントラクトウォレットを使用できます。EIP-4337のmempoolは、UserOperationオブジェクトを一時的に保管するための新しいデータ構造です。

この専用のmempoolにUserOperationが送信されると、Bundlerと呼ばれる特別なアクターがUserOperationオブジェクトを取り扱い、EntryPointと呼ばれるシングルトンコントラクトに対してhandleOps関数を呼び出すことにより、UserOperationをブロックに追加します。Bundlerはブロックビルダーやバンドルマーケットプレイスを通じてUserOperationを中継できるユーザーも含んでいます。

このEIP-4337のmempoolは、アカウント抽象化を実現するためにUserOperationの管理と処理を行い、従来のトランザクションとは異なる形でEthereumのネットワークにおいて動作します。これにより、ユーザがより柔軟なアカウント検証ロジックを持つスマートコントラクトウォレットを使用できるようになります。

Discussion