この記事は現段階でメモで、あまり裏付けの取れてない情報を含みます。
コンセンサスアルゴリズム
合意形成のためのアルゴリズムのこと。
ここでいう合意形成とは、仮想通貨(暗号通貨)において、一定のノードが攻撃者であることを考慮した上で、全体で同期の取れた分散台帳を共有する仕組みのこと。
重要なポイントは以下の2つ。
- ブロック生成者を抽選で決定する。この際、全ノードに「公平な」抽選が行われること。
- ブロックが分岐した場合、「最も長い」チェーンをベストチェーンとみなす。この際、「長さ」の測り方が適切であること。
PoW (Proof of Work)
計算量に依存したコンセンサスアルゴリズム。
以下、Bitcoinの実装。
抽選方法
ブロックごとに「目標となる最大値」(nBits)が定められ、これを下回るハッシュ値を一番早く計算したノードが勝者となる。
目標値は2週間ごとに更新されるが、ブロック生成に20分以上かかった場合は難易度が最低値(計算量2^32)まで落とされる。
CheckProofOfWorkでハッシュ計算してるっぽい。
長さの測り方
単純なブロック数ではなく、ブロック毎に重み付けが入る。
1ブロックの重さは「目標となる最大ハッシュ値」に必要な計算量に等しい。
すなわち、チェーンの計算にかかった計算量を比べて、より多くの計算量をかけたチェーンが勝者。
関数はGetBlockProof。
所感
わかりやすい。
「そうだな」って感じがする。
PoS (Proof of Stake)
コインの所持数に依存したコンセンサスアルゴリズム。
以下、XPの実装。(XPを使うのは自分が持っているから、というだけ)
抽選方法
ブロックごとに「目標となる最大値」(nBits)が定められる。ここまではPoWと同じ。
PoSでは、この最大値に補正がかかる。「コイン日数」(CoinDay)という概念が入ってくる。コイン日数はおよそ「所持金×所持日数」だが、所持日数は単純計算でなくトランザクション発生後24時間しないとカウントが始まらず、72時間以降は増加しない。
「目標値×コイン日数」が最終的な目標値になる。つまり、大きな所持金を長い期間持っていると、抽選の難易度が下がる。
この上でハッシュ計算をしているっぽいが、whileでグルグル回すんじゃなくてタイムスタンプ値を使って特定の値しかハッシュにしてない気がする。
使って良い値に制限がある感じ。ここで計算量による優位性をなくしていると思う。
CheckStakeKernelHashでチェックしてる。ハッシュ計算はScanKernelBackward?
長さの測り方
PoW同様、ブロックに重み付けして計算する。
ただし重みの付け方が妙に複雑で、いろいろな計算式の末に導出している。
なんにせよコイン日数(CoinDay)を無視して、nBitsのみが計算に用いられる。
関数はGetBlockTrust。
所感
なんか色々複雑。そうしないといけない理由の一つがNothing-at-Stake問題っていうヤツらしい。
つまるところ悪意のある副鎖が生まれたときに、悪意のあるチェーンを適切に排除しきれないということらしい。
比較
悪意のあるユーザが、悪意のあるチェーンを偽造したときの話。
PoWは計算量の大小によって多数派を担保できる。計算量とは仮想通貨の外の世界の話なので、仮想通貨でいかに不正を働いても計算量を手に入れることはできない。
つまり、悪意のあるユーザでも「抽選を引く回数」を水増しできない。
計算に必要な電力がインフレしていく、という最大の欠点を除けば、上手く機能することがなんとなくわかる。
PoSは所有量の大小によって多数派を見分けることになる。しかし所有量というのは仮想通貨の中の世界の話であり、不正を働くことによって不当に所有量を増加させることができる(通貨のルールに則る範囲で)。
つまり、悪意のあるユーザは「抽選を引く回数」に対してチートを働くことができる。
電力消費が抑えられることは強い利点だが、逆を返せば潤沢な計算資源を用意すればブロックチェーンの偽造ができる可能性を残す、という点が非常にキツい。なんかロングレンジ攻撃って言うらしい。
ブロックチェーンの偽造問題をきちんとした証明のもとで解決できるならPoSに陽の目があると思うが、現段階でPoS単体で安全性を担保するのは困難だと思う。