ビットコイン v0.5 が Crypto++ 依存を撤去、OpenSSL SHA-256 に置換

2011 年 11 月 20 日、ビットコイン v0.5.0 がリリースされ、サトシ・ナカモトが 2010 年 7 月 (SVN rev 114) に追加した Crypto++ SHA-256 サブセットがコードベースから撤去された。以降、ビットコインは同じ処理を OpenSSL の SHA-256 ルーチンで実行する。Crypto++ — ウェイ・ダイの C++ 暗号ライブラリで、サトシ正体候補が著作した唯一のビットコイン本体への直接コード依存ライブラリ — は Bitcoin Core から消滅した。

コミットとマージ。

変更はサトシ時代の貢献者プールの外側から来た。ニルス・シュナイダー (BitcoinTalk ハンドル tcatm) — 2010 年の v0.3.6 リリースアラートでサトシがマイニングのミッドステートキャッシュ最適化の功績を認めた同じ貢献者 — が no-cryptopp ブランチを開いた。実体的なコミット (6ccff2cb) は 2011 年 9 月 27 日 で、src/main.cppSHA256Transform() を Crypto++ の CryptoPP::SHA256::Transform から OpenSSL の SHA256_Init / SHA256_Update 呼び出しに書き換え、using CryptoPP::ByteReverse インポートを削除し、src/cryptopp/ ディレクトリツリー全体 (16 ファイル: sha.cppsha.hcryptlib.hconfig.hcpu.cppcpu.hiterhash.hmisc.hobj/.gitignorepch.hsecblock.hsimple.hsmartptr.hstdcpp.hLicense.txtReadme.txt) を削除した。

サトシの 2011 年 4 月の引き継ぎ後にプロジェクトのリードメンテナーとなっていたギャビン・アンドレセンが、2011 年 10 月 5 日にブランチをマージした (コミット b898c8fc、「Merge branch ‘no-cryptopp’ of https://github.com/tcatm/bitcoin」)。マージにより Bitcoin Core のメインラインは以降 SHA-256 については OpenSSL のみとなった。ビットコイン v0.5.0 は 2011 年 11 月 20 日にタグ付けされ、6 週間後にユーザーへ出荷された。

削除されたもの、その位置づけ。

ビットコインは最古の保管リリース以来、Crypto++ SHA-256 サブセットをバンドルしてきた。サトシは v0.3.6 (2010 年 7 月) で Crypto++ 5.5.2 から Crypto++ 5.6.0 SSE2 最適化アセンブリへの移行を自ら段取りし、自身のコミットメッセージで依存を明示的に追跡していた:「Crypto++ 5.6.0 ライブラリのサブセットを SVN に追加した。SHA と 11 個の汎用依存ファイルだけに削ぎ落とした」。コードアーカイブの観点で平たく言えば、Crypto++ はビットコインがこれまで直接依存した、サトシ正体候補のうち唯一の著作物である。

2011 年までに、Bitcoin Core プロジェクトの重心は Crypto++ コードパスから移動していた。Crypto++ アセンブリサブセットのバンドルを正当化していた 2010 年のマイニング高速化論拠 (CPU SHA-256 スループットによるソロマイニング) は、GPU および FPGA マイニングによって決定的に陳腐化しつつあった。2011 年後半には、ネットワーク相手にリファレンスクライアントの CPU SHA-256 パスを走らせる本格的なマイナーは存在しなかった。Crypto++ サブセットのパフォーマンス重要マイニングコードとしての役割は蒸発し、残ったのはインツリーのサードパーティコピーで、保守コストとライセンスファイルのオーバーヘッドが少なくない。それを撤去して既存のシステム依存 (OpenSSL は ECDSA で既にリンクしていた) に置き換えるのは、コード整理の判断であって、暗号学的方針の変更ではない。置換はプロトコル動作を保存する — OpenSSL の SHA256_Update は同じ入力に対して Crypto++ の SHA256::Transform と同じダイジェストを生成する。

その後の経緯。

OpenSSL SHA-256 パス自身も、2014 年に Bitcoin Core のインツリー実装に置き換えられた。ピーター・ウィーユのコミット 977cdadea8 (2014 年 4 月 20 日、「Add a built-in SHA256/SHA512 implementation」) が src/sha2.cpp に手書きの SHA-256 および SHA-512 ルーチンを導入し、その後のコミットでコンセンサス重要のハッシュ呼び出し箇所を OpenSSL から切り替えた。この時点以降、Bitcoin Core はサードパーティの SHA-256 実装に一切依存しない。OpenSSL の ECDSA 依存はより長く残り、最終的に Bitcoin Core v0.12 (2016 年 1 月) で libsecp256k1 に置換された。

置換の連鎖:

構成要素置換先著者
2009SHA-256Crypto++ 5.5.2 (インツリーサブセット)サトシ・ナカモト (v0.1)
2010SHA-256Crypto++ 5.5.2Crypto++ 5.6.0 SSE2 ASM (インツリーサブセット)サトシ・ナカモト (v0.3.6、BlackEye および tcatm を功績明記)
2011SHA-256Crypto++ 5.6.0OpenSSLニルス・シュナイダー、ギャビン・アンドレセンがマージ (v0.5.0)
2014SHA-256OpenSSL組み込み (sha2.cpp)ピーター・ウィーユ
2016ECDSAOpenSSLlibsecp256k1ピーター・ウィーユとグレゴリー・マクスウェル (v0.12.0)

サトシ正体問題への関連。

ウェイ・ダイ=サトシ仮説はビットコイン v0.1 の Crypto++ 依存を構造的論点として扱う: 名指し候補のうち、ビットコインがソースツリーに実際に含めたライブラリを著作したのはウェイ・ダイのみ、というもの。本論点は時間的に限定されている。ビットコイン v0.5 (2011 年 11 月) では Bitcoin Core はもはや Crypto++ サブセットを保持していない。ウェイ・ダイのライブラリへのソースツリーレベルの構造的コードベース依存は、v0.1 (2009 年 1 月) から v0.4.x までで終わった。変更は暗号学的アイデンティティの根拠で行われたのではない — コミュニティ貢献者 (シュナイダー) によるインツリー保守負担削減を動機とする通常のコード整理であり、サトシ後のメンテナー (アンドレセン) によって承認された — が、その結果として、「ビットコインがソースツリーレベルでウェイ・ダイのライブラリに依存している」 という主張が生きていた 22 か月の窓が確定する。その窓の外では、本主張は稼働中のプロトコルではなく過去のリリースについてのものとなる。

ウェイ・ダイ=サトシ仮説エントリ §2.2 はコードベース依存を、ウェイ・ダイが直接的なコード貢献の観点で他候補と構造的に区別不能であるとする帰無仮説に対する反証として枠組みづける。本エントリはその反証の上限を記録する: v0.5.0 で終了する。