本稿では、この論文を扱います。
https://arxiv.org/pdf/1912.11541.pdf
この記事で紹介する内容
ビットコイン・ネットワークにおけるトランザクションの一種であるオーファントランザクションがビットコインネットワークにどのような影響を与えるのかについて、上記の論文を用いて紹介する。
前提知識
親 / 子トランザクションの定義
ビットコインのトランザクションは、input と output の領域があり、input では使用するコインが自分に送られてきた際のトランザクションを指定している。このように、あるトランザクション(A)の入力として指定されているトランザクションを(A の)親トランザクションと言う。また、あるトランザクション(B)の出力を別のトランザクション(C)が入力として使用する場合、C は B の子トランザクションと言う。
オーファントランザクションの定義
その親がノードのメモリプールやローカルブロックチェーンに存在しないトランザクションを、オーファントランザクションという。
またmemプールとは、ノードのローカルメモリバッファのことである。
以下の図のA,B,Cはトランザクションである。
ビットコインノードが新規トランザクションを受け取った時、ノードはそのトランザクションを検証する必要がある。その検証の1つが、
オーファントランザクションの流れ
- 子トランザクションがビットコインネットワークにブロードキャストされノードに取り込まれる
- ピアに不足している親トランザクションを要求する。その間ノードは子トランザクションを他のノードに伝播せずに、ノードのローカルメモリ内にあるオーファントランザクションプールに移動する
- ノードがピアから要求された親を受信する
- トランザクションがオーファンではなくなり、オーファンでなくなったすべてのトランザクションはオーファンプールからmemプールへと移動し、ノードがトランザクションを処理する
- トランザクションがほかのノードに中継されビットコインネットワークへとブロードキャストされる
オーファントランザクションプール
デフォルトでは、オーファントランザクションプールのサイズは最大100個のオーファントランザクションに制限されており、オーファントランザクションプールがいっぱいになると、オーファントランザクションがランダムに選択されてプールから削除され、削除されたトランザクションはmemプールに追加されることがない。
オーファントランザクションプールのサイズはbitcoindまたはbitcoin-qtの実行時に-maxorphantx引数を使用して起動時に変更するか、bitcoin.conf構成ファイルの設定で変更することができる。
オーファントランザクション
オーファントランザクションは、オーファントランザクションプール内で20分が経過すると期限切れとなり削除される。
オーファントランザクションでのトランザクション自体が非標準であったり、十分な手数料を持っていない場合にはオーファントランザクションが無効であると判断され、このオーファントランザクションはmemプールに受け入れられることはない。さらに、オーファントランザクションがオーファントランザクションプールから削除されるだけでなく、オーファントランザクションを最初に送信したピアも罰せられ、そのピアからのmemプールへのトランザクションはそれ以上受け入れられなくなる。
ピアがノードから切断されるとこのピアが送信したすべてのオーファントランザクションはオーファントランザクションプールから削除され、オーファントランザクションがmemプールに追加されることはない。
本論文の目的
オーファントランザクションがビットコインネットワークのパフォーマンスに影響を与えることは直感的に理解できる。そこで、稼働中のビットコインノードにおけるオーファントランザクションでの測定を通じて、どのようにオーファントランザクションが影響を与えるかを研究している。
測定結果
測定データ群
今回は測定期間中に観測した約4200000件のトランザクション(そのうち87100件がオーファントランザクション)のデータセットを扱う。
オーファントランザクションと親の数との関係
inputが複数のトランザクションからなるときに、親を複数持つことになる。
オーファントランザクションは、普通のトランザクションに比べて親の数が少なく、親の平均値はオーファントランザクションでは1.18人であるのに対し、ノンオーファントランザクションでは2.20人となった。
また、オーファントランザクションのうち、複数の親を持つものは約4%にしか過ぎないのに対し、ノンオーファントランザクションの約25%は複数の親を持っていた。
オーファントランザクションではノンオーファントランザクションに比べ親トランザクションの数が多く、その結果として親のいずれかが欠ける確率が高くなるという仮説は誤りであり、親の数ではオーファントランザクションかそうではないかを適切に区別することはできないことが判明した。
オーファントランザクションと手数料の関係
行方不明となった親トランザクションの大部分が、そうではないトランザクションに比べて取引手数料が低い。
オーファントランザクションでは、平均取引手数料が5.56×10^3
サトシ、ノンオーファントランザクションでは、平均取引手数料が9.91×10^3
サトシとなっていた。
あるトランザクションがオーファントランザクションとなりうる場合は、その親トランザクションの取引手数料が他のトランザクションのものよりも低い場合に限られる。
オーファントランザクションとトランザクションサイズの関係
オーファントランザクションでの親のトランザクションサイズは、通常、他のトランザクションサイズよりも大きい。
オーファントランザクションでは平均取引サイズが5.29×10^2
バイト、ノンオーファントランザクションでは取引サイズが4.80×10^2
バイトとなっていた。
オーファントランザクションと1バイトあたりの手数料の関係
オーファントランザクションでの親のトランザクションの1バイトあたりの取引手数料は、他のトランザクションと比較して、一般的に低い。
1バイトあたりの手数料の平均値はオーファントランザクションでは6.25サトシ、ノンオーファントランザクションでは21.73サトシであった。
1バイトあたりの手数料が小さい取引ほど、オーファントランザクションとなる可能性が高くなる。
注意として、手数料に関係があるのが親トランザクションなのか、子トランザクションなのかは論文からは読み取れない。
オーファントランザクションプールを変化させた場合のオーバーヘッドの変化
ネットワークオーバーヘッド
オーファントランザクションプールのサイズを変化させてデータを収集した結果、オーファントランザクションは、オーファントランザクションプールのサイズが小さいほど、ノードが受信するバイト数は大きくなる。
これはプールがいっぱいになると、新しいオーファントランザクションのためのスペースを確保するために、プール内のトランザクションが急速に追い出されノードへと送られるため、オーファントランザクションプールが小さいと1つのオーファントランザクションが、異なるピアによってアナウンスされることで、プールに複数回追加される可能性があるからである。
オーファンプールのサイズが小さいノードでは、オーファントランザクションがオーファンプールに繰り返し追加されることにより、より大きなネットワークオーバーヘッドが発生する。
トランザクションプールを大きくするにつれ、ネットワークオーバーヘッドは減少する。特にプールのサイズを1000に増やすとネットワークオーバーヘッドは劇的に削減できる。
パフォーマンスオーバーヘッド
CPUオーバーヘッド
以下の表の説明をする。
Round1: 2019年11月18日AM11:00から2019年11月25日AM10:59まで
Round1では、デフォルトのオーファンプールサイズをN_1,N_2
に100,N_3,N_4
に20,N_5,N_6
に50と設定した。
Round2: 2019年11月25日AM11:00から2019年12月02日AM10:59まで
Round2では、デフォルトのオーファンプールサイズをN_1,N_2
に100,N_3,N_4
に500,N_5,N_6
に1000と設定した。
ビットコインプロセスでの平均CPU使用率の差は、さまざまなオーファントランザクションプールサイズの間でほとんど違いがなかった。
メモリーオーバーヘッド
発生するメモリオーバーヘッドは最新のシステムの一般的なメモリよりも数桁小さい値。
トランザクションプールのサイズを変化させても、パフォーマンスオーバヘッドにはあまり影響を及ぼさない。
今後の課題
トランザクションがオーファンとなる取引手数料とサイズに閾値があるかどうかを調査すること。
機械学習技術などを用いてトランザクションがオーファンになるかどうかを予測するアルゴリズムを開発すること。
オーファントランザクションがビットコイン・ネットワークを介して、そのトランザクションが含まれるブロックの伝搬の遅延を引き起こすかどうかを調査すること(注: オーファントランザクションが多いとブロックの中に入るトランザクションの署名検証を採掘前にあらかじめ各ノードが済ませておくことができないので、ブロック伝搬が遅延する可能性がある)。