
Filecoin - winningPoSt逻辑介绍
随机抽查:从总可用sector中随机选择一个sector。该过程通过计算节点ID和特定随机值的哈希值来实现。 Leaf挑战:在所选sector中,计算叶子节点的索引。 随机挑战索引:对Merkle树中的叶子节点随机挑战。 路径验证:验证挑战的叶子节点是否存在正确的路径到Merkle树的根。 获取Sector索引:
发布日期:2021-05-19 18:16:48
浏览次数:12
分类:精选文章
本文共 1815 字,大约阅读时间需要 6 分钟。
Lotus的PoSt概述:winningPoSt与windowPoSt的实现细节
PoSt的背景与应用
在Lotus网络中,PoSt(Proof of Space)是验证节点贡献资源以参与网络共识的过程。Lotus的PoSt分为两种形式:winningPoSt和windowPoSt。以下将详细介绍winningPoSt的实现细节及其背后的逻辑。
winningPoSt的定义
winningPoSt是节点参与PoSt提案时需提交的PoSt类型。名称来源于其在成功获取出块权时的应用场景。依据Lotus协议,节点需在指定sector中抽查66个叶子节点的Merkle路径,并验证其正确性。
Sector抽查过程
Sector选择
Leaf抽查
在选择sector后,需对其Merkle树进行叶子节点抽查。具体实现包括:
代码逻辑分析
Go代码中的实现
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) return postProof, err}
代码中MinerGetBaseInfo
获取基本信息,包括需要抽查的sector信息;ComputeProof
计算winningPoSt证明。尽管代码到Rust的fil-proofs层面,但核心逻辑具备清晰的步骤。
Rust实现的接口
代码逻辑跨越文件和文件,将Sector抽查与randomness处理整合。图片显示核心接口展示了 midfielder 的逻辑结构,包括sector和Merklize相关函数。
Sector挑战生成
代码逻辑详解
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;
该部分生成哈希值,计算后进行模运算,确定被抽中的Sector编号。
- 抽取叶子索引:类似地,叶子抽查通过哈希和模运算获取具体索引。
zeroknowledge circuit的实现
核心逻辑位于circuit.rs
,通过Synthetize函数验证Merkle路径的正确性。代码通过num类型表示数值,构建计算约束以确保数据有效性。
总结
winningPoSt是Lotus节点获取出块权的关键PoSt类型。其核心逻辑包括对sector的随机抽查、叶子抽查,并通过零知识证明验证路径的正确性。理解这部分机制有助于深入掌握Lotus网络的共识机制。
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年04月15日 20时28分50秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
二叉树排序树的操作
2019-03-17
Eclipse运行别人项目出错,即tomcat和jdk不匹配
2019-03-17
'spring.dubbo.server' is an unknown property
2019-03-17
JUC-1.2-线程池-钩子方法的使用
2019-03-17