值得信赖的区块链资讯!
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
比推快讯
更多 >>- Solana Company推出SOL质押贷款,股价大涨17%
- CryptoQuant:比特币"终极"熊市底部在5.5万美元左右
- Tether战略投资Hyperliquid前端Dreamcash,推TSLA、黄金等永续合约
- 特朗普媒体与科技集团再次申请发行比特币、以太坊ETF
- 加密团体反击华尔街银行家,提出稳定币奖励新规则
- 数据:248.34 枚 BTC 从 Cumberland DRW 转出,价值约 1036 万美元
- 数据:过去 24h Binance 净流入 1.65 亿 USDT
- 前特朗普顾问因推广“Let‘s Go Brandon”模因币遭集体诉讼
- 大和资本:CPI 与就业数据支撑美联储三月维持利率不变
- 数据:900.11 万枚 TRX 从 FarFuture 转入 Binance,价值约 251.79 万美元
- 数据:2000 枚 ETH 从 Wintermute 转出,价值约 412.53 万美元
- 据比推数据,BTC现报69077.40美元,24小时涨幅为5.29%,价格波动较大,请谨慎交易,控制风险。
- 据比推数据,ETH现报2060.69美元,24小时涨幅为7.31%,价格波动较大,请谨慎交易,控制风险。
- 数据:661.19 枚 BTC 从 Coinbase 转出,经中转后流入 Crypto.com
- 分析师:关税通胀将继续传导,美联储年内料降息两次
- Binance 解雇揭露 10 亿美元 USDT 涉伊资金流向的高级调查人员
- 币安被曝与伊朗实体交易超 10 亿美元后解雇至少 4 名内部调查员
- 现货黄金日内上涨 100 美元,现报 5023.15 美元/盎司
- COIN 涨近 16%,美股加密货币概念股涨幅扩大
- 美国最高法院将于 2 月 20 日就特朗普关税案公布意见
- 数据:今日加密货币市值前 100 代币涨跌
- DeFi 教育基金会敦促英国监管机构收紧“控制”定义避免误伤开发者
- 联邦快递加入 Hedera 网络理事会,並运行网络节点
- 特朗普顾问 Epshteyn 等人因推广 Meme 币“Let’s Go Brandon”被投资者提起集体诉讼
- 数据:ETH 全网合约持仓量 24h 增长 6.47%
- 分析:美国 CPI 低于预期,比特币反弹至 6.9 万美元,降息预期仍偏低
- 大都会人寿:美国通胀未受关税影响,降息预期维持不变
- 分析:CPI 数据发布后比特币短线上涨,市场动能或将逐步回升
- Anchorage Digital、Kamino 与 Solana Company 推出三方托管模式,支持机构质押 SOL
- Coinbase 财报不及预期后股价反弹,抄底资金押注加密市场触底
- 过去 1 小时全网爆仓 1.03 亿美元,主爆空单
- Web3 娱乐公司 YOAKE 完成 320 万美元战略轮融资,索尼创新基金参投
- 美联储拟任命华尔街银行律师奎恩为监管事务主任
- SBI 拟收购新加坡交易平台 Coinhako 控股权
- 今日美国比特币 ETF 净流出 5042 枚 BTC,以太坊 ETF 净流出 73075 枚 ETH
- glassnode:BTC 期权显示市场防御性情绪增强,下行保护需求增加
- ETH 突破 2000 USDT,24H 涨幅 1.03%
- 以太坊巨鲸疑似抛售近 15,000 枚 ETH,或亏损 139.4 万美元
- 某巨鲸向 HyperLiquid 存入 200 万美元并 20 倍做多 ETH 和 SOL
- 某新地址增持 310 枚 BTC,价值约 2086 万美元
- 美股开盘加密货币概念股大幅上涨,COIN 涨 7.35%
- 美股开盘,道指跌 0.03%,Rivian 大涨 27%
- 反通胀趋势持续,为今年晚些时候降息铺平道路
- 日本金融集团 SBI 拟收购数字资产交易平台 Coinhako 多数股权
- 美股开盘加密板块普涨,Circle 上涨 3.85%
- 某鲸鱼向 Hyperliquid 存入 200 万枚 USDC 开设 ETH 和 SOL 多单
- 分析师:强劲就业数据锁死降息空间
- Phil Orlando:1 月 CPI 报告对美联储是个好消息
- 某鲸鱼过去 24 小时向 OKX 存入 14745 枚 ETH
- 美联储将任命 Randall Guynn 担任监管与监督总监
比推专栏
更多 >>- Happy new year【Horse success】|0213Asian
- Was it finished?|0206 Asian
- 围猎以太坊多头:「巨鲸」们暴亏 70 亿美元,正被集体围观
- Challenge,risk And chances|0130 Asian
- Meta 豪赌 AI:砸钱 1350 亿美元,2026 的扎克伯格,值得相信么?
- Variables: Terrible snowstorm|0128 Asian
- 英特尔「生死线」时刻:在 ICU 门前,陈立武如何清算遗产并开启自救?
- 從1月13號到今天,提前到5100|0126Asian
- You Should work HARDER in 2026|0120 Asian
- 硅谷最聪明那群人的「终极推演」:2026,我们应该「All-In」什么?
观点
比推热门文章
- Solana Company推出SOL质押贷款,股价大涨17%
- CryptoQuant:比特币”终极”熊市底部在5.5万美元左右
- Tether战略投资Hyperliquid前端Dreamcash,推TSLA、黄金等永续合约
- 特朗普媒体与科技集团再次申请发行比特币、以太坊ETF
- 加密团体反击华尔街银行家,提出稳定币奖励新规则
- 数据:248.34 枚 BTC 从 Cumberland DRW 转出,价值约 1036 万美元
- 数据:过去 24h Binance 净流入 1.65 亿 USDT
- 当 AI 学会自己付钱,大厂们在背后抢什么
- 前特朗普顾问因推广“Let‘s Go Brandon”模因币遭集体诉讼
- 大和资本:CPI 与就业数据支撑美联储三月维持利率不变
比推 APP



