Skip to content

Commit 94f7c7d

Browse files
authored
EIP-3155 Last Call Nitpicks (#7455)
A lot of small nitpicks for standard tracing conformance * Change evmtool run defaults to mirror go-ethereum's choices * Add fields to run summary * Make EOF PC zero to section * Correct EXT*CALL min gas * fix section depth Signed-off-by: Danno Ferrin <[email protected]>
1 parent dc336f4 commit 94f7c7d

File tree

16 files changed

+164
-69
lines changed

16 files changed

+164
-69
lines changed

ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/CodeValidateSubCommand.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,11 @@
3535
import java.io.InputStreamReader;
3636
import java.util.ArrayList;
3737
import java.util.List;
38+
import java.util.function.Supplier;
3839
import java.util.stream.Collectors;
3940
import java.util.stream.IntStream;
4041

42+
import com.google.common.base.Suppliers;
4143
import org.apache.tuweni.bytes.Bytes;
4244
import org.web3j.utils.Strings;
4345
import picocli.CommandLine;
@@ -63,7 +65,7 @@ public class CodeValidateSubCommand implements Runnable {
6365

6466
@ParentCommand EvmToolCommand parentCommand;
6567

66-
private final EVM evm;
68+
private final Supplier<EVM> evm;
6769

6870
@CommandLine.Option(
6971
names = {"--file"},
@@ -83,12 +85,18 @@ public CodeValidateSubCommand() {
8385

8486
CodeValidateSubCommand(final EvmToolCommand parentCommand) {
8587
this.parentCommand = parentCommand;
86-
String fork = EvmSpecVersion.PRAGUE.getName();
87-
if (parentCommand != null && parentCommand.hasFork()) {
88-
fork = parentCommand.getFork();
89-
}
90-
ProtocolSpec protocolSpec = ReferenceTestProtocolSchedules.create().geSpecByName(fork);
91-
evm = protocolSpec.getEvm();
88+
String fork =
89+
parentCommand != null && parentCommand.hasFork()
90+
? parentCommand.getFork()
91+
: EvmSpecVersion.PRAGUE.getName();
92+
93+
evm =
94+
Suppliers.memoize(
95+
() -> {
96+
ProtocolSpec protocolSpec =
97+
ReferenceTestProtocolSchedules.create().geSpecByName(fork);
98+
return protocolSpec.getEvm();
99+
});
92100
}
93101

94102
@Override
@@ -155,12 +163,12 @@ public String considerCode(final String hexCode) {
155163
return "";
156164
}
157165

158-
EOFLayout layout = evm.parseEOF(codeBytes);
166+
EOFLayout layout = evm.get().parseEOF(codeBytes);
159167
if (!layout.isValid()) {
160168
return "err: layout - " + layout.invalidReason();
161169
}
162170

163-
Code code = evm.getCodeUncached(codeBytes);
171+
Code code = evm.get().getCodeUncached(codeBytes);
164172
if (code instanceof CodeInvalid codeInvalid) {
165173
return "err: " + codeInvalid.getInvalidReason();
166174
} else if (EOFContainerMode.INITCODE.equals(

ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommand.java

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151
import java.io.InputStream;
5252
import java.io.OutputStreamWriter;
5353
import java.io.PrintWriter;
54-
import java.time.Instant;
5554
import java.util.ArrayList;
5655
import java.util.Arrays;
5756
import java.util.Comparator;
@@ -152,13 +151,13 @@ void setBytes(final String optionValue) {
152151
names = {"--sender"},
153152
paramLabel = "<address>",
154153
description = "Calling address for this invocation.")
155-
private final Address sender = Address.ZERO;
154+
private final Address sender = Address.fromHexString("0x73656e646572");
156155

157156
@Option(
158157
names = {"--receiver"},
159158
paramLabel = "<address>",
160159
description = "Receiving address for this invocation.")
161-
private final Address receiver = Address.ZERO;
160+
private final Address receiver = Address.fromHexString("0x7265636569766572");
162161

163162
@Option(
164163
names = {"--create"},
@@ -169,7 +168,7 @@ void setBytes(final String optionValue) {
169168
names = {"--contract"},
170169
paramLabel = "<address>",
171170
description = "The address holding the contract code.")
172-
private final Address contract = Address.ZERO;
171+
private final Address contract = Address.fromHexString("0x7265636569766572");
173172

174173
@Option(
175174
names = {"--coinbase"},
@@ -379,7 +378,7 @@ public void run() {
379378
} else if (genesisFile != null) {
380379
genesisFileModule = GenesisFileModule.createGenesisModule(genesisFile);
381380
} else {
382-
genesisFileModule = GenesisFileModule.createGenesisModule(NetworkName.DEV);
381+
genesisFileModule = GenesisFileModule.createGenesisModule();
383382
}
384383
final EvmToolComponent component =
385384
DaggerEvmToolComponent.builder()
@@ -463,18 +462,20 @@ public void run() {
463462
BlockHeaderBuilder.create()
464463
.parentHash(Hash.EMPTY)
465464
.coinbase(coinbase)
466-
.difficulty(Difficulty.ONE)
467-
.number(1)
468-
.gasLimit(5000)
469-
.timestamp(Instant.now().toEpochMilli())
465+
.difficulty(
466+
Difficulty.fromHexString(
467+
genesisFileModule.providesGenesisConfigFile().getDifficulty()))
468+
.number(0)
469+
.gasLimit(genesisFileModule.providesGenesisConfigFile().getGasLimit())
470+
.timestamp(0)
470471
.ommersHash(Hash.EMPTY_LIST_HASH)
471472
.stateRoot(Hash.EMPTY_TRIE_HASH)
472473
.transactionsRoot(Hash.EMPTY)
473474
.receiptsRoot(Hash.EMPTY)
474475
.logsBloom(LogsBloomFilter.empty())
475476
.gasUsed(0)
476477
.extraData(Bytes.EMPTY)
477-
.mixHash(Hash.EMPTY)
478+
.mixHash(Hash.ZERO)
478479
.nonce(0)
479480
.blockHeaderFunctions(new MainnetBlockHeaderFunctions())
480481
.baseFee(component.getBlockchain().getChainHeadHeader().getBaseFee().orElse(null))
@@ -527,28 +528,30 @@ public void run() {
527528
}
528529
}
529530
}
530-
531-
if (lastLoop && messageFrameStack.isEmpty()) {
532-
final long evmGas = txGas - messageFrame.getRemainingGas();
533-
final JsonObject resultLine = new JsonObject();
534-
resultLine.put("gasUser", "0x" + Long.toHexString(evmGas));
535-
if (!noTime) {
536-
resultLine.put("timens", lastTime).put("time", lastTime / 1000);
537-
}
538-
resultLine
539-
.put("gasTotal", "0x" + Long.toHexString(evmGas))
540-
.put("output", messageFrame.getOutputData().toHexString());
541-
out.println();
542-
out.println(resultLine);
543-
}
544531
}
545532
lastTime = stopwatch.elapsed().toNanos();
546533
stopwatch.reset();
547-
if (showJsonAlloc && lastLoop) {
534+
if (lastLoop) {
548535
initialMessageFrame.getSelfDestructs().forEach(updater::deleteAccount);
536+
updater.clearAccountsThatAreEmpty();
549537
updater.commit();
550538
MutableWorldState worldState = component.getWorldState();
551-
dumpWorldState(worldState, out);
539+
final long evmGas = txGas - initialMessageFrame.getRemainingGas();
540+
final JsonObject resultLine = new JsonObject();
541+
resultLine
542+
.put("stateRoot", worldState.rootHash().toHexString())
543+
.put("output", initialMessageFrame.getOutputData().toHexString())
544+
.put("gasUsed", "0x" + Long.toHexString(evmGas))
545+
.put("pass", initialMessageFrame.getExceptionalHaltReason().isEmpty())
546+
.put("fork", protocolSpec.getName());
547+
if (!noTime) {
548+
resultLine.put("timens", lastTime).put("time", lastTime / 1000);
549+
}
550+
out.println(resultLine);
551+
552+
if (showJsonAlloc) {
553+
dumpWorldState(worldState, out);
554+
}
552555
}
553556
} while (remainingIters-- > 0);
554557

ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommandOptionsModule.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,5 +145,7 @@ EvmConfiguration provideEvmConfiguration() {
145145
}
146146

147147
/** Default constructor for the EvmToolCommandOptionsModule class. */
148-
public EvmToolCommandOptionsModule() {}
148+
public EvmToolCommandOptionsModule() {
149+
// This is only here because of JavaDoc linting
150+
}
149151
}

ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/GenesisFileModule.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,20 @@ static GenesisFileModule createGenesisModule(final File genesisFile) throws IOEx
111111
return createGenesisModule(Files.readString(genesisFile.toPath(), Charset.defaultCharset()));
112112
}
113113

114+
static GenesisFileModule createGenesisModule() {
115+
final JsonObject genesis = new JsonObject();
116+
final JsonObject config = new JsonObject();
117+
genesis.put("config", config);
118+
config.put("chainId", 1337);
119+
config.put("londonBlock", 0);
120+
genesis.put("baseFeePerGas", "0x3b9aca00");
121+
genesis.put("gasLimit", "0x2540be400");
122+
genesis.put("difficulty", "0x0");
123+
genesis.put("mixHash", "0x0000000000000000000000000000000000000000000000000000000000000000");
124+
genesis.put("coinbase", "0x0000000000000000000000000000000000000000");
125+
return createGenesisModule(genesis.toString());
126+
}
127+
114128
private static GenesisFileModule createGenesisModule(final String genesisConfig) {
115129
final JsonObject genesis = new JsonObject(genesisConfig);
116130
final JsonObject config = genesis.getJsonObject("config");

ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/MainnetGenesisFileModule.java

Lines changed: 60 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ ProtocolSchedule provideProtocolSchedule(
7171
}
7272
}
7373

74-
var schedules = createSchedules();
74+
var schedules = createSchedules(configOptions.getChainId().orElse(BigInteger.valueOf(1337)));
7575
var schedule =
7676
schedules.get(
7777
fork.orElse(EvmSpecVersion.defaultVersion().getName())
@@ -89,9 +89,9 @@ ProtocolSchedule provideProtocolSchedule(
8989
new NoOpMetricsSystem());
9090
}
9191

92-
public static Map<String, Supplier<ProtocolSchedule>> createSchedules() {
92+
public static Map<String, Supplier<ProtocolSchedule>> createSchedules(final BigInteger chainId) {
9393
return Map.ofEntries(
94-
Map.entry("frontier", createSchedule(new StubGenesisConfigOptions())),
94+
Map.entry("frontier", createSchedule(new StubGenesisConfigOptions().chainId(chainId))),
9595
Map.entry("homestead", createSchedule(new StubGenesisConfigOptions().homesteadBlock(0))),
9696
Map.entry("eip150", createSchedule(new StubGenesisConfigOptions().eip150Block(0))),
9797
Map.entry("eip158", createSchedule(new StubGenesisConfigOptions().eip158Block(0))),
@@ -102,43 +102,86 @@ public static Map<String, Supplier<ProtocolSchedule>> createSchedules() {
102102
Map.entry(
103103
"constantinoplefix", createSchedule(new StubGenesisConfigOptions().petersburgBlock(0))),
104104
Map.entry("petersburg", createSchedule(new StubGenesisConfigOptions().petersburgBlock(0))),
105-
Map.entry("istanbul", createSchedule(new StubGenesisConfigOptions().istanbulBlock(0))),
106105
Map.entry(
107-
"muirglacier", createSchedule(new StubGenesisConfigOptions().muirGlacierBlock(0))),
108-
Map.entry("berlin", createSchedule(new StubGenesisConfigOptions().berlinBlock(0))),
106+
"istanbul",
107+
createSchedule(new StubGenesisConfigOptions().istanbulBlock(0).chainId(chainId))),
108+
Map.entry(
109+
"muirglacier",
110+
createSchedule(new StubGenesisConfigOptions().muirGlacierBlock(0).chainId(chainId))),
111+
Map.entry(
112+
"berlin",
113+
createSchedule(new StubGenesisConfigOptions().berlinBlock(0).chainId(chainId))),
109114
Map.entry(
110115
"london",
111-
createSchedule(new StubGenesisConfigOptions().londonBlock(0).baseFeePerGas(0x0a))),
116+
createSchedule(
117+
new StubGenesisConfigOptions()
118+
.londonBlock(0)
119+
.baseFeePerGas(0x0a)
120+
.chainId(chainId))),
112121
Map.entry(
113-
"arrowglacier", createSchedule(new StubGenesisConfigOptions().arrowGlacierBlock(0))),
122+
"arrowglacier",
123+
createSchedule(
124+
new StubGenesisConfigOptions()
125+
.arrowGlacierBlock(0)
126+
.baseFeePerGas(0x0a)
127+
.chainId(chainId))),
114128
Map.entry(
115-
"grayglacier", createSchedule(new StubGenesisConfigOptions().grayGlacierBlock(0))),
129+
"grayglacier",
130+
createSchedule(
131+
new StubGenesisConfigOptions()
132+
.grayGlacierBlock(0)
133+
.baseFeePerGas(0x0a)
134+
.chainId(chainId))),
116135
Map.entry(
117136
"merge",
118137
createSchedule(
119-
new StubGenesisConfigOptions().mergeNetSplitBlock(0).baseFeePerGas(0x0a))),
138+
new StubGenesisConfigOptions()
139+
.mergeNetSplitBlock(0)
140+
.baseFeePerGas(0x0a)
141+
.chainId(chainId))),
120142
Map.entry(
121143
"shanghai",
122-
createSchedule(new StubGenesisConfigOptions().shanghaiTime(0).baseFeePerGas(0x0a))),
144+
createSchedule(
145+
new StubGenesisConfigOptions()
146+
.shanghaiTime(0)
147+
.baseFeePerGas(0x0a)
148+
.chainId(chainId))),
123149
Map.entry(
124150
"cancun",
125-
createSchedule(new StubGenesisConfigOptions().cancunTime(0).baseFeePerGas(0x0a))),
151+
createSchedule(
152+
new StubGenesisConfigOptions().cancunTime(0).baseFeePerGas(0x0a).chainId(chainId))),
126153
Map.entry(
127154
"cancuneof",
128-
createSchedule(new StubGenesisConfigOptions().cancunEOFTime(0).baseFeePerGas(0x0a))),
155+
createSchedule(
156+
new StubGenesisConfigOptions()
157+
.cancunEOFTime(0)
158+
.baseFeePerGas(0x0a)
159+
.chainId(chainId))),
129160
Map.entry(
130161
"prague",
131-
createSchedule(new StubGenesisConfigOptions().pragueTime(0).baseFeePerGas(0x0a))),
162+
createSchedule(
163+
new StubGenesisConfigOptions().pragueTime(0).baseFeePerGas(0x0a).chainId(chainId))),
132164
Map.entry(
133165
"pragueeof",
134-
createSchedule(new StubGenesisConfigOptions().pragueEOFTime(0).baseFeePerGas(0x0a))),
166+
createSchedule(
167+
new StubGenesisConfigOptions()
168+
.pragueEOFTime(0)
169+
.baseFeePerGas(0x0a)
170+
.chainId(chainId))),
135171
Map.entry(
136172
"futureeips",
137-
createSchedule(new StubGenesisConfigOptions().futureEipsTime(0).baseFeePerGas(0x0a))),
173+
createSchedule(
174+
new StubGenesisConfigOptions()
175+
.futureEipsTime(0)
176+
.baseFeePerGas(0x0a)
177+
.chainId(chainId))),
138178
Map.entry(
139179
"experimentaleips",
140180
createSchedule(
141-
new StubGenesisConfigOptions().experimentalEipsTime(0).baseFeePerGas(0x0a))));
181+
new StubGenesisConfigOptions()
182+
.experimentalEipsTime(0)
183+
.baseFeePerGas(0x0a)
184+
.chainId(chainId))));
142185
}
143186

144187
private static Supplier<ProtocolSchedule> createSchedule(final GenesisConfigOptions options) {

ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/trace/badcode.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@
99
"stdout": [
1010
{"pc":0,"op":96,"gas":"0x2540be400","gasCost":"0x3","memSize":0,"stack":[],"depth":1,"refund":0,"opName":"PUSH1"},
1111
{"pc":2,"op":239,"gas":"0x2540be3fd","gasCost":"0x0","memSize":0,"stack":["0x0"],"depth":1,"refund":0,"opName":"INVALID","error":"Bad instruction"},
12-
{"gasUser":"0x2540be400","gasTotal":"0x2540be400","output":"0x"}
12+
{"stateRoot":"0xfc9dc1be50c1b0a497afa545d770cc7064f0d71efbc4338f002dc2e086965d98","output":"0x","gasUsed":"0x2540be400","pass":false,"fork":"Cancun"}
1313
]
1414
}

ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/trace/charge-intrinsic.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,6 @@
7070
{"pc":24,"op":243,"gas":"0x45","gasCost":"0x0","memSize":96,"stack":["0x1","0x40"],"depth":2,"refund":0,"opName":"RETURN"},
7171
{"pc":22,"op":96,"gas":"0x71","gasCost":"0x3","memSize":96,"stack":["0x1"],"depth":1,"refund":0,"opName":"PUSH1"},
7272
{"pc":24,"op":243,"gas":"0x6e","gasCost":"0x0","memSize":96,"stack":["0x1","0x40"],"depth":1,"refund":0,"opName":"RETURN"},
73-
{"gasUser":"0x619e","gasTotal":"0x619e","output":"0x40"}
73+
{"stateRoot":"0xcb5e8e232189003640b6f131ea2c09b1791ffd2e8357f64610f638e9a11ab2d2","output":"0x40","gasUsed":"0x619e","pass":true,"fork":"Cancun"}
7474
]
7575
}

ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/trace/coinbase-cold.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@
77
"--coinbase",
88
"4444588443C3A91288C5002483449ABA1054192B",
99
"--fork",
10-
"paris"
10+
"london"
1111
],
1212
"stdin": "",
1313
"stdout": [
1414
{"pc":0,"op":65,"gas":"0x2540be400","gasCost":"0x2","memSize":0,"stack":[],"depth":1,"refund":0,"opName":"COINBASE"},
1515
{"pc":1,"op":49,"gas":"0x2540be3fe","gasCost":"0xa28","memSize":0,"stack":["0x4444588443c3a91288c5002483449aba1054192b"],"depth":1,"refund":0,"opName":"BALANCE"},
16-
{"pc":2,"op":255,"gas":"0x2540bd9d6","gasCost":"0x1388","memSize":0,"stack":["0x0"],"depth":1,"refund":0,"opName":"SELFDESTRUCT"},
17-
{"gasUser":"0x1db2","gasTotal":"0x1db2","output":"0x"}
16+
{"pc":2,"op":255,"gas":"0x2540bd9d6","gasCost":"0x1db0","memSize":0,"stack":["0x0"],"depth":1,"refund":0,"opName":"SELFDESTRUCT"},
17+
{"stateRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","output":"0x","gasUsed":"0x27da","pass":true,"fork":"London"}
1818
]
1919
}

ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/trace/coinbase-warm.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"stdout": [
1414
{"pc":0,"op":65,"gas":"0x2540be400","gasCost":"0x2","memSize":0,"stack":[],"depth":1,"refund":0,"opName":"COINBASE"},
1515
{"pc":1,"op":49,"gas":"0x2540be3fe","gasCost":"0x64","memSize":0,"stack":["0x4444588443c3a91288c5002483449aba1054192b"],"depth":1,"refund":0,"opName":"BALANCE"},
16-
{"pc":2,"op":255,"gas":"0x2540be39a","gasCost":"0x1388","memSize":0,"stack":["0x0"],"depth":1,"refund":0,"opName":"SELFDESTRUCT"},
17-
{"gasUser":"0x13ee","gasTotal":"0x13ee","output":"0x"}
16+
{"pc":2,"op":255,"gas":"0x2540be39a","gasCost":"0x1db0","memSize":0,"stack":["0x0"],"depth":1,"refund":0,"opName":"SELFDESTRUCT"},
17+
{"stateRoot":"0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421","output":"0x","gasUsed":"0x1e16","pass":true,"fork":"Shanghai"}
1818
]
1919
}

ethereum/evmtool/src/test/resources/org/hyperledger/besu/evmtool/trace/create-eof.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@
2020
{"pc":5,"section":0,"op":95,"gas":"0x2540be109","gasCost":"0x2","memSize":0,"stack":[],"depth":1,"refund":0,"opName":"PUSH0"},
2121
{"pc":6,"section":0,"op":95,"gas":"0x2540be107","gasCost":"0x2","memSize":0,"stack":["0x0"],"depth":1,"refund":0,"opName":"PUSH0"},
2222
{"pc":7,"section":0,"op":238,"immediate":"0x00","gas":"0x2540be105","gasCost":"0x0","memSize":0,"stack":["0x0","0x0"],"depth":1,"refund":0,"opName":"RETURNCONTRACT"},
23-
{"gasUser":"0x129b","gasTotal":"0x129b","output":"0x"}
23+
{"stateRoot":"0x9790b070a5749acec6a7252a867f795df3c2cb5b800fb509ea259a1c0b5d96c1","output":"0x","gasUsed":"0x129b","pass":true,"fork":"CancunEOF"}
2424
]
2525
}

0 commit comments

Comments
 (0)