こんにちは。バックエンドを担当している鷲見(@soichisumi)です。最近、トランザクションの手数料をどのように決定すべきかについて調査したのでブログに残します。
PoWに基づいたブロックチェーンは、トランザクションの手数料によっていつブロックに入るかが決まります。手数料は高ければ高いほど早くブロックに入りやすいですが、ユーザとしてはなるべく安く済ませたいです。本記事では、Bitcoin系列のブロックチェーンにおいてブロックに入るトランザクションがどのように選ばれるのかと、なるべく安く、早くトランザクションが取り込まれるようにするために手数料をどう設定すべきかについて解説します。
トランザクションがブロックに入るまでの流れ
トランザクションは下記 4 つの手順を経てブロックに取り込まれます。
- トランザクションの構築
- ブロードキャスト
- バリデーション
- マイニング
下図がトランザクションの構築からマイニングされるまでのイメージ図です。
各段階について解説していきます。
トランザクションの構築
まず、送信先アドレス、未使用のトランザクションアウトプット、送金額、送金手数料などから未署名のトランザクションを構築します。その後、トランザクションに含まれる全てのトランザクションアウトプットをアンロックすることで署名済みのトランザクションが得られます。
ブロードキャスト
ブロードキャストでは、署名済みのトランザクションを Bitcoin ネットワークの中で知っているいくつかのノードにトランザクションを送ります。
バリデーション
Bitcoin ネットワーク上のノードは、新しくトランザクションを受け取るとそのトランザクションが正しいかどうか検証を行います。検証では下記のような内容がチェックされます。
- トランザクションの構文とデータ構造は正しいか
- 既にブロックに取り込まれたトランザクションではないか
- 入力となるトランザクションアウトプットは存在するか、存在するなら使用済みではないか
- 入力となるトランザクションアウトプットは正常にアンロックされるか
検証の結果、トランザクションが正しくなければ破棄され、正しければ、mempool(各ノードのブロックに取り込まれていないトランザクション置き場) に保管されます。
マイニング
Bitcoin ネットワークのノードのうち、いくつかのノードはマイニングも行っています。本記事ではこのようなノードをマイナーと呼びます。マイナーはネットワークに流れている最新のブロックの次のブロックの作成を行います。新しく空のブロックを作成し、そこに mempool にあるトランザクションを詰めていきます。トランザクションを詰める順番は、マイナーの実装にもよりますがほとんどの場合はトランザクションのサイズあたりの手数料が多い順にブロックに取り込まれます(以下、トランザクションのサイズあたりの手数料を s/b と書きます。サトシパーバイトと読みます)。
そのため、トランザクションを早く取り込まれるようにするためには、mempool に存在しているトランザクションの中で何番目に s/b が高いかが重要です。
トランザクションを安く、早く取り込まれるよう送金手数料を設定するには
前節で述べたように、トランザクションが早く取り込まれるためにはネットワークに流れているトランザクションの中で何番目に s/b が高いかが重要です。下記 2 つのグラフがネットワークに流れている、ブロックにとりこまれていないトランザクションの数と、その手数料を時間軸で可視化したものです(Johoe's Bitcoin Mempool Statistics より取得)。横軸が時間、縦軸がブロックに入っていないトランザクションの数を示しています。
1 枚目の最近 4 日間のグラフを見てみましょう。毎日0時~朝方まではトランザクションもトランザクション手数料も高く、それ以外は、波があるもののトランザクションの数も手数料も低いです。時間帯によって流れているトランザクションの量と s/b が異なっています。
2 枚目のグラフを見てみましょう。こちらは 2 年前から現在までのグラフです。最近は安定していますが、過去に 2 回ほどトランザクションの量と手数料が高い時期があったようです。2017 年中旬の山はわかりませんが、2018 年 1 月の山は Bitcoin バブルの時のものですね。時期によっても トランザクションの量と s/b が異なっています。
以上より、トランザクションの s/b は時期や時間帯によって異なることが分かりました。このことから、最近流れたトランザクションについてどの程度の s/b で、流れてから何ブロックで取り込まれるかを計測しておけば、現在のネットワーク状況下でどの程度の s/b を設定すべきかが分かります。
ありがたいことに、Earn Bitcoin というサイトが s/b がいくらの時に何ブロックで入るかを集計し、その結果をAPIで提供してくれています。Gincoでは Earn Bitcoin の API を利用し、現在のネットワーク状況に適した手数料が自動的に設定されるようにしています。これにより Ginco で作成されたトランザクションは 1 ブロック程度で取り込まれます。推奨はされませんが、もし自動設定される手数料から手数料を変更してみたい場合は Earn Bitcoin の s/b を参考に手数料を変更すると良いでしょう。手数料を変更する際は FAQ を参考にしてください。
まとめ
本記事では、Bitcoin 系列のブロックチェーンにおいてブロックに入るトランザクションがどのように選ばれるのかと、なるべく安く、早くトランザクションが取り込まれるようにするために手数料をどう設定すべきかについて解説しました。トランザクションがネットワークにブロードキャストされたあと、s/bによって優先順位付けされて、順次ブロックに取り込まれていく流れと、現在のネットワーク状況によって s/b を設定すべきであることが伝われば幸いです。
参考リンク
The Challenges of Bitcoin Transaction Fee Estimation
Tip us!
エンジニアチームのブログを書くモチベーションが上がります!