ウォレットを壊してしまい、送金が承認されなくなった
現在、送金したものがまったく承認されなくなってしまった。
経緯は以下の通りである:
0.01 BTC 未満の送金をトランザクション手数料なしで行っていたが、当然ながらこれらは一切承認されなかった。
ウォレットが壊れた原因についての推測:
おつりの残額も同様に承認されないままとなったが、クライアントはそれを承認済みとして扱い、送金額にそれらの金額を含めてしまっているためと思われる。
失ったのは 100 BTC だけなので、それほど心配はしていないが、あまり手間をかけずに修復する方法をご存知であれば、教えていただけるとありがたい。
お気づきの通り、根本的な問題は、少なくとも 1回の承認があるまでトランザクションをカウントしたり使用したりすべきではないということだ。0/未承認のトランザクションは非常に二級市民的な扱いだ。せいぜい、何かが受信されたという通知程度であり、残高としてカウントしたり使用したりするのは時期尚早だ。
変更を加え、それらが薄い文字で表示され、入金額が[+1.23]のように角括弧で囲まれ、残高にカウントされず、使用もできないようにした。これは自分が送信したトランザクションには適用されない。自分で書いたものなので暗黙的に信頼しているからだ。
(+1.23)にしなかったのは、会計では括弧がマイナスを意味するからだ。角括弧なら意味が明確に区別できることを期待している。
JSON-RPC インターフェースでは、0回の承認を指定することで、引き続き 0/未承認のトランザクションを確認できる。
変更を SVN rev 158 にアップロードした。まもなく 0.3.13 RC を投稿する。
これらのトランザクションがウォレットにある場合は、まもなくリリースされる 0.3.13 にアップグレードするまで支払いを送信しないでほしい。
これらのトランザクションをすでに送信した場合、またはそれらの作成者である場合は、theymos のパッチを使用するか、以下の変更を加えて、クリーンなトランザクションを新しいウォレットに送信してクリーンアップしてほしい。
変更前:
if (pcoin->GetDepthInMainChain() < 1 && pcoin->GetDebit() <= 0)
continue;
変更後:
if (pcoin->GetDepthInMainChain() < 1)
continue; 0.3.13 リリース候補だ。テストしてほしい:
http://www.bitcoin.org/download/bitcoin-0.3.13-rc1-win32-setup.exe
つまり 0.3.13 では 1 承認で誰かに支払うには十分だが、GUI で「承認済み」と表示するには 6 承認が必要ということか。これは矛盾している。このコインは支払いには十分だが、受け取るには十分ではないのか? 6 の背後にあるロジックは知らないが、何であれ、表示する言葉を決めるためだけに使われているなら、実際に何かを表しているのだろうか?
それはどちらかというと SelectCoins の問題になるだろう。
SVN rev 161 には、自分の未承認トランザクションが使用可能かどうかを再帰的に判定する改良が含まれている。自分のお釣りはすぐに使えるべきなので、これが必要だ。
新しい再帰的判定は:0/未承認のトランザクションは、それが自分のものであり、そのすべての依存関係がブロック内にあるか、やはり自分のものである場合に使用できる。
Windows 版のビルドはこちらだ:
http://www.bitcoin.org/download/bitcoin-0.3.13.2-win32-setup.exe
このバージョンは、すでに 0/未承認トランザクションがあり、それをすでに使用した可能性がある場合の改善だ。0/未承認トランザクションの元の作成者である場合は、引き続き theymos のパッチが必要だ。