星际联盟提供对Filecoin Spec 的全文翻译,便于Filecoin项目广大中国参与者理解Filecoin的深层原理。文章将定期更新章节,请持续关注"IPFS星际联盟"&"星际联盟Filecoin"公众号。
2. Filecoin系统
2.1 Filecoin节点
2.1.1 节点类型
2.1.1.1 节点接口
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
}
2.1.1.2 示例
Filecoin节点有很多类型 ...
本节将包含:
- 所有节点必须具有什么?以及为什么?
- 不同系统的使用案例
2.1.1.3 链验证节点
type ChainVerifierNode interface {
FilecoinNode
systems.Blockchain
}
2.1.1.4 客户端节点
type ClientNode struct {
FilecoinNode
systems.Blockchain
markets.StorageMarketClient
markets.RetrievalMarketClient
markets.MarketOrderBook
markets.DataTransfers
}
2.1.1.5 存储矿工节点
type StorageMinerNode interface {
FilecoinNode
systems.Blockchain
systems.Mining
markets.StorageMarketProvider
markets.MarketOrderBook
markets.DataTransfers
}
2.1.1.6 检索矿工节点
type RetrievalMinerNode interface {
FilecoinNode
blockchain.Blockchain
markets.RetrievalMarketProvider
markets.MarketOrderBook
markets.DataTransfers
}
2.1.1.7 中继节点
type RelayerNode interface {
FilecoinNode
blockchain.MessagePool
markets.MarketOrderBook
}
2.1.2 存储库 - 链数据与系统的本地存储
Filecoin节点存储库只是一个抽象概念,它表示任何功能的Filecoin节点都需要在本地存储数据,以便正确运行。
该存储库可供节点的系统与子系统访问,并可以充当通过节点的FileStore
(文件库)划分的本地存储(例如)。
它用来存储节点的密钥,IPLD数据结构的状态对象和节点配置。
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
}
2.1.2.1 配置 - 配置值的本地存储
Filecoin节点配置
type ConfigKey string
type ConfigVal Bytes
type Config struct {
Get(k ConfigKey) union {c ConfigVal, e error}
Put(k ConfigKey, v ConfigVal) error
Subconfig(k ConfigKey) Config
}
2.1.2.2 密钥库
密钥库是在任何完整的Filecoin节点中的一个基本抽象,用于存储与给定矿工的地址和不同的workers相关联的密钥配对(矿工应该选择运行多个workers)。
节点安全性在很大程度上取决于保持这些密钥的安全性。 为此,我们建议将密钥与任何给定的子系统分开,并使用单独的密钥存储来按子系统的要求对请求进行签名,并将那些不用作挖矿的一部分的密钥保存在冷存储中。
import filcrypto "github.com/filecoin-project/specs/algorithms/crypto"
import address "github.com/filecoin-project/go-address"
type KeyStore struct {
MinerAddress address.Address
OwnerKey filcrypto.VRFKeyPair
WorkerKey filcrypto.VRFKeyPair
}
Filecoin存储矿工依赖三个主要组成部分:
- 矿工地址在存储算力共识子系统调用
registerMiner()
时,会被唯一分配给指定的存储矿工角色。它是给定存储矿工的唯一标识符,其算力和其他密钥将与之关联。 - 所有者密钥对由矿工在注册之前提供,并且其公钥与矿工地址相关。 区块奖励与其他付款将被支付到所有者账户的地址。
- worker密钥对可以由矿工自主选择和更改,该公钥与矿工地址相关联。 它可以用于签署交易,签名等。鉴于它用作Verifiable Random Function数的一部分,它必须是BLS密钥对。
虽然矿工地址是唯一的,但多个存储矿工角色可以共享一个所有者的公共密钥,或一个worker的公共密钥。在存储矿工角色Storage Miner Actor中指定了更改链上工作密钥对(即与存储矿工关联的workerKey)的过程。需要注意的是,这是一个两步的过程。首先,矿工通过向链发送消息来提出更改请求。收到密钥更改请求后,链会将其更改为以时期的随机性回溯参数数量的两倍,以防止自适应密钥选择攻击。每次查询工作密钥时,都会将挂起的变化进行延迟检查,并且可能会根据需要更新状态。
待完成:
- 关于密钥安全失败后果的潜在建议或明确的免责声明
2.1.2.3 IpldStore - 哈希链表数据的本地存储
// imported as ipld.Object
import cid "github.com/ipfs/go-cid"
type Object interface {
CID() cid.Cid
// Populate(v interface{}) error
}
type GraphStore struct {
// Retrieves a serialized value from the store by CID. Returns the value and whether it was found.
Get(c cid.Cid) (util.Bytes, bool)
// Puts a serialized value in the store, returning the CID.
Put(value util.Bytes) (c cid.Cid)
}
Filecoin数据结构以IPLD格式存储,这是一种类似于json的数据格式,用于存储、检索和遍历哈希链表的数据DAGs。
Filecoin网络主要依赖于两个不同的IPLD GraphStores图集:
- 一个ChainStore,用于存储区块链相关信息,包括区块头,相关消息等
- 一个StateStore,用于存储来自给定区块链的有效载荷状态,或者由Filecoin VM将给定链中所有区块消息产生的stateTree应用于genesis state。
ChainStore
在ChainSync( ChainSync - synchronizing the Blockchain)的引导阶段由节点从其对等节点下载,同步至区块链然后由节点存储。 每次接收到新的区块时,或者节点同步到一个新的最佳链时,都会对其进行更新。
StateStore
是通过执行给定ChainStore中所有区块消息来计算的,然后由节点存储。它通过 VM Interpreter - Message Invocation (Outside VM)更新每个新传入块的处理,并相应地由在它上面的块在块头的ParentState
字段中生成的新块引用。
待完成:
- 什么是IPLD
- 哈希链接数据
- 来自IPFS
- 为什么与filecoin相关
- 所有网络数据结构均是IPLD
- 所有本地数据结构都可以是IPLD
- 什么是一个IpldStore
- dags的本地存储
- 如何在FileCoin中使用IpldStores
- 传递分发
- 一个或多个ipldstore
- 临时缓存
- 中间计算状态
- 垃圾收集