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

揭秘Filecoin的设计文档丨第六部分:状态机与故障

本文主要讲述了Filecoin状态机与故障方面的问题

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

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

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

Filecoin状态机

Filecoin面向用户的大部分功能(支付、存储市场、电源表等)都是通过Filecoin状态机进行管理的。网络生成一系列块,并认同哪个块的“链”是正确的。每个块包含一系列称为消息的状态转换,以及应用这些消息后当前 global state 的检查点
这里的 global state 由一组行动者组成,每个行动者都有自己的私有状态。

参与者是相当于以太坊智能合约的FileCoin,本质上是FileCoin网络中的一个“对象”,具有状态和一组可用于与之交互的方法。每个参与者都有一个归因于它的filecoin余额、一个状态指针、一个代码cid(它告诉系统参与者的类型)和一个nonce(跟踪这个参与者发送的消息数量)。(未完待续:nonce实际上只需要外部用户界面参与者,也就是帐户参与者,我们会找到一种方法来清理它)

方法请求

对参与者调用方法有两种方法。

首先,要作为系统的外部 actor调用方法(也就是说,一个使用FileCoin的普通用户),您必须向网络发送一条已签名的message ,并向包含您的消息的矿工支付费用。message 上的签名必须与具有足够filecoin的帐户关联的密钥匹配,以支付消息执行的费用。这里的费用相当于比特币和以太坊的交易费用,与处理信息的工作成比例(比特币每字节的价格信息,以太坊使用“gas”的概念,我们也使用“gas”)

第二, actor可以在调用另一个参与者的某个方法的过程中对其调用方法。但是,这种情况唯一可能发生的时间是由于某个参与者被外部用户消息调用的结果(注意:用户调用的参与者可能调用另一个参与者,然后调用另一个参与者,执行所能承受的最深层次)。

状态代表

global state 建模为参与者地址到参与者结构的映射。这张地图是由一个IPLDHAMT实现的(待续未完:链接到我们的HAMT的规范)。每个参与者的 state 都是一个IPLD指针,指向一个完全由参与者定义的图形。

执行(对参与者调用方法)

消息执行目前完全依赖于“内置”代码和公共的外部接口。要调用它的方法和参与者分别在消息的方法和to字段中指定。方法参数被编码并放入消息的params字段中。编码是每种类型单独编码的cbor数组。

收据

每个消息执行都会生成一个回执。这些收据包含方法调用的编码返回值和退出代码。

存储

为参与者提供对 Storage 接口的访问,以满足他们对持久存储的需求。 Storage 接口描述了一个内容寻址块存储系统 (PutGet,以及指向参与者当前状态的指向该存储系统(HeadCommit) 的指针。

参与者可以将状态存储为单个块,或者实现任何可以构建在内容寻址块存储上的持久数据结构。实现可以提供数据结构实现来简化开发。当前接口只支持CBOR-IPLD ,但这将很快扩展为允许其他类型的IPLD数据结构(只要系统有相应的解析器)

通过调用 Head 来检索actors状态根的CID,然后使用 Get 来检索被引用的实际对象,可以首先访问给定actors的当前状态。

使用 Put 存储数据。可以放置任意数量的对象,但只保留其CID已提交的对象,或由已提交对象以某种方式链接到的对象。在方法调用返回后,将删除所有其他对象。通过 Put 存储的对象首先被封送到CBOR-IPLD ,然后被存储,返回的CID是一个32字节的sha2-256 cbor-ipld内容标识符。

Filecoin状态机参与者

filecoin actors的任何实现都必须与go filecoin actor实现完全兼容。下面的伪代码试图捕获大部分重要的逻辑,但是捕获所有细节需要嵌入Go FileCoin中的代码,因此目前为止,它只是提供信息的伪代码。

本规范规定了一组在FileCoin状态机中操作的参与者。所有类型都在基本类型编码规范中定义。

故障

故障是当协议中的参与者行为不正确并且需要惩罚的时候发生的事情。filecoin协议中有许多可能的错误,详细信息都记录在下文。

故障表

共识故障

  • 重复块提交斜线:
    • 条件:如果任何矿工在相同的链高度上张贴两个不同的区块。
    • 报告:任何人都可以调用 SlashConsensusFault 并传入两个有问题的块头。
    • 检查:链条检查两个块是否有效,高度是否相同,是否由同一个矿工正确签名。
    • 处罚:所有矿工抵押抵押品,他们所有的权力都被不可挽回地削减。

市场失灵

  • 迟交罚款:
    • 条件:如果矿工在验证期结束后,但在一代攻击阈值之前,发布他们的PoSt。
    • 报告:矿工照常提交他们的PoSt,但包括迟交的费用。
    • 检查:链首先检查提交是否在 generation attack threshold内,然后检查提供的费用是否与提交延迟的块数所需的费用匹配。
    • 处罚:矿工按延误的比例受到处罚。处罚通过标准的PoSt提交来执行。
      • 经济处罚:为了确定处罚金额,需要 CalculateLatePenalty(numLate) 。提交费用后,矿工的电力不会减少。
      • 权力惩罚:不降低矿工的权力。请注意,功率表的当前视图是用lookback参数计算的。
        • 为什么我们要用一个回溯参数来计算功率表?如果我们不使用lookback参数,那么我们需要在迟到的时间段内惩罚迟到的矿工。这很难有效地做到。例如,如果矿工A、B和C各自拥有1/3的网络功率,而C迟交证明,那么在这段时间内,A和B各自应拥有一半的网络功率(并且每个人都有50%的机会赢得区块)
          TODO:在规范上写入后期限和Gen攻击阈值的确切参数
    • 未完待续:在规范上写入后期限和Gen攻击阈值的确切参数
  • 未报告的存储故障切割:
    • 条件:如果矿工未按 generation attack threshold提交其PoSt。
    • 报告:网络中调用 SlashStorageFaults的任何其他人都可以对矿工进行切割。我们希望矿工们报告这些断层。
      • 未来的设计说明:向前看,我们应该补偿调用者,或者要求这样做
      • 注意:我们可以要求调用方法,作为共识规则的一部分(但这会变得复杂)。在这种情况下,有一个dos攻击,如果我让一个扇区的大量矿工同时失败,下一个区块矿工将被迫做大量的工作。这要么需要延长“气体限制”,要么需要其他方法来避免验证时间过长。
    • 检查:链检查矿工上一次提交的PoSt是在当前验证期开始之前,并且当前区块是在当前验证期的generation attack threshold之后。
    • 惩罚:惩罚由 storage market 参与者的 SlashStorageFaults执行。
      • 经济处罚:矿工失去所有抵押品。
      • 权力惩罚:矿工失去所有权力。
      • 注:如果矿工处于未提交PoSt的状态,则他们试图挖掘的任何区块都将无效,即使选举职能扇区选择了这些区块。(选举职能不应选择它们)
        • 未来设计说明:有一种方法可以容忍互联网连接故障。矿工运行的紧急PoSt不接受来自链的挑战,如果矿工在VDF攻击时间(基于amax)前重新连接,则他们可以提交紧急PoSt并获得延迟处罚费。
  • 报告的存储故障惩罚:
    • 条件:矿工提交的PoSt包含一组非空的“丢失扇区”。
    • 报告:矿工可以指定一些在证明期间未能证明的扇区。
      • 注意:这些错误由 ProveStorage 例程输出,并在发布证明时发布到链上。当矿工(例如)出现磁盘故障或其他本地数据损坏时,就会发生这种情况。
    • 检查:链检查证明是否与丢失的扇区一起验证。
    • 惩罚:矿工因与失踪扇区数量成比例的抵押物和权力而受到惩罚,这些扇区也从矿工试验场移除。
      • 待续未完:这里丢失的抵押品是否与剩余时间成比例?
      • 待续未完:检查两个证明之间的时间是否允许一代攻击,如果不允许,那么我们可能会重新考虑没有丢失的扇区。
    • 注意:如果这里遗漏了一个扇区,并且在事实发生后恢复,矿工可以简单地“重新提交”该扇区。他们仍然需要支付抵押品,但可以快速将数据重新引入系统,以避免客户因违反合同而叫停他们(确实有效,因为扇区通信/通信是相同的)
    • 注意:如果矿工暂时无法证明其部分数据,要等待暂时无法恢复,然后继续证明,如有必要,可延迟提交证明(支付适当费用,如上所述)。
  • 违约纠纷:
    • 条件:与矿工一起存储数据的客户机,矿工在约定的时间段结束前删除包含该数据的扇区。
    • 报告:客户要求对违规矿工行为人进行 ArbitrateDeal ,并与该矿工签订有关存储的协议。注:报告必须在矿工误移仓库的一个证明期内进行。
    • 检查:链检查交易是否由相关矿工正确签署,交易是否尚未到期,交易所引用的扇区是否已不在矿工证明集中。
    • 惩罚:矿工被惩罚的金额与错误删除的扇区成比例。这项罚款从他们的抵押物中扣除。
    • 注意:这意味着矿工不能将数据重新密封到不同的扇区。我们可以提出一个协议,客户明确同意矿工重新密封,但这更复杂,可日后再议。

下篇文章我们会介绍Filecoin加密和网络的相关内容,请持续关注我们~

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

发表评论

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

QR code