This is an automated email from the ASF dual-hosted git repository.

toulmean pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-tuweni.git


The following commit(s) were added to refs/heads/main by this push:
     new 74c9b15  Add support for extcodehash
     new 76b0bda  Merge pull request #280 from atoulme/add_extcodehash_support
74c9b15 is described below

commit 74c9b158a2c4d630041f03ed0544b31c130eab65
Author: Antoine Toulme <[email protected]>
AuthorDate: Tue Jun 15 21:48:29 2021 +0200

    Add support for extcodehash
---
 .../org/apache/tuweni/evm/impl/OpcodeRegistry.kt     |  4 ++++
 .../org/apache/tuweni/evm/impl/berlin/OpCodes.kt     | 20 ++++++++++++++------
 .../org/apache/tuweni/evm/impl/istanbul/OpCodes.kt   |  8 ++++++++
 .../org/apache/tuweni/evm/EVMBrokenMetreAttack.kt    | 18 +++++++++---------
 evm/src/test/resources/logback.xml                   | 14 +++++++++++---
 5 files changed, 46 insertions(+), 18 deletions(-)

diff --git a/evm/src/main/kotlin/org/apache/tuweni/evm/impl/OpcodeRegistry.kt 
b/evm/src/main/kotlin/org/apache/tuweni/evm/impl/OpcodeRegistry.kt
index 716873a..ba63e57 100644
--- a/evm/src/main/kotlin/org/apache/tuweni/evm/impl/OpcodeRegistry.kt
+++ b/evm/src/main/kotlin/org/apache/tuweni/evm/impl/OpcodeRegistry.kt
@@ -40,6 +40,7 @@ import org.apache.tuweni.evm.impl.berlin.div
 import org.apache.tuweni.evm.impl.berlin.dup
 import org.apache.tuweni.evm.impl.berlin.eq
 import org.apache.tuweni.evm.impl.berlin.exp
+import org.apache.tuweni.evm.impl.berlin.extcodehash
 import org.apache.tuweni.evm.impl.berlin.extcodesize
 import org.apache.tuweni.evm.impl.berlin.gas
 import org.apache.tuweni.evm.impl.berlin.gasLimit
@@ -138,6 +139,8 @@ class OpcodeRegistry(val opcodes: Map<HardFork, Map<Byte, 
Opcode>>) {
       berlinOpcodes[0x39] = codecopy
       berlinOpcodes[0x3a] = gasPrice
       berlinOpcodes[0x3b] = extcodesize
+      berlinOpcodes[0x3f] = extcodehash
+
       berlinOpcodes[0x40] = blockhash
       berlinOpcodes[0x41] = coinbase
       berlinOpcodes[0x42] = timestamp
@@ -211,6 +214,7 @@ class OpcodeRegistry(val opcodes: Map<HardFork, Map<Byte, 
Opcode>>) {
       istanbulOpcodes[0x39] = org.apache.tuweni.evm.impl.istanbul.codecopy
       istanbulOpcodes[0x3a] = org.apache.tuweni.evm.impl.istanbul.gasPrice
       istanbulOpcodes[0x3b] = org.apache.tuweni.evm.impl.istanbul.extcodesize
+      istanbulOpcodes[0x3f] = org.apache.tuweni.evm.impl.istanbul.extcodehash
       istanbulOpcodes[0x40] = org.apache.tuweni.evm.impl.istanbul.blockhash
       istanbulOpcodes[0x41] = org.apache.tuweni.evm.impl.istanbul.coinbase
       istanbulOpcodes[0x42] = org.apache.tuweni.evm.impl.istanbul.timestamp
diff --git a/evm/src/main/kotlin/org/apache/tuweni/evm/impl/berlin/OpCodes.kt 
b/evm/src/main/kotlin/org/apache/tuweni/evm/impl/berlin/OpCodes.kt
index fa54494..9abd201 100644
--- a/evm/src/main/kotlin/org/apache/tuweni/evm/impl/berlin/OpCodes.kt
+++ b/evm/src/main/kotlin/org/apache/tuweni/evm/impl/berlin/OpCodes.kt
@@ -344,6 +344,10 @@ val sstore = Opcode { gasManager, hostContext, stack, msg, 
_, _, _ ->
     if (null == key || null == value) {
       return@runBlocking Result(EVMExecutionStatusCode.STACK_UNDERFLOW)
     }
+    val remainingGas = gasManager.gasLeft()
+    if (remainingGas <= 2300) {
+      return@runBlocking Result(EVMExecutionStatusCode.OUT_OF_GAS)
+    }
 
     val address = msg.destination
     val slotIsWarm = hostContext.warmUpStorage(address, key)
@@ -363,11 +367,6 @@ val sstore = Opcode { gasManager, hostContext, stack, msg, 
_, _, _ ->
     }.add(if (slotIsWarm) Gas.ZERO else Gas.valueOf(2100))
     gasManager.add(cost)
 
-    val remainingGas = gasManager.gasLeft()
-    if (remainingGas <= 2300) {
-      return@runBlocking Result(EVMExecutionStatusCode.OUT_OF_GAS)
-    }
-
     // 
frame.incrementGasRefund(gasCalculator().calculateStorageRefundAmount(account, 
key, value))
 
     hostContext.setStorage(address, key, value)
@@ -389,7 +388,8 @@ val sload = Opcode { gasManager, hostContext, stack, msg, 
_, _, _ ->
   Result()
 }
 
-val stop = Opcode { _, _, _, _, _, _, _ ->
+val stop = Opcode { gasManager, _, _, _, _, _, _ ->
+  gasManager.add(0L)
   Result(EVMExecutionStatusCode.SUCCESS)
 }
 
@@ -594,6 +594,14 @@ val extcodesize = Opcode { gasManager, hostContext, stack, 
msg, _, _, _ ->
   }
 }
 
+val extcodehash = Opcode { gasManager, hostContext, stack, msg, _, _, _ ->
+  gasManager.add(700)
+  runBlocking {
+    stack.push(Hash.keccak256(hostContext.getCode(msg.destination)))
+    Result()
+  }
+}
+
 val msize = Opcode { gasManager, _, stack, _, _, _, memory ->
   gasManager.add(2)
   stack.push(memory.allocatedBytes())
diff --git a/evm/src/main/kotlin/org/apache/tuweni/evm/impl/istanbul/OpCodes.kt 
b/evm/src/main/kotlin/org/apache/tuweni/evm/impl/istanbul/OpCodes.kt
index 50160de..6c60a69 100644
--- a/evm/src/main/kotlin/org/apache/tuweni/evm/impl/istanbul/OpCodes.kt
+++ b/evm/src/main/kotlin/org/apache/tuweni/evm/impl/istanbul/OpCodes.kt
@@ -587,6 +587,14 @@ val extcodesize = Opcode { gasManager, hostContext, stack, 
msg, _, _, _ ->
   }
 }
 
+val extcodehash = Opcode { gasManager, hostContext, stack, msg, _, _, _ ->
+  gasManager.add(700)
+  runBlocking {
+    stack.push(Hash.keccak256(hostContext.getCode(msg.destination)))
+    Result()
+  }
+}
+
 val msize = Opcode { gasManager, _, stack, _, _, _, memory ->
   gasManager.add(2)
   stack.push(memory.allocatedBytes())
diff --git a/evm/src/test/kotlin/org/apache/tuweni/evm/EVMBrokenMetreAttack.kt 
b/evm/src/test/kotlin/org/apache/tuweni/evm/EVMBrokenMetreAttack.kt
index e3a626c..4dd894a 100644
--- a/evm/src/test/kotlin/org/apache/tuweni/evm/EVMBrokenMetreAttack.kt
+++ b/evm/src/test/kotlin/org/apache/tuweni/evm/EVMBrokenMetreAttack.kt
@@ -38,31 +38,31 @@ import org.junit.jupiter.api.Disabled
 import org.junit.jupiter.api.Test
 import org.junit.jupiter.api.extension.ExtendWith
 
-@Disabled
 @ExtendWith(LuceneIndexWriterExtension::class, BouncyCastleExtension::class)
 class EVMBrokenMetreAttack {
 
   @Test
   fun testBrokenMetreAttackBalance(@LuceneIndexWriter writer: IndexWriter) = 
runBlocking {
-    runAttack("31", writer)
+    runAttack("31", writer, EVMExecutionStatusCode.OUT_OF_GAS)
   }
 
   @Test
   fun testBrokenMetreAttackExtcodeSize(@LuceneIndexWriter writer: IndexWriter) 
= runBlocking {
-    runAttack("3B", writer)
+    runAttack("3B", writer, EVMExecutionStatusCode.STACK_OVERFLOW)
   }
 
   @Test
   fun testBrokenMetreAttackExtcodeHash(@LuceneIndexWriter writer: IndexWriter) 
= runBlocking {
-    runAttack("3F", writer)
+    runAttack("3F", writer, EVMExecutionStatusCode.STACK_OVERFLOW)
   }
 
+  @Disabled("Not implemented yet")
   @Test
   fun testBrokenMetreAttackStaticCall(@LuceneIndexWriter writer: IndexWriter) 
= runBlocking {
-    runAttack("FA", writer)
+    runAttack("FA", writer, EVMExecutionStatusCode.STACK_OVERFLOW)
   }
 
-  private suspend fun runAttack(opcode: String, writer: IndexWriter) {
+  private suspend fun runAttack(opcode: String, writer: IndexWriter, 
expectedStatusCode: EVMExecutionStatusCode) {
     val address = 
Address.fromHexString("0x5a31505a31505a31505a31505a31505a31505a31")
     val code = createAttack(opcode)
     val stateStore = MapKeyValueStore<Bytes, Bytes>()
@@ -89,16 +89,16 @@ class EVMBrokenMetreAttack {
       Bytes.fromHexString("0x"),
       code,
       Bytes.fromHexString("0x"),
-      Gas.valueOf(10000000),
+      Gas.valueOf(10_000_000),
       Wei.valueOf(1),
       address,
       123L,
       123L,
-      100000000,
+      10_000_000,
       UInt256.valueOf(1234),
       revision = HardFork.ISTANBUL,
     )
-    assertEquals(EVMExecutionStatusCode.OUT_OF_GAS, result.statusCode)
+    assertEquals(expectedStatusCode, result.statusCode)
   }
 
   private fun createAttack(opcode: String): Bytes {
diff --git a/evm/src/test/resources/logback.xml 
b/evm/src/test/resources/logback.xml
index cb63fd5..09fe3a7 100644
--- a/evm/src/test/resources/logback.xml
+++ b/evm/src/test/resources/logback.xml
@@ -14,14 +14,22 @@
 <configuration>
 
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
-        <!-- encoders are assigned the type
-             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
         <encoder>
             <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - 
%msg%n</pattern>
         </encoder>
     </appender>
 
-    <root level="info">
+    <appender name="EVM" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>%msg%n</pattern>
+        </encoder>
+    </appender>
+
+    <root level="error">
         <appender-ref ref="STDOUT" />
     </root>
+
+<!--    <logger level="error" name="org.apache.tuweni.evm.impl.EvmVmImpl" 
additivity="false">-->
+<!--        <appender-ref ref="EVM" />-->
+<!--    </logger>-->
 </configuration>
\ No newline at end of file

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to