Lotus が提供する PoSt アルゴリズムには、Winning PoSt と Window PoSt の 2 つのスキームがあります。 Winning PoStでは、ブロック生成時にコミットされたセクターデータを証明します。提出された部門データを定期的に検証し、正しく保存されていることを確認します。 この記事では、WindowPoSt ロジックを詳しく紹介します。 Window PoSt を理解するには、スマート コントラクトのセクターの管理から始める必要があります。 この記事で使用されているスマート コントラクト (スペック アクター) の最新の送信情報は次のとおりです。 著者: Alex North<[email protected]> 日付: 2020 年 5 月 6 日水曜日 10:08:31 +1000ConsensusMinerMinPower を 10TiB に設定 (#344) マイナーのプロパティ情報、住宅ローン情報、セクターステータスは、マイナー状態に保存されます。 WindowPoSt に関連するコード スニペットを選択します。 ... 証明期間開始abi.ChainEpoch 新しいセクター *abi.BitField 締め切り cid.Cid ... } ProvingPeriodStart - 各証明期間の開始時刻。 NewSectors — 新しいブロックに関する情報 締め切り - 各チャレンジウィンドウは複数のウィンドウに分割されます。各ウィンドウには期限があります。 WindowPoSt の名前の由来はここにあります。 1.1 検証期間 WindowPoSt の構成仕様は、specs-actors/actors/builtin/miner/policy.go で定義されています。 定数年内の秒数 = 31556925 定数秒数 = 86400 const WPoStProvingPeriod = abi.ChainEpoch(SecondsInDay / EpochDurationSeconds) const WPoStChallengeWindow = abi.ChainEpoch(1800 / EpochDurationSeconds) // 30分(=1日あたり48) 定数 WPoStPeriodDeadlines = uint64(WPoStProvingPeriod / WPoStChallengeWindow) 定数 WPoStChallengeLookback = abi.ChainEpoch(20) WPoStProvingPeriod —証明期間。証明は1日1回必要です。 WPoStChallengeWindow — ChallengeWindow は 30 分です。各検証期間は 47 の ChallengeWindow に分割されます。 WPoStPeriodDeadlines — チャレンジウィンドウの終了。 WPoStChallengeLookback — チェーンからランダムな量のデータを取得し、各 ChallengeWindow の前のブロックの時間を遡ります。 要約すると、WindowPoSt の期間は 1 日で、各 WindowPoSt は 48 のウィンドウに分割されます。セクター情報は、ウィンドウの異なる期間によって異なります。各ウィンドウには WindowPoSt によって提供される証明が必要であり、ウィンドウ内のセクター数によって必要な証明の数が決まります。詳しいロジックについては後ほど紹介します。 1.2 締め切り 期限は specs-actor/actors/builtin/miner/deadlines.go で定義されています: CurrentEpoch abi.ChainEpoch // この情報が計算されたエポック。 PeriodStart abi.ChainEpoch // 証明期間の最初のエポック (<= CurrentEpoch)。 Index uint64 // 現在の期限インデックス ([0..WPoStProvingPeriodDeadlines)、または期間が経過した場合は WPoStProvingPeriodDeadlines。 abi.ChainEpoch を開きます // 証明を送信できる最初のエポック(含む、>= CurrentEpoch)。 Close abi.ChainEpoch // 証明を送信できなくなる最初のエポック(>= Open)。 チャレンジ abi.ChainEpoch // チャレンジのチェーンをサンプリングするエポック (< Open)。 FaultCutoff abi.ChainEpoch // 障害宣言が拒否される最初のエポック (< Open)。 } CurrentEpoch - 現在の期限時刻。 PeriodStart — 各プルーフの開始凍結時間。 インデックス — カットオフ日 (ウィンドウとも呼ばれます) のインデックス。範囲は 0 から 47 です。 オープン - この期間中に証拠を提出できる最も早い時間。 閉じる - このウィンドウで許可されている最終時間、または証拠を提出します。 チャレンジ - このウィンドウ内の乱数の範囲。 FaultCutoff - 障害ブロックは、このカットオフ ブロック時間の前にのみ特定できます。 ComputeProvingPeriodDeadline 関数は、証明開始時間と現在のブロック時間に基づいて Deadline を計算します。 periodProgress := currEpoch - periodStart ... 期限Idx := uint64(期間の進行状況 / WPoStChallengeWindow) if periodProgress < 0 { // 期間はまだ開始されていません。 期限ID = 0 } 期限オープン:=期間開始+(abi.ChainEpoch(deadlineIdx) * WPoStChallengeWindow) &DeadlineInfo{を返す 現在のエポック: currEpoch、 期間開始: 期間開始、 インデックス:deadlineIdx、 オープン: 締め切りオープン、 終了: 締め切りOpen + WPoStChallengeWindow、 チャレンジ: 締め切りオープン - WPoStChallengeLookback、 FaultCutoff: 期限未定 - FaultDeclarationCutoff、 } } 現在のブロック時間と開始時間から deadlienIdx を取得できます。このインデックスを使用すると、他の変数を取得しやすくなります。 WindowPoSt 状態ロジックには、各 windowPoSt 証明の開始時間を調整することと、証明する必要があるセクター情報を更新することの 2 つの部分があります。 2.1 認定開始時間を調整する マイナーのスマート コントラクトが作成されると、証明の開始時刻が初期化されます。 periodStart := nextProvingPeriodStart(currEpoch, AssignProvingPeriodOffset は、関数 HashBlake2b を通じて [0, WPoStProvingPeriod] 内のオフセットをランダムに生成します。 nextProvingPeriodStart 関数は次のとおりです。 currModulus := currEpoch % WPostProvingPeriod var periodProgress abi.ChainEpoch // currEpoch が前のオフセット境界からどれだけ進んでいるか。 currModulus >= offset の場合 periodProgress = currModulus - オフセット } それ以外 { periodProgress = WPoStProvingPeriod - (オフセット - currModulus) } periodStart := currEpoch - periodProgress + WPoStProvingPeriod アサート(periodStart > currEpoch) 返品期間開始 } 簡単に言えば、この関数は指定されたオフセットで次の証明開始時刻を見つけます。 証明開始時刻がわかったら、マイナーのスマート コントラクトは各証明期間の終了時に証明ステータスを確認し、証明開始時刻を更新します。 ... 期限.PeriodStarted() の場合 { st.ProvingPeriodStart = st.ProvingPeriodStart + WPoStProvingPeriod } ... エラー = st.ClearPoStSubmissions() ... } 2.2 業界情報の更新 マイナーのスマート コントラクトでは、NewSectors は 3 つのインターフェースを通じて更新されます。 verifyCommitSector: PoREPommi の送信時に、NewSectors に新しいセクター情報を追加します。 TerminateSector: NewSectors からセクター情報を削除します。 handleProvingPeriod: 期限までに NewSectors 情報を定期的に「プロビジョニング」します。言い換えれば、この関数はマイナーのスマート コントラクトで証明する必要があるすべてのセクターのリストを維持します。各ウィンドウポジションの開始時に、異なるウィンドウにセクターを割り当てます。 AssignNewSectors 関数を使用して、検証する必要があるセクターを異なるウィンドウ (期限) に割り当てます。 注:partitionSize はパーティション内のセクター数です。 ... ケース RegisteredProof_StackedDRG32GiBSeal: 2349、nilを返す ケース RegisteredProof_StackedDRG2KiBSeal: 2, nilを返す ケース RegisteredProof_StackedDRG8MiBSeal: 2, nilを返す ケース RegisteredProof_StackedDRG512MiBSeal: 2, nilを返す デフォルト: 0 を返します。errors.Errorf("サポートされていない証明タイプ: %v", p) ... } 32 GB セクターの場合、パーティション サイズは 2349 です。 AssignNewSectors には 2 つのステップがあります。 1. セクター数がパーティションサイズに達するまで各ウィンドウを入力します。 2. 手順 1 の後にセクターが残っている場合は、partitionSize に応じて各ウィンドウにセクターを割り当てます。 セクター割り当てをまとめると、partitionSize が単位として各ウィンドウに割り当てられます。つまり、1 つのウィンドウに複数のセクター分割単位が存在する可能性があります。入力変数シードに特に注意してください。この機能はセクター割り当てをランダム化しようとしますが、まだ実装されていません。 Lotus プロジェクトにおける WindowPoSt の校正ロジック。以下は、この記事で使用されている Lotus ソース コードの最後のコミットからの情報です。 マージ: 1d887b55 1831613f 著者: Łukasz Magiera 日付: 2020 年 5 月 6 日水曜日 01:45:33 +0200 プルリクエスト #1670 を filecoin-project/feat/update-markets-0.2.0 からマージ go-fil-markets を更新 完全な WindowPoSt スケジューリング ロジック フロー チャートは次のとおりです。 WindowPoStScheduler: チェーンのステータスを監視します。新しいブロックの高さで doPoSt を実行しようとします。 doPoSt は、wunPoSt の実行時に生成される WindowPoSt 証明 (rust-fil-proofs からの出力) と、証明をチェーンにプッシュする SubmitPoSt の 2 つの部分に分かれています。証明期間内のすべての証明はチェーンに記録されます。 handleProvingPeriod: 各期間の終了時に、すべてのウィンドウのすべての証明状態を確認します。 このコースでこれまでに説明した内容を要約すると次のようになります。 1. 1 回の認証期間は 1 日です。 1期間は48のウィンドウに分割されます。各ウィンドウには 30 分かかります。 2. 各ウィンドウには期限があります(証明書の正しい提出のために短縮されます)。 3. 既存のパーティションは、partitionSize (2349 セクター) に基づいて割り当てられ、各ウィンドウを埋めます。割り当て後にセクターが残っている場合は、partitionSize 単位で Windows への入力を続けます。 セクター サイズが 32GB の場合、2349 セクター、つまり 73T になります。各ウィンドウに 1 つのセクター パーティションが含まれている場合、合計ストレージ容量は 73T * 48 = 2.25P になります。つまり、4.5P のストレージ スペースの場合、各ウィンドウには 2 つのセクター パーティションが含まれます。 保存するデータが増えると、部門も増え、Windows が占めるスペースも増えます。したがって、この計算にはさらに時間がかかることになります。 プロセス ロジックの基本を理解した後、最後に WindowPoSt で証明を生成する方法を見ていきます。これらのロジックは、rust-fil-proof または rust 形式で実装されます。 Rust から Rust まで、さまざまなインターフェースに遭遇します。 ここでは、中間インターフェースをスキップし、rust-fil-proofs のインターフェース関数を直接使用します。 post_config: &PostConfig, ランダム性: &ChallengeSeed, レプリカ: &BTreeMap<SectorId, PrivateReplicaInfo prover_id: 証明者ID、 ) -> 結果 ここで post_config は PoStConfig (構成) を意味します。 ランダム性は、セクターのクエリのリーフ データを生成するために使用されるランダム情報です。レプリカは、WindowPoSt 証明で生成されたすべてのセクターの対応するレプリカ データです。 pub fn as_v1_config(self) -> PoStConfig { sector_count と challenge_count は rust-fil-proofs/filecoin-proofs/src/constants.rs で定義されていることに注意してください。 [ (SECTOR_SIZE_2_KIB、2)、 (SECTOR_SIZE_4_KIB、2)、 (SECTOR_SIZE_16_KIB、2)、 (SECTOR_SIZE_32_KIB、2)、 (SECTOR_SIZE_8_MIB、2)、 (SECTOR_SIZE_16_MIB、2)、 (SECTOR_SIZE_512_MIB、2)、 (SECTOR_SIZE_1_GIB、2)、 (SECTOR_SIZE_32_GIB, 2349)、// これにより、133,977,564 の制約が生成され、1 つのパーティションにちょうど収まります。 (SECTOR_SIZE_64_GIB, 2300)、// これにより、131,182,800 の制約が生成され、1 つのパーティションにちょうど収まります。 ] .iter() .コピーしました() 。集める() ); たとえば、チャレンジ番号が 10 の場合、パーティションは 2349 セクターで構成され、各セクターのサイズは 32 GB になります。 5.2 課題の創出 各セクターには 10 枚のチャレンジ リーフが含まれています。 計算方法は次のとおりです (storage-proofs/post/src/fallback/vanilla.rs の prove_all_partitions 関数): .into_par_iter() .map(|n| { challenge_index = ((j * num_sectors_per_chunk + i) とします。 * pub_params.チャレンジカウント + n) を u64 として challenged_leaf_start = generate_leaf_challenge( とする pub_params、 pub_inputs.ランダム性、 セクターID.into()、 チャレンジインデックス、 )?;tree.gen_cached_proof(challenged_leaf_start を usize、levels として) }) .collect::<Result<Vec<_>>>()?; Challenge_index は、部門が証明する必要があるすべての課題のインデックスです。 generate_leaf_challenge は、ランダム情報、セクター インデックス、チャレンジ インデックスに基づいてリーフ インデックスを生成します。 hasher.input(AsRef::<[u8]>::as_ref(&randomness)); hasher.input(§or_id.to_le_bytes()[..]); hasher.input(&leaf_challenge_index.to_le_bytes()[..]); hash = hasher.result(); leaf_challenge = LittleEndian::read_u64(&hash.as_ref()[..8]); challenged_range_index = leaf_challenge % (pub_params.sector_size / NODE_SIZE as u64); 次に、ランダム データ、セクター ID、チャレンジ リーフ インデックスに対してハッシュ関数を使用します。結果と葉の合計数の剰余を取ります。 32 GB のセクターの場合、16 GB のリーフが得られます。 5.3 ゼロ知識証明回路 ここで説明する回路ロジックは、変数が異なることを除いて WinningPoSt 回路と同じです。 WindowPoSt のパーティション サイズのカウントは 1 ではないことに注意してください。計算方法は以下の通りです。 total_sector_count: 使用サイズ、 post_config: &PostConfig, ) -> オプション パーティション = (total_sector_count as f32 / post_config.sector_count as f32).ceil() as usize;パーティション > 1 の場合 { 一部(パーティション) } それ以外 { なし } } つまり、パーティションの数は、レプリカの数を各パーティションのセクター数 (2349) で割った数になります。 要約すると、証明(パーティション)の数は、証明する必要があるセクターの数に関連し、レプリカの数を 2349 で割った数に等しくなります。各パーティションの証明では、各セクターから 10 個のリーフ ノードが抽出されます。 WindowPoSt は、送信されたセクター データの存在を定期的に証明します。各検証期間は 1 日かかります。 1期間は48個のウィンドウで構成されます。各ウィンドウには 30 分かかります。 すべての Windows では、WindowPoSt 証明計算が必要です。証明の数は、ウィンドウ内のセクター数をパーティション内のセクター数で割った数に等しくなります。パーティション分割を証明するために、パーティションの各セクターから 10 個のリーフ ノードを抽出します。 - 終わり - |
<<: データ:ビットコインの個人投資家の数は過去5年間で着実に増加し、クジラの数は減少し、分散化は増加し続け、採用は増加しました。
>>: ヴィタリック・ブテリン氏のスピーチから貴重な情報をすべてご紹介します。 Ethereum 2.0について知っておきたいことはすべてここにあります
8月27日、ハッカー集団がランサムウェア攻撃を通じてアルゼンチンのすべての国境検問所を一時的に閉鎖し...
暗号通貨市場はここ数日、世界経済の状況に対する投資家の懸念よりも業界が先を行っているようで、不安な状...
対照的に、ビットコイン「デジタル現金」の支持者は、ビットコインの入手可能性にもっと注目しています。彼...
Bitmain は、標準コンテナで構築され、内部が単列設計で、ウォーターカーテン冷却とファン冷却を備...
10月26日、imTokenの創設者であるベンは、IOSGが主催する第7回Old Friends R...
2016 年 3 月 2 日 - Visa はブロックチェーン開発者を募集しています。 Visa の...
フィナンシャル・タイムズ紙は、人々が意思決定をする際に、一見些細で全く無関係な要素に気を取られている...
クレイジーな解説:日本銀行副総裁がブロックチェーンを取り巻くいくつかのトピックについて詳しく説明しま...
仮想経済は危機的な状況に近づいている World Digital Mining Summit (WD...
リップルは2025年にXRPL EVMサイドチェーンを立ち上げる予定だ。同時に、同社が立ち上げた米ド...
プライバシーとスケーラビリティのアップグレードである Taproot は、ビットコイン開発者によって...
ビットコイン取引所マウントゴックスの破産管財人である小林信明弁護士が提出した報告書によると、マウント...
「トラブルを起こす」あるいは「規制」という観点から見ると、ビットコインに代表されるデジタル通貨は、...
もしあなたを治療した医師が偽の学位を持っている人だった場合、あるいは偽造履歴書を持った他の応募者によ...
何もせずにお金を稼いだのですか?マイニングチャイナツアーイベント会場魔法のような 2020 年を経て...