オーバーフローバグ 深刻
高さ74638のブロックがネットワークのバグを悪用したようである。整数オーバーフローを利用してトランザクション合計をマイナスにしている。2つのトランザクション出力は以下の通り:
out Value:92233720368.54(7ffffffffff85ee0) out Value:92233720368.54(7ff ffffffff85ee0)
早急な修正が必要である。
編集: (satoshi) 0.3.10パッチのダウンロードリンクはこちら: topic 827
バグは、値のオーバーフローチェックが出力の合計ではなく個々の出力に対して行われていたことだった。
修正はバージョン0.3.10ですでに利用可能だ。アップグレードしてほしい。
正しいチェーンが不正なチェーンを追い越した。ネットワークは今後、2,100万コインを超える出力値を持つブロックを拒否する。
より良い修正ができるまで…ほんの少しのテストの後、これでうまくいくようだ: Code:--- a/main.h +++ b/main.h @@ -473,8 +473,12 @@ public:
// Check for negative values
foreach(const CTxOut& txout, vout)
-
{ if (txout.nValue < 0) return error(“CTransaction::CheckTransaction() : txout.nValue negative”);
-
if (txout.nValue > 21000000*COIN)
-
return error(“CTransaction::CheckTransaction() : txout.nValue over-max”);
-
}
if (IsCoinBase()) {
@@ -520,6 +524,8 @@ public: int64 nValueOut = 0; foreach(const CTxOut& txout, vout) {
- if (txout.nValue > 21000000*COIN)
- continue; // ignore over-max-value… if (txout.nValue < 0) throw runtime_error(“CTransaction::GetValueOut() : negative value”); nValueOut += txout.nValue;
不正なブロック以前のブロックチェーンの部分を再ダウンロードする必要がある — blkindex.datとblk0001.datファイルを削除すること。私はknightmbのブロックチェーンスナップショットから始めた。
あるいはgithubからの同じパッチ、http://gist.github.com/525921 で直接適用できる生パッチが得られる。 http://gist.github.com/raw/525921/fe2ad7583f0dd2444caa0b3e24d750bf45cac11b/Quick%20fix%20block%2074652
編集:これを使って直接パッチを適用できなかった。おそらくCRLFの問題だ。
変更を手動で適用し、結果をここにアップロードした:http://yyz.us/bitcoin/patch.bitcoin-gavin-overflow-quick-fix
予備的な変更だ。正しいだろうか? まだ変更することがある。これがすべてではない。間もなくSVNにコミットする。
bool CheckTransaction() const
{
// コンテキストに依存しない基本チェック
if (vin.empty() || vout.empty())
return error("CTransaction::CheckTransaction() : vin or vout empty");
// 負の値とオーバーフロー値のチェック
int64 nTotal = 0;
foreach(const CTxOut& txout, vout)
{
if (txout.nValue < 0)
return error("CTransaction::CheckTransaction() : txout.nValue negative");
if (txout.nValue > 21000000 * COIN)
return error("CTransaction::CheckTransaction() : txout.nValue too high");
nTotal += txout.nValue;
if (nTotal > 21000000 * COIN)
return error("CTransaction::CheckTransaction() : txout total too high");
}
if (IsCoinBase())
{
if (vin[0].scriptSig.size() < 2 || vin[0].scriptSig.size() > 100)
return error("CTransaction::CheckTransaction() : coinbase script size");
}
else
{
foreach(const CTxIn& txin, vin)
if (txin.prevout.IsNull())
return error("CTransaction::CheckTransaction() : prevout is null");
}
return true;
}
トピックをスティッキーにしないでくれ、あそこは誰も見ない。バンプするのに十分な投稿があるだろう。
皆さんが生成を停止してくれると助かる。おそらく現在のブランチの周辺でブランチをやり直す必要があり、生成が少ないほどそれが早く完了する。
最初のパッチはSVN rev 132に入る予定だ。まだアップロードされていない。まず他の雑多な変更を先に出してから、この件のパッチをアップロードする。
再ダウンロードする方がいい。
パッチ適用後だが全員がアップグレードする前のブロック検証は非常に遅くなるだろう!おそらく次の難易度調整が大幅に低下するだろう。もちろん、次の調整が来る頃には全員がアップグレードしているだろうから、比較的素早く通過するだろう。
編集:うーん、含まれている情報ファイルがあるようで、それを見れば手がかりが得られるかもしれない。
私たちのような愚かな初心者に、ブロックチェーンをダウンロードしたらどうすればいいか説明してくれないか?
Quote from: kencausey on August 15, 2010, 09:36:30 PM
私たちのような愚かな初心者に、ブロックチェーンをダウンロードしたらどうすればいいか説明してくれないか?
それはBitcoinのデータディレクトリ内のファイルを置き換えることを意味する。何をしているか分かっていない限り推奨しない。
最も簡単で安全な方法は、wallet.datをバックアップしてからすべてを再ダウンロードすることだ。
パッチがSVN rev 132にアップロードされた!
現時点での推奨手順:
- シャットダウンする。
- knightmbのblkファイルをダウンロードする。(blk0001.datとblkindex.datファイルを置き換える)
- アップグレードする。
- 74000ブロック未満から開始されるはずだ。残りを再ダウンロードさせてほしい。
knightmbのファイルを使いたくない場合は、blk*.datファイルを削除するだけでもよいが、全員が同時にブロックインデックス全体をダウンロードするとネットワークにかなりの負荷がかかる。
まもなくリリースをビルドする。
[Deleted] Quote from: davidonpda on August 15, 2010, 10:41:29 PM
74637でちょうど持っていると既に言った。
サトシは74,000以前である必要があると言った。
パッチ適用済みのクライアントを持つ人がチェーン全体をダウンロードする限り、できればローカルネットワーク上の別のコンピュータから最適にダウンロードすれば、正しい場所で自動的に停止するはずだ。
[Deleted] Quote from: davidonpda on August 15, 2010, 10:41:29 PM
サトシは74,000以前である必要があると言った。
そうは言っていない。彼は「one」が欲しいと言ったのであって、必要だとは言っていない。微妙な違いだ。 そして「…不正なブロックを含むブロックとそれ以降だけが無効だ。それ以前のブロックはすべて有効だ…」なら、74000より前である必要はない。
knightmbの時間を節約してあげたかっただけだが、あなたのはどのみち私のより大きい。 Grin
ブロックチェーンのダウンロードを更新しないでほしい。誰かのブロックチェーンダウンロードを使う場合、最後まで含むものは望ましくない。やや古いもののほうが良く、最新のブロックをダウンロードして検証できる。
tcatmの4-way SSE2 SHA-256はファイルsha256.cppに入っており、数リビジョン前にすでにアップロードされている。
たった今、Linux上でのビルドを有効にするmakefile.unixであるrev 134をアップロードした。今Linuxでrev 134をビルドすると-4wayスイッチが使える。
ビルドに問題がある場合は、makefile.unixを編集して:
- -DFOURWAYSSE2を削除
- 以下の行の末尾からobj/sha256.oを削除:
bitcoin: $(OBJS) obj/ui.o obj/uibase.o obj/sha256.o
bitcoind: $(OBJS:obj/%=obj/nogui/%) obj/sha256.o
0.3.10のLinuxビルドには、私がビルドする際に-4wayオプションが含まれる。
Windows用のパッチダウンロードはこちらだ:
http://www.bitcoin.org/download/bitcoin-0.3.10-win32-setup.exe http://www.bitcoin.org/download/bitcoin-0.3.10-win32.zip
SHA1 16645ec5fcdb35bc54bc7195309a1a81105242bb bitcoin-0.3.10-win32-setup.exe SHA1 4f35ad7711a38fe8c880c6c9beab430824c426d3 bitcoin-0.3.10-win32.zip
手順:
- シャットダウンする。
- knightmbのblkファイルをダウンロードし、blk0001.datとblkindex.datファイルを置き換える。 http://knightmb.dyndns.org/files/bitcoin/blocks/ http://rapidshare.com/files/413168038/BitcoinBlocks.torrent
- 0.3.10にアップグレードする。
- 74000ブロック未満から開始され、残りを再ダウンロードするはずだ。
あるいは、blkファイルのダウンロードが面倒な場合は、以下のようにするだけでよい:
- シャットダウンする。
- blk*.datを削除(または移動)する。
- 0.3.10にアップグレードする。
- すべてのブロックを再ダウンロードし、おそらく約1時間かかる。
ああ、少しわかりにくいな Huh
自分で作る必要がないのか、それともあなたたちが既に持っているものをFTPに上げればいいのか?
Windowsマシンからブロックデータをダンプして、Linux/Macマシンに載せることはできるのか?
[編集] あなたの投稿を見た。では74,000未満のものをビルドする。技術者の皆さんの新しいチェーンダウンロードを数分節約できるはずだ。 Wink
この焦らしに耐えられない!Jr.メンバー以上で、非公式のSVN rev 134 Linux 64ビットビルドをコンパイル済みで共有してくれる人はいないだろうか?ええ、公式ビルドが数分後にリリースされることは分かっている。たいして重要ではない。
編集:サトシが先ほどコメントしたのでSVNバージョン番号を更新した。
ああ、気にしないでくれ。SVNバージョンが更新されてWindowsビルドもリリースされたので、待つことにする。 Embarrassed
Quote from: knightmb on August 15, 2010, 10:59:04 PM
[編集] 投稿を見た。74,000未満でビルドする。技術的な方々のダウンロード時間を少なくとも数分は節約できるはずだ。
古いものはそのままにしてくれ!古いほうが良いのだ。何番のブロックだ?60000から74000のどこかであれば問題ない。しばらく前から公開していたものは検証済みで、最善の選択肢だ。
これについて何か追加すべきだと思う:http://bitcointalk.org/index.php?topic=259.0 必要な時にクライアントに警告メッセージを表示するラベルが必要だ Smiley 今は常にウェブサイトを確認しなければならず、これは良くないと思う。
67000から開始するのは完璧だ。
はい、現時点では74638で止まるだろう。より多くのノードがアップグレードして生成するにつれて、ゆっくりと増加し始めるはずだ。
Linux版のビルドリンクは以下の通りだ。
Linux版にはtcatmの4-way SSE2 SHA-256が含まれており、i5およびAMD CPUでの生成が高速になる。「-4way」スイッチを使って有効にし、お使いの環境で高速かどうか確認してほしい。
ダウンロードリンク: http://www.bitcoin.org/download/bitcoin-0.3.10-win32-setup.exe http://www.bitcoin.org/download/bitcoin-0.3.10-win32.zip http://www.bitcoin.org/download/bitcoin-0.3.10-linux.tar.gz
SHA1 16645ec5fcdb35bc54bc7195309a1a81105242bb bitcoin-0.3.10-win32-setup.exe SHA1 4f35ad7711a38fe8c880c6c9beab430824c426d3 bitcoin-0.3.10-win32.zip SHA1 e3fda1ddb31b0d5c35156cacd80dee6ea6ae6423 bitcoin-0.3.10-linux.tar.gz
Quote from: Joozero on August 15, 2010, 11:32:43 PM
これについて何か追加すべきだと思います:http://bitcointalk.org/index.php?topic=259.0
必要な場合に警告メッセージを表示するラベルがクライアントにあるべきだ。 今は常にウェブサイトを確認しなければならず、それは良くないと思う。 同意する。長い間やりたかったのだが、やる時間がなかった。
今のところ、bitcoin-listメーリングリストに登録することもできる。このようなお知らせや主要な新バージョン以外ではほとんど使われていない。
登録/解除ページ: http://lists.sourceforge.net/mailman/listinfo/bitcoin-list
… すでにブロック74638に達している。これはそのブロックが正常なものになったということか?
自分もこの点について混乱していたが、#bitcoin-devで確認を得た。
不正なブロックは74638番で、最後の正常なブロックは74637番だった。番号は0から始まるため、クライアントが74638ブロックと表示している場合、ブロック74637番まで、つまり最後の正常なブロックまで取得済みということになる。
ある意味、これは全員がアップグレードするまで一時的にブロック生成の難易度を下げることになる。そう、遅くなるが、それは各クライアントが難しいハッシュを生成するためにより多くの時間を持つということだ。
影響についての質問:不正なブロックの後、不正なブロックチェーンを使ってトランザクションを送信した。
そのトランザクションの状態はどうなっているのか? 見る限り、(更新済みの)送信側クライアントのウォレットは差し引かれた金額を表示している。
修正されたチェーンに再組み込みされ、受取人はそれを使用できるようになるのか?
Quote from: Ground Loop on August 16, 2010, 12:29:55 AM
影響についての質問:不正なブロックの後、不正なブロックチェーンを使って トランザクション を送信しました。
そのトランザクションのステータスはどうなりますか? 見たところ、(更新された)送信側のクライアントウォレットには差し引かれた金額が表示されています。
修正されたチェーンに再統合され、受信者はそれを使えるようになりますか?
ああ、修正されたチェーンに再統合される。トランザクションは消えず、双方で引き続き表示されるが、確認数が0に戻り、再び増え始める。
ブロック74638以降の不正なチェーンでブロックを生成した場合のみ、そのブロックからの50 BTCが消える。不正なチェーン内のブロックはまだ成熟していなかったはずだ。
Quote from: kosovito on August 16, 2010, 12:39:17 AM
すべての手順を実行した。現在クライアントは0.3.10で、ブロック74638で止まっている。これで問題ないか?
まだ74638ブロックと表示されているなら、0.3.10のノードに接続されていない。
今日のところは、以下のパラメータを追加してみてほしい: -addnode=75.158.131.108 -addnode=99.27.237.13 -addnode=68.68.99.14
クライアントを実行しているほとんどの人はこのメッセージスレッドを読んでいない。では…素朴な質問だ:
- これはバージョン3.8.1(大災害前)の不正なブロックチェーンを持つクライアントにどのような影響を与え続けるか?
- 3.8.10にアップグレードしたがブロックチェーンファイルを削除しないクライアントにどのような影響があるか?
Quote from: trebronics on August 16, 2010, 01:02:35 AM
クライアントを実行しているほとんどの人はこのメッセージスレッドを読んでいない。では…素朴な質問だ:
- これはバージョン3.8.1(大災害前)の不正なブロックチェーンを持つクライアントにどのような影響を与え続けますか?
- 3.8.10にアップグレードしたがブロックチェーンファイルを削除しないクライアントにどのような影響がありますか?
- ノードパワーの50%以上がアップグレードされ、正しいチェーンが不正なチェーンを追い越せば、0.3.10ノードは不正なトランザクションが確認を得ることを困難にする。
- blk*.datファイルを削除しなかった場合、その50%への貢献にはなっておらず、正しいチェーンが不正なチェーンを追い越すまで不正なトランザクションが表示され続ける。
不正なチェーンも、アップグレードするノードが増えるにつれて速度が低下する。
74638以降、すでに14ブロックを生成した。0.3.10のビルドは約2~3時間前にアップロードされた。接続しているノードのうち、半数以上がすでに0.3.10だ。おそらく、不正なチェーンよりもすでに多くの計算力を持っていると思う。
できるだけ多くのCPUを投入している。ええ、全員がアップグレードするまでちょっと不公平なアドバンテージだな。 Lips sealed 妻のPCが既に新しいブロックを2つ生成した(笑)。ツキが彼女の味方のようだ。
Quote from: satoshi on August 16, 2010, 02:16:10 AM
… 接続しているノードの半分以上が既に0.3.10だ。…
素晴らしいニュースだ!でも、どうやってそれを調べたのか?自分自身をできるだけ多くの人に接続させ、バージョンを調査してログを書き出す(通常のBitcoinの処理に加えて)、特別に調整されたクライアントを書くことを検討していた。
Windowsでは、findstr /c:“version message” debug.log
不正なチェーンは最近ブロック74678にあったようだ。追い越すのが待ちきれない。
http://nullvoid.org/bitcoin/statistix.phpの統計では、過去3時間で1時間あたり5ブロックだった。約1日前に難易度調整があり、1時間あたり6ブロックに戻るはずだった。
チェーン全体を削除して再ダウンロードする代わりに、チェーンの末尾を手動で切り落とすRPCコマンドがあると便利ではないか?
この時点で、アップグレードしていないクライアントも正しいチェーンを持っているのか?
Quote from: laszlo on August 16, 2010, 10:13:00 PM
この時点で、アップグレードしていないクライアントも正しいチェーンを持っているのか?
はい。唯一の例外は、パッチ未適用のクライアントが別の偽トランザクションを作成し検証に成功した場合だ。アップグレードしていない他のいくつかのノードにその偽ブロックを広められるだろうが、アップグレード済みクライアントの方がパッチ未適用クライアントより多くのパワーを持っているようなので、不正なリンクは長続きせず、アップグレード済みクライアントには広まらない。
未アップグレードのノードはほとんどの場合正しいチェーンを持っているが、依然としてすべてのブロックにオーバーフロートランザクションを含めようとしているため、継続的にフォークして無効なブロックを生成しようとしている。旧バージョンのノードを再起動すると、トランザクションプールが空になるため、トランザクションが再ブロードキャストされるまでしばらくは有効なブロックを生成するかもしれない。0.3.9以下のノードはまだアップグレードが必要だ。
SVNには、blk*.datファイルを手動で削除せずにブロックチェーンを自動的に再編成するために必要なコードが入っている。昨日はそのコードを迅速かつ慎重に書くことができないとわかっていたので、手動の簡易オプションで対応した。