Bitcoin
Monacoin
Counterparty
暗号通貨
Monaparty

残高があるのに「残高が少ない」というエラーになる原因と対策

Counterparty を使っていると、充分な BTC 残高があるはずなのに、insufficient funds というエラーが発生することがしばしばあります。
特に使い始めのユーザに多発する傾向があります。

この挙動は、バグというよりは Bitcoin ブロックチェーンの性質に基づく、仕様です。

[おさらい] Bitcoin の残高

Bitcoin のブロックチェーンには、アドレスに紐づく残高そのものは記録されていません。
各トランザクションには、アドレスへ送金された金額(output)と、後日そのoutputが他のアドレスへの支払い(input)として使われたかどうかのフラグだけが記録されています。

アドレスの残高は、そのアドレスに当ててあり使用済みでない output (いわゆる UTXO)の金額の合計として計算されます。

残高は、複数の output に分散して入っているというところが、本稿を理解するためのキモの部分です。

他のアドレスへの支払いの際には、 送金額より少しだけ多くなるだけの UTXO をかき集め、送金に用いるトランザクションの input とします。
また、お釣りが output に設定されます。

この UTXO は、ブロックチェーンに採り込まれて一定の承認数となるまで使えません。1
一定の承認数となったお釣り output は、新たな UTXO となります。

つまり、承認途中のお釣りは、他の支払いのための UTXO として使えません。

承認まで待たされる事象は、Bitcoin のウォレットや交換所を使ったことがあれば、意識する機会が多いかもしれません。
しかし、UTXO の存在までは意識なさる方は(Counterwallet はエンジニア向けツールでもないので)多くないかもしれません。

Counterparty と UTXO

Counterparty は、メッセージの送信で Bitcoin のトランザクションを使います。
つまり、メッセージの送信には UTXO が要ります。

UTXO が少ない状態でメッセージを多数送信した場合には、UTXO が枯渇します。
その結果として表示されるのが BTC 残高が充分なのに起こる insufficient funds です。

対策

原因がわかれば、対策は簡単ですね。

  • 先のメッセージを含むブロックが承認されるまで待つ。
  • XCP アドレスへの少額多数の BTC 送金を行って UTXO を増やす。

上記のいずれかになります。


  1. 仕様上は使えてしまうのですが、2重支払が起きるリスクが起こるので運用上は使えません。