インターネット上には多くの哲学的な記事や議論がありますが、メリットについては十分な情報がありません。 ある時点で、著者は、セキュリティのメカニズムと多くの関連するニュアンスが、多くの暗号通貨開発者によっても完全に理解されていないことに気付きました。 これは、暗号通貨の1つにPoS実装を移植する実際のケースで、サードパーティの専門家が発見した脆弱性に関する情報のさらなる公開で明らかになりました。
この記事は、すでにPoSの脆弱性に遭遇したか、今後登場するすべての開発者に役立ちます。
カットの下で恐ろしい。
歴史の粒
インターネットでは、ピアコインでのProof-of-Stake(PoS)の起源は、2011年のフォーラムでの議論、その後のNovaoinでの使用、およびPIVXやその他のBitcoinフォークでのさらなる配布後に追跡されます。 かなり原始的なPoSロジックがkernel.h
/ kernel.cpp
にkernel.cpp
れ、さまざまなフランケンシュタインモジュールの形でフォークスペースをさまよう。
PoSアルゴリズムはいくつかの開発段階を経て、誰かがバージョンを提供します。 現在、PoSオプションは自然な理由で分割されており、DPosは登場しています。 最も高度なソリューションの1つは、イーサリアムのCasperプロトコルです。
ブロックチェーンにはブロックの生成が必要であり、誰かが新しいブロックを作成する権利を持っている必要があります。 Gitバージョン管理システムなどのブロックチェーンでこれがあまり競争なく作者によって行われている場合、暗号通貨では、Proof-of-Work(PoW)のフレームワークでブロックの報酬を得るための激しい闘争があります-特定の目標(マイニング、マイニング)によって決定されます。
PoSは、Proof-of-Work(PoW)を置き換えて、マイニングでのリソースの浪費を防ぎます。 代わりに、すべての入力パラメーターは、コインホルダーの既存の節約に基づく一定の特性で厳密に定義されます。 したがって、PoWは、コインの作成者を最初に抵当に入れて濃縮するためのさまざまなオプションに頼らない場合、PoSの開始点として必要です。
なんで?
エネルギーの節約は、生産者と消費者の温室効果ガスの排出を制限するのと同じくらい、開発者とコイン保有者にとって重要です。 残酷な真実は異なります:
- PoWベースのプロジェクトは、いわゆる 「51%の攻撃」:攻撃者は大きな力を活用し、並列チェーンを作成してから、異なるコインの動き(つまり、2回の無駄)で突然公開できます。
- PoWマイナーはコストをまかない、キャパシティビルディングに投資する必要があります。これはプロジェクトからの資本の直接的な流出であり、
- 貯蓄の所有者は、自然のインフレを見るのではなく、自己調達資本によって購買力を維持したいと考えています。
実例:2018年11月から12月に攻撃が試みられました。 その後、12月から2月にかけて、ビデオカードでのマイニングで最も収益性の高いコインとして注目が集まりました。 レートは2+から0.5 USDに低下しました。 PoSに切り替えた後、週に1米ドルに上昇し、投資の流入が増加しました。
技術的なポイント
注意:このセクションでは、Peercoin、PIVX、およびそれらの分岐にあるような「従来の」PoSについて説明しています。
「ポイント」の集中化とアカウンティングがないことを理解する必要があります。 このバージョンでは、PoWと同じ運の原理が機能します。
1.用語
用語は比較的一般的ですが、異なる実装ではそのニュアンスは次のとおりです。
- PoWターゲット -ターゲット=ベースターゲット、通常は2 ^ 240(0x0000ffff ...)をブロックの複雑さで除算(前のゼロの数を増やします)。
- ブロックの難易度 -基本的な目標に対するブロックの複雑さ。現在のチェーン成長率に基づいて決定的に決定されます。
- UTXO-未使用トランザクション出力、トランザクションハッシュと出口番号のペア。
- CoinBaseは、報酬を含むブロック内のインデックス0を持つ特別なトランザクションです。
- StakeまたはCoinStakeは、ブロック内にインデックス1を持つ特別なトランザクションです。
- ステーク入力 -サイズと年齢による賭けの要件を満たすUTXO。
- ステーク修飾子 -各ステーク入力に対して決定論的に計算された特別なパラメータ。
- ステークハッシュは、算術的にステークターゲットよりも少ないはずのハッシュ結果です。
- ステークターゲット -PoWターゲットと同じですが、最小入札額に対するステーク入力量に比例して増加します。
- ブロック署名 -ブロック署名。
- フォーク -分岐チェーン。
- 分割 -ネットワーク共有。
- 孤立 -別の選択肢を選択したためにブロックを破棄しました。
2.解剖学
生成プロセス:
- ステークインプットの要件を満たすすべてのUTXOを見つける
- ステーク修飾子を見つけます。
- ステーク入力によるPoWターゲットの乗算
- 実際、100万分の1-1 MH PoWハッシュレートが実験的に1コインに相当するのはこのためです。
-
Stake Hash = H(Stake Modifier, Stake Block Time, UTXO output index, UTXO txid, Current Block Time)
ます。
- 可変パラメーターのみCurrent Block Time
-
Stake Hash >= Stake Target
場合、許容範囲内でCurrent Block Time
を見つけようとします。
- 実装に応じて、Stake Inputの量を掛けると、Stake Targetがオーバーフローする可能性を考慮する必要があります。
- Coinbaseをtx [0]に、CoinStakeをtx [1]に配置します。
- Coinbaseの受益者は、Stake Inputと同じスクリプト(アドレス)です。
- ブロックに署名します。
2.1。 ブロック時間:
詐欺は時間の経過とともに何らかの利益をもたらすことがわかります。 標準的なコンセンサスでは、下限と上限が制限されています。
下位のブロックは、常に最後のNブロックのブロックの平均時間を設定します。通常は11を超えます。これは、ノードの生成時の時間の不正確さの許容範囲です。
PoWの歴史的な上限は、2時の空を指で設定しました。 間隔を長くすると、複雑さが減り、ブランチの魅力が低下します。したがって、意味がありません。 しかし、PoSにとっては理にかなっています。
PIVXなどは、将来の時間を最大3分に制限します。 より厳しい制限を課す人もいますが、これはユーザーに問題を引き起こします。 一部のPoS実装では、最小の現在のブロック時間間隔を1秒から15-16秒に変更することを決定しました。
2.2。 ステーク修飾子:
ステーク修飾子は予測を困難にし、チェーンを先に構築する手段として考えられていましたが、何かが間違っていました...
それを計算するためのさまざまなオプションがあります:漸進的に指定された時間間隔の終わりのブロックハッシュの最後のビット、前のブロックからの[それほどではない]予測値など。 一部の場所では、健全なものよりもコードの難読化のように見えます。
オリジナルは64間隔のギャップを取ります。 このギャップは徐々に64の不均等な部分に分割されます。 境界線は分に丸められます。 境界では、既存のブロックが選択され、それらから最後の1ビットが取得されます。 そのため、Nonceに似た64ビットの数値が判明しました。
Peerconの間隔は20分ですが、PIVXのスタッフは、1分間隔を1分に丸めて、医師が注文したものと判断しました。
一般に、Blackcoin V2 +などの一部の実装ではすべてが固定され、Stake Modifierはヘッドからカウントされますが、Peercoin V03、PIVX、Blackcoin V1およびその他はStake Inputブロックからカウントされます。 後者はその意味をほぼ完全に破壊します。 変数の命名、さらなる変容、および考え抜かれたコピーアンドペーストの平凡な問題のために混乱が起こったという仮定があります。 そして、著者自身が十分に遅れて問題を発見した一方で、彼の注意はすべてDoSに対する保護に集中していました。 捕まるな!
2.3。 ブロック署名
ブロックハッシュは作業の証明として機能しなくなり、誰でも署名されたCoinStakeトランザクションを他の誰かのブロックから取得できるため、ブロックがStakeの所有者によって作成されたことを確認する必要があります。 したがって、ヘッダーはCoinStakeと同じ秘密キーで署名されます。
2.4。 CoinBaseおよびCoinStake終了スクリプト
プライバシーを保護し、1つのウォレット内の個々のアドレスをリンクしないようにするには、同じ出口スクリプト、または人々がウォレットアドレスを呼び出すのが必要です。
2.5何とどこ?
CoinBaseとCoinStakeで金額を処理する方法にはさまざまなバリエーションがあります。 特定の場合の論理と動機:
- 処理エラーによるユーザー資金の損失を最小限に抑えるために、金額は別々に保つ必要があります。
- CoinBaseは100の確認を保持しますが、CoinStakeはすぐに使用できます。これはもちろん、二重に使用されるリスクを残します。
- ブロックの深さにスナップすると、ステーク入力として使用するための年齢資格にも矛盾します。
- CoinBaseとCoinStakeは決してmempoolに分類されるべきではなく、それらに基づくすべてのトランザクションはチェーンの再構築中に削除されるべきです。
3.ヘッダーに対するブロックを完了します
ネットワークへの本格的なノードのエントリは、同期から始まります。 ビットコインでは、同期は主にブロックヘッダーに基づいています。 コンセンサスの予備検証に十分な情報が含まれています。 最初に、比較的小さなヘッダーが取り出され、片側ノードから最大2000個のバッチでチェックされます。 最初のテストが成功した場合、接続されているすべてのノードからすべてのブロックが並行してプルされます。
フラッド保護は、ローカルノードが最もよく知られているヘッダーを持っているものと比較し、ヘッダーのチェーン全体を要求するという事実に基づいています。 ダウンロード時に、ディスクスペースとコンピューティングの低コストによってすべてがチェックされます。 チェーンは、個々のブロックの複雑さの合計であるchainworkなどの特性に基づいて重みが比較されます。 このような強力な代替チェーンを構築するには、非常に多くのリソースを投資する必要があり、攻撃は見込みがありません。
PoSでは、このアプローチは機能しません。 ブロックを確認するには、少なくともステークの最低年齢まで完全な前のブロックを処理する必要があります。 著者によって見られた実装は、変質し始めていませんでしたが、単にヘッダーを扱うことを拒否しました。
したがって、ヘッダーに続くブロックの日和見的並列ダウンロードを実装しました。これにより、すべての接続を使用するため、同期速度が大幅に向上します。 ピアが異なるチェーン上にある場合にのみ小さな遅延が発生します。標準スキームのようにわずかなタイムアウト後に接続が切断されます。 マイナスとして、同期時に誤ったチェーンを選択する傾向。
ところで、標準のBitcoinクライアントとそのフォークは、いくつかがさまざまな理由で失敗した場合に、8の発信接続の最小標準数を十分に長く獲得しています。 これは、非同期アウトバウンド接続によって解決されました。
4.フォーク、スプリット、オーファン
ビルディングブロックの競争では、1〜2リンクの代替チェーンが比較的一般的です。 開発されたネットワークでのより長い分岐は、プログラミングエラーまたはグローバルなインターネットの切断によるコンセンサスの重大な失敗の間にのみ自然に発生します。
分離しても、通常、トランザクション処理の整合性に対する脅威はありません。 ブロックをデタッチすると、すべてのトランザクションがmempoolに戻り、すでに他のブロックに含まれています。 Mempoolは、トランザクションが作成された後の一時的なリポジトリです。 Mempool自体は、最近のバージョンではディスクに保存されます。 ブロックの報酬は破壊されます。 そのため、賞の最小確認数(深さ)が設定されています。
メインネットワークへの接続があると仮定すると、ローカルネットワークセグメントは外部との接続を失い、マイニングを続行します。 そのような枝は通常、その自然な弱さのために脅威をもたらしません。
PoWの主な51%攻撃については既に説明しました-非常にリソースを消費しますが、PoSの場合は比較的手頃な価格になります。 このため、チェーンのさまざまなリンクから多くのブランチを作成することが技術的に可能になります。 古典的な解決策の1つは、特定の深さ以下のフォークを禁止することです。
このような保護の主な問題は、隠者セグメントからのノードが、再起動後に独立してメイン回路に戻ることができないことです。
したがって 、チェーンのトップが非常に若い場合にのみ、特定の期間より古いフォークを禁止するアプローチが実装されました。
ブロックの目標間隔が1分の場合、古いフォークの基準は1時間に選択されました。これはCoinBaseの確認の約60%に相当し、15分のクラウンの若さの基準は最大統計ブロック遅延の3+倍です。
5.ハッシュのブロックと分割
PoWでは、ブロックハッシュはすべてのデータを完全にカバーします。 また、ターゲットの確認にも使用されます。 PoSでは、ステークハッシュは別の値です。 選択の可能性を除外する必要があります。 これにより、主な脅威が開かれます。これは、同じ偶発的なステークに基づいて無制限の数の異なるバージョンのブロックを作成する機能で、ネットワークまたはその個々のノードを簡単にフラッディングして配置できます。
素朴な防御アプローチは、さらに深刻なスプリット脆弱性を引き起こします。 さまざまなバリエーションのこれらのアプローチの1つは、ステーク入力の使用を1回だけ許可することです。 単純な攻撃は、異なるブロックを異なるノードに送信することです。これにより、すぐにソフトスプリットが作成されます。
DoS禁止でこれを悪化させることはさらに致命的です。DoS禁止は、チェーンだけでなく、ネットワーク自体を異なるセグメントに分割します。
他の問題が発生します-ドロップされたブロックからステークを使用できない。
したがって 、スロットル方式が最も安全なソリューションとして選択されました-同じステークは1分に1回しか使用できません。 ロジックは単純です:攻撃は1時間の間隔でしか持続できません(上記の古いフォークを参照)。そのため、60ブロックまでしかフラッディングできません。 最良の場合、次のブロックで、ネットワークはすでに単一の回線に移動します。 最悪の場合、継続的な攻撃では、これは1時間で起こります。 最悪の場合の確率-連続していくつかのブロックを見つけることは、指数関数的に溶けています。
それでも同じように、完全な同期の瞬間まで、ノードが中程度のフラッドに対して脆弱になるポイントがいくつか残っています。
6.最低年齢
一部の人にとって、この制限は困惑していますが、ネットワークの安定性にとって非常に重要です。 このパラメータは、代替ネットワークの最大長に直接関連しており、ローカルノードは重大な技術的歪みなしに確認できます。
前述のように、ローカルノードは、ステーク入力a)がb)の場所を持っていること、実際にUTXOであり、使用されていないことを確認できるように、年齢制限までのすべてのブロックを処理する必要があります。
これがいわゆるの機能を通してのみ可能であることを確認してください。 CoinView、これは特定のブロックの時点でのコインの動きの状態です-ローカルノードの理解におけるメインチェーンのトップ。
CoinViewによって保存された時間間隔または特別な方法での代替回路の本格的なテストの実装は、将来性がないようです。 これらの代替チェーンの数は無限に多くなります。
UTXOの年齢制限のバーが大きすぎると、コインの一部を使用したり結合したりするユーザーに悪影響を及ぼします。
ブロックの深さでこの境界を指定すると、適切なUTXOが存在しないため、チェーンが完全に停止するという仮想の膠着状態が発生する可能性があります。 時間単位の場合、少なくともいくつかの動きが発生します。
したがって 、他のネットワークでは、ブロックの深さではなく、絶対時間単位で1時間のバランスの取れた選択が使用されます。
7.最小額のN UTXOまたは合計Nの1 UTXOよりも優れているものは何ですか?
ここでの類推はそれ自体を請う:0.9の精度を持つ1つの銃または0.3の精度を持つ3つの銃が良いが、1/2 ^ 20のオーダーの確率で、そのような計算の結果は平準化されるように思われる。 小さなマップは、資格の成熟度を混乱させます。
多くの小さな取引がより多くのブロックを見つけるという現在の信念は、おそらく重量を決定するためにステークインプットの年齢も考慮に入れられたときにさかのぼります。 当時、古い小さなトランザクションは本当に多くの意味を成していました。
現時点では、実際の実験と理論計算に基づいて、大規模なUTXOにグループ化されたグループはより多くのブロックをもたらします。 さらに、UTXOが少ないほど、CPUの作業が少なくなります。 誰かが反対を主張します。
だから自分で考えてください。
8.ブロックを前進させる
PoSマイナーは、当然、ブロック時間を少し上回ります。 これは、ネットワークの複雑さに悪影響を及ぼします。 標準のビットコインコードは、指定された時間に関係なく、受信した最初のブロックを選択します。 ほとんどのPoS実装は同じことを行います。
そのため、 PoSマイナーのロジックは、現在のブロックの時間が進んだ場合にブロックの平均時間から選択を開始するように変更されました。 同時に、ノードは順序を比較する前に、指定されたブロックの時間を比較します。 PoSマイナーは、フォークを生成していることが確認された場合でも、見つかったブロックをネットワークに送信します。
このようにして、ネットワークは、DoS保護のために同じStake Modifierを使用して、次の60秒間にStake Inputを使用できない仮想送信済みブロックからも保護されます。 時間をかけて不正行為をした場合の二重罰のように。
9.小さなチェックリスト
- ステーク入力は、分岐点の前に有効なUTXOである必要があります。
- メインチェーンの場合、分岐点はチップです。
- 代替回路の場合-分岐点の後のUTXOは、切り替え時に自己DoSにつながる可能性があります。
- UTXOを単独でmempoolに入れないでください。
- メイン回路を再構築するとき、mempoolでCoinStakeを受け入れないでください。
- CoinBaseでも同じことが起こります。
- これにより、トランザクションチェーンが破壊される可能性があります。
- トップがかなり生きている場合、古いブロックからのフォークを受け入れないでください。
- ステーク入力の絶対時間単位の年齢要件は、安定性とセキュリティのために必要です。
- ステークハッシュはブロック時間からのみ変更する必要があります。
- Stake Modifierは、Stake Inputブロックにバインドしないでください。
- ブロックヘッダーの操作には、ネットワーク上およびインデックスの再作成中に特別な処理が必要です。
- CoinStakeはローカルウォレットに記録されており、orfanを正しく表示するにはいくつかの変更が必要です。
- PoSマイナーはおそらく十分な妨害を持ち、ファイルでファイナライズする必要があります。
- インデックスの再作成には改善が必要です。 ヘッダーと同様に機能します。最初にブロックのインデックスのみをロードしてチェックし、次にブロックの処理のみを試みます。
- PoSへの移行がハードコードされておらず、sporkを介している場合は、起動時にキャッチする必要があります。 胞子は保存されません。
- DashとBitcoinのチェックポイントはほとんど偽物であり、非常に深刻な改善が必要です。
- Dashフォークがバージョン0.13までの場合、シンプルユーザーモードでのマスターノードデータの処理に問題があります。
- クライアントを頻繁に再起動すると、ネットワークビューがゆがみます。
- グラフィカルモードで実行している場合は、キャッシュを無視する方が適切です。
- ブロック時間を考慮して、最適なブロックの選択を変更します。
- Bitcoin .
- mempool CoinStake .
. mainnet PoW , , PoS, . PoS Ethereum Casper'.
GPU - — ethminer'. 150-200 GH (ethash). - PoS .
PoS PIVX 2.x " ". - PIVX , , . , PIVX 2.x . Dash 0.12 Bitcoin'.
, PoS . , , .
準備作業
ドキュメント
. . whitepaper -.
PoS PIVX Bitcoin/Dash. CoinStake . PoS .
, Stake Modifier Stake Hash , Stake Input . - , - PIVX .
— . :
- .
- .
- — .. , .
- , - , .
. spork' , .
, . spork' .
PoS
, - . spork, , .
, .. . , .
testnet, .
testnet 3 1 mainnet, .
PoW , PoS - , 1e6 PoW.
. mainnet Stake Input.
.
PoS
X spork PoS . - , .
. , . .
, , .
軟膏で飛ぶ
Stake Modifier . . PIVX - … , , Ethereum, .
おわりに
上記では、オープンソースの世界には商業的価値はなく、時代遅れのテクノロジーに基づく一時的なソリューションでもあります。ただし、他の多くのプロジェクトが最近PoS実装に対する攻撃に遭遇しており、この記事がホストのセキュリティの強化に役立つことが期待されています。著者は最初は確かに資料が不足していた。
注:この記事では、誤った広告料金を回避するために、名前とプロジェクトリソースへの直接リンクを削除する予定です。