use of org.aion.zero.impl.core.ImportResult in project aion by aionnetwork.
the class AionImpl method addNewBlock.
/**
* @implNote import a new block from the api server or the internal PoW miner, the kernel will
* reject to import a new block has the same or less than the kernel block height to reduce the orphan
* block happens (AKI-707)
*/
public ImportResult addNewBlock(Block block) {
getLock().lock();
try {
Block bestBlock = getAionHub().getBlockchain().getBestBlock();
ImportResult importResult;
if (bestBlock.getNumber() >= block.getNumber()) {
importResult = ImportResult.INVALID_BLOCK;
} else {
importResult = this.aionHub.getBlockchain().tryToConnect(new BlockWrapper(block, true, false, false, false));
}
LOG_GEN.debug("ImportResult:{} new block:{}", importResult, block);
if (importResult == ImportResult.IMPORTED_BEST) {
this.aionHub.getPropHandler().propagateNewBlock(block);
}
return importResult;
} finally {
getLock().unlock();
}
}
use of org.aion.zero.impl.core.ImportResult in project aion by aionnetwork.
the class PendingStateTest method repayTransactionTest.
@Test
public void repayTransactionTest() {
AionTransaction tx = AionTransaction.create(deployerKey, BigInteger.ZERO.toByteArray(), new AionAddress(new byte[32]), BigInteger.ZERO.toByteArray(), ByteUtils.fromHexString("1"), 21_000L * 10, energyPrice, TransactionTypes.DEFAULT, null);
AionTransaction repayTx = AionTransaction.create(deployerKey, BigInteger.ZERO.toByteArray(), new AionAddress(new byte[32]), BigInteger.ZERO.toByteArray(), ByteUtils.fromHexString("1"), 21_000L * 10, energyPrice * 2, TransactionTypes.DEFAULT, null);
assertEquals(TxResponse.SUCCESS, pendingState.addTransactionFromApiServer(tx));
assertEquals(1, pendingState.getPendingTxSize());
assertEquals(TxResponse.REPAID, pendingState.addTransactionFromApiServer(repayTx));
assertEquals(1, pendingState.getPendingTxSize());
assertEquals(tx, pendingState.getPendingTransactions().get(0));
MiningBlock block = blockchain.createNewMiningBlock(blockchain.getBestBlock(), Collections.emptyList(), false);
Pair<ImportResult, AionBlockSummary> connectResult = blockchain.tryToConnectAndFetchSummary(block);
assertEquals(connectResult.getLeft(), ImportResult.IMPORTED_BEST);
assertEquals(1, pendingState.getPendingTxSize());
assertEquals(repayTx, pendingState.getPendingTransactions().get(0));
}
use of org.aion.zero.impl.core.ImportResult in project aion by aionnetwork.
the class PendingStateTest method updateCacheTransactionsTest2.
@Test
public void updateCacheTransactionsTest2() {
List<AionTransaction> transactions = getMockTransaction(0, 2, 0);
List<AionTransaction> cachedTx = getMockTransaction(2, 2, 0);
assertEquals(TxResponse.SUCCESS, pendingState.addTransactionFromApiServer(transactions.get(0)));
assertEquals(1, pendingState.getPendingTxSize());
pendingState.addTransactionsFromNetwork(cachedTx);
assertEquals(1, pendingState.getPendingTxSize());
assertEquals(2, pendingState.getCachePoolSize());
transactions.add(cachedTx.get(0));
MiningBlock block = blockchain.createNewMiningBlock(blockchain.getBestBlock(), transactions, false);
Pair<ImportResult, AionBlockSummary> connectResult = blockchain.tryToConnectAndFetchSummary(block);
assertEquals(connectResult.getLeft(), ImportResult.IMPORTED_BEST);
assertEquals(1, pendingState.getPendingTxSize());
assertEquals(0, pendingState.getCachePoolSize());
assertEquals(cachedTx.get(1), pendingState.getPendingTransactions().get(0));
}
use of org.aion.zero.impl.core.ImportResult in project aion by aionnetwork.
the class PendingStateTest method energyLimitMinimum.
@Test
public void energyLimitMinimum() {
AionTransaction tx = AionTransaction.create(deployerKey, BigInteger.ZERO.toByteArray(), new AionAddress(new byte[32]), BigInteger.ZERO.toByteArray(), ByteUtils.fromHexString("1"), 21_000L, energyPrice, TransactionTypes.DEFAULT, null);
assertEquals(pendingState.addTransactionFromApiServer(tx), TxResponse.DROPPED);
MiningBlock block = blockchain.createNewMiningBlock(blockchain.getBestBlock(), pendingState.getPendingTransactions(), false);
Pair<ImportResult, AionBlockSummary> connectResult = blockchain.tryToConnectAndFetchSummary(block);
assertEquals(connectResult.getLeft(), ImportResult.IMPORTED_BEST);
}
use of org.aion.zero.impl.core.ImportResult in project aion by aionnetwork.
the class PendingStateTest method testAddPendingTransaction_AVMContractCall_Success.
@Test
public void testAddPendingTransaction_AVMContractCall_Success() throws Exception {
TestResourceProvider resourceProvider = TestResourceProvider.initializeAndCreateNewProvider(AvmPathManager.getPathOfProjectRootDirectory());
IAvmResourceFactory resourceFactory = resourceProvider.factoryForVersion1;
// Successful transaction
byte[] jar = resourceFactory.newContractFactory().getDeploymentBytes(AvmContract.HELLO_WORLD);
AionTransaction createTransaction = AionTransaction.create(deployerKey, BigInteger.ZERO.toByteArray(), null, BigInteger.ZERO.toByteArray(), jar, 5_000_000, energyPrice, TransactionTypes.AVM_CREATE_CODE, null);
assertEquals(pendingState.addTransactionFromApiServer(createTransaction), TxResponse.SUCCESS);
MiningBlock block = blockchain.createNewMiningBlock(blockchain.getBestBlock(), pendingState.getPendingTransactions(), false);
Pair<ImportResult, AionBlockSummary> connectResult = blockchain.tryToConnectAndFetchSummary(block);
AionTxReceipt receipt = connectResult.getRight().getReceipts().get(0);
// Check the block was imported, the contract has the Avm prefix, and deployment succeeded.
assertThat(connectResult.getLeft()).isEqualTo(ImportResult.IMPORTED_BEST);
// verify that the output is indeed the contract address
AionAddress contractAddress = TxUtil.calculateContractAddress(createTransaction);
assertThat(contractAddress.toByteArray()).isEqualTo(receipt.getTransactionOutput());
AionAddress contract = new AionAddress(receipt.getTransactionOutput());
byte[] call = resourceFactory.newStreamingEncoder().encodeOneString("sayHello").getEncoding();
AionTransaction callTransaction = AionTransaction.create(deployerKey, BigInteger.ONE.toByteArray(), contract, BigInteger.ZERO.toByteArray(), call, 2_000_000, energyPrice, TransactionTypes.DEFAULT, null);
assertEquals(pendingState.addTransactionFromApiServer(callTransaction), TxResponse.SUCCESS);
}
Aggregations