Search in sources :

Example 21 with Account

use of org.hyperledger.besu.evm.account.Account in project besu by hyperledger.

the class BlockDataGenerator method createRandomAccounts.

private List<Account> createRandomAccounts(final MutableWorldState worldState, final int count, final float percentContractAccounts, final float percentContractAccountsWithNonEmptyStorage) {
    final WorldUpdater updater = worldState.updater();
    final List<Account> accounts = new ArrayList<>(count);
    for (int i = 0; i < count; i++) {
        final MutableAccount account = updater.getOrCreate(address()).getMutable();
        if (random.nextFloat() < percentContractAccounts) {
            // Some percentage of accounts are contract accounts
            account.setCode(bytesValue(5, 50));
            if (random.nextFloat() < percentContractAccountsWithNonEmptyStorage) {
                // Add some storage for contract accounts
                final int storageValues = random.nextInt(20) + 10;
                for (int j = 0; j < storageValues; j++) {
                    account.setStorageValue(uint256(), uint256());
                }
            }
        }
        account.setNonce(random.nextLong());
        account.setBalance(Wei.of(positiveLong()));
        accounts.add(account);
    }
    updater.commit();
    worldState.persist(null);
    return accounts;
}
Also used : Account(org.hyperledger.besu.evm.account.Account) MutableAccount(org.hyperledger.besu.evm.account.MutableAccount) WorldUpdater(org.hyperledger.besu.evm.worldstate.WorldUpdater) ArrayList(java.util.ArrayList) MutableAccount(org.hyperledger.besu.evm.account.MutableAccount)

Example 22 with Account

use of org.hyperledger.besu.evm.account.Account in project besu by hyperledger.

the class PrivateTransactionSimulator method getPrivateTransaction.

private PrivateTransaction getPrivateTransaction(final CallParameter callParams, final BlockHeader header, final Bytes privacyGroupId, final MutableWorldState disposablePrivateState) {
    final Address senderAddress = callParams.getFrom() != null ? callParams.getFrom() : DEFAULT_FROM;
    final Account sender = disposablePrivateState.get(senderAddress);
    final long nonce = sender != null ? sender.getNonce() : 0L;
    final long gasLimit = callParams.getGasLimit() >= 0 ? callParams.getGasLimit() : header.getGasLimit();
    final Wei gasPrice = callParams.getGasPrice() != null ? callParams.getGasPrice() : Wei.ZERO;
    final Wei value = callParams.getValue() != null ? callParams.getValue() : Wei.ZERO;
    final Bytes payload = callParams.getPayload() != null ? callParams.getPayload() : Bytes.EMPTY;
    return PrivateTransaction.builder().privateFrom(Bytes.EMPTY).privacyGroupId(privacyGroupId).restriction(Restriction.RESTRICTED).nonce(nonce).gasPrice(gasPrice).gasLimit(gasLimit).to(callParams.getTo()).sender(senderAddress).value(value).payload(payload).signature(FAKE_SIGNATURE).build();
}
Also used : Account(org.hyperledger.besu.evm.account.Account) Bytes(org.apache.tuweni.bytes.Bytes) Address(org.hyperledger.besu.datatypes.Address) Wei(org.hyperledger.besu.datatypes.Wei)

Example 23 with Account

use of org.hyperledger.besu.evm.account.Account in project besu by hyperledger.

the class TransactionSimulator method processWithWorldUpdater.

@Nonnull
public Optional<TransactionSimulatorResult> processWithWorldUpdater(final CallParameter callParams, final TransactionValidationParams transactionValidationParams, final OperationTracer operationTracer, final BlockHeader header, final WorldUpdater updater) {
    final ProtocolSpec protocolSpec = protocolSchedule.getByBlockNumber(header.getNumber());
    final Address senderAddress = callParams.getFrom() != null ? callParams.getFrom() : DEFAULT_FROM;
    BlockHeader blockHeaderToProcess = header;
    if (transactionValidationParams.isAllowExceedingBalance() && header.getBaseFee().isPresent()) {
        blockHeaderToProcess = BlockHeaderBuilder.fromHeader(header).baseFee(Wei.ZERO).blockHeaderFunctions(protocolSpec.getBlockHeaderFunctions()).buildBlockHeader();
    }
    final Account sender = updater.get(senderAddress);
    final long nonce = sender != null ? sender.getNonce() : 0L;
    final long gasLimit = callParams.getGasLimit() >= 0 ? callParams.getGasLimit() : blockHeaderToProcess.getGasLimit();
    final Wei value = callParams.getValue() != null ? callParams.getValue() : Wei.ZERO;
    final Bytes payload = callParams.getPayload() != null ? callParams.getPayload() : Bytes.EMPTY;
    final MainnetTransactionProcessor transactionProcessor = protocolSchedule.getByBlockNumber(blockHeaderToProcess.getNumber()).getTransactionProcessor();
    final Optional<Transaction> maybeTransaction = buildTransaction(callParams, transactionValidationParams, header, senderAddress, nonce, gasLimit, value, payload);
    if (maybeTransaction.isEmpty()) {
        return Optional.empty();
    }
    final Transaction transaction = maybeTransaction.get();
    final TransactionProcessingResult result = transactionProcessor.processTransaction(blockchain, updater, blockHeaderToProcess, transaction, protocolSpec.getMiningBeneficiaryCalculator().calculateBeneficiary(blockHeaderToProcess), new BlockHashLookup(blockHeaderToProcess, blockchain), false, transactionValidationParams, operationTracer);
    // If GoQuorum privacy enabled, and value = zero, get max gas possible for a PMT hash.
    // It is possible to have a data field that has a lower intrinsic value than the PMT hash.
    // This means a potential over-estimate of gas, but the tx, if sent with this gas, will not
    // fail.
    final boolean goQuorumCompatibilityMode = transactionProcessor.getTransactionValidator().getGoQuorumCompatibilityMode();
    if (goQuorumCompatibilityMode && value.isZero()) {
        final long privateGasEstimateAndState = protocolSpec.getGasCalculator().getMaximumTransactionCost(64);
        if (privateGasEstimateAndState > result.getEstimateGasUsedByTransaction()) {
            // modify the result to have the larger estimate
            final TransactionProcessingResult resultPmt = TransactionProcessingResult.successful(result.getLogs(), privateGasEstimateAndState, result.getGasRemaining(), result.getOutput(), result.getValidationResult());
            return Optional.of(new TransactionSimulatorResult(transaction, resultPmt));
        }
    }
    return Optional.of(new TransactionSimulatorResult(transaction, result));
}
Also used : Account(org.hyperledger.besu.evm.account.Account) Address(org.hyperledger.besu.datatypes.Address) TransactionProcessingResult(org.hyperledger.besu.ethereum.processing.TransactionProcessingResult) Bytes(org.apache.tuweni.bytes.Bytes) MainnetTransactionProcessor(org.hyperledger.besu.ethereum.mainnet.MainnetTransactionProcessor) Transaction(org.hyperledger.besu.ethereum.core.Transaction) BlockHashLookup(org.hyperledger.besu.ethereum.vm.BlockHashLookup) ProtocolSpec(org.hyperledger.besu.ethereum.mainnet.ProtocolSpec) Wei(org.hyperledger.besu.datatypes.Wei) BlockHeader(org.hyperledger.besu.ethereum.core.BlockHeader) Nonnull(javax.annotation.Nonnull)

Example 24 with Account

use of org.hyperledger.besu.evm.account.Account in project besu by hyperledger.

the class TransactionPool method validateTransaction.

private ValidationResult<TransactionInvalidReason> validateTransaction(final Transaction transaction, final boolean isLocal) {
    final BlockHeader chainHeadBlockHeader = getChainHeadBlockHeader();
    final FeeMarket feeMarket = protocolSchedule.getByBlockNumber(chainHeadBlockHeader.getNumber()).getFeeMarket();
    // Check whether it's a GoQuorum transaction
    boolean goQuorumCompatibilityMode = getTransactionValidator().getGoQuorumCompatibilityMode();
    if (transaction.isGoQuorumPrivateTransaction(goQuorumCompatibilityMode)) {
        final Optional<Wei> weiValue = ofNullable(transaction.getValue());
        if (weiValue.isPresent() && !weiValue.get().isZero()) {
            return ValidationResult.invalid(TransactionInvalidReason.ETHER_VALUE_NOT_SUPPORTED);
        }
    }
    // executable:
    if ((!effectiveGasPriceIsAboveConfiguredMinGasPrice(transaction) && !miningParameters.isMiningEnabled()) || (!feeMarket.satisfiesFloorTxCost(transaction))) {
        return ValidationResult.invalid(TransactionInvalidReason.GAS_PRICE_TOO_LOW);
    }
    final ValidationResult<TransactionInvalidReason> basicValidationResult = getTransactionValidator().validate(transaction, chainHeadBlockHeader.getBaseFee(), TransactionValidationParams.transactionPool());
    if (!basicValidationResult.isValid()) {
        return basicValidationResult;
    }
    if (isLocal && strictReplayProtectionShouldBeEnforceLocally(chainHeadBlockHeader) && transaction.getChainId().isEmpty()) {
        // Strict replay protection is enabled but the tx is not replay-protected
        return ValidationResult.invalid(TransactionInvalidReason.REPLAY_PROTECTED_SIGNATURE_REQUIRED);
    }
    if (transaction.getGasLimit() > chainHeadBlockHeader.getGasLimit()) {
        return ValidationResult.invalid(TransactionInvalidReason.EXCEEDS_BLOCK_GAS_LIMIT, String.format("Transaction gas limit of %s exceeds block gas limit of %s", transaction.getGasLimit(), chainHeadBlockHeader.getGasLimit()));
    }
    if (transaction.getType().equals(TransactionType.EIP1559) && !feeMarket.implementsBaseFee()) {
        return ValidationResult.invalid(TransactionInvalidReason.INVALID_TRANSACTION_FORMAT, "EIP-1559 transaction are not allowed yet");
    }
    return protocolContext.getWorldStateArchive().getMutable(chainHeadBlockHeader.getStateRoot(), chainHeadBlockHeader.getHash(), false).map(worldState -> {
        final Account senderAccount = worldState.get(transaction.getSender());
        return getTransactionValidator().validateForSender(transaction, senderAccount, TransactionValidationParams.transactionPool());
    }).orElseGet(() -> ValidationResult.invalid(CHAIN_HEAD_WORLD_STATE_NOT_AVAILABLE));
}
Also used : ADDED(org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter.TransactionAddedStatus.ADDED) ValidationResult(org.hyperledger.besu.ethereum.mainnet.ValidationResult) AbstractPendingTransactionsSorter(org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter) Account(org.hyperledger.besu.evm.account.Account) EthPeer(org.hyperledger.besu.ethereum.eth.manager.EthPeer) LoggerFactory(org.slf4j.LoggerFactory) FeeMarket(org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket) Collections.singletonList(java.util.Collections.singletonList) MainnetTransactionValidator(org.hyperledger.besu.ethereum.mainnet.MainnetTransactionValidator) ProtocolSchedule(org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule) HashSet(java.util.HashSet) TransactionAddedStatus(org.hyperledger.besu.ethereum.eth.transactions.sorter.AbstractPendingTransactionsSorter.TransactionAddedStatus) CHAIN_HEAD_WORLD_STATE_NOT_AVAILABLE(org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason.CHAIN_HEAD_WORLD_STATE_NOT_AVAILABLE) Wei(org.hyperledger.besu.datatypes.Wei) TransactionInvalidReason(org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason) BlockAddedEvent(org.hyperledger.besu.ethereum.chain.BlockAddedEvent) BlockAddedObserver(org.hyperledger.besu.ethereum.chain.BlockAddedObserver) Logger(org.slf4j.Logger) Optional.ofNullable(java.util.Optional.ofNullable) BlockHeader(org.hyperledger.besu.ethereum.core.BlockHeader) BesuMetricCategory(org.hyperledger.besu.metrics.BesuMetricCategory) Collection(java.util.Collection) EthContext(org.hyperledger.besu.ethereum.eth.manager.EthContext) Set(java.util.Set) TransactionValidationParams(org.hyperledger.besu.ethereum.mainnet.TransactionValidationParams) MiningParameters(org.hyperledger.besu.ethereum.core.MiningParameters) LabelledMetric(org.hyperledger.besu.plugin.services.metrics.LabelledMetric) ProtocolContext(org.hyperledger.besu.ethereum.ProtocolContext) Optional(java.util.Optional) MetricsSystem(org.hyperledger.besu.plugin.services.MetricsSystem) MutableBlockchain(org.hyperledger.besu.ethereum.chain.MutableBlockchain) TransactionType(org.hyperledger.besu.plugin.data.TransactionType) Transaction(org.hyperledger.besu.ethereum.core.Transaction) Hash(org.hyperledger.besu.datatypes.Hash) Counter(org.hyperledger.besu.plugin.services.metrics.Counter) FeeMarket(org.hyperledger.besu.ethereum.mainnet.feemarket.FeeMarket) Account(org.hyperledger.besu.evm.account.Account) TransactionInvalidReason(org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason) Wei(org.hyperledger.besu.datatypes.Wei) BlockHeader(org.hyperledger.besu.ethereum.core.BlockHeader)

Example 25 with Account

use of org.hyperledger.besu.evm.account.Account in project besu by hyperledger.

the class CallCodeOperation method cost.

@Override
public long cost(final MessageFrame frame) {
    final long stipend = gas(frame);
    final long inputDataOffset = inputDataOffset(frame);
    final long inputDataLength = inputDataLength(frame);
    final long outputDataOffset = outputDataOffset(frame);
    final long outputDataLength = outputDataLength(frame);
    final Account recipient = frame.getWorldUpdater().get(address(frame));
    return gasCalculator().callOperationGasCost(frame, stipend, inputDataOffset, inputDataLength, outputDataOffset, outputDataLength, value(frame), recipient, to(frame));
}
Also used : Account(org.hyperledger.besu.evm.account.Account)

Aggregations

Account (org.hyperledger.besu.evm.account.Account)56 Address (org.hyperledger.besu.datatypes.Address)24 BlockHeader (org.hyperledger.besu.ethereum.core.BlockHeader)19 Hash (org.hyperledger.besu.datatypes.Hash)18 Bytes (org.apache.tuweni.bytes.Bytes)15 Bytes32 (org.apache.tuweni.bytes.Bytes32)14 MutableWorldState (org.hyperledger.besu.ethereum.core.MutableWorldState)14 Test (org.junit.Test)13 Optional (java.util.Optional)12 WorldState (org.hyperledger.besu.evm.worldstate.WorldState)12 Map (java.util.Map)11 Wei (org.hyperledger.besu.datatypes.Wei)10 Blockchain (org.hyperledger.besu.ethereum.chain.Blockchain)10 WorldUpdater (org.hyperledger.besu.evm.worldstate.WorldUpdater)10 Transaction (org.hyperledger.besu.ethereum.core.Transaction)9 WorldStateArchive (org.hyperledger.besu.ethereum.worldstate.WorldStateArchive)9 ArrayList (java.util.ArrayList)8 List (java.util.List)8 HashSet (java.util.HashSet)7 Set (java.util.Set)7