From 742759e607f4d983b69fc4935d26c3e92acf9c36 Mon Sep 17 00:00:00 2001 From: jangko Date: Tue, 30 May 2023 23:15:04 +0700 Subject: [PATCH] optimize EVM memory extend --- nimbus/evm/memory.nim | 10 +++------- nimbus/evm/validation.nim | 5 +++++ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/nimbus/evm/memory.nim b/nimbus/evm/memory.nim index de1340fe1..b19f86221 100644 --- a/nimbus/evm/memory.nim +++ b/nimbus/evm/memory.nim @@ -28,11 +28,10 @@ proc len*(memory: Memory): int = proc extend*(memory: var Memory; startPos: Natural; size: Natural) = if size == 0: return - var newSize = ceil32(startPos + size) + let newSize = ceil32(startPos + size) if newSize <= len(memory): return - var sizeToExtend = newSize - len(memory) - memory.bytes = memory.bytes.concat(repeat(0.byte, sizeToExtend)) + memory.bytes.setLen(newSize) proc newMemory*(size: Natural): Memory = result = newMemory() @@ -51,9 +50,6 @@ proc write*(memory: var Memory, startPos: Natural, value: openArray[byte]) = let size = value.len if size == 0: return - validateLte(startPos + size, memory.len) - if memory.len < startPos + size: - memory.bytes = memory.bytes.concat(repeat(0.byte, memory.len - (startPos + size))) # TODO: better logarithmic scaling? - + validateLte(startPos + size, memory.len) for z, b in value: memory.bytes[z + startPos] = b diff --git a/nimbus/evm/validation.nim b/nimbus/evm/validation.nim index 7c567cbbb..eaf8343ed 100644 --- a/nimbus/evm/validation.nim +++ b/nimbus/evm/validation.nim @@ -34,6 +34,11 @@ proc validateLt*(value: UInt256 | int, maximum: int, title: string = "Value") = raise newException(ValidationError, &"{title} {value} is not less than {maximum}") +proc validateLte*(value: int, maximum: int, title: string = "Value") = + if value > maximum: + raise newException(ValidationError, + &"{title} {value} is not less or equal to {maximum}") + proc validateStackItem*(value: string) = if value.len > 32: raise newException(ValidationError,