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

本分析は Bitcoin Institute が、サトシ・ナカモトのビットコインソースコードを v0.1.0(2009年1月)から v0.3.19(2010年12月)まで調査したものである。2 つの異なるデータセットを組み合わせている:v0.1.0 リリースの静的ソースコード分析(2009年1月にバージョン管理なしで配布)と、マルッティ・マルミの協力により 2009年10月に導入された SourceForge SVN リポジトリのコミット履歴分析。v0.1.0(2009年1月)から SVN 開始(2009年10月)までの期間にはコミット履歴が保存されていない。

データソース:

  • ソースコード: オリジナルの Bitcoin v0.1.0 ソースと v0.3.19 までのタグ付きリリース
  • コミット履歴: s_nakamotoによるユニーク SVN コミット 160件(主要データ — オリジナルのタイムスタンプを保持)+ Satoshi Nakamoto <satoshin@gmx.com>による git コミット 34件

主な発見:

  • タイムゾーン: 06:00〜12:00 UTC にコミットがほぼ皆無であることから、EST(UTC-5)または CST(UTC-6)在住の可能性が最も高い
  • コミット活動期間(SVN): 420日間(2009年10月〜2010年12月)、109日間にコミット
  • コーディングスタイル: ハンガリアン記法の変種、四重スラッシュ(////)TODO マーカー、独自マクロ(loopforeachCRITICAL_BLOCK)、Windows 中心開発の一貫した使用(v0.1 の配布・開発環境上の選択についてはビットコイン v0.1 の配布・開発環境異例分析で別途扱う)
  • コード成長: 14ヶ月で 19,901 行→31,909 行(+60%)
  • 最終活動: セキュリティ強化、DoS 対策、中央集権的セーフモードの除去 — プロジェクトの引き渡しを準備する者の特徴的な作業

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

以下の月別コミットチャートには、2010年3月初旬から 5月中旬まで s_nakamoto の SVN コミットが一切行われなかった顕著な空白期間が見える。サトシ自身が 2010年5月16日のメールでこの不在を認めて説明している。マルッティ・マルミが消息を尋ねた後(「どうしているんですか? しばらく見かけませんでしたね」)、サトシは返信した「私もこの 1ヶ月半、他のことで忙しくしていました。4月初めからのメールをたった今ダウンロードしたところです。ほぼ整理がついたので、まもなく Bitcoin に戻れるはずです」

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

以下のインタラクティブなビジュアライゼーションは、本分析の統計データを提示する。

コミット時間帯ヒートマップ(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開発者の強い指標