
2016年1月15日、Bitcoin Core v0.12が、合意に関わるECDSAの署名検証に、OpenSSLに代えてlibsecp256k1を使うようになった。OpenSSLは、サトシのオリジナルv0.1リリースから7年間、ビットコインが頼ってきたライブラリーだった。
背景
libsecp256k1プロジェクトは2013年3月5日、ピーター・ウィーユによって開始された。当初の動機は性能で、ウィーユは、GLV法の自己準同型を使えば、OpenSSLの汎用の楕円曲線のコードよりはっきり速くできるかを確かめたかった。1週間で、このライブラリーはビットコインのブロックチェーン全体を検証できるようになった(当時のブロック高は約225,000)。
グレゴリー・マクスウェルも加わり、性能を試す実験として始まった取り組みは、OpenSSLのsecp256k1の実装をまるごと置き換える、ビットコインのためだけのライブラリーを作る仕事になった。
OpenSSLを置換する理由
2014年までに、合意に関わるコードでOpenSSLを使うことには、具体的な問題がいくつもあると分かっていた。
- 署名の解析の食い違いで、思わぬチェーンの分裂が起こりうる。OpenSSLのバージョンが異なると、同じ署名が有効か無効かで判定が割れる場合があり、全ノードが同じ結論に達する必要がある合意システムでは許容できない。
- 性能がはっきり上がる。libsecp256k1は、最終的に署名の検証でOpenSSLの2.5〜5.5倍速くなった。新しいブロックの検証にかかる手間の大半は、この署名の検証である。
- 監査しやすくなる。一つの曲線と、ビットコインに必要な操作だけに絞ったので、ライブラリーは小さくまとまり、人が中身をくわしく見直せるようになった。そのうえ、サイドチャネル攻撃に強い定数時間の実装もできた。
2014年11月、ウィーユはlibsecp256k1のテストを書きながらCVE-2014-3570を発見・報告した。これはOpenSSLのBN_sqr(二乗)ルーチンの重大なバグで、何年もOpenSSLの中に潜んでいた。
マクスウェルはBitcoin Magazineの記事で結論をこうまとめた。「OpenSSLは、ビットコインのように合意が要となるシステムには適さないライブラリーだ」
展開
- Bitcoin Core v0.10(2015年2月): ウォレットで署名するときに、標準でlibsecp256k1を使うようになった。
- Bitcoin Core v0.12(2016年1月15日): 合意に関わるECDSAの署名検証の標準としてlibsecp256k1を採用。
暗号の設計の文書でも、ビットコインの署名の方式の移り変わりをたどる中で、この2段階の切り替えを書いた。
意義
libsecp256k1がOpenSSLに代わったのは、ブロックの正しさを確かめるための署名の検証である。ここでは、すべてのノードが同じ判定を出さなければ、チェーンが分かれてしまう。サトシのv0.1がOpenSSLを使ったのは、2008年には当然の選択だった。Windowsで動くC++ のプロジェクトでは、OpenSSLが標準の暗号ライブラリーだったからである。だが2016年までに、Bitcoin Coreの開発者たちは、みんなが合意して動く仕組みにとっては、「当然の選択」が「正しい選択」とは限らない、と考えるようになった。そして3年をかけて、ビットコインのための代わりのライブラリーを作り上げた。
コードベースが成熟するにつれて、サトシの設計選択はビットコイン固有の実装へ段階的に置き換えられていく。Bitcoin Coreの歩みには、この流れが何度も出てくる。PR #4641(laanwj、2014)もその一つで、サトシのハンガリアン記法による変数命名規則を新しいBitcoin Coreコードから体系的に削除する動きの始まりだった。
v0.12でのlibsecp256k1への置換は、ウラジミール・ファン・デル・ラーンがリードメンテナーを務めていたあいだに、Bitcoin Coreがリリースした成果の一つである。ピーター・ウィーユの伝記では、libsecp256k1を、ウィーユが2013年に始めたプロジェクトとして取り上げている。グレゴリー・マクスウェルの伝記では、マクスウェルがこの開発で果たした役割を、CoinJoinやConfidential Transactionsと並べて書いている。暗号のライブラリーを替えていく流れの、もっと早い時期は、2011年にビットコインv0.5がCrypto++ を外したことを扱うページにある。2011年にCrypto++ からOpenSSLへ移り、2016年のv0.12で、OpenSSLからlibsecp256k1へ移ったのである。この移行は、v0.1以来ビットコインの設計全体に関わる変化のうち、ウィーユが手がけた4件の一つである。














