evmtool was not respecting the --genesis option (#7518)

* EVMTool should respect --genesis option

Update the code so that the genesis file option will be respected when
set. Also, default --fork options should set a rational base fee.

Signed-off-by: Danno Ferrin <danno@numisight.com>

---------

Signed-off-by: Danno Ferrin <danno@numisight.com>
pull/7522/head
Danno Ferrin 3 months ago committed by GitHub
parent d87650b944
commit a851507cb3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 3
      CHANGELOG.md
  2. 16
      datatypes/src/main/java/org/hyperledger/besu/datatypes/HardforkId.java
  3. 21
      ethereum/core/src/main/java/org/hyperledger/besu/ethereum/core/BlockHeader.java
  4. 26
      ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/EvmToolCommand.java
  5. 4
      ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/GenesisFileModule.java
  6. 14
      ethereum/evmtool/src/main/java/org/hyperledger/besu/evmtool/MainnetGenesisFileModule.java

@ -3,7 +3,8 @@
## [Unreleased] ## [Unreleased]
### Fixed ### Fixed
- **DebugMetrics**: Fixed a `ClassCastException` occurring in `DebugMetrics` when handling nested metric structures. Previously, `Double` values within these structures were incorrectly cast to `Map` objects, leading to errors. This update allows for proper handling of both direct values and nested structures at the same level. Issue# [#7383] - **DebugMetrics**: Fixed a `ClassCastException` occurring in `DebugMetrics` when handling nested metric structures. Previously, `Double` values within these structures were incorrectly cast to `Map` objects, leading to errors. This update allows for proper handling of both direct values and nested structures at the same level. Issue# [#7383](https://github.com/hyperledger/besu/pull/7383)
- `evmtool` was not respecting the `--genesis` setting, resulting in unexpected trace results. [#7433](https://github.com/hyperledger/besu/pull/7433)
### Tests ### Tests
- Added a comprehensive test case to reproduce the bug and verify the fix for the `ClassCastException` in `DebugMetrics`. This ensures that complex, dynamically nested metric structures can be handled without errors. - Added a comprehensive test case to reproduce the bug and verify the fix for the `ClassCastException` in `DebugMetrics`. This ensures that complex, dynamically nested metric structures can be handled without errors.

@ -14,6 +14,9 @@
*/ */
package org.hyperledger.besu.datatypes; package org.hyperledger.besu.datatypes;
import java.util.Comparator;
import java.util.stream.Stream;
/** Description and metadata for a hard fork */ /** Description and metadata for a hard fork */
public interface HardforkId { public interface HardforkId {
@ -112,6 +115,19 @@ public interface HardforkId {
public String description() { public String description() {
return description; return description;
} }
/**
* The most recent finalized mainnet hardfork Besu supports. This will change across versions
* and will be updated after mainnet activations.
*
* @return the most recently activated mainnet spec.
*/
public static MainnetHardforkId mostRecent() {
return Stream.of(MainnetHardforkId.values())
.filter(MainnetHardforkId::finalized)
.max(Comparator.naturalOrder())
.orElseThrow();
}
} }
/** List of all Ethereum Classic hard forks. */ /** List of all Ethereum Classic hard forks. */

@ -158,22 +158,23 @@ public class BlockHeader extends SealableBlockHeader
out.writeBytes(extraData); out.writeBytes(extraData);
out.writeBytes(mixHashOrPrevRandao); out.writeBytes(mixHashOrPrevRandao);
out.writeLong(nonce); out.writeLong(nonce);
if (baseFee != null) { do {
if (baseFee == null) break;
out.writeUInt256Scalar(baseFee); out.writeUInt256Scalar(baseFee);
}
if (withdrawalsRoot != null) { if (withdrawalsRoot == null) break;
out.writeBytes(withdrawalsRoot); out.writeBytes(withdrawalsRoot);
}
if (excessBlobGas != null && blobGasUsed != null) { if (excessBlobGas == null || blobGasUsed == null) break;
out.writeLongScalar(blobGasUsed); out.writeLongScalar(blobGasUsed);
out.writeUInt64Scalar(excessBlobGas); out.writeUInt64Scalar(excessBlobGas);
}
if (parentBeaconBlockRoot != null) { if (parentBeaconBlockRoot == null) break;
out.writeBytes(parentBeaconBlockRoot); out.writeBytes(parentBeaconBlockRoot);
}
if (requestsRoot != null) { if (requestsRoot == null) break;
out.writeBytes(requestsRoot); out.writeBytes(requestsRoot);
} } while (false);
out.endList(); out.endList();
} }

@ -478,7 +478,14 @@ public class EvmToolCommand implements Runnable {
.mixHash(Hash.ZERO) .mixHash(Hash.ZERO)
.nonce(0) .nonce(0)
.blockHeaderFunctions(new MainnetBlockHeaderFunctions()) .blockHeaderFunctions(new MainnetBlockHeaderFunctions())
.baseFee(component.getBlockchain().getChainHeadHeader().getBaseFee().orElse(null)) .baseFee(
component
.getBlockchain()
.getChainHeadHeader()
.getBaseFee()
.or(() -> genesisFileModule.providesGenesisConfigFile().getBaseFeePerGas())
.orElse(
protocolSpec.getFeeMarket().implementsBaseFee() ? Wei.of(0xa) : null))
.buildBlockHeader(); .buildBlockHeader();
Address contractAddress = Address contractAddress =
@ -519,13 +526,12 @@ public class EvmToolCommand implements Runnable {
lastTime = stopwatch.elapsed().toNanos(); lastTime = stopwatch.elapsed().toNanos();
} }
if (lastLoop) { if (lastLoop) {
if (messageFrame.getExceptionalHaltReason().isPresent()) { messageFrame
out.println(messageFrame.getExceptionalHaltReason().get()); .getExceptionalHaltReason()
} .ifPresent(haltReason -> out.println(haltReason));
if (messageFrame.getRevertReason().isPresent()) { messageFrame
out.println( .getRevertReason()
new String(messageFrame.getRevertReason().get().toArrayUnsafe(), UTF_8)); .ifPresent(bytes -> out.println(new String(bytes.toArrayUnsafe(), UTF_8)));
}
} }
} }
} }
@ -572,7 +578,7 @@ public class EvmToolCommand implements Runnable {
out.println("{"); out.println("{");
worldState worldState
.streamAccounts(Bytes32.ZERO, Integer.MAX_VALUE) .streamAccounts(Bytes32.ZERO, Integer.MAX_VALUE)
.sorted(Comparator.comparing(o -> o.getAddress().get().toHexString())) .sorted(Comparator.comparing(o -> o.getAddress().orElse(Address.ZERO).toHexString()))
.forEach( .forEach(
a -> { a -> {
var account = worldState.get(a.getAddress().get()); var account = worldState.get(a.getAddress().get());
@ -585,7 +591,7 @@ public class EvmToolCommand implements Runnable {
.map( .map(
e -> e ->
Map.entry( Map.entry(
e.getKey().get(), e.getKey().orElse(UInt256.ZERO),
account.getStorageValue(UInt256.fromBytes(e.getKey().get())))) account.getStorageValue(UInt256.fromBytes(e.getKey().get()))))
.filter(e -> !e.getValue().isZero()) .filter(e -> !e.getValue().isZero())
.sorted(Map.Entry.comparingByKey()) .sorted(Map.Entry.comparingByKey())

@ -18,6 +18,7 @@ import org.hyperledger.besu.cli.config.EthNetworkConfig;
import org.hyperledger.besu.cli.config.NetworkName; import org.hyperledger.besu.cli.config.NetworkName;
import org.hyperledger.besu.config.GenesisConfigFile; import org.hyperledger.besu.config.GenesisConfigFile;
import org.hyperledger.besu.config.GenesisConfigOptions; import org.hyperledger.besu.config.GenesisConfigOptions;
import org.hyperledger.besu.datatypes.HardforkId.MainnetHardforkId;
import org.hyperledger.besu.ethereum.chain.GenesisState; import org.hyperledger.besu.ethereum.chain.GenesisState;
import org.hyperledger.besu.ethereum.core.Block; import org.hyperledger.besu.ethereum.core.Block;
import org.hyperledger.besu.ethereum.core.BlockHeaderFunctions; import org.hyperledger.besu.ethereum.core.BlockHeaderFunctions;
@ -28,6 +29,7 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.file.Files; import java.nio.file.Files;
import java.util.Locale;
import java.util.Optional; import java.util.Optional;
import javax.inject.Named; import javax.inject.Named;
import javax.inject.Singleton; import javax.inject.Singleton;
@ -116,7 +118,7 @@ public class GenesisFileModule {
final JsonObject config = new JsonObject(); final JsonObject config = new JsonObject();
genesis.put("config", config); genesis.put("config", config);
config.put("chainId", 1337); config.put("chainId", 1337);
config.put("londonBlock", 0); config.put(MainnetHardforkId.mostRecent().toString().toLowerCase(Locale.ROOT) + "Time", 0);
genesis.put("baseFeePerGas", "0x3b9aca00"); genesis.put("baseFeePerGas", "0x3b9aca00");
genesis.put("gasLimit", "0x2540be400"); genesis.put("gasLimit", "0x2540be400");
genesis.put("difficulty", "0x0"); genesis.put("difficulty", "0x0");

@ -27,7 +27,6 @@ import org.hyperledger.besu.ethereum.mainnet.MainnetProtocolSchedule;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule; import org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule;
import org.hyperledger.besu.ethereum.mainnet.ProtocolScheduleBuilder; import org.hyperledger.besu.ethereum.mainnet.ProtocolScheduleBuilder;
import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecAdapters; import org.hyperledger.besu.ethereum.mainnet.ProtocolSpecAdapters;
import org.hyperledger.besu.evm.EvmSpecVersion;
import org.hyperledger.besu.evm.internal.EvmConfiguration; import org.hyperledger.besu.evm.internal.EvmConfiguration;
import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem; import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem;
@ -71,13 +70,12 @@ class MainnetGenesisFileModule extends GenesisFileModule {
} }
} }
var schedules = createSchedules(configOptions.getChainId().orElse(BigInteger.valueOf(1337))); if (fork.isPresent()) {
var schedule = var schedules = createSchedules(configOptions.getChainId().orElse(BigInteger.valueOf(1337)));
schedules.get( var schedule = schedules.get(fork.get().toLowerCase(Locale.getDefault()));
fork.orElse(EvmSpecVersion.defaultVersion().getName()) if (schedule != null) {
.toLowerCase(Locale.getDefault())); return schedule.get();
if (schedule != null) { }
return schedule.get();
} }
return MainnetProtocolSchedule.fromConfig( return MainnetProtocolSchedule.fromConfig(

Loading…
Cancel
Save