由于并行会在不同路径同时处理交易,因此并行的一大难点就是状态冲突。即可能存在多个交易在同一时间段内对区块链上的同一部分数据(状态)进行读取或写入操作的情况。这种情况如果处理不当,会导致执行结果不确定。因为状态的更新顺序不同,最终的计算结果也会不同。举个例子,
假设有两个交易,交易 A 和交易 B,它们都试图对同一个账户的余额进行更新操作:
在这两种顺序中,最终余额都是 130,因为系统确保了交易执行的顺序一致性。
但在并行执行环境下,交易 A 和交易 B 可能同时读取初始余额 100 并进行各自的运算:
交易 A 读取到余额为 100,计算后更新余额为 110。
交易 B 也读取到余额为 100,计算后更新余额为 120。
在这种情况下,由于交易同时执行,导致最终余额只更新为 120,而不是 130,因为交易 A 和交易 B 的操作「覆盖」了对方的结果,产生了状态冲突。
这类状态冲突问题通常被叫做「数据覆盖」,即当交易试图同时修改相同的数据时,可能会相互覆盖对方的计算结果,导致最终状态不正确。另外一种状态冲突可能会导致的问题是无法保证执行顺序。由于多个交易在不同的时间段完成操作,会造成不同的执行顺序。顺序不同,可能会导致不同的计算结果,从而使结果不确定。
为了避免这种不确定性,区块链并行执行系统通常会引入一些冲突检测和回滚机制,或提前对交易进行依赖性分析,确保它们在不影响最终状态一致性的情况下并行执行。
乐观并行与确定性并行