一、动机

在 Quorum Store (参见 AIP-26 )中,由于 Quorum Store 批次是不透明的,一个区块提案可能包含重复的交易。在 quorum store 中,由于拜占庭提议者,也可能出现重复的交易。重复的交易不能影响执行的正确性,即,第一个版本总是会成功,重复的将被丢弃。然而,人们担心重复的交易可能会影响区块的并行执行性能,因为它们可能引发冲突。我们建议在虚拟机中执行区块之前过滤掉重复的交易。

二、规范

我们引入了一个 TransactionDeduper 特性,该特性公开了一个 dedup 方法,以及这个特性的一个实现, TxnHashAndAuthenticatorDeduper,如下所述:

重复过滤是使用对 (raw_txn.hash(),authenticator) 进行的。哈希和签名都是必需的,因为在签名被验证和交易序言被检查之前就进行了去重。所以,例如,一个坏的交易可能包含一个与签名无关的 txn。如果事先进行了检查,那么只需要 txn 的哈希或签名其中之一。

该实现是为了避免和/或并行化最昂贵的操作而编写的。以下是步骤:

  1. 标记可能的重复项(顺序):使用一个辅助 HashMap,标记2+(发送者, seq_no)对的交易作为可能的重复项。如果没有可能的重复项,返回原始交易。
  2. 计算 txn 哈希(并行):对所有可能的重复项,计算 txn 哈希。这是一个昂贵的操作。
  3. 过滤重复项(顺序):使用一个带有上述计算的 txn 哈希和签名的辅助 HashSet,过滤实际的重复交易。

三、参考实现

实现已经在主分支中:PR 它在一个 onchain 配置标志后面,应该打开它来部署更改。

四、风险和缺点

  • 性能:我们的测试显示,每秒没有重复项的开销约为2ms,有大量(100s)重复项的开销约为10ms。虽然今天这是可以接受的,但随着我们的区块链执行的改进,我们可能需要重新考虑它(参见下面的可能的优化)。
  • 可能的行为变化:去重不期望改变区块执行的行为。然而,作为预防措施,行为在 onchain 配置后面,所以所有(非拜占庭)验证者将应用相同的算法。

五、未来潜力

我们可以通过创建一个新的特性实现来升级当前的过滤规范。一些可能的未来优化:

  1. 注意,步骤1中的可能的重复项彼此独立,所以它们可以独立地分组,并在步骤3中并行运行。
  2. 在验证者中的许多地方都计算了 Txn 哈希。每个 txn 的哈希缓存可以加速去重或后续操作。
  3. 如果签名验证在去重之前进行,那么只需要匹配重复的签名,而不是哈希。

六、建议的部署时间表

  • 里程碑1(计划):切入版本v1.6
  • 里程碑2(计划):在 devnet 中的 onchain 配置更改
  • 里程碑3(计划):在 testnet 中的 onchain 配置更改
  • 里程碑4(计划):通过治理提案在 mainnet 中的 onchain 配置更改