作者:雾月,极客web3众所周知,EVM的定位是Ethereum的“执行引擎”和“智能合约执行环境”,可以说是Ethereum最重要的核心组件之一。公链是一个包含成千上万节点的开放性网络,不同节点的硬件参数相差甚大,若想
作者:雾月,极客web3
众所周知,EVM的定位是Ethereum的“执行引擎”和“智能合约执行环境”,可以说是Ethereum最重要的核心组件之一。公链是一个包含成千上万节点的开放性网络,不同节点的硬件参数相差甚大,若想让智能合约在多个节点上都跑出相同结果,满足“一致性”,要设法在不同设备上都搭建出相同的环境,而虚拟机可以实现这个效果。
Ethereum的虚拟机EVM能在不同操作系统(如Windows、Linux、macOS)和设备上以相同的方式来运行智能合约,这种跨平台兼容性确保每个节点运行合约后,都能得到一致的结果。最典型的例子就是Java虚拟机JVM。
Sequencer作为Layer2的关键组件,以单个服务器的形式承接所有运算任务,如果与Sequencer配合的外部模块的效率都足够高,则最终的瓶颈将取决于Sequencer本身的效率,此时串行执行将成为巨大的阻碍。
opBNB团队曾通过对DA层和数据读写模块进行极致优化,Sequencer每秒最多可执行约2000多笔ERC-20转账。这个数字看起来很高,但如果要处理的交易比ERC-20转账复杂很多,TPS数值必然会大打折扣。所以说,交易处理的并行化将是未来的必然趋势。
下面我们将从更具体的细节入手,为大家详细解释传统EVM的局限性,以及并行EVM的优势。
Ethereum交易执行的两大核心组件
在代码模块层面,除EVM外,go-ethereum中与交易执行相关的另一核心组件是stateDB,用于管理Ethereum中的账户状态和数据存储。Ethereum采用名为MerklePatriciaTrie的树状结构来充当数据库索引(目录),EVM每一次交易执行都会变更stateDB中存放的某些数据,这些变更最终会反映在MerklePatriciaTrie(后面简称全局状态树)中。
我们从代码角度大致看下EVM和stateDB是如何协作执行交易的:
1.processBlock()函数会调用Process()函数处理一个区块中包含的交易;
processBlock()函数调用writeBlockWithState()函数,再调用statedb.Commit()函数,提交状态变更结果。
1.多线程并行执行交易:Reddio设置多个线程同时处理不同的交易,线程之间互不干扰。这可以几倍速提升交易处理速度。
2.为每个线程分配临时状态数据库:Reddio为每个线程都分配一个独立的临时状态数据库(pending-stateDB)。各个线程在执行交易时,不会直接修改全局的stateDB,而是将状态变化结果暂时记录在pending-stateDB中。
3.同步状态变更:在一个区块内的所有交易都执行完毕后,EVM会将每个pending-stateDB中记录的状态变更结果依次同步到全局stateDB中。如果不同交易在执行过程中没有发生状态冲突,就可以将pending-stateDB中的记录顺利合并到全局stateDB中。
Reddio对读写操作的处理方式进行了优化,以确保交易能够正确访问状态数据并避免冲突。
·读操作:当一个交易需要读取状态时,EVM会首先检查Pending-state的ReadSet。如果ReadSet显示存在所需数据,EVM就直接从pending-stateDB中读数据。如果ReadSet中没有找到对应的key-value(键值对),就从上一个区块对应的全局stateDB中读取历史状态数据。
·冲突检测:在交易执行过程中,EVM会监测不同交易的ReadSet和WriteSet。如果发现多个交易尝试读写相同的状态项,则视为发生冲突。
·冲突处理:当检测到冲突时,冲突交易将被标记为需要重新执行。
在所有交易都执行完成后,多个pending-stateDB中的变更记录会被合并到全局stateDB中。如果合并成功,EVM会将最终状态提交到全局状态树中,并生成新的状态根。
多线程并行优化对性能的提升是显而易见的,特别是应对复杂智能合约交易时。
根据并行EVM的研究显示,在低冲突工作负载(交易池中较少矛盾的或者占用相同资源的交易)中,基准测试的TPS相比传统的串行执行,提升了3~5倍左右。在高冲突工作负载中,理论上如果将所有优化手段都用上甚至可以达到60倍。
总结
Reddio的EVM多线程并行优化方案,通过为每个交易分配临时状态库,并在不同线程中并行执行交易,显著提高了EVM的交易处理能力。通过优化读写操作和引入冲突检测机制,EVM系公链能够在保证状态一致性的前提下,实现交易的大规模并行化,解决了传统串行执行模式带来的性能瓶颈。这为EthereumRollup未来的发展奠定了重要基础。
后续我们会进一步深入分析Reddio的实现细节,如如何进一步从优化存储效率提升效率,冲突高发时的优化方案,以及如何借助GPU做优化等等内容。