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

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

暗い配色の図。C++ のコードエディター風ウィンドウの隣に、UTCの無活動時間帯を示す時計図、コード行数の増加を表す折れ線グラフ、「75-day silence」の空白があるコミット年表が並んでいる

198件のコミット、2年間、識別可能な単一のコーディングスタイル。本分析はサトシ・ナカモトのビットコインソースコードを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日にマルッティ・マルミが作成しており、サトシ自身のコミットが同リポジトリに現れるより前に、マルミがコードベースをLinuxへ移植していた。

1. データソース

  • ソースコード: オリジナルのBitcoin v0.1.0ソースとv0.3.19までのタグ付きリリース
  • コミット履歴: s_nakamotoによるユニークSVNコミット160件(オリジナルのタイムスタンプを保持する主要データ)+ Satoshi Nakamoto <satoshin@gmx.com>によるgitコミット34件。後の照合で、SVNリポジトリのコミッター記録と突き合わせ、SVN単独の数字は164件に確定した(r29・r30・r31・r50・r98の5件が、この「160」の集計元だったミラーには欠落しており、SourceForge自身のログと個別に照合して確認した)。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日のメールでこの不在を認めて説明している。マルッティ・マルミが消息を尋ねた後(「どうしているんですか?しばらく見かけませんでしたね」)、サトシは返信した。「私もこの1ヶ月半、他のことで忙しくしていました。4月初めからのメールをたった今ダウンロードしたところです。ほぼ整理がついたので、まもなくBitcoinに戻れるはずです」

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

4. これらの発見がつながる先

本エントリのコードレベルの知見は、複数の隣接分析の根拠として参照される。具体的には、参加者追跡ではサトシ伝記・Bitcoin SVNコミッター記録、日付別公開活動ではサトシ活動年表、先駆vs新規合成の内訳ではビットコインの設計系譜、コードが著者について語るもの (語らないもの) ではサトシ匿名性アーキテクチャ、これらコードレベルの痕跡が身元同定に対して過少決定的である理由では同定非対称性分析、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開発者の強い指標