use of org.aion.base.db.RepositoryCache in project aion by aionnetwork.
the class ContractIntegTest method tellFvmContractCallWithinDeployingBlock.
@Test
public void tellFvmContractCallWithinDeployingBlock() throws IOException {
if (txType == TransactionTypes.AVM_CREATE_CODE) {
return;
}
String contractName = "InternalCallContract";
byte[] deployCode = getDeployCode(contractName);
long nrg = Constants.NRG_TRANSACTION_MAX;
long nrgPrice = energyPrice;
BigInteger value = BigInteger.ZERO;
BigInteger nonce = BigInteger.ZERO;
AionTransaction tx = AionTransaction.create(deployerKey, nonce.toByteArray(), null, value.toByteArray(), deployCode, nrg, nrgPrice, txType, null);
RepositoryCache repo = blockchain.getRepository().startTracking();
nonce = nonce.add(BigInteger.ONE);
assertTrue(tx.isContractCreationTransaction());
assertEquals(deployerBalance, repo.getBalance(deployer));
assertEquals(deployerNonce, repo.getNonce(deployer));
List<AionTransaction> ls = new ArrayList<>();
ls.add(tx);
byte[] input = Arrays.copyOfRange(HashUtil.keccak256("sendValueToContract()".getBytes()), 0, 4);
AionTransaction tx2 = AionTransaction.create(deployerKey, nonce.toByteArray(), TxUtil.calculateContractAddress(tx), BigInteger.TEN.toByteArray(), input, nrg, nrgPrice, txType, null);
assertFalse(tx2.isContractCreationTransaction());
ls.add(tx2);
BigInteger senderBalance = repo.getBalance(deployer);
Block parent = blockchain.getBestBlock();
MiningBlock block = blockchain.createBlock(parent, ls, false, parent.getTimestamp());
Pair<ImportResult, AionBlockSummary> result = blockchain.tryToConnectAndFetchSummary(block);
AionBlockSummary summary = result.getRight();
assertTrue(result.getLeft().isSuccessful());
AionAddress contractAddress = TxUtil.calculateContractAddress(tx);
assertEquals(BigInteger.TEN, blockchain.getRepository().getBalance(contractAddress));
assertEquals(senderBalance.subtract(BigInteger.TEN).subtract(BigInteger.valueOf(summary.getReceipts().get(0).getEnergyUsed()).multiply(BigInteger.valueOf(nrgPrice))).subtract(BigInteger.valueOf(summary.getReceipts().get(1).getEnergyUsed()).multiply(BigInteger.valueOf(nrgPrice))), blockchain.getRepository().getBalance(deployer));
repo = blockchain.getRepository().startTracking();
assertEquals(BigInteger.TWO, repo.getNonce(deployer));
}
use of org.aion.base.db.RepositoryCache in project aion by aionnetwork.
the class ContractIntegTest method tellFvmContractCallAvmContract.
@Test
public void tellFvmContractCallAvmContract() throws Exception {
if (txType == TransactionTypes.AVM_CREATE_CODE) {
return;
}
String contractName = "InternalCallContract";
byte[] deployCode = getDeployCode(contractName);
long nrg = Constants.NRG_TRANSACTION_MAX;
long nrgPrice = energyPrice;
BigInteger value = BigInteger.ZERO;
BigInteger nonce = BigInteger.ZERO;
AionTransaction tx = AionTransaction.create(deployerKey, nonce.toByteArray(), null, value.toByteArray(), deployCode, nrg, nrgPrice, txType, null);
RepositoryCache repo = blockchain.getRepository().startTracking();
nonce = nonce.add(BigInteger.ONE);
AionAddress contract = deployContract(repo, tx, contractName, null, value, nrg, nrgPrice, nonce, true);
assertNotNull(contract);
repo = blockchain.getRepository().startTracking();
AionAddress avmAddress = deployAvmContract(AvmVersion.VERSION_1, nonce);
assertNotNull(avmAddress);
nonce = nonce.add(BigInteger.ONE);
byte[] input = Arrays.copyOfRange(HashUtil.keccak256("callAVM(address)".getBytes()), 0, 4);
input = ByteUtil.merge(input, avmAddress.toByteArray());
tx = AionTransaction.create(deployerKey, nonce.toByteArray(), contract, BigInteger.ZERO.toByteArray(), input, nrg, nrgPrice, txType, null);
assertFalse(tx.isContractCreationTransaction());
MiningBlock block = makeBlock(tx);
AionTxExecSummary summary = executeTransaction(tx, block, repo);
// The evmjit only return the the transaction success or failed when performing the function
// call.
assertEquals("reverted", summary.getReceipt().getError());
assertNotEquals(nrg, summary.getNrgUsed().longValue());
Pair<ImportResult, AionBlockSummary> result = blockchain.tryToConnectAndFetchSummary(block);
assertTrue(result.getLeft().isSuccessful());
assertTrue(result.getRight().getSummaries().get(0).isFailed());
}
use of org.aion.base.db.RepositoryCache in project aion by aionnetwork.
the class ContractIntegTest method testDeployWithOutCode.
@Test
public void testDeployWithOutCode() throws Exception {
long nrg = 1_000_000;
long nrgPrice = energyPrice;
// attempt to transfer value to new contract.
BigInteger value = BigInteger.ZERO;
BigInteger nonce = BigInteger.ZERO;
// to == null signals that this is contract creation.
AionTransaction tx = AionTransaction.create(deployerKey, nonce.toByteArray(), null, value.toByteArray(), new byte[0], nrg, nrgPrice, txType, null);
assertTrue(tx.isContractCreationTransaction());
assertEquals(Builder.DEFAULT_BALANCE, blockchain.getRepository().getBalance(deployer));
assertEquals(BigInteger.ZERO, blockchain.getRepository().getNonce(deployer));
if (txType == TransactionTypes.DEFAULT) {
MiningBlock block = makeBlock(tx);
RepositoryCache repo = blockchain.getRepository().startTracking();
AionTxExecSummary summary = executeTransaction(tx, block, repo);
assertEquals("", summary.getReceipt().getError());
// all energy is not used up.
assertNotEquals(nrg, summary.getNrgUsed().longValue());
AionAddress contract = TxUtil.calculateContractAddress(tx);
checkStateOfDeployer(repo, summary, nrgPrice, BigInteger.ZERO, nonce.add(BigInteger.ONE));
byte[] code = repo.getCode(contract);
assertNotNull(code);
} else {
blockchain.forkUtility.enable040Fork(0);
MiningBlock block = makeBlock(tx);
RepositoryCache repo = blockchain.getRepository().startTracking();
AionTxExecSummary summary = executeTransaction(tx, block, repo);
assertEquals("Failed: invalid data", summary.getReceipt().getError());
}
}
use of org.aion.base.db.RepositoryCache in project aion by aionnetwork.
the class ContractIntegTest method testRecursiveStackoverflow.
@Test
public void testRecursiveStackoverflow() throws Exception {
String contractName = "Recursive";
byte[] deployCode = getDeployCode(contractName);
long nrg = Constants.NRG_TRANSACTION_MAX;
long nrgPrice = energyPrice;
BigInteger value = BigInteger.ZERO;
BigInteger nonce = BigInteger.ZERO;
AionTransaction tx = AionTransaction.create(deployerKey, nonce.toByteArray(), null, value.toByteArray(), deployCode, nrg, nrgPrice, txType, null);
RepositoryCache repo = blockchain.getRepository().startTracking();
nonce = nonce.add(BigInteger.ONE);
AionAddress contract = deployContract(repo, tx, contractName, null, value, nrg, nrgPrice, nonce);
if (txType == TransactionTypes.AVM_CREATE_CODE) {
assertNull(contract);
return;
}
deployerBalance = repo.getBalance(deployer);
deployerNonce = repo.getNonce(deployer);
// First recurse 1 time less than the max and verify this is ok.
// Note that 128 == FvmConstants.MAX_CALL_DEPTH
int numRecurses = 127;
byte[] input = ByteUtil.merge(Hex.decode("2d7df21a"), contract.toByteArray());
input = ByteUtil.merge(input, new DataWord(numRecurses + 1).getData());
tx = AionTransaction.create(deployerKey, nonce.toByteArray(), contract, BigInteger.ZERO.toByteArray(), input, nrg, nrgPrice, txType, null);
assertFalse(tx.isContractCreationTransaction());
MiningBlock block = makeBlock(tx);
AionTxExecSummary summary = executeTransaction(tx, block, repo);
assertEquals("", summary.getReceipt().getError());
assertNotEquals(nrg, summary.getNrgUsed().longValue());
BigInteger txCost = BigInteger.valueOf(summary.getNrgUsed().longValue()).multiply(BigInteger.valueOf(nrgPrice));
assertEquals(deployerBalance.subtract(txCost), repo.getBalance(deployer));
deployerBalance = repo.getBalance(deployer);
deployerNonce = repo.getNonce(deployer);
repo.flushTo(blockchain.getRepository(), true);
repo = blockchain.getRepository().startTracking();
// Now recurse the max amount of times and ensure we fail.
// Note that 128 == FvmConstants.MAX_CALL_DEPTH
numRecurses = 128;
input = ByteUtil.merge(Hex.decode("2d7df21a"), contract.toByteArray());
input = ByteUtil.merge(input, new DataWord(numRecurses + 1).getData());
nonce = nonce.add(BigInteger.ONE);
tx = AionTransaction.create(deployerKey, nonce.toByteArray(), contract, BigInteger.ZERO.toByteArray(), input, nrg, nrgPrice, txType, null);
assertFalse(tx.isContractCreationTransaction());
block = makeBlock(tx);
summary = executeTransaction(tx, block, repo);
assertEquals("reverted", summary.getReceipt().getError());
assertNotEquals(nrg, summary.getNrgUsed().longValue());
txCost = BigInteger.valueOf(summary.getNrgUsed().longValue()).multiply(BigInteger.valueOf(nrgPrice));
assertEquals(deployerBalance.subtract(txCost), repo.getBalance(deployer));
}
use of org.aion.base.db.RepositoryCache in project aion by aionnetwork.
the class AvmProviderTest method testBalanceTransferTransactionVersion2WithCoinbaseLock.
@Test
public void testBalanceTransferTransactionVersion2WithCoinbaseLock() throws Exception {
Assert.assertTrue(AvmProvider.tryAcquireLock(1, TimeUnit.MINUTES));
AvmProvider.enableAvmVersion(AvmVersion.VERSION_2, this.projectRootDir);
AvmProvider.startAvm(AvmVersion.VERSION_2, true);
// Set up the repo and give the sender account some balance.
RepositoryCache repository = newRepository();
AionAddress sender = randomAddress();
AionAddress recipient = randomAddress();
addBalance(repository, sender, BigInteger.valueOf(1_000_000));
// Run the transaction.
RepositoryCache repositoryChild = repository.startTracking();
IAvmExternalState externalState = newExternalState(AvmVersion.VERSION_2, repositoryChild, newEnergyRules());
Transaction transaction = newBalanceTransferTransaction(sender, recipient, BigInteger.TEN);
IAionVirtualMachine avm = AvmProvider.getAvm(AvmVersion.VERSION_2);
IAvmFutureResult[] futures = avm.run(externalState, new Transaction[] { transaction }, AvmExecutionType.MINING, 0);
// Assert the result and state changes we expect.
Assert.assertEquals(1, futures.length);
TransactionResult result = futures[0].getResult();
Assert.assertTrue(result.transactionStatus.isSuccess());
Assert.assertEquals(BigInteger.TEN, repositoryChild.getBalance(recipient));
AvmProvider.shutdownAvm(AvmVersion.VERSION_2);
AvmProvider.disableAvmVersion(AvmVersion.VERSION_2);
AvmProvider.releaseLock();
}
Aggregations