Search in sources :

Example 26 with Wei

use of org.hyperledger.besu.datatypes.Wei 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 27 with Wei

use of org.hyperledger.besu.datatypes.Wei in project besu by hyperledger.

the class TransactionSimulator method buildTransaction.

private Optional<Transaction> buildTransaction(final CallParameter callParams, final TransactionValidationParams transactionValidationParams, final BlockHeader header, final Address senderAddress, final long nonce, final long gasLimit, final Wei value, final Bytes payload) {
    final Transaction.Builder transactionBuilder = Transaction.builder().nonce(nonce).gasLimit(gasLimit).to(callParams.getTo()).sender(senderAddress).value(value).payload(payload).signature(FAKE_SIGNATURE);
    final Wei gasPrice;
    final Wei maxFeePerGas;
    final Wei maxPriorityFeePerGas;
    if (transactionValidationParams.isAllowExceedingBalance()) {
        gasPrice = Wei.ZERO;
        maxFeePerGas = Wei.ZERO;
        maxPriorityFeePerGas = Wei.ZERO;
    } else {
        gasPrice = callParams.getGasPrice() != null ? callParams.getGasPrice() : Wei.ZERO;
        maxFeePerGas = callParams.getMaxFeePerGas().orElse(gasPrice);
        maxPriorityFeePerGas = callParams.getMaxPriorityFeePerGas().orElse(gasPrice);
    }
    if (header.getBaseFee().isEmpty()) {
        transactionBuilder.gasPrice(gasPrice);
    } else if (protocolSchedule.getChainId().isPresent()) {
        transactionBuilder.maxFeePerGas(maxFeePerGas).maxPriorityFeePerGas(maxPriorityFeePerGas);
    } else {
        return Optional.empty();
    }
    transactionBuilder.guessType();
    if (transactionBuilder.getTransactionType().requiresChainId()) {
        transactionBuilder.chainId(protocolSchedule.getChainId().orElse(// needed to make some transactions valid
        BigInteger.ONE));
    }
    final Transaction transaction = transactionBuilder.build();
    return Optional.ofNullable(transaction);
}
Also used : Transaction(org.hyperledger.besu.ethereum.core.Transaction) Wei(org.hyperledger.besu.datatypes.Wei)

Example 28 with Wei

use of org.hyperledger.besu.datatypes.Wei 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 29 with Wei

use of org.hyperledger.besu.datatypes.Wei in project besu by hyperledger.

the class PrivateMigrationBlockProcessor method rewardCoinbase.

private boolean rewardCoinbase(final MutableWorldState worldState, final ProcessableBlockHeader header, final List<BlockHeader> ommers, final boolean skipZeroBlockRewards) {
    if (skipZeroBlockRewards && blockReward.isZero()) {
        return true;
    }
    final Wei coinbaseReward = blockReward.add(blockReward.multiply(ommers.size()).divide(32));
    final WorldUpdater updater = worldState.updater();
    final MutableAccount coinbase = updater.getOrCreate(header.getCoinbase()).getMutable();
    coinbase.incrementBalance(coinbaseReward);
    for (final BlockHeader ommerHeader : ommers) {
        if (ommerHeader.getNumber() - header.getNumber() > MAX_GENERATION) {
            LOG.warn("Block processing error: ommer block number {} more than {} generations current block" + " number {}", ommerHeader.getNumber(), MAX_GENERATION, header.getNumber());
            return false;
        }
        final MutableAccount ommerCoinbase = updater.getOrCreate(ommerHeader.getCoinbase()).getMutable();
        final long distance = header.getNumber() - ommerHeader.getNumber();
        final Wei ommerReward = blockReward.subtract(blockReward.multiply(distance).divide(8));
        ommerCoinbase.incrementBalance(ommerReward);
    }
    return true;
}
Also used : WorldUpdater(org.hyperledger.besu.evm.worldstate.WorldUpdater) Wei(org.hyperledger.besu.datatypes.Wei) MutableAccount(org.hyperledger.besu.evm.account.MutableAccount) BlockHeader(org.hyperledger.besu.ethereum.core.BlockHeader) ProcessableBlockHeader(org.hyperledger.besu.ethereum.core.ProcessableBlockHeader)

Example 30 with Wei

use of org.hyperledger.besu.datatypes.Wei 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)

Aggregations

Wei (org.hyperledger.besu.datatypes.Wei)69 Address (org.hyperledger.besu.datatypes.Address)24 Test (org.junit.Test)20 Transaction (org.hyperledger.besu.ethereum.core.Transaction)18 Bytes (org.apache.tuweni.bytes.Bytes)16 Hash (org.hyperledger.besu.datatypes.Hash)14 BlockHeader (org.hyperledger.besu.ethereum.core.BlockHeader)13 MutableAccount (org.hyperledger.besu.evm.account.MutableAccount)12 Account (org.hyperledger.besu.evm.account.Account)9 WorldUpdater (org.hyperledger.besu.evm.worldstate.WorldUpdater)9 Optional (java.util.Optional)8 TransactionInvalidReason (org.hyperledger.besu.ethereum.transaction.TransactionInvalidReason)7 ArrayList (java.util.ArrayList)6 JsonRpcSuccessResponse (org.hyperledger.besu.ethereum.api.jsonrpc.internal.response.JsonRpcSuccessResponse)6 ProtocolSchedule (org.hyperledger.besu.ethereum.mainnet.ProtocolSchedule)6 JsonObject (io.vertx.core.json.JsonObject)5 Response (okhttp3.Response)5 Bytes32 (org.apache.tuweni.bytes.Bytes32)5 MessageFrame (org.hyperledger.besu.evm.frame.MessageFrame)5 List (java.util.List)4