值得信赖的区块链资讯!
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
比推快讯
更多 >>- 数据:ETH 当前全网 8 小时平均资金费率为 0%
- 数据:12.08 万枚 SOL 从 Bullish.com 转出,价值约 1527 万美元
- 加密行业支持者、美参议员 Cynthia Lummis 宣布不再竞选连任
- 数据:522.5 万枚 LINK 从 Chainlink 转入 Binance,价值约 6583 万美元
- 数据:144.44 枚 BTC 从匿名地址转入 Cumberland DRW,价值约 1269 万美元
- 米兰:美联储应降息以应对就业市场风险
- 米兰:通胀指标滞后于租金通胀
- 美国SEC寻求禁止FTX前核心高管担任上市公司董事或高管长达8-10年
- 数据:ETH 全网合约持仓量 24h 增长 5.58%
- 分析师:以太坊关键支撑位为 2772 美元
- 白宫与美国能源部联合推出“创世纪计划”,CoreWeave、英伟达、OpenAI、xAI 等入选首批公司
- 数据:22.79 枚 WBTC 从 "Crypto-is-eating-the-world" 转入 Binance,价值约 201 万美元
- Monad 生态 Perp DEX LeverUp 代币 $LV 价格突破 $0.065,创历史新高
- 花旗下调部分加密股目标股价,但仍看好该行业
- DraftKings 推出受 CFTC 监管的独立预测市场应用
- 分析师:比特币或将在 86,000 至 92,000 美元区间震荡
- 克里斯·伊戈:劳动力市场疲软或促使美联储进一步降息
- 某休眠 10.4 年的以太坊预挖矿地址被激活,包含 2000 枚 ETH
- 数据:406.6 枚 BTC 从 Coinbase Prime 转出,经中转后流入 Coinbase Prime
- 联合国贸发会议:2033 年 AI 将成主导性前沿技术,区块链等技术市占比变化相对有限
- Bitwise 董事总经理:2025 年比特币 ETP 资金流入超过黄金 ETP
- 某巨鲸今日向币安转入超 400 万枚 CRV,因未在高点出售仅能获利约 40 万美元
- 高盛:预计 2026 年全球经济将增长 2.8%
- Cango 本周挖矿产出 125.8 枚 BTC,总持有量达 7290 枚
- 美联储就“支付账户”征求公众意见:符合条件金融机构可用于有限付款清算和结算
- 分析:CZ 买入 ASTER 成本价约为 0.913 美元,目前浮亏 20%
- 欧洲斯托克 600 指数突破 11 月盘中历史新高
- 美国 12 月一年期通胀率预期终值 4.2%,预期 4.1%
- 分析师:若持续抛压结束 BTC 或在三个月内升至 17 万美元
- 数据:ETH 短时拉升,5 分钟涨超 1.39%
- 纳斯达克 100 指数涨幅扩大至 1%
- Bitwise CIO:预计 2026 年加密 ETF 资金流入将创下新高
- Alliance DAO 联创:长期来看 DeFi 或将诞生“后互联网泡沫式”优质项目
- Vitalik 出售 29,500 枚 KNC 和 3050 万枚 STRAYDOG 换取 15,916 枚 USDC
- 数据:多个代币出现探底回升,CTSI 涨超 9%
- 美股开盘,道指涨 0.19%,拼多多开涨 6.3%
- 欧盟各国政府就数字欧元立场达成一致
- Hyperliquid 本周资金流出超 4.3 亿美元,创第三大单周净流出记录
- 波兰众议院再次通过《加密资产市场法案》,将被否决议案重新送交参议院
- Bubblemaps:AVA 代币在去年 11 月推出时,与部署者存在关联的 23 个钱包狙击获得供应量的约 40%
- 比特币矿企 LM Funding America 达成证券购买协议将募资 650 万美元
- 威廉姆斯:CPI 数据低于实际水平是技术因素所致
- 1250 万枚 NEWT 从 Anchorage Digital Custody 地址转入币安
- Circle CEO:2026 年稳定币将迎来爆发
- SWIFT 将引入区块链账本拓展现有金融基础设施
- 美联储威廉姆斯:美联储目前并未通过资产购买实施量化宽松
- 美联储威廉姆斯:降息与近期趋势基本一致
- 美联储威廉姆斯:预计今年经济增长率为 1.5% 至 1.75%
- 威廉姆斯:货币政策关键目标是帮助就业市场
- glassnode:比特币期权将迎历史最大规模到期日,市场仓位重置,年后波动或上升
比推专栏
更多 >>观点
比推热门文章
- 数据:12.08 万枚 SOL 从 Bullish.com 转出,价值约 1527 万美元
- 【比推每日新闻精选】Bitwise CIO:2026年将是加密ETF资金流入创纪录的一年;Tom Lee旗下基金分析师:2026年上半年BTC或跌至6万至6.5万美元;SWIFT将引入区块链账本拓展现有金融基础设施
- 加密行业支持者、美参议员 Cynthia Lummis 宣布不再竞选连任
- 深度解析Coinbase的“全能交易所”转型之路
- 哥大教授点破“巨头上链”阳谋:小心“西装舔狗”出卖加密的未来
- 数据:522.5 万枚 LINK 从 Chainlink 转入 Binance,价值约 6583 万美元
- 数据:144.44 枚 BTC 从匿名地址转入 Cumberland DRW,价值约 1269 万美元
- 米兰:美联储应降息以应对就业市场风险
- 米兰:通胀指标滞后于租金通胀
- 美国SEC寻求禁止FTX前核心高管担任上市公司董事或高管长达8-10年
比推 APP



