在一個典型的第一層鏈,如以太坊,狀態轉換系統是這樣的:
鏈上儲存和計算
節點接收交易,其中包括要呼叫的智慧合約和方法等資料,以及該方法的輸入。節點讀取當前狀態並執行建立新狀態的交易,並將該狀態儲存在同一個節點中。這意味著所有計算交易的冗餘節點也將所有相同的資訊冗餘地儲存在它們自己的節點中。我們將在下一節中看到,可以將儲存解除安裝到獨立的鏈下儲存節點中。鏈下儲存當我們開始將儲存抽象到一個外鏈下提供者時,我們立即減少了冗餘儲存需求。在此場景中,當鏈節點接收到交易時,必須從儲存節點獲取初始狀態。計算完成後,鏈節點將結果狀態傳送到儲存節點進行持久化。使用鏈上計算的鏈下儲存
還有一個額外的步驟,即計算節點必須驗證從儲存節點接收到的資料。這個鏈節點只儲存資料的指紋以檢查完整性。例如,如果使用IPFS進行鏈下儲存,則鏈節點儲存資料的內容雜湊值。當從儲存節點接收到資料時,區塊鏈節點重新計算內容雜湊值,以驗證其所期望的資料。同樣,在計算輸出狀態之後,資料被鏈下儲存在IPFS上,其內容散雜湊值儲存在鏈上以供參考。需要注意的一件重要事情是,當將儲存置於鏈下狀態時,我們就失去了ACID(原始性、一致性、隔離性、耐久性)模型中的耐久性原則。讓資料在鏈上活動可以保證資料是可用的,但是將資料移到鏈下只能保證我們能夠驗證資料的完整性(一致性)。一些使用鏈下儲存的專案是謎;其中只有一個引用儲存在鏈上;使用以代理為中心的架構,其中每個dapp維護自己的分散式雜湊值表;如果對等節點只維護一個區域檔案,就會指定從哪裡下載資料;所有的應用程式都作為旁路執行,儲存自己的資料,沒有應用程式資料鏈。Dispatch Labs ; 指紋儲存在鏈上,具有透過資料農上傳和下載資料的能力,MultiChain ; 其中資訊可以釋出到離線流,節點可以訂閱這些流,Polkadot: 其中每個並行鏈(parachain)負責儲存它們自己的資料,而中繼鏈主要儲存會計資訊和塊頭。以太坊正在考慮一種狀態儲存的租用方法,在這種方法中,節點可以付費儲存資料,否則它們只儲存指紋。鏈下計算相似儲存如何可以鏈下解除安裝,計算可以以類似的方式解除安裝。狀態轉移功能可以由一個單獨的節點計算到鏈節點的狀態轉移函式。這裡我們展示了一個鏈節點如何將計算解除安裝,而計算節點從鏈節點讀取資料:鏈上儲存和離線計算
在這個場景中,所有資料都儲存在鏈上,鏈節點將計算請求連同所需的資料一起傳送給鏈下計算節點。鏈下節點執行狀態轉換函式來計算輸出狀態。由於計算是在鏈下解除安裝的,鏈節點現在需要對結果狀態進行驗證,因為計算節點可能報告錯誤的輸出狀態。驗證機制可以簡單地驗證結果輸出是由計算節點簽名的,而計算節點是鏈節點期望結果來自的節點。在驗證完成後,將儲存新狀態。Serverless(無伺服器)由於計算與區塊鏈節點解耦,這意味著計算可以作為無伺服器函式執行,如onLamba、OpenFaaS或Kubeless。鏈下計算允許將區塊鏈分類帳維護狀態與無伺服器功能相結合。您可以想象一個由鏈節點、任務協調器和工作人員組成的生態系統:鏈下工人叢集
例如,可以使用區塊鏈作為基於事件的系統來註冊發起鏈下工作的交易。您可以有一個Kubernetescluster,其中主節點監視on-chain請求,並以任務的形式將工作負載分配給它各自的工作節點,任務可以是無伺服器函式或輕量級Docker映像。Kubernetes執行時環境crio對執行進行沙箱化,並且始終可以選擇啟用更高的安全性,例如使用unikerkernel,它將核心的基本部分與應用程式耦合,以便將應用程式與主機隔離開來。另一種選擇是使用微型vm,比如KataContainers,或者是AWS Lambda和AWS Fargate正在使用的fireworks。為了確保計算的正確性,編排節點可能會冗餘地將相同的任務分發給多個工作人員,並得到大多數工作人員的結果。在一個開放的市場中,任何擁有空閒計算能力的人都可以加入一個工人叢集,並在完成任務後得到主控制器的獎勵。除了基於任務的鏈下計算之外,另一種形式就是能夠在分配的時間內租用伺服器空間。由於很難確定資源提供者是否實際提供了他們所說的資源,因此這種方法往往依賴於信任網路來擴充套件聲譽和信譽網路。鏈下計算空間中的一些專案是Truebit、Golem、SONM、iExec、Akash、Hypernet、ArcBlock和Transmute。鏈下儲存和計算(混合模型)將鏈下儲存和鏈下計算結合起來,可以實現兩個方面的最佳效果。下面是兩個模型如何相互交織的概述:鏈下儲存和鏈下計算。使用這種混合模型,可以獲得更好的可伸縮性:鏈下儲存和鏈下計算
等離子體就是一個例子,它結合了鏈下儲存和計算。Plasma是區塊鏈的層次結構,其中每個子區塊鏈計算狀態轉換,但被繫結到其父鏈;子鏈週期性地寫回父鏈。每個子鏈負責持久化它們自己的資料。這允許子鏈以自己的速度執行。父鏈可以檢查狀態轉換,這意味著子鏈的狀態轉換是正確的。驗證鏈下計算計算鏈下計算的節點稱為驗證器。驗證者提交結果並證明計算的正確性。驗證證明的節點稱為驗證者。驗證人檢查是有效的證明,如果成功,驗證人檢查的結果可以持續。為了減少網路上的負載,驗證應該是非互動式的,這意味著驗證者應該能夠在一條訊息中檢查驗證,從而避免與驗證者之間的來回。驗證也應該是廉價的,這意味著它的大小應該是小的,它可以相對快速地計算和鏈上。zk - snark密碼學允許這兩種需求。該訊息可以在一個步驟和鏈上進行驗證。zk- snark的另一個好處是驗證器可以在不知道輸入是什麼的情況下正確地證明計算。驗證者對輸入的知識為零。在高水平的zk- snark中,需要將計算過程指定為算術電路。Iden3開發了一些抽象複雜性的庫,比如circom、電路編譯器和scorksjs 節點。用於生成給定已編譯電路的證明的庫。zk- snark的一個缺點是,它需要由建立應用程式的可信方執行一次性設定。惡意的一方可以生成虛假的證據。為了減少對該過程的信任,多方計算是將設定步驟過程分配給互不瞭解的多個參與者的一種方法。可信設定被稱為“有毒的廢物”,因為必須建立一個主金鑰,然後銷燬它,但是總存在未正確消除該金鑰的風險。Bulletproofs 是另一個零知識方案,它不需要像zksnark那樣的信任設定。最初,防彈設計用於機密交易的有效距離證明。一般來說,zk- snark更適用於複雜的語句,而bulletproof更適用於簡單的語句。防彈證明的一個缺點是,驗證比snark證明更耗時。Zk-STARKs類似於bulletproof不需要設定階段,因為它不依賴於公鑰加密,但是在實踐中使用的證明大小仍然相對較大。Zcash使用zk- snark,但最終將遷移到zk-STARKs。StarkWare和Zcash公司的成員是zk-STARKS的積極研究人員,致力於在區塊鏈中啟用隱私功能。結論我們研究了將儲存和計算轉移到離線模型的方法,以及如何使用離線方法保護資料和輸入的隱私。鏈下儲存不再侷限於鏈上的需求,計算可能更加複雜,並且與正在使用的軟體棧無關。