okx

赢得PoST的是什么- 解读Filecoin

时间:2023-08-12|浏览:183

LotusPoSt的一部分已从竞选PoSt更改为两个新的PoSt,一个是winningPoSt,另一个是windowPoSt。

让我们先来谈谈winningPoSt。顾名思义,winningPoSt是获胜时的PoSt。所谓获胜就是获得区块权。

简单地说,winningPoSt是一个随机检查的扇区,该扇区中66条随机选择的Merkle路径可以是正确的。然后说说代码逻辑。从Lotus的代码来讲。这一切都从Lotus/miner/miner.go的Miner结构的mineOne函数的块开始。

func(m*Miner)mineOne(ctxcontext.Context,addraddress.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)

其中,MinerGetBaseInfo函数用于获取一些基本信息,包括需要提取的扇区信息。ComputeProof函数用于计算winningPoSt证明。

因为这些逻辑的特定实现是在rust-fil-proofs(即rust语言)中实现的。从防锈到防锈,许多接口被交叉:

仅介绍rust-fil-proofs提供的两个API函数,就不会介绍中间的接口。

挑战叶数

在rust-fil-proofs/filecoin-proofs/src/constant.rs中定义了要挑战的扇区数和叶子总数:

pubconstWINNING_POST_CHALLENGE_COUNT:usize=66;pubconstWINNING_POST_SECTOR_COUNT:usize=1;

也就是说,从有效扇区中提取一个扇区,并在该扇区上选择受挑战的66个叶节点。

面临挑战的行业选择逻辑

generate_winning_post_sector_challenge函数实现部门的质询逻辑。核心逻辑点如何检查部门?具体逻辑是在:

fallback::generate_sector_challenges函数中:

letmuthasher=Sha256::new;hasher.input(AsRef::<[u8]>::as_ref(&prover_id));hasher.input(AsRef::<[u8]>::as_ref(&randomness));hasher.input(&n.to_le_bytes[..]);lethash=hasher.result;letsector_challenge=LittleEndian::read_u64(&hash.as_ref[..8]);letsector_index=sector_challenge%sector_set_len;

简而言之,它是使用random_provider_id的random_information和该扇区的随机数来计算sha256的哈希值。计算结果和当前有限的扇区数是模数。即,sector_index是最终质询的扇区ID。

挑战叶子选择逻辑

generate_winning_post检查由所选扇区组成的Merkle树(replica_r_last)上的叶节点。质询叶节点的计算逻辑是通过fallback::generate_leaf_challenge函数实现的:

letmuthasher=Sha256::new;hasher.input(AsRef::<[u8]>::as_ref(&randomness));hasher.input(&sector_id.to_le_bytes[..]);hasher.input(&leaf_challenge_index.to_le_bytes[..]);lethash=hasher.result;letleaf_challenge=LittleEndian::read_u64(&hash.as_ref[..8]);letchallenged_range_index=leaf_challenge%(pub_params.sector_size/NODE_SIZEasu64);

散列随机信息,扇区ID和质询叶编号。计算结果和叶总数为模。32G扇区有1G树叶。

zk-SNARK电路

零知识证明的计算部分可以在rust-fil-proofs/post/fallback目录中查看。

在防锈/后防/后备/circuit.rs中讨论扇区结构。这种结构是一个挑战。从synthesize函数可以看出:

//1.Verifycomm_rletcomm_r_last_num=num::AllocatedNum::alloc(cs.namespace(||"comm_r_last"),||{comm_r_last.map(Into::into).ok_or_else(||SynthesisError::AssignmentMissing)})?;letcomm_c_num=num::AllocatedNum::alloc(cs.namespace(||"comm_c"),||{comm_c.map(Into::into).ok_or_else(||SynthesisError::AssignmentMissing)})?;letcomm_r_num=num::AllocatedNum::alloc(cs.namespace(||"comm_r"),||{comm_r.map(Into::into).ok_or_else(||SynthesisError::AssignmentMissing)})?;comm_r_num.inputize(cs.namespace(||"comm_r_input"))?;

comm_r其他comm_r_last和comm_c作为私有输入。

//1.VerifyH(Comm_C||comm_r_last)==comm_r{lethash_num=::Function::hash2_circuit(cs.namespace(||"H_comm_c_comm_r_last"),&comm_c_num,&comm_r_last_num,)?;//Checkactualequalityconstraint::equal(cs,||"enforce_comm_c_comm_r_last_hash_comm_r",&comm_r_num,&hash_num,);}

验证comm_r是由comm_c和comm_r_last计算得出的。

//2.VerifyInclusionPathsfor(i,(leaf,path))inleafs.iter.zip(paths.iter).enumerate{PoRCircuit::::synthesize(cs.namespace(||format!("challenge_inclusion_{}",i)),Root::Val(*leaf),path.clone,Root::from_allocated::(comm_r_last_num.clone),true,)?;

验证叶节点可以正确计算Merkle树的根。

摘要

LotusPoSt包括两个部分:winningPoSt和windowPoSt。WinningPoSt是获得块权限时需要提供的PoSt证书。从所有有效扇区中提取一个扇区,并挑战该扇区上的66张叶子。

——End——

友情提示:

在星际视界(IPFSNEW)公众号回复关键字

1.回复"Filecoin"即可获得Filecoin项目中文版、英文版白皮书

2.回复"IPFS"即可获得IPFS项目中文版、英文版白皮书

编辑:星际视界IPFSNEWSSue

« 上一条| 下一条 »
区块链交流群
数藏交流群

合作伙伴

在区块链世界中,智能合约不仅是代码的信任,更是商业的革命。通过了解其在供应链、版权保护等领域的应用,您将真正体验到智能合约的无限可能性
区块链世界GxPiKaQiu.com ©2020-2024版权所有 桂ICP备16002597号-2