Filecoin 中生成 Ticket 过程

Chunhui Shi
4 min readSep 27, 2019

先来看挖矿是怎么开始的

首先,会启动一个 timeScheduler

这个 timeScheduler 调用其 Start() 方法启动 worker 线程来执行工作。

注意有一个 pollHeadFunc 回调函数,它的作用是选择一个权重最大的 TipSet(通常来说,头部的 TipSet 会是权重最大的,基于 Chain Selection 原则)

选择 Tipset 的工作是由 chainReader 调用其 GetTipSet(tipset_head_key) 方法来得到的:

简单来说,就是拿到 TipSet Head,而 PollHeadFunc 就是这个作用。

timeScheduler 的 worker 启动之后,这个拿到的 TipSet 作为 base TipSet,由于运转过程中,在这个 base TipSet 之后还会不断产生其他 TipSet(因为可能是空块),因此把所有产生的 TipSet 作为 prevTipset,并由此来生成 ticketArray。

注意,如果 miner 之前没有 mine 过,也就是没有选举过(也即 prev TipSet 是空),那么直接返回一个空的 ticketArray。如果 mine 的是另一个 tipSet,也返回空 ticketArray。

然后调用 worker.Mine(),这个方法中,会调用 TipSet 对象的 MinTicket() 方法来得到其中所有 blocks 中的最小的 ticket。

拿到的这个 ticket 就是 parent ticket,然后由其来生成一个新的 ticket。

具体过程就是调用 TicketMachine 的 NextTicket() 方法,对 parent Ticket 的 VDFResult[] 进行签名的到 VRFPi,最终得到 new ticket。

具体代码如下:

NextTicket creates a new ticket from a parent ticket by running a verifiable randomness function on the VDF output of the parent.

The output ticket is not finalized until it has been run through NotarizeTime.

NotarizeTime finalizes the input ticket by running a verifiable delay function on the input ticket’s VRFProof.

It updates the VDFResult and VDFProof of the input ticket.

现在还没实现 VRF ,源码中是通过 sleep 来实现的。如下:

得到 new ticket 之后,就运行 RunElection() 和 IsElectionWinner() 得到 EP, ElectionProof 和是否赢得 Election 的结果,如果确认赢得 Election,就可以生成 Block 并打包广播了。

如果你对我的文章感兴趣,欢迎留言或者关注我的专栏。

微信公众号:“知辉”

搜索“deliverit”或

扫描二维码

--

--