ビットコインの仕組み図解: コインから合意までの全用語マップ

このエントリーは予備知識なしに読めるように書いている ― ビットコイン、 暗号学、 コンピューター同士の通信のどれも、 前もって知っている必要はない。 ここを最後まで読み通せば、 本アーカイブの他のエントリーを開いても、 出てくる用語に詰まらず読み進められるようになっているはずだ。 主要な用語はすべて、 初出のところで一行の定義と、 仕組み上どこに位置するかを示す図を添える。

一語だけ調べたい場合は用語の早見表へ。 そうでなければ上から順に読むだけでよい ― 各章は前の章の内容しか前提にしない。

1. ビットコインって何?

ビットコインとは、 仲介する銀行なしで動く電子マネーのシステムだ。 銀行口座にあるドルや円は、 銀行が管理するデータベースの記録に過ぎない ― 銀行がオフラインになったり、 口座を凍結したり、 間違いを起こせば、 利用者は手詰まりになる。 ビットコインは、 その「中央で支配する単一の銀行」 を、 誰でも参加できる数千台のコンピューターのネットワーク、 誰も全体を支配しない構造に置き換える。

それらのコンピューター 1 台 1 台をノードと呼ぶ。 ノードは中央サーバーを経由せず、 互いに直接やり取りする。 こうした方式のネットワークをピアツーピア、 略して P2P と呼ぶ。

ピアツーピアのビットコインネットワーク

ノード

ノード

ノード

ノード

ノード

ノード

ノード ― ビットコインソフトウェアを実行し、 他のビットコインノードに接続しているコンピューター。 誰でも 1 台動かせる。 ピアツーピア (P2P) ― 中央サーバーを介さず、 コンピューター同士が直接つながるネットワーク方式。

このシステムのルールは、 2008 年にサトシ・ナカモトが公開した 1 本の短い論文 ― Bitcoin ホワイトペーパー ― で定義されている。 ソフトウェア本体は 2 か月後の 2009 年 1 月にリリースされ、 それ以来止まることなく稼働し続けている。

先に進む前に 1 つ補足を。 上で述べた「ノード」 ― ブロックチェーン全部を保持し、 すべてのルールを独立に検証する種類 ― を フルノード と呼ぶ。 これとは別に、 もう少し軽い変種として 軽量ノード、 または SPV クライアント (simplified payment verification の略) と呼ばれるものがあり、 各ブロックの先頭にある要約データ ― ブロックヘッダー ― だけをダウンロードして、 特定のトランザクションが存在するかをフルノードに問い合わせる方式で動く。 スマートフォンウォレットの多くは SPV で動くが、 もう一段単純な「ウォレット運営者の中央サーバー API に問い合わせる」 方式 (より軽量だが運営者を全面的に信頼する) を採るものも多い。 SPV の発想はホワイトペーパー § 8 で示され、 実用的なエンジニアリングは数年後、 おもにマイク・ハーンの bitcoinj 開発によって進められた。 この後の章では、 特に断らない限り「ノード」 はフルノードを指す。

この後の章では、 その「勝手に動き続ける」 システムが実際にどう動くのかを順を追って説明する。

2. 用語の早見表

調べたい語からジャンプできる索引として使ってよい。 各語のリンクは、 図と一緒に解説している章につながる。

用語意味
ノードビットコインソフトウェアを動かしているコンピューター
フルノードブロックチェーン全体を保持し、 すべてのルールを独立検証するノード (本記事の前提とする種類)
軽量ノード (SPV)ブロックヘッダーのみダウンロードし、 残りはフルノードに依存するノード (スマートフォン用が典型)
ピアツーピア (P2P)コンピューター同士が直接つながる構造、 中央サーバーなし
ウォレット鍵を保持し、 ビットコインの送受信を可能にするソフトウェア
秘密鍵コインを支配する秘密の数値、 これを持つ者がコインを動かせる
公開鍵秘密鍵から導かれる数値、 他人に公開して安全
アドレス公開鍵から導かれる短い文字列、 コイン受け取り用
デジタル署名秘密鍵の保有者が何かを認可したことの暗号学的証明
トランザクション1 つ以上の入力から 1 つ以上の出力へコインを動かすメッセージ
入力これから使う過去の出力への参照
出力受取人のアドレスに対して施錠された、 新しいコインの塊
UTXOまだ使われていない出力、 「コイン」 の実体
BTC / satoshi単位 (1 BTC = 100,000,000 satoshi)
ブロックトランザクションをひとまとめにした塊
ハッシュ任意のデータから計算される短い指紋となる数値
ハッシュ関数ハッシュを生成する関数、 入力を 1 文字でも変えるとまったく違うハッシュになる
ブロックチェーンすべてのブロックを古い順にハッシュで連ねた構造
ジェネシスブロック最初のブロック (ブロック 0)
ブロック高チェーン内でのブロックの位置番号 (ジェネシスは高さ 0)
マイナー新しいブロックを追加しようと試みるノード
マイニング新しいブロックを追加しようとする作業
ナンス正しいブロックハッシュを探すためにマイナーが変え続ける数値
プルーフ・オブ・ワーク (PoW)ブロックを追加するためにマイナーが解く必要のあるパズル
難易度そのときのパズルの難しさ
コインベーストランザクションブロック最初の特殊な取引、 新しいビットコインを生み出す
ブロック報酬コインベーストランザクションで新規発行されるビットコイン
トランザクション手数料トランザクションに添えてマイナーへ支払う少額の上乗せ
マイナー報酬ブロック報酬 + そのブロック内の手数料合計
半減期210,000 ブロックごと (約 4 年) にブロック報酬が半分になるイベント
メモリープールまだブロックに入っていないトランザクションの待合室
確認自分のトランザクションの上に積まれたブロック数、 多いほど不変性が高い
合意全ノードが同じブロックチェーンに同意している状態
検証ノードがトランザクションやブロックがルールに従っているかを確認する作業
二重支払い同じコインを 2 回使おうとする行為、 ビットコインが解いた問題
改竄あとからブロックを書き換えようとする行為
最長チェーン累積仕事量がもっとも多いチェーン、 正直なノードはこれを採用する

3. コインの正体: UTXO モデル

「ビットコイン (1 枚)」 とは、 どこかにあなたの名前付きで置かれているコインオブジェクトではない。 もっとレシート (受領証) に近い。

友人から 1 BTC を受け取ったとしよう。 実際に受け取っているのは、 ネットワーク上のトランザクション記録だ。 そこにはこう書かれている: 「この 1 BTC の塊は、 この秘密鍵で開錠できるアドレスに施錠された」。 この塊を出力と呼ぶ。 使っていない間は未使用の出力、 略して UTXO (Unspent Transaction Output) と呼ばれる。 あなたの「残高」 とは、 あなたのウォレットが開錠できるアドレスに施錠されている UTXO の合計だ。

ビットコインを使う (送る) ときは、 ウォレットが新しいトランザクションを組み立てる:

  1. 既存の UTXO を 1 つ以上入力として並べる (消費するコイン)、
  2. 1 つ以上の新しい出力を作る (受取人のアドレスに施錠された新しいコインの塊)、
  3. 入力を支配する秘密鍵で全体に署名する。

出力 ― 新しく作られる UTXO (合計: 1.199 BTC)

入力 ― 消費する既存の UTXO (合計: 1.2 BTC)

UTXO A: 0.7 BTC

UTXO B: 0.5 BTC

トランザクション

(秘密鍵で署名)

友人へ: 1.0 BTC

自分へお釣り: 0.199 BTC

暗黙の手数料: 1.2 - 1.199 = 0.001 BTC

(出力ではない ― マイナーが

コインベース経由で回収)

入力は常に UTXO 全体を消費する ― UTXO を「半分だけ」 使うことはできない。 1 BTC を払いたいが手元の唯一の UTXO が 1.2 BTC なら、 トランザクションは 1.2 BTC 全体を消費し、 1.0 BTC の出力を受取人に作り、 0.199 BTC の出力を自分のウォレットに「お釣り」 として作る。 どの出力にも割り当てられなかった残りの 0.001 BTC が、 このトランザクションを取り込んだマイナーが受け取るトランザクション手数料となる (5 章)。

普段目にする単位は BTC だが、 内部的にはsatoshiで数えている: 1 BTC = 100,000,000 satoshi。 送れる最小単位は 1 satoshi で、 システム作者の名前から取られている。

秘密鍵

秘密のランダムな数値

公開鍵

秘密鍵から導出

アドレス

1A1zP1... のような短い文字列

誰でも

このアドレスに送れる

このアドレスに施錠された

コインを動かすときの

署名に使う

支配権を持つのは秘密鍵だけだ。 失えば、 そのアドレスに施錠されたコインは取り戻せない。 公開鍵アドレスは秘密鍵から一方向の数学で導かれるので、 他人に渡しても安全だ。 デジタル署名は秘密鍵と当該トランザクションからウォレットが生成する一片のデータで、 ネットワーク上の誰もが「その署名がそのアドレスに対して有効」 と検証できる。 秘密鍵そのものを見る必要はない。

ホワイトペーパー Bitcoin: A Peer-to-Peer Electronic Cash System では § 2 “Transactions” でこの仕組みを扱っている。

4. ブロックチェーン: 取引の永久記録

ピアツーピアネットワーク上に放たれたトランザクションは、 まだ確定しない。 おおよそ同じ瞬間に正式化される一群のトランザクションをまとめた塊 ― ブロック ― にバッチ化される。 ブロックは平均で約 10 分に 1 個生成される。

各ブロックには、 そのブロック自身の指紋となる短い数値、 ハッシュが含まれる。 ハッシュはハッシュ関数という数学的処理によって計算される ― 任意の入力データ (ブロック、 文章、 ファイル、 なんでも) を固定長の短い数値に変換する関数だ。 ビットコインが使うハッシュ関数 (SHA-256) には 2 つの重要な性質がある:

  • 入力を 1 文字でも変えると、 まったく違うハッシュになる。
  • ハッシュから逆算して入力を推測することはできない。

入力: 'The Times 03/Jan/2009 Chancellor on brink of second bailout for banks'

SHA-256

e8b...4f2 (例示 ― 実際は特定の 256 ビット数値)

入力: 'The Times 03/Jan/2009 Chancellor on brink of second bailout for bank'

(1 文字削除)

SHA-256

91a...7c5 (例示 ― 上とまったく別物)

さらに各新規ブロックには、 1 つ前のブロックのハッシュも自分自身の中に含まれている。 このリンクがチェーンを作る: すべてのブロックが、 1 つ前のブロックを指し続け、 最初のブロックまで遡れる。

ブロック 0

ジェネシス

hash: 000...26f

ブロック 1

previous-hash: 000...26f

own hash: 000...d24

ブロック 2

previous-hash: 000...d24

own hash: 000...8c7

ブロック 3

previous-hash: 000...8c7

own hash: 000...b13

... 高さ 90 万を超える現在まで続く

最初のブロックを**ジェネシスブロック** (またはブロック 0) と呼ぶ。 特殊な存在で、 マイニングされたのではなく、 サトシによってソースコードに直接ハードコードされた ― 詳細な機構はジェネシスブロックハードコード分析が v0.1 ソースを読み解いている。 ブロック 0 から数えた各ブロックの位置をブロック高と呼ぶ: ジェネシスは高さ 0、 次のブロックは高さ 1、 という具合だ。

ジェネシスから最新のブロックまで連なる全体構造がブロックチェーンだ。 ノードを動かしている全員が、 同じものを 1 部ずつ持っている。

5. マイニング: 新規発行と検証

マイニングそのものに入る前に、 似た響きだが別物の 3 つの用語を整理する:

  • ノード はビットコインソフトを動かしてチェーンを検証する ― それが仕事
  • マイナー はノードのうち、 さらに 計算力を投入して次のブロック生成競争に参加するもの
  • ウォレット は鍵を管理してトランザクションを組み立てるソフトウェア。 ノードの中に同居していても、 ノードと別プロセスで隣接していても、 スマートフォン上にフルノード無しで存在していてもよい

マイニングは「ノードであること」 の上に純粋に追加される活動だ。 ウォレットはさらに別の関心事で、 スマートフォンウォレットは普通、 他人のノードに SPV (1 章) で問い合わせている。 Bitcoin Core はこれら 3 つの役割をすべて 1 つのプログラムに同梱しているため、 一般にこれらの用語が混同される最大の原因になっている。

ノード ― チェーンを検証

マイナー ― 次ブロックの生成競争も行う

ASIC 駆動のマイニングリグ

Bitcoin Core

ノード + ウォレット、 マイニングなし

純粋な検証者

ノードのみ

スマートフォンウォレット

SPV、 フルノードなし

ハードウェアウォレット

鍵のみ

では、 次のブロックに何のトランザクションを入れるかは誰が決め、 新しいビットコインはどこから来るのか?

答えはマイニングだ。 作業をやる気のあるノードは誰でもマイナーになれる。 マイナーは待機中のトランザクションを集め、 候補ブロックにまとめ、 そしてパズルを解く競争を始める。 パズルとはこうだ: 「ブロックに数値をひとつ入れて、 ブロックのハッシュが先頭にゼロを規定数並べるようにせよ」。 マイナーが変え続けるその数値をナンスと呼ぶ。 ハッシュ関数 (4 章) は予測不能な出力を返すので、 当たりのナンスを見つける方法は試し続けるしかない。 何百万回も試すこのプロセスをプルーフ・オブ・ワーク (略して PoW) と呼ぶ ― もともとは 1997 年にアダム・バックが発表した Hashcash でスパム対策として提案された方式を、 ビットコインが中核の仕組みとして再利用している。

ネットワークマイナーネットワークマイナー待機中のトランザクションを集めるコインベーストランザクションを追加 (新規 BTC を発行)ナンス 0 を試す ... ブロックハッシュ計算 ... 不一致ナンス 1 を試す ... ブロックハッシュ計算 ... 不一致ナンス 2 を試す ... ブロックハッシュ計算 ... 不一致... (数百万回試行) ...ナンス 2083236893 を試す ... ハッシュ先頭ゼロが規定数到達 ― 当たり新ブロックをブロードキャスト全ノードが検証して取り込む

何個のゼロが必要かを難易度と呼ぶ。 ネットワークは 2,016 ブロックごと (約 2 週間ごと) に難易度を調整して、 マイナーがどれだけ計算力をつぎ込もうとも、 当たりのブロックが平均で約 10 分に 1 個見つかるようにする。

勝ったマイナーは、 ブロックの先頭に特殊なトランザクションを 1 つ入れる権利を得る。 過去の出力を参照しない唯一のトランザクション (過去のコインを一切消費しない) ― コインベーストランザクション だ。 このトランザクションが生み出す出力は、 新しいビットコインがこの世に生まれる唯一の経路だ。 生み出される額をブロック報酬と呼ぶ。 さらにマイナーは、 取り込んだ通常トランザクションに添えられたトランザクション手数料もすべて集める。 この 2 つを合わせたものがマイナー報酬だ。

コインベース

トランザクション

ブロック報酬

新規発行 BTC

ブロック内の

通常トランザクション

手数料合計

マイナー報酬

= マイナーが持ち帰る額

ブロック報酬は一定ではない。 2009 年 1 月に 50 BTC/ブロックで始まり、 210,000 ブロックごと (約 4 年ごと) に半減する。 このイベントを半減期と呼ぶ。 十分な回数の半減を経るとブロック報酬は 0 satoshi になり、 マイナーはトランザクション手数料のみで報酬を受け取るようになる。 今後発行されるビットコインの総数は、 このスケジュール上のブロック報酬を全部足したものになり、 計算するとほぼちょうど 2,100 万 BTC に収まる。 このスケジュールの帰結はマイニング報酬枯渇分析で深く扱われている。

2009 - 2012

50 BTC

2012 - 2016

25 BTC

2016 - 2020

12.5 BTC

2020 - 2024

6.25 BTC

2024 - 2028

3.125 BTC

... 半減が続く

~2140 年: 報酬は事実上 0

なぜほとんどのノードは実際にはマイニングしないのか。 「ノードは誰でもマイナーになれる」 はプロトコル上の真理だが、 実態はほとんどのノードがマイニングしない。 現代のマイニングは産業規模の ASIC ハードウェア (application-specific integrated circuit の略、 「特定用途向け集積回路」 ― ビットコインのハッシュ関数しか計算しない代わりに、 1 回の計算に必要な電力が汎用コンピューターよりはるかに少ないチップ) を必要とする。 産業 ASIC 時代は 2013 年に始まった ― サトシ 2011 年消失の である。 したがってサトシ時代の「1 CPU = 1 票」 像は元の設計意図であり、 今日の運用現実ではない。 この乖離の全容 (および現状がサトシ設計と異なる他 3 軸) は対となるエントリーサトシの設計意図とビットコインの現状の乖離で扱う。

6. メモリープール: 待合室

トランザクションを送信しても、 即座にブロックに入るわけではない。 まずピアツーピアネットワークを伝わり、 各ノードのメモリープール ― まだブロックに取り込まれていないトランザクションの局所的な待合室 ― に着く。 マイナーは候補ブロックを組み立てるときメモリープールから取捨選択し、 手数料が高いものから優先的に取り込む傾向がある (手数料はそのまま自分の収入になるからだ)。

ブロードキャスト

gossip

gossip

あなたのウォレット

ノード

ノード

ノード

メモリープール

保留中

メモリープール

保留中

マイナーは高手数料を優先

次のブロック

トランザクション確認済み

自分のトランザクションがブロックに入ると、 これで確認が 1 個になる。 次のブロック ― 自分のブロックの上に積まれるブロック ― が確認 2 個目になる。 上に 1 ブロック積まれるごとに確認が 1 増え、 トランザクションを巻き戻すのが指数関数的に困難になる。 「事実上不変」 と見なせる目安として、 古くから 6 確認が使われてきた。

7. 合意と改竄防止

誰でもコンピューター 1 台でマイナーになれるのなら、 悪意あるマイナーがトランザクションをでっち上げたり、 あなたのトランザクションを取り消したり、 自分に 100 万 BTC を発行したりするのを、 何が止めているのか?

連動する 2 つの設計思想がある:

1. 全ノードによる検証。 新ブロックがブロードキャストされると、 各ノードは独立にチェックする: ブロック内の各トランザクションの署名は有効か? 消費されるコインは本当に未使用の UTXO か (二重に使われていないか)? ブロックハッシュはプルーフ・オブ・ワークを満たしているか? コインベース報酬はスケジュール通りか? どれかひとつでも不合格なら、 ノードはそのブロックを拒否する。 無効なトランザクションを混ぜようとしたマイナーは、 単に「ネットワークの他の全員が受け入れないブロック」 を作って終わる。

2. 最長チェーンが勝つ。 ときどき、 2 人のマイナーがほぼ同時に正当なブロックを見つけることがある。 ネットワークには一時的に 2 本の競合チェーンが現れる。 次のブロックがどちらかの上に積まれて勝負を決める ― 次のブロックが先に積まれた方が最長チェーン (厳密にはプルーフ・オブ・ワークが最も累積したチェーン) となり、 取り残されたブロックは捨てられる。 すべての正直なノードは常に最長のチェーンを採用する。

この 2 番目のルールが、 改竄を構造的に絶望的にする。 攻撃者が 100 ブロック前のブロックの中のトランザクションを書き換えたいとしよう ― 例えば自分が行った支払いを取り消したい、 とか。 そのトランザクションを書き換えれば、 ブロックのハッシュが変わる。 ハッシュが変われば次のブロックの「previous-hash」 リンクが壊れる。 そうなれば、 その次のブロックも、 そのまた次も、 先端まで全部壊れる。 攻撃者は 100 ブロック分のプルーフ・オブ・ワークを最初からやり直すことになる ― しかもその間、 世界中の正直なマイナーは本物のチェーンを延ばし続けている。 攻撃者は、 正直なネットワーク全体の合計を上回る計算力を握っていない限り、 永遠に追いつけない。

本物のチェーン

... B98 - B99 - B100 - B101 - B102 - B103 ...

正直なマイナーが

延ばし続ける

攻撃者の改変チェーン

... B98 - B99 - B100' - B101' ...

単独で全 PoW をやり直す必要

どちらが長い?

本物のチェーンが勝つ

攻撃者の労力は無駄になる

これは二重支払いの防止と同じ仕組みでもある。 悪意あるユーザーが、 同じ UTXO を消費しようとする 2 つの矛盾するトランザクションをブロードキャストしたら、 どちらか 1 つが先にチェーンに入る。 もう 1 つは UTXO がもはや未使用ではないので、 全ノードに拒否される。 信頼ではなく、 数分の競争で決着がつく。

すべてのノードが同一の正規チェーンに同意する状態 ― 中央の調停者なしに、 機械的なルールだけから自然と立ち上がる状態 ― を合意と呼ぶ。

8. ここから何を読むか

ここまでがビットコインの基本的な仕組みだ。 ここから先は、 出てきた用語のひとつひとつをより深く追える: