Develop with pleasure!

福岡でCloudとかBlockchainとか。

Bitcoinのトランザクションの手数料と優先度

2017/09/17追記

以下のロジックはCoin Age Priorityという仕組みで、これはBitcoin Core 0.15.0で完全に削除されました。今後以下の優先度で判断されることはありません。


トランザクションの手数料や優先度についての知識がぼんやりしてたのでまとめてみる。

Bitcoinの取引を行う際に一定額以下の取引については手数料が発生する。
取引手数料はマイナーが処理し受け取るもので、ハッシュの生成に成功して新しいブロックができると、トランザクションの全ての情報はブロックに含まれ、全ての取引手数料はブロックを生成したマイナーに収集される。

Transaction fees - Bitcoin Wiki

参照実装の v 0.10.0の手数料と優先度に関する扱いは以下のとおり。

Bitcoinの送付

以下の条件が満たされる場合は、トランザクションを手数料無しで送信できる。

  • 1000 バイト以下
  • 全ての出力が0.01BTC以上
  • トランザクションの優先度が充分大きい(優先度の算出方法は最後に記載)

↑以外のケースでは、トランザクションサイズが1000バイト毎に0.0001BTCが追加される。例えば、746 byteのトランザクションの手数料は0.0001BTCで1001バイトのトランザクションの手数料は0.0002BTCになる。
ユーザは1KBあたり0.0001 BTCというデフォルトの手数料設定値を増やすことができるけど、各トランザクションの取引手数料をコントロールすることはできない。Bitcon-QTの場合、(手数料が納得できない場合にトランザクションを取り消すことができるよう)トランザクションを送信する前にユーザに手数料を提示して送信するかどうか確認することができる。

典型的なトランザクションのサイズは500バイトくらいで、送付されたBTCの量に関係なく、低優先度のトランザクションのための典型的な手数料は0.0001 BTCとなる。

トランザクションのサイズはbitcoin-rubyであれば↓な感じで確認できる。

serialized = '0100000001517e5ee58a116c38227ebc798c2be0d04d516cef14020f3998f611a55247aa97020000006a47304402201ef071f974592da3acf6d879fb4d7ebed19ff3d19d96ea3ed747c4d09a7e71de022003bd1fa9c0b5311c956223a9b45e05901004b6be39cc7cac73d75580d082290f0121026454f388522601a9c035f03f7d0efb6f82c40ae65079249c31b4e668581357ddffffffff08c84b0000000000001976a91424b3d405bc60bd9628691fe28bb00f6800e1480688ac7b210000000000001976a91424b3d405bc60bd9628691fe28bb00f6800e1480688ac7b210000000000001976a91424b3d405bc60bd9628691fe28bb00f6800e1480688ac7b210000000000001976a91424b3d405bc60bd9628691fe28bb00f6800e1480688ac7b210000000000001976a91424b3d405bc60bd9628691fe28bb00f6800e1480688ac7b210000000000001976a91424b3d405bc60bd9628691fe28bb00f6800e1480688ac7b210000000000001976a91424b3d405bc60bd9628691fe28bb00f6800e1480688ac7e210000000000001976a91424b3d405bc60bd9628691fe28bb00f6800e1480688ac00000000'

tx = Bitcoin::Protocol::Tx.new(serialized.htb)
tx.to_payload.bytesize # ←このサイズ
ブロックに含める

参照実装で、どのトランザクションが新しいブロックに取り込まれるかは以下のルールで決まる。(以下はデフォルト設定で、マイナーによって設定は異なる)

  1. ブロック内の50,000バイト分は、最も優先度の高いトランザクションように確保されており、まず最初にこの部分にトランザクションが追加される。
  2. 続いて、少なくとも1KBあたり0.00001 BTCの手数料を支払いトランザクションがブロックに追加される。この時1KBあたりの手数料が一番高いものから追加され、これがブロックサイズが750,000バイトになるまでトランザクションの追加が続く。
  3. 残りのトランザクションは、マイナーの"memory pool"に残り、優先度や手数料が充分に大きければ、その後のブロックに含まれる。
リレー

P2Pネットワークを介してトランザクションを中継する際の参照実装のルールは、↑のBitcoin送付時のトランザクションのルールに似ていてトランザクションの値として0.00001 BTC が使われてるかどうかでそのトランザクションが無料かどうか判定する。ただしこのとき全ての出力が0.01BTC以上でなければ、このルールは適用されない。

デフォルト設定値
項目 デフォルト値
pattxfee 0.0000 BTC
mintxfee 0.0001 BTC
limitfreerelay 15(1分あたり15000バイト)
minrelaytxfee 0.00001 BTC
blockmaxsize 750000 バイト
blockminsize 0バイト
blockprioritysize 50000バイト
技術情報

トランザクションの優先度は、入力の確認回数を加重した総和をトランザクションのバイトサイズで割って計算される。

優先度 = sum ( 入力のBTC(単位はsatoshi) ✕ 入力の確認回数 .. ) / トランザクションのバイトサイズ

例えば、トランザクションが2つの入力を持ち、そのうち1つは10回の確認が行われてる 5 BTCの入力でもう1つが3回の確認が行われてる 2 BTCで、トランザクションサイズが500バイトであった場合、その優先度は

( 500000000 ✕ 10 + 200000000 ✕ 3 ) / 500 = 11,200,000

となる。

所感
  • 優先度の計算ロジックから、入力のBTCの量と確認回数が多く、トランザクションサイズが小さい方が高優先度なトランザクションとなる。
  • ブロックに速く含められるためには、優先度の高いトランザクションを作成するか高めの手数料設定が必要になる。
  • ブロードキャストされているトランザクションの状態にもよるのだろうけど、メモリプールに入るぐらいの優先度や手数料だと、ブロックに含められるのは期待薄だけど、時間が経てば入力の確認回数が増えて優先度が上がるからいずれは取り込まれる?
  • 充分優先度の高いトランザクションって具体的にどれくらいの数値の優先度なのか?