原文連結:filecoin-project.github.io/specs/#intr…
本文由星際聯盟Boni Liu翻譯,轉載請註明出處。
星際聯盟提供對Filecoin Spec 的全文翻譯,便於Filecoin專案廣大中國參與者理解Filecoin的深層原理。文章將定期更新章節,請持續關注"IPFS星際聯盟"&"星際聯盟Filecoin"公眾號。
1.5 更改日誌 - 版本歷史
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 -
-
虛擬機器
- 從區塊鏈中提取VM系統
- 地址
- Actors
- 程式碼和狀態的分離
- 訊息
- 方法呼叫表示
- 執行時間
- 縮小的介面
- 安全狀態獲取,釋放,提交流程
- 退出碼 - 完整的呼叫流程
- 更安全的遞迴上下文構造
- 錯誤級別和處理
- 檢測和處理gas錯誤
- 解釋程式
- 申請訊息
- {扣除,存款} -> 轉移 - 更安全
- gas核算
- VM系統參與者
- InitActor基本流程,插入執行時
- CronActor全流程,靜態登錄檔
- AccountActor基本流程
-
資料傳輸
- 完整的資料傳輸流程
- push, pull, 1-RTT pull
- 協議,資料結構,介面
- 圖表
- 完整的資料傳輸流程
-
區塊鏈/鏈同步
- 鏈同步協議描述的第一個版本
- 包括協議狀態機描述
- 網路載入程式–連線性和狀態
- 漸進區塊驗證 - 漸進區塊傳播
-
其他
- 細則部分狀態指示燈
- 變更日誌
1.5.2 v1.0 - 2019-10-07 - 583b1d06
-
全面細則重組
-
工具
- 新增了構建系統以編譯工具
- 新增了繪圖工具(dot, mermaid等)
- 新增了附屬圖安裝
- 新增了Orient以計算協議引數
-
內容
- filecoin節點
- 型別 - 不同FileCoin節點型別的概述
- 儲存庫 - 本地資料結構儲存
- 網路介面 - 連線到libp2p
- 時鐘 - 掛鐘
- 檔案和資料
- file - 資料的基本表示
- piece - 表示儲存在filecoin中的資料
- 區塊鏈
- blocks - 基本的區塊鏈資料結構(blocks, tipset, chain等)
- 儲存算力共識 - SPC的基本演算法和加密工件
- StoragePowerActor 基礎
- 代幣
- 骨架部分
- 儲存挖礦
- 儲存礦工:控制和協調儲存挖礦的模組
- 扇區:儲存單位,密封,加密工件等
- 扇區索引:描述扇區數量和後設資料
- 儲存證明:印章,posts等
- 市場
- 交易:儲存市場交易基礎
- 儲存市場:StorageMarketActor基礎
- Orient
- 確定模型和區塊大小的orient模型
- 圖書館
- filcrypto-密封,PoRep,PoSt演算法
- ipld - cids, ipldstores
- libp2p - 主機/節點表示
- ipfs - graphsync 和 bitswap - 多種格式
- multihash,multiaddr
- 圖表
- 系統總覽
- 完整的協議美人魚流
- filecoin節點
1.5.3 pre v1.0
-
檔案共享協議的擴充套件寫入 - 可見 詳情
-
檢視所有更改日誌:github.com/filecoin-pr…
1.6 系統分解
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.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"
type FilecoinNode 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"
type Repository 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等)執行。