Search in sources :

Example 6 with TransactionResult

use of org.aion.types.TransactionResult 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

TransactionResult (org.aion.types.TransactionResult)6 RepositoryCache (org.aion.base.db.RepositoryCache)5 AionAddress (org.aion.types.AionAddress)5 IAvmFutureResult (org.aion.avm.stub.IAvmFutureResult)4 ArrayList (java.util.ArrayList)3 IAionVirtualMachine (org.aion.avm.stub.IAionVirtualMachine)3 IAvmExternalState (org.aion.avm.stub.IAvmExternalState)3 AionTransaction (org.aion.base.AionTransaction)3 AionTxExecSummary (org.aion.base.AionTxExecSummary)3 Transaction (org.aion.types.Transaction)3 Test (org.junit.Test)3 TransactionStatus (org.aion.types.TransactionStatus)2 VmFatalException (org.aion.zero.impl.vm.common.VmFatalException)2 TimeoutException (java.util.concurrent.TimeoutException)1 AvmVersion (org.aion.avm.stub.AvmVersion)1 FvmWrappedTransactionResult (org.aion.fastvm.FvmWrappedTransactionResult)1 IExternalStateForFvm (org.aion.fastvm.IExternalStateForFvm)1 IExternalStateForPrecompiled (org.aion.precompiled.type.IExternalStateForPrecompiled)1 PrecompiledWrappedTransactionResult (org.aion.precompiled.type.PrecompiledWrappedTransactionResult)1