ビットコインの情報サイトの運営者ブログ

サイトには掲載していない仮想通貨に関する時事的な情報や個人的な感想など。中級者以上向け。

ビットコインの取引手数料の仕様を詳しくまとめてみる

ネットワークの混雑でビットコインの取引手数料について改めて考えることが多いので、仕様についてまとめることにしました。手数料周りの仕様は意外と頻繁に変わっており、改めて調べるまで個人的に勘違いというか知識が古いものもありました。この記事の情報も後から見返すと古い可能性がありますのでご注意ください。

取引手数料の基本

まずは基本的事項について再確認。ビットコインの取引手数料は、取引の承認者であるマイナー(採掘者)に支払われ、高ければ高いほど早く確認(承認)される傾向にあります。マイナーからみると報酬を多くもらえる取引を優先して処理したほうが儲かるので当然の傾向です。また、手数料の大小はBTCの送信額に対する割合ではなくトランザクション(取引データ)のサイズあたりの割合(BTC/バイト)により判断されます。これも、データとして見た時にビットコインの送信額は関係ないので(10BTCであろうが1BTCであろうがデータの大きさが変わらなければ取引データの通信コストは変わりません)、当然の傾向です。

トランザクションのサイズの決定方法

取引手数料を決めるにはまずデータのサイズを求める必要があります。トランザクションには署名データが含まれ、署名は作成するまでサイズが分からないので、正確なサイズを算出することはできませんが、以下の式でおおよそのサイズを求めることができます。単位はバイト(byte)です。
148*input数+34*output数+10

このようにinputの数とoutputの数に依存します。inputとoutputについてはUTXOの概念を知っていれば分かるかと思います(以前の記事参照)。outputは単純に送金先のアドレス数と等しいです。inputの場合はUTXOの数になるので、送金元が一つのアドレスだけであってもUTXOが何個もある場合があります。

最もよくあるinputが一つでoutputが二つ(送金相手のアドレスだけではなく自分のお釣り用アドレスにも送金する場合がほとんど)のトランザクションのサイズは、
148*1+34*2+10=226バイト
となります。特に例は貼りませんが、実際にinputが1つでoutputが2つのトランザクションのサイズをブロックエクスプローラーで見ると、ほぼすべてが226バイトから1~2バイト程度のサイズに収まっていることがわかります。

ちなみにトランザクションサイズの算出方法を調べると
180*input+34*output+10
という式がよく見られますが、これはinputの中に含まれている公開鍵の形式が非圧縮型(uncompressed key)であるためです。間違いというわけではありませんが、現在はほぼすべてのウォレットが非圧縮型より32バイト小さい圧縮型の鍵(compressed key)を利用しているので、inputのサイズは基本的に148程度と考えるのが良いと思います。

これらの算出式は通常のビットコインアドレスからの送金なので、マルチシグネチャアドレスやCounterpartyを利用する場合は通常よりもサイズがやや大きくなります。CounterpartyはOP_RETURNという上限40バイトのデータが付加されるだけなのでそこまで大きくはなりませんが、2of3のよくあるマルチシグの場合は倍近くになります(ただしCounterpartyではトークンの送付時に非常に少額のBTCを送らなければならないので、頻繁にトークン受信を行っているような場合はUTXO・小銭の数が増えinputの数も増えて合計サイズが大きくなる傾向にあります。)。
採用されない可能性も十分ありそうなので省略しますが、Segwitが実装されるともちろん上記の計算式は変わってきます。

最適な取引手数料の予測

取引手数料は、未確認のトランザクションの総サイズ(メモリプールの総サイズ)などに影響を受けてマイナーが決めるものなので単純な計算によって正確に求めることは難しいです。幸いなことに以下のような計算サイトがあるので、参考にすると良いでしょう。複雑なので具体的な算出方法はよく理解できていませんが、最近のハッシュレート、トランザクションサイズ、手数料の大きさなどによって算出しているようです。
https://bitcoinfees.21.co/
https://bitcoinfees.github.io/
上のサイトが有名で、グラフの緑部分以上の手数料を払うと遅延なし(10分で確認)で済みます。この記事を書いている時点では、90satoshi/byte=0.0000009BTC/byteがベストのようです。先ほど計算したように1input2outputの典型的なトランザクションの場合は、226*0.0000009=0.0002034BTC支払えば良いということになります。

あくまでも226バイトはほぼ最小のサイズであり、実際はinputの数が多かったりします。現在の平均のトランザクションサイズ約500バイトで計算すると500*0.0000009=0.00045BTCとなります。
f:id:jpbitcoin:20170118221003p:plain
https://tradeblock.com/bitcoin/historical/1d-f-tsize_per_avg-01101

基本的にこれらの作業は全部ウォレット側がやってくれますし(一部手数料予測の性能の悪いウォレットもあるようですが)、そもそもUTXOが見れなかったりトランザクションのサイズ表示ができないウォレットが多いので、普通のユーザーはあまり気にする必要はなく自力で計算したくてもできないことが多いのですが、なかなか確認されない取引があったら、ブロックエクスプローラーでその取引のサイズと手数料を確認して先の手数料予測サイトの最適手数料と照らし合わせると確認が遅い理由が納得できるかもしれません。

取引確認の優先度

現在、ビットコインの取引の確認の優先度は単純に手数料によって決定されています。以前は、priorityというパラメータも考慮されており、priorityの中には以下のようにcoin ageというコイン・UTXOの古さ(最後に使用されたときからの未使用期間の長さ)やコイン量があるので、古いコインほど残高が多いほど早く確認されやすいという面もありましたが、このpriorityは現在では実質的にほとんど使われていません。
priority=(coin\ amount*coin\ age)/transaction\ size

ちなみに、Bitcoin Core(Qt)0.6までは取引確認の優先度は完全にこのpriorityに依存しており、送信額が多ければ逆に手数料を支払わなくて良いという一見不思議な仕組み(送信額が少ないほど要求手数料が少なくなるとネットワークへのスパム攻撃が容易になるので理にはかなっています)でした。

バージョン0.7からは現在の手数料が大きければ大きいほど優先して取引される仕様が導入され、一定額以下の手数料(現在のBitcoin Coreの規定の設定は0.00001BTC/byte)の取引のみを対象としてpriorityが考慮されるようになりました。priorityが一定以上になれば手数料無料でも送信できるという仕様です。

ネットワーク全体のトランザクション数の増加により、バージョン0.12からはBitcoin Coreでのマイニングの際の既定の設定として全くpriorityが考慮されないようになってしまい、単純に手数料のみから優先度が決定されるようになりました。同時に手数料が0.00001BTC/byte以下の取引が承認される見込みはほとんどゼロとなりました。
他にデータソースが見つからなかったのでtwitterからの引用になってしまいますが、以前は可能とされていた手数料無料の取引は2016年には実際にほとんど絶滅した状態になっているようです。

現在もトランザクションのリレー(ノードからノードへの伝達)においてはpriorityが使用され、priorityが十分高ければ手数料がなくてもリレーされる設定が規定となっていますが、Coreの開発チームではpriorityの完全廃止が議論されており、現在のところ0.14ではpriorityに基づくリレーの仕様も規定でなくなり、0.15ではpriorityの概念が完全になくなる予定となっています。

ちなみにこのpriorityというのは、基本的にはビットコインのユーザー数やトランザクション数を増加させるための一つの戦略であり、手数料無料でも送信できることでビットコインの利用数を増やそうという目的のもとに利用されていたものでした。現在はトランザクションが多すぎるほどになっており、手数料無料の取引をわざわざブロックに入れてくれるマイナーがいなくなったために廃止の方向になったということです。

最終的にはマイナーが自由にどの取引を確認するか決められる

今までpriorityなど取引確認の優先度の「仕様」を説明してきましたが、これらはすべて未確認状態の取引の話なので、実際にはマイナーが恣意的にどの取引を確認するかを決められます。Bitcoin Coreではデフォルトの数値が設定されているだけなので、数値を変えるだけですぐに最低の取引手数料を0.00001BTC/byteから引き上げることもできますし、今は使わない設定になっているpriorityを復活させて手数料無料の取引を受け入れることもできます。
Bitcoin Coreでは、priority以外にも「fee delta」という、取引の優先度をマイナーが自由に変えられる架空の取引手数料の概念も実装されています。特定の取引IDを対象にしてfee deltaの数値に大きな架空の手数料を入力すれば、あたかも高手数料の取引として実際の手数料に関係なく最優先で確認することが可能というわけです。そのため、マイナーが自分や友人が送信する取引は手数料無料でも優先して承認・確認するというのは普通に行われ得ることだと考えられます。
究極的に言えば、マイナーが特定のアドレスをブラックリスト化したりホワイトリスト化したりして、取引を制限することも可能です。ただし1%でもすべての取引を受け入れるマイナーがいれば100ブロックに1回は対象の取引が確認されることになるので、単一のマイナーが100%支配するという現実離れした事態が起こらない限り、完全にコントロールすることはできません。