介紹
Filecoin 是一個基於區塊鏈技術的分散式檔案儲存網路。本系列文章主要介紹 Filecoin 的設計規範,無論哪個版本的 Filecoin 實現都需要按照此規範實現。
Filecoin 中為網路提供儲存容量的節點稱為礦工,礦工透過定期產生的時空證明以證明其儲存有效性,以此獲取 Filecoin 加密貨幣 FIL 。FIL 可以透過區塊鏈技術進行交易。礦工在共識協議裡的存力和其儲存資料量成正比。
Filecoin 區塊鏈不僅維護 FIL 的交易,而且實現 Filecoin 虛擬機器,用於執行鏈上交易獲取當前網路狀態。這些交易包括客戶向礦工支付 FIL 以儲存特定檔案的儲存交易等。
以上左邊為區塊鏈資料,右邊為礦工儲存的已加密資料扇區。
基本概念
以下介紹規範經常用到的一些基本概念。
資料結構:由語義標記的資料集合(例如結構體,介面或列舉)。
方法:不依賴外部狀態的計算過程(例如數學函式或不引用全域性變數的程式語言函式)。
模組:單個軟體單元的功能集合,根據特定情況,可能是軟體模組,處理特定任務的執行緒或程序等。
APIs:是可以傳送到模組的訊息定義。許多功能需要一系列 APIs 組合完成。
節點:符合 Filecoin 協議規範的完整軟體和硬體系統。一個節點應該包括上面的模組和對外暴露的 APIs。全節點則是指完整的模組和APIs。
子系統:根據 Filecoin 完整協議規範的概念而劃分的子集。比如儲存市場,檢索市場。它們不一定對應於任何特定的節點或軟體模組。
角色:在 Filecoin 虛擬機器中的虛擬實體。比如執行智慧合約的協議角色,擁有 FIL 加密貨幣並可以交易的角色等。
Filecoin 虛擬機器
Filecoin 虛擬機器主要管理了 Filecoin 的使用者功能,比如付款,儲存市場,存力表等。虛擬機器的執行原理主要是選擇網路生成一系列區塊鏈中正確的那條鏈,每個區塊裡都包含一系列可以使狀態變更的訊息,虛擬機器執行這些訊息形成一個新的全域性狀態的檢查點,每生成一個新的區塊,就會在原來的全域性狀態之上生成一個新的全域性狀態。全域性狀態包括一組角色,每個角色都有其自己的私有狀態。
lotus 中的 chain/vm/vm.go 展示了虛擬機器的資料結構定義:
type VM struct { cstate *state.StateTree base cid.Cid cst *cbor.BasicIpldStore buf *bufbstore.BufferedBS blockHeight abi.ChainEpoch inv *invoker rand Rand Syscalls runtime.Syscalls }
其中包含當前區塊高度 blockHeight,全域性狀態 cstate,ipld 資料介面 cst 等。
Filecoin 網路裡的角色相當於Ethereum中的智慧合約。包括當前的狀態和一組可以呼叫的方法,每個角色都有餘額,指向當前狀態的指標,標記角色型別的角色程式碼和標記傳送訊息數的值。
有兩種呼叫角色的方法。第一種,透過向區塊鏈網路傳送已簽名的訊息,並支付交易費讓礦工打包訊息以執行方法。第二種,是一個角色的方法呼叫另一個角色的方法。
角色在 specs-actors 子系統中實現,以下定義了目前預先定義好的角色及其程式碼:
SystemActorCodeID = makeBuiltin("fil/1/system") InitActorCodeID = makeBuiltin("fil/1/init") CronActorCodeID = makeBuiltin("fil/1/cron") AccountActorCodeID = makeBuiltin("fil/1/account") StoragePowerActorCodeID = makeBuiltin("fil/1/storagepower") StorageMinerActorCodeID = makeBuiltin("fil/1/storageminer") StorageMarketActorCodeID = makeBuiltin("fil/1/storagemarket") PaymentChannelActorCodeID = makeBuiltin("fil/1/paymentchannel") MultisigActorCodeID = makeBuiltin("fil/1/multisig") RewardActorCodeID = makeBuiltin("fil/1/reward") VerifiedRegistryActorCodeID = makeBuiltin("fil/1/verifiedregistry") // Set of actor code types that can represent external signing parties. CallerTypesSignable = []cid.Cid{AccountActorCodeID, MultisigActorCodeID}
以上各個角色都有其特定的功能,後續會具體介紹。
後續
後續將會介紹 Filecoin 系統節點的規範。