イーサリアムのtxpoolについて
このブログの対象読者
- イーサリアム、Ethereum virtual machine(EVM)について知りたい方
- 暗号資産に触れたことがあり、どのような動きが起こっているのか理解したい方
はじめに
前々回のブログでは、イーサリアムのトランザクションについて、前回のブログではThe Merge(コンセンサスアルゴリズムの移行)について取り上げました。今回のブログでは、その間に位置するノード、txpoolについて取り上げます。トランザクションが送られ、ブロックに取り込まれるまでの過程についてみていきます。
今までイーサリアムを使っていて、なぜトランザクションが成功するまでに時間を要するのか?と考えた方もいると思います。txpoolを理解することで、その疑問も解決すると思います。
最初に、復習としてトランザクションがブロックに取り込まれるまでの全体の流れを理解します。次に、今回のテーマであるノード、txpoolについてみていきます。
トランザクションがブロックに取り込まれるまで
トランザクションがブロックに取り込まれるまでには、以下のステップがあります。
- externally owned accounts(EOAs)がデータに署名し、トランザクションを送る
- トランザクションは、ノードによってネットワークに拡散され、他の多くのトランザクションとともにtxpool(Tx Pool)で待機する
- トランザクションは、バリデーターによってブロックに取り込まれる
1については、イーサリアムのトランザクションについてで詳しく紹介しました。3についてもEthereumのThe Mergeによって変化したことについて解説で、ブロックの生成がエネルギー消費によるマイナーの競争(PoW)から、Etherをステーキングしているバリデーターの役割(PoS)に変更になったことを書きました。詳しくは過去のブログを参考にしてください。今回のブログの対象は2になります。ここからは2について詳しく見ていきます。
ノードにおけるtxpool(Tx Pool)
署名されたトランザクションがブロックに取り込まれるまでには、以下の過程を通過する必要があります。
ノードへ
EOAsが署名したトランザクションはノードに送られます。ノードに送られたトランザクションはすぐにブロックに取り込まれません。ノードにあるtxpoolに送られます。
txpoolへ
txpoolとは、ノードにあるトランザクションが待機する場所です。このtxpoolにあるトランザクションはまだブロックに含まれていません。他のトランザクションと共に、txpoolでバリデーターによってブロックに取り込まれるのを待ちます。他のブロックチェーン(例えば、Bitcoinのノード)では、mempool(memory pool)またはtransaction poolと呼ばれています。
txpoolの役割
txpoolはトランザクションにとって単なる待合室ではありません。txpoolはヴァリデーションという大きな役割を担います。
まずtxpoolに入る前に、トランザクションのハッシュが既に存在しているものか、またトランザクションの署名が正しいものであるかが検証されます。次にtxpoolにおいて、さらなる検証が実行されます。txpoolにおける検証には、
- トランザクションのサイズは適切なものであるか
- トランザクションのガスが現在のブロックのガスリミットを超えていないか
- トランザクションが正しいnonceを使用しているか
- トランザクションを送ったEOAsが十分なetherを保持しているか
などがあります。(他にもいくつかの検証項目があります。詳しくはgo-ethereumのtxpoolのコード[https://github.com/ethereum/go-ethereum/blob/master/core/txpool/txpool.go]にあるとvalidateTxという関数を確認して下さい。)
これらの検証を通過したトランザクションは、pendingなトランザクションとされます。
ノードからノードへ
プールというと、たったひとつの場所にトランザクションが入っている印象を受けます。しかし、txpoolは各ノードに存在します。pendingとされるトランザクションは、一つのノードから、そのノードと接点のあるノードに拡散されます。ノードからノードへの伝播を繰り返すことによって、トランザクションはネットワークに広がり、各ノードのtxpoolにいれられます。
注意すべき点は、各ノードのtxpoolのサイズが異なることです。そのため、各ノードのtxpoolが保持するトランザクションの数は異なる可能性があります。
ブロックへ
トランザクションは、バリデーターによってtxpoolからブロックへ取り込まれます。トランザクションがブロックに取り込まれると、トランザクションはsuccessfulな状態であると位置づけられます。ブロックに含まれたトランザクションは、txpoolから消去されることになります。
以上がトランザクションがノードからノードへ拡散し、バリデーターによってブロックに取り込まれる過程になります。トランザクションは、ブロックに取り込まれるまでtxpoolにあることが確認できたと思います。
最後に
今回のブログでは、txpoolについて説明しました。ノードに送られたトランザクションは、txpoolによってブロックに含まれることを待ちます。その際に、ガス、nonce、アカウントのether保有量など、そのトランザクションを実行する上で必要とされる項目について検証が行われます。
DApps利用の際、トランザクションが完了するまで待ち時間がある際には、txpoolの存在を思い出してみてください。あなたのトランザクションは、txpoolでバリデーターに拾われるのを待っています!
最後までご覧いただき、ありがとうございました。
また、現在モノバンドル株式会社では、エンジニアを採用中です!
ぜひフルリモートで、スピード感や大きな変化を楽しみながらぜひ働いてみませんか?
参考資料
What is a Mempool?
What happens when you send 1 DAI
TRANSACTIONS
How to Debug Pending Ethereum Transactions
Mempool
Is your EVM node good enough?
Metamask transactions tutorial – a developer’s guide to transactions in Ethereum mempool
Discussion