Search in sources :

Example 6 with AionRepositoryImpl

use of org.aion.zero.impl.db.AionRepositoryImpl in project aion by aionnetwork.

the class AionRepositoryImplTest method testRepoTrackUpdateStorageRow.

/**
 * Repo track test suite
 */
/**
 * This test confirms that updates done on the repo track are successfully translated
 * into the root repository.
 */
@Test
public void testRepoTrackUpdateStorageRow() {
    final AionRepositoryImpl repository = AionRepositoryImpl.createForTesting(repoConfig);
    final IRepositoryCache<AccountState, DataWord, IBlockStoreBase<?, ?>> repoTrack = repository.startTracking();
    final Address defaultAccount = Address.wrap(ByteUtil.hexStringToBytes("CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3"));
    final byte[] key = HashUtil.blake128("hello".getBytes());
    final byte[] value = HashUtil.blake128("world".getBytes());
    repoTrack.addBalance(defaultAccount, BigInteger.valueOf(1));
    final byte[] originalRoot = repository.getRoot();
    repoTrack.addStorageRow(defaultAccount, new DataWord(key), new DataWord(value));
    DataWord retrievedStorageValue = repoTrack.getStorageValue(defaultAccount, new DataWord(key));
    assertThat(retrievedStorageValue).isEqualTo(new DataWord(value));
    // commit changes, then check that the root has updated
    repoTrack.flush();
    assertThat(repository.getStorageValue(defaultAccount, new DataWord(key))).isEqualTo(retrievedStorageValue);
    final byte[] newRoot = repository.getRoot();
    assertThat(newRoot).isNotEqualTo(originalRoot);
}
Also used : Address(org.aion.base.type.Address) AionRepositoryImpl(org.aion.zero.impl.db.AionRepositoryImpl) DataWord(org.aion.mcf.vm.types.DataWord) AccountState(org.aion.mcf.core.AccountState) IBlockStoreBase(org.aion.mcf.db.IBlockStoreBase) Test(org.junit.Test)

Example 7 with AionRepositoryImpl

use of org.aion.zero.impl.db.AionRepositoryImpl in project aion by aionnetwork.

the class AionRepositoryImplTest method testAccountStateUpdateStorageRow.

@Test
public void testAccountStateUpdateStorageRow() {
    AionRepositoryImpl repository = AionRepositoryImpl.createForTesting(repoConfig);
    IRepositoryCache track = repository.startTracking();
    Address defaultAccount = Address.wrap(ByteUtil.hexStringToBytes("CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3"));
    track.addBalance(defaultAccount, BigInteger.valueOf(1));
    // Consider the original root the one after an account has been added
    byte[] originalRoot = repository.getRoot();
    byte[] key = HashUtil.blake128("hello".getBytes());
    byte[] value = HashUtil.blake128("world".getBytes());
    track.addStorageRow(defaultAccount, new DataWord(key), new DataWord(value));
    track.flush();
    byte[] retrievedValue = repository.getStorageValue(defaultAccount, new DataWord(key)).getNoLeadZeroesData();
    assertThat(retrievedValue).isEqualTo(value);
    byte[] newRoot = repository.getRoot();
    System.out.println(String.format("original root: %s", ByteUtil.toHexString(originalRoot)));
    System.out.println(String.format("new root: %s", ByteUtil.toHexString(newRoot)));
}
Also used : Address(org.aion.base.type.Address) IRepositoryCache(org.aion.base.db.IRepositoryCache) AionRepositoryImpl(org.aion.zero.impl.db.AionRepositoryImpl) DataWord(org.aion.mcf.vm.types.DataWord) Test(org.junit.Test)

Example 8 with AionRepositoryImpl

use of org.aion.zero.impl.db.AionRepositoryImpl in project aion by aionnetwork.

the class AionRepositoryImplTest method testAccountStateUpdateStorageRowFlush.

@Test
public void testAccountStateUpdateStorageRowFlush() {
    AionRepositoryImpl repository = AionRepositoryImpl.createForTesting(repoConfig);
    IRepositoryCache track = repository.startTracking();
    Address defaultAccount = Address.wrap(ByteUtil.hexStringToBytes("CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3"));
    track.addBalance(defaultAccount, BigInteger.valueOf(1));
    // Consider the original root the one after an account has been added
    byte[] originalRoot = repository.getRoot();
    byte[] key = HashUtil.blake128("hello".getBytes());
    byte[] value = HashUtil.blake128("world".getBytes());
    track.addStorageRow(defaultAccount, new DataWord(key), new DataWord(value));
    // does not call parent's flush
    track.flush();
    repository.flush();
    /**
     * Verify that the account has been flushed
     */
    IByteArrayKeyValueDatabase detailsDB = repository.getDetailsDatabase();
    Optional<byte[]> serializedDetails = detailsDB.get(defaultAccount.toBytes());
    assertThat(serializedDetails.isPresent()).isEqualTo(true);
    AionContractDetailsImpl details = new AionContractDetailsImpl(0, 1000000);
    details.decode(serializedDetails.get());
    assertThat(details.get(new DataWord(key))).isEqualTo(new DataWord(value));
}
Also used : Address(org.aion.base.type.Address) IByteArrayKeyValueDatabase(org.aion.base.db.IByteArrayKeyValueDatabase) IRepositoryCache(org.aion.base.db.IRepositoryCache) AionRepositoryImpl(org.aion.zero.impl.db.AionRepositoryImpl) DataWord(org.aion.mcf.vm.types.DataWord) AionContractDetailsImpl(org.aion.zero.db.AionContractDetailsImpl) Test(org.junit.Test)

Example 9 with AionRepositoryImpl

use of org.aion.zero.impl.db.AionRepositoryImpl in project aion by aionnetwork.

the class AionRepositoryImplTest method testAccountAddCodeStorage.

@Test
public void testAccountAddCodeStorage() {
    AionRepositoryImpl repository = AionRepositoryImpl.createForTesting(repoConfig);
    IRepositoryCache track = repository.startTracking();
    Address defaultAccount = Address.wrap(ByteUtil.hexStringToBytes("CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3"));
    track.addBalance(defaultAccount, BigInteger.valueOf(1));
    byte[] originalRoot = repository.getRoot();
    track.saveCode(defaultAccount, defaultAccount.toBytes());
    track.flush();
    byte[] newRoot = repository.getRoot();
    assertThat(newRoot).isNotEqualTo(originalRoot);
    assertThat(repository.getCode(defaultAccount)).isEqualTo(defaultAccount.toBytes());
    System.out.println(String.format("originalRoot: %s", ByteUtil.toHexString(originalRoot)));
    System.out.println(String.format("newRoot: %s", ByteUtil.toHexString(originalRoot)));
}
Also used : Address(org.aion.base.type.Address) IRepositoryCache(org.aion.base.db.IRepositoryCache) AionRepositoryImpl(org.aion.zero.impl.db.AionRepositoryImpl) Test(org.junit.Test)

Example 10 with AionRepositoryImpl

use of org.aion.zero.impl.db.AionRepositoryImpl in project aion by aionnetwork.

the class AionRepositoryImplTest method testAccountStateUpdate.

@Test
public void testAccountStateUpdate() {
    AionRepositoryImpl repository = AionRepositoryImpl.createForTesting(repoConfig);
    byte[] originalRoot = repository.getRoot();
    Address defaultAccount = Address.wrap(ByteUtil.hexStringToBytes("CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3CAF3"));
    IRepositoryCache track = repository.startTracking();
    track.addBalance(defaultAccount, BigInteger.valueOf(1));
    track.flush();
    byte[] newRoot = repository.getRoot();
    System.out.println(String.format("original root: %s", ByteUtil.toHexString(originalRoot)));
    System.out.println(String.format("new root: %s", ByteUtil.toHexString(newRoot)));
    assertThat(newRoot).isNotEqualTo(originalRoot);
}
Also used : Address(org.aion.base.type.Address) IRepositoryCache(org.aion.base.db.IRepositoryCache) AionRepositoryImpl(org.aion.zero.impl.db.AionRepositoryImpl) Test(org.junit.Test)

Aggregations

AionRepositoryImpl (org.aion.zero.impl.db.AionRepositoryImpl)13 Address (org.aion.base.type.Address)10 Test (org.junit.Test)10 IRepositoryCache (org.aion.base.db.IRepositoryCache)7 DataWord (org.aion.mcf.vm.types.DataWord)5 IByteArrayKeyValueDatabase (org.aion.base.db.IByteArrayKeyValueDatabase)3 AionContractDetailsImpl (org.aion.zero.db.AionContractDetailsImpl)3 HashMap (java.util.HashMap)2 AionTxInfo (org.aion.zero.impl.types.AionTxInfo)2 BigInteger (java.math.BigInteger)1 IContractDetails (org.aion.base.db.IContractDetails)1 AccountState (org.aion.mcf.core.AccountState)1 IBlockStoreBase (org.aion.mcf.db.IBlockStoreBase)1 RecoveryUtils (org.aion.zero.impl.db.RecoveryUtils)1 AionBlock (org.aion.zero.impl.types.AionBlock)1 AionBlockSummary (org.aion.zero.impl.types.AionBlockSummary)1