概述
相关文件
· 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。
每个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个节点生成证明数据。