メインコンテンツまでスキップ

EntryPoint

このページでは、BOT Chain にデプロイされた EntryPoint のオンチェーンインターフェースを説明します。UserOperation を直接送信する場合、呼び出し側が Bundler の役割を担います。

EntryPoint の検証・実行フロー

1. PackedUserOperation​

EntryPoint は次のオンチェーン構造を受け取ります。

struct PackedUserOperation {
address sender;
uint256 nonce;
bytes initCode;
bytes callData;
bytes32 accountGasLimits;
uint256 preVerificationGas;
bytes32 gasFees;
bytes paymasterAndData;
bytes signature;
}

1.1 フィールドとエンコード​

フィールド意味エンコードレイアウト
senderスマートアカウントアドレスsmartAccount(160)
nonceEntryPoint が管理する 2 次元 noncekey(192) ‖ sequence(64)
initCode初回デプロイ用 Factory アドレスと calldata未デプロイ:factory(160) ‖ factoryData(N)、デプロイ済み:0x
callDataスマートアカウントへの実行データselector(32) ‖ encodedArguments(N)
accountGasLimits検証・実行の Gas 上限verificationGasLimit(128) ‖ callGasLimit(128)
preVerificationGasオンチェーン検証外の calldata・bundle オーバーヘッドpreVerificationGas(256)
gasFeesEIP-1559 優先手数料と最大総手数料maxPriorityFeePerGas(128) ‖ maxFeePerGas(128)
paymasterAndData任意の Paymaster、Gas 上限、独自データ使用時:paymaster(160) ‖ paymasterVerificationGasLimit(128) ‖ paymasterPostOpGasLimit(128) ‖ paymasterData(N)、未使用:0x
signatureスマートアカウントが検証する認可データaccountSignature(N)

括弧内は bit 長で、N は可変長です。

2. 実行インターフェース​

function handleOps(PackedUserOperation[] calldata ops, address payable beneficiary) external;
function handleAggregatedOps(UserOpsPerAggregator[] calldata opsPerAggregator, address payable beneficiary) external;

2.1 handleOps​

引数説明
ops署名アグリゲーターを使わない UserOperation 配列
beneficiaryバッチの実際の Gas 手数料を受け取るアドレス

EntryPoint はバッチ全体を検証してから、各アカウントの callData を実行します。検証エラーはバッチ全体を revert する場合があります。ビジネス実行の revert はイベントに記録され、外側のトランザクションを必ずしも revert しません。

2.2 handleAggregatedOps​

アカウントがゼロ以外の署名アグリゲーターを返す場合に使用します。UserOperation はアグリゲーター別にグループ化され、各グループが集約署名を保持します。署名集約が不要なら handleOps を使用します。

フィールド型説明
userOpsPackedUserOperation[]現在のアグリゲーターが処理する操作
aggregatorIAggregatorグループのアグリゲーター。ゼロアドレスは集約不要を示す
signaturebytesグループの集約署名

3. Hash、nonce、アドレス​

function getUserOpHash(PackedUserOperation calldata userOp) external view returns (bytes32);
function getNonce(address sender, uint192 key) external view returns (uint256 nonce);
function incrementNonce(uint192 key) external;
function getSenderAddress(bytes memory initCode) external;

3.1 getUserOpHash​

アカウントが検証する UserOperation hash を返します。hash は次を結び付けます。

  • signature を除く UserOperation の内容
  • 現在の EntryPoint アドレス
  • 現在の chainId

署名後に対象フィールドを変更すると署名は無効になります。

3.2 getNonce​

指定アカウントと nonce key の次の完全な nonce を返します。

nonce = uint192 key || uint64 sequence

SimpleAccount は既定で key 0 を使用します。Owner EOA のトランザクション nonce やスマートアカウントの eth_getTransactionCount で代用しないでください。

3.3 incrementNonce​

呼び出し側が自分の nonce key の sequence を先に進めます。通常は検証成功後の EntryPoint による更新を利用します。

3.4 getSenderAddress​

initCode から反実仮想アカウントアドレスを計算します。常に revert し、独自エラー SenderAddressResult(address sender) で結果を返します。

4. Deposit と stake​

function getDepositInfo(address account) external view returns (DepositInfo memory info);
function balanceOf(address account) external view returns (uint256);
function depositTo(address account) external payable;
function withdrawTo(address payable withdrawAddress, uint256 withdrawAmount) external;
function addStake(uint32 unstakeDelaySec) external payable;
function unlockStake() external;
function withdrawStake(address payable withdrawAddress) external;

4.1 Deposit​

Deposit はアカウントまたは Paymaster が UserOperation Gas 支払い用に EntryPoint へ事前入金する残高です。

メソッド説明
balanceOfエンティティの deposit を照会
getDepositInfodeposit、stake、ロック解除状態を一括照会
depositTo任意のアドレスから指定エンティティへ入金
withdrawTo呼び出し側自身の deposit を引き出す

4.2 Stake​

Stake は Factory、Paymaster、アグリゲーターが検証・レピュテーション規則を満たすためにロックする資金で、Gas 支払いには直接使いません。

メソッド説明
addStakestake を追加して最短ロック解除遅延を設定
unlockStakeロック解除待機期間を開始
withdrawStake待機期間後に stake を引き出す

Deposit と stake は独立しています。stake だけでは Gas を支払えず、deposit だけでは制限付き storage へアクセスするエンティティに対する Bundler の stake 要件を満たすとは限りません。

5. 主要イベント​

イベント主なフィールド用途
UserOperationEventuserOpHash, sender, paymaster, nonce, success, actualGasCost, actualGasUsed各 UserOperation の最終結果
AccountDeployeduserOpHash, sender, factory, paymaster反実仮想アカウントのデプロイを記録
UserOperationRevertReasonuserOpHash, sender, nonce, revertReasonビジネス呼び出しの revert データ
PostOpRevertReasonuserOpHash, sender, nonce, revertReasonPaymaster postOp の revert
UserOperationPrefundTooLowuserOpHash, sender, nonce実行中の prefund 不足
BeforeExecutionなし検証段階と実行段階のイベントを分離
Deposited / Withdrawnaccount, amountdeposit の変更
StakeLocked / StakeUnlocked / StakeWithdrawnaccount, stake, timestake のライフサイクル

外側の handleOps が成功しても、各 UserOperation の成功を意味しません。UserOperationEvent.success を確認してください。

6. 主要エラー​

エラー説明
FailedOp(opIndex, reason)指定操作が検証または prefund 段階で失敗
FailedOpWithRevert(opIndex, reason, inner)アカウント、Factory、Paymaster の内部 revert データを伴う失敗
PostOpReverted(returnData)Paymaster の postOp が revert
SignatureValidationFailed(aggregator)集約署名の検証失敗
SenderAddressResult(sender)getSenderAddress の想定結果コンテナ