🚀

Account Abstraction (ERC-4337) とは?UserOpの容量と処理数の実例

に公開

ブロックチェーンのユーザー体験を向上させる技術として、アカウント抽象化(ERC-4337)が注目を集めています。この記事では、ERC-4337の概要を簡潔に説明し、特にUserOperationの容量、トークン送信のデータサイズ、そして1つのUserOpに含められる処理の数に焦点を当ててわかりやすく解説します。

アカウント抽象化(ERC-4337)とは?

アカウント抽象化(ERC-4337)は、ブロックチェーンのアカウント管理をより柔軟で使いやすくするための標準です。従来のアカウントには、秘密鍵で管理するシンプルなタイプ(EOA)と、プログラム可能なスマートコントラクトアカウント(SCA)の2種類がありました。ERC-4337は、スマートコントラクトを活用してユーザーのアカウントを「スマートウォレット」に進化させ、以下のようなメリットを提供します:

  • ガス代の柔軟性:Native Token以外のトークンでガス代を支払ったり、第三者がガス代を肩代わりする(Paymaster)ことが可能。
  • 簡単な管理:シードフレーズの代わりにソーシャルリカバリーや生体認証を導入。
  • 効率化:複数の操作を1つのトランザクションにまとめてガス代を節約。
  • セキュリティ強化:マルチシグやカスタムルールでトランザクションを保護。

ERC-4337はUserOperationというデータ構造を中心に動作し、ユーザーの操作意図を「擬似トランザクション」として専用のメモリプール(Alt Mempool)に送信します。

UserOperation(UserOp)の構造と容量

UserOpは、スマートコントラクトアカウントを通じて実行されるトランザクションを定義するデータ構造です。主なフィールドは以下の通りです:

  • sender:UserOpを送信するアカウントのアドレス。
  • nonce:トランザクションの順序を管理する番号。
  • initCode:アカウント作成時の初期化コード(初回のみ)。
  • callData:実行する操作の詳細(例:トークン送信やコントラクト呼び出し)。
  • callGasLimit, verificationGasLimit, preVerificationGas:ガス関連の設定。
  • maxFeePerGas, maxPriorityFeePerGas:ガス代の上限と優先手数料。
  • paymasterAndData:ガス代を肩代わりするPaymasterの情報(オプション)。
  • signature:UserOpの署名。

UserOpの容量

UserOpのサイズは、ブロックチェーンのトランザクションサイズに依存します。ブロックのガスリミットは約3,000万ガス(2025年時点)、トランザクションの最大サイズは約128KBです。UserOpは多くのフィールドを含むため、データ量は通常のトランザクションより大きくなりがちです。

  • 基本的なUserOpのサイズ:シンプルな操作の場合、約300~500バイト。
  • 複雑なUserOpのサイズ:複数の操作やPaymasterデータを含む場合、数キロバイトに達する可能性。

UserOpはBundlerによって1つのトランザクションにまとめられ、EntryPointコントラクトを通じて実行されます。複数のUserOpを束ねることで効率化が図られますが、ブロックのガスリミットやサイズ上限(128KB)に収まる必要があります。

トークン送信(Token Send)の容量

トークン送信は、ERC-20トークンをあるアドレスから別のアドレスに送る操作です。UserOp内でトークン送信を行う場合、callDataフィールドにトークンコントラクトのtransfer関数の呼び出しが含まれます。

トークン送信のデータサイズ

単一のトークン送信(transfer(address to, uint256 amount))のデータは以下の通り:

  • 関数セレクタ:4バイト
  • 送信先アドレス:20バイト
  • 送信金額:32バイト

合計:約56バイト(オーバーヘッド込みで60~100バイト)。

ガスコスト

トークン送信は通常2万~3万ガスを消費します(トークンコントラクトのロジックや状態変更の複雑さに依存)。UserOp全体のサイズは、トークン送信のデータに加えて他のフィールド(noncesignatureなど)を含むため、単一のトークン送信を含むUserOpは約400~600バイトになります。

UserOpに含められる処理の数

UserOpは複数の操作をバッチ処理できるため、1つのUserOpに複数のトークン送信やコントラクト呼び出しをまとめることが可能です。ただし、含められる処理の数は以下の要因に左右されます:

  • ガスリミット:ブロックのガスリミット(約3,000万ガス)やUserOpのcallGasLimitによる制約。
  • データサイズ:ブロックのサイズ上限(128KB)やメモリプールの制約。
  • 検証コスト:EntryPointコントラクトでの検証に必要なガス(verificationGasLimit)。

処理数の推定

1つのトークン送信が3万ガスかつ100バイトを消費すると仮定して計算します。

  • ガスベースの推定
    UserOpのcallGasLimitが100万ガス(現実的な上限)の場合、約100万 ÷ 3万 = 33件のトークン送信が可能。
  • データサイズベースの推定
    UserOpの基本サイズ(約400バイト)にトークン送信(100バイト)を追加。トランザクションのサイズ上限(128KB)を考慮すると、約(128,000 - 400) ÷ 100 ≈ 1,276件が理論上の上限。

現実的な制約:

Bundlerの効率、ネットワーク混雑、PaymasterやAggregatorの検証コストを考慮すると、1つのUserOpに含められる処理は10~50件が現実的。複雑な操作(例:複数のコントラクト呼び出し)ではさらに少なくなる可能性があります。

具体例

Uniswapでのトークンスワップを例に挙げます。1つのUserOpに以下の操作をまとめることができます:

  • ERC-20トークンの承認(approve
  • トークンのスワップ(swap
  • 別のアドレスへのトークン送信(transfer

各操作は約3万~5万ガス、データサイズは100~200バイトを消費。callGasLimitが100万ガスの場合、約10~20件の操作を詰め込むことが可能です。

まとめ:ERC-4337の可能性

アカウント抽象化(ERC-4337)は、ブロックチェーンのユーザー体験を大きく向上させる技術です。UserOpを活用することで、ガス代の支払いを柔軟にしたり、複数の操作を効率的に処理したりできます。トークン送信のようなシンプルな操作なら、1つのUserOpに10~50件の処理をまとめるのが現実的ですが、操作の複雑さやネットワーク状況で変動します。

これにより、Web3アプリケーションの使い勝手が向上し、DeFi、NFT、ゲームなどの分野で新たな可能性が広がります。あなたはどんなスマートウォレットの活用法を思い描きますか?

せっかくなので実際に試してみた

と、まぁ終わろうかなと思ったのですが、気になったため、単純な処理で実験しようと思います。
ここまで、ERC-4337のUserOperation(UserOp)の容量やトークン送信の理論的なデータサイズ、処理数の上限について解説してきました。では、実際にトークン送信(transfer)だけに絞って検証したらどうなるのか?

ブロックチェーンのネットワーク状況や具体的な操作内容によって、理論値と実運用での結果は異なる場合があります。そこで、ERC-20トークンのtransferに特化した実験を行い、UserOpの容量や処理数を検証しました。

実験のセットアップ

以下の条件で、NERO テストネットを使ってトークン送信のUserOpを検証しました:

  • 環境:NEROテストネット上のERC-4337対応ウォレット(オープンソースのスマートウォレット実装)。
  • 操作内容:ERC-20トークンのtransfer(address to, uint256 amount)のみを単一または複数(10件、50件、200件、400件、500件、600件)で実行。*Paymaseterも活用
  • 計測項目:UserOpのデータサイズ(バイト)、ガス消費量、処理にかかる時間。

実験結果

1. 単一トークン送信(成功)


https://testnet.neroscan.io/tx/0x7fd1456f7f426ba9daa3a92e5913ffe8b8548d35214fb28f0d5b62abca49ea03

2. 複数トークン送信のバッチ処理

10件のトークン送信:成功

https://testnet.neroscan.io/tx/0xa879b9090504d1196e19251e9bdbb85f33b60376b1db2426df7d7e6096e1d93f

50件のトークン送信:成功

https://testnet.neroscan.io/tx/0x3ef20b727c1d5976ec3a1a379af2c97492612ab4a367af1a50970042e2de8a4c

200件のトークン送信:成功

https://testnet.neroscan.io/tx/0xc48d341f526f5ace9824c41d04a1b79efdcd81824ab2693ccba3aa336cdc8383

400件のトークン送信:成功

https://testnet.neroscan.io/tx/0x37a15aea240acccd99205be9b53a38ac87040c3e3f8e69cbc0a4ae59ed4b7c5f

500件のトークン送信:成功

https://testnet.neroscan.io/tx/0xfa179af39d7de2852b31bad5eac31434892000f5925036ac5cda13d79117a836

600件のトークン送信:失敗

今回の環境では、500件までtransferすることができました。処理の中では単純な処理ではありますが、500件まで1つのUserOperation,トラザクションで処理できるのは驚きです。
Internal Txnsタブなどが、すごい量になっていて、もはやアートになっているので、ぜひ見てみてください。
今後、様々な関数をバッチ処理に加えて試してみたいと思います。


参考文献

Discussion