BAF的想法是受到Tony在BAL研究的启发,事实上我最初是在他的帖子的回复中提出这个想法。下面我尝试更好地解释这个想法。
请将本文视为一个头脑风暴,而非最终设计。
时隙时间显然受到网络中状态变化扩散时间的限制,因为下一个区块构建者需要获取关于变化的信息。无论是以区块(待执行交易列表)的形式,还是以BAL(状态变化集)的形式,这意味着需要在全球范围内传输大量数据。
这种依赖性通常通过网络延迟的假设上限Δ来优雅地建模。然而,现实中,网络延迟取决于需要扩散的信息大小。
如果我们能够加快传输少量信息开始准备下一个区块,会怎么样?
BAF正是旨在做这件事。BAF是一个小型布隆过滤器,用于识别状态S中未被区块i访问的部分S'。因此,对S'的任何操作在区块i+1中都是安全的,即使不知道区块i的情况。
但布隆过滤器是"松散"的,这怎么可能有效?
我们使用BAL(关于使用哪种BAL类型的更多细节将在后续说明)并使用布隆过滤器压缩它以获得BAF。然后,我们使用e来表示状态中"未触及"(未访问)的部分。
我们可以将布隆过滤器视为有损压缩。它具有固定的小尺寸,并且:
- 存在误判(FP):我们认为某些e被访问,但实际上并未被访问
- 不存在漏判(FN):我们认为某些状态e未被访问,但实际上已被访问。
因此,尽管布隆过滤器不精确,但在我们以否定方式使用时,这不是问题。我们可能会排除过多的元素(由于误判),但永远不会包含被区块i修改的内容(因为那将是漏判)。
这个过滤器可以很小吗?
目前,未压缩的BAL平均大小为55 KB,每个条目长度为32 + 20 = 52字节。大约有1000个条目。
假设我们使用1 KB的布隆过滤器,它很容易放入IP数据包。这是8196位,为布隆过滤器提供了相当大的空间。布隆过滤器由k个哈希函数定义,每个函数将一个元素映射到8196个位置中的一个。添加元素时,这些位会被打开(如果尚未打开)。检查元素时,如果至少有一个位为0,我们可以确定该元素未被添加。
理想的哈希函数数量由以下公式定义
然后可以估算误判概率为:
使用此BAF的人可以检查给定交易是否可能干扰另一个区块,即使没有区块或BAL,也能确定它是否不会干扰。
BAF的内容和粒度应该是什么?
这里有多种设计选项:
- 账户级粒度与插槽级粒度
- 状态访问与状态修改
账户与插槽粒度
对于状态访问,账户级和插槽级粒度都可能有意义。账户级意味着过滤器更空,但结构性排除更多;插槽级意味着排除更少,但过滤器更饱和,这意味着误判率更高。上述2%的估算是基于后者。
对于交易发送者,还需要账户级排除以避免随机数冲突。
有趣的是,如果需要,我们可以通过使用二进制OR轻松地在同一个位图中组合两种不同的粒度,同时添加账户级交易发送者和插槽级状态访问信息。
状态访问与状态修改
请注意,根据定义,状态访问级别的BAF比状态修改级别的过滤器(我们现在称之为BMF)更饱和(具有更多的1)。
BMF
我们可以使用BMF帮助构建者开始准备他们的区块。假设BMF可以在时隙时间的很小一部分(比如300毫秒)内到达下一个区块构建者,它可用于开始准备不依赖于前一个区块的部分。
BMF可能有助于加快时隙时间,确保区块序列无冲突。通过了解区块i的BMF,区块i+1的构建者可以开始构建区块i-1和区块i之间不可变的状态。事实上,这使其能够在最后时刻决定是基于区块i还是区块i-1。
BAF
相反,BAF最终可能对并行区块构建有用。如果构建者遵守另一个区块的BAF,那么这两个区块在最终排序到链中时就变得可并行化,或者换句话说,顺序无关。
保护BAF(或BMF)
签名:BAF可以由区块生产者签名并强制执行
严格:如果签名并强制执行,我们可以要求BAF是精确的,不超过重新执行期间生成的过滤器
BAF定价
有些交易简单地访问大量状态,导致大型BAL和饱和的BAF。这显然会减少基于BMF的预构建和基于BAF的并行化的可能性。
使完整的BAF变得昂贵是否有意义?我不确定这是个好主意,但它可以成为设计空间的一部分。
不幸的组合
作为概率性过滤器,可能会发生某些组合即使访问(或修改)的状态并不大也会创建饱和的BAF。这是形成布隆过滤器位的哈希函数的不幸组合。
我们可以通过使用"旋转"布隆过滤器结构来缓解这种影响,方法是使哈希函数依赖于时隙号(或链高度)。我们甚至可以使这种变化逐渐进行,随着区块高度的增长,一次性地移入/移出哈希函数。



