Proof of Buy,一种专为Layer1设计的Layer2共识

补,如何解决L2出块间隙比L1短的情况下的出块共识问题

前面我们提及了proof of buy要在出块共识的时候通过 VDF + 支付L1 token的方式来竞选出块权, 但我没有解释一个问题,如何支付L1 token?

我们都知道, L2的出块间隔 跟L1往往不同, 如果L2比L1出块更慢还好, 倘若L2出块比L1更快呢? 此时,如果矿工支付L1 token来竞选高度为100的L2区块,那么当发起了一笔L1 token的转账之后,L2 的第100个区块已经要出块了,而L1的出块还早,这就导致你这个支付token的交易在L1上还未出块呢, L2已经出块了。 此时L2看不到此时L1 token谁支付的多,它便不知道当前块高的出块权应该给谁。

该问题如果不解决,那么使用proof of buy的L2的出块时长就必然会受制于L1的出块时长。 最终导致L2为求更好的解决方案不得不重回 pos + BFT之类的共识(比如 stacks的poX)

预支付

针对此类问题,proof of buy可启用预支付的方式,即矿工们可以提前一次性 为未来 N个区块 总共支付一笔L1 token。 然后每次L2出块时从中声明出部分额度来表示自己愿意为此次出块所支付的L1 token数量。具体流程如下:

从创始区块开始,矿工先在L1上隐私支付一笔token (我们假设其token数量是一个密文承诺,记作 A) 给proof of buy指定的地址。这之后, 每次L2出块的时候, 矿工在本地生成VDF Output的同时,也需要声明自己要为该区块支付的一笔L1 token数量,记作 a_n(a_n为明文数字,n表示块高。不需要在L2上真正支付,因为之前已经在L1上支付过了) 并生成一个zk proof,证明 a_0 + a_1 + … + a_n <= A, 此处表示自己已为该L2区块预支付过token了且金额足以支付从0到n的这些区块。

其他L2矿工拿到 (VDF_output,a_n, zk_proof) 之后, 根据L1上的A来验证 zk_proof,证明通过之后,将 VDF_output 和 a_n 代入计算中 来算出值 以得出该高度谁最终赢得出块权。

3 Likes