Search in sources :

Example 16 with AionAddress

use of org.aion.types.AionAddress in project aion by aionnetwork.

the class OpcodeIntegTest method setup.

@Before
public void setup() {
    StandaloneBlockchain.Bundle bundle = (new StandaloneBlockchain.Builder()).withValidatorConfiguration("simple").withDefaultAccounts().build();
    blockchain = bundle.bc;
    deployerKey = bundle.privateKeys.get(0);
    deployer = new AionAddress(deployerKey.getAddress());
    deployerBalance = Builder.DEFAULT_BALANCE;
    AvmTestConfig.supportOnlyAvmVersion1();
}
Also used : AionAddress(org.aion.types.AionAddress) Builder(org.aion.zero.impl.blockchain.StandaloneBlockchain.Builder) StandaloneBlockchain(org.aion.zero.impl.blockchain.StandaloneBlockchain) Before(org.junit.Before)

Example 17 with AionAddress

use of org.aion.types.AionAddress in project aion by aionnetwork.

the class OpcodeIntegTest method testCallcodeActors.

@Test
public void testCallcodeActors() throws Exception {
    RepositoryCache repo = blockchain.getRepository().startTracking();
    AionAddress D = deployContract(repo, "D", "D.sol", BigInteger.ZERO);
    AionAddress E = deployContract(repo, "E", "D.sol", BigInteger.ZERO);
    // Deployer calls contract D which performs CALLCODE to call contract E. From the
    // perspective
    // of the internal transaction, however, it looks like D calls D.
    long nrg = 1_000_000;
    long nrgPrice = 1;
    BigInteger nonce = BigInteger.TWO;
    byte[] input = // use CALLCODE on E.
    ByteUtil.merge(Hex.decode("5cce9fc2"), E.toByteArray());
    // pass in 'n' also.
    input = ByteUtil.merge(input, new DataWord(0).getData());
    AionTransaction tx = AionTransaction.create(deployerKey, nonce.toByteArray(), D, BigInteger.ZERO.toByteArray(), input, nrg, nrgPrice, TransactionTypes.DEFAULT, null);
    assertEquals(deployer, tx.getSenderAddress());
    assertEquals(D, tx.getDestinationAddress());
    BlockContext context = blockchain.createNewMiningBlockContext(blockchain.getBestBlock(), Collections.singletonList(tx), false);
    AionTxExecSummary summary = executeTransaction(tx, context.block, repo);
    assertEquals("", summary.getReceipt().getError());
    assertEquals(summary.getNrgUsed().longValue(), summary.getNrgUsed().longValue());
    // We expect that the internal transaction is sent from D to D.
    List<InternalTransaction> internalTxs = summary.getInternalTransactions();
    assertEquals(1, internalTxs.size());
    assertEquals(D, internalTxs.get(0).sender);
    assertEquals(D, internalTxs.get(0).destination);
}
Also used : AionAddress(org.aion.types.AionAddress) BlockContext(org.aion.zero.impl.types.BlockContext) AionTxExecSummary(org.aion.base.AionTxExecSummary) RepositoryCache(org.aion.base.db.RepositoryCache) BigInteger(java.math.BigInteger) DataWord(org.aion.util.types.DataWord) AionTransaction(org.aion.base.AionTransaction) InternalTransaction(org.aion.types.InternalTransaction) Test(org.junit.Test)

Example 18 with AionAddress

use of org.aion.types.AionAddress in project aion by aionnetwork.

the class OpcodeIntegTest method testNoRevert.

// ====================== test repo & track flushing over multiple levels ======================
@Test
public void testNoRevert() throws Exception {
    RepositoryCache repo = blockchain.getRepository().startTracking();
    AionAddress D = deployContract(repo, "F", "F.sol", BigInteger.ZERO);
    long nrg = 1_000_000;
    long nrgPrice = 1;
    BigInteger nonce = BigInteger.ONE;
    byte[] input = ByteUtil.merge(Hex.decode("f854bb89"), new DataWord(6).getData());
    AionTransaction tx = AionTransaction.create(deployerKey, nonce.toByteArray(), D, BigInteger.ZERO.toByteArray(), input, nrg, nrgPrice, TransactionTypes.DEFAULT, null);
    BlockContext context = blockchain.createNewMiningBlockContext(blockchain.getBestBlock(), Collections.singletonList(tx), false);
    AionTxExecSummary summary = executeTransaction(tx, context.block, repo);
    assertEquals("", summary.getReceipt().getError());
    assertEquals(summary.getNrgUsed().longValue(), summary.getNrgUsed().longValue());
    // Check that the logs from our internal transactions are as we expect.
    List<Log> logs = summary.getReceipt().getLogInfoList();
    assertEquals(12, logs.size());
    assertArrayEquals(new DataWord(0).getData(), logs.get(0).copyOfData());
    assertArrayEquals(new DataWord(6).getData(), logs.get(1).copyOfData());
    assertArrayEquals(new DataWord(5).getData(), logs.get(2).copyOfData());
    assertArrayEquals(new DataWord(4).getData(), logs.get(3).copyOfData());
    assertArrayEquals(new DataWord(3).getData(), logs.get(4).copyOfData());
    assertArrayEquals(new DataWord(2).getData(), logs.get(5).copyOfData());
    assertArrayEquals(new DataWord(1).getData(), logs.get(6).copyOfData());
    assertArrayEquals(new DataWord(1).getData(), logs.get(7).copyOfData());
    assertArrayEquals(new DataWord(1).getData(), logs.get(8).copyOfData());
    assertArrayEquals(new DataWord(1).getData(), logs.get(9).copyOfData());
    assertArrayEquals(new DataWord(1).getData(), logs.get(10).copyOfData());
    assertArrayEquals(new DataWord(1).getData(), logs.get(11).copyOfData());
}
Also used : AionAddress(org.aion.types.AionAddress) Log(org.aion.types.Log) BlockContext(org.aion.zero.impl.types.BlockContext) AionTxExecSummary(org.aion.base.AionTxExecSummary) RepositoryCache(org.aion.base.db.RepositoryCache) BigInteger(java.math.BigInteger) DataWord(org.aion.util.types.DataWord) AionTransaction(org.aion.base.AionTransaction) Test(org.junit.Test)

Example 19 with AionAddress

use of org.aion.types.AionAddress in project aion by aionnetwork.

the class OpcodeIntegTest method testRevertAtMidLevel.

@Test
public void testRevertAtMidLevel() throws Exception {
    RepositoryCache repo = blockchain.getRepository().startTracking();
    AionAddress D = deployContract(repo, "F", "F.sol", BigInteger.ZERO);
    long nrg = 1_000_000;
    long nrgPrice = 1;
    BigInteger nonce = BigInteger.ONE;
    byte[] input = ByteUtil.merge(Hex.decode("10462fd0"), new DataWord(7).getData());
    AionTransaction tx = AionTransaction.create(deployerKey, nonce.toByteArray(), D, BigInteger.ZERO.toByteArray(), input, nrg, nrgPrice, TransactionTypes.DEFAULT, null);
    BlockContext context = blockchain.createNewMiningBlockContext(blockchain.getBestBlock(), Collections.singletonList(tx), false);
    AionTxExecSummary summary = executeTransaction(tx, context.block, repo);
    assertEquals("", summary.getReceipt().getError());
    assertEquals(summary.getNrgUsed().longValue(), summary.getNrgUsed().longValue());
    // Check that the logs from our internal transactions are as we expect.
    List<Log> logs = summary.getReceipt().getLogInfoList();
    assertEquals(8, logs.size());
    assertArrayEquals(new DataWord(0).getData(), logs.get(0).copyOfData());
    assertArrayEquals(new DataWord(7).getData(), logs.get(1).copyOfData());
    assertArrayEquals(new DataWord(6).getData(), logs.get(2).copyOfData());
    assertArrayEquals(new DataWord(5).getData(), logs.get(3).copyOfData());
    assertArrayEquals(new DataWord(4).getData(), logs.get(4).copyOfData());
    assertArrayEquals(new DataWord(4).getData(), logs.get(5).copyOfData());
    assertArrayEquals(new DataWord(4).getData(), logs.get(6).copyOfData());
    assertArrayEquals(new DataWord(4).getData(), logs.get(7).copyOfData());
}
Also used : AionAddress(org.aion.types.AionAddress) Log(org.aion.types.Log) BlockContext(org.aion.zero.impl.types.BlockContext) AionTxExecSummary(org.aion.base.AionTxExecSummary) RepositoryCache(org.aion.base.db.RepositoryCache) BigInteger(java.math.BigInteger) DataWord(org.aion.util.types.DataWord) AionTransaction(org.aion.base.AionTransaction) Test(org.junit.Test)

Example 20 with AionAddress

use of org.aion.types.AionAddress in project aion by aionnetwork.

the class OpcodeIntegTest method testOpcodesActors.

// ============================= test CALL, CALLCODE, DELEGATECALL =============================
@Test
public void testOpcodesActors() throws Exception {
    RepositoryCache repo = blockchain.getRepository().startTracking();
    AionAddress callerContract = deployContract(repo, "Caller", "Opcodes.sol", BigInteger.ZERO);
    AionAddress calleeContract = deployContract(repo, "Callee", "Opcodes.sol", BigInteger.ZERO);
    System.err.println("Deployer: " + deployer);
    System.err.println("Caller: " + callerContract);
    System.err.println("Callee: " + calleeContract);
    long nrg = 1_000_000;
    long nrgPrice = 1;
    BigInteger nonce = BigInteger.TWO;
    byte[] input = ByteUtil.merge(Hex.decode("fc68521a"), calleeContract.toByteArray());
    AionTransaction tx = AionTransaction.create(deployerKey, nonce.toByteArray(), callerContract, BigInteger.ZERO.toByteArray(), input, nrg, nrgPrice, TransactionTypes.DEFAULT, null);
    BlockContext context = blockchain.createNewMiningBlockContext(blockchain.getBestBlock(), Collections.singletonList(tx), false);
    AionTxExecSummary summary = executeTransaction(tx, context.block, repo);
    assertEquals("", summary.getReceipt().getError());
    assertEquals(summary.getNrgUsed().longValue(), summary.getNrgUsed().longValue());
    // We examine the logs to determine the expected state. We expect to see
    // owner-caller-origin-data as follows for each opcode:
    // 
    // CALL             -->     CALLEE-CALLER-DEPLOYER-ZERO
    // CALLCODE         -->     CALLER-CALLER-DEPLOYER-ZERO
    // DELEGATECALL     -->     CALLER-DEPLOYER-DEPLOYER-ZERO
    List<Log> logs = summary.getReceipt().getLogInfoList();
    assertEquals(3, logs.size());
    verifyLogData(logs.get(0).copyOfData(), calleeContract, callerContract, deployer);
    verifyLogData(logs.get(1).copyOfData(), callerContract, callerContract, deployer);
    verifyLogData(logs.get(2).copyOfData(), callerContract, deployer, deployer);
}
Also used : AionAddress(org.aion.types.AionAddress) Log(org.aion.types.Log) BlockContext(org.aion.zero.impl.types.BlockContext) AionTxExecSummary(org.aion.base.AionTxExecSummary) RepositoryCache(org.aion.base.db.RepositoryCache) BigInteger(java.math.BigInteger) AionTransaction(org.aion.base.AionTransaction) Test(org.junit.Test)

Aggregations

AionAddress (org.aion.types.AionAddress)491 Test (org.junit.Test)364 AionTransaction (org.aion.base.AionTransaction)275 BigInteger (java.math.BigInteger)194 ImportResult (org.aion.zero.impl.core.ImportResult)110 AionTxExecSummary (org.aion.base.AionTxExecSummary)97 RepositoryCache (org.aion.base.db.RepositoryCache)90 MiningBlock (org.aion.zero.impl.types.MiningBlock)89 AionBlockSummary (org.aion.zero.impl.types.AionBlockSummary)80 ArrayList (java.util.ArrayList)76 ECKey (org.aion.crypto.ECKey)74 AionTxReceipt (org.aion.base.AionTxReceipt)60 Block (org.aion.zero.impl.types.Block)60 AccountState (org.aion.base.AccountState)56 HashMap (java.util.HashMap)42 DataWord (org.aion.util.types.DataWord)39 PrecompiledTransactionResult (org.aion.precompiled.PrecompiledTransactionResult)36 InternalTransaction (org.aion.types.InternalTransaction)32 ByteArrayWrapper (org.aion.util.types.ByteArrayWrapper)29 BlockContext (org.aion.zero.impl.types.BlockContext)29