イーサリアムは環境面の負荷が大きいプルーフ・オブ・ワークに代えて、プルーフ・オブ・ステークにコンセンサスアルゴリズムを変更しようとしています。
しかし、プルーフオブステークの仕組みではロングレンジ攻撃などのさまざまな問題があげられるので、新しいプロトコルを導入し問題対処のための工夫が必要になっています。
イーサリアムでは、純粋なPoSにおいてさまざまなプロトコルの変更を行なった独自のPoSである「Casper」が考案されています。このCasperにおいて重要な働きをしているのがSlasher(スラッシャー)という懲罰的アルゴリズムです。Slasher自体はCasper開発の初期段階で導入されたものですがNothing at Stake問題というPoSにおける重大な問題を解決することができています。
そこで、当記事ではイーサリアムのPoS「Casper」にSlasherが導入されるまでの背景を紹介し、初期のSlasherの仕組みを見ることで具体的な問題の対処法について見ていきます。
また、イーサリアムのブロックチェーンについてある程度知っていると当記事もイメージしやすいのでこちらの記事も併せてご覧ください。
Slasherが導入される理由
プルーフ・オブ・ステークの登場
ビットコインで採用されているコンセンサスアルゴリズムであるプルーフ・オブ・ワークとは、十分に小さなナンスを最初に計算することができたマイナーがブロックを生成することができる仕組みです。
プルーフ・オブ・ワークはブロックチェーンを使ったネットワーク内で正しい合意形成が行える画期的な仕組みですが、大量の計算資源を必要とするので環境面に大きな負荷を与えてしまうという負の側面があります。(プルーフ・オブ・ワークについては『プルーフオブワーク(PoW)の仕組みを知らずにビットコインは語れない』で詳しく解説しています。)
このデメリットを改善するために、プルーフ・オブ・ステーク(以下PoS)というプルーフ・オブ・ワークに代わるコンセンサスアルゴリズムが考案されました。PoSでは、計算資源という外部コストを使う代わりに賭け金(Stake)という内部コストを使うことで、正しい合意形成を行おうとするアルゴリズムです。
つまり、バリデーター(PoWでのマイナー)は、一定の通貨をデポジットとして賭けることによりブロックを生成することができます。この賭け金が大きいほどブロックを生成できる確率が高まるのです。
naivePoSの問題点
考案された当初のPoSは原始的なPoSとしてnaivePoSと呼ばれています。ナイーブPoSでは主に以下の2つの問題があげられます。
- Nothing at Stake問題
- ロングレンジ攻撃
Nothing at Stake問題とは、バリデーターがリスクをとることなくブロック生成に参加できてしまう問題です。
PoWでは大量の電気代などを投資し、正しいブロックの生成ができれば利益を得ることができますが、不正なブロックを作ればそのブロックは認められないので、投資した分の損失を被るという金銭的リスクがありました。なので、悪意のあるマイナーは気軽にマイニングに行い不正なブロックをブロックチェーンに追加することができません。
一方、PoSでは賭け金をデポジットするだけなので、ブロックが生成できなければその賭け金は返金されるのでリスクはないことになります。つまり、悪意のあるバリデーターはリスクを取ることなく気軽に不正なブロック生成を試みることができてしまうのです。
また悪意がなくてもブロックチェーンの分岐時に、両方のブロックチェーンでブロックを生成しようとする戦略が経済的に最適になってしまいます。(PoWはマイニングにコストがかかるのでこのような戦略は適さないが、PoSはブロック生成にコストがかからないので両方のチェーンが延びてしまう。)
ロングレンジ攻撃とは、攻撃者が古いブロックからブロックチェーンを分岐させ、そのチェーンをメインチェーンより速いペースで伸ばし続けることでメインチェーンを乗っ取ってしまう攻撃です。
なぜこのような攻撃が可能なのかというと、そのような古いブロックにおいてはデポジットは存在せず、ブロック生成報酬もすでに引き出しているので、デポジットが没収されることなくブロック生成に必要な鍵を使うことで分岐させることが可能なのです。(攻撃者は昔、その古いブロックのPoSに成功しているので鍵を持っています)
(source: Casper the Friendly Finality Gadget)
このような問題を解決するためにイーサリアムのPoSはCasperと呼ばれ、Slasherというアルゴリズムが導入されています。ただし、Casper(FFG)はPoWとPoSのハイブリッド式コンセンサスアルゴリズムで、100個ごとのブロック生成にPoSが使われます。ただし報酬比で見ると、PoWよりPoSのブロック生成報酬の方が高くなるようにされています。
Slasherは懲罰的なアルゴリズムで、フォーク後のブロックチェーンで両方のチェーンに対してマイニングを行うことを防いでいます。バリデーターはメインチェーンではない「間違った」チェーンにブロックを生成しようとした場合、デポジットした賭け金(Stake)が没収されてしまうのです。
Slasherの仕組み
初期に考案されたSlasherは以下の仕組みで成り立っています。これは、Vitalikによって考案された初期のプロセス(アイデア)で、PoSのインターバルとしてPoWと使いSlasherを導入しています。(現在、Vitalikが考えているCasper FFGは違うプロセスなので注意してください)
①マイナーは生成したブロックにある乱数Nのハッシュ値を含めておきます。値Nはそのブロックを生成したマイナーのみが知っていることになります。また、このとき生成したブロックはgenesisブロックからK個目のブロックであるとします。
②マイナーはK+100個からK+900個目のブロックが最新ブロックである間に値Nをブロードキャストすることでマイニング報酬を得ることができます。ただし、このマイニング報酬はかなり少ないことに注意してください。(例えばPoS報酬の1/50程度)
③K+1000個目のブロックが最新ブロックであるとき、あるアドレスが持っている通貨の量に比例して「署名権利(signing privilege)」を得ることができます。一般的に64個ほどのアドレスに対して署名権利が与えられます。(A:アドレス、B:残高、M:コインの全供給量としてsha256(n[K] + n[K+1] + … + n[K+99] + A) < 2^256 * 64 * B / Mを満たしているアドレスに対して与えられます。)
④K+3000個目のブロックのとき、K+1000のブロックで署名権利を得た64個のアドレスは、K+3000のブロックに特別な署名をするチャンスがランダムに与えられます。このとき署名をすることができたアドレスにはPoWの報酬よりも圧倒的に多い報酬を得ることができるのです。
⑤ただし、この報酬を得るのはK+4000個目のブロックのとき、つまり1000個先のブロックで得ることができます。
またひとつのアドレスによって2つの署名がされていることが見つかった場合は賭け金のデポジットを没収されてしまいます。(不正なフォークを作ろうとした場合)
さらに、K+4000のブロックより前にPoSの報酬を受け取ろうとトランザクションを作った場合、その報酬は没収されてしまい、その不正事実を見つけたユーザーに対してその報酬の33%が支払われます。
以上が初期に開発されたSlasherを導入したCasperの流れです。このプロセスの中で注目すべきところは、ブロックに署名をして報酬を得ることができる権利は、2000個も前のブロックでのデータに基いて与えられることです。
上記の例で言えば、K+1000ブロックでブロック生成者の候補を選び、その2000ブロック後のK+3000で最終的なブロック生成者を決定しています。この間に、署名アドレスの重複がないか十分にチェックすることができるのです。もし重複が見つかったら、デポジットした賭け金の全てが没収されてしまいます。
また、このように2000ブロック前をPoSに使うことで、2000ブロックもフォークしたチェーンが続くことはまずないので(この間はPoWによってマイニングされています)メインチェーンの通貨で報酬をもらえることを確実にしています。(もし、すぐにPoSでブロック生成を行なってしまった場合、そのチェーンは実はフォークしたメインチェーンではないブロックチェーンであることもあるからです)
現在Vitalikが考案しているCasper FFGは100ブロックごとにチェックポイントを設け、そのチェックポイントで正しいブロックチェーンかどうかの投票を行うことで、不正なブロックチェーンが分岐しないようにしています。
参考:Casperのthe Friendly Finality Gadget(FFG)を分かりやすく解説
Slasher外でのロングレンジ攻撃
このプロセスであれば、間違ったフォークを行おうとする攻撃者に対して罰を与えることができNothing at Stake問題は解決できます。また、Slasherのプロセス内であればロングレンジ攻撃も解決できています。
しかし、Slasher外でのロングレンジ攻撃は解決できていません。なぜなら、Slasherプロトコル以前のブロックに対しては何の制約もなくロングレンジ攻撃を行うことができてしまうからです。
例えばK-100000のブロックに対してロングレンジ攻撃は可能です。このブロックでのデポジットもブロック生成報酬もすでに攻撃者は引き出しているので、デポジットを没収されることなく「古い鍵」を使うことでブロックチェーンをフォークさせることができてしまいます。
このようなSlasher外でのロングレンジ攻撃に対処するためにCasperでは以下のようなプロトコルを導入することで解決しています。
- 現時点で賭け金をデポジットしていないバリデーターはPoSでブロックを作成できない
- 古いタイムスタンプが記録されているブロックからのフォークは禁止する
しかし、このようなプロトコルを導入することでノードは「現時点で賭け金をデポジットしている正当なバリデーターのリスト」を常に最新の状態で保持している必要が出てきます。このような正当なバリデーターのリストを持っていないと、どのバリデーターがPoSの参加資格を持っているか判別できないからです。
この新たに出てきた問題に対してVitalikが提案しているCasper the Friendly Finality Gadget(CFFG)では、「100個ごとのブロックに正当なバリデーターのリストを記録しておくことで、ノードはそのリストを見ることで最新のリストに更新することができる」という方法をとっています。
また、プルーフ・オブ・ワークと比較したプルーフ・オブ・ステークのメリットとデメリットに関してはこちらの記事で詳しくお伝えしているのでぜひ参考にしてください。
参考:イーサリアムに導入予定。プルーフオブステークのメリットとデメリット