Filecoin - 深入理解NSE算法

2021-03-02 星想法

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 <1746729+porcuquine@users.noreply.github.com>
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函數看起。

NSE,之所以稱為NSE,因為N,Narrow。Narrow的意思是比之前的SDR算法,窄,每次處理的數據為一個Window。

每個Window經過層層的處理,都會生成對應的Replica。所有Window對應的每一層的數據一起構建成Merkle樹。所有Window對應的Replica的數據也一起構建成Merkle樹。這兩棵樹樹根的Poseidon Hash的結果作為comm_r。comm_d以及comm_r是需要上鏈的數據。

每個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, &current1, &modulus);
               add_assign(&mut el2, &current2, &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();

在多層處理結束後,最後一層的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算法可以理解為安全性和性能之間平衡的一種嘗試。

相關焦點

  • Filecoin主網上線倒計時 Filecoin單T產量計算方式背後的秘密
    太空競賽第一階段結束後多種單T產幣量算法讓投資者眼花繚亂,諸多算法背後是明爭暗鬥和營銷策略,更表達了真誠公開與否。1.官方節奏:太空競賽SpaceRace-1/2的承前啟後Filecoin太空競賽已於9月24日開啟第二階段,作為第一階段的轉承之旅,各大IPFS廠商仍要繼續奮戰,而第一階段競賽的餘音卻一直縈繞,尤其是混淆於市場範圍中和IPFS投資者的眼中。
  • 理解Filecoin循環供應
    為了更好的理解本文,閱讀者需要配合研讀Filecoin經濟相關的論文以及Filecoin Spec文檔中詳細的機制介紹。Filecoin生態系統Filecoin生態增長的動力主要來自於應用案例、工具和所有Filecoin利益相關者的基礎設施。
  • 黑犇科技丨Filecoin創始人第二階段測試網問答
    請注意,在Mainnet之後,PoRep和共識算法可能會發生變化和發展,因此ASIC可能不能奏效-胡安Q13Lotus和go-filecoin項目中有多少名專職研發人員?A:我們已經發布了一篇博客文章,描述了總體的加密經濟結構https://filecoin.io/blog/filecoin-cryptoeconomic-constructions/。這些機制中有許多已經在測試網中,我們鼓勵您嘗試一下!我們希望以後再詳細描述每種機制。僅在完成並測試所有核心機制之後,才能最終確定參數。
  • 別上當了,Filecoin礦機的確切硬體規格尚未發布(來自Filecoin官方的常見問題解答)
    介紹這些常見問題解答包括幫助那些對Filecoin網絡感興趣的人進一步理解的問題和答案:1)Filecoin協議的價值主張,以及它旨在解決的問題,2)某些協議設計決策,以及3)如何參與Filecoin網絡。如果您是Filecoin網絡的新手,我們建議您在閱讀這些常見問題解答之前瀏覽Filecoin白皮書和Filecoin入門。目錄1.
  • filecoin主網首頁數據解釋
    上圖是filfox區塊鏈瀏覽器filecoin首頁,我們按標誌的順序一一介紹。區塊高度:表示區塊鏈目前的高度。目前filecoin30秒增加一個區塊高度,一天增加2880塊全網有效算力:全網目前已經提交的有效算力,截圖顯示的是1.29EiB。大約是1352663T每區塊獎勵:每個區塊高度中獲得區塊選舉權成功提交區塊後獲得的獎勵。
  • filecoin代幣是什麼以及上線時間 filecoin幣怎麼購買?
    六年前底層協議IPFS的概念被提出,三年前項目完成融資眾籌活動,到了2020年10月15日長期備受關注的Filecoin終於兌現承諾,2020.10月15號正式啟動項目主網;同時承接最近去中心化金融以及非同質化代幣逐漸冷卻的熱度,成為新一輪市場焦點。filecoin是ipfs技術的激勵層代幣,代號fil幣。
  • Filecoin 質押部分
    Filecoin是第一個真正把質押系統放入共識的區塊鏈!這是一個創新,也是發展的需要。為什麼 Filecoin 要引入質押系統?這兩部分抵押的設計機制不同,因此算法也不一樣。本文先就承諾質押進行討論。 承諾質押顧名思義,承諾質押是用來保證承諾的執行的。那這個承諾是什麼呢?
  • Filecoin為何如此與眾不同?胡安分享Filecoin的證明系統
    當我們在2017年宣布Filecoin的時候,我們開始著手創建一個建立在強大的去中心化市場上的去中心化存儲網絡。為了培育這個市場,分散市場職能,鼓勵早期礦工的參與,我們創建了一個加密通證,這是Filecoin共識的副產品。此通證是在有用的工作(即有用的複製證明和時空證明)的基礎上生成的。
  • IPFS-Filecoin是趨勢嗎?區塊鏈挖礦賺錢是真的嗎?
    IPFS/filecoin分布式存儲和分布式文件系統就會出現,IPFS是主流分布式存儲技術的領導者。在過去的10-20年裡面,人們創造了財富,其中大部分是人類居住的房地產。然而,未來的存儲行業將解決數據駐留的問題。因此,我們將分布式存儲視為未來的數據產業,同時,IPFS/filecoin還是數據房地產的主要位置。
  • 國內filecoin礦商公司有哪些?如何判斷IPFS/ filecoin公司是否合法?
    一家正規合法的IPFS/ filecoin公司應該持有伺服器資質、IDC機房資質等運營必備證書,這是其合法的最基本證明,對於一個公司來說,到底挖什麼?IPFS挖礦是不對的,我們都是強調filecoin挖礦,要是某公司連IPFS/Filecoin兩者都說不清,或者混淆各種概念,那麼這家公司所做的IPFS/filecoin業務合法性就值得商榷,filecoin上線後,關於所有的礦商數據已經非常透明了,礦機的產幣量也很清晰,由於整個政策受到監管,投資者不必擔心IPFS/ filecoin的合法性,與此同時,隨著央行數字貨幣dcep的推出,將進一步規範數字貨幣市場
  • filecoin官方發的32頁最新的經濟模型挑幾個重點講講
    18個月的時間是控制扇區的安全係數,後續加密算法包括扇區會有迭代,所以扇區的生命周期也不能太長。以上所有質押的幣被懲罰的話,全部作銷毀,所以對於filecoin來說是一種通縮的經濟模型。第三個是代幣的供應:就是filecoin這個幣20億枚怎麼釋放,70%當中的55%礦工挖,15%做儲備。
  • Filecoin 2018 Q3和Q4更新(含Demo視頻中文版)
    實現和測試複製證明 和時空證明算法,為go-filecoin,其他filecoi實現 和其他系統。 編寫和完善協議規範。我們需要詳細的協議規範,以便擁有協議的多個獨立實現,擁有適當分散的網絡,以及評估和驗證協議安全性。
  • Filecoin周報 0.5.0 staging版正在運行測試中
    原創:IPFS原力區今天Steven、Taosheng Shi、Joss共同編制Filecoin是一個將雲存儲轉變為一個算法市場的去中心化存儲網絡。當前版本 開發網go--filecoin--0.4.6開發網go--filecoin--0.5.0(預發布)
  • 讀懂Filecoin挖礦模型
    質疑、罷工,2020年最具爭議的項目恐怕是 filecoin 了。 filecoin曾因2.57億美元的巨大融資引發關注,如今,filecoin又因上線後經濟模型等問題引發爭議,那麼filecoin究竟如何,我們研究一下。
  • Filecoin周報 證明周期縮短 更早發現問題及調試
    原創:IPFS原力區IPFS原力區今天Steven、Taosheng Shi、Joss共同編制Filecoin是一個將雲存儲轉變為一個算法市場的去中心化存儲網絡當前版本 開發網go--filecoin--0.4.6(user-devnet)
  • 鏈客Talk|Filecoin易用進階之旅:Venus(go-filecoin)的差異發展
    目前致力於Filecoin的共識算法、複製證明、經濟模型、集群架構等關鍵模塊的設計與生態建設。以下是此次活動的內容整理:主持人|大白:首先請昕哥介紹一下焜耀科技、原力區,它們分別是做什麼的、目前發展如何?
  • Filecoin的應用場景具體表現在哪幾個方面?
    Filecoin簡介Filecoin是一個去中心化分布式雲存儲網絡,它將雲存儲轉變為一個算法市場,也是IPFS技術的代幣。Filecoin的誕生意味著分布式雲存儲時代的到來。Filecoin最大的特點是存儲和檢索數據,礦工通過提供數據存儲空間和檢索來獲得token (即filecoin),filecoin通過貢獻閒置的硬碟來獎勵礦工。Filecoin網絡允許任何人成為存儲提供商並通過提供其硬碟空間來獲利以實現規模經濟。
  • filecoin幣價猜測 filecoin助力區塊鏈3.0的推進建設
    filecoin助力區塊鏈3.0的推進?人類歷史之第四次工業革命是區塊鏈。在中國「十三五」規劃之中,區塊鏈、人工智慧等技術被列為「十三五」前夕的「重大任務和重點項目」,積極鼓勵企業開展區塊鏈技術創新研究。
  • ipfs-filecoin是趨勢嗎?新商業模式分布式存儲必將帶來巨大價值
    用戶可以自由選擇礦工,交易透明,通過網絡智能合約算法保證交易的實現。通過協議互通,礦工可以實現自由流通,打破信息孤島,實現供需雙方的filecoin登陸。自動增長系統當filecoin穩定運行時,系統可以在利益驅動之下繼續自動發展。
  • Filecoin礦機單T產量計算方式背後的秘密
    1.官方節奏:太空競賽SpaceRace-1/2的承前啟後Filecoin太空競賽已於9月24日開啟第二階段,作為第一階段的轉承之旅,各大IPFS廠商仍要繼續奮戰,而第一階段競賽的餘音卻一直縈繞,尤其是混淆於市場範圍中和IPFS投資者的眼中。