ビットコインやイーサリアムなどの暗号通貨は分散型台帳を使うため、世界中の匿名参加者で、世界中の価値のやりとりを一緒に記録していく必要があります。
一人(一社) が独断で記録するなら簡単ですが、全員で一つの台帳を記入するからこそブロックチェーンの価値があります。

もちろん、世界中の全ノードで「正しい記録台帳」を一つに決定していく必要があるため、「どんな方法で “これが正しい台帳” と判断するか」をよく考える必要があります。
今回ではブロックチェーンの台帳記入方法の代表である Proof of Work (PoW) の概要に加え、
- 実際にどんな計算をしているか
- それにより、ブロックチェーンで何が可能になるか
を技術的詳細を抜きにして、正確に把握してもらえるように書いていきます。
Proof of Work (PoW) の概要
Proof of Work こそ、ブロックチェーンの元祖であるビットコインで採用された合意形成プロセスです。一般的には最も基本となるコンセンサス・アルゴリズムだと考えられています。
Proof of Workを採用している主な通貨は、
- Bitcoin (BTC)
- Bitcoin Cash (BCH)
- Ethereum (ETH) ※PoSへ移行予定
- Ethereum Classic (ETC)
- Litecoin (LTC)
- Monero (XMR)
- Zcash (ZEC)
- DASH (DASH)
- MonaCoin (MONA)
などがあります。古くから存在したり、安定した通貨にはPoWを採用するものが多いです。
Proof of Workの元祖 Hashcash
Proof of Workはブロックチェーンやビットコインの文脈で初めて登場する概念ではなく、DoS攻撃やスパムを防ぐための古くからあるコンセプトです。ビットコインの誕生である Satoshi論文にも “Proof-of-Work” の章で、 最初の PoW コンセプトを採用した Hashcash に簡単に触れられています。
1997年に、メールのスパム攻撃を阻止するため、Proof of Work を採用した Hashcash が提案されます。これは無差別のスパム攻撃を予防するため、「送信者がメッセージを送る前に、ほどよいCPUパワーを消費しなければならない」というシステムです。「CPUを消費した」ことを証明するスタンプがメールのヘッダーに追加された場合のみ、メールを問題なく送信することができます。メールの送信ごとに Work (仕事) を求めるのです。

メールにおける Proof of Work の略図。送信者は “Solve” で計算リソースを消費する
一通ごとにCPUを消費することはスパマーにとって多大なコストになるため、彼らはこの制度では攻撃を控えるはずです。従って、Proof of Work (仕事の証明) は「送信者はスパマーではない」という証明となります。
「メールを本当に送信したいのなら、送信者は適度な CPU の消費も厭わないはず」という仮定のもと成立しています。
PoW では何を計算しているのか?ハッシュ値、Nonce (ノンス) などの解説
最初に登場したブロックチェーンであるビットコインでは、「台帳記録の正確性を、いかにして一つに決定するか」という合意形成プロセスに Proof of Work のコンセプトを採用することにしました。
これはビットコインのブロックに書かれた情報の一部の図です。
世界中に散らばるマイナーは、ブロードキャストされた取引履歴をいくつか束ねてブロックに書き込み、チェーンの次のブロックとしてそれを追加しようとします。正当なブロックチェーンは世界に一つであるため、次のブロックを繋げる権利はどのマイナーにあるのか、競争を行います。 (次のブロックを繋げるのは誰だ?)
しかし簡単にブロックを繋げられるわけではありません。ここからが Proof of Work (仕事の証明) の始まりです。
ブロックに書き込まれる情報の代表的なものには以下があります。(細かな他の要素は除外します。)
- 前のブロック情報のハッシュ値
- ブロックに詰め込んだトランザクション情報
- Nonce (ノンス, Number used once, 使い捨て番号)
ハッシュ値…ある数や文字をハッシュ関数に通してぐちゃぐちゃに出力されたもの。もとの数字が少しでも変わると全く違うハッシュ値が出る。
「もとの数からハッシュ値はすぐ計算できるが、ハッシュ値からもとの数を計算で求めることはほぼ不可能」という性質がある。
例: ポテトをハッシュポテトにするのは非常に簡単だが、ハッシュポテトからポテトにするのは不可能。
まず、ブロックはチェーンとして連続性を持って繋がるため、前のブロックの情報 (のハッシュ値) が入力されている必要があります。前のブロック情報が参照されたブロックしか認められないからこそ、台帳の整合性を破壊する二重支払い (ダブルスペンディング) の危険を回避しているのです。
そして、ブロックに詰め込んだトランザクションの情報はいくつかまとめてブロック内に書き込まれています。
最後の Nonce (ノンス) はスパイスのようなもので、マイナーが勝手に加える数字です。
マイナーはこの3つ情報を混ぜてハッシュ関数に入力し、そのハッシュ値を出力します。そして、そのハッシュ値の数字がネットワークが指定する数字 (target) より低いものが出た場合のみ、ブロック接続の成功となります。
Bitcoinネットワークが「ハッシュ値の最初に 0 が10回続くように調整せよ」と指定している場合は、その条件を満たすまで Nonce を変えてひたすらハッシュ値の出力を繰り返します。ブロックに書き込まれる情報では Nonce のみが勝手に変更してもよい数字ですので、とにかく Nonce を微調整して正解が見つかるまで試行を繰り返します。
一定数の 0 のことを ”Difficulty, (難易度)” と呼びます。例えば、最初の1桁だけが 0 であるハッシュ値を求めるより、最初の10桁が 0 が続くハッシュ値を導くほうが遥かにマイナーにとって難問です。この Difficulty は、1つのブロックの生成が約10分になるように2016ブロック生成ごとに調整されます。当然、マイナーの計算性能は高まってくるので難易度は徐々に高くなることが多いです。
この Nonce の見つけ方に効率的な方法は存在せず、マイナーは条件を満たす Nonce の発見のために総当たりでハッシュ値を変更していく必要があります。
ハッシュポテトからポテトに戻すことが不可能なように、ハッシュ関数の性質上、正解のハッシュ値から Nonce を逆算することも現在の数学では不可能です。
つまり、一瞬で何通りもの Nonce の試行錯誤ができるコンピューターが有利です。
例えば51万2345番目のブロックを繋げたい場合、51万2344番目のブロック情報に加えて取引履歴を取りまとめ、スパイスである Nonce を自由に付け加え試行錯誤、指定された 0 が続くハッシュ値を見つければ採掘成功、それを全ネットワークに知らせます。
他のノードがそれを認めれば、ネットワーク上で正式な 51万2345番目のブロック生成者と認められ、暗号通貨 (Bitcoinなら BTC) の報酬を受け取ることができます。
当然、普通は他のマイナーに先に発見される可能性の方が高いため、大抵は受信した51万2345番目のブロックを参考にしてすぐに 51万2346番目の Nonce の探索に移ります。
前のブロック情報が組み込まれたハッシュ値により接続するので、時間的な連続性が確保されます。これにより、並行して行われた決済 (二重支払い) の矛盾を防止しています。
以上が代表的なブロックチェーンの合意形成プロセス、Proof of Work (仕事の証明) の概要です。ビットコイン以外のPoWブロックチェーンは少々データ構造が違うことに注意してください。
ブロックのフォークにどう対処するか?
ブロックの生成に成功して報酬をもらえるのは一つのマイナーのみですが、たまに同じ場所に2つ以上のブロックが繋がれ、チェーンが分かれてしまうこともあります。2つのマイナーが微妙な時間差で、それぞれ条件を満たす Nonce を見つけることもあるからです。
しかし2つに取引台帳が別れれば決済に矛盾が生じるため、当然たった一つに決定されなければなりません。
Proof of Work はその場合、「最も仕事 (計算パワー) が注入されたチェーンを正当とみなす」というルールに従います。
「最も仕事 (計算パワー) が注入されたチェーンを正当とみなす」ということは、「最も長いチェーンを正当とみなす」と同義です。各ノードは、自分が正しいと思う方のチェーンを記録すればよいし、マイナーは正しいと思うチェーンに沿って Nonce の発見を続ければよいわけです。
※2つのマイナーからそれぞれ同じ番号を持つ異なるブロックが送信された場合、基本的には以下の順番でチェーンの生成は進みます。
- 2つのマイナーがそれぞれ、自分のブロックの正当性をネットワーク全体に知らせる
- 他のマイナーは最初に自分が受信したブロックを正当と見做し、それを前提として次のブロックの採掘に移る。多くの場合はこれで問題ない。
- しかしもう一方が最長となった場合に備え、2番目に到着したブロック情報も保存しておく
- 仮にもう一方が最長になれば、今まで記録していたチェーンを廃棄し、乗り換えて記録を続ける
あるブロックの採掘競争に負けた他のマイナー (ノード) は、悔しさのあまり他人が成功したブロックを承認したくないでしょう。しかし正当に採掘されたものを無視すると、他の大多数の誠実なノードはそれを前提にチェーンを形成していくため自らが乗り遅れることになります。
従って、素直に採掘された新規ブロックを承認し、切り替えて次のブロック作成に移ることが最適解になります。
ブロックチェーンの PoW は、データの改ざんを困難にする
Proof of Work は上記のような「正当なチェーンの決定方法」を採用しますが、この仕組みはブロックチェーンに Immutability (不変性, 改ざん耐性) を与えています。一度ブロックチェーンに取引履歴が書き込まれれば、それは取り消したり、改ざんしたりできないという意味です。
例えば、PoWのブロックチェーンの台帳を書き換えて不正に通貨を取得したり、支払いを取り消そうとする攻撃者を仮定します。(攻撃者は、特定の政治犯の財産を差し押さえたい国家かもしれません。)
しかし全てのブロックは直前のブロック情報を参照し、ハッシュ値を調整しています。従って仮に彼らが過去の任意のブロックを書き換えようとすれば、それ以降の全てのブロックが不正となってしまいます。書き換えたければ、そのブロック以降の全ての PoW をやり直すことが必要になります。
” 過去のブロックを修正するためには、攻撃者は該当ブロックに加え、それ以降の全ブロックのproof-of-workをやり直し、誠実なノードの仕事においつき、追い越さなければなりません。“
Satoshi Nakamoto 4. Proof of Work より引用
「そんなハッシュパワーを持っているのなら誠実に PoW に参加したほうが儲かる」ため、攻撃者の意思を削いでいます。
- ブロック生成をやり直し、誠実なチェーンを追い越すことは大量の計算リソースを投入しない限り、ほぼ不可能
- それをやるなら誠実になった方が儲かる
Proof of Work はこの2点を持って、ブロックチェーンを「改ざんが著しく困難なデータベース」にしています。
上記で記述しているのは全て「無許可でネットワークに参加できるパブリックブロックチェーン」についての話です。許可が必要な、閉じた世界のプライベートブロックチェーンやコンソーシアム型ブロックチェーンでは全く話が変わってきます。
プライベートブロックチェーンやコンソーシアム型ブロックチェーンでは、そもそも PoW など必要ありません。
PoW ブロックチェーンと暗号通貨は切り離せない関係
ビットコインなどの PoW ブロックチェーンでは、世界中から匿名で、いつでもマイナーとしてネットワークに参加できます。誰でも今すぐに取引記録を台帳に記入できるわけです。
もちろんマイニングには Nonce を見つけるための膨大な計算リソースが求められるためボランティアでは困難です。そこで、採掘者に bitcoin (BTC) のインセンティブを与えています。
以下のサイトで任意のブロックをクリックした場合の、取引履歴の一番上がマイナーへの報酬額です。
誰でも参加できるパブリックブロックチェーンにおいては、「誰でも匿名で参加できる」ことは非常に重要です。なぜなら世界中で多くのノード/マイナーが参加し分散化が進めば進むほど、ネットワーク全体のハッシュパワー (計算力) が高まり、攻撃者のコストが高まりセキュリティも向上するからです。
従って、多くのネットワーク参加者を誘い込むため、パブリック・ブロックチェーンでは報酬となる暗号通貨の存在が不可欠です。
もう一歩踏み込んで考えると、もっとマイナーを増やして安定性のあるネットワークにするために、「暗号通貨の価格は堅調に伸びるであろう」と期待してもらうことが必要です。現状は最も堅牢なビットコインでさえ激しいボラティリティを持っているため、まだまだ真に安定した公共の通貨システムになるには時間がかかるかもしれません。
実際、ビットコインの価格が暴落するたびにマイナーが撤退し、全体の計算パワーが弱くなり、攻撃に脆くなっています。
Bitcoinのような Proof of Work を採用するブロックチェーンにとっては、そのコインが ETF等で金融商品として認められ、価格が安定することが非常に重要です。
コメント