1. IPFS点滴资讯首页
  2. 技术分享

揭秘Filecoin的设计文档丨第八部分:网络与数据结构

本文主要讲述了Filecoin网络与数据结构方面的问题

此文译自Filecoin设计文档https://github.com/filecoinproject/specs

设计文档,从设计的角度,分别介绍数据结构,挖矿机制,共识机制,支付方式,虚拟机执行 ,状态机存储角色等等。

FileCoin是一个分布式存储网络,共享状态持久存在于区块链中。揭秘Filecoin的设计文档丨第二部分

Filecoin网络协议

存储协议

CBOR RPC

参考文献:

  • RFC7049,简明二进制对象表示
  • 小端数基数128

FileCoin使用了许多来自IPF和libp2p的预先存在的协议,还实现了自己的几个新协议。对于这些特定于filecoin的协议,我们将尝试使用cbor-rpc协议格式。这种格式实际上只是一个LEB128变长的CBOR系列序列化对象。每当filecoin协议说“send x”时,它的意思是“cbor序列化对象x,使用无符号leb128编写其长度编码,然后编写序列化字节”。

握手

当两个filecoin节点最初连接到彼此时,使用hello协议来确定有关另一个节点的信息。此协议的libp2p协议ID是 /fil/hello/1.0.0

每当一个节点得到一个新的连接,它就会在该连接上打开一个新的流并“打招呼”。这是通过创建HelloMessage,使用cbor-rpc将其发送给另一个对等方,最后关闭流来完成的。

存储交易

任何客户机都使用存储交易协议与存储挖掘程序存储数据。此协议的libp2p协议ID是/fil/storage/mk/1.0.0

协议从存储客户机开始(在本例中,该客户机可能是普通的存储客户机或代理)。假设在执行这个协议之前,客户机已经将他们的数据准备成一个 piece 。

查询

这里我们描述一个查询给定存储事务当前状态的基本协议。将来,我们可能需要一些更复杂的东西,能够在单个流上同时复用等待关于一组大型交易的通知,升级到那个是相对简单的。

此协议的libp2p协议ID是 /fil/storage/qry/1.0.0
在任何时候,此流中的客户都可以向矿工查询给定建议的状态。

免费检索

免费检索工件协议用于协调工件从矿工到客户的传输,而不向客户收取任何费用。

客户机通过使用 /fil/retrieval/free/0.0.0 协议ID向矿工打开libp2p流来启动协议。要查找和连接矿工,应使用地址查找服务。连接后,客户端必须使用 CBOR RPC 协议格式向矿工发送RetrievePieceRequest 消息。

块同步

blocksync协议是一个小协议,允许filecoin节点相互请求块的范围,是一个简单的请求/响应协议,协议ID为 /fil/sync/blk/0.0.0,使用CBOR-RPC。

FileCoin数据传播

FileCoin网络需要向网络中的所有对等方广播块和消息。本文件详细说明了该过程的工作原理。块和消息都使用gossipsub libp2p pubsub路由器进行传播。pubsub消息经过身份验证。对于块,pubsub hop验证函数设置为在重新传播前检查块是否有效。对于消息,运行类似的有效性检查,签名必须有效,并且相关帐户必须有足够的资金来覆盖指定的操作。

块传播

块在libp2p pubsub 渠道 /fil/blocks上传播。块被序列化,原始字节作为pubsub消息的内容发送。没有消息、计算状态或其他附加信息与块消息一起发送。

每个filecoin节点为块主题设置一个“验证函数”,该主题检查块的构造是否正确、其票证是否有效、块签名是否有效、矿工是否是有效的矿工,以及块是否是已知良好Tipset的子级。(TODO:澄清哪些检查是必需的,这里的任何慢度都会显著影响传播时间,这不是完全有效性检查)如果接收到无效的块,则从中接收到的对等端应标记为潜在的坏块(待续未完:我们可以将发送坏块的对等节点列入黑名单,可能需要libp2p对此提供支持?)

未完待续:跟踪哪些消息可以与每个块一起发送,以提高传播时间。

消息传播

消息通过libp2p pubsub通道 /fil/messages传播。消息被序列化,原始字节作为pubsub消息的内容发送。

消息的pubsub验证功能首先检查此主题上每个pubsub消息的内容是否低于消息的最大大小限制,然后检查它是否是正确构造的消息。(TODO:讨论检查签名和账户余额,一些需要考虑的棘手问题)。如果从对等端接收到无效消息,则应将该对等端标记为潜在的坏消息。

数据结构

文档是理解FileCoin中所有数据结构的入口。
待续未完:这还应该包括或引用每个数据结构是如何精确序列化的。

地址

地址是指FileCoin状态下的参与者的标识符。所有参与者(矿工参与者、存储市场参与者、帐户参与者)都有一个地址。地址对其所属网络的信息、所包含的数据类型、数据本身以及校验和(取决于类型)进行编码。

内容标识符

对于filecoin引用的大多数对象,都使用内容标识符(简称为CID)。这实际上是一个散列值,在其散列函数(multihash)前面加上一些额外的标签,通知应用程序如何反序列化给定的数据。要了解更多信息,请查看CID规范。

CID通过应用二进制多基编码进行序列化,然后将其编码为一个标记为42的cbor字节数组。

区块

一个块表示网络可能达成共识的单个时间点。它包含(通过merkle链接)系统的完整状态、对前一状态的引用以及决定哪个块是“最佳”的“权重”概念。

消息

参数编码
方法的参数按照下面“基本类型”部分中的描述进行编码,然后放入cbor编码的数组中。

签名
签名消息是基本消息的包装类型。

序列化
消息和已签名的消息当前仅通过CBOR对其进行编组,使用较低的camel大小写字段名进行序列化。

接收消息

序列化

消息和已签名的消息当前仅通过CBOR对其进行编组,使用较低的camel大小写字段名进行序列化。

参与者

序列化
目前,演员只是通过cbor对他们进行编组,使用低驼色大小写的字段名进行序列化。

状态树

状态数追踪Filecoin的全部状态,是系统中参与者的地址映射,使用HAMT。

HAMT

待续未完:链接到我们的HAMT的规格

基本类型编码

出现在消息或状态中的类型必须按照此处所述进行编码。
公钥
公钥类型只是一个字节数组。(TODO:讨论密钥类型的特定编码,现在只调用它字节就足够了)
字节量
bytesamount只是一个重新键入的整数。

点对点ID

点对点ID(PeerID)只是libp2p点对点ID的序列化字节。
规范不完整,请看这个pr:https://github.com/libp2p/specs/pull/100
Integers
Integers被编码为LEB128已签名Integers。
位场
位字段是一组位。编码仍然是待定的,但需要非常紧凑。我们可以假设在大多数情况下,位的范围将被设置,或者不被设置,并利用这个优势。某种形式的运行长度编码可能工作得很好。
扇形集
待续未完
故障集
故障集是位域和块高度,编码tbd。
分块报头
BlockHeader是一个序列化的块。
密封证明
密封证明(SealProof)是一个字节数组。

TokenAmount
tokenAmount是一个重新键入的整数。

LEB128编码参考

这是从Dwarf Standard 4,附录C中提取的。

filecoin节点本地存储
filecoin节点在本地存储某些数据。本节详细介绍了存储的确切内容(但并没有指定存储内容的确切方式)。

链式数据

待续未完

私钥

待续未完

扇区

待续未完

仓储交易

待续未完

Filecoin的设计文档到此就结束了,谢谢大家的阅读~

 

点对点科技简介

点对点科技深耘IPFS与Filecoin技术,坚持区块链技术改变未来的信念。点对点 IPFS 数据中心是目前国内技术领先,性价比高、保障优的投资标的。自建杭州数据中心,合作数据中心分布于上海、宁波、河北、香港、斯德哥尔摩(瑞典)等地。点对点数据中心具有优秀的硬件配置与目前国内优质的网络节点资源。点对点科技力求将IPFS爱好者升级为IPFS领军者与受益者,让IPFS颠覆传统互联网,共同开启 WEB 3.0时代。

想了解更多区块链知识吗?关注我吧!

Filecoin测试网二阶段昨日重启,点对点出块第一! | 点滴资讯

原创文章,作者:三色団子,如若转载,请注明出处:https://ipfsdrop.com/tech/jiemifilecoindeshejiwendangshudibabufenwangluoyushujujiegou/

发表评论

电子邮件地址不会被公开。 必填项已用*标注