div#pop_ad { opacity: 0; }
AD
首页 > 数字货币 > 正文

Filecoin 解读|赢得PoST的是什么?-挖币网_比特币BTC_以太坊ETH_IPFS矿机挖矿

[2021-01-29 00:12:46] 来源: 编辑:wangjia 点击量:
评论 点击收藏
导读: LotusPoSt的一部分已从竞选PoSt更改为两个新的PoSt,一个是winningPoSt,另一个是windowPoSt。让我们先来谈谈winningPoSt。顾名思义,winningPoSt是

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

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

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

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)

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

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

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

挑战叶数

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

pub const WINNING_POST_CHALLENGE_COUNT: usize = 66;
pub const WINNING_POST_SECTOR_COUNT: usize = 1;

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

面临挑战的行业选择逻辑

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

fallback :: generate_sector_challenges函数中:

let mut hasher = Sha256::new();
hasher.input(AsRef:: [u8] ::as_ref( prover_id));
hasher.input(AsRef:: [u8] ::as_ref( randomness));
hasher.input( n.to_le_bytes()[..]);let hash = hasher.result();let sector_challenge = LittleEndian::read_u64( hash.as_ref()[..8]);
let sector_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函数实现的:

let mut hasher = Sha256::new();
hasher.input(AsRef:: [u8] ::as_ref( randomness));
hasher.input( sector_id.to_le_bytes()[..]);
hasher.input( leaf_challenge_index.to_le_bytes()[..]);
let hash = hasher.result();let leaf_challenge = LittleEndian::read_u64( hash.as_ref()[..8]);let challenged_range_index = leaf_challenge % (pub_params.sector_size / NODE_SIZE as u64);

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

zk-SNARK电路

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

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

// 1. Verify comm_r
       let comm_r_last_num = num::AllocatedNum::alloc(cs.namespace(|| comm_r_last ), || {
           comm_r_last
               .map(Into::into)
               .ok_or_else(|| SynthesisError::AssignmentMissing)
       })?;let comm_c_num = num::AllocatedNum::alloc(cs.namespace(|| comm_c ), || {
           comm_c
               .map(Into::into)
               .ok_or_else(|| SynthesisError::AssignmentMissing)
       })?;let comm_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. Verify H(Comm_C || comm_r_last) == comm_r
       {
           let hash_num =::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,
           );
       }

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

// 2. Verify Inclusion Paths for(i,(leaf,path))in leafs.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树的根。

摘  要

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

——End——



声明:此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网站所提供的信息,只供参考之用。


VeryHash.com 成立于2018年11月,是一家注册在香港,以构建以算力为基石的全球化金融服务平台为目标的科技公司。 创始团队拥有多年互联网、金融和区块链算力服务从业经历,在研究整个区块链产业链后,发现算力是一个高收益、高门槛、低流通性的投资产品,用户群体随区块链用户增长而提高的增量市场,于是在18年创立VeryHash,专注算力资产的金融服务,致力于提高算力的流通性。VeryHash结合自身优势,立足全球市场,现在全球用户10万+,七日内活跃用户1万+。
奶牛算力是一个布局区块链数字货币全产业链的高科技平台。目前在新疆、四川等地建有7个大型云计算机房,用电总负荷超过50万千瓦时,累计投资超10亿元。凭借在区块链矿业雄厚的资源,为用户提供新型的算力投资产品。由于更稳定灵活回报,自上线以来一直受到用户的狂热的追捧。
查看更多:

为您推荐