Search in sources :

Example 1 with PrecompiledWrappedTransactionResult

use of org.aion.precompiled.type.PrecompiledWrappedTransactionResult in project aion by aionnetwork.

the class PrecompiledTransactionExecutor method executeTransactions.

public static List<AionTxExecSummary> executeTransactions(RepositoryCache repository, long blockNumber, AionAddress blockCoinbase, AionTransaction[] transactions, PostExecutionWork postExecutionWork, Logger logger, boolean decrementBlockEnergyLimit, boolean allowNonceIncrement, boolean isLocalCall, boolean fork032Enabled, long initialBlockEnergyLimit) {
    List<AionTxExecSummary> transactionSummaries = new ArrayList<>();
    long blockRemainingEnergy = initialBlockEnergyLimit;
    IExternalStateForPrecompiled externalState = new ExternalStateForPrecompiled(repository, blockNumber, isLocalCall, fork032Enabled, allowNonceIncrement);
    for (AionTransaction transaction : transactions) {
        // Execute the contract.
        PrecompiledWrappedTransactionResult wrappedResult = ContractExecutor.executeExternalCall(new ExternalCapabilitiesForPrecompiled(), externalState, toAionTypesTransaction(transaction));
        TransactionResult result = wrappedResult.result;
        List<AionAddress> deletedAddresses = wrappedResult.deletedAddresses;
        // Check the block energy limit & reject if necessary.
        if (result.energyUsed > blockRemainingEnergy) {
            TransactionStatus status = TransactionStatus.rejection("Invalid Energy Limit");
            result = new TransactionResult(status, result.logs, result.internalTransactions, 0, ByteUtil.EMPTY_BYTE_ARRAY);
        }
        // Build the transaction summary.
        AionTxExecSummary summary = buildTransactionSummary(transaction, result, deletedAddresses);
        // If the transaction was not rejected, then commit the state changes.
        if (!result.transactionStatus.isRejected()) {
            externalState.commit();
        }
        // For non-rejected non-local transactions, make some final repository updates.
        if (!isLocalCall && !summary.isRejected()) {
            RepositoryCache repositoryTracker = repository.startTracking();
            refundSender(repositoryTracker, summary, transaction, result);
            payMiner(repositoryTracker, blockCoinbase, summary);
            deleteAccountsMarkedForDeletion(repositoryTracker, summary.getDeletedAccounts(), result);
            repositoryTracker.flushTo(repository, true);
        }
        // Do any post execution work.
        if (postExecutionWork != null) {
            postExecutionWork.doWork(repository, summary, transaction);
        }
        // Update the remaining block energy.
        if (!result.transactionStatus.isRejected() && decrementBlockEnergyLimit) {
            blockRemainingEnergy -= summary.getReceipt().getEnergyUsed();
        }
        if (logger.isDebugEnabled()) {
            logger.debug("Transaction receipt: {}", summary.getReceipt());
            logger.debug("Transaction logs: {}", summary.getLogs());
        }
        transactionSummaries.add(summary);
    }
    return transactionSummaries;
}
Also used : PrecompiledWrappedTransactionResult(org.aion.precompiled.type.PrecompiledWrappedTransactionResult) TransactionResult(org.aion.types.TransactionResult) PrecompiledWrappedTransactionResult(org.aion.precompiled.type.PrecompiledWrappedTransactionResult) AionAddress(org.aion.types.AionAddress) AionTxExecSummary(org.aion.base.AionTxExecSummary) ArrayList(java.util.ArrayList) TransactionStatus(org.aion.types.TransactionStatus) AionTransaction(org.aion.base.AionTransaction) IExternalStateForPrecompiled(org.aion.precompiled.type.IExternalStateForPrecompiled) IExternalStateForPrecompiled(org.aion.precompiled.type.IExternalStateForPrecompiled) RepositoryCache(org.aion.base.db.RepositoryCache)

Aggregations

ArrayList (java.util.ArrayList)1 AionTransaction (org.aion.base.AionTransaction)1 AionTxExecSummary (org.aion.base.AionTxExecSummary)1 RepositoryCache (org.aion.base.db.RepositoryCache)1 IExternalStateForPrecompiled (org.aion.precompiled.type.IExternalStateForPrecompiled)1 PrecompiledWrappedTransactionResult (org.aion.precompiled.type.PrecompiledWrappedTransactionResult)1 AionAddress (org.aion.types.AionAddress)1 TransactionResult (org.aion.types.TransactionResult)1 TransactionStatus (org.aion.types.TransactionStatus)1