Search in sources :

Example 11 with EVM

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);
    }
}
Also used : MessageCallProcessor(org.hyperledger.besu.evm.processor.MessageCallProcessor) Stopwatch(com.google.common.base.Stopwatch) LoggerFactory(org.slf4j.LoggerFactory) PrecompileContractRegistry(org.hyperledger.besu.evm.precompile.PrecompileContractRegistry) Level(org.apache.logging.log4j.Level) OperationTracer(org.hyperledger.besu.evm.tracing.OperationTracer) Bytes(org.apache.tuweni.bytes.Bytes) Deque(java.util.Deque) Address(org.hyperledger.besu.datatypes.Address) EVM(org.hyperledger.besu.evm.EVM) NetworkName(org.hyperledger.besu.cli.config.NetworkName) Wei(org.hyperledger.besu.datatypes.Wei) JsonObject(io.vertx.core.json.JsonObject) Command(picocli.CommandLine.Command) Code(org.hyperledger.besu.evm.Code) CommandLine(picocli.CommandLine) MainnetBlockHeaderFunctions(org.hyperledger.besu.ethereum.mainnet.MainnetBlockHeaderFunctions) PrintStream(java.io.PrintStream) Log4j2ConfiguratorUtil(org.hyperledger.besu.util.Log4j2ConfiguratorUtil) Difficulty(org.hyperledger.besu.ethereum.core.Difficulty) Logger(org.slf4j.Logger) BlockHeader(org.hyperledger.besu.ethereum.core.BlockHeader) BlockHeaderBuilder(org.hyperledger.besu.ethereum.core.BlockHeaderBuilder) LogsBloomFilter(org.hyperledger.besu.evm.log.LogsBloomFilter) IOException(java.io.IOException) BlockHashLookup(org.hyperledger.besu.ethereum.vm.BlockHashLookup) Instant(java.time.Instant) File(java.io.File) StandardCharsets(java.nio.charset.StandardCharsets) List(java.util.List) Option(picocli.CommandLine.Option) INHERIT(picocli.CommandLine.ScopeType.INHERIT) Optional(java.util.Optional) MessageFrame(org.hyperledger.besu.evm.frame.MessageFrame) ProtocolSpec(org.hyperledger.besu.ethereum.mainnet.ProtocolSpec) ArrayDeque(java.util.ArrayDeque) Transaction(org.hyperledger.besu.ethereum.core.Transaction) StandardJsonTracer(org.hyperledger.besu.evm.tracing.StandardJsonTracer) Hash(org.hyperledger.besu.datatypes.Hash) MessageFrame(org.hyperledger.besu.evm.frame.MessageFrame) Stopwatch(com.google.common.base.Stopwatch) JsonObject(io.vertx.core.json.JsonObject) StandardJsonTracer(org.hyperledger.besu.evm.tracing.StandardJsonTracer) BlockHeader(org.hyperledger.besu.ethereum.core.BlockHeader) MainnetBlockHeaderFunctions(org.hyperledger.besu.ethereum.mainnet.MainnetBlockHeaderFunctions) MessageCallProcessor(org.hyperledger.besu.evm.processor.MessageCallProcessor) IOException(java.io.IOException) PrecompileContractRegistry(org.hyperledger.besu.evm.precompile.PrecompileContractRegistry) Code(org.hyperledger.besu.evm.Code) ArrayDeque(java.util.ArrayDeque) BlockHashLookup(org.hyperledger.besu.ethereum.vm.BlockHashLookup) Transaction(org.hyperledger.besu.ethereum.core.Transaction) ProtocolSpec(org.hyperledger.besu.ethereum.mainnet.ProtocolSpec) EVM(org.hyperledger.besu.evm.EVM)

Aggregations

EVM (org.hyperledger.besu.evm.EVM)11 MessageFrame (org.hyperledger.besu.evm.frame.MessageFrame)9 ArrayDeque (java.util.ArrayDeque)7 Test (org.junit.Test)6 UInt256 (org.apache.tuweni.units.bigints.UInt256)4 PrecompileContractRegistry (org.hyperledger.besu.evm.precompile.PrecompileContractRegistry)4 Bytes (org.apache.tuweni.bytes.Bytes)3 Code (org.hyperledger.besu.evm.Code)3 MessageCallProcessor (org.hyperledger.besu.evm.processor.MessageCallProcessor)3 Stopwatch (com.google.common.base.Stopwatch)2 Bytes32 (org.apache.tuweni.bytes.Bytes32)2 ProtocolSpec (org.hyperledger.besu.ethereum.mainnet.ProtocolSpec)2 ContractCreationProcessor (org.hyperledger.besu.evm.processor.ContractCreationProcessor)2 StandardJsonTracer (org.hyperledger.besu.evm.tracing.StandardJsonTracer)2 WorldUpdater (org.hyperledger.besu.evm.worldstate.WorldUpdater)2 JsonObject (io.vertx.core.json.JsonObject)1 File (java.io.File)1 IOException (java.io.IOException)1 PrintStream (java.io.PrintStream)1 StandardCharsets (java.nio.charset.StandardCharsets)1