
Filecoin – 深入理解NSE算法
PoREP算法,从window SDR改成SDR,时间并不长。新的PoREP算法NSE已经在酝酿中。NSE算法的全称:Narrow Stacked Expander PoRep。在rust-fil-proofs的feat/nse分支,可以查看NSE算法的实现。
文章使用的源代码的最后一个提交信息如下:
commit af4bdcb6da4b371230eed441218c459e99d32068 (HEAD -> feat/nse, origin/feat/nse) Merge: 7e7eab2 578d12c Author: porcuquine <[email protected]> Date: Wed May 20 12:11:43 2020 -0700 Merge pull request #1118 from filecoin-project/feat/nse-update-neptune-alt Feat/nse update neptune alt
理解NSE算法,可以从storage-proofs/porep/src/nse/vanilla/porep.rs中NarrowStackedExpander结构的replicate函数看起。
01 整体流程
NSE,之所以称为NSE,因为N,Narrow。Narrow的意思是比之前的SDR算法,窄,每次处理的数据为一个Window。
每个Window经过层层的处理,都会生成对应的Replica。所有Window对应的每一层的数据一起构建成Merkle树。所有Window对应的Replica的数据也一起构建成Merkle树。这两棵树树根的Poseidon Hash的结果作为comm_r。comm_d以及comm_r是需要上链的数据。
02 多层处理
每个window需要经过很多层的处理,这些层分为mask layer,expander layer, butterfly layer。核心逻辑在storage-proofs/porep/src/nse/vanilla/labels.rs的encode_with_trees函数中。
层数的配置,以及Expander/Butterfly的一些参数配置都没有确定。从测试代码的配置看:
let num_windows = 1; let rng = &mut XorShiftRng::from_seed(crate::TEST_SEED); let replica_id = <PoseidonHasher as Hasher>::Domain::random(rng); let config = Config { k: 8, num_nodes_window: (sector_size / num_windows) / NODE_SIZE, degree_expander: 384, degree_butterfly: 16, num_expander_layers: 8, num_butterfly_layers: 7, sector_size, };
window设置为1,expander的依赖设置为384,butterfly的依赖为16。总共15层。
Mask Layer
Mask Layer和具体的数据没有关系,和window编号/节点编号有关:
Expander Layer
Expander Layer基于ExpanderGraph生成依赖的上一层的节点的数据。这些数据和一些编号信息的sha256的结果作为新的节点的数据。示意如下:
parent节点的计算请查看storage-proofs/porep/src/nse/vanilla/expander_graph.rs中ExpanderGraphParentsIter结构的update_hash和next函数:
pub struct ExpanderGraph { /// The number of bits required to identify a single parent. pub bits: u32, /// Batching hashing factor. pub k: u32, /// The degree of the graph. pub degree: usize, } // node index - 4 bytes self.hash[..4].copy_from_slice(&self.node.to_be_bytes()); // counter - 4 bytes self.hash[4..8].copy_from_slice(&self.counter.to_be_bytes()); // padding 0 - 24 bytes for i in 8..32 { self.hash[i] = 0; } let mut hasher = Sha256::new(); hasher.input(&[&self.hash[..], &[0u8; 32]]); self.hash = hasher.finish();
简单的说,每个node依赖的parent的个数是degree*k个。parents的确定通过节点编号以及parents序号的hash结果来确定。
具体的hash计算逻辑,请查看storage-proofs/porep/src/nse/vanilla/batch_hasher.rs的batch_hash函数。
for (i, j) in (0..degree).tuples() { let k = k as u32; let (el1, el2) = (0..k).fold( (FrRepr::from(0), FrRepr::from(0)), |(mut el1, mut el2), l| { let y1 = i + (l as usize * degree as usize); let parent1 = parents[y1 as usize]; let current1 = read_at(data, parent1 as usize); let y2 = j + (l as usize * degree as usize); let parent2 = parents[y2 as usize]; let current2 = read_at(data, parent2 as usize); add_assign(&mut el1, ¤t1, &modulus); add_assign(&mut el2, ¤t2, &modulus); (el1, el2) }, ); // hash two 32 byte chunks at once hasher.input(&[&fr_repr_as_bytes(&el1), &fr_repr_as_bytes(&el2)]); }
batch hash的名称,来自于batch,在做hash之前,需要将k个parents先做模加,模加的结果再做hash。
Butterfly Layer
Butterfly Layer的计算类似于Expander Layer,不同的是获取Parents的方式以及Parents的hash计算方式。Parents的计算依赖ButterflyGraph的实现:
pub struct ButterflyGraph { /// The degree of the graph. pub degree: usize, /// The number of nodes in a window. Must be a power of 2. pub num_nodes_window: u32, /// Total number of layers. pub num_layers: u32, /// Number of butterfly layers. pub num_butterfly_layers: u32, } fn next(&mut self) -> Option<Self::Item> { if self.pos >= self.graph.degree as u32 { return None; } let parent_raw = self.node + self.pos * self.factor; // mod N let parent = parent_raw & (self.graph.num_nodes_window - 1); self.pos += 1; Some(parent) } Butterfly Layer的一个节点,依赖degree个前一层的节点。每个Parent序号的计算公式: node + pos * factor
其中,node是节点编号,pos是Parents编号,factor是系数(和层的编号有关)。这种有固定间隔的依赖形状,有点像蝴蝶翅膀的条纹,所以称butterfly layer。
所有Parents的Hash计算,相对简单,就是所有Parent数据拼接后的Hash值。
// Compute hash of the parents. for (parent_a, parent_b) in graph.parents(node_index, layer_index).tuples() { let parent_a = parent_a as usize; let parent_b = parent_b as usize; let parent_a_value = &layer_in[parent_a * NODE_SIZE..(parent_a + 1) * NODE_SIZE]; let parent_b_value = &layer_in[parent_b * NODE_SIZE..(parent_b + 1) * NODE_SIZE]; hasher.input(&[parent_a_value, parent_b_value]); } let hash = hasher.finish();
03 生成Replica
在多层处理结束后,最后一层的bufferfly layer和原始数据进行encode,生成最后的Replica layer。计算过程,就是在最后一层bufferfly layer的基础上,再做一次bufferfly计算,结果和原始数据进行大数加法计算。详细的计算过程,请查看storage-proofs/porep/src/nse/vanilla/labels.rs的butterfly_encode_decode_layer函数。
总结:
PoREP的NSE算法,是SDR算法的另外一种尝试。尝试降低单个处理的数据大小(window),尝试不采用节点的前后依赖(layer的计算可以并行),加大单层的依赖,加大layer的层数。整个算法底层还是采用sha256算法。NSE算法可以理解为安全性和性能之间平衡的一种尝试。
作者:Star Li
比推快讯
更多 >>- DFDV 增持 62,745 枚 SOL,总持有量达到 2,095,748 枚
- Bybit Q3 2025 资产配置报告:稳定币持仓下降,资金流向 SOL、XRP 等山寨币
- Radiant Capital 黑客过去 4 小时内以 4,521 美元单价购入 1,327 枚 ETH
- 美银 CEO 莫伊尼汉:美联储将不得不留意通胀
- Falcon Finance 开放 FF 代币申领钱包注册
- 花旗复盘周期首次降息前后历史模式:美股债双涨,黄金先强后平
- 央行副行长陆磊:部分境外非法平台通过虚拟货币等渠道转移资金,境内外风险形成“共振”
- 币安公布 BARD HODLer 空投代币详情:总供应量 10 亿枚,空投占比 1%
- 比特币战略储备法案获美议员及行业领袖支持
- Michael Saylor、Tom Lee 等已在美国国会山讨论建立 BTC 战略储备
- 加密交易平台 Bullish 获纽约 BitLicense 牌照,将扩展美国市场
- Bullish 获得纽约州金融服务部办法的 BitLicense
- 加密矿企 Soluna 获得 Generate Capital 高达 1 亿美元信贷额度
- 渣打银行与卡塔尔国民银行、DMZ Finance 推出代币化货币市场基金
- 分析:今晚鲍威尔或将温和暗示美联储 10 月降息
- Caliber 拟募资 1590 万美元用于增持 LINK 代币
- 分析:美联储降息虽存不确定性,但加密 ETF 需求依然强劲
- QCP:投资者需关注今晚美联储点阵图和鲍威尔措辞
- ASP 短时涨超 50%,现报 0.2178 USDT
- H100Group 增持 21 枚比特币,总持仓量增至 1046 枚
- 稳定币开发组织 DiversiFi 基金会推出 “多元稳定币” DFiUSD
- 日经新闻:预计日本央行本周将按兵不动
- 白宫贸易顾问纳瓦罗:美联储利率至少比正常水平高了 100 个基点
- 云锋金融集团旗下全资子公司完成 FOF 基金投资份额的 RWA 代币化
- glassnode:利率决议前夕,交易员正迅速买入期权对冲波动性飙升
- Curve DAO 提议为 Yield Basis 开放 6 千万 crvUSD 信贷额度
- 卡拉斯:必须打击俄罗斯银行和加密货币
- 英国 FCA 拟豁免部分加密资产公司传统金融规则
- 数据:Bitget AVNT 代币交易量全网占比 21%,居 CEX 第一
- 机构:若美联储未暗示连续降息,美元或上涨
- Forward Industries 推出 40 亿美元 ATM 计划,以支持 Solana 财库战略
- Mirror 与 Paragraph 宣布合并,Mirror 将于未来一个月内逐步关闭
- 美联储将于周四凌晨 02:00 公布利率决议
- 美联储决议前夕,长期美债收益率小幅走低
- OKX CEO Star:参与 OKX Boost 没有稳赚不赔预期,目标是连接 DEX 真实用户和优质项目方
- GenesisPlatform 旗下首款 Web3 城镇经营游戏宣布上线
- 佳兆业资本:已启动战略转型,推进香港合规框架下 RWA 代币化发展
- Metaplanet 计划到 10 月投资 12.5 亿美元增持比特币,并向其比特币收益生成部门投资 1.39 亿美元
- Bybit Web3 24 小时涨幅榜,2 个代币涨幅超 30%,CUDIS 引领涨势
- HTX DAO 与波场 TRON 将联袂打造 TOKEN2049 Afterparty,共绘 Web3 未来蓝图
- Buidlpad 已开放 BARD 额度查询,领取将于明晚 6:00 开放
- Tether CEO:开源密码管理器 PearPass 即将全平台上线
- 某 PENGU 巨鲸向币安存入 5000 万枚 PENGU
- ALPHA 短时涨超 60%,此前 Binance 宣布将下架 ALPHAUSDT 永续合约
- 币安将下线 ALPHAUSDT 永续合约并自动结算
- 英伟达 美股盘前跌超 1%
- 内容版权 RWA 交易平台 TaleX 治理代币 X 单日涨幅逾 130%,并宣布公开锁仓 85% 代币
- OKX 将开启 BARD/USDⓈ 现货交易
- 宝盛集团:美国经济数据疲软将促使美联储连续降息
- Metaplanet CEO:14 亿美元公开募股已完成,超 70 家机构投资者参投
比推专栏
更多 >>观点
比推热门文章
- 币安公布 BARD HODLer 空投代币详情:总供应量 10 亿枚,空投占比 1%
- 比特币战略储备法案获美议员及行业领袖支持
- Hyperliquid 新提案:DEX 巨头进军预测市场,联手 Kalshi 挑战 Polymarket
- Michael Saylor、Tom Lee 等已在美国国会山讨论建立 BTC 战略储备
- 加密交易平台 Bullish 获纽约 BitLicense 牌照,将扩展美国市场
- Bullish 获得纽约州金融服务部办法的 BitLicense
- 加密矿企 Soluna 获得 Generate Capital 高达 1 亿美元信贷额度
- 渣打银行与卡塔尔国民银行、DMZ Finance 推出代币化货币市场基金
- 分析:今晚鲍威尔或将温和暗示美联储 10 月降息
- Caliber 拟募资 1590 万美元用于增持 LINK 代币