ビットコイン・インスティテュート

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

コードのブランチが本線に統合される様子を示す図で、バツ印の付いたフォルダーアイコンが光る円形モジュールに置き換わり、その下に5段階のタイムラインが並んでいる。

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

コミットとマージ

変更はサトシ時代の貢献者プールの外側から来た。ニルス・シュナイダー (BitcoinTalkハンドルtcatm) がno-cryptoppブランチを作成した。2010年のv0.3.6リリースアラートでサトシがマイニングのミッドステートキャッシュ最適化の功績を認めたのと同じ貢献者である。実体的なコミット (6ccff2cb) は2011年9月27日で、src/main.cppのSHA256Transform() をCrypto++ のCryptoPP::SHA256::TransformからOpenSSLのSHA256_Init / SHA256_Update呼び出しに書き換え、using CryptoPP::ByteReverseインポートを削除し、src/cryptopp/ ディレクトリツリー全体 (16ファイル: sha.cpp、sha.h、cryptlib.h、config.h、cpu.cpp、cpu.h、iterhash.h、misc.h、obj/.gitignore、pch.h、secblock.h、simple.h、smartptr.h、stdcpp.h、License.txt、Readme.txt) を削除した。シュナイダーがbitcoin/bitcoinへのGitHubコミットアクセスを得たのはその8日前、2011年9月19日のことだった。2011年にアクセスを付与された5人の開発者の一人としての経緯は、GitHub移行期のコミッターアクセス付与記録に詳しい。

サトシの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-256—Crypto++ 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までだった。変更は暗号学的な理由や、サトシの正体をめぐる理由で行われたのではない。コミュニティ貢献者 (シュナイダー) によるインツリー保守負担削減を動機とする通常のコード整理であり、サトシ後のメンテナー (アンドレセン) によって承認された。その結果として、「ビットコインがソースツリーレベルでウェイ・ダイのライブラリに依存している」という主張が生きていた34か月の期間が確定する。その期間の外では、本主張は稼働中のプロトコルではなく過去のリリースについてのものとなる。

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

このCrypto++ 除去は、依存先の置き換えが続く長い流れの起点にあたる。2011年のv0.5でCrypto++ からOpenSSLへ、2016年のv0.12でOpenSSLからlibsecp256k1へと移り、後者は2016年のlibsecp256k1エントリが扱っている。