Filecoin规范④--区块链系统(一)

1,090 阅读10分钟

本文作者:星际联盟 原创作品,转载请注明出处

Filecoin区块链是一个实现了一致性、消息处理、存储用账户,并维护了Filcoin协议中的安全性的分布式虚拟机。它是连接Filecoin系统内不同actor的主要接口。

Filecoin区块链包括:

  • Message Pool子系统,节点用来追踪和传播存储市场相关的,贯穿整个gossip网络的消息。
  • VM - 虚拟机子系统,用来解释和执行消息以更新系统状态。
  • 一个管理状态树(系统状态)的创建和维护的子系统,确切地说,由VM从某个指定的子链生成。
  • ChainSync - 同步区块链子系统,追踪和传播合法的消息区块,维护矿工可能在其上进行挖掘的候选链集合,在新到来的区块上运行语法有效性检验。
  • Storage Power Consensus - 存储算力共识子系统,追踪某个给定的链的存储,帮助区块链系统选择要扩展的子链和要包含进的区块。
  • 一个维护指定链状态,向其它区块链系统提供设施的子系统,保证新到来的区块在包含到区块之前都被验证了语义合法性。其它区块链系统为了运行,将会请求关于最新链的状态。
  • 在成功的“领导选举”情况下调用,以产生一个新的区块,新区块将会在为了传播而向syncer转递前扩展当前的heaviest链。

总地来说,Filecoin区块链通过相继的“领导选举”轮次而增长。在这些轮次里,会有一些矿工被选举出来生成区块,区块被包含进链上会给矿工带来奖励。Filecoin的区块链运行在存储算力之上。也就是说,它的一致性算法是以支持子链的存储量为依据的。矿工使用一致性算法就在哪条子链上进行挖掘达成一致意见。“存储算力共识”子系统维护着一个“算力表”以追踪存储矿工actor通过Sector commitments时空证明已向网络贡献的存储量。

区块

区块

区块是组成Filecoin区块链的基础单位。 区块头包含与特定时间点相关的信息,随着时间的推移网络可以达成一致。

在Filecoin协议中,区块和区块头的功能是一样的。区块头包含到完整系统状态,消息和消息收据的默克尔链接,可以把区块想像成这些信息的整个集合(不仅仅是默克尔根,还有状态树、消息树和收据数等的全部数据。)因为区块本身是相关大的,所以链上包含的是区块头而不是完整的区块。协议中经常会将区块和区块头替换使用。

区块语法验证

语法验证涉及到可能会对区块和其消息执行的验证,但不需要引用如父状态树等的外部信息。 语法不合格的区块不能传输也不能被引用为父区块。 语法合格的区块头必须将其字段解码(分解)成如下面定义的类型。 语法合格的头必须拥有:

  • Epoch大于0,则Parents值界于1和5*ec.ExpectedLeaders之间,否则,Parents为空
  • 一个值非负的ParentWeight
  • 一个是ID类型的地址Miner
  • 一个非负值Epoch
  • 一个正值Timestamp
  • 一个其VRFResult非空的Ticket
  • ElectionPoStOutput包含:
    • 一个Candidates数组,数组项的值在1到EC.ExpectedLeaders之间
    • 一个非空的PoStRandomness字段
    • 一个非空的Proof字段

语法合格的完整区块必须符合以下条件:

  • 所有引用的消息都语法合格
  • 所有引用的父收据都语法合格
  • 区块头和所有包含的消息在序列化后的大小不能超过block.BlockMaxSize
  • 所有隐式消息的gas limit之和不能超过block.BlockGasLimit

注意对区块签名的验证需要访问来自父tipset状态的矿工worker地址和公钥,所以“签名验证”组成了语义验证的一部分。相似地,消息签名验证要求查询与每条消息关联的公钥,公钥来自位于每个区块父状态的账户actor。

区块语义验证

语义验证涉及的验证要求引用区块头和消息本身之外的信息,特别是区块在其上进行构建的父tipset和状态。

语义合格的区块必须拥有以下部分:

  • Parents:以字典序列出父区块头的 Ticket
  • Parents全都引用合法的区块并且自身也是合法的
  • ParentState:匹配通过执行父tipst内的消息而生成的状态树和tipset的父状态
  • ParentMessageReceipts:标识执行父tipset生成的收据列表,每条来自父tipset的独立消息都有一个收据
  • ParentWeight:区配直到并且包含着父tipset的链的重量
  • Epoch:大于其父区块的Epoch,且

1.不能晚于节点的本地时钟读取的epoch 2.不能早于在SPC EC Finality中定义的soft finality (注:本条规则仅在接收新的gossip区块,而不是第一次与链保持同步时应用)

  • Miner:在父tipset状态内的算力表中是活动的
  • Ticket :从来自父tipset区块头的最小ticket生成

Ticket.VRFResult被合法地使用Miner actor的账户公钥进行签名

  • ElectionPoStOutput:产出被合法生成的winning partial tickets

ElectionPoSt.Randomness的格式良好且被根据PoStLookback从过去的tipset适当地绘制 ElectionPoSt.Proof是一份验证ElectionPoSt.Candidates生成自Miner的合格扇区的合法证明 ElectionPoSt.Candidates包含格式良好的PoStCandidate,每一份PoStCandidate都有一个产生预期共识中的获胜ChallengeTicketPartialTicket

  • Timestamp:单位为秒,界于epoch窗口之内,隐含在创世区块时间戳和区块的Epoch
  • 所有的SECP消息都被使用它们的发送actor的worker账户密钥正确签名
  • BLSAggregate:使用发送actor的密钥对区块引用的BLS消息的CID数组进行签名
  • 一个合法的Signature,针对区块头内来自区块的Miner actor的worker账户公钥的字段

对于包含进区块的消息,除了验证它们的签名之外,不再进行语义验证。如果区块内包含的所有消息都是语法合法的,它们就会被执行并产生一个收据。

链同步系统可能分阶段执行语法和语义验证,以求最小化不必要的资源花费。

tipset

预期共识有概率在每个epoch内选举多个领导者,意味着一条Filecoin链可能在每个epoch内包含零或多个区块(每个选举的矿工一个区块)。来自同一epoch的区块被集合到一个tipset内。通过执行一个tipset内的所有消息来修改Filecoin状态树。

每个区块引用着一个父tipset,并在为当前epoch计划包含哪些消息时验证此tipset的状态。直到一个新区块被组织进一个tipset时,才能知晓此区块的消息将要应用到的状态。因此,执行一个独立的区块里的消息是没有意义的:一个新状态树只有在区块所属的tipset内的所有消息执行过后才能明了。 一个合法的tipset包含一个非空的区块集合,区块内拥有着互不相同的矿工且所有区块指定相同的:

  • Epoch
  • Parents
  • ParentWeight
  • StateRoot
  • ReceiptsRoot

位于一个tipset内的区块被按每个区块内的ticket的字节串的字典序列排列。

因为网络传播的延迟,矿工有可能在第N+1个epoch内遗漏在第N个epoch挖掘的合法区块。 协议中预期共识Chain Selection规定,这不会使新生产的区块变为非法,但它确实会减轻区块的weight,并降低其成为规范链的一部分的可能性。

(系统)希望区块出产者就他们如何选择要包含的消息进行协调,以避免重复,也最大化他们预期挣取的交易费用。

链是连接在一起的tipset序列。是Filecoin区块链中的单一执行历史。

链管理器

链管理器是区块链系统中的一个中央组件。为了选择一个最合适的区块链头,它追踪并更新由给定节点接收的彼此竞争的子链:在系统中它所知道的heaviest子链的最新区块。 这样做时,链管理器就是中央子系统,在一个Filecoin节点中为其它大量系统处理账薄,并暴露供这些系统使用的便利方法,使比如系统能对随机性采样,或查看最近哪个区块被最终确定下来。

链管理器接口和方法包含如下,其中有为了清晰性而对重要细节进行的扩展。

到来区块接待处

一旦区块被接收并传递进行语法和语义验证,它就必须被添加进本地的datastore之内,而不管它是否被认为是此刻最好的tip。将来来自其他矿工的区块可能会在它之上进行挖掘,在那种情况下我将想要它在手边以避免重新获取。

为了使这种验证检查更简单化,应该使用高度和父区块集合来索引区块。这样的话,带有同一高度和共同父区块的区块集合可能就会被快速查询出来。计算和缓存这些集合中由此产生的聚集状态可能会是有用的,这就在检查以哪个状态根启动一个区块时,若其拥有多个父区块,节省下额外的状态计算。

“链挑选”是Filecoin区块链工作方式中一个至关重要的组件。每条链都有一个关联的weight,记录着在其上进行挖掘出的区块的数量和它们追踪的算力。在一条更重的链上而不是轻链上进行挖掘总是可取的。然而矿工可能摒弃在过去挣取的区块奖励,在矿工们集中到一条最终链时,这条轻链可能被其他丧失任何区块奖励的矿工所抛弃。

但是,在最终的定局之前,一条指定的子链也可能在另一条在指定的轮次中挖掘出更重的链之后被放弃。为了快速适应这种情况,链管理器必须维护和更新所有的子链。

那就是说,对每个到来的区块,即使这个区块没有被添加到当前的最重tipset,链管理器也应该将其添加到它正在追踪的合适子链上,或者对它进行独立追踪,直到以下两种情况出现其一:

  • 尽管那条子链在接待另外一个区块,但仍然可以将区块添加到这条子链上
  • 可以将其丢弃,因为此区块在finality之前被挖掘出来
Chain Tips Manager

Chain Tips Manager是Filecoin共识中的一个子组件,在技术上取决于实现者,负责追踪Filecoin区块链中所有活动的tips,并追踪当前的best tipset是哪个。

本篇介绍了Filecoin中区块链子系统的一部分,但区块链子系统本身是个很大的系统,限于篇幅,本次介绍就进行到这里,星际联盟会在接下来的一篇文章中继续介绍区块链子系统的其余部分,请大家持续关注。

Filecoin规范系列 Filecoin规范①--节点系统 Filecoin规范②--时空证明 Filecoin规范③--虚拟机系统