fvm_shared/sector/
post.rs

1// Copyright 2021-2023 Protocol Labs
2// Copyright 2019-2022 ChainSafe Systems
3// SPDX-License-Identifier: Apache-2.0, MIT
4
5use cid::Cid;
6use fvm_ipld_encoding::strict_bytes;
7
8use super::*;
9use crate::ActorID;
10use crate::randomness::Randomness;
11
12/// Randomness type used for generating PoSt proof randomness.
13pub type PoStRandomness = Randomness;
14
15/// Information about a sector necessary for PoSt verification
16#[derive(Debug, PartialEq, Clone, Eq, Serialize_tuple, Deserialize_tuple)]
17pub struct SectorInfo {
18    /// Used when sealing - needs to be mapped to PoSt registered proof when used to verify a PoSt
19    pub proof: RegisteredSealProof,
20    pub sector_number: SectorNumber,
21    pub sealed_cid: Cid,
22}
23
24/// Proof of spacetime data stored on chain.
25#[derive(Debug, PartialEq, Clone, Eq, Serialize_tuple, Deserialize_tuple)]
26pub struct PoStProof {
27    pub post_proof: RegisteredPoStProof,
28    #[serde(with = "strict_bytes")]
29    pub proof_bytes: Vec<u8>,
30}
31
32#[cfg(feature = "arb")]
33impl quickcheck::Arbitrary for PoStProof {
34    fn arbitrary(g: &mut quickcheck::Gen) -> Self {
35        let registered_postproof = g
36            .choose(&[
37                RegisteredPoStProof::StackedDRGWinning2KiBV1,
38                RegisteredPoStProof::StackedDRGWinning8MiBV1,
39                RegisteredPoStProof::StackedDRGWinning512MiBV1,
40                RegisteredPoStProof::StackedDRGWinning32GiBV1,
41                RegisteredPoStProof::StackedDRGWinning64GiBV1,
42                RegisteredPoStProof::StackedDRGWindow2KiBV1P1,
43                RegisteredPoStProof::StackedDRGWindow8MiBV1P1,
44                RegisteredPoStProof::StackedDRGWindow512MiBV1P1,
45                RegisteredPoStProof::StackedDRGWindow32GiBV1P1,
46                RegisteredPoStProof::StackedDRGWindow64GiBV1P1,
47            ])
48            .unwrap();
49        PoStProof {
50            post_proof: *registered_postproof,
51            proof_bytes: Vec::arbitrary(g),
52        }
53    }
54}
55
56/// Information needed to verify a Winning PoSt attached to a block header.
57/// Note: this is not used within the state machine, but by the consensus/election mechanisms.
58#[derive(Debug, PartialEq, Default, Clone, Eq, Serialize_tuple, Deserialize_tuple)]
59pub struct WinningPoStVerifyInfo {
60    pub randomness: PoStRandomness,
61    pub proofs: Vec<PoStProof>,
62    pub challenge_sectors: Vec<SectorInfo>,
63    /// Used to derive 32-byte prover ID
64    pub prover: ActorID,
65}
66
67/// Information needed to verify a Window PoSt submitted directly to a miner actor.
68#[derive(Debug, PartialEq, Default, Clone, Eq, Serialize_tuple, Deserialize_tuple)]
69pub struct WindowPoStVerifyInfo {
70    pub randomness: PoStRandomness,
71    pub proofs: Vec<PoStProof>,
72    pub challenged_sectors: Vec<SectorInfo>,
73    pub prover: ActorID,
74}
75
76/// Information submitted by a miner to provide a Window PoSt.
77#[derive(Debug, PartialEq, Default, Clone, Eq, Serialize_tuple, Deserialize_tuple)]
78pub struct OnChainWindowPoStVerifyInfo {
79    pub proofs: Vec<PoStProof>,
80}