
2011年11月21日、ビットコインv0.5.0がリリースされ、サトシ・ナカモトが2010年7月 (SVN rev 114) に追加したCrypto++ SHA-256サブセットがコードベースから撤去された。以降、ビットコインは同じ処理をOpenSSLのSHA-256ルーチンで実行する。Crypto++ はウェイ・ダイが作ったC++の暗号ライブラリで、このときから15年前の1996年に、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のみを使うようになった。マージから約7週間後、2011年11月21日にリリースされたビットコインv0.5.0が、この変更をユーザーへ届けた。
何が消えたのか
ビットコインは現存する最も古いリリース以来、Crypto++ SHA-256サブセットをバンドルしてきた。サトシはv0.3.6 (2010年7月) でCrypto++ 5.5.2からCrypto++ 5.6.0 SSE2最適化アセンブリへの移行を自ら進め、フォーラムの投稿でその中身を説明していた。「Crypto++ 5.6.0のライブラリの一部をSVNに加えた。SHAと、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に置換された。
置換の連鎖:
| 年 | 構成要素 | 元 | 置換先 | 著者 |
|---|---|---|---|---|
| 2009 | SHA-256 | — | Crypto++ 5.5.2(ソースツリー内の一部) | サトシ・ナカモト (v0.1) |
| 2010 | SHA-256 | Crypto++ 5.5.2 | Crypto++ 5.6.0 SSE2 ASM(ソースツリー内の一部) | サトシ・ナカモト (v0.3.6、BlackEyeおよびtcatmの功績を明記) |
| 2011 | SHA-256 | Crypto++ 5.6.0 | OpenSSL | ニルス・シュナイダー、ギャビン・アンドレセンがマージ (v0.5.0) |
| 2014 | SHA-256 | OpenSSL | 組み込み (sha2.cpp) | ピーター・ウィーユ |
| 2016 | ECDSA | OpenSSL | libsecp256k1 | ピーター・ウィーユとグレゴリー・マクスウェル (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がOpenSSLに代わったページで扱っている。











