IPFS进阶 | Filecoin 规范文档(五)

星际视界·热度: 2438
星际视界将持续翻译和整理官方正在编写的Filecoin网络协议的详细说明,并通过连载的方式,提供给中国研究者交流参考。


距离Filecoin测试网上线倒计时:61

星际视界将持续翻译和整理官方正在编写的Filecoin网络协议的详细说明,并通过连载的方式,提供给中国研究者交流参考。

区块生成

链的选择

链的权重

在等重的提示集之间进行选择

削减EC

预期共识

块创建

刮刮一张中奖彩票并配备有效的ElectionProof,矿工现在可以发布一个新的区块!

要创建区块,合格的矿工必须计算一些字段:

  • Tickets-包含新票证的数组,如果适用,还包含生成的任何中间票证,以证明对任何失败的选举尝试都有适当的延迟。
  • ElectionProof-来自Tickets数组证明的最终票证的签名。
  • ParentWeight-如链式
  • 加权中所述。
  • Parents -父块的CID。
  • ParentState-请注意,它不会以新生成的块结尾,但是必须进行计算才能生成其他字段。要计算这个:-ParentState的块中的一个的设置中所选择的父(不变的:这是一种用于在给定父集的所有块的值相同)。
  • -对于父集中的每个块,按其票证排序-按顺序将块中的每个消息应用于父状态。如果在上一个块中已经应用了一条消息,请跳过它。-交易费用将支付给包含该消息的第一个出现位置的区块的矿工。如果父集中有两个区块,并且它们都包含完全相同的一组消息,则第二个将不收取任何费用。-这对于父集的两个不同块中的消息发生冲突是有效的,也就是说,来自组合消息集的冲突消息将始终出错。不管冲突如何,所有消息都将应用于状态。-TODO:在状态机文档中定义消息冲突,并从此处链接到它
  • MsgRoot -计算:
  • -从内存池中选择一组消息以包括在该块中。-将邮件分为BLS签名邮件和secpk签名邮件-对于BLS消息:-去除消息中的签名,然后将所有裸露的Messages插入sharray中。-将所有的bls签名汇总到一个签名中,并使用它来填写BLSAggregate字段-对于secpk消息:-将每个secpk SignedMessage插入sharray-创建一个TxMeta对象并填写其每个字段,如下所示:-blsMessages:bls消息sharray的根cid-secpkMessages:secp消息sharray的根cid-TxMeta对象的cid 应该用于填充MsgRoot块头的字段。
  • BLSAggregate -使用BLS签名的块中所有消息的聚集签名。
  • StateRoot-将每个选定的消息应用于ParentState即可。
  • -注意:首先按照blsMsgs sharray中出现的顺序应用bls消息,然后按照它们在secpkMessages sharray中出现的顺序应用secpk消息。
  • ReceiptsRoot -计算:
  • -如上所述,将消息集应用于父状态,并在发生这种情况时收集调用回执。-将它们插入sharray并扎根。
  • Timestamp-创建块时生成的Unix时间戳。我们使用无符号整数表示UTC时间戳(以秒为单位)。新创建的块中的时间戳必须满足以下条件:
  • -该块上的时间戳不会在将来出现(ALLOWABLE_CLOCK_DRIFT宽限期可解决相对异步问题)-该块上的时间戳至少比其最新的父块高BLOCK_DELAY * len(block.Tickets),并且BLOCK_DELAY的值与为新票证生成有效VDF证明所需的值相同(当前设置为30秒) )。-我们还建议使用networkTime()函数在节点启动时启动,并经常运行以调用网络时间服务(例如ntp),并确保与网络其余部分的相对同步。-BlockSig-在整个区块上带有矿工私钥的签名(还必须与票证签名匹配)。这是为了确保在将区块传播到网络之后,没有人会篡改区块,因为与普通的PoW区块链不同,发现中奖彩票的方式与区块生成无关。合格的矿工可以先填写ParentsTickets然后ElectionProof使用票务检查过程中的值。

接下来,他们计算所选父块的汇总状态ParentState。这是通过获取块的父提示集的聚集父状态,按票证对父块进行排序并将每个块中的每个消息应用于该状态来完成的。

在较早的块中已被使用过的任何消息(重复消息)都应被跳过(无论如何,此消息的应用都将失败)。

请注意,重新应用的消息可能会导致收到的收据不同于其原始块中产生的收据,一个悬而未决的问题是如何表示此技巧组“虚拟块”的收据特里。

一旦矿工有了总量ParentState,他们就必须应用集体奖励。这是通过在状态树中将正确的块奖励金额添加到矿主的帐户余额中来完成的。奖励将立即在此区块中使用。

现在,选择一组消息放入该块中。对于每条消息,矿工msg.GasPrice * msg.GasLimit从发件人的帐户余额中扣除,如果发件人没有足够的资金(此消息不应包含在链中),则返回致命的处理错误。

然后,他们应用消息状态转换,并为其生成收据,其中包含执行实际使用的总气体,执行退出代码和返回值。然后,他们退还给发件人金额为(msg.GasLimit - GasUsed) * msg.GasPrice。如果出现消息处理错误,则将剩余的气体退还给用户,并恢复所有其他状态更改。(注意:这与以太坊的处理方式有所不同)

除非该消息执行失败,否则应将每个消息应用于上一个消息执行的结果状态,在这种情况下,将丢弃该消息引起的所有状态更改。此过程之后的最终状态树将是块的StateRoot

矿工将选定的消息集合存储起来,并将根放在中MsgRoot。他们将每次执行的收据收集到一个集合中,对它们进行折算,然后将其根放入ReceiptsRoot。最后,他们将StateRoot字段设置为结果状态。

请注意,ParentState预期共识文档中的字段被忽略了,这是为了帮助最小化块头的大小。任何给定父集的父状态应由客户端计算并本地缓存。

最后,矿工可以生成一个Unix时间戳以添加到其块中,以表明该块的生成已适当延迟。

自从生成父集中的最新块到时间戳并发送其块以来,矿工将一直等到BLOCK_DELAY过去。

我们建议使用NTP或其他时钟同步协议,以确保正确生成时间戳(不拒绝该块)。

虽然此时间戳无法提供硬性证明区块被延迟(我们依靠票证链中的VDF来做到),但它可以通过确保诚实的矿工拒绝未延迟的区块来提供某种较软的区块延迟形式。

现在该块已完成,剩下的就是对其进行签名。矿工立即序列化该块(没有签名字段),获取它的sha256哈希,并对该哈希进行签名。他们将结果签名放置在BlockSig字段中。

链的选择

正如在一轮中可以赢得0名矿工一样,在一轮中可以选举出多个矿工。这又意味着可以在一轮中创建多个块。为了避免浪费矿工完成的有效工作,EC使用了在一轮中生成的所有有效块。

链加权

叉子可能会在“预期共识”中自然出现。EC依靠加权链来快速收敛到“一条真实链”,而每个区块都会增加链的权重。这意味着最重的链应该反映出所执行的工作量最多,或者在Filecoin的情况下,应提供最多的存储量。

简而言之,每个块的权重等于其ParentWeight加上该块的增量权重。三角洲权重是一个由以下要素组成的术语:

-wForkFactor:它旨在减少源自轮次的权重,在轮次中,产生的技巧与诚实链可能产生的结果不符(指向自私的采矿或其他非自发采矿)。协作矿工行为)。

-wPowerFactor:与链的总功率成正比地增加链的权重,即在链的功率表中考虑。-wBlocksFactor:在给定回合中挖掘的块数成比例地增加链的权重。像wForkFactor一样,它奖励矿工的合作(根据期望,每轮将产生更多的区块)。

我们有:w [r + 1] = w [r] +地板(1000 *(wForkFactor(wPowerFactor [r + 1] + wBlocksFactor [r + 1])))

对于给定的提示集ts在回合r + 1中:

  • wBlocksFactor [r + 1] = v * | blocksInTipset(ts)|与v = vt * log2(totalPowerAtTipset(ts)* vs)/ vs
  • wPowerFactor [r + 1] = log2(totalPowerAtTipset(ts))
  • wForkFactor [r + 1] = CDF(X,k),带有X-> Bin(eNumberOfBlocksPerRound * numberOfMinersInPowerTable,1 / numberOfMinersInPowerTable)

权重应使用大整数算法并按上述操作顺序进行计算。乘以1,000和下限意味着在整个实现中帮助产生均匀的权重。

Note that if your implementation does not allow for rounding tothe fourth decimal, miners should apply the [tie-breaker below](#selecting-between-tipsets-with-equal-weight). Weight changes will be on the order of single digit numbers on expectation, so this should not have an outsized impact on chain consensusacross implementations.

Filecoin的链加权

这些参数的确切值有待确定,但出于测试目的,您可以使用:vt = 350 --vs = E-5

ParentWeight是给定块的父集的总链权重。

它是通过其ParentWeight任何父块(每个给定Tipset中的所有块都应具有相同的ParentWeight值)加上每个父块的增量权重来计算的。

为了简化计算,将一个块ParentWeight存储在块本身中(否则,可能需要进行长链扫描才能计算给定块的权重)。

在权重相等的提示音之间进行选择

在权重相等的提示之间进行选择时,矿工会选择最终票证最小的提示。

如果两个权重相同的小提示具有相同的最小票证,则矿工将比较下一个最小的票证(并选择下一个较小的票证的提示集)。这一直持续到选择了一个“提示”。

上述情况可能在某些块传播条件下发生。假设已经从区块A开采了三个区块B,C和D(分别由矿工1、2和3),并且minTicket(B)<minTicket©<minTicket(D)。

矿工1输出其块B并关闭。矿工2和3都收到B,但没有对方的块。我们让矿工2挖掘由B和C构成的Tipset,而矿工3挖掘由B和D构成的Tipset。

如果现在都成功挖掘了区块,则网络中的其他矿工将收到由重量相同且相同的Tipset构建的新区块。

最小机票(B街区的机票)。由于minTicket©<minTicket(D),他们应该选择在[B,C]顶部挖掘的块。

带有不同块的两个提示集具有所有相同票证的可能性可以认为是微不足道的:这等于在两个256位(或更多)抗碰撞哈希之间找到了碰撞。

削减EC

由于存在潜在的分叉,矿工可以尝试过分影响协议公平性。这意味着他们可以选择不考虑协议,从而获得通常应从网络存储中获得的功能上的优势。如果矿工被证明偏离了诚实的协议,则应予以削减。

当矿工提交满足以下“削减条件”之一的两个区块时,这是可检测到的:

(1)一个区块在其票证阵列中至少包含一张票证,该票证与另一区块的票证阵列中的票证在同一回合中生成。

(2)一个块的父对象是一个Tipset,根据Tipset有效性规则,它可能已经有效地包含了另一个块,但是第一个块的父对象不包括另一个块。

  • 虽然无法证明矿工通常会从“提示集”中删除已知的块(即网络延迟可能只是意味着该矿工没有收到特定的块),但在这种情况下,可以证明这一点,因为矿工必须知道他们开采的块在上一轮。

任何检测到这种情况的节点都应同时使用块头和call storagemarket.SlashConsensusFault。然后,网络将获取该节点的所有抵押品,将其一部分提供给报告者,其余部分保留。



《Filecoin规范文档》是系星际视界IPFSNEWS旗下【IPFS入门】板块泛IPFS领域知识普及栏目,未来将持续翻译整理Filecoin网络协议的详细说明,并通过连载的方式,提供给中国研究者交流参考。

声明:本文为入驻“火星号”作者作品,不代表火星财经官方立场。
转载请联系网页底部:内容合作栏目,邮件进行授权。授权后转载时请注明出处、作者和本文链接。 未经许可擅自转载本站文章,将追究相关法律责任,侵权必究。
提示:投资有风险,入市须谨慎,本资讯不作为投资理财建议。
免责声明:作为区块链信息平台,本站所提供的资讯信息不代表任何投资暗示,本站所发布文章仅代表个人观点,与火星财经官方立场无关。鉴于中国尚未出台数字资产相关政策及法规,请中国大陆用户谨慎进行数字货币投资。
语音技术由科大讯飞提供
关键字:  IPFSfilecoin
最近更新
本文来源:
原文标题:
24H热门新闻
暂无内容

评论0