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]