要約:
- メモリープールとは、マイナーやバリデータの承認待ちのトランザクションを保管する場所です。
- メモリープールはノード上に存在しています。単一のメモリープールがあるわけではなく、各ノードがそれぞれのメモリープールに承認待ちトランザクションを保管しています。
- ユーザーが送信したトランザクションは、まずノードによってチェックされます。審査をパスするとメモリープールに入れられ、他のノードに共有されます。
メモリープールとは
メモリープール(mempool)とは、マイナーやバリデータに承認される前(ブロックチェーンに追加される前)のトランザクションの保管場所です。より厳密には、承認前のトランザクションを保管するために、各ノードが割り当てる容量です。
出典:babypips
メモリープールは「承認前トランザクションの待合室」とも表現されます。
ノードごとに存在する
メモリープールは共通のものがあるわけではなく、各ノードがそれぞれ保有しています。メモリープールの中身はノードごとに一致しているわけでもありません。
割ける容量の大きいノードは、より多くの承認前トランザクションを保管できます。
詳細は後述しますが、ユーザーのウォレットから送られたトランザクションは、つながりのあるノードに送られ、最初に受け取ったノードはつながりのあるノードに共有します。各ノードはこのように、メモリープールに含めたトランザクションを伝播させていきます。
メモリープールが必要な理由
利便性の向上
メモリープールが待合室として機能するおかげで、ユーザーは自由にトランザクションを送れます。
前提として、1つのブロックに全てのトランザクションを入れることはできません。そのため、ユーザーから送られてきたトランザクションが多いと、マイナーやバリデータはガス代が高いトランザクションを優先的にブロックに含めます。
したがって、一部のトランザクションはすぐにはブロックに含めてもらえず、含めてもらうのを待っていないといけません。メモリープールは、そういった経緯で発生した承認待ちのトランザクションを保管できます。
もしメモリープールがなかったら、トランザクションの送り直しを要求されたかもしれません。
ちなみに以下のグラフの青線は、ビットコインの1つのブロックに入っているトランザクション数を表しています。だいたい2,000前後で推移しています。
マイナーやバリデータにとって有利
またメモリープールがあるおかげで、マイナーやバリデータは収益性を高められます。
ブロックに入れられたトランザクションにかかる手数料は、そのブロックを生成したマイナーやバリデータの報酬になります。そのため、高いガス代が設定されたトランザクションを優先すれば、得られる報酬が多くなります。
メモリープールがあるおかげで、マイナーやバリデータはトランザクションを比較でき、有利なトランザクションを優先的にブロックに入れられ、報酬を増やせます。
メモリープールのデータは確認可能
メモリープールのデータは、ブロックチェーンエクスプローラーなどから確認できます。メモリープールは承認待ちのトランザクションの待合室なので、ブロックチェーンを使う人がどれだけいるか(ブロックチェーンの健康状態)が分かります。
試しにビットコインのメモリープールを見てみたいと思います。以下は2023年5月6日時点の24時間表示のメモリープールの様子です。
出典:Johoe’s Bitcoin Mempool Statistics
上記のグラフは、設定されたガス代の高さでトランザクションを色分けしています。上にある赤っぽい部分はガス代が高いトランザクション、下にある青っぽい部分はガス代が低いトランザクションです。一度に含められるトランザクションの量(weight)には制限があるので、マイナーは上にあるトランザクションから優先的にブロックに含めます。
以下も、2023年5月6日時点の24時間表示のメモリープールの様子です。今度はトランザクションの数が縦軸になっています。
出典:Johoe’s Bitcoin Mempool Statistics
以下も2023年5月6日時点の24時間表示のメモリープールの様子です。トランザクションを重さ(weight)が縦軸になっています。
出典:Johoe’s Bitcoin Mempool Statistics
ちなみにvMB(バーチャルメガバイト)とは、ビットコインがトランザクションの容量を計測する際に使う単位です。
ビットコインでは、トランザクションの容量(重さ)を「weight unit」という単位で表します。4,000,000 weight unitsまでなら1つのブロックに入れられます。
weight unitsのほか、vbyte(バーチャルバイト)という単位も存在しており、「4 weight units = 1 vbyte(= 1 vsize)」という関係性です。したがって4,000,000 weight unitsは、1,000,000 vbytesや1vMBとも表せます。
4vMBは、実際には2MBくらい、理論上4 MBくらいと言われています。
以下は、全期間(利用したサイトの全期間)のビットコインのメモリープールの様子です。縦軸はトランザクションの数です。
出典:Johoe’s Bitcoin Mempool Statistics
2023年5月時点が一番トランザクションの数が多いですね。
以下は、全期間のビットコインのメモリープールの様子です。縦軸はトランザクションの重さです。
出典:Johoe’s Bitcoin Mempool Statistics
トランザクションの流れ
トランザクションの流れについて整理してみたいと思います。トランザクションの流れにはメモリープールも大きく関係しています。
トランザクションとは、メッセージに署名を付与したものです。例えば、メタマスクで1 ETHを送るという内容を入力して署名すると、トランザクションを作成したことになります。作成したトランザクションは自動でノードに送られます。
トランザクションの流れは以下の通りです。
- ユーザーがウォレットで送金条件を入力する
- ユーザーは署名を行う
- トランザクションがノードに送られる
- ノードはトランザクションを検証する
- 問題なければメモリープールに加えられ、接点のあるノードにトランザクションを共有する
- マイナー・バリデータがトランザクションをブロックに入れる
- ブロックが承認されれば、トランザクションは確定となる
- ノードは確定済みトランザクションをメモリープールから削除する
以下はイメージです。上記の手順1〜5を表しています。
出典:Alchemy
何を検証するのか
送信されたトランザクションは、ノードに検証されて合格したらメモリープールに入れてもらえるのでした。
ノードはブロックチェーンのルールに従ってチェックしていますが、具体的に何をチェックしているかというと、以下のような点が挙げられます。
- 十分な資金があるか(送金、ガス代)
- トランザクション作成者が送信者本人か
- 送信内容に改ざんがされていないか
- ナンス(Nonce)
不合格の場合は、ノードによってトランザクションが拒否されます。
上記のナンス(Nonce)は、イーサリアムなどの場合のみチェックされます。イーサリアムのナンスとは、そのウォレットアドレスが送信したトランザクションの順序を数える数字です。
例えばナンス1のトランザクションは、ナンス0のトランザクションよりも先には承認されないなどのルールがあり、ノードはこれをチェックします。
検証前にメモリープールに入れられる?
「送信されたトランザクションは、検証されてからメモリープールに入れられる」と説明しましたが、この点は誤っているかもしれません。
調べていると「メモリープールに入れられ、その後に検証される。検証をパスしたトランザクションは「pending」状態となる」という説明もありました。
いろいろ調べましたが不明でした、、
参照
↓ビットコインのMempoolについて
↓イーサリアムのMempoolについて
↓ビットコインのブロックサイズについて
↓イーサリアムのナンスについて
コメント