
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
比推快讯
更多 >>- 鲍威尔:过去几年中稳定币行业已逐步成熟,更加成为主流
- Fragmetric 基金会宣布推出 FRAG 代币,10%总供应量分配给社区
- 特朗普讲话结束后,ETH 回升 2%抹平此前跌幅
- 某鲸鱼将 274,788.6 枚 SOL 转入 Hyperliquid,创下该平台迄今最大宗现货资产存款
- 鲍威尔:美元仍是全球储备货币,预计将持续很长一段时间
- 特朗普:已开始面试下一任美联储主席
- Coatue 创始人 Philippe Laffont:每天都在想为什么我没有比特币
- 鲍威尔:美国财政政策可能会推高通胀
- 鲍威尔:逐步退出充裕的储备将需要数年时间
- 数据:某以太坊 IC0 参与者向 Kraken 转入 5000 枚 ETH
- GameStop 额外募集 4.5 亿美元拟用于增持比特币
- 特朗普称以伊冲突可能会再次爆发,ETH 短时下跌 1.5%
- Greeks.live:市场关注比特币在 10.48 万美元和 10.8 万美元两个关键水平
- 英伟达市值超越微软,成为全球市值最高公司
- Paxos:稳定币基础设施需求正在激增
- Tether CEO:Tether 支持的脑机接口公司 Blackrock Neurotech 比 Neuralink 先进得多
- H100 Group 宣布增持 19.38 枚 BTC,总持有量突破 200 枚
- 某波段鲸鱼花费 609 万美元在链上买入 2484 枚 ETH
- 香港证监会:6 支虚拟资产现货 ETF 推出以来总市值已上升 95%
- 美联储柯林斯:预计今年晚些时候降息是合适的
- RWA 代币化公司 Unitronix 拟购买 200 万美元比特币作为核心储备资产
- 美联储柯林斯:货币政策处于良好位置,当前是保持谨慎的时机
- Crypto.com 为旗下合规托管机构提供 1.2 亿美元保险
- 数据:某合约巨鲸空单被强平 2 成仓位,本次做空已浮亏 832 万美元
- 美股加密概念股普涨,COIN 上涨 5.23%
- Ethena Labs 与德国监管机构就 USDe 稳定币持有者的赎回计划达成一致
- 某鲸鱼过去 1 小时出售 4000 枚 ETH,价值约合 970 万美元
- 伯恩斯坦将 Coinbase 股票目标价大幅上调至 510 美元
- 俄罗斯卢布稳定币 A7A5 推出以来完成约 93 亿美元交易
- 特朗普家族已与 HUT 8 合作,后者将负责建设并运营其比特币挖矿业务
- Moca 基金会推出 Moca Chain,用于自主主权、保护隐私的身份和用户验证
- Aethir 与 Pendle 达成合作拟推出 eATH 池
- 李林旗下公司 Avenir Tech 购入老虎证券 5.9%股票
- Starknet 生态项目 zkLend 宣布关停,仅剩 20 万美元国库资金,将继续追缴此前被盗资产
- CodexField 获 Gate Labs 投资,打造原生金融属性的内容资产网络
- 美商务部长:鲍威尔无视关税收入,降息 1%美国能节省数千亿美元利息支出
- Matador 增持 8.4 枚 BTC,当前比特币总持有量已达 77 枚
- 美 GENIUS 法案推进陷入分歧
- Tether CEO:2025 年底 Tether 将成为最大的比特币矿企
- DeFi 协议 Grove 承诺投入 10 亿美元推动传统金融资产与 DeFi 相结合
- AguilaTrades 再次开启 20 倍 BTC 多单,仓位价值 1.37 亿美元
- 挪威矿企 Green Minerals 购入 4 枚比特币作为储备策略
- 标普 500 及纳斯达克 100 指数期货创下历史新高
- 加密货币支付卡公司 Baanx 宣布支持 BNB
- Tether CEO:不追求短期利润,将押注 AI、去中心化基础设施等
- Swift 亚太区总裁:对稳定币持中立观察态度,需面对最后一公里问题
- Ledger CEO:主张降低监管并确保加密创新持续进行
- Coinbase 德国高管通过高端服务争取保守型投资者进入加密市场
- 观点:BTC.com 矿池流向 Binance 的 BTC 数量不断下降,或表明市场预期 BTC 将创下新高
- Binance Alpha(CARV)空投数据:82%账户已卖出,单号收益约为 57 美元
比推专栏
更多 >>观点
比推热门文章
- 某鲸鱼将 274,788.6 枚 SOL 转入 Hyperliquid,创下该平台迄今最大宗现货资产存款
- 鲍威尔:美元仍是全球储备货币,预计将持续很长一段时间
- 特朗普:已开始面试下一任美联储主席
- Coatue 创始人 Philippe Laffont:每天都在想为什么我没有比特币
- 鲍威尔:美国财政政策可能会推高通胀
- 鲍威尔:逐步退出充裕的储备将需要数年时间
- GSR 系统性升级 0TC 平台,拓展法币与加密资产交易能力
- 数据:某以太坊 IC0 参与者向 Kraken 转入 5000 枚 ETH
- GameStop 额外募集 4.5 亿美元拟用于增持比特币
- 特朗普称以伊冲突可能会再次爆发,ETH 短时下跌 1.5%