From 0a1abc02565905981e18b2ff64a2f7098627137f Mon Sep 17 00:00:00 2001 From: Holger Drewes Date: Mon, 6 Mar 2023 14:03:55 +0100 Subject: [PATCH 1/6] EVM: Rename evm debug logger to evm:evm (one for package, one for class), consistency, also, logger will otherwise be left out when run with evm:* --- packages/evm/src/evm.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/evm/src/evm.ts b/packages/evm/src/evm.ts index f5ed56afe10..a141e298e35 100644 --- a/packages/evm/src/evm.ts +++ b/packages/evm/src/evm.ts @@ -40,7 +40,7 @@ import type { } from './types' import type { Account } from '@ethereumjs/util' -const debug = createDebugLogger('evm') +const debug = createDebugLogger('evm:evm') const debugGas = createDebugLogger('evm:gas') // very ugly way to detect if we are running in a browser From 8ab875894b68ddba8490135554c1567d855ce0c6 Mon Sep 17 00:00:00 2001 From: Holger Drewes Date: Mon, 6 Mar 2023 14:06:17 +0100 Subject: [PATCH 2/6] VM: Rename message checkpoint to state checkpoint in debug message (there is a dedicated message checkpoint msg along msg logging) --- packages/vm/src/eei/vmState.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/vm/src/eei/vmState.ts b/packages/vm/src/eei/vmState.ts index 72880ca9c5e..d397bd2d831 100644 --- a/packages/vm/src/eei/vmState.ts +++ b/packages/vm/src/eei/vmState.ts @@ -68,7 +68,7 @@ export class VmState implements EVMStateAccess { if (this.DEBUG) { this._debug('-'.repeat(100)) - this._debug(`message checkpoint`) + this._debug(`state checkpoint`) } } @@ -89,7 +89,7 @@ export class VmState implements EVMStateAccess { } if (this.DEBUG) { - this._debug(`message checkpoint committed`) + this._debug(`state checkpoint committed`) } } @@ -127,7 +127,7 @@ export class VmState implements EVMStateAccess { } if (this.DEBUG) { - this._debug(`message checkpoint reverted`) + this._debug(`state checkpoint reverted`) } } From 348561e0ef7ec911d83bc81a575d920ac304ed7c Mon Sep 17 00:00:00 2001 From: Holger Drewes Date: Mon, 6 Mar 2023 14:33:13 +0100 Subject: [PATCH 3/6] EVM: CALL/CREATE debug exit msg differentiation --- packages/evm/src/evm.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/evm/src/evm.ts b/packages/evm/src/evm.ts index a141e298e35..9c54b8d9e4a 100644 --- a/packages/evm/src/evm.ts +++ b/packages/evm/src/evm.ts @@ -364,13 +364,13 @@ export class EVM implements EVMInterface { if (!message.code || message.code.length === 0) { exit = true if (this.DEBUG) { - debug(`Exit early on no code`) + debug(`Exit early on no code (CALL)`) } } if (errorMessage !== undefined) { exit = true if (this.DEBUG) { - debug(`Exit early on value transfer overflowed`) + debug(`Exit early on value transfer overflowed (CALL)`) } } if (exit) { @@ -482,13 +482,13 @@ export class EVM implements EVMInterface { if (message.code === undefined || message.code.length === 0) { exit = true if (this.DEBUG) { - debug(`Exit early on no code`) + debug(`Exit early on no code (CREATE)`) } } if (errorMessage !== undefined) { exit = true if (this.DEBUG) { - debug(`Exit early on value transfer overflowed`) + debug(`Exit early on value transfer overflowed (CREATE)`) } } if (exit) { From f2d046ac4823378036cba6e56d24583676719b5a Mon Sep 17 00:00:00 2001 From: Holger Drewes Date: Mon, 6 Mar 2023 23:13:00 +0100 Subject: [PATCH 4/6] EVM: avoid buffer copy in memory read (performance) --- packages/evm/src/memory.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/evm/src/memory.ts b/packages/evm/src/memory.ts index d39bbde3b71..b3050ef4326 100644 --- a/packages/evm/src/memory.ts +++ b/packages/evm/src/memory.ts @@ -70,7 +70,7 @@ export class Memory { const returnBuffer = Buffer.allocUnsafe(size) // Copy the stored "buffer" from memory into the return Buffer - const loaded = Buffer.from(this._store.slice(offset, offset + size)) + const loaded = this._store.slice(offset, offset + size) returnBuffer.fill(loaded, 0, loaded.length) if (loaded.length < size) { From b147be1305526bcacdf58d95033042eeb4f6e8dd Mon Sep 17 00:00:00 2001 From: Holger Drewes Date: Mon, 6 Mar 2023 21:16:52 +0100 Subject: [PATCH 5/6] EVM: Rewrite runCall() checkpoint/revert conditional for readability/simplification --- packages/evm/src/evm.ts | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/packages/evm/src/evm.ts b/packages/evm/src/evm.ts index 9c54b8d9e4a..8adad92e750 100644 --- a/packages/evm/src/evm.ts +++ b/packages/evm/src/evm.ts @@ -789,25 +789,15 @@ export class EVM implements EVMInterface { result.execResult.selfdestruct = {} result.execResult.gasRefund = BigInt(0) } - if (err) { - if ( - this._common.gteHardfork(Hardfork.Homestead) || - err.error !== ERROR.CODESTORE_OUT_OF_GAS - ) { - result.execResult.logs = [] - await this.eei.revert() - this._transientStorage.revert() - if (this.DEBUG) { - debug(`message checkpoint reverted`) - } - } else { - // we are in chainstart and the error was the code deposit error - // we do like nothing happened. - await this.eei.commit() - this._transientStorage.commit() - if (this.DEBUG) { - debug(`message checkpoint committed`) - } + if ( + err && + !(this._common.hardfork() === Hardfork.Chainstart && err.error === ERROR.CODESTORE_OUT_OF_GAS) + ) { + result.execResult.logs = [] + await this.eei.revert() + this._transientStorage.revert() + if (this.DEBUG) { + debug(`message checkpoint reverted`) } } else { await this.eei.commit() From bc8bce8064e173d738e12ffe0831993a3e00feb3 Mon Sep 17 00:00:00 2001 From: Holger Drewes Date: Mon, 6 Mar 2023 21:20:43 +0100 Subject: [PATCH 6/6] EVM: Added EIP check for transient storage checkpointing --- packages/evm/src/evm.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/evm/src/evm.ts b/packages/evm/src/evm.ts index 8adad92e750..894466b3e37 100644 --- a/packages/evm/src/evm.ts +++ b/packages/evm/src/evm.ts @@ -745,7 +745,7 @@ export class EVM implements EVMInterface { } await this.eei.checkpoint() - this._transientStorage.checkpoint() + if (this._common.isActivatedEIP(1153)) this._transientStorage.checkpoint() if (this.DEBUG) { debug('-'.repeat(100)) debug(`message checkpoint`) @@ -795,13 +795,13 @@ export class EVM implements EVMInterface { ) { result.execResult.logs = [] await this.eei.revert() - this._transientStorage.revert() + if (this._common.isActivatedEIP(1153)) this._transientStorage.revert() if (this.DEBUG) { debug(`message checkpoint reverted`) } } else { await this.eei.commit() - this._transientStorage.commit() + if (this._common.isActivatedEIP(1153)) this._transientStorage.commit() if (this.DEBUG) { debug(`message checkpoint committed`) }