use of org.aion.base.AionTransaction in project aion by aionnetwork.
the class SolidityTypeTest method testDynamicArray1.
@Test
public void testDynamicArray1() throws Exception {
List<BigInteger> x = new ArrayList<>();
x.add(BigInteger.valueOf(1L));
x.add(BigInteger.valueOf(2L));
x.add(BigInteger.valueOf(3L));
SolidityType type = new DynamicArrayType("uint16[]");
byte[] params = ByteUtil.merge(Hex.decode("00000000000000000000000000000010"), type.encode(x));
System.out.println(Hex.toHexString(params));
AionTransaction tx = createTransaction(ByteUtil.merge(Hex.decode("8c0c5523"), params));
MiningBlock block = createDummyBlock();
RepositoryCache repo = createRepository(tx);
AionTxReceipt receipt = executeTransaction(tx, block, repo).getReceipt();
System.out.println(receipt);
assertArrayEquals(params, receipt.getTransactionOutput());
Object[] decoded = (Object[]) type.decode(receipt.getTransactionOutput(), 16);
for (Object d : decoded) {
System.out.println(d);
}
}
use of org.aion.base.AionTransaction in project aion by aionnetwork.
the class SolidityTypeTest method testStaticArray1.
@Test
public void testStaticArray1() throws Exception {
List<BigInteger> x = new ArrayList<>();
x.add(BigInteger.valueOf(1L));
x.add(BigInteger.valueOf(2L));
x.add(BigInteger.valueOf(3L));
SolidityType type = new StaticArrayType("uint16[3]");
byte[] params = type.encode(x);
System.out.println(Hex.toHexString(params));
AionTransaction tx = createTransaction(ByteUtil.merge(Hex.decode("97e934e2"), params));
MiningBlock block = createDummyBlock();
RepositoryCache repo = createRepository(tx);
AionTxReceipt receipt = executeTransaction(tx, block, repo).getReceipt();
System.out.println(receipt);
assertArrayEquals(params, receipt.getTransactionOutput());
Object[] decoded = (Object[]) type.decode(receipt.getTransactionOutput());
for (Object d : decoded) {
System.out.println(d);
}
}
use of org.aion.base.AionTransaction in project aion by aionnetwork.
the class SolidityTypeTest method testFixedBytes1.
@Test
public void testFixedBytes1() throws Exception {
byte[] x = Hex.decode("1122334455");
SolidityType type = new Bytes32Type("bytes5");
byte[] params = type.encode(x);
System.out.println(Hex.toHexString(params));
AionTransaction tx = createTransaction(ByteUtil.merge(Hex.decode("faa068d1"), params));
MiningBlock block = createDummyBlock();
RepositoryCache repo = createRepository(tx);
AionTxReceipt receipt = executeTransaction(tx, block, repo).getReceipt();
System.out.println(receipt);
assertArrayEquals(params, receipt.getTransactionOutput());
assertArrayEquals(x, (byte[]) type.decode(receipt.getTransactionOutput()));
}
use of org.aion.base.AionTransaction in project aion by aionnetwork.
the class SolidityTypeTest method testBytes2.
@Test
public void testBytes2() throws Exception {
byte[] x = Hex.decode("11223344556677881122334455667788112233445566778811223344556677881122334455667788");
SolidityType type = new BytesType();
byte[] params = ByteUtil.merge(Hex.decode("00000000000000000000000000000010"), type.encode(x));
System.out.println(Hex.toHexString(params));
AionTransaction tx = createTransaction(ByteUtil.merge(Hex.decode("61cb5a01"), params));
MiningBlock block = createDummyBlock();
RepositoryCache repo = createRepository(tx);
AionTxReceipt receipt = executeTransaction(tx, block, repo).getReceipt();
System.out.println(receipt);
assertArrayEquals(params, receipt.getTransactionOutput());
assertArrayEquals(x, (byte[]) type.decode(receipt.getTransactionOutput(), 16));
}
use of org.aion.base.AionTransaction in project aion by aionnetwork.
the class AvmTransactionExecutor method executeTransactions.
/**
* Executes the specified transactions using the avm, and returns the execution summaries of
* each of the transactions.
*
* This method does not perform any checks on its inputs! It operates under the assumption that
* the caller has ensured the input parameters are correct!
*
* In particular, every object supplied must be non-null with the exception of
* {@code postExecutionWork}, which may be null. Also, we must have
* {@code initialBlockEnergyLimit <= blockEnergyLimit}.
*
* @param repository The current state of the world.
* @param blockDifficulty The block difficulty.
* @param blockNumber The current block number.
* @param blockTimestamp The block timestamp.
* @param blockEnergyLimit The energy limit of the block.
* @param miner The miner address.
* @param transactions The transactions to execute.
* @param postExecutionWork The post-execution work to be applied after executing the transactions.
* @param decrementBlockEnergyLimit Whether or not to check the block energy limit.
* @param allowNonceIncrement Whether to increment the sender's nonce or not.
* @param isLocalCall Whether this is a local call (ie. is to cause no state changes).
* @param remainingBlockEnergy The amount of energy remaining in the block.
* @param executionType The avm execution type.
* @param cachedBlockNumber The cached block number.
* @param unityForkEnabled the flag shows the unityfork feature enabled/disabled
* @param signatureSchemeSwapEnabled the flag shows the signatureSchemeSwap feature enabled/disabled
* @return the execution summaries of the transactions.
* @throws VmFatalException If a fatal error occurred and the kernel must be shut down.
*/
public static List<AionTxExecSummary> executeTransactions(RepositoryCache repository, BigInteger blockDifficulty, long blockNumber, long blockTimestamp, long blockEnergyLimit, AionAddress miner, AionTransaction[] transactions, PostExecutionWork postExecutionWork, boolean decrementBlockEnergyLimit, boolean allowNonceIncrement, boolean isLocalCall, long remainingBlockEnergy, AvmExecutionType executionType, long cachedBlockNumber, boolean unityForkEnabled, boolean signatureSchemeSwapEnabled) throws VmFatalException {
List<AionTxExecSummary> transactionSummaries = new ArrayList<>();
long blockEnergy = remainingBlockEnergy;
try {
// We need to acquire the provider's lock before we can do anything meaningful.
if (!AvmProvider.tryAcquireLock(10, TimeUnit.MINUTES)) {
throw new TimeoutException("Timed out waiting to acquire the avm provider lock!");
}
// Ensure that the vm is in the correct state and grab the version of the avm we need to use for this block.
AvmVersion versionToUse = updateAvmsAndGetVersionToUse(AvmConfigurations.getProjectRootDirectory(), blockNumber, signatureSchemeSwapEnabled);
IAvmFutureResult[] futures = invokeAvm(versionToUse, repository, blockDifficulty, blockNumber, blockTimestamp, blockEnergyLimit, miner, transactions, allowNonceIncrement, isLocalCall, executionType, cachedBlockNumber, unityForkEnabled);
// Process the transaction results.
int index = 0;
for (IAvmFutureResult future : futures) {
TransactionResult result = future.getResult();
if (result.transactionStatus.isFatal()) {
throw new VmFatalException(result.transactionStatus.causeOfError);
}
// Check the block energy limit and reject if necessary.
AionTransaction transaction = transactions[index];
if (result.energyUsed > blockEnergy) {
result = markAsBlockEnergyLimitExceeded(result, transaction.getEnergyLimit());
}
AionTxExecSummary summary = buildSummaryAndUpdateState(future, transaction, result, versionToUse, repository, blockDifficulty, blockNumber, blockTimestamp, blockEnergyLimit, miner, allowNonceIncrement, isLocalCall);
// Do any post execution work if any is specified.
if (postExecutionWork != null) {
postExecutionWork.doWork(repository, summary, transaction);
}
// Update the remaining block energy.
if (!result.transactionStatus.isRejected() && decrementBlockEnergyLimit) {
blockEnergy -= summary.getReceipt().getEnergyUsed();
}
transactionSummaries.add(summary);
index++;
}
} catch (Throwable e) {
// If we get here then something unexpected went wrong, we treat this as a fatal situation since shutting down is our only recovery.
System.err.println("Encountered an unexpected error while processing the transactions in the avm: " + e.toString());
throw new VmFatalException(e);
} finally {
AvmProvider.releaseLock();
}
return transactionSummaries;
}
Aggregations