コンテンツへスキップ
0%

Mempoolとは?

Alchemy team headshot

執筆者 Alchemy

2022年4月7日 公開読了時間 1 分

ブロックチェーンのトランザクションにおいて、メンプール(メモリプール)とは、ノードによる検証を経てブロックに取り込まれるのを待っている保留中のトランザクションのリストです。これは、従来のソフトウェア開発において、本番環境にリリースする前にテストや品質管理を行う「ステージング」環境を使用することと似ています。

従来の「ステージング」環境が一元化されているのに対し、メンプールは各ノードがそれぞれ独自に管理しています。トランザクションフローを見ることで、メンプールの目的と、それにアクセスすることで得られる重要な情報について理解しましょう。

Ethereumのトランザクションフロー

Ethereumのトランザクションは、次の3種類に分類されます。

1)シンプルな送金 - ある公開アドレスから別のアドレスへ価値が送られるものです。これは、NFTやサービスに対する支払いである場合があります。

2)スマートコントラクトのデプロイ - スマートコントラクトがブロックチェーン上にデプロイされる際には、トランザクションが生成されます。

3)スマートコントラクトの実行 - あるアドレスがスマートコントラクトのアドレスに対して資金やデータを送りたい場合です。

Alchemyのモニタリングツールを使ってEthereumのトランザクションを監視することができ、Alchemy Transfers APIのようなツールを使って、あるアドレスのトランザクション履歴を調べることができます。

Ethereumのトランザクションは、種類にかかわらずすべて同じライフサイクルをたどります。

1)ユーザーがトランザクションを作成し、自分の秘密鍵を使って署名します。

2)ノードがトランザクションを受け取り、メンプールに格納します。

3)メンプール内にある間、ノードはトランザクションの検証テストを行います。メンプールがこのテストに合格すると、トランザクションのステータスは「Pending(保留中)」に移行します。

4)ノードは保留中のトランザクションをネットワーク上の他のすべてのノードにブロードキャストし、それぞれのメンプールにも追加させます。

5)新しいブロックが生成される際、ブロックコンストラクタはガス価格の高いトランザクションから優先的に取り込みます。これにより、トランザクションは「Successful(成功)」状態に移行します。

6)トランザクションが含まれるブロックの後に、ノードが新しいブロックを追加するたびに、そのトランザクションは確認(confirmation)を受け取ります。時間の経過とともにブロックが再編成されるリスクが減少するため、これによりトランザクションがブロックチェーンに永続的に追加されたという保証が得られます。

署名からmempoolを経て確認に至るEthereumトランザクションのライフサイクル図
Ethereumトランザクションフロー

トランザクションの送信方法や、実際に自分でトランザクションを送る方法についてはこちらで詳しく学べます。

メンプールの目的

ブロックチェーンは不変であるため、ブロックチェーンに記録されるトランザクションが正しくエラーのないものであることが重要です。メンプールをホストするノードは、トランザクションがブロックチェーンにコミットされるプロセスが始まる前に、各トランザクションを検証するという重要な役割を担っています。

開発者にとっては、トランザクションが失敗したり「Pending」状態のまま止まったりする理由を理解するために、これらの検証テストについて把握しておくことが重要です。

1. 資金の有無

ノードは、送信元アドレスが送金額とトランザクション完了に必要なガス代の両方をカバーするのに十分な資金を持っているかどうかを検証します。この検証に失敗すると、トランザクションはメンプールから削除されます。この検証を確実に通過させるためには、送金額や送信先アドレスなどのパラメータを正しく指定することが重要です。

2. トランザクション署名の有効性

各トランザクションは、送信元アドレスによって署名されている必要があります。これは、送信者が確かにそのアドレスの所有者であることを識別するためのものです。ノードは、その署名が送信元アドレスに紐づく正しいものであるかどうかを検証します。

送信者アドレスに対してトランザクション署名を検証するノードの図
トランザクション署名の妥当性 [出典]

3. 正しいnonce値

nonce値とは、送信元アドレスから送信されたトランザクションの数を表す値です。送信元が新しいトランザクションを送信するたびに、nonce値は1ずつ増加します。nonce値は、あるアドレスから送られる各トランザクションが送信された順序どおりに処理されることを強制するため、重要な役割を持っています。

トランザクションのnonce値を検証するノードの図
ノードによるNonce値の検証

トランザクションのnonce値が重複したりスキップされたりしないようにすることで、二重支払いや利用可能な資金以上の支払いといった問題を防ぐことができます。ノードは、保留中のトランザクションに正しいnonce値が付与されているかを検証します。このテストに失敗した場合、トランザクションは先に進みません。

4. ガス価格

メンプールによっては、同時に保持できるトランザクションの数に上限があります。Ethereumクライアントとして広く使われているGethには、デフォルトでpendingが4096件、queuedが1024件という上限が設定されています。この上限に達すると、容量を管理するために、ガス価格が最も低いトランザクションからメンプールから削除されます。

メンプールへのアクセス

メンプール構造の大きな利点の一つは、保留中のトランザクションを置き換え用のトランザクションで上書きし、修正、高速化、あるいは完全なキャンセルができることです。

メンプールに詰まった保留中のトランザクションを修正する以外にも、メンプールへのアクセスは次のような場面で役立ちます。

1. ガス代の見積もり

現在保留中のトランザクションのリストと、それに付随する手数料を確認することで、手数料の払い過ぎを避けられます。

2. NFTマイニング

メンプールスキャナーを使うことで、ユーザーはNFTコントラクトとやり取りしている保留中のトランザクションを把握し、より高いガス代を提示してそれらのトランザクションを出し抜くことができます。

3. パフォーマンスに関する知見

Notify APIのようなサービスを利用することで、スマートコントラクトの開発者はメンプールからスマートコントラクトのアクティビティに関する知見を得られます。保留中のトランザクションは、スマートコントラクトのバグや脆弱性についての情報を提供してくれます。

まとめ

メンプールは、ブロックチェーンの機能と健全性において重要な役割を果たしています。ノードがトランザクションを検証し、マイナーがガス代に応じて保留中のトランザクションに優先順位をつけられるようにすることは、トランザクションの流れにとって不可欠な要素です。

開発者はまた、メンプールが提供するデータを活用して、自分たちのスマートコントラクトにおけるコストや問題を減らすこともできます。メンプールはブロックチェーンの「ダークフォレスト」としばしば形容されてきましたが、Alchemy Monitoringのようなツールを備えたプラットフォームによって、ユーザーはこの重要なステップをより明確に把握できるようになります。

Background gradient

ブロックチェーンで魔法を生み出す

Alchemyは、最も強力なweb3開発者向けプロダクトとツールを、豊富なリソース、コミュニティ、そして卓越したサポートと組み合わせて提供します。