Filecoin WindowPoST+rust执行逻辑

113 阅读3分钟

概述

相关文件

· p_aux

文件大小:64B,p_aux保存了 comm_c 和 comm_r_last

· sc-02-data-tree-r-last-(0~15).dat

文件大小:9586976B~9.14MiB 文件缓存了用于windowPoST证明时的merkleTree节点信息

· sealed文件

文件大小:32G/64G 保存了密封后的扇区数据,保存了merkleTree全部叶子节点信息

merkle Tree R Last

以64G扇区为例:
包括2个SubTree,每个SubTree包括8个BaseTree。

image.png

每个BaseTree高度为10层,度为8。每个sc-02-data-tree-r-last-(0~15).dat文件保存了前7层的299593个节点,sealed文件保存了所有BaseTree的总共134217728*16个叶子节点。

执行流程

上层调用

pub unsafe extern "C" fn fil_generate_window_post(

    randomness: fil_32ByteArray,

    replicas_ptr: *const fil_PrivateReplicaInfo,

    replicas_len: libc::size_t,

    prover_id: fil_32ByteArray,

) -> *mut fil_GenerateWindowPoStResponse

传入 随机值、扇区信息列表、节点id。

1. fil_generate_window_post()和filecoin_proofs_api::post::generate_window_post()

    pub unsafe extern "C" fn fil_generate_window_post(

        randomness: fil_32ByteArray,

        replicas_ptr: *const fil_PrivateReplicaInfo,

        replicas_len: libc::size_t,

        prover_id: fil_32ByteArray,

    ) -> *mut fil_GenerateWindowPoStResponse

     

    pub fn generate_window_post(

        randomness: &ChallengeSeed,
        replicas: &BTreeMap<SectorId, PrivateReplicaInfo>,

        prover_id: ProverId,

    ) -> Result<Vec<(RegisteredPoStProof, SnarkProof)>>

将go层传入的数据转化为下层函数需要的数据格式

参数****Type****
随机值[u8; 32]
节点号[u8; 32]
扇区信息PrivateReplicaInfo
    pub struct PrivateReplicaInfo {

        /// The version of this replica.

        pub(crate) registered_proof: RegisteredPoStProof,

        /// The replica commitment.

        pub(crate) comm_r: Commitment,

        /// Contains sector-specific (e.g. merkle trees) assets

        pub(crate) cache_dir: PathBuf,

        /// Contains the replica.

        pub(crate) replica_path: PathBuf,

    }

filecoin_proofs_api::post::generate_window_post()函数还根据扇区类型的不同确定需要生成的merkleTree格式。(32G没有SubTree、64G有两个SubTree)和sc-02-data-tree-r-last-(0~15).dat文件

2.  generate_window_post_inner()

    fn generate_window_post_inner<Tree: 'static + MerkleTreeTrait>(

        registered_proof_v1: RegisteredPoStProof,

        randomness: &ChallengeSeed,

        replicas: &BTreeMap<SectorId, PrivateReplicaInfo>,

        prover_id: ProverId,

    ) -> Result<Vec<(RegisteredPoStProof, SnarkProof)>>

主要功能是遍历所有扇区根据cache_dir路径读取p_aux文件,获取 comm_c和comm_r_last信息。

pub struct PrivateReplicaInfo<Tree: MerkleTreeTrait> {

    /// Path to the replica.

    replica: PathBuf,

    /// The replica commitment.

    comm_r: Commitment,

    /// Persistent Aux.

    aux: PersistentAux<<Tree::Hasher as Hasher>::Domain>,

    /// Contains sector-specific (e.g. merkle trees) assets

    pub cache_dir: PathBuf,

}
pub struct PersistentAux<D> {

    pub comm_c: D,

    pub comm_r_last: D,

}

为调用下个函数生成 PrivateReplicaInfo 参数信息

3. filecoin_proofs_v1::generate_window_post()

pub fn generate_window_post<Tree: 'static + MerkleTreeTrait>(

    post_config: &PoStConfig,

    randomness: &ChallengeSeed,

    replicas: &BTreeMap<SectorId, PrivateReplicaInfo<Tree>>,

    prover_id: ProverId,

) -> Result<SnarkProof>

核心功能:生成merkleTree

根据提供的扇区信息,读取sc-02-data-tree-r-last-(015).dat文件生成16个BaseTree,生成的BaseTree只需要读取sc-02-data-tree-r-last-(015).dat文件的最后32个字节信息。BaseTree的高度是10层,其中8~9层节点没有数据,需要时通过子节点生成,通过16个BaseTree创建两个SubTree。每个SubTree有8个BaseTree。两个SubTree构成了TopTree。

4. FallbackPoStCompound::prove()

fn prove<'b>(

        pub_params: &PublicParams<'a, S>,

        pub_in: &S::PublicInputs,

        priv_in: &S::PrivateInputs,

        groth_params: &'b groth16::MappedParameters<Bls12>,

    ) -> Result<MultiProof<'b>>

生成证明的主体函数,主要有3个函数,prove_all_partitions()生成挑战的partion,verify_all_partitions()验证partion的有效性,circuit_proofs()生成电路证明。

· prove_all_partitions()

fn prove_all_partitions(

        pub_params: &Self::PublicParams,

        pub_in: &Self::PublicInputs,

        priv_in: &Self::PrivateInputs,

        partition_count: usize,

    ) -> Result<Vec<Self::Proof>>

以每个partion2300个扇区将扇区列表分成若干个partion。每个扇区windowPost进行10次挑战,计算randomness、sector_id、challenge_index的hash算出当前挑战的叶子节点编号。challenge_index是输入的所有扇区的挑战的次序号。由于没有第8、9层节点的数据,需要根据叶子节点的信息生成需要的8、9层节点信息,每层需要7个节点信息,所以每次挑战需要被挑战节点周围的512个节点数据。将挑战节点加每层7个节点生成证明数据。