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

サトシの​コードが​語る​こと — コーディングスタイル・​コミットパターン・​コード進化​(v0.1.0〜v0.3.19)

暗い配色の図。C++ のコードを書く画面のような窓の隣に、UTCで活動のない時間帯を示す時計の図、コードの行数が増えていく様子を示す折れ線グラフ、「75-day silence」の空白があるコミットの年表が並んでいる

2年間で198件のコミットがあり、コードの書き方は、ずっと同じ一人のものだと見分けられる。ここでは、サトシ・ナカモトのビットコインのソースコードを、v0.1.0(2009年1月)からv0.3.19(2010年12月)まで調べる。s_nakamotoの164件のSVNコミット(もとの時刻が残っている)と、34件のgitコミットを合わせ、ソースそのものと、コミットの時刻の並びを、一つながりの証拠として読む。v0.1.0(2009年1月)からサトシ自身のSVN初コミット(2009年10月)までの期間には、サトシ個人のコミット履歴は保存されていない。SVNリポジトリ自体はその2か月前、2009年8月30日にマルッティ・マルミが作成している。サトシ自身のコミットがそこに現れるのは2009年10月21日からで、その10日後にマルミが始めたLinuxへの移植は、11月の初めにサトシが仕上げてマージした。

1 データソース

  • ソースコード: オリジナルのBitcoin v0.1.0ソースとv0.3.19までのタグ付きリリース
  • コミット履歴: SourceForge自身のログでs_nakamotoによるSVNコミット164件(オリジナルのタイムスタンプを保持する主要データ。そのうちr29・r30・r31・r50・r98の5件はGitミラーに欠けている)+ Satoshi Nakamoto <satoshin@gmx.com>によるgitコミット34件。SVNリポジトリのコミッター記録も参照。164件全件を対象とした語数・間隔・diff規模の分析はSVNコミット統計のエントリーを参照。

2 主な発見

  • タイムゾーン: 06:00〜12:00 UTCにコミットがほぼ皆無であることから、EST(UTC-5)またはCST(UTC-6)在住の可能性が最も高い。この時間帯は、Chain Bulletinがフォーラムとメーリングリストの投稿時刻から読んだGMTの活動時間帯とは重ならない。コミットの時刻から読んだ時間帯と、投稿の時刻から読んだ時間帯で、何が決まり、何が決まらないかは、国籍の分析で並べて検討している
  • コミット活動期間(SVN): 420日間(2009年10月〜2010年12月)、109日間にコミット
  • コーディングスタイル: ハンガリアン記法の変種、四重スラッシュ(////)TODOマーカー、独自マクロ(loop、foreach、CRITICAL_BLOCK)が一貫して使われ、開発はWindowsが中心だった(開発環境を時系列でたどった記録はサトシのWindowsの開発環境、配布の仕方と開発の道具がないことの読みはビットコインv0.1の配布・開発環境異例分析)
  • コード成長: 23ヶ月で19,901行→31,909行(+60%)
  • 最終活動: セキュリティ強化、DoS対策、中央集権的セーフモードの除去。どれも、プロジェクトをほかの人に引き渡そうとしている人がする作業で、この組み合わせは、サトシの最後のリリースとなったビットコインv0.3.19で、そのまま一緒に公開されている

3 75日間の空白(2010年3月〜5月)

下の月ごとのコミットのグラフには、2010年3月初めから5月中ごろまで、s_nakamotoのSVNコミットがまったくない、目立つ空白がある。サトシ自身が2010年5月16日のメールでこの不在を認めて説明している。マルッティ・マルミが消息を尋ねた後(「お元気ですか? しばらく姿を見かけませんでしたね」)、サトシは返信した。「私も、この一か月半ほど別のことで立て込んでいた。4月初めからのメールを、ついさっきまとめてダウンロードしたところだ。だいたい片付いたので、もうすぐビットコインに戻れるはずだ」

これはこの空白期間について残されている唯一の一人称の記録である。「別のこと」が何だったのかを、サトシは書いていない。

4 ここで分かったことを、さらにたどれるページ

このページのコードの知見は、ほかのいくつかの分析の土台になっている。人物を追うならサトシ伝記・Bitcoin SVNコミッター記録、日ごとの公開の活動ならサトシ活動年表がある。先行する技術と新しい組み合わせの内訳はビットコインの設計系譜、コードが作者について語ること(と語らないこと)はサトシ匿名性アーキテクチャで扱う。こうしたコードの痕跡だけでは正体を絞り込めない理由は同定非対称性分析、v0.1のハッシュと転送をバイトの単位で示した地図はv0.1直列化境界分析、v0.1の設計の判断が後の版でどう組み直されたかはビットコイン・アーキテクチャ進化設計書にある。

2年分のコミットから見えてくるのは、顔のない人の姿である。記録の中で、サトシ自身が理由を書いた空白は一つだけで、それも一行ですまされている。別のことで立て込んでいた、と。それ以外に、ソースから作者について分かることは、どれも書き方の癖から読み取ったものである。

5 可視化

コミット時間帯ヒートマップ(UTC)

曜日×時刻 — 濃いほどコミットが多い。06:00〜12:00 UTCにコミットがほとんどないことは、EST/CSTの時間帯を示す手がかりになる。

タイムゾーン分析

06:00〜12:00 UTCにコミットがほぼ皆無であることから、サトシはEST(UTC-5)またはCST(UTC-6)に在住していた可能性が最も高い。EST仮定ではこの空白は01:00〜07:00(通常の睡眠時間)に相当する。GMT(英国)仮定では06:00〜12:00に睡眠(完全な夜型)、JST(日本)仮定では15:00〜21:00に睡眠となり、いずれも不自然。

月別コミット頻度

s_nakamotoのSVNコミット。75日間の空白(2010年3〜5月)とその後の減少が見える。

ソースコード行数の推移

バージョン別のコード行数。v0.3.7の急増はウェイ・ダイのCrypto++ライブラリの組み込み。

コーディングスタイルの指紋

サトシのコード全バージョンで一貫して見られる特徴的なパターン。

命名規則

ハンガリアン記法 nBestHeight, fGenerateBitcoins, pindexBest, vWalletUpdated, mapTransactions, strSetDataDir
Cプレフィックスクラス CBlock, CTransaction, CNode, CWallet, CScript
PascalCase関数名 AcceptToMemoryPool, ConnectBlock, ProcessMessage

コメント

////コメント 四重スラッシュのTODOマーカー(main.cppだけで22箇所)。サトシ独自の慣習

マクロ

loopマクロ #define loop for(;;) — 独自の無限ループ省略記法
foreachマクロ #define foreach BOOST_FOREACH — 利便性ラッパー
CRITICAL_BLOCK スコープベースのミューテックスロックマクロ。std::lock_guardに先行

癖

(*mi).second mi->secondではなく一貫して(*mi).secondを使用
return (expr) 戻り値を括弧で囲む: return (true), return (nValue)

フォーマット

Allmanブレース + 4スペース 開き波括弧を新しい行に。全体で4スペースインデント
代入の位置揃え 連続する代入文の=記号を縦に揃える美学

プラットフォーム

Windows中心開発 Win32 API、MSVCプラグマ、ハンガリアン記法 — Windows開発者の強い指標