AAトランザクションを送ってEtherscanで確認してみる

### はじめに
ERC-4337は、イーサリアムにおけるアカウント抽象化（Account Abstraction）を実現するための提案であり、ユーザーエクスペリエンスの向上やウォレットの柔軟性を高めることを目的としています。この記事では、ERC-4337を活用してAAトランザクションを送信する手順を解説します。また、Etherscanでこれらのトランザクション情報を確認する方法についても説明します。
https://x.com/etherscan/status/1869347003123236986

### 1. 環境のセットアップ

まず、必要なライブラリをインストールします。以下のコマンドで`ethers.js`と`userop.js`をインストールしてください。

```bash
npm install ethers userop.js
```

### 2. ウォレットの作成

次に、秘密鍵からウォレットを作成します。これは、ユーザーのアカウントを管理するために必要です。

```javascript
const { Wallet } = require('ethers');

const privateKey = 'YOUR_PRIVATE_KEY';
const wallet = new Wallet(privateKey);
```

### 3. UserOperationの構築

ERC-4337では、トランザクションの代わりに`UserOperation`を使用します。以下のコードで`UserOperation`を構築します。

```javascript
const { Client, Presets } = require('userop.js');

const entryPoint = 'ENTRY_POINT_ADDRESS';
const simpleAccountFactory = 'SIMPLE_ACCOUNT_FACTORY_ADDRESS';
const rpcUrl = 'RPC_URL';

const account = await Presets.Builder.SimpleAccount.init(
  wallet,
  rpcUrl,
  entryPoint,
  simpleAccountFactory
);

const target = 'RECIPIENT_ADDRESS';
const value = ethers.utils.parseEther('AMOUNT_IN_ETHER');

const userOp = account.execute(target, value, '0x');
```

### 4. UserOperationの送信

構築した`UserOperation`をバンドラーに送信します。バンドラーはこれらの操作をまとめてブロックチェーンに送信します。

```javascript
const client = await Client.init(rpcUrl, entryPoint);

const response = await client.sendUserOperation(userOp, {
  onBuild: async (op) => {
    console.log('Signed UserOperation:', op);
  },
});

console.log('UserOpHash:', response.userOpHash);

const event = await response.wait();
console.log('Transaction hash:', event?.transactionHash ?? null);
```

これで、ERC-4337を使用したアカウント抽象化トランザクションの送信が完了しました。

## Etherscanでのアカウント抽象化トランザクションの確認手順

Etherscanは、イーサリアムのブロックチェーンエクスプローラーであり、トランザクションの詳細情報を確認するのに役立ちます。以下の手順で、アカウント抽象化トランザクションの情報を確認できます。

### 1. Etherscanへのアクセス

まず、ウェブブラウザで[Etherscan](https://etherscan.io/)にアクセスします。

### 2. トランザクションハッシュの検索

上部の検索バーに、確認したいトランザクションのハッシュを入力し、検索アイコンをクリックします。

### 3. トランザクション詳細の確認

検索結果として表示されるトランザクションの詳細ページで、以下の情報を確認できます。

- **AA Transaction Hash（アカウント抽象化トランザクションハッシュ）**: トランザクションの一意の識別子です。

- **Bundle Transaction Hash（バンドルトランザクションハッシュ）**: 複数のトランザクションがまとめられたバンドルの識別子です。

- **Status（状態）**: トランザクションの成功、失敗、保留中などの状態が表示されます。

- **Block（ブロック）**: トランザクションが含まれているブロック番号と、そのブロックの確認数が表示されます。

- **Timestamp（タイムスタンプ）**: トランザクションがブロックチェーンに記録された日時が表示されます。

- **From（送信元）**: トランザクションを送信したアドレスが表示されます。

- **To（送信先）**: トランザクションの受信者のアドレスが表示されます。

- **Value（値）**: 送信されたETHの量が表示されます。

- **Transaction Fee（トランザクション手数料）**: トランザクションの実行にかかった手数料が表示されます。

- **Gas Price（ガス価格）**: トランザクションのガス価格が表示されます。

- **Entry Point（エントリーポイント）**: アカウント抽象化トランザクションのエントリーポイントとなるコントラクトアドレスが表示されます。

![](https://storage.googleapis.com/zenn-user-upload/8c1325a28d5d-20241219.png)

### 4. 内部トランザクションの確認

「Internal Txns」タブをクリックすると、トランザクション内で発生した内部的なETHの移動や、スマートコントラクト間の呼び出しを確認できます。これにより、トランザクションの詳細な動作を把握することができます。

### 5. ログの確認

「Logs」タブをクリックすると、トランザクションに関連するイベントログを確認できます。

## Githubディレクトリ
https://github.com/aki-0517/erc4337-tx

## まとめ
今回、ERC-4337 を活用してAAトランザクションを作成し、Etherscan を使用してその詳細を確認する手順を実践しました。これにより、より柔軟でユーザーフレンドリーなウォレット機能の実現可能性を確認できました。

ERC-4337 によるアカウント抽象化は、ユーザーエクスペリエンスの向上やセキュリティ強化に寄与する技術として注目されています。今後の発展に伴い、さらに多くのユースケースや実装方法が登場することが期待されます。

詳細な解説や最新情報については、以下のリソースも参考にしてください：

- [ERC 4337: account abstractionとは何か_勉強会資料 - Qiita](https://qiita.com/oggata/items/b1e59db8d9a59cc6881d)
- [Account Abstraction(ERC4337)を、具体的な処理を追ってしっかりと理解してみましょう。 - Zenn](https://zenn.dev/yuki2020/articles/00242351b3b3aa)
- [ERC4337からAccountAbstractionを理解する - GMOインターネットグループ グループ研究開発本部](https://recruit.gmo.jp/engineer/jisedai/blog/erc4337/)

これらの資料を活用して、アカウント抽象化の理解を深め、実装に役立ててください。