我刚刚读完 Block-STM,我有一个问题我似乎根本无法理解。我从这两个链接学习过:
我不明白的是这部分:
Block-STM引入了协作调度器,它协调线程之间的验证和执行任务。预设的序列化顺序规定事务必须按顺序提交,因此成功验证化身并不能保证它可以提交。这是因为块中较早事务的中止和重新执行可能会使化身读取集无效并需要重新执行。因此,当事务中止时,所有更高级别的事务都会被安排重新验证。
通过论文中的示例,我了解到 tx2 的验证失败,因为它可能从 tx1 写入的同一内存位置读取数据,所以这里没有任何问题,我可以理解这一点。但是为什么 tx3 即使通过了验证过程也需要重新验证呢?好吧,根据算法,如果 tx3 通过了验证阶段,这意味着它根本不应该依赖于 tx1 或 tx2(它不访问 tx1 和 tx2 写入数据的位置)。那么,为什么 tx3 需要重新验证呢?根据我从论文中引用的部分,它说:
这是因为块中较早事务的中止和重新执行可能会使化身读取集无效并需要重新执行。因此,当事务中止时,所有更高级别的事务都会被安排重新验证。
但是,我认为,当且仅当其后的事务从较早的事务尝试写入的同一内存中读取时,较早的事务可能会导致其后的事务重新执行。所以,我完全不明白为什么我们需要“当交易中止时,所有更高级别的交易都被安排重新验证”这个条件。
任何人都可以给我一个例子,说明一个事务可能会导致后面的事务,即使它们没有访问与先前事务相同的内存。
我相信答案是,由于交易和智能合约包含任意逻辑,因此 tx_2 的重新执行有可能根据从 tx_1 读取的信息写入新位置。并且 tx_3 有可能已经从该位置读取,因此需要重新验证它。
一开始我也为此苦苦挣扎,但当你想到虚拟机被设计为处理任意逻辑这一事实时,这就有意义了。
我很高兴参与有关 Block-STM 的讨论,如果您还有其他问题,可以在 Telegram/twitter 上私信我:fikunmi_ap