systems.Blockchain systems.Mining markets.StorageMarketProvider markets.MarketOrderBook markets.DataTransfers }
type Config struct { Get(k ConfigKey) union {c ConfigVal, e error} Put(k ConfigKey, v ConfigVal) error
当向数据流写入 HelloMessage 时, 节点查抄当前最新区块以提供当前节点信息。当向数据流写入 LatencyMessage 时,节点配置吸收时间戳 TArrival 和发送时间戳 TSent。
Filecoin 网络存在各类范例的节点:
网络
在修改事情者密钥对时,会是两步进程。首先矿工向链上发送修窜改静,当链上收到后,密钥对的修改会缓存随机性回溯参数数量的两倍时间举办变动,以防备举办自适应密钥选择进攻。每次查询事情者密钥对时,城市对延迟的变动造行延迟查抄,而且大概会按照需要更新状态。
动静数据布局:
FilCloud 帮你迅速相识 IPFS 规模的热点技能和应用公家号:filcloud
存储矿工节点
type StorageMinerNode interface { FilecoinNode
type UnixTime int64 // 时间戳
矿工注册时,公钥和矿工地点相关联的密钥对,矿工区块嘉奖等转账会转到这个公钥对应的地点。
StateStore 存储了颠末 Filecoin 虚拟机计较而来的区块链状态数据, 该状态数据由创世区块开始计较,当有新区块发生就会基于前一个区块状态计较出最新的状态。
MessagePool message_pool.MessagePoolSubsystem // 动静池子系统,存储未上链动静 }
时钟需求
Filecoin 协议中利用的时钟应该担保 1 秒以内的同步误差,以完成需要的验证。
数据客栈是用来当地存储 Filecoin 节点正常运行时所需要的数据。数据客栈回收 FileStore 存储节点的密钥、有状态工具的 IPLD 数据布局和节点设置。
type FilecoinNode struct { Node libp2p.Node // p2p节点
Repository repo.Repository // 资料库数据,存储区块链数据 FileStore filestore.FileStore // 当地文件存储库,暂存存储在Filecoin中的文件 Clock clock.UTCClock // 时钟
// Populate(v interface{}) error }
// Puts a serialized value in the store, returning the CID. Put(value util.Bytes) (c cid.Cid) }
EpochAtTime(t UnixTime) ChainEpoch }package clock
用于存储数据的存储矿工利用。拥有区块链数据、挖矿、存储市场供给商、市场订单表、数据传输等子系统。
以下是 Filecoin 利用到的 libp2p 协议:
相对与其它节点有足够低的时钟误差(小于1秒),以担保不会挖出将来的区块。
blockchain.MessagePool markets.MarketOrderBook }
假如当前高度没有区块发生,依据协议生成下一高度的区块,以担保网络协议不变。
Filecoin 网络主要依赖两种 IPLD 数据:
节点设置可以按照 ConfigKey 获取和配置。
后续
时钟
// ChainEpoch 暗示一个区块轮 type ChainEpoch int64
客户端需要查询NTP处事来校准时间,好比 pool.ntp.orgtime.cloudflare.com:1234time.google.comntp-b.nist.gov。
客户端节点
type ClientNode struct { FilecoinNode
今朝焦点的是客户端节点和存储矿工节点。
以下以Hello协议为例:
矿工地点是独一的,而多个矿工可以共享一个所有者密钥对和事情者密钥对。
密钥存储
密钥存储用于存储与矿工地点对应的密钥对,节点安详基于这些密钥对的安详,,所以发起把密钥对存放在别的的系统里。
type Repository struct { Config config.Config KeyStore key_store.KeyStore ChainStore ipld.GraphStore StateStore ipld.GraphStore }
blockchain.Blockchain markets.RetrievalMarketProvider markets.MarketOrderBook markets.DataTransfers }
节点根基数据布局界说如下:
Filecoin 依靠此系统时钟来确保共鸣。详细来说,时间是支持验证法则所必须的,该验证法则可防备块出产者利用将来的时间戳来挖掘块,而且防备矿工的出块权的次数超出协议答允的范畴。
systems.Blockchain markets.StorageMarketClient markets.RetrievalMarketClient markets.MarketOrderBook markets.DataTransfers }
其他子系统将时钟子系统注册到 NewRound() 事件。
用于索引数据所需的索引矿工利用。拥有区块链数据、索引市场供给商、市场订单表、数据传输等子系统。
KademliaDHT:用于发明节点的漫衍式哈希表,协议标识符为 /fil/<network-name>/kad/1.0.0。
// EpochDuration 暗示一个区块时间 var EpochDuration = UnixTime(25)
// LatencyMessage 和其他节点共享节点延迟 type LatencyMessage struct { // Measured in unix nanoseconds TArrival Int // Measured in unix nanoseconds TSent Int }
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)
矿工可以选择和修改的密钥对,公钥关联矿工地点,用于签名生意业务等,必需是 BLS 密钥对。
Subconfig(k ConfigKey) Config }
hello_connect: 成立毗连 -> 打开数据流 -> 向数据流中写入hello动静 -> 从数据流中读取延迟动静 -> 封锁数据流
数据客栈
Hello: 处理惩罚新毗连的节点的寻找。协议标识符为 /fil/hello/1.0.0。
节点范例
// HelloMessage 和其它节点共享当前节点信息 type HelloMessage struct { HeaviestTipSet [cid.Cid] HeaviestTipSetWeight BigInt HeaviestTipSetHeight Int GenesisHash cid.Cid }
type KeyStore struct { MinerAddress address.Address OwnerKey filcrypto.VRFKeyPair WorkerKey filcrypto.VRFKeyPair }
链验证节点
type ChainVerifierNode interface { FilecoinNode
中继节点
type RelayerNode interface { FilecoinNode
End
ChainStore 存储了区块链数据,包罗区块头,相关动静等。这是从其它节点下载而来,当有新区块发生或有新的最佳链,随时会更新。
预设高度值和系统时间戳的干系为epoch = Floor[(current_time - genesis_time) / epoch_time]。
Bootstrap List:用于新节点毗连入网络的初始化启动节点列表。
Peer Exchange:可以辅佐节点依据已毗连节点的现有节点发明更多节点。
IPLD 数据布局
type Object interface { CID() cid.Cid
Filecoin 数据布局是以 IPLD 名目存储,这是一种雷同于 json 的数据名目,用于存储,检索和遍历散列链接的数据 DAG。
客户端可以在大型采矿功课中利用铯钟实现准确时间同步。
Gossipsub:用于区块头部和动静的广播,节点可以订阅相关主题以获取该主题的动静,同时转发给其它订阅同一主题的节点。协议标识符为/fil/blocks/<network-name> 和 /fil/msgs/<network-name>。
import cid "github.com/ipfs/go-cid"
// EpochAtTime 返回当前时间对应的区块高度 func (c *ChainEpochClock_I) EpochAtTime(t UnixTime) ChainEpoch { difference := t - c.GenesisTime() epochs := difference / EpochDuration return ChainEpoch(epochs) }
hello协议包括两个进程:
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。