バグ:トランザクション中に wallet.dat から"未成熟"コインが消失
やあ、
Linux マシンで R119 を実行していて、昨夜運良くブロックを解いて 50 BTC を手に入れた。やったと思うだろう?ところが、「成熟」する前(つまり 100 以上のブロックマークを過ぎる前)に 30 BTC を送ろうとして、当然 bitcoind はエラーを報告した。しかし、それらの 30 コインを使用済みとマークもしたので、トランザクションは作成されないだけでなく、コインも使えない状態だ。
debug.log の関連部分:
ThreadRPCServer method=sendtoaddress CommitTransaction: CTransaction(hash=cf3bee, ver=1, vin.size=1, vout.size=2, nLockTime=0) CTxIn(COutPoint(e9894c, 0), scriptSig=0x014866DE7A1889014BAC9A) CTxOut(nValue=20.00000000, scriptPubKey=OP_DUP OP_HASH160 0x01BA) CTxOut(nValue=30.00000000, scriptPubKey=OP_DUP OP_HASH160 0x3F3A) AddToWallet cf3bee new CommitTransaction() : Error: Transaction not validreceived: addr (27 bytes) 07/30/10 15:27:00 Flushing wallet.dat Flushed wallet.dat 1ms
ウォレットには 50.01 BTC(0.01 は先日マシン間のテストで入れたもの)あったが、今はウォレットに 20.01 BTC しかない。少し悲しい——あのコインを生成できて喜んでいたのに!
Erik
成熟していないのにどうやって送信が許可されたのか理解できない。残高が金額より低かったはずだ。残高 0.01 と表示されていたはずだよな? 試してみると「お金が足りません」またはコマンドラインから「Insufficient funds」と表示される。
送信した時、成熟するまであと何ブロックと表示されていたか?
まだ通る可能性はある。
wallet.dat を何らかの方法でコピーまたは移動したことはあるか?
すぐに bitcoind をシャットダウンしてウォレットをバックアップしたのだが、成熟までに残っているブロック数が表示されたことは一度もなかった。それが問題なのだろうと勝手に思い込んでいた。バックアップを取ったあとに、万が一トランザクションが通るかもしれないと思って、bitcoind を起動し直した。
ギャビンの bitcoin tools を使うと、そのトランザクションはまだ自分のウォレットに残っていて、コインも「使用済み」とマークされたままなのが分かる。だが自分の bitcoin でも受取側の bitcoin でも、そのトランザクションは通ったものとしては表示されていない。