验证comm_r是由comm_c和comm_r_last计较得出的。
友情提示:
简而言之,它是利用random_provider_id的random_information和该扇区的随机数来计较sha256的哈希值。计较功效和当前有限的扇区数是模数。即,sector_index是最终质询的扇区ID。
验证叶节点可以正确计较Merkle树的根。
pub const WINNING_POST_CHALLENGE_COUNT: usize = 66;pub const WINNING_POST_SECTOR_COUNT: usize = 1;
// 1. Verify H(Comm_C || comm_r_last) == comm_r { let hash_num = <Tree::Hasher as Hasher>::Function::hash2_circuit( cs.namespace(|| "H_comm_c_comm_r_last"), &comm_c_num, &comm_r_last_num, )?;// Check actual equality constraint::equal( cs, || "enforce_comm_c_comm_r_last_hash_comm_r", &comm_r_num, &hash_num, ); }
1.回覆“Filecoin”即可得到Filecoin项目中文版、英文版白皮书
// 2. Verify Inclusion Paths for(i,(leaf,path))in leafs.iter().zip(paths.iter()).enumerate() { PoRCircuit::<Tree>::synthesize( cs.namespace(|| format!("challenge_inclusion_{}", i)), Root::Val(*leaf), path.clone(), Root::from_allocated::<CS>(comm_r_last_num.clone()), true, )?;
让我们先来谈谈winningPoSt。顾名思义,winningPoSt是得胜时的PoSt。所谓得胜就是得到区块权。
func (m *Miner) mineOne(ctx context.Context, addr address.Address, base *MiningBase) (*types.BlockMsg, error) {mbi, err := m.api.MinerGetBaseInfo(ctx, addr, round, base.TipSet.Key())rand, err := m.api.ChainGetRandomness(ctx, base.TipSet.Key(), crypto.DomainSeparationTag_WinningPoStChallengeSeed, base.TipSet.Height()+base.NullRounds, nil) prand := abi.PoStRandomness(rand) postProof, err := m.epp.ComputeProof(ctx, mbi.Sectors, prand)
挑战叶子选择逻辑
简朴地说,winningPoSt是一个随机查抄的扇区,该扇区中66条随机选择的Merkle路径可以是正确的。然后说说代码逻辑。从Lotus的代码来讲。这一切都从Lotus / miner / miner.go的Miner布局的mineOne函数的块开始。
——End——
零常识证明的计较部门可以在rust-fil-proofs / post / fallback目次中查察。
LotusPoSt的一部门已从竞选PoSt变动为两个新的PoSt,一个是winningPoSt,另一个是windowPoSt。
因为这些逻辑的特定实现是在rust-fil-proofs(即rust语言)中实现的。从防锈到防锈,很多接口被交错:
仅先容rust-fil-proofs提供的两个API函数,,就不会先容中间的接口。
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。