Search in sources :

Example 1 with BlockContext

use of org.aion.zero.impl.types.BlockContext 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 2 with BlockContext

use of org.aion.zero.impl.types.BlockContext 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 3 with BlockContext

use of org.aion.zero.impl.types.BlockContext 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 4 with BlockContext

use of org.aion.zero.impl.types.BlockContext 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)

Example 5 with BlockContext

use of org.aion.zero.impl.types.BlockContext in project aion by aionnetwork.

the class OpcodeIntegTest method testDelegateCallActors.

@Test
public void testDelegateCallActors() 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);
    BigInteger n = new BigInteger("23786523");
    // Deployer calls contract D which performs DELEGATECALL to call contract E.
    long nrg = 1_000_000;
    long nrgPrice = 1;
    BigInteger value = new BigInteger("4364463");
    BigInteger nonce = BigInteger.TWO;
    byte[] input = // use DELEGATECALL on E.
    ByteUtil.merge(Hex.decode("32817e1d"), E.toByteArray());
    // pass in 'n' also.
    input = ByteUtil.merge(input, new DataWord(n).getData());
    AionTransaction tx = AionTransaction.create(deployerKey, nonce.toByteArray(), D, value.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 there to be one internal transaction and it should look like deployer sent to
    // D.
    List<InternalTransaction> internalTxs = summary.getInternalTransactions();
    assertEquals(1, internalTxs.size());
    assertEquals(deployer, 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)

Aggregations

BlockContext (org.aion.zero.impl.types.BlockContext)49 AionTransaction (org.aion.base.AionTransaction)42 Test (org.junit.Test)42 BigInteger (java.math.BigInteger)27 AionAddress (org.aion.types.AionAddress)25 AionTxExecSummary (org.aion.base.AionTxExecSummary)19 MiningBlock (org.aion.zero.impl.types.MiningBlock)18 AionRepositoryImpl (org.aion.zero.impl.db.AionRepositoryImpl)16 RepositoryCache (org.aion.base.db.RepositoryCache)15 Block (org.aion.zero.impl.types.Block)15 ArrayList (java.util.ArrayList)13 MockDB (org.aion.db.impl.mockdb.MockDB)12 DataWord (org.aion.util.types.DataWord)11 ImportResult (org.aion.zero.impl.core.ImportResult)9 ECKey (org.aion.crypto.ECKey)8 StandaloneBlockchain (org.aion.zero.impl.blockchain.StandaloneBlockchain)8 TrieImpl (org.aion.zero.impl.trie.TrieImpl)6 HashMap (java.util.HashMap)5 Map (java.util.Map)5 Log (org.aion.types.Log)5