ビットコインを送金する際、なるべく手数料を払いすぎたくないのが人の性です。ただ、手数料は送金需要によって変動するため、あまりギリギリを攻めすぎても長時間トランザクションがブロックに含まれないリスクが大きくなってしまいます。

大抵のウォレットにはおまかせで手数料を決めてくれる機能があり、これは手数料推定機能と呼ばれることがあります。実は手数料推定アルゴリズムには複数種類あることをご存知でしょうか?

今日はビットコインの手数料推定アルゴリズムについて深堀りしてみましょう。

・近年一般的なメモリプールベースの手数料推定

・払い過ぎやすい、実績ベースの手数料推定

・2つを組み合わせたハイブリッド型手数料推定と、その利用方法

近年一般的なメモリプールベースの手数料推定

送金する際に、Mempool.spaceのようなブロックエクスプローラーでメモリプールの状態を確かめている方は多いのではないでしょうか。次のブロックは10 sat/vbyte以上のトランザクションで埋まっているので急ぎならそれを少し超える手数料率、あるいは数ブロック先は2 sat/vbyte程度なので急ぎでないなら節約する…といった風に。

次のブロックには2 sat/vbyte、それ以降には1 sat/vbyte出せば含まれそうなことがわかります。
次のブロックが見つかるまで平均10分かかるので、そのときの手数料推定としては3 sat/vbyte出すかどうかが基準となっています。

このとき、あなたはメモリプールベースの手数料推定を行っています。最近は多くのウォレットがこの方式を取っているので、手数料を払いすぎてしまうことは比較的珍しくなりました。

ただし、現在のメモリプールを見てギリギリの数字に手数料を決めていると、手数料がグングン上がっていく局面でトランザクションが取り残されることがあります。あくまで確実性・速さとのトレードオフがなくなるわけではないことに注意が必要です。

払い過ぎやすい、実績ベースの手数料推定

Bitcoin Coreのウォレットは手数料を高く見積もりがちという評判があります。そう、Bitcoin Coreのノードに同梱されているウォレットはメモリプールベースではなく、「実績ベース」の手数料推定を行っているのです。

実績ベースの手数料推定において、Bitcoin Coreはそれまでの一定期間において自ノードのメモリプール内にトランザクションが初めて現れてからブロックチェーンに取り込まれるまで何ブロックかかったかというデータを分析し、それを元に「この手数料水準なら何ブロックかかる」という相場感を形成します。つまり、現在の環境を見るメモリプールベースの手数料推定とは逆に、現在の環境は一切考慮していません。

求める優先順位によって最近のトランザクションを重み付けするようになっていますが(Economical Mode=節約モード=最近のトランザクション重視、Conservative Mode=確実性モード=高めに出やすい)、データ分析の手法の特徴として過去の実績値に振り回されるため、一旦手数料相場が上がってから下がり始める際も、手数料推定は引き続き高めの値を返しやすいという特徴があります。

💡
特にエアドロップやステーキング、NFTのリリースなどで急激に短期間手数料が上がる状況では、その後再び急激に手数料相場が下がることがよくありますが、Bitcoin Coreでは急騰前の手数料相場で配信されて長時間取り残されたトランザクションを見て「この手数料率では全然足りない」と判断してしまうことになります。

先述したメモリプールベースの手数料推定を採用するMuunとBitcoin Coreの「次のブロックに入れるための手数料(推定)」を比較すると、Muunは手数料の上昇も下落もグレーの破線で表される最適値についていくのに対し、Bitcoin Coreは一度上昇すると高めの水準から下がりにくいことがわかります。

ただし、ギリギリを攻めすぎて手数料上昇についていけず長時間トランザクションが承認されない事態の発生確率はBitcoin Coreの方式のほうが低いと思われます。また、メモリプールベースの手数料推定は「スピード重視」であれば上位1ブロック分を目指せばよいので設定すべき手数料水準が明快ですが、仮に「1時間待てる」「1日待てる」といった場合には設定すべき水準が明確ではありません(その間に手数料相場がどう変動するか想像するしかない)。

そのような場合はBitcoin Coreのような実績ベースの手数料推定であれば「これくらい手数料をケチると、何ブロック後には大半が承認される」という統計情報に基づいて手数料率を決めることができるというメリットがあります。

この2つの方式のいいとこ取りを目指す、ハイブリッド型の手数料推定アルゴリズムも存在します。

2つを組み合わせたハイブリッド型手数料推定と、その利用方法

アメリカを中心にカストディ型のライトニング対応ビットコインウォレットを運営しているStrike社は、事業上急ぎの送金(顧客の出金)とそれほど急ぎではない送金(ライトニングチャネルの開閉)があります。彼らはライトニング実装としてLNDを利用していますが、LNDはカスタムの手数料推定APIを設定できるようになっているため、Strikeでハイブリッド型の手数料推定アルゴリズムを実装したそうです。

💡
lnd.conf内、feeurl変数に指定したAPIにアクセスすると、何ブロック以内に承認を目指すかによって異なる手数料率をミリサトシ単位で返してきます。例えば既定では今だと2ブロック以内なら2.252 sats/vbyte、7ブロック以内なら1.076 sats/vbyte…といった形です。最新状況であるかは、同じレスポンス内にある現在のブロックハッシュをライトニングノードのブロックチェーン観と比較して確認します。

Strikeが実装したBlended Fee Estimatorは1~6ブロック以内のメモリプールベースの手数料推定にはMempool.spaceのAPI、それより待てるトランザクション向けには実績ベースの手数料推定にはEsploraのAPIとBitcoin CoreのAPIを使っているものです。

LNDの手数料推定はチャネルの開閉以外にも様々なところで使われており、例えばStrikeはLightning Loopを使ってチャネルのリバランスを行っていますが、そこで使用する手数料率もLNDから取得しているため、ハイブリッド型の手数料推定への移行によって手数料をかなり削減できたそうです。

上記のGitHubリポジトリをクローンして手元で動かすこともできますが、Strikeがホストしているハイブリッド型手数料推定APIを使いたい方はlnd.confにて

feeurl=https://bitcoinchainfees.strike.me/v1/fee-estimates

を指定するとすぐに利用できます。(人間用はここ

最後に、Bitcoin Coreの手数料推定を改善しようとする動きがないわけではなく、最近のPackage Relayと手数料率0のトランザクションへの対応(子孫にあたるトランザクションで手数料をまとめて支払うことを前提に、先祖トランザクションとひとまとめに扱うこと)、マイナーによる最適なブロックテンプレートの作成といったニーズもあって、メモリプールの手数料の扱い方をクラスターベースに作り変えるという議論があります。(GitHubDelving Bitcoin

まとめ

・ビットコインの手数料推定アルゴリズムには、現在のメモリプールを見て手数料率を決定するものと、過去のトランザクションを見て手数料率ごとの所要時間を算出するものがある

・メモリプールベースのものは現在の環境を正確に捉えているため、短時間でブロックに含めたいトランザクションの手数料設定に向いている

・実績ベースのものはより長時間待てるトランザクションについて、承認までの間の手数料相場のある程度の変動を考慮した値を提案してくれる

・LNDには手数料率取得APIを設定できる機能があり、Strikeは上記の2種類の手数料率推定を組み合わせたカスタムの手数料率APIを提供している