use of org.hyperledger.besu.evm.EVM in project besu by hyperledger.
the class EvmToolCommand method run.
@Override
public void run() {
try {
final EvmToolComponent component = DaggerEvmToolComponent.builder().dataStoreModule(new DataStoreModule()).genesisFileModule(network == null ? genesisFile == null ? GenesisFileModule.createGenesisModule(NetworkName.DEV) : GenesisFileModule.createGenesisModule(genesisFile) : GenesisFileModule.createGenesisModule(network)).evmToolCommandOptionsModule(daggerOptions).metricsSystemModule(new MetricsSystemModule()).build();
final BlockHeader blockHeader = BlockHeaderBuilder.create().parentHash(Hash.EMPTY).coinbase(Address.ZERO).difficulty(Difficulty.ONE).number(1).gasLimit(5000).timestamp(Instant.now().toEpochMilli()).ommersHash(Hash.EMPTY_LIST_HASH).stateRoot(Hash.EMPTY_TRIE_HASH).transactionsRoot(Hash.EMPTY).receiptsRoot(Hash.EMPTY).logsBloom(LogsBloomFilter.empty()).gasUsed(0).extraData(Bytes.EMPTY).mixHash(Hash.EMPTY).nonce(0).blockHeaderFunctions(new MainnetBlockHeaderFunctions()).buildBlockHeader();
Log4j2ConfiguratorUtil.setAllLevels("", repeat == 0 ? Level.INFO : Level.OFF);
int repeat = this.repeat;
Log4j2ConfiguratorUtil.setLevel("org.hyperledger.besu.ethereum.mainnet.ProtocolScheduleBuilder", Level.OFF);
final ProtocolSpec protocolSpec = component.getProtocolSpec().apply(0);
Log4j2ConfiguratorUtil.setLevel("org.hyperledger.besu.ethereum.mainnet.ProtocolScheduleBuilder", null);
final PrecompileContractRegistry precompileContractRegistry = protocolSpec.getPrecompileContractRegistry();
final EVM evm = protocolSpec.getEvm();
Code code = evm.getCode(Hash.hash(codeHexString), codeHexString);
final Stopwatch stopwatch = Stopwatch.createUnstarted();
long lastTime = 0;
do {
final boolean lastLoop = repeat == 0;
final // You should have picked Mercy.
OperationTracer tracer = lastLoop && showJsonResults ? new StandardJsonTracer(System.out, !noMemory) : OperationTracer.NO_TRACING;
var updater = component.getWorldUpdater();
updater.getOrCreate(sender);
updater.getOrCreate(receiver);
final Deque<MessageFrame> messageFrameStack = new ArrayDeque<>();
messageFrameStack.add(MessageFrame.builder().type(MessageFrame.Type.MESSAGE_CALL).messageFrameStack(messageFrameStack).worldUpdater(updater).initialGas(gas).contract(Address.ZERO).address(receiver).originator(sender).sender(sender).gasPrice(gasPriceGWei).inputData(callData).value(ethValue).apparentValue(ethValue).code(code).blockValues(blockHeader).depth(0).completer(c -> {
}).miningBeneficiary(blockHeader.getCoinbase()).blockHashLookup(new BlockHashLookup(blockHeader, component.getBlockchain())).build());
final MessageCallProcessor mcp = new MessageCallProcessor(evm, precompileContractRegistry);
stopwatch.start();
while (!messageFrameStack.isEmpty()) {
final MessageFrame messageFrame = messageFrameStack.peek();
mcp.process(messageFrame, tracer);
if (lastLoop) {
if (messageFrame.getExceptionalHaltReason().isPresent()) {
out.println(messageFrame.getExceptionalHaltReason().get());
}
if (messageFrame.getRevertReason().isPresent()) {
out.println(new String(messageFrame.getRevertReason().get().toArray(), StandardCharsets.UTF_8));
}
}
if (messageFrameStack.isEmpty()) {
stopwatch.stop();
if (lastTime == 0) {
lastTime = stopwatch.elapsed().toNanos();
}
}
if (lastLoop && messageFrameStack.isEmpty()) {
final Transaction tx = new Transaction(0, Wei.ZERO, Long.MAX_VALUE, Optional.ofNullable(receiver), Wei.ZERO, null, callData, sender, Optional.empty());
final long intrinsicGasCost = protocolSpec.getGasCalculator().transactionIntrinsicGasCost(tx.getPayload(), tx.isContractCreation());
final long accessListCost = tx.getAccessList().map(list -> protocolSpec.getGasCalculator().accessListGasCost(list)).orElse(0L);
final long evmGas = gas - messageFrame.getRemainingGas();
out.println();
out.println(new JsonObject().put("gasUser", "0x" + Long.toHexString(evmGas)).put("timens", lastTime).put("time", lastTime / 1000).put("gasTotal", "0x" + Long.toHexString(evmGas + intrinsicGasCost) + accessListCost));
}
}
lastTime = stopwatch.elapsed().toNanos();
stopwatch.reset();
} while (repeat-- > 0);
} catch (final IOException e) {
LOG.error("Unable to create Genesis module", e);
}
}
Aggregations