---
title: "保留中のEthereumトランザクションをデバッグする方法"
description: "送信からマイニングまで、Ethereumトランザクションの流れを解説します。mempool、保留中のトランザクション、そしてAlchemyのツールがどのように役立つかを学びましょう。"
---

# 保留中のEthereumトランザクションをデバッグする方法

Ethereumのブロックチェーンにトランザクションを送信すると、それはどこに行くのでしょうか？ペンディングトランザクションとは何であり、マイニングされる前に何が起こっているのでしょうか？mempoolとは何でしょうか？なぜ自分のトランザクションの一部は成功し、一部は失敗するのでしょうか？

このガイドでは、Ethereumネットワーク上でのトランザクションの流れを、「送信」ボタンを押した瞬間から完全にマイニングされるまで、詳しく見ていきます。その過程で何がうまくいかない可能性があるか、そしてAlchemyの開発者向けツール群がこのプロセスのデバッグと可視化にどう役立つかについても説明します。

このガイドはEthereumに特化していますが、基本的な原則はほぼすべてのブロックチェーンに当てはまります。

## Ethereumのトランザクションとは？

Ethereumのトランザクションとは、最も単純な形で言えば、ブロックチェーンの永続的な状態に新しい情報をエンコードすることをユーザーが要求するものです。このリクエストの内容は、通常次のいずれかの形を取ります。

1. ユーザーの公開アカウントから別の相手への単純な価値の移転（例：ETHを商店に送る）
1. 他の第三者がアクセスできる新しいスマートコントラクトをパブリックブロックチェーン上にエンコードすること（例：新しい抽選スマートコントラクトを開始する）
1. 既存のスマートコントラクトに情報を送り、そのコントラクトとやり取りすること（例：抽選スマートコントラクトに自分の名前と資金を入力する）

## mempoolとは？

Ethereumにおけるトランザクションの流れを理解する前に、まずmempoolが何であるかを理解する必要があります。mempoolとは、Ethereumノード内にある、未確認トランザクションのための待機室であり、ステージングエリアとして機能するよう設定されています。使用しているクライアントによっては、TX-POOLやTX-QUEUEと呼ばれることもあります。

ノードに送信されたトランザクションは、まずmempoolに入り、ネットワークによって完全に確認されるまでそこに留まります。mempoolは以下のような重要なステップを担っています。

1. マイナーに提出された際にトランザクションが成功することを確実にするため、一連の検証テストを実行します。ノードが行う検証には、次のようなものが含まれます。ガス代をカバーするのに十分な資金はあるか？トランザクションの署名は有効か？このトランザクションのnonceは、送信元アドレスにとって次に来るべき順序になっているか？
1. ガス価格に基づいて、処理すべきトランザクションのリストを並べ替えます。ガス価格が高いほど、マイナーによって優先的に処理される可能性が高くなります。
1. ペンディング状態のトランザクションを、ピア接続されたノードのmempoolと共有します。それらのノードはさらに他のmempoolへと転送を続けるため、ネットワーク全体がペンディングトランザクションのリストを見ることができるようになります。ブロックがマイニングされると、ネットワーク全体の中で最もガス価格が高いトランザクションが確認されます。

## Ethereumのトランザクションフローはどのようなものか？

mempoolについて理解したところで、ユーザーがトランザクションを送信してから、それがブロックチェーンに永続的に保存されるまでには、どのようなステップが関わっているのでしょうか？

1. ユーザーが新しいトランザクションを生成し、自身の秘密鍵でそのトランザクションに署名した上で、通常は[Alchemy's Node API.](https://www.alchemy.com/rpc-api)のようなサービスを通じて公開される**eth_sendTransaction**や**eth_sendRawTransaction**というメソッドを呼び出し、ブロックチェーン上のノードへ送信します。
1. トランザクションはノードのmempoolへ送られます。
1. mempoolは一連の検証テストを実行します。トランザクションがこれらの検証を通過すると、ペンディング状態に入ります。
1. ノードはブロックチェーン上の他のノードへトランザクションをブロードキャストし、それぞれのノードのmempoolにも反映されます。
1. ブロックチェーン上のいずれかのノードによって新しいブロックがマイニングされると、ガス価格が最も高いペンディングトランザクション約200件がブロックチェーン上の次のブロックに含まれます。これらのトランザクションはmempoolから取り除かれ、新しいブロックとmempoolの状態がネットワーク全体に伝播されます。
1. さらに5〜7ブロックが確認された後は、ブロックチェーンが別のフォーク（異なる確認済みトランザクションの集合を持つ）に従って再編成される可能性は限りなく小さくなります。この時点で、そのトランザクションは永久にブロックチェーン上にあると見なして問題ありません。

<ImageBlock
  src="https://media.alchemy.com/1703772601-ethereum-transaction-flow.jpeg"
  alt="署名からブロック確認までのEthereumトランザクションフローの図"
  width={1335}
  height={1600}
  caption="Ethereumトランザクションフロー"
/>

## Ethereumのペンディングトランザクションで何がうまくいかない可能性があるか？

### 1. mempoolが満杯になっている可能性がある

まずは単純な話から始めましょう。mempoolのサイズには制限があります（Alchemyのようなツールを使っている場合を除きます！）。この制限はノード全体にもありますし、ノード内のアドレスごとにもあります。[Geth](https://www.alchemy.com/overviews/what-is-a-geth-node-and-how-to-run-one)の場合、典型的には4096件のペンディングトランザクションが上限で、Gethは新しいトランザクションを優先し、古いペンディングトランザクションを破棄します。

### 2. パラメータが無効な可能性がある

トランザクションを作成する際には、さまざまな関連パラメータを含める必要があります。例えば以下のようなものです。

- 送信元アドレスと送信先アドレスは何か？
- 移転する価値はいくらか？
- そのトランザクションにどれだけのガスを使う意思があるか？
- そのトランザクションの現在のnonceはどうあるべきか？

これらの入力を間違えた場合、ノードは通常、問題を説明するエラーコードを返します。エラーメッセージの意味が分からない場合や、Googleで検索しても答えが見つからない場合は、[Alchemy support center](https://www.alchemy.com/support)を訪れてください。

### 3. ガス価格が低すぎる可能性がある

どのトランザクションを優先するかを決定するため、Ethereumのトランザクションはガス価格を添えて提出する必要があります。通常のオークションと同様に、ガス価格が高いほど、そのトランザクションは次のブロックに含まれる可能性が高くなります。逆にガス価格が低すぎると、そのトランザクションは永遠にブロックチェーンに載らないかもしれません。

ガス価格は需要に応じて1日の中で急速かつ予測不可能に変動するため、このフィールドを適切に設定することは非常に重要です。ここにはいくつかの選択肢があります。

- 単一のトランザクションを手動で送信する場合は、**ETH Gas Station website**にアクセスして、最新のガス価格を確認し、それに応じて価格を設定できます。
- Alchemyのようなノードプロバイダーにリクエストを送信している場合、Ethereum JSON-RPCの仕様では[**eth_estimateGas**](https://www.alchemy.com/docs/node/ethereum/ethereum-api-endpoints/eth-estimate-gas)というエンドポイントが公開されており、トランザクションをマイニングしてもらうのにどれだけのガスが必要かを推定してくれます！これを使ってガス価格の設定をプログラム的に自動化できます。
- ガス価格が一定の価格を上回ったり下回ったりしたときにプッシュ通知を受け取りたい場合は、[**Gas Price Notifications in Alchemy Notify**](https://www.alchemy.com/docs/reference/notify-api-quickstart)というツールを提供しています。これはそのような状況で具体的にアラートを出してくれます！webhookなので、ガス価格が低いときに自動的にトランザクションを送信するようコードに組み込むのも簡単です。

<VideoCta
  title="Alchemyダッシュボードの動作を見る"
  description="30分のガイド付きウォークスルー:ダッシュボードの全ツールをライブでデモ"
  ctaHref="/resources/dashboard-demo"
  thumbnail={{
    src: "https://media.alchemy.com/alchemy-dashboard-demo-thumbnail.png",
    alt: "Alchemy Dashboard Demo",
  }}
/>


### 4. nonceが正しくない可能性がある

ああ、誰もが心に抱いている切実な疑問ですね——nonceとは一体何で、なぜ必要なのか？至極まっとうな疑問です、聞いてくださって嬉しいです。

簡単に言うと、nonceとは、あるアドレスから送信されたトランザクションの数です。すでに5件のトランザクション（nonce 0〜4）を正常に確認済みであれば、次のペンディングトランザクションのnonceは5になります。

nonceにはいくつかのルールがあります。

- **nonceは順番通りに発生しなければなりません。** nonce 4のトランザクションは、nonce 5のトランザクションより厳密に前に発生します。
- **nonceは重複したりスキップされたりできません**——成功したトランザクション1件につき、正確に1つのnonceが対応します。nonce 5のトランザクションがなければ、nonce 6のトランザクションを提出することはできません。同様に、nonce 5のトランザクションを2つ提出することもできません——どちらか一方しか通りません。

なぜnonceが必要なのでしょうか？nonceは、あるアドレスからのトランザクションが送信した順序通りに発生することを保証し、[double-spend issue](https://en.wikipedia.org/wiki/Double-spending)からトランザクションを保護するために、暗号学的な観点から必要とされています。

実際には、nonceはトランザクションを作成する際に設定しなければならない単なるパラメータです。これにより、トランザクションの順序をきめ細かく手動で制御できます。

現実的な例として、マーケットプレイスでNFTを購入し、それを見つけるのを手伝ってくれたBobに少額の「発見料」を送りたいとしましょう。この場合、NFTの購入に成功した場合にのみBobに支払いたいはずです。nonceがなければ、両方のトランザクションを提出しつつ、それらが特定の順序で発生することを保証する方法がありません。nonceを使えば、片方のトランザクションにnonce Nを、もう一方にnonce N + 1をラベル付けするだけで済みます！

しかし、このきめ細かな制御は、毎回正しいnonceでトランザクションを提出する必要があることを意味します！トランザクションが詰まっている場合は、上記のルールに従って正しく設定されているかどうかnonceを確認する必要があります。

### 5. ブロックがフォークされる可能性がある

これは気に入るはずです。トランザクションが無事にマイニングされたとしても、まだ安心はできません😡。

ブロックチェーンは分散化されているため、ネットワーク内の異なるノード群がネットワークについて異なる見方をすることがあります。特に、時折2人のマイナーがほぼ同時に新しいブロックをマイニングし、ピア接続されたノードが同じくらいの割合で2つの新しいチェーンに乗ることがあります。その場合、2つの新しいチェーンは並行して伸びていきますが、最終的にはどちらか一方がわずかに多くのコンセンサスを獲得します！

ネットワーク全体が一方のチェーンに切り替わり、もう一方を放棄すると、古いチェーン上ですでに「マイニングされた」トランザクションはフォークされ、無効になります。フォークされたブロックは「uncle block」とも呼ばれます。

つまり、トランザクションがマイニングされた後であっても、ブロックフォークによって無効化される可能性があるということです！[Etherscan上のフォークされたブロックの履歴](https://etherscan.io/blocks_forked)はこちらで見ることができます。幸い[Ethereum mainnet](https://www.alchemy.com/rpc/ethereum)ではそれほど頻繁には起こらず、通常は5ブロック未満の深さですが、だからこそDeFiの取引プロトコルでは、少なくとも5〜7ブロックの確認が得られるまで、トランザクションは決して「完全に」確認されたとはみなされないのです。

## mempoolとEthereumのペンディングトランザクションを管理するにはどのようなツールが使えるか？

### Alchemy mempool watcher

40分前にノードのmempoolにトランザクションを送信したものの、それがブロックチェーン上で確認されるのをまだ見ていない、という状況を想像してください。現在の状態、送信時に設定したガス価格、そしてnonceについての情報がほしいところです。どうすればよいでしょうか？

mempool内のトランザクションの状態にアクセスすることは、（今でも）面倒な作業でした。mempoolの状態にアクセスできる唯一のインターフェースがEthereum JSON-RPC APIであるため、開発者はトランザクションを送信した様々なノードに問い合わせ、何ページにもわたるログを統合・選別し、単一のクエリのためだけにmempoolの状態全体を手作業で再構築しようと、何時間も費やしていました。

混雑したmempoolへの平均的な呼び出しは、このような見た目になります。

<ImageBlock
  src="https://media.alchemy.com/1704722572-successful-request-to-the-mempool-to-fetch-its-status.jpg"
  alt="mempoolステータスリクエストの生のJSONレスポンス、密で読みにくい"
  width={1600}
  height={683}
  caption="この混乱を読み解く作業をお楽しみください。"
/>

さらに悪いことに、開発者がスケールのために複数のノードへリクエストを送信し始めると、深刻な一貫性の問題が生じます。トランザクションは単一のノードから発生するため、特定のトランザクションに関するリクエストは、そのトランザクションとやり取りするたびに毎回同じノードへスティッキールーティングされる必要があります。

こうした課題に対応するため、私たちは[Mempool Watcher](https://dashboard.alchemy.com/mempool)を構築しました。これは、こうした複雑さの多くを簡素化するツールです。まず、ノードのルーティングをすべてこちらで処理するため、スケールのために数十ものノードを利用していたとしても、あなたのmempoolは常に単一のエンティティとして見え、mempoolへのリクエストは私たちのインフラ内で適切なノードへ正しくルーティングされます。

次に、トランザクションの状態をリアルタイムで確認できる、非常に便利なツールを提供します。トランザクションはマイニング済み、ペンディング、ドロップ済みのいずれかとしてマークされます。各トランザクションの記録には、そのトランザクションがペンディング状態にあった期間、必要とされたガスの量、そして追加の詳細情報へのアクセスが含まれます。

<ImageBlock
  src="https://media.alchemy.com/1704724124-alchemy-mempool-watcher.png"
  alt="当社のツールを使うと、mempoolのビューはこうなります。"
  width={1600}
  height={579}
  caption="当社のツールを使うと、mempoolのビューはこうなります。"
/>

### Alchemy explorer

スクリプトを通じて同時に20件の異なるトランザクションをノードに送信したものの、その一部がノードにすら到達せず失敗しているのを見つけたとしたらどうでしょうか？失敗したレスポンスを追跡し、原因となるパターンを見つけるにはどうすればよいでしょうか？

上記と同様に、通常開発者は何ページものログをくまなく調べてパターンを見つけ出す必要がありました。これに対応するため、私たちは、当社のAPIを通じて送信されたJSON-RPCリクエストの状態を追跡できるリクエスト／レスポンスエクスプローラーツールを構築しました！

<ImageBlock
  src="https://media.alchemy.com/1704724183-alchemy-explorer.png"
  alt="過去のJSON-RPCリクエストとレスポンスを一覧表示するAlchemy Explorer"
  width={1600}
  height={928}
  caption="Alchemy Explorer"
/>

[**Alchemy Explorer**](https://dashboard.alchemy.com/explorer)を使えば、1秒前から7日前までの範囲で、私たちのインフラを通じて送信された過去のリクエストとレスポンスを検索できます！もうログを探し回る必要はありません——最新のテクノロジーが手元にあります。

これらのリクエストに対しては、メソッドの種類、HTTPレスポンス、ノード固有のエラーなど、あらゆる種類のパラメータでクエリを絞り込むことができます。タイムスタンプやリクエストの所要時間など、その他多くのオプションに基づいてリクエストを確認することもできます。

## なぜトランザクション管理にAlchemyを使うべきか？

Alchemyはノードプロバイダーであり、Ethereumのブロックチェーン（他にもいくつかのチェーンがあります！）に対するリクエストの送受信に関連するインフラをすべて管理しています。[なぜノードプロバイダーが必要なのか](https://www.alchemy.com//overviews/blockchain-node-providers)についての情報はこちらです。

リクエストを私たちのシステムを通じて送信するようになれば、上記で説明したペンディングトランザクションに関するすべてのメリットを得られます。スケーラブルなmempool、ダッシュボードツール、ガス価格のwebhookです。

それに加えて、以下のものも提供します。

- ブロックチェーンにつきまとうスケーラビリティと一貫性の問題を解決する独自インフラに支えられた、Alchemy's Node APIへのアクセス。
- 上記で説明したようなリクエストの可視化ツールを提供し、アプリケーションの構築と監視を支援するDashboardへのアクセス。
- ブロックチェーン上で発生するトランザクションなどのイベントについてプッシュ通知（webhook）を提供するツール、Alchemy Notifyへのアクセス。
- 通常であれば計算コストが高い、あるいは不可能なブロックチェーンからのリクエストを可能にするEnhanced APIsへのアクセス。
- その他多数、[Flow](https://www.alchemy.com/flow)、[Crypto.org](https://www.alchemy.com/crypto-org)、そして[Polygon](https://www.alchemy.com/layer2/polygon)、[Optimism](https://www.alchemy.com/layer2/optimism)、[Arbitrum](https://www.alchemy.com/layer2/arbitrum)といったL2を含む、さまざまなチェーンにわたってこれらの機能へのアクセスも含まれます！

## Alchemyを使い始める
Alchemy's Node APIと開発者向けツールのロックを解除するのは、驚くほど簡単です——実際、たった1行のコードで済むはずです！これまで[web3.js](https://www.alchemy.com/dapps/web3-js)や[ethers.js](https://www.alchemy.com/dapps/ethers-js)を使っていたなら、[無料でAlchemyアカウントを作成し](https://alchemy.com/?a=a437fb8d33)、APIキーを生成して、インスタンス化の部分を以下のようなものに置き換えるだけの簡単な作業です。

完全なチュートリアルをご希望の場合は、[Getting Started with Alchemy guide](https://www.alchemy.com/docs/alchemy-quickstart-guide)をお読みください。さらにサポートが必要な場合は、[Alchemy support center](https://www.alchemy.com/support)を訪れてください。
