本文由星際聯盟Boni Liu翻譯,轉載請註明出處。
星際聯盟計劃提供對Filecoin Spec 的全文翻譯,便於Filecoin項目廣大中國參與者理解Filecoin的深層原理。文章將定期更新章節,請持續關注"IPFS星際聯盟"&"星際聯盟Filecoin"公眾號。
1.5.1 v1.1 - 2019-10-30 - c3f6a6dd -
鏈上交易
存儲交易
完整的存儲市場Actor邏輯:
客戶和礦工的收支:押金,鎖定,費用和取款
質押削減
完整的StorageMinerActor邏輯:
故障扇區,掉電,到期等等
扇區驗證,故障,恢復和到期
sector狀態,狀態轉換,狀態核算,算力核算
故障聲明 + 修復Sectors流程
提交扇區流程
提交選舉或SubmitSurprisePoSt流
OnMissedSurprisePost流
StoragePowerActor
算力核算基於StoragePowerActor狀態的更改
抵押品:存款,鎖定,提款
削減質押
Interactive-Post
StorageMinerActor: 預提交扇區 和 提交扇區
Surprise-Post
挑戰流程為 CronActor -> StoragePowerActor -> StorageMiner -
虛擬機
InitActor基本流程,插入運行時
CronActor全流程,靜態註冊表
申請消息
-> 轉移 - 更安全
gas核算
縮小的界面
安全狀態獲取,釋放,提交流程
退出碼 - 完整的調用流程
更安全的遞歸上下文構造
錯誤級別和處理
檢測和處理gas錯誤
方法調用表示
代碼和狀態的分離
從區塊鏈中提取VM系統
地址
Actors
消息
運行時間
解釋程序
VM系統參與者
AccountActor基本流程
數據傳輸
push, pull, 1-RTT pull
協議,數據結構,接口
圖表
完整的數據傳輸流程
區塊鏈/鏈同步
鏈同步協議描述的第一個版本
包括協議狀態機描述
網絡引導程序–連接性和狀態
漸進區塊驗證 - 漸進區塊傳播
其他
細則部分狀態指示燈
變更日誌
1.5.2 v1.0 - 2019-10-07 - 583b1d06
全面細則重組
工具
添加了構建系統以編譯工具
添加了繪圖工具(dot, mermaid等)
添加了附屬圖安裝
添加了Orient以計算協議參數
內容
系統總覽
完整的協議美人魚流
filcrypto-密封,PoRep,PoSt算法
ipld - cids, ipldstores
libp2p - 主機/節點表示
ipfs - graphsync 和 bitswap - 多種格式
multihash,multiaddr
確定模型和區塊大小的orient模型
交易:存儲市場交易基礎
存儲市場:StorageMarketActor基礎
存儲礦工:控制和協調存儲挖礦的模塊
扇區:存儲單位,密封,加密工件等
扇區索引:描述扇區數量和元數據
儲存證明:印章,posts等
骨架部分
blocks - 基本的區塊鏈數據結構(blocks, tipset, chain等)
存儲算力共識 - SPC的基本算法和加密工件
StoragePowerActor 基礎
file - 數據的基本表示
piece - 表示存儲在filecoin中的數據
類型 - 不同FileCoin節點類型的概述
存儲庫 - 本地數據結構存儲
網絡接口 - 連接到libp2p
時鐘 - 掛鍾
filecoin節點
文件和數據
區塊鏈
代幣
存儲挖礦
市場
Orient
圖書館
圖表
1.5.3 pre v1.0
文件共享協議的擴展寫入 - 可見 詳情
查看所有更改日誌:github.com/filecoin-pr…
1.6.1 什麼是系統?它們如何工作?
Filecoin將其功能解構並模塊化為鬆散連接的系統。每個查看重要的功能,通常用來實現一系列重要且緊密相關的目標。
例如,區塊鏈系統提供了諸如區塊,區塊集合、鏈之類的結構,並提供了諸如區塊同步,區塊廣播,區塊驗證,鏈選擇和鏈訪問之類的功能。這與文件,片段,片段準備和數據傳輸分開。這些系統都是與市場分開,提供訂單,交易,市場可見性和交易結算。
1.6.1.1 為什麼系統解耦是有用的?
這種解耦對於以下方面很有用:
實現邊界:可以只用一部分子系統來構建實現Filecoin。這對於實現多樣性特別有用:我們需要安全性關鍵系統(例如,區塊鏈)的許多實現,但不需要可以解構的系統的許多實現。
運行解耦:系統耦使後,構建和運行將系統隔離到單獨程序甚至單獨物理計算機中的Filecoin節點變得更加容易。
安全隔離:一些系統比其他系統需要更高的操作安全性。系統解耦使實現能夠滿足其安全性和功能性需求。一個很好的例子是將區塊鏈處理與數據傳輸分開。
可伸縮性:系統和各種用例可能會為不同的操作者帶來不同的性能要求。系統解耦使得操作者更容易根據系統邊界來衡量他們的部署。
1.6.1.2 Filecoin節點不需要所有系統
Filecoin節點差異很大,並且不需要所有系統。大多數系統僅在部分用例中才需要。
例如,需要區塊鏈系統來同步鏈,參與安全共識,存儲挖掘和鏈驗證。許多Filecoin節點不需要鏈,只需從其信任的節點中從最新StateTree中獲取內容即可執行其工作。當然,這樣的節點:
注意:Filecoin不使用在比特幣和其他區塊鏈網絡中廣泛使用的「完整節點」或「輕客戶端」術語。在Filecoin中,這些術語定義不明確。最好根據節點的功能來定義節點,因此也要根據它們所運行的系統來定義節點。例如:
鏈驗證節點:運行區塊鏈系統。可以同步和驗證鏈;無法挖掘或生產區塊。
客戶端節點:運行區塊鏈。市場和數據傳輸系統;可以同步和驗證鏈;無法挖掘或生產區塊。
檢索礦工節點:運行市場和數據傳輸系統;不需要鏈;可以進行檢索交易(檢索提供方);可以發送客戶端的數據並得到報酬。
存儲礦工節點:運行區塊鏈,存儲市場,存儲挖掘系統。可以同步和驗證鏈。可以進行存儲交易(存儲提供方)。可以將存儲的數據密封到扇區中。可以獲得存儲共識算力。能夠挖掘和生產區塊。
1.6.1.3 分離系統
我們如何確定一個功能是屬於哪個子系統?
在系統之間劃定界限是將緊密相關的功能與無關部分分開的藝術。從某種意義上說,我們試圖將緊密集成的組件保持在同一系統中,並遠離其他無關的組件。有時這很簡單,界限來自數據的結構或功能。例如,我們可以很容易觀察到,客戶和礦工彼此協商交易與虛擬機執行無關。
有時這很難,並且需要整理,添加或刪除抽象概念。例如,StoragePowerActor和StorageMarketActor以前是單個Actor。這導致整個StorageDeal製造,StorageMarket,整個市場與存儲採礦,扇區密封,PoSt生成等之間的功能耦合。理順這兩組相關功能需要將一個參與者分成兩個。
1.6.1.4 在系統內分解
系統本身分解為較小的子單元。這些有時稱為「子系統」,以避免與更大的一流系統混淆。子系統本身可以進一步分解。此處的命名沒有嚴格執行,這些細分與協議和實現工程方面的問題更多地相關,而不是與用戶功能有關。
1.6.2.1 系統要求
為了使將功能與系統解耦更加容易,Filecoin協議假定了一組可用於所有系統的功能。此功能可以通過實現以多種方式來實現,並應將此處的指南作為建議(應當)。
所有的系統,如本文檔中定義,要求如下:
資料庫
本地IpldStore。用於數據結構(小型結構化對象)的一定數量的持久本地存儲。系統期望使用IpldStore進行初始化,其中的存儲數據結構在崩潰中也會持續存在。
用戶配置值。少量用戶可編輯的配置值。這些應該使終端用戶易於訪問,查看和編輯。
本地安全密鑰庫。用於生成和使用加密密鑰的工具,必須對Filecoin節點保密。系統不能直接訪問密鑰,必須通過抽象(即KeyStore)來實現,該抽象提供了加密,解密,籤名,籤名驗證等功能。
本地文件存儲。某些文件的持久的本地存儲(大字節數組)。系統期望使用能存儲大文件的FileStore進行初始化。某些系統(例如Markets)可能需要存儲和刪除大量較小的文件(1MB-10GB)。其他系統(如存儲挖礦)可能需要存儲和刪除大量的大型文件(1GB - 1TB)。
網絡。大多數系統需要訪問網絡,才能連接到他們對應的Filecoin節點。系統會使用libp2p.Node進行初始化,並可以在其上安裝自己的協議。
時鐘。有些系統需要訪問當前的網絡時間,而有些系統對浮動的容差較低。系統初始化會使用一個時鐘來得知網絡時間。一些系統(如區塊鏈)需要很少的時鐘浮動,並且需要安全的時間。為此,我們使用FilecoinNode數據結構,該數據結構會在初始化時傳遞給所有系統:
import repo"github.com/filecoin-project/specs/systems/filecoin_nodes/repository"
import filestore"github.com/filecoin-project/specs/systems/filecoin_files/file"
import clock"github.com/filecoin-project/specs/systems/filecoin_nodes/clock"
import libp2p "github.com/filecoin-project/specs/libraries/libp2p"
import message_pool"github.com/filecoin-project/specs/systems/filecoin_blockchain/message_pool"
typeFilecoinNode struct {
Node libp2p.Node
Repository repo.Repository
FileStore filestore.FileStore
Clock clock.UTCClock
MessagePool message_pool.MessagePoolSubsystem
}
import ipld"github.com/filecoin-project/specs/libraries/ipld"
import key_store"github.com/filecoin-project/specs/systems/filecoin_nodes/repository/key_store"import config"github.com/filecoin-project/specs/systems/filecoin_nodes/repository/config"
typeRepository struct {
Config config.Config
KeyStore key_store.KeyStore
ChainStore ipld.GraphStore
StateStore ipld.GraphStore
}
1.6.2.2 系統限制
此外,系統必須遵守以下限制:
隨機崩潰。一個Filecoin節點可能隨時崩潰。當崩潰時,系統必須是安全且一致的。這主要是通過限制持久狀態的使用,通過Ipld數據結構持久化這種狀態,以及通過使用檢查狀態的初始化例程,以及糾正可能錯誤來實現的。
隔離。系統必須通過定義明確的獨立接口進行通信。他們不得在共享內存空間上構建關鍵功能。(注意:為了提高性能,共享內存抽象化可用於為IpldStore,FileStore和libp2p提供算力,但是系統本身不應該需要它)。這不僅僅是操作上的問題;它還顯著的簡化了協議,並使之更易於理解,分析,調試和更改。
無直接訪問主機操作文件系統或磁碟。系統無法直接訪問磁碟,而是通過FileStore和IpldStore抽象來進行。這將為最終端用戶提供高度的移動性和靈活性,尤其針對於存儲礦工和需存儲大量數據的客戶,這需要能夠簡單替換其Filecoin節點訪問本地存儲的方式。
無直接訪問主機作業系統的網絡堆棧或TCP / IP。系統無法直接訪問網絡-它們通過libp2p庫進行訪問。不得有任何其他種類的網絡接入。這為跨平臺和網絡協議提供了高度的移動性,使Filecoin節點(及其所有關鍵系統)在多種設置下可以使用各種協議(例如,藍牙,LAN等)運行。