Bitcoinの技術面を学ぶにはこれしかないと言われているほどの名著Mastering Bitcoin を今更読んだので、自分の中での復習を兼ねて、ところどころ解説付きでまとめを書いていきます。
元の本ではサラッと流されているところもしっかり解説するつもりでお節介に書いたので初学者の人には分かりやすいかもしれません。
日本語版PDFはここで無料公開されているので翻訳者の方々への感謝を常に感じながら読みました。
無料公開版ということもあって誤字脱字もたまにあったりするので、
しっかり製本されたものが読みたいという方はAmazonで買って読むことをお勧めします。
前回↓
第8章 マイニングとコンセンサス 後半
⑵分散化されたコンセンサス(合意形成)
の続きです。
③独立した新規ブロック検証
②-(c)でも見た通り、正しいnonceを発見し新しいブロックを生成したマイナーは、隣接のノードにそのブロックを送信します。
この時、各ノード新規ブロックの検証をして、不正なものは拒否し、有効とみなしたものだけを他のノードに伝播していきます。
これによって不正なブロックがネットワークを伝播しないようになっています。
この独立したブロック検証の判断基準は以下のようになっています。
- ブロックのデータ構造が構文的に有効であること
- ブロックヘッダハッシュがdifficulty targetよりも小さいこと(proof of workを確認する)
- ブロックのTime Stampがノードが持つ時刻より2時間未来の時刻よりも小さいこと (ノードごとの時刻エラー(時刻違い)のある程度の許容)
- 過去11ブロックのタイムスタンプの中央値よりも未来の値であること
- ブロックサイズが受け入れられる制限内であること(少し前は1MBだったが変更されていく)
- 最初のトランザクション(そして、最初のトランザクションのみ)がcoinbase / generationトランザクションであること
- ブロックに含まれる全てのトランザクションが「①独立したトランザクション検証」で説明したチェックリストを満たすこと
この判断基準に違反しているブロック(例えば、coinbaseトランザクションで自分に送られる額をめっちゃ多くしたもの等)は、拒否され、ブロックチェーンに書き込まれなくなってしまい、proof of workで投入した計算資源・電力が全て無駄になってしまうため、マイナーには不正を行うインセンティブがありません。
この判断基準でそれぞれのノードが独立に検証を行うことが、分散された合意形成を成り立たせている3つ目の要素です。
④独立したブロックチェーンの組み立てと選択
全てのフルノードはそれぞれ独立して「最も多くのProof-of-Workを含むブロックチェーンを真のチェーンだ」として選択します。
これは"ナカモトコンセンサス"と呼ばれます。
これが分散された合意形成を成り立たせる4つ目、最後の要素です。
(a)Bitcoinノードが持つ複数のブロックセット
Bitcoinノードは以下の3種類のブロックセットを持っています。
(1)メインのブロックチェーンにひも付けられたブロック(メインチェーン)
"メインチェーン"はどんなときでも、累積difficultyが最も多くなっているチェーンになっています。同じ長さのチェーンがあり片方の方がより多くのproof of workを持っている場合を除き、ほとんどの状況下ではこれは最も多くのブロックを持っているチェーンになります。
(2)メインのブロックチェーンから枝分かれしたブロック (セカンダリーチェーン)
メインチェーンの既存ブロックに同じ親ブロックを持って繋がった"sibling(兄弟)"ブロックが作られることがあります。
これらのブロックは有効ですがメインチェーンの一部ではありません。これらが保持されているのは、将来これらのチェーンのうちの1つがメインチェーンをdifficultyで上回りsiblingブロック側のチェーン(セカンダリーチェーン)に拡張されていく場合に参照できるようにするためです。
(3)自分が保持しているブロックチェーンに親ブロックがないブロック(orphans)
もし有効なブロックを受け取っても既存のチェーンに親が見つからなかった場合、このブロックは"orphan( 孤児)"とみなされます。
orphanブロックは、親ブロックを受け取るまでこのorphanブロックプールに保持されます。この親をBitcoinネットワークから受け取り既存のチェーンに連結すると、orphanブロックはorphanプ ールからから取り出されてこの親に連結され、チェーンの一部となります。orphanブロックは、通常ほぼ同時に 採掘された2つのブロックを逆順(親より前に子)で受け取ったときに生じるものです。
※無効・不正なブロックは[③独立した新規ブロック検証]で検証条件を満たさなかった時点ですぐに拒否されるためどのチェーンにも含まれません。
(b)Blockchain フォーク
ブロックチェーンはどこに存在するのでしょうか?
これまで見て来た通り、それぞれのノードがブロックチェーンデータを保持しています。
しかしBitcoinノードは世界中に分散しているため、全てのノードが全く同じコピーを保持しているとは限りません。
各ノード単位で見るとただのローカルに保持するデータですので、簡単に改変できますし、同時に生成された複数のブロックがネットワークを伝播した場合、ノードごとに違う最新ブロックになってしまうかもしれません。
そこでBitcoinネットワークには「最も多くのProof-of-Workを持っているブロックチェーンを真のブロックチェーンとする」というルールが存在しています。このブロックのチェーンは最長チェ ーン(the longest chain)または最大累積difficultyチェーン(the greatest cumulative difficulty chain)とも呼ばれています。
全てのBitcoinノードは、チェーンの各ブロックのブロックヘッダに記録されているdifficultyを足し合わせることで、このチェーンを作るために使われたproof of workの総量を計算し、最大のチェーンを選ぶように動くのです。
Bitcoinネットワーク内で複数の異なるブロックチェーンが生まれてしまうことをフォーク(fork)と言いますが、全てのBitcoinノードが最大累積difficultyチェーンを選んでいる限り、グローバルなBitcoinネットワークは結果的に矛盾のない一意な状態に収束します。
具体例で、どのようにBitcoinネットワークのブロックチェーンが一意に収束していくのかを説明していきます。
現在のBitcoinネットワークの状態が以下の画像のようになっているとします。
画像左下の青色のブロックが最新ブロックであり、青色の線は世界中の全てのBitcoinノードがこの最新ブロックチェーンをメインチェーンとして保持していることを示しています。(実際のBitcoinネットワークのトポロジー(ネットワーク構成)は地理的に組織されているわけではなく、むしろBitcoinノード間のメッシュネットワークとして構成されています。ネットワーク的に近くても地理的にはとても離れているかもしれません。)
"フォーク(fork)”は競争している2つの候補ブロックがあればいつでも生じる可能性があり、通常2人のマイナーがほぼ同時刻にproof-of-workの解を見つけると起こります。
ある時点で、カナダのマイナー(赤色)とオーストラリアのマイナー(緑色)が同時にproof-of-workの解を見つけ、ブロックを生成して、隣接ノードにそのブロックを伝播したとします。
すると以下の画像のように、それぞれのブロックが伝播していきます。(どちらも正当なブロックなので届いたノードに受け入れられます)
赤色と緑色のブロックがそれぞれ伝播して行った結果、(地図上では)右側が緑色のブロックを取り込んだノード、左側が赤色のブロックを取り込んだノードとなり、Bitcoinネットワーク全体でブロックチェーンのフォークが発生してしまいました。
この瞬間から赤色のブロックを取り込んだノード(正確にはそのうちのマイナー)は、赤色のブロックを親ブロックとした新たなブロックのマイニングを始めます。
一方で、緑色のブロックを取り込んだノードは、緑色のブロックを親とした新規ブロックのマイニングを始めます。
ここで仮に、緑色のブロックを取り込んでいたあるマイナーが、新しいブロック(ピンク色)のマイニングに成功したとします。
すると、このピンク色のブロックが全てのノードに伝播されていきます。(以下の画像参照)
前のラウンドで緑色のブロックを取り込んでいたBitcoinノードは、単にさらに1個ブロックをブロックチェーンに拡張していくだけです。
しかし、赤色のブロックを取り込んでいたBitcoinノードは、「青-緑-ピンクのブロックチェーン」と、「青- 赤のブロックチェーン」の2つのブロックチェーンを見ることになります。
「青-緑-ピンクのブロックチェーン」は「青- 赤のブロックチェーン」よりもより多くの累積difficultyを持っているますので、全てのノードはこちらのブロックチェーンをメインチェーンとして採用します。
もし既に一度フォークした状態で、2つのブロックがほぼ同時にそれぞれのフォークしたグループの"両方の端"で見つかれば、理論的にはフォークが2ブロック分拡張することは可能です。しかし、これが生じる可能性はとても低いので、1ブロックのフォークは毎週起こりえ ますが、2ブロックのフォークは極めて稀です。
10分間というBitcoinのブロック間隔は、承認までにかかる時間(トランザクションの確定)とフォークが生じる確率の間の妥協点なのです。ブロック間隔をより短くすればトランザクションをより早く確定できますが、 ブロックチェーンのフォークがより頻繁に起こってしまうことになります。
一方、ブロック間隔を長くすれば フォークの数は減りますが、トランザクションの確定に時間がかかることになります。
⑶マイニング競争
マイナー達は「ブロック生成の報酬」を得るために、誰よりも先にブロックを生成するための競争をしています。
マイナーの損益は、「(使用する電力 * 電力単価) - (coinbase報酬 + トランザクション手数料)」でしたのが、coinbase報酬は決まっていますし、トランザクション手数料を無理に高くするとそれに当てはまるトランザクションが集められず、そもそもブロックの生成ができません。
マイナーが競争に勝って多くの利益を上げるため考えられる施策は
・電力単価を下げる
・電力1kW/hあたりのSHA256計算の効率を上げる
です。
電力単価の安い国がマイニングでは有利と言われているのはこのためです。
マイナーはハッシュ計算の効率を求めて、これまでCPUマイニングから、 GPUマイニングとフィールドプログラマブルゲートアレイ(FPGA)マイニングを経て、マイニング目的に特化するようにSHA256関数を直接シリコンチップに記述したものであるASIC(application-specific integrated circuits)とその方法を進化させてきました。
その結果として以下のグラフのようにbitcoinネットワークの総ハッシュ計算パワーは指数関数的に上昇しており、difficultyもそれに合わせて上昇しています。
①Extra nonceの利用
ここで振り返っておくとマイニングとは「SHA256に通した時にdifficultyよりも小さい値になるブロックヘッダを(nonceの値を変化させることで)求める」行為でした。
また、ブロックヘッダの構造で見た通り、nonceは4byteのデータフィールドでしたね。
difficultyが低い(difficulty bitsの値は大きい)間は、マイナーはnonceの4byteに格納できる数値パターンを試しているうちに、ブロックヘッダのハッシュがdifficultyよりも小さくなる値にたどり着いていました。
しかし、difficultyが大きくなっていくにつれて、マイナーは正解に辿り着くことなくnonceの4億通り(原本では4億通りと書いてありましたが、4byte = 32bitなので2^32 = 42億通りじゃないのかな…)を全てを使い切ってしまうことが頻繁に起きるようになっていました。
これはマイニング経過時間を把握するためのブロックのTime Stampを更新することで簡単に解決されました。Time Stampはブロックヘッダの一部であるため、Time Stampが変わることでマイナーはnonceの値を繰り返し使い、異なるハッシュ値を得ることができるのです。
しかし、一度マイニングハードウェアの処理速度が4GH/秒(ここも42GH/秒では…)を超えると、この方法は難しくなってきました。 というのは、nonceが1秒以内使い尽くされてしまい、TimeStampが変化する前に試せるnonceパターンが尽きてしまうようになったからです。
ASICマイニングが始まるとハッシュレート はTH/秒を超え、マイニングソフトウェアは有効なブロックを見つけるためにより広いnonceスペースが必要 になってきました。
そこで使用されているのが、coinbase トランザクションのCoinbase Dataフィールドです。
coinbase トランザクションはブロックヘッダの一部ではありませんが、ブロックヘッダには全てのトランザクションから導かれたMerkle Rootという値があり、coinbase トランザクションを変更することで、このMerkle Rootが変化し、結果的に異なったパターンのブロックヘッダハッシュが試せるのです。
マイナーたちはextra nonceと呼ばれる値を、Coinbase Dataフィールドに入れこみ、現在(2016年当時)では8byteのextra nonceと"標準"の4byte nonceを使って、マイニングをしています。
Coinbase Dataフィールドは2byteから100byteまで拡張でき、さらにそれぞれにTime Stampの1秒ごとの変化を取り入れることが可能なので、マイナー達はまだまだマイニングマシンの計算能力を向上させても、さらなる効率が得られるという状況です。
②マイニングプール
この激しい競争環境の中では、 一人でマイニングしている個人のマイナー(ソロマイナーと呼ばれています)は勝ち目がありません。
なので多くのマイナーはマイニングプールを作って協力するようになっており、マイニングプールでは個々のマイナーの ハッシングパワーを貯め、報酬を数千人の参加者と分けるということをしています。マイニングプールに参加 することで、マイナーは総報酬の小さな一部だけを得ることになりますが、毎日平均的に報酬を得ることがで きるようになり、不確実性を減らすことができます。
マイニングプールの仕組みを説明していきます。
(a)マイニングプールの構造
マイニングプールの構造は以下の画像のようになっています。
マイニングプールは全てのマイナーに対して公開されており、誰でも参加することができるもので、 Stratum (STM) や GetBlockTemplate (GBT) のような特別なプールマイニングプロトコル(緑の線)を通して数十万人ものマイナーが束ねられています。
個々のマイナーはマイニングプールにアカウントを作成した後、自分のマイニング機器をプールサーバに接続するように設定します。マイニングハードウェアはマイニングの最中このプールサーバに接続されたままになっており、他のマイナーとマイニング結果を同期しています。
(b)報酬の分配
マイニングプールに参加しているマイナーはブロックを採掘した結果を共有し、プールに参加している誰かがマイニングに成功すると、そこで得られた報酬を分配します。
採掘に成功したブロックの報酬は、まずプールサーバのBitcoinアドレスに支払われ、その後、報酬の分配総額がある閾値に達したら、プールサーバはそれぞれのマイナーのBitcoinアドレスに支払いをします。大抵の場合、プールサーバは報酬の一定パーセントを手数料として徴収しています。
どのようにしてマイニングプールは個々のマイナーの寄与度を測定して、報酬を配っているのでしょうか?
マイニングプールは、Bitcoinネットワーク全体のDifficulty(ブロック生成をするために解かなければならないdifficulty)より低いdifficulty target(difficulty bitsの値でいうと大きい)をマイニングプール内に設定します。(Bitcoinネットワークのdifficultyの1000分の1以下のdifficultyの場合が多い)(段階的に設定した方が良さそうだけど、そうしている場合もあるのかな?)
そして個々のプールマイナーは、この「プールに設定された比較的簡単なdifficulty」を解くことを目指して、ハッシュ計算を行います。
そうしているうちに、偶然誰かがより難しいBitcoinネットワークのdifficultyを解くnonceを見つけた時に、このプールがブロック生成報酬を得られるのです。
そして、「プールに設定されたdifficulty」を達成した(回数を見てる?)ことがそのマイナーがnonceを見つける努力をしていた証明となり、分配報酬が増えるというロジックになっています。
このように低い目標を設定することによって、プールに参加している「あまり計算能力を持たないマイナー」にも、ハッシュ計算をするインセンティブを与えられるようになっています。
(c)Managed Pool
上記で説明したような通常の「プールサーバが存在し、そこで手数料が発生する」マイニングプールをmanaged poolと言います。
ここのマイナーからするとmanaged poolは手数料が発生するというデメリットがありますが、大きなメリットもあります。
実はmanaged poolのプールサーバは、特別なソフトウェアやプールマイナーの活動を調整するプールマイニングプロトコルを動作させていると同時に、フルBitcoinノードとコネクションを張り、ブロックチェーンデータベースの完全なコピーに直接アクセスできるようになっています。
その上で個々のプールマイナーに対して、次に生成するべきブロックの候補ブロックを生成し、そのブロックヘッダデータだけを送信してくれるのです。
これによって個々のマイナーは、フルノードを動作させるための数百GBを超える容量を用意することなく、ハッシュ計算のためだけにリソースを投入できるようになっています。
個々のマイナーは与えられたブロックヘッダから、それをハッシュに通した時にプールに設定されたdifficulty以下になるようなnonceをひたすら計算し、成功した結果を全てプールサーバに返しているのです。
(d)P2Pool
managed poolではプールオペレータ(プールサーバの管理者)が報酬の分配でイカサマをする可能性があります。
また、プールサーバが計算するべきブロックヘッダを個々のマイナーに与える構造になっているので、プールオペレータが51%攻撃(後述するコンセンサス攻撃参照)等のための計算をさせるためのブロックヘッダを個々のマイナーに送りつけるかもしれません。
さらに、中央化されたプールサーバが単一障害点(SPOF)になることがあります。もしDOS攻撃でプールサーバがダウンしたり遅延したりした場合、プールマイナーは採掘ができません。
このような問題を解決するのがP2Poolという分散化されたマイニングプールです。
P2Poolは、
1. 個々のノードが新規トランザクションを集め、生成したいBitcoinネットワークの候補ブロックのブロックヘッダを構築します
2. マイニングプール内でシェアチェーンというBitcoinネットワークよりも易しいdifficultyを持ち、1のブロックヘッダのブロックを何度も生成するブロックチェーンを作ります
3. 個々のマイナーがシェアチェーンに設定された易しいdifficultyを解くためにハッシュ計算をひたすらします。
4. 易しいdifficultyを解いたマイナーは、シェアチェーンのブロック生成権を得て、シェアチェーンのブロックを次々に生成していきます。
5. どこかのタイミングであるマイナーが偶然Bitcoinネットワークのdifficultyを解いたとします。
6. すぐに5の結果ブロックヘッダをBitcoinネットワークに送信し、ブロック生成報酬を受け取ります。
7. その時点でシェアチェーンのブロック生成は終わります
8. そのシェアチェーンに繋がっているブロック全てが、ここのノードがハッシュ計算をしていた証拠になるので、それに基づいて報酬が分配されます
というような仕組みになっています。
しかし、1からも分かる通り、このP2Poolは全ての個々のマイナーが同時にフルブロックチェーンデータを保持するフルノードでなくてはならないという欠点もあります。
また、シェアチェーンの全体の計算能力は小さいものなため、このブロックチェーンがコンセンサス攻撃(後述)をされてしまう可能性も孕んでいます。
⑷コンセンサス攻撃
コンセンサス攻撃とは、「Bitcoinネットワーク全体の計算量の大部分を占める大きなハッシュパワーを使ったBitcoinへの攻撃」です。
コンセンサス攻撃のうちの1つとして”51%攻撃”というものがあります。
“51%攻撃”は有名で、これによってBitcoinが「改ざんされてしまう」とだけ捉えられていることが多いと思うので、まず初めにコンセンサス攻撃でできること・できないことをまとめておきます。
コンセンサス攻撃は将来の合意形成に影響を与えることができるだけで、過去に対してはせいぜい少し前(6~10ブロック前)に影響を与えられるくらいです。
また、コンセンサス攻撃は秘密鍵や署名アルゴリズム(ECDSA)のセキュリティに全く関係がありません。
このことから、コンセンサス攻撃はbitcoinを盗むことも、署名なしにbitcoinを使うことも、bitcoinの支払先を書き換えることもできません。
コンセンサス攻撃は単に直近のブロックに影響を与えたり、将来のブロック生成に対してDOS攻撃による破壊を引き起こすだけなのです。
では、”51%攻撃”を例に、コンセンサス攻撃がどのように起こるのかを見ていきます。
Bitcoinネットワーク全体の計算能力の51%以上の計算能力を持つ主体が存在したとします。
(複数のマイニングプールが結託したことにしましょう)
このマイニングプールはどんな不正ができるでしょうか?
Bitcoinは「最も長いチェーンが真のブロックチェーンになる」というルールに則っているのでした。
正常なBitcoinは「自己の利益に対して正直に行動するマイナーが大多数いる 」という状態です。
仮に過去のブロックチェーンを改ざんしようと「ある過去の時点からブロックを改ざんしたチェーンをフォーク」したとすると、とにかくハッシュ計算をしまくって現在の真のブロックチェーンの長さを追い越さなければなりません。
正常なBitcoinネットワークの状態では「不正をしようとしている自身のハッシュパワーによるブロック生成速度」が「正常に動いている大多数のノードのハッシュパワーによるブロック生成速度」に到底追いつけないので、これは不可能です。
しかし、不正をしようとしているノード集団のハッシュパワーがその他のハッシュパワーよりも高い(全体の51%以上のハッシュパワーの)場合は、「不正なチェーンのブロック生成速度」が「正常なチェーンのブロック生成速度」よりも早いので、理論的には「いつかはチェーンの長さを追い越せる」ことになります。
(正確には、マイニングは「たまたま正解ナンスを見つけることもある」確率的な行為なので、51%以上を必ず持っていなくても運良くマイニングに数回すぐに成功し、正常なチェーンを追い越すことができることもあります。そのため、30%以上のハッシュパワーを持っているだけでも51%攻撃が可能だという調査もあります。)
ですが、これは現実的には「約6~10ブロック前からのフォーク」つまり「少し過去の改変」程度しかできないと言われています。
(これは恐らく過去のブロックになるほどマイニングの計算量が大きくなるので、「10ブロック以上のブロック分追いつくまでの時間、ハッシュパワーを不正に投入するコスト」が大きすぎて「そのハッシュパワーで普通にマイニングした方がいい」ということになるからではないでしょうか)
(各ノードの独立したブロック検証の基準に、「過去11ブロックのタイムスタンプの中央値よりも未来の値であること」というのがあるから過去6ブロック以降からしかブロック生成しても各ノードに受け入れられないという理由かも)
では、その「少し過去の改変」を不正ノード集団が行うとしましょう。
不正ノード集団が少し過去からチェーンを分岐させ、正当なチェーンの長さを追い越すだけのブロック数を生成して行きます。
このブロックはそれぞれ、Bitcoinネットワークに伝搬され、各ノードに取り込まれることでBitcoinネットワーク上のチェーンとなり、最も長い(多くのPoWを持っている)ためにメインのチェーンになります。
しかし、その時、「bitcoinを盗む = 他人のUTXOを正当なデジタル署名なしに自分に送信するトランザクションを作る」「bitcoinの支払先を変える = 他人のトランザクションの中身を書き換える」などのデータがブロックに含まれていた場合、全てのノードがトランザクション・ブロックの検証の段階で、その不正に気づくことができ、それらの不正なブロックを自身のブロックチェーンに受け入れることなく拒絶します。
そのため、このような改ざんは不可能です。
この理由は、データ上の整合性を保った状態でトランザクションの改ざんのような不正をするためには、「他人のBitcoinアドレスや公開鍵から秘密鍵を求める」必要がありますが、それは不可能だからです。
秘密鍵の生成やデジタル署名に使われていたハッシュ関数(ECDSA)は現在のコンピュータに対しては不可逆関数であり、解くことはできないので、Bitcoinネットワークの計算量の大多数を持っていることとはなんの関係もないのです。
もちろん、内輪のノードだけでそれらの不正なブロックを承認し、チェーンを伸ばして行くことはできますが、その場合は、Bitcoinネットワークの中に2つのことなる真のチェーンが存在することになり、別のチェーン・通貨となってしまいます。それはあくまで内輪通貨であり、対外的な価値を失ってしまうので、なんの意味もありませんね。
では、コンセンサス攻撃でできる攻撃は何があるでしょうか?
現在判明しているメジャーなものは
・二重支払い(ダブルスペンド)
・DOS攻撃
・マイニング報酬の独占
があります。
(a)二重払い(ダブルスペンド)
二重払いで行われる不正は
「少し過去の'自分(もしくは仲間)が他人にbitcoinを送ったトランザクション'を書き換えることでなかったことにする」ことです。
これは例えば、
1. 不正主体のメンバーAが車屋でフェラーリをbitcoinで買って、フェラーリを受け取る
2. その瞬間に不正主体のリーダーBがコンセンサス攻撃を始め、1の送金トランザクションに使ったトランザクションが含まれていない(もしくは書き換えたトランザクションを含む)ブロックを1の送金トランザクションが書き込まれているブロックの前からフォークさせる
3. フォークさせたチェーンを伸ばしていく
4. 伸ばした不正チェーンが真のチェーンとなり、Aのbitcoinは車屋に送金されていないことになる
5. Aはフェラーリがタダで手に入ったことになる
というように行われます。
この種類の攻撃を防ぐために、大きな金額の商品を売る商人は、購入者に商品を渡す前に少なくともそのブロックの上に6個のブロックが積み上がるのを待たなければいけません。block depthが深くなればなるほど、51%攻撃による改ざんが難しくなるからです。
または、エスクローマルチシグアカウント*を使う場合も、このエスクローアカウントに入金されたトランザクションが一定のblock depthを持つまで待たなければいけません。
しかし、この欠点によってもし仮に購入者が24時間(上に144個のブロックが積み上がる)待たなければいけないとしても、高い商品に対しては、bitcoinでの支払いが便利であり効率的です。
※商品取引において、その取引の仲介者としてエスクローエージェントを置くことで取引に不正がないようにする仕組みをエスクローという。Bitcoinのマルチシグを使うと以下の図のようにシンプルにエスクローが可能(参考文献[1]参照)
(b)DOS攻撃
大きな割合のハッシュパワーを持つ主体は、特定のBitcoin参加者(特定のBitcoinアドレス)に対するサービスを拒否するようにすることができます。
マイニングパワーの大多数を占める攻撃者は単に特定のトランザクションを無視することができます。もし他のマイナーによって採掘されたブロックがこれらのトランザクションを含んでいた場合、攻撃者はわざとフォークをしてこのブロックを再採掘することができ、再び特定のトランザクションを除外することができるのです。
攻撃者がマイニングパワーの大多数をコントロールできる限り、このタイプの攻撃によって特定のBitcoinアドレスまたはBitcoinアドレスの集合に対して持続的にDOS攻撃を引き起こすことができます。
つまり51%のハッシュパワーを持つ主体は「過去6ブロック、または将来のブロックにおいて特定のトランザクションを除外すること」ができます。
また、この攻撃をすることでBitcoinそのものを全く使えないものにしてしまうことも可能です。
この攻撃をすることによって得られる攻撃者の利益は何もありません。
しかし、単純にBitcoinというシステムをぶち壊したいと考えている主体が存在した場合、このような攻撃を行うことも考えられます。
(c) マイニング報酬の独占
Bitcoinネットワーク全体の51%以上のハッシュパワーを保持していることで、その主体がブロックを生成する速度が最も速くなるので、その主体だけが勝手にマイニングして伸ばしていくチェーンの長さが最も長くなり、真のチェーンとなります。
ということは、その主体が51%以上のハッシュパワーを維持する限り、51%攻撃が行われて以降のブロックは全てその主体によってマイニングされることになり、マイニング報酬を独占することができます。
これら3つに代表されるコンセンサス攻撃は大きなハッシュパワーを保持していれば現実的に可能なものですが、
攻撃をしたことが、他のノードに気づかれてしまうと、Bitcoinを使用する人はいなくなり、Bitcoinの価値はなくなってしまいます。
そんなことをするくらいならその大きな計算量を使ってマイニング報酬を得ていた方がいいですよね。
なのでこのような改ざんをするインセンティブはないと言われています。
<疑問点>
・分散で合意を取るためにPoWという”競争”を使っているが、これって”完全にランダム”じゃダメなの?
→ 「マイニングします!」という意思表示をしているマイナーにランダムにブロック生成権を与えるというコンセンサスアルゴリズムの場合は、「とにかくたくさんマイニングノードを立てまくる、アカウントを作りまくる」というのが最適戦略になってしまう
<まとめ>
これまでの全8章でBitcoinの仕組みが一通り分かったと思います。(第9章, 10章はBitcoinの仕組みに直接関係ないので、流し読みでいいかと思います。)
Bitcoin・ブロックチェーンに対する認識としてポイントだなと思うのは、「Bitcoin・ブロックチェーンの革新性は”分散合意のシステム設計”である」ということです。
巷では「ブロックチェーンは改ざん不可能!」と言ったパワーワードばかりが飛び交っているので、ブロックチェーンが「暗号的な発明」だと認識してしまいがちです。
しかし、これまで見て来た通り、ブロックチェーンで使われている暗号方式はSHA256, RIPEMD160, 楕円曲線暗号, ECDSAといった現在のインターネットでも使用されているものばかりです。
このことを認識しておけばよく聞かれる「量子コンピュータができたらブロックチェーンの堅牢性は破られるからブロックチェーンはオワコン!」と言った意見にも絶望せず「量子コンピュータができたら既存のインターネット・ブロックチェーンで使われている暗号方式が破られるから、”既存の”インターネット・ブロックチェーンはオワコンだけれども”また新しい暗号方式”が出て来たらブロックチェーンは新しく復活できる」と考えられるようになるはずです。
<参考文献>
続き↓
0コメント