ビットコインの送金手数料を安くしすぎてしまった場合の対処法

ビットコインの送金手数料

私が「1 BTC(約100万円)を持っている」というのが実際にはどういうことかというと、「私が秘密鍵を知っている公開鍵Xに対しての1 BTCの送金がビットコインブロックチェーンに存在する」ということである。 私がここから、0.01 BTCをAさんに送金して、マイナーには0.0001 BTCの送金手数料を支払おうとしたとき、私の使っているクライアントは「公開鍵Xから0.01 BTCをAさんの公開鍵に、0.9899 BTCを私の別の公開鍵Yに送金する」という取引指示を公開鍵Xに対応する秘密鍵で署名してビットコインのネットワークに送信する。大量のビットコイン採掘用ASICを抱えるマイナーは、この取引をブロックに詰めて、ブロックのnonceの値を試行錯誤してブロックのハッシュ値をある閾値よりも小さくする。これが成功して新しいブロックをチェーンに繋げることができると、マイナーは採掘報酬の12.5 BTCと、私の取引の入力と出力の差である0.0001 BTC(と、ブロックに詰めたその他の取引の手数料)が手に入る。

マイナーは当然ビットコインが欲しいので、手数料が高い取引を優先してブロックに詰める。 早く承認してほしければそれだけ手数料を積む必要がある。 最近この手数料が高騰していて「1時間以内にブロックに詰めてほしいな」と思うと、1,000円くらい払う必要がある。 ビットコインなら銀行送金に比べて手数料が格安という話が昔はあったなぁ……。

別に急ぐ送金でもないしケチるかと思って手数料を数円にしてしまったら全くブロックに含められなくて困った。 昔ならこれでも待っていれば何とかなったけど、最近は送金が多すぎてブロックは常にいっぱいなのでこんな安い手数料が詰められることはもはやなさそう。

Replace-by-Fee

公開鍵Xからの送金がブロックに含められていないということは、公開鍵Xにはまだビットコインが残っているということで、ここから手数料を上乗せした別の取引を作るという手がまず思い浮かぶ。 が、これは上手く行かない。 ビットコインのネットワークは、すでにネットワーク上に存在する取引と衝突する取引は(その取引がブロックに含められる前でも)拒否する(という動作がリファレンス実装)。

これを認めてしまうと二重支払いが容易になって、ビットコインの使い勝手が悪くなるかららしい。 逆に、これが認められていないので、ビットコインを支払われた側は取引がネットワークに広まった時点である程度は安心できる。

最初の送金時に「後で上書きするかも」というフラグを付けるReplace-by-Fee(RBF)というプロトコルがあって、Electrumに実装されているらしい。

Opt-in Replace-by-Feeによるトランザクションの置換(BIP-125) - Develop with pleasure!

Electrum2.7系で実装されたビットコインの「opt-in RBF」とは何か - ビットコインの情報サイトの運営者ブログ

待つ

ネットワーク上に送信されて、ブロックに入れられていない取引は各ノードのmempoolに入っている。 Mempoolのサイズは有限なのでそのうち消えるはずで、理屈の上では消えた後ならば、改めて手数料を上乗せして送金できるはず。 ただ、ウォレットアプリが一度送信済みとマークした取引をネットワークから消えたのを検知して元に戻すという処理を持っているのか分からない。 どうなんだろう?

ちなみに、たとえ手数料が低くても古くなった取引は優先度を上げるという仕組みが昔はあったけど、無くなったらしい。

Transaction Accelerator

マイニングプールViaBTCが、指定した取引を優先してブロックに詰めるというサービスを(たぶんボランティアで)行っている。 ここに取引IDを入力すれば良い。 ただ、↑の取引で試したら「手数料安すぎ」と蹴られた。

Transaction Accelerator - ViaBTC

お釣りアドレスを使った新たな取引

上手くいった方法。

最初の説明の「0.9899 BTCを私の別の公開鍵Yに送信する」の公開鍵Yから、それなりの手数料を付けて送金する。 マイナーがこの取引のそれなりの手数料を手に入れるには、最初の手数料の安い取引も同時にブロックに含める必要がある。

Bitcoin Coreならば、設定→オプション→ウォレット→コインコントロール機能を有効化する で送金時にどのアドレスから送金するかを選択できるようになる。 「送り先」を自分のアドレスにして、このアドレスに入っている全額を「金額」に入力し、「送金額から手数料を差し引く」にチェックを入れて、適当な手数料を選べば良い。 マイナーはこの手数料を得るために、2個の取引をブロックに詰める必要があるので、普通に選ぶ手数料の2-3倍くらいにしておくと良さそう。

f:id:kusano_k:20171107012528p:plain

コインコントロール機能が無いウォレットならば、自分の持っている全ビットコインを自分に送金すれば、お釣りアドレスも使われるだろうか? 送金が承認されるまで全ビットコインが使えなくなるかもしれないけど。

たまたま承認されただけかもしれないので、同じように困っている人がいたらこれを試して、上手くいったかどうかとか、ブロックに含めたマイニングプールがどこかとかをコメント欄ででも教えてほしい。