サトシ・ナカモトの論文を読む(概要)
おわび(2024/2/7)
肝心の論文へのリンクが切れておりました。
申し訳ありません。修正中です。
はじめに
ビットコインの始祖、サトシ・ナカモトのビットコインの論文は、bitcoin.orgのページから無償でダウンロードすることができる。
ビットコイン:P2P電子通貨システム
https://bitcoin.org/files/bitcoin-paper/bitcoin_jp
わずか13ページの論文に、今日流通している暗号通貨の仕組みがぎゅっと詰まって説明されている。
平易な言葉で、難しい数式を一切使わずに。
(後半で数式と短いCコードが出てくるが、攻撃者がビットコインを乗っ取る確率の計算、その困難さの証明であり、ビットコイン本体の議論ではない)
本論文を読み解くことで、ビットコインをはじめとする暗号通貨の仕組みにアプローチできると思う。
それでは早速、読み進めながら、自己理解のため余分な書き込みをする。
概要
以下、引用は「ビットコイン:P2P 電子通貨システム 」から抜粋。
最初の行「金融機関の介在なしに、利用者同心の直接的なオンライン決済が可能である」ことがビットコイン(およびそれ以降の暗号通貨)の目的である。
そのために必要な条件として、以下2つがあげられている。
電子署名の利用
二重支払いの防止
1.の電子署名は送金者が確かに自分自身であることを証明する。銀行でいうと古くは銀行印入り通帳、今ではキャッシュカード+4桁の暗証番号、ネット上ではIDとパスワード(∔生体認証やトークン)など。
ビットコインでは、自分のウォレットから発行したビットコインアドレスを使用し取引するが、実はこの中に電子署名が暗号化されて埋め込まれている。
2.の二重支払いの防止は、銀行では時々システムのバグや入金者のミスにより起きてしまうが、ビットコインにおいては人が介在しないためシステムで排除している。
上記「ネットワーク」はビットコインの実体そのもの。
いくつか用語がでてきたので整理する。
ハッシュ関数:詳しくは「暗号学的ハッシュ関数」
Proof of work:ブロックの検証を行うアルゴリズム計算。略してPoW とも言う。計算を実施することをマイニングと言う。
ブロックチェーン:ビットコインのPoWによって生成された分散型台帳。
ハッシュ関数?君たちはプログラマーだからそのくらい知っているよね?という感じで論文は進む。ここでは暗号化関数ぐらいの理解にしておこう。撤回します。後ろに基本のキ程度は分かるようにメモを残します。
ビットコインネットワーク上の各ノードは取引もする一方、マイニングを行うノードがいなければビットコインは維持できない。そのためにマイニング報酬というものがあり、今では6.25BTC/10minがPoW計算を一番早く終了したノードに与えられる。実際はグループを作って計算を分担し、計算量に応じて報酬を分配するマイニングプールが多い。
一見分かりにくい文章だが、要は正当なビットコインのチェーンは1本だけ、と解釈できる。
ブロックチェーンの生成最中で枝分かれすることはあるが、最大勢力以外の枝は死んでいく。
例外として、暗号通貨の開発者がブロックを分岐させ検証アルゴリズムを変更してしまうことがある。成功すると新しい暗号通貨が生まれ、これをハードフォークという。ビットコインでは2017年のハードフォークによりビットコインキャッシュという新通貨が生まれている。
各ノードがマイニングを始める前に、ビットコインのブロックチェーンの最新データを余さず取り込んでいることが必須である。
上記「メッセージ」とは送金者のトランザクション(取引履歴)で、各ノードに「ブロードキャスト」され、受け取ったノードたちはトランザクションの検証作業すなわちPoWによるマイニングを始める。
マイニングが中断してしまった場合は、再び最新のブロックチェーン余さずダウンロード後、再開する。(大変なように見えるが、数ブロック生成する手間が省け最新ブロックの検証ができるから、シンプルで理にかなっている)
追記1:サトシ・ナカモトって誰?
ビットコインの生みの親って事は認知されているが、その他の正体・生涯は謎に包まれている。
日本名を名乗っているが、日本人かどうかも分かっていない。
「サトシ・ナカモトとは私」と名乗っている人は何人か居るが、全く当てにならない。
だが、仮に日本人とした場合、このような論文を書ける人物が1人だけいた。(過去形であることが残念でならない)
論文名の「P2P電子通貨システム」というキーワードを見てピンと来る人物。彼こそがサトシ・ナカモトであるという説がある。私もその説を信じる1人である。
追記2. ハッシュ関数
上の方で端折ろうとしたが、ビットコインを語るために避けることは出来ない用語だと考えなおし、出来る限り簡潔にまとめる。
ハッシュ(hash)とは「細かく切り刻み、混ぜ合わせる」ことであり、料理好きの人は「ハッシュドポテト」を連想するだろう。「ハッシュタグ」の方が想像しやすいかもしれない。
ハッシュ関数は、日本語訳の「要約関数」の方がわかりやすい。一般につぎのようなものをいう。
ハッシュ関数が何もので、どのように使われるかの分かりやすい解説は以下記事をご参照下さい。
ビットコインのアドレスやブロックチェーン生成には、攻撃に耐えうるために暗号学的ハッシュ関数が使用される。
暗号学的ハッシュ関数に求められる性質は以下のようなものである(上記Wikipediaより引用)
以下入力メッセージを$${m}$$、ハッシュ関数$${f(m)}$$、得られる出力(ハッシュ値)$${y}$$とすると、
性質1. 逆関数$${m=f^{-1}(y)}$$の値を求めること(現像攻撃)が(事実上)不可能。
性質2. $${m_1 \ne m_2}$$ 尚且つ$${ f(m_1) = f(m_2)}$$となる$${m_1, m_2}$$を求めること(衝突攻撃)が(事実上)不可能。
性質3. は数式で表現しずらいが、ここではハッシュ値の長さが十分大きく、かつ一様分布に近ければこの性質は満たせるだろうと推測する。
ところで、理想的な暗号学的ハッシュ関数$${f}$$をもってしても、性質2. を満たすことの方が難しい。逆に攻撃者にとっては衝突攻撃のほうが現像攻撃よりた易い。ハッシュ値$${y=f(m)}$$のビット数をNとした場合、以下の理論が成り立つからである。
上記でいう誕生日のパラドックスとは以下のようなものである。
答えは23人で、直観に反する結果であることがパラドックスと呼ばれる。
衝突攻撃の定義は以下の通りだった。
$${m_1 \ne m_2}$$ 尚且つ$${ f(m_1) = f(m_2)}$$となる$${m_1, m_2}$$を求める。
誕生日をハッシュ関数に見立てたら、確かに試行回数に関しても誕生日のパラドックスが当てはまる。そのため衝突攻撃は誕生日攻撃とも呼ばれる(この呼び名の方がポピュラーである)
誕生日攻撃を利用して、偽物の契約書に電子署名をさせることが可能になる。長くなるため誕生日攻撃-デジタル署名への攻撃(Wikipedia)を参照してください。
いや、こんな事よく思いつくよねハッカーって。