diff --git a/app/src/main/java/org/ethereum/android_app/ConsoleFragment.java b/app/src/main/java/org/ethereum/android_app/ConsoleFragment.java index b99348d5..a420257d 100644 --- a/app/src/main/java/org/ethereum/android_app/ConsoleFragment.java +++ b/app/src/main/java/org/ethereum/android_app/ConsoleFragment.java @@ -9,6 +9,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; +import org.ethereum.android.EthereumManager; import org.ethereum.listener.EthereumListenerAdapter; public class ConsoleFragment extends Fragment { diff --git a/app/src/main/java/org/ethereum/android_app/MainActivity.java b/app/src/main/java/org/ethereum/android_app/MainActivity.java index f6c5fd8c..3a29109e 100644 --- a/app/src/main/java/org/ethereum/android_app/MainActivity.java +++ b/app/src/main/java/org/ethereum/android_app/MainActivity.java @@ -10,6 +10,8 @@ import android.util.Log; import android.view.Menu; import android.view.MenuItem; +import org.ethereum.android.EthereumManager; + public class MainActivity extends ActionBarActivity { diff --git a/app/src/main/java/org/ethereum/android_app/TabsPagerAdapter.java b/app/src/main/java/org/ethereum/android_app/TabsPagerAdapter.java index e6139683..810640cf 100644 --- a/app/src/main/java/org/ethereum/android_app/TabsPagerAdapter.java +++ b/app/src/main/java/org/ethereum/android_app/TabsPagerAdapter.java @@ -4,6 +4,8 @@ import android.support.v4.app.FragmentManager; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentPagerAdapter; +import org.ethereum.android.EthereumManager; + public class TabsPagerAdapter extends FragmentPagerAdapter { int tabsCount; diff --git a/app/src/main/java/org/ethereum/android_app/TestsFragment.java b/app/src/main/java/org/ethereum/android_app/TestsFragment.java index 7c0409b6..47d6b825 100644 --- a/app/src/main/java/org/ethereum/android_app/TestsFragment.java +++ b/app/src/main/java/org/ethereum/android_app/TestsFragment.java @@ -7,6 +7,8 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import org.ethereum.android.EthereumManager; + public class TestsFragment extends Fragment { EthereumManager ethereumManager; diff --git a/ethereum-core-android/src/main/java/org/ethereum/android/EthereumManager.java b/ethereum-core-android/src/main/java/org/ethereum/android/EthereumManager.java deleted file mode 100644 index bb5e39e4..00000000 --- a/ethereum-core-android/src/main/java/org/ethereum/android/EthereumManager.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.ethereum.android; - -import android.content.Context; - -import org.ethereum.android.di.components.DaggerEthereumComponent; -import org.ethereum.android.di.modules.EthereumModule; -import org.ethereum.config.SystemProperties; -import org.ethereum.facade.Ethereum; -import org.ethereum.listener.EthereumListenerAdapter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class EthereumManager { - - private static final Logger logger = LoggerFactory.getLogger("manager"); - - public static Ethereum ethereum = null; - - - public EthereumManager(Context context) { - System.setProperty("sun.arch.data.model", "32"); - System.setProperty("leveldb.mmap", "false"); - ethereum = DaggerEthereumComponent.builder() - .ethereumModule(new EthereumModule(context)) - .build().ethereum(); - } - - public void start() { - - } - - public void connect() { - - ethereum.connect(SystemProperties.CONFIG.activePeerIP(), - SystemProperties.CONFIG.activePeerPort(), - SystemProperties.CONFIG.activePeerNodeid()); - //ethereum.getBlockchain(); - } - - public void startPeerDiscovery() { - - ethereum.startPeerDiscovery(); - } - - public void addListener(EthereumListenerAdapter listener) { - - ethereum.addListener(listener); - } - -} diff --git a/ethereum-core-android/src/main/java/org/ethereum/android/datasource/LevelDbDataSource.java b/ethereum-core-android/src/main/java/org/ethereum/android/datasource/LevelDbDataSource.java deleted file mode 100644 index bfa1e8ad..00000000 --- a/ethereum-core-android/src/main/java/org/ethereum/android/datasource/LevelDbDataSource.java +++ /dev/null @@ -1,146 +0,0 @@ -package org.ethereum.android.datasource; - -import org.ethereum.config.SystemProperties; - -import org.ethereum.datasource.KeyValueDataSource; -import org.iq80.leveldb.CompressionType; -import org.iq80.leveldb.DB; -import org.iq80.leveldb.DBIterator; -import org.iq80.leveldb.Options; -import org.iq80.leveldb.WriteBatch; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.io.IOException; - -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import static org.iq80.leveldb.impl.Iq80DBFactory.factory; -import android.content.Context; - -/** - * @author Roman Mandeleil - * @since 18.01.2015 - */ -public class LevelDbDataSource implements KeyValueDataSource { - - private static final Logger logger = LoggerFactory.getLogger("db"); - - String name; - private DB db; - private Context context; - - public LevelDbDataSource() { - } - - public LevelDbDataSource(String name) { - this.name = name; - } - - public void setContext(Context context) { - this.context = context; - } - - @Override - public void init() { - - if (name == null) throw new NullPointerException("no name set to the db"); - - Options options = new Options(); - options.createIfMissing(true); - options.compressionType(CompressionType.NONE); - org.iq80.leveldb.Logger logger1 = new org.iq80.leveldb.Logger() { - public void log(String message) { - logger.debug(message); - } - }; - options.logger(logger1); - try { - logger.debug("Opening database"); - File dbLocation = context.getDir(SystemProperties.CONFIG.databaseDir(), 0); - File fileLocation = new File(dbLocation, name); - - if (SystemProperties.CONFIG.databaseReset()) { - destroyDB(fileLocation); - } - - logger.debug("Initializing new or existing database: '{}'", fileLocation.getAbsolutePath()); - db = Iq80DBFactory.factory.open(fileLocation, options); - - } catch (IOException ioe) { - logger.error(ioe.getMessage(), ioe); - throw new RuntimeException("Can't initialize database"); - } - } - - - public void destroyDB(File fileLocation) { - logger.debug("Destroying existing database"); - Options options = new Options(); - try { - Iq80DBFactory.factory.destroy(fileLocation, options); - } catch (IOException e) { - logger.error(e.getMessage(), e); - } - } - - - @Override - public void setName(String name) { - this.name = name; - } - - @Override - public byte[] get(byte[] key) { - return db.get(key); - } - - @Override - public byte[] put(byte[] key, byte[] value) { - db.put(key, value); - return value; - } - - @Override - public void delete(byte[] key) { - db.delete(key); - } - - @Override - public Set keys() { - - DBIterator dbIterator = db.iterator(); - Set keys = new HashSet<>(); - while (dbIterator.hasNext()) { - - Map.Entry entry = dbIterator.next(); - keys.add(entry.getKey()); - } - return keys; - } - - @Override - public void updateBatch(Map rows) { - - WriteBatch batch = db.createWriteBatch(); - - for (Map.Entry row : rows.entrySet()) - batch.put(row.getKey(), row.getValue()); - - db.write(batch); - } - - @Override - public void close() { - try { - logger.info("Close db: {}", name); - db.close(); - } catch (IOException e) { - logger.error("Failed to find the db file on the close: {} ", name); - } - } -} \ No newline at end of file diff --git a/ethereum-core-android/src/main/java/org/ethereum/android/db/BlockDatabaseHelper.java b/ethereum-core-android/src/main/java/org/ethereum/android/db/BlockDatabaseHelper.java deleted file mode 100644 index 45aa8c3b..00000000 --- a/ethereum-core-android/src/main/java/org/ethereum/android/db/BlockDatabaseHelper.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.ethereum.android.db; - - -import java.sql.SQLException; - -import android.content.Context; -import android.database.sqlite.SQLiteDatabase; -import android.util.Log; - -import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper; -import com.j256.ormlite.dao.Dao; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.TableUtils; - -import org.ethereum.db.BlockVO; - -/** - * Database helper class used to manage the creation and upgrading of your database. This class also usually provides - * the DAOs used by the other classes. - */ -public class BlockDatabaseHelper extends OrmLiteSqliteOpenHelper { - - private static final String DATABASE_NAME = "blocks.db"; - private static final int DATABASE_VERSION = 1; - - // the DAO object we use to access the SimpleData table - private Dao blockDao = null; - - public BlockDatabaseHelper(Context context) { - super(context, DATABASE_NAME, null, DATABASE_VERSION); - } - - /** - * This is called when the database is first created. Usually you should call createTable statements here to create - * the tables that will store your data. - */ - @Override - public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) { - try { - Log.i(BlockDatabaseHelper.class.getName(), "onCreate"); - TableUtils.createTable(connectionSource, BlockVO.class); - } catch (SQLException e) { - Log.e(BlockDatabaseHelper.class.getName(), "Can't create database", e); - throw new RuntimeException(e); - } - } - - /** - * This is called when your application is upgraded and it has a higher version number. This allows you to adjust - * the various data to match the new version number. - */ - @Override - public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int oldVersion, int newVersion) { - try { - Log.i(BlockDatabaseHelper.class.getName(), "onUpgrade"); - TableUtils.dropTable(connectionSource, BlockVO.class, true); - // after we drop the old databases, we create the new ones - onCreate(db, connectionSource); - } catch (SQLException e) { - Log.e(BlockDatabaseHelper.class.getName(), "Can't drop databases", e); - throw new RuntimeException(e); - } - } - - /** - * Returns the Database Access Object (DAO) for our SimpleData class. It will create it or just give the cached - * value. - */ - public Dao getBlockDao() throws SQLException { - if (blockDao == null) { - blockDao = getDao(BlockVO.class); - } - return blockDao; - } - - /** - * Close the database connections and clear any cached DAOs. - */ - @Override - public void close() { - super.close(); - blockDao = null; - } -} diff --git a/ethereum-core-android/src/main/java/org/ethereum/android/db/BlockStoreImpl.java b/ethereum-core-android/src/main/java/org/ethereum/android/db/BlockStoreImpl.java deleted file mode 100644 index ed9d9818..00000000 --- a/ethereum-core-android/src/main/java/org/ethereum/android/db/BlockStoreImpl.java +++ /dev/null @@ -1,94 +0,0 @@ -package org.ethereum.android.db; - -import org.ethereum.core.Block; -import org.ethereum.core.TransactionReceipt; -import org.ethereum.db.BlockStore; -import org.ethereum.db.BlockVO; -import org.ethereum.util.ByteUtil; - -import java.math.BigInteger; -import java.util.List; - -public class BlockStoreImpl implements BlockStore { - - private BlockDatabaseHelper blockDao; - private TransactionDatabaseHelper transactionDao; - - public BlockStoreImpl(BlockDatabaseHelper blockDao, TransactionDatabaseHelper transactionDao) { - - this.blockDao = blockDao; - this.transactionDao = transactionDao; - } - - public byte[] getBlockHashByNumber(long blockNumber) { - - Block block = getBlockByNumber(blockNumber); - if (block != null) return block.getHash(); - return ByteUtil.EMPTY_BYTE_ARRAY; - } - - - public Block getBlockByNumber(long blockNumber) { - - /* - List result = sessionFactory.getCurrentSession(). - createQuery("from BlockVO where number = :number"). - setParameter("number", blockNumber).list(); - - if (result.size() == 0) return null; - BlockVO vo = (BlockVO) result.get(0); - - return new Block(vo.rlp); - */ - return null; - } - - public Block getBlockByHash(byte[] hash) { - - return null; - } - - @SuppressWarnings("unchecked") - public List getListOfHashesStartFrom(byte[] hash, int qty) { - - return null; - } - - public void deleteBlocksSince(long number) { - - } - - public void saveBlock(Block block, List receipts) { - - } - - public BigInteger getTotalDifficultySince(long number) { - - return null; - } - - public BigInteger getTotalDifficulty() { - - return null; - } - - public Block getBestBlock() { - - return null; - } - - @SuppressWarnings("unchecked") - public List getAllBlocks() { - - return null; - } - - public void reset() { - - } - - public TransactionReceipt getTransactionReceiptByHash(byte[] hash) { - - return null; - } -} diff --git a/ethereum-core-android/src/main/java/org/ethereum/android/db/TransactionDatabaseHelper.java b/ethereum-core-android/src/main/java/org/ethereum/android/db/TransactionDatabaseHelper.java deleted file mode 100644 index ae68de70..00000000 --- a/ethereum-core-android/src/main/java/org/ethereum/android/db/TransactionDatabaseHelper.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.ethereum.android.db; - - -import java.sql.SQLException; - -import android.content.Context; -import android.database.sqlite.SQLiteDatabase; -import android.util.Log; - -import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper; -import com.j256.ormlite.dao.Dao; -import com.j256.ormlite.support.ConnectionSource; -import com.j256.ormlite.table.TableUtils; - -import org.ethereum.db.TransactionReceiptVO; - -/** - * Database helper class used to manage the creation and upgrading of your database. This class also usually provides - * the DAOs used by the other classes. - */ -public class TransactionDatabaseHelper extends OrmLiteSqliteOpenHelper { - - private static final String DATABASE_NAME = "transactions.db"; - private static final int DATABASE_VERSION = 1; - - // the DAO object we use to access the SimpleData table - private Dao dao = null; - - public TransactionDatabaseHelper(Context context) { - super(context, DATABASE_NAME, null, DATABASE_VERSION); - } - - /** - * This is called when the database is first created. Usually you should call createTable statements here to create - * the tables that will store your data. - */ - @Override - public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) { - try { - Log.i(BlockDatabaseHelper.class.getName(), "onCreate"); - TableUtils.createTable(connectionSource, TransactionReceiptVO.class); - } catch (SQLException e) { - Log.e(BlockDatabaseHelper.class.getName(), "Can't create database", e); - throw new RuntimeException(e); - } - } - - /** - * This is called when your application is upgraded and it has a higher version number. This allows you to adjust - * the various data to match the new version number. - */ - @Override - public void onUpgrade(SQLiteDatabase db, ConnectionSource connectionSource, int oldVersion, int newVersion) { - try { - Log.i(BlockDatabaseHelper.class.getName(), "onUpgrade"); - TableUtils.dropTable(connectionSource, TransactionReceiptVO.class, true); - // after we drop the old databases, we create the new ones - onCreate(db, connectionSource); - } catch (SQLException e) { - Log.e(BlockDatabaseHelper.class.getName(), "Can't drop databases", e); - throw new RuntimeException(e); - } - } - - /** - * Returns the Database Access Object (DAO) for our SimpleData class. It will create it or just give the cached - * value. - */ - public Dao getBlockDao() throws SQLException { - if (dao == null) { - dao = getDao(TransactionReceiptVO.class); - } - return dao; - } - - /** - * Close the database connections and clear any cached DAOs. - */ - @Override - public void close() { - super.close(); - dao = null; - } -} diff --git a/ethereum-core-android/src/main/java/org/ethereum/android/di/components/EthereumComponent.java b/ethereum-core-android/src/main/java/org/ethereum/android/di/components/EthereumComponent.java deleted file mode 100644 index c6e0a280..00000000 --- a/ethereum-core-android/src/main/java/org/ethereum/android/di/components/EthereumComponent.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.ethereum.android.di.components; - -import android.content.Context; - -import org.ethereum.android.di.modules.EthereumModule; -import org.ethereum.facade.Ethereum; - -import javax.inject.Singleton; - -import dagger.Component; - -@Singleton -@Component(modules = EthereumModule.class) -public interface EthereumComponent { - - Context context(); - Ethereum ethereum(); -} diff --git a/ethereum-core-android/src/main/java/org/ethereum/android/di/modules/EthereumModule.java b/ethereum-core-android/src/main/java/org/ethereum/android/di/modules/EthereumModule.java deleted file mode 100644 index 793f0abd..00000000 --- a/ethereum-core-android/src/main/java/org/ethereum/android/di/modules/EthereumModule.java +++ /dev/null @@ -1,170 +0,0 @@ -package org.ethereum.android.di.modules; - -import android.content.Context; - -import org.ethereum.android.datasource.LevelDbDataSource; -import org.ethereum.config.SystemProperties; -import org.ethereum.core.BlockchainImpl; -import org.ethereum.core.Wallet; -import org.ethereum.db.BlockStore; -import org.ethereum.db.InMemoryBlockStore; -import org.ethereum.db.RepositoryImpl; -import org.ethereum.facade.Blockchain; -import org.ethereum.facade.Ethereum; -import org.ethereum.facade.EthereumImpl; -import org.ethereum.facade.Repository; -import org.ethereum.listener.CompositeEthereumListener; -import org.ethereum.listener.EthereumListener; -import org.ethereum.manager.AdminInfo; -import org.ethereum.manager.BlockLoader; -import org.ethereum.manager.WorldManager; -import org.ethereum.net.MessageQueue; -import org.ethereum.net.client.PeerClient; -import org.ethereum.net.eth.EthHandler; -import org.ethereum.net.p2p.P2pHandler; -import org.ethereum.net.peerdiscovery.DiscoveryChannel; -import org.ethereum.net.peerdiscovery.PeerDiscovery; -import org.ethereum.net.peerdiscovery.WorkerThread; -import org.ethereum.net.server.ChannelManager; -import org.ethereum.net.server.EthereumChannelInitializer; -import org.ethereum.net.shh.ShhHandler; -import org.ethereum.net.wire.MessageCodec; -import org.ethereum.vm.ProgramInvokeFactory; -import org.ethereum.vm.ProgramInvokeFactoryImpl; - -import javax.inject.Provider; -import javax.inject.Singleton; - -import dagger.Module; -import dagger.Provides; - -@Module -public class EthereumModule { - - private Context context; - - public EthereumModule(Context context) { - this.context = context; - } - - @Provides - @Singleton - Ethereum provideEthereum(WorldManager worldManager, AdminInfo adminInfo, ChannelManager channelManager, - BlockLoader blockLoader, Provider peerClientProvider, EthereumListener listener) { - return new EthereumImpl(worldManager, adminInfo, channelManager, blockLoader, peerClientProvider, listener); - } - - @Provides - @Singleton - WorldManager provideWorldManager(Blockchain blockchain, Repository repository, Wallet wallet, PeerDiscovery peerDiscovery - ,BlockStore blockStore, ChannelManager channelManager, AdminInfo adminInfo, EthereumListener listener) { - return new WorldManager(blockchain, repository, wallet, peerDiscovery, blockStore, channelManager, adminInfo, listener); - } - - @Provides - @Singleton - Blockchain provideBlockchain(BlockStore blockStore, Repository repository, - Wallet wallet, AdminInfo adminInfo, - EthereumListener listener, ChannelManager channelManager) { - return new BlockchainImpl(blockStore, repository, wallet, adminInfo, listener, channelManager); - } - - @Provides - @Singleton - BlockStore provideBlockStore() { - return new InMemoryBlockStore(); - } - - @Provides - @Singleton - Repository provideRepository() { - LevelDbDataSource detailsDS = new LevelDbDataSource(); - detailsDS.setContext(context); - LevelDbDataSource stateDS = new LevelDbDataSource(); - stateDS.setContext(context); - return new RepositoryImpl(detailsDS, stateDS); - } - - @Provides - @Singleton - AdminInfo provideAdminInfo() { - return new AdminInfo(); - } - - @Provides - @Singleton - EthereumListener provideEthereumListener() { - return new CompositeEthereumListener(); - } - - @Provides - @Singleton - PeerDiscovery providePeerDiscovery() { - return new PeerDiscovery(); - } - - @Provides - @Singleton - ChannelManager provideChannelManager(EthereumListener listener) { - return new ChannelManager(listener); - } - - @Provides - @Singleton - BlockLoader provideBlockLoader(Blockchain blockchain) { - return new BlockLoader(blockchain); - } - - @Provides - @Singleton - ProgramInvokeFactory provideProgramInvokeFactory() { - return new ProgramInvokeFactoryImpl(); - } - - @Provides - EthHandler provideEthHandler(Blockchain blockchain, EthereumListener listener, Wallet wallet) { - return new EthHandler(blockchain, listener, wallet); - } - - @Provides - ShhHandler provideShhHandler(EthereumListener listener) { - return new ShhHandler(listener); - } - - @Provides - P2pHandler provideP2pHandler(PeerDiscovery peerDiscovery, EthereumListener listener) { - return new P2pHandler(peerDiscovery, listener); - } - - @Provides - MessageCodec provideMessageCodec(EthereumListener listener) { - return new MessageCodec(listener); - } - - @Provides - PeerClient providePeerClient(EthereumListener listener, ChannelManager channelManager, - Provider ethereumChannelInitializerProvider) { - return new PeerClient(listener, channelManager, ethereumChannelInitializerProvider); - } - - @Provides - MessageQueue provideMessageQueue(EthereumListener listener) { - return new MessageQueue(listener); - } - - @Provides - WorkerThread provideWorkerThread(Provider discoveryChannelProvider) { - return new WorkerThread(discoveryChannelProvider); - } - - @Provides - String provideRemoteId() { - return SystemProperties.CONFIG.activePeerNodeid(); - } - - @Provides - @Singleton - Context provideContext() { - return context; - } -} diff --git a/ethereumj-core-android/build.gradle b/ethereumj-core-android/build.gradle index d11d42b9..21ece58f 100644 --- a/ethereumj-core-android/build.gradle +++ b/ethereumj-core-android/build.gradle @@ -44,4 +44,5 @@ dependencies { compile "com.j256.ormlite:ormlite-android:4.48" compile "org.glassfish:javax.annotation:10.0-b28" compile "org.iq80.leveldb:leveldb:0.7" + compile 'org.slf4j:slf4j-android:1.7.12' } diff --git a/ethereumj-core/src/main/java/org/ethereum/jsontestsuite/TestRunner.java b/ethereumj-core/src/main/java/org/ethereum/jsontestsuite/TestRunner.java index 8d503414..d576c780 100644 --- a/ethereumj-core/src/main/java/org/ethereum/jsontestsuite/TestRunner.java +++ b/ethereumj-core/src/main/java/org/ethereum/jsontestsuite/TestRunner.java @@ -42,11 +42,11 @@ public class TestRunner { private boolean setNewStateRoot; private String bestStateRoot; + @Inject public ChannelManager channelManager; @Inject - public TestRunner(ChannelManager channelManager) { - this.channelManager = channelManager; + public TestRunner() { } public List runTestSuite(TestSuite testSuite) { @@ -58,7 +58,7 @@ public class TestRunner { TestCase testCase = testIterator.next(); - TestRunner runner = new TestRunner(channelManager); + TestRunner runner = new TestRunner(); List result = runner.runTestCase(testCase); resultCollector.addAll(result); } diff --git a/ethereumj-core/src/test/java/test/ethereum/TestContext.java b/ethereumj-core/src/test/java/test/ethereum/TestContext.java deleted file mode 100644 index 482704fc..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/TestContext.java +++ /dev/null @@ -1,95 +0,0 @@ -package test.ethereum; - -import org.ethereum.config.SystemProperties; -import org.ethereum.facade.Ethereum; - -import org.hibernate.SessionFactory; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.jdbc.datasource.DataSourceTransactionManager; -import org.springframework.jdbc.datasource.DriverManagerDataSource; -import org.springframework.orm.hibernate4.LocalSessionFactoryBuilder; - -import java.sql.SQLException; - -import java.util.Properties; - -/** - * @author Roman Mandeleil - * @since 16.11.2014 - */ -public class TestContext { - - private static final Logger logger = LoggerFactory.getLogger("test"); - - - @Bean - public SessionFactory sessionFactory() throws SQLException { - - logger.info("loading context"); - - LocalSessionFactoryBuilder builder = - new LocalSessionFactoryBuilder(dataSource()); - builder.scanPackages("org.ethereum.db") - .addProperties(getHibernateProperties()); - - return builder.buildSessionFactory(); - } - - private Properties getHibernateProperties() { - - Properties prop = new Properties(); - - if (SystemProperties.CONFIG.databaseReset()) - prop.put("hibernate.hbm2ddl.auto", "create"); - - prop.put("hibernate.format_sql", "true"); - -// todo: useful but annoying consider define by system.properties -// prop.put("hibernate.show_sql", "true"); - prop.put("hibernate.dialect", - "org.hibernate.dialect.HSQLDialect"); - return prop; - } - - - @Bean - public DataSourceTransactionManager transactionManager() { - DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager(); - dataSourceTransactionManager.setDataSource(dataSource()); - - return dataSourceTransactionManager; - } - - @Bean(name = "dataSource") - public DriverManagerDataSource dataSource() { - - logger.info("Connecting to the block store"); - - System.setProperty("hsqldb.reconfig_logging", "false"); - - String url = - String.format("jdbc:hsqldb:file:./%s/blockchain/blockchain.db;" + - "create=%s;hsqldb.default_table_type=cached", - - SystemProperties.CONFIG.databaseDir(), - SystemProperties.CONFIG.databaseReset()); - - DriverManagerDataSource ds = new DriverManagerDataSource(); - ds.setDriverClassName("org.hsqldb.jdbcDriver"); - ds.setUrl(url); - ds.setUsername("sa"); - - - return ds; - } - - - @Autowired - Ethereum eth; - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/blockstore/InMemoryBlockStoreTest.java b/ethereumj-core/src/test/java/test/ethereum/blockstore/InMemoryBlockStoreTest.java deleted file mode 100644 index fe5b3b16..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/blockstore/InMemoryBlockStoreTest.java +++ /dev/null @@ -1,91 +0,0 @@ -package test.ethereum.blockstore; - -import org.ethereum.core.Block; -import org.ethereum.core.Genesis; -import org.ethereum.db.InMemoryBlockStore; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.spongycastle.util.encoders.Hex; - -import java.io.File; -import java.io.IOException; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.util.List; - -import static org.junit.Assert.*; - -/** - * @author: Roman Mandeleil - * Created on: 30/01/2015 11:04 - */ - -public class InMemoryBlockStoreTest { - - private static final Logger logger = LoggerFactory.getLogger("test"); - private InMemoryBlockStore blockStore; - - @Before - public void setup() throws URISyntaxException, IOException { - - blockStore = new InMemoryBlockStore(); - URL scenario1 = ClassLoader - .getSystemResource("blockstore/load.dmp"); - - File file = new File(scenario1.toURI()); - List strData = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8); - - for (String blockRLP : strData) { - Block block = new Block( - Hex.decode(blockRLP)); - logger.info("adding block.hash: {}", Hex.toHexString(block.getHash()).substring(6)); - blockStore.saveBlock(block, null); - } - } - - @Test - public void testSaving8001Blocks() { - - Block bestBlock = blockStore.getBestBlock(); - Long bestIndex = blockStore.getBestBlock().getNumber(); - Long firstIndex = bestIndex - InMemoryBlockStore.MAX_BLOCKS; - - assertTrue(bestIndex == 8001); - assertTrue(firstIndex == 7001); - - assertTrue(blockStore.getBlockByNumber(7000) == null); - assertTrue(blockStore.getBlockByNumber(8002) == null); - - Block byHashBlock = blockStore.getBlockByHash(bestBlock.getHash()); - assertTrue(bestBlock.getNumber() == byHashBlock.getNumber()); - - byte[] hashFor8500 = blockStore.getBlockByNumber(7500).getHash(); - Block block8500 = blockStore.getBlockByHash(hashFor8500); - assertTrue(block8500.getNumber() == 7500); - } - - - @Test - public void testListOfHashes(){ - - Block block = blockStore.getBlockByNumber(7500); - byte[] hash = block.getHash(); - - List hashes = blockStore.getListOfHashesStartFrom(hash, 700); - - byte[] lastHash = hashes.get(hashes.size() - 1); - - assertEquals(Hex.toHexString(blockStore.getBestBlock().getHash()), - Hex.toHexString(lastHash)); - - assertTrue(hashes.size() == 502); - - } - - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/core/AccountStateTest.java b/ethereumj-core/src/test/java/test/ethereum/core/AccountStateTest.java deleted file mode 100644 index d01e649c..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/core/AccountStateTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package test.ethereum.core; - -import org.ethereum.core.AccountState; - -import org.junit.Test; - -import org.spongycastle.util.encoders.Hex; - -import java.math.BigInteger; - -import static org.junit.Assert.assertEquals; - -public class AccountStateTest { - - @Test - public void testGetEncoded() { - String expected = "f85e809" - + "a0100000000000000000000000000000000000000000000000000" - + "a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421" - + "a0c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"; - AccountState acct = new AccountState(BigInteger.ZERO, BigInteger.valueOf(2).pow(200)); - assertEquals(expected, Hex.toHexString(acct.getEncoded())); - } - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/core/BlockTest.java b/ethereumj-core/src/test/java/test/ethereum/core/BlockTest.java deleted file mode 100644 index 572f0b29..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/core/BlockTest.java +++ /dev/null @@ -1,265 +0,0 @@ -package test.ethereum.core; - -import test.ethereum.TestContext; - -import org.ethereum.config.SystemProperties; -import org.ethereum.core.Block; -import org.ethereum.core.BlockchainImpl; -import org.ethereum.core.Genesis; -import org.ethereum.facade.Blockchain; -import org.ethereum.manager.WorldManager; - -import org.junit.After; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.spongycastle.util.encoders.Hex; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.support.AnnotationConfigContextLoader; - -import java.io.File; -import java.io.IOException; - -import java.math.BigInteger; - -import java.net.URISyntaxException; -import java.net.URL; - -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; - -import java.util.List; - -import static org.junit.Assert.*; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(loader = AnnotationConfigContextLoader.class) -public class BlockTest { - - private static final Logger logger = LoggerFactory.getLogger("test"); - - - @Configuration - @ComponentScan(basePackages = "org.ethereum") - static class ContextConfiguration extends TestContext { - static { - SystemProperties.CONFIG.setDataBaseDir("test_db/" + BlockTest.class); - } - } - - @Autowired - WorldManager worldManager; - - - // https://ethereum.etherpad.mozilla.org/12 - private String PoC7_GENESIS_HEX_RLP_ENCODED = "f9012ef90129a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a0156df8ef53c723b40f97aff55dd785489cae8b457495916147687746bd5ee077a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008302000080830f4240808080a004994f67dc55b09e814ab7ffc8df3686b4afb2bb53e60eae97ef043fe03fb829c0c0"; - private String PoC7_GENESIS_HEX_HASH = "c9cb614fddd89b3bc6e2f0ed1f8e58e8a0d826612a607a6151be6f39c991a941"; - - private String PoC8_GENESIS_HEX_HASH = "32d9162f861a01bc8274e70b3cdb9d688fd7d8566f2f8c25cf1a882f244081c4"; - - - String block_2 = "f8b5f8b1a0cf4b25b08b39350304fe12a16e4216c01a426f8f3dbf0d392b5b45" - + "8ffb6a399da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a1" - + "42fd40d493479476f5eabe4b342ee56b8ceba6ab2a770c3e2198e7a08a22d58b" - + "a5c65b2bf660a961b075a43f564374d38bfe6cc69823eea574d1d16e80833fe0" - + "04028609184e72a000830f3aab80845387c60380a00000000000000000000000" - + "0000000000000000000000000033172b6669131179c0c0"; - - String block_17 = "f9016df8d3a0aa142573b355c6f2e8306471c869b0d12d0638cea3f57d39991a" - + "b1b03ffa40daa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40" - + "d4934794e559de5527492bcb42ec68d07df0742a98ec3f1ea031c973c20e7a15c319a9ff" - + "9b0aab5bdc121320767fee71fb2b771ce1c93cf812a01b224ec310c2bfb40fd0e6a668ee" - + "7c06a5a4a4bfb99620d0fea8f7b43315dd59833f3130118609184e72a000830f01ec8201" - + "f4845387f36980a00000000000000000000000000000000000000000000000000532c3ae" - + "9b3503f6f895f893f86d018609184e72a0008201f494f625565ac58ec5dadfce1b8f9fb1" - + "dd30db48613b8862cf5246d0c80000801ca05caa26abb350e0521a25b8df229806f3777d" - + "9e262996493846a590c7011697dba07bb7680a256ede4034212b7a1ae6c7caea73190cb0" - + "7dedb91a07b72f34074e76a00cd22d78d556175604407dc6109797f5c8d990d05f1b352e" - + "10c71b3dd74bc70f8201f4c0"; - - String block_32 = "f8f8f8f4a00a312c2b0a8f125c60a3976b6e508e740e095eb59943988d9bbfb8" - + "aa43922e31a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4" - + "934794e559de5527492bcb42ec68d07df0742a98ec3f1ea050188ab86bdf164ac90eb283" - + "5a04a8930aae5393c3a2ef1166fb95028f9456b88080b840000000000000000000000000" - + "000000000000000000000000000000000000000000000000000000000000000000000000" - + "00000000000000000000000000000000833ee248208609184e72a000830eca0080845387" - + "fd2080a00000000000000000000000000000000000000000000000001f52ebb192c4ea97" - + "c0c0"; - - - @After - public void doReset() { - worldManager.reset(); - } - - @Ignore - @Test /* got from go guy */ - public void testGenesisFromRLP() { - // from RLP encoding - byte[] genesisBytes = Hex.decode(PoC7_GENESIS_HEX_RLP_ENCODED); - Block genesisFromRLP = new Block(genesisBytes); - Block genesis = Genesis.getInstance(); - assertEquals(Hex.toHexString(genesis.getHash()), Hex.toHexString(genesisFromRLP.getHash())); - assertEquals(Hex.toHexString(genesis.getParentHash()), Hex.toHexString(genesisFromRLP.getParentHash())); - assertEquals(Hex.toHexString(genesis.getStateRoot()), Hex.toHexString(genesisFromRLP.getStateRoot())); - } - - @Test - public void testGenesisFromNew() { - Block genesis = Genesis.getInstance(); - logger.info(genesis.toString()); - - logger.info("genesis hash: [{}]", Hex.toHexString(genesis.getHash())); - logger.info("genesis rlp: [{}]", Hex.toHexString(genesis.getEncoded())); - assertEquals(PoC8_GENESIS_HEX_HASH, Hex.toHexString(genesis.getHash())); -// assertEquals(PoC7_GENESIS_HEX_RLP_ENCODED, Hex.toHexString(genesis.getEncoded())); - } - - @Test /* block without transactions - block#32 in PoC5 cpp-chain */ - public void testEmptyBlock() { - byte[] payload = Hex.decode(block_32); - Block blockData = new Block(payload); - logger.info(blockData.toString()); - } - - @Test /* block with single balance transfer transaction - block#17 in PoC5 cpp-chain */ - @Ignore - public void testSingleBalanceTransfer() { - byte[] payload = Hex.decode(block_17); // todo: find out an uptodate block wire - Block blockData = new Block(payload); - logger.info(blockData.toString()); - } - - @Test /* large block with 5 transactions -block#1 in PoC5 cpp-chain */ - public void testBlockWithContractCreation() { - byte[] payload = Hex.decode(PoC7_GENESIS_HEX_RLP_ENCODED); - Block block = new Block(payload); - logger.info(block.toString()); - } - - @Test - public void testCalcDifficulty() { - - Blockchain blockchain = worldManager.getBlockchain(); - Block genesis = Genesis.getInstance(); - BigInteger difficulty = new BigInteger(1, genesis.calcDifficulty()); - logger.info("Genesis difficulty: [{}]", difficulty.toString()); - assertEquals(new BigInteger(1, Genesis.DIFFICULTY), difficulty); - - // Storing genesis because the parent needs to be in the DB for calculation. - blockchain.add(genesis); - - Block block1 = new Block(Hex.decode(PoC7_GENESIS_HEX_RLP_ENCODED)); - BigInteger calcDifficulty = new BigInteger(1, block1.calcDifficulty()); - BigInteger actualDifficulty = new BigInteger(1, block1.getDifficulty()); - logger.info("Block#1 actual difficulty: [{}] ", actualDifficulty.toString()); - logger.info("Block#1 calculated difficulty: [{}] ", calcDifficulty.toString()); - assertEquals(actualDifficulty, calcDifficulty); - } - - @Test - public void testCalcGasLimit() { - BlockchainImpl blockchain = (BlockchainImpl) worldManager.getBlockchain(); - Block genesis = Genesis.getInstance(); - long gasLimit = blockchain.calcGasLimit(genesis.getHeader()); - logger.info("Genesis gasLimit: [{}] ", gasLimit); - assertEquals(Genesis.GAS_LIMIT, gasLimit); - - // Test with block - Block block1 = new Block(Hex.decode(PoC7_GENESIS_HEX_RLP_ENCODED)); - long calcGasLimit = blockchain.calcGasLimit(block1.getHeader()); - long actualGasLimit = block1.getGasLimit(); - blockchain.tryToConnect(block1); - logger.info("Block#1 actual gasLimit [{}] ", actualGasLimit); - logger.info("Block#1 calculated gasLimit [{}] ", calcGasLimit); - assertEquals(actualGasLimit, calcGasLimit); - } - - - @Ignore - @Test - public void testScenario1() throws URISyntaxException, IOException { - - BlockchainImpl blockchain = (BlockchainImpl) worldManager.getBlockchain(); - - URL scenario1 = ClassLoader - .getSystemResource("blockload/scenario1.dmp"); - - File file = new File(scenario1.toURI()); - List strData = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8); - - byte[] root = Genesis.getInstance().getStateRoot(); - for (String blockRLP : strData) { - Block block = new Block( - Hex.decode(blockRLP)); - logger.info("sending block.hash: {}", Hex.toHexString(block.getHash())); - blockchain.tryToConnect(block); - root = block.getStateRoot(); - } - - logger.info("asserting root state is: {}", Hex.toHexString(root)); - - //expected root: fb8be59e6420892916e3967c60adfdf48836af040db0072ca411d7aaf5663804 - assertEquals(Hex.toHexString(root), - Hex.toHexString(worldManager.getRepository().getRoot())); - } - - @Ignore - @Test - public void testScenario2() throws URISyntaxException, IOException { - - BlockchainImpl blockchain = (BlockchainImpl) worldManager.getBlockchain(); - - URL scenario1 = ClassLoader - .getSystemResource("blockload/scenario2.dmp"); - - File file = new File(scenario1.toURI()); - List strData = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8); - - byte[] root = Genesis.getInstance().getStateRoot(); - for (String blockRLP : strData) { - Block block = new Block( - Hex.decode(blockRLP)); - logger.info("sending block.hash: {}", Hex.toHexString(block.getHash())); - blockchain.tryToConnect(block); - root = block.getStateRoot(); - } - - logger.info("asserting root state is: {}", Hex.toHexString(root)); - - //expected root: a5e2a18bdbc4ab97775f44852382ff5585b948ccb15b1d69f0abb71e2d8f727d - assertEquals(Hex.toHexString(root), - Hex.toHexString(worldManager.getRepository().getRoot())); - } - - - @Test - @Ignore - public void testUncleValidGenerationGap() { - // TODO - fail("Not yet implemented"); - } - - @Test - @Ignore - public void testUncleInvalidGenerationGap() { - // TODO - fail("Not yet implemented"); - } - - @Test - @Ignore - public void testUncleInvalidParentGenerationGap() { - // TODO - fail("Not yet implemented"); - } -} \ No newline at end of file diff --git a/ethereumj-core/src/test/java/test/ethereum/core/BloomTest.java b/ethereumj-core/src/test/java/test/ethereum/core/BloomTest.java deleted file mode 100644 index 7f417404..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/core/BloomTest.java +++ /dev/null @@ -1,56 +0,0 @@ -package test.ethereum.core; - -import org.ethereum.core.Bloom; -import org.ethereum.crypto.SHA3Helper; - -import org.junit.Test; - -import org.spongycastle.util.encoders.Hex; - -/** - * @author Roman Mandeleil - * @since 20.11.2014 - */ -public class BloomTest { - - - @Test - public void test1() { - - byte[] key = SHA3Helper.sha3(Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826")); - - Bloom bloom = Bloom.create(key); - System.out.println(bloom); - - } - - @Test - public void test2() { - - byte[] key = Hex.decode("0954D2BEF0CA79C1A988AE5FF3072C2AEA90F3967A9596065123F2A15AA37EF3"); - - Bloom bloom = Bloom.create(key); - System.out.println(bloom); - } - - @Test - public void test3() { - - byte[] key = SHA3Helper.sha3(Hex.decode("22341AE42D6DD7384BC8584E50419EA3AC75B83F ")); - - Bloom bloom = Bloom.create(key); - System.out.println(bloom); - } - - - @Test - public void test4() { - - byte[] key = SHA3Helper.sha3(Hex.decode("0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6")); - - Bloom bloom = Bloom.create(key); - System.out.println(bloom); - - } - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/core/ForkTest.java b/ethereumj-core/src/test/java/test/ethereum/core/ForkTest.java deleted file mode 100644 index 42ea9354..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/core/ForkTest.java +++ /dev/null @@ -1,137 +0,0 @@ -package test.ethereum.core; - -import test.ethereum.TestContext; - -import org.ethereum.config.SystemProperties; -import org.ethereum.core.Block; -import org.ethereum.core.BlockchainImpl; -import org.ethereum.core.Chain; -import org.ethereum.manager.WorldManager; - -import org.junit.After; -import org.junit.FixMethodOrder; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.MethodSorters; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.spongycastle.util.encoders.Hex; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.support.AnnotationConfigContextLoader; - -import java.io.File; -import java.io.IOException; - -import java.math.BigInteger; - -import java.net.URISyntaxException; -import java.net.URL; - -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; - -import java.util.List; - -import static junit.framework.TestCase.assertEquals; - -/** - * @author Roman Mandeleil - * @since 09.11.2014 - */ -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(loader = AnnotationConfigContextLoader.class) -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class ForkTest { - - private static final Logger logger = LoggerFactory.getLogger("test"); - - @Configuration - @ComponentScan(basePackages = "org.ethereum") - static class ContextConfiguration extends TestContext { - static { - SystemProperties.CONFIG.setDataBaseDir("test_db/" + ForkTest.class); - } - } - - @Autowired - WorldManager worldManager; - - @After - public void doReset() { - worldManager.reset(); - } - - - @Ignore - @Test - public void fork1() throws URISyntaxException, IOException { - - BlockchainImpl blockchain = (BlockchainImpl) worldManager.getBlockchain(); - - URL scenario1 = ClassLoader - .getSystemResource("fork/scenario1.dmp"); - - File file = new File(scenario1.toURI()); - List strData = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8); - - for (String blockRLP : strData) { - Block block = new Block( - Hex.decode(blockRLP)); - logger.info("sending block.hash: {}", Hex.toHexString(block.getHash())); - blockchain.tryToConnect(block); - } - - List altChains = blockchain.getAltChains(); - List garbage = blockchain.getGarbage(); - - assertEquals(1, altChains.size()); - assertEquals(13, altChains.get(0).getSize()); - assertEquals(20, blockchain.getSize()); - assertEquals(0, garbage.size()); - } - - @Ignore - @Test - public void fork2() throws URISyntaxException, IOException { - - BlockchainImpl blockchain = (BlockchainImpl) worldManager.getBlockchain(); - - - URL scenario2 = ClassLoader - .getSystemResource("fork/scenario2.dmp"); - - File file = new File(scenario2.toURI()); - List strData = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8); - - for (String blockRLP : strData) { - Block block = new Block( - Hex.decode(blockRLP)); - logger.info("sending block.hash: {}", Hex.toHexString(block.getHash())); - blockchain.tryToConnect(block); - } - - List altChains = blockchain.getAltChains(); - List garbage = blockchain.getGarbage(); - - assertEquals(2, altChains.size()); -// assertEquals(13, altChains.get(0).getSize()); - assertEquals(new BigInteger("13238272"), altChains.get(0).getTotalDifficulty()); - assertEquals(new BigInteger("13369344"), altChains.get(1).getTotalDifficulty()); - - assertEquals(new BigInteger("13238272"), blockchain.getTotalDifficulty()); - assertEquals(100, blockchain.getSize()); - assertEquals(0, garbage.size()); - - System.out.println(); - } - - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/core/LogInfoTest.java b/ethereumj-core/src/test/java/test/ethereum/core/LogInfoTest.java deleted file mode 100644 index f8ff7553..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/core/LogInfoTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package test.ethereum.core; - -import org.ethereum.vm.LogInfo; - -import org.junit.Test; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.spongycastle.util.encoders.Hex; - -import static org.junit.Assert.assertEquals; - -/** - * @author Roman Mandeleil - * @since 05.12.2014 - */ -public class LogInfoTest { - - private static final Logger logger = LoggerFactory.getLogger("test"); - - @Test // rlp decode - public void test_1() { - - // LogInfo{address=d5ccd26ba09ce1d85148b5081fa3ed77949417be, topics=[000000000000000000000000459d3a7595df9eba241365f4676803586d7d199c 436f696e73000000000000000000000000000000000000000000000000000000 ], data=} - byte[] rlp = Hex.decode("f85a94d5ccd26ba09ce1d85148b5081fa3ed77949417bef842a0000000000000000000000000459d3a7595df9eba241365f4676803586d7d199ca0436f696e7300000000000000000000000000000000000000000000000000000080"); - LogInfo logInfo = new LogInfo(rlp); - - assertEquals("d5ccd26ba09ce1d85148b5081fa3ed77949417be", - Hex.toHexString(logInfo.getAddress())); - assertEquals("", Hex.toHexString(logInfo.getData())); - - assertEquals("000000000000000000000000459d3a7595df9eba241365f4676803586d7d199c", - logInfo.getTopics().get(0).toString()); - assertEquals("436f696e73000000000000000000000000000000000000000000000000000000", - logInfo.getTopics().get(1).toString()); - - logger.info("{}", logInfo); - } - - @Test // rlp decode - public void test_2() { - - LogInfo log = new LogInfo(Hex.decode("d5ccd26ba09ce1d85148b5081fa3ed77949417be"), null, null); - assertEquals("d794d5ccd26ba09ce1d85148b5081fa3ed77949417bec080", Hex.toHexString(log.getEncoded())); - - logger.info("{}", log); - } - - - @Test // rlp decode - public void test_3() { - - // LogInfo{address=f2b1a404bcb6112a0ff2c4197cb02f3de40018b3, topics=[5a360139cff27713da0fe18a2100048a7ce1b7700c953a82bc3ff011437c8c2a 588d7ddcc06c14843ea68e690dfd4ec91ba09a8ada15c5b7fa6fead9c8befe4b ], data=} - byte[] rlp = Hex.decode("f85a94f2b1a404bcb6112a0ff2c4197cb02f3de40018b3f842a05a360139cff27713da0fe18a2100048a7ce1b7700c953a82bc3ff011437c8c2aa0588d7ddcc06c14843ea68e690dfd4ec91ba09a8ada15c5b7fa6fead9c8befe4b80"); - LogInfo logInfo = new LogInfo(rlp); - - assertEquals("f2b1a404bcb6112a0ff2c4197cb02f3de40018b3", - Hex.toHexString(logInfo.getAddress())); - - assertEquals("00800000000000000010000000000000000000000000002000000000000000000012000000100000000050000020000000000000000000000000000000000000", - logInfo.getBloom().toString()); - - assertEquals("f85a94f2b1a404bcb6112a0ff2c4197cb02f3de40018b3f842a05a360139cff27713da0fe18a2100048a7ce1b7700c953a82bc3ff011437c8c2aa0588d7ddcc06c14843ea68e690dfd4ec91ba09a8ada15c5b7fa6fead9c8befe4b80", - Hex.toHexString(logInfo.getEncoded())); - - logger.info("{}", logInfo); - } -} diff --git a/ethereumj-core/src/test/java/test/ethereum/core/MinerTest.java b/ethereumj-core/src/test/java/test/ethereum/core/MinerTest.java deleted file mode 100644 index f08c50db..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/core/MinerTest.java +++ /dev/null @@ -1,125 +0,0 @@ -package test.ethereum.core; - -import org.ethereum.core.Block; -import org.ethereum.mine.Miner; - -import org.junit.Ignore; -import org.junit.Test; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.spongycastle.util.encoders.Hex; - -import static org.junit.Assert.*; - -public class MinerTest { - - private static final Logger logger = LoggerFactory.getLogger("test"); - - - // Example block#32 from Poc5 chain - rlpEncoded without nonce - private String rlpWithoutNonce = "f894f890a00a312c2b0a8f125c60a3976b6e508e740e095eb59943988d9bbfb8" - + "aa43922e31a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e559de5527492bcb42ec68d07df0742a98ec3f1ea050188ab86bdf164ac90eb2835a04a8930aae5393c3a2ef1166fb95028f9456b880833ee248208609184e72a000830eca0080845387fd2080c0c0"; - - @Test - @Ignore - public void testMine() { - boolean miningTestEnabled = false; - - if (miningTestEnabled) { - Block block = createBlock(null); - assertEquals(rlpWithoutNonce, Hex.toHexString(block.getEncodedWithoutNonce())); - System.out.println("Searching for nonce of following block: \n" + block.toString()); - - Miner miner = new Miner(); - boolean mined = miner.mine(block, block.getDifficulty()); - assertTrue(mined); - boolean valid = block.validateNonce(); - assertTrue(valid); - - // expectedHash is the actual hash from block#32 in PoC5 chain based on nonce below - String expectedHash = "ce7201f6cc5eb1a6f35c7dda8acda111647a0f8a5bf0518e46579b03e29fe14b"; - assertEquals(expectedHash, Hex.toHexString(block.getHash())); - - // expectedNonce is the actual nonce from block#32 in Poc5 chain - String expectedNonce = "0000000000000000000000000000000000000000000000001f52ebb192c4ea97"; // from Poc5 chain - // Actual is "000000000000000000000000000000000000000000000000000000000098cc15" - // but that might also be a valid nonce in compliance with PoW(H!n, n) < (2^256 / difficulty) - assertEquals(expectedNonce, Hex.toHexString(block.getNonce())); - } - } - - - @Test - @Ignore - public void testMine2() { - boolean miningTestEnabled = true; - - if (miningTestEnabled) { - Block block = createBlock(null); - - logger.info("Minning on block: [{}] ", block.getNumber()); -// assertEquals(rlpWithoutNonce, Hex.toHexString(block.getEncodedWithoutNonce())); -// System.out.println("Searching for nonce of following block: \n" + block.toString()); - - Miner miner = new Miner(); - boolean mined = miner.mine(block, block.getDifficulty()); - assertTrue(mined); - boolean valid = block.validateNonce(); - assertTrue(valid); - logger.info("found nonce: [{}]", Hex.toHexString(block.getNonce())); - - while (true) { - - Block newBlock = createBlock(block); - mined = miner.mine(newBlock, newBlock.getDifficulty()); - assertTrue(mined); - valid = newBlock.validateNonce(); - assertTrue(valid); - block = newBlock; - logger.info("found nonce: [{}]", Hex.toHexString(newBlock.getNonce())); - logger.info("block.number: [{}], added to the chain", newBlock.getNumber()); - } - } - } - - - /** - * Produces a block equal to block#32 on PoC5 testnet (protocol 19) - * Where nonce was '0000000000000000000000000000000000000000000000001f52ebb192c4ea97' - * and resulting hash 'ce7201f6cc5eb1a6f35c7dda8acda111647a0f8a5bf0518e46579b03e29fe14b' - */ - private Block createBlock(Block lastBlock) { - - if (lastBlock == null) { - - byte[] parentHash = Hex.decode("0a312c2b0a8f125c60a3976b6e508e740e095eb59943988d9bbfb8aa43922e31"); - byte[] unclesHash = Hex.decode("1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347"); - byte[] coinbase = Hex.decode("e559de5527492bcb42ec68d07df0742a98ec3f1e"); - byte[] difficulty = Hex.decode("02eb75"); - byte[] nonce = null; - long number = 32; - long minGasPrice = 10000000000000L; - long gasLimit = 969216; - long gasUsed = 0; - long timestamp = 1401421088; - byte[] stateRoot = Hex.decode("50188ab86bdf164ac90eb2835a04a8930aae5393c3a2ef1166fb95028f9456b8"); - - Block newBlock = new Block(parentHash, unclesHash, coinbase, null, - difficulty, number, gasLimit, gasUsed, timestamp, - null, nonce, null, null); - // Setting stateRoot manually, because don't have state available. - return newBlock; - } else { - - Block newBlock = new Block(lastBlock.getHash(), lastBlock.getUnclesHash(), lastBlock.getCoinbase(), null, - lastBlock.getDifficulty(), lastBlock.getNumber() + 1, - lastBlock.getGasLimit(), lastBlock.getGasUsed(), lastBlock.getTimestamp(), - null, null, null, null); - - return newBlock; - } - - } -} diff --git a/ethereumj-core/src/test/java/test/ethereum/core/StateTest.java b/ethereumj-core/src/test/java/test/ethereum/core/StateTest.java deleted file mode 100644 index 18bae83e..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/core/StateTest.java +++ /dev/null @@ -1,127 +0,0 @@ -package test.ethereum.core; - -import org.ethereum.core.PremineRaw; -import test.ethereum.db.MockDB; - -import org.ethereum.core.AccountState; -import org.ethereum.core.Genesis; -import org.ethereum.crypto.HashUtil; -import org.ethereum.trie.Trie; -import org.ethereum.trie.TrieImpl; - -import org.junit.Test; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.spongycastle.util.encoders.Hex; - -import java.math.BigInteger; - -import static org.junit.Assert.assertEquals; - - -public class StateTest { - - private static final String GENESIS_STATE_ROOT = "7e204dc9cfb7acdf062ff0b8052f7fcb0b7e6593754773967932ce458d134af3"; - - private static final Logger logger = LoggerFactory.getLogger("test"); - - - @Test - public void testGenesisAccounts() { - Trie trie = generateGenesisState(); - assertEquals(GENESIS_STATE_ROOT, Hex.toHexString(trie.getRootHash())); - } - - - @Test // calc state after applying first tx on genesis - public void test2() { - - // explanation: - // 0) create genesis - // 1) apply cost of tx to cd2a3d9f938e13cd947ec05abc7fe734df8dd826 - // 2) create AccountState for 77045e71a7a2c50903d88e564cd72fab11e82051 - // 3) minner gets the gas + coinbase ==> 6260000000000000 + 1500000000000000000 - // 4) calc the root - - Trie trie = generateGenesisState(); - String expected = "c12b4d771fbcc0d56ec106f8d465d24b9d4c36d60275bbafa7d69694d6708660"; - - // Get and update sender in world state - byte[] cowAddress = Hex.decode("cd2a3d9f938e13cd947ec05abc7fe734df8dd826"); - byte[] rlpEncodedState = trie.get(cowAddress); - AccountState account_1 = new AccountState(rlpEncodedState); - account_1.addToBalance(new BigInteger("-6260000000001000")); - account_1.incrementNonce(); - trie.update(cowAddress, account_1.getEncoded()); - - // Add contract to world state - byte[] codeData = Hex.decode("61778e600054"); - AccountState account_2 = new AccountState(BigInteger.ZERO, BigInteger.valueOf(1000)); - account_2.setCodeHash(HashUtil.sha3(codeData)); - byte[] contractAddress = Hex.decode("77045e71a7a2c50903d88e564cd72fab11e82051"); // generated based on sender + nonce - trie.update(contractAddress, account_2.getEncoded()); - -// this is saved in the db -// trie.update(HashUtil.sha3(codeData), codeData); - - // Update miner in world state - byte[] minerAddress = Hex.decode("4c5f4d519dff3c16f0d54b6866e256fbbbc1a600"); - AccountState account_3 = new AccountState(BigInteger.ZERO, new BigInteger("1506260000000000000")); - trie.update(minerAddress, account_3.getEncoded()); - - assertEquals(expected, Hex.toHexString(trie.getRootHash())); - - - /* *** GROSS DATA *** - - BlockData [ - hash=22cf863ab836a6f5c29389d2e77f4792a3b3b52908c98ed14b1cbe91491a3e36 - parentHash=77ef4fdaf389dca53236bcf7f72698e154eab2828f86fbc4fc6cd9225d285c89 - unclesHash=1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347 - coinbase=4c5f4d519dff3c16f0d54b6866e256fbbbc1a600 - stateHash=69c21ff84a5af0b53b11c61110a16d6ad43dad37b3eb29ae8e88c936eb06456a - txTrieHash=a77691cf47bec9021d3f027fc8ef2d51b758b600a79967154354b8e37108896f - difficulty=3ff000 - number=1 - minGasPrice=10000000000000 - gasLimit=999023 - gasUsed=626 - timestamp=1401979976 (2014.06.05 15:52:56) - extraData=null - nonce=0000000000000000000000000000000000000000000000005d439960040e4505 - - TransactionReceipt[ - TransactionData [ hash=1ee6fa3149a5e9c09b54009eb6e108aaa7ecd79483d57eedcf2dff93a1505588 nonce=null, - gasPrice=09184e72a000, gas=03e8, receiveAddress=0000000000000000000000000000000000000000, value=03e8, - data=60016000546006601160003960066000f261778e600054, signatureV=27, - signatureR=2b379f22050e3554c3fa5423d9040bb28dcc7f905300db4e67c03bcf9b27003c, - signatureS=59f47793e050974e6b5fca2848b19925637b883a012693b54d712f1c4f74def5 - ] - , postTxState=7fa5bd00f6e03b5a5718560f1e25179b227167585a3c3da06a48f554365fb527 - , cumulativeGas=0272] - ] - - +++ 4c5f4d519dff3c16f0d54b6866e256fbbbc1a600: - +++ 77045e71a7a2c50903d88e564cd72fab11e82051: $[61,77,8e,60,0,54] ([]) - * cd2a3d9f938e13cd947ec05abc7fe734df8dd826: #1 1606938044258990275541962092341162602522202987522792835300376 (-6260000000001000) - */ - - assertEquals(expected, Hex.toHexString(trie.getRootHash())); - } - - private Trie generateGenesisState() { - - Trie trie = new TrieImpl(new MockDB()); - - for (PremineRaw raw : Genesis.getPremine()) { - AccountState acctState = new AccountState(BigInteger.ZERO, - raw.getValue().multiply(raw.getDenomination().value())); - trie.update(raw.getAddr(), acctState.getEncoded()); - } - - return trie; - } -} - diff --git a/ethereumj-core/src/test/java/test/ethereum/core/TransactionReceiptTest.java b/ethereumj-core/src/test/java/test/ethereum/core/TransactionReceiptTest.java deleted file mode 100644 index 6f257461..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/core/TransactionReceiptTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package test.ethereum.core; - -import org.ethereum.core.TransactionReceipt; - -import org.junit.Test; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.spongycastle.util.encoders.Hex; - -import static org.junit.Assert.assertEquals; - -/** - * @author Roman Mandeleil - * @since 05.12.2014 - */ -public class TransactionReceiptTest { - - private static final Logger logger = LoggerFactory.getLogger("test"); - - - @Test // rlp decode - public void test_1() { - - byte[] rlp = Hex.decode("f8c4a0966265cc49fa1f10f0445f035258d116563931022a3570a640af5d73a214a8da822b6fb84000000010000000010000000000008000000000000000000000000000000000000000000000000000000000020000000000000014000000000400000000000440f85cf85a94d5ccd26ba09ce1d85148b5081fa3ed77949417bef842a0000000000000000000000000459d3a7595df9eba241365f4676803586d7d199ca0436f696e7300000000000000000000000000000000000000000000000000000080"); - TransactionReceipt txReceipt = new TransactionReceipt(rlp); - - assertEquals(1, txReceipt.getLogInfoList().size()); - - assertEquals("966265cc49fa1f10f0445f035258d116563931022a3570a640af5d73a214a8da", - Hex.toHexString(txReceipt.getPostTxState())); - - assertEquals("2b6f", - Hex.toHexString(txReceipt.getCumulativeGas())); - - assertEquals("00000010000000010000000000008000000000000000000000000000000000000000000000000000000000020000000000000014000000000400000000000440", - Hex.toHexString(txReceipt.getBloomFilter().getData())); - - logger.info("{}", txReceipt); - } - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/core/TransactionTest.java b/ethereumj-core/src/test/java/test/ethereum/core/TransactionTest.java deleted file mode 100644 index f8af3d62..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/core/TransactionTest.java +++ /dev/null @@ -1,307 +0,0 @@ -package test.ethereum.core; - -import org.ethereum.core.Bloom; -import org.ethereum.core.Transaction; -import org.ethereum.core.TransactionReceipt; -import org.ethereum.crypto.ECKey; -import org.ethereum.crypto.ECKey.MissingPrivateKeyException; -import org.ethereum.crypto.HashUtil; -import org.ethereum.vm.LogInfo; - -import org.junit.Ignore; -import org.junit.Test; - -import org.spongycastle.util.BigIntegers; -import org.spongycastle.util.encoders.Hex; - -import java.io.IOException; - -import java.math.BigInteger; - -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.security.NoSuchProviderException; - -import java.util.ArrayList; -import java.util.List; - -import static org.junit.Assert.*; - -@Ignore -public class TransactionTest { - - - @Test /* sign transaction https://tools.ietf.org/html/rfc6979 */ - public void test1() throws NoSuchProviderException, NoSuchAlgorithmException, InvalidKeyException, IOException { - - //python taken exact data - String txRLPRawData = "a9e880872386f26fc1000085e8d4a510008203e89413978aee95f38490e9769c39b2773ed763d9cd5f80"; - // String txRLPRawData = "f82804881bc16d674ec8000094cd2a3d9f938e13cd947ec05abc7fe734df8dd8268609184e72a0006480"; - - byte[] cowPrivKey = Hex.decode("c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4"); - ECKey key = ECKey.fromPrivate(cowPrivKey); - - byte[] data = Hex.decode(txRLPRawData); - - // step 1: serialize + RLP encode - // step 2: hash = sha3(step1) - byte[] txHash = HashUtil.sha3(data); - - String signature = key.doSign(txHash).toBase64(); - System.out.println(signature); - } - - @Test /* achieve public key of the sender */ - public void test2() throws Exception { - - // cat --> 79b08ad8787060333663d19704909ee7b1903e58 - // cow --> cd2a3d9f938e13cd947ec05abc7fe734df8dd826 - - BigInteger value = new BigInteger("1000000000000000000000"); - - byte[] privKey = HashUtil.sha3("cat".getBytes()); - ECKey ecKey = ECKey.fromPrivate(privKey); - - byte[] senderPrivKey = HashUtil.sha3("cow".getBytes()); - - byte[] gasPrice = Hex.decode("09184e72a000"); - byte[] gas = Hex.decode("4255"); - - // Tn (nonce); Tp(pgas); Tg(gaslimi); Tt(value); Tv(value); Ti(sender); Tw; Tr; Ts - Transaction tx = new Transaction(null, gasPrice, gas, ecKey.getAddress(), - value.toByteArray(), - null); - - tx.sign(senderPrivKey); - - System.out.println("v\t\t\t: " + Hex.toHexString(new byte[]{tx.getSignature().v})); - System.out.println("r\t\t\t: " + Hex.toHexString(BigIntegers.asUnsignedByteArray(tx.getSignature().r))); - System.out.println("s\t\t\t: " + Hex.toHexString(BigIntegers.asUnsignedByteArray(tx.getSignature().s))); - - System.out.println("RLP encoded tx\t\t: " + Hex.toHexString(tx.getEncoded())); - - // retrieve the signer/sender of the transaction - ECKey key = ECKey.signatureToKey(tx.getHash(), tx.getSignature().toBase64()); - - System.out.println("Tx unsigned RLP\t\t: " + Hex.toHexString(tx.getEncodedRaw())); - System.out.println("Tx signed RLP\t\t: " + Hex.toHexString(tx.getEncoded())); - - System.out.println("Signature public key\t: " + Hex.toHexString(key.getPubKey())); - System.out.println("Sender is\t\t: " + Hex.toHexString(key.getAddress())); - - assertEquals("cd2a3d9f938e13cd947ec05abc7fe734df8dd826", - Hex.toHexString(key.getAddress())); - - System.out.println(tx.toString()); - } - - - @Test /* achieve public key of the sender nonce: 01 */ - public void test3() throws Exception { - - // cat --> 79b08ad8787060333663d19704909ee7b1903e58 - // cow --> cd2a3d9f938e13cd947ec05abc7fe734df8dd826 - - ECKey ecKey = ECKey.fromPrivate(HashUtil.sha3("cat".getBytes())); - byte[] senderPrivKey = HashUtil.sha3("cow".getBytes()); - - byte[] nonce = {0x01}; - byte[] gasPrice = Hex.decode("09184e72a000"); - byte[] gasLimit = Hex.decode("4255"); - BigInteger value = new BigInteger("1000000000000000000000000"); - - Transaction tx = new Transaction(nonce, gasPrice, gasLimit, - ecKey.getAddress(), value.toByteArray(), null); - - tx.sign(senderPrivKey); - - System.out.println("v\t\t\t: " + Hex.toHexString(new byte[]{tx.getSignature().v})); - System.out.println("r\t\t\t: " + Hex.toHexString(BigIntegers.asUnsignedByteArray(tx.getSignature().r))); - System.out.println("s\t\t\t: " + Hex.toHexString(BigIntegers.asUnsignedByteArray(tx.getSignature().s))); - - System.out.println("RLP encoded tx\t\t: " + Hex.toHexString(tx.getEncoded())); - - // retrieve the signer/sender of the transaction - ECKey key = ECKey.signatureToKey(tx.getHash(), tx.getSignature().toBase64()); - - System.out.println("Tx unsigned RLP\t\t: " + Hex.toHexString(tx.getEncodedRaw())); - System.out.println("Tx signed RLP\t\t: " + Hex.toHexString(tx.getEncoded())); - - System.out.println("Signature public key\t: " + Hex.toHexString(key.getPubKey())); - System.out.println("Sender is\t\t: " + Hex.toHexString(key.getAddress())); - - assertEquals("cd2a3d9f938e13cd947ec05abc7fe734df8dd826", - Hex.toHexString(key.getAddress())); - } - - // Testdata from: https://github.com/ethereum/tests/blob/master/txtest.json - String RLP_ENCODED_RAW_TX = "e88085e8d4a510008227109413978aee95f38490e9769c39b2773ed763d9cd5f872386f26fc1000080"; - String RLP_ENCODED_UNSIGNED_TX = "eb8085e8d4a510008227109413978aee95f38490e9769c39b2773ed763d9cd5f872386f26fc1000080808080"; - String HASH_TX = "328ea6d24659dec48adea1aced9a136e5ebdf40258db30d1b1d97ed2b74be34e"; - String RLP_ENCODED_SIGNED_TX = "f86b8085e8d4a510008227109413978aee95f38490e9769c39b2773ed763d9cd5f872386f26fc10000801ba0eab47c1a49bf2fe5d40e01d313900e19ca485867d462fe06e139e3a536c6d4f4a014a569d327dcda4b29f74f93c0e9729d2f49ad726e703f9cd90dbb0fbf6649f1"; - String KEY = "c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4"; - byte[] testNonce = Hex.decode(""); - byte[] testGasPrice = BigIntegers.asUnsignedByteArray(BigInteger.valueOf(1000000000000L)); - byte[] testGasLimit = BigIntegers.asUnsignedByteArray(BigInteger.valueOf(10000)); - byte[] testReceiveAddress = Hex.decode("13978aee95f38490e9769c39b2773ed763d9cd5f"); - byte[] testValue = BigIntegers.asUnsignedByteArray(BigInteger.valueOf(10000000000000000L)); - byte[] testData = Hex.decode(""); - byte[] testInit = Hex.decode(""); - - @Test - public void testTransactionFromSignedRLP() throws Exception { - Transaction txSigned = new Transaction(Hex.decode(RLP_ENCODED_SIGNED_TX)); - - assertEquals(HASH_TX, Hex.toHexString(txSigned.getHash())); - assertEquals(RLP_ENCODED_SIGNED_TX, Hex.toHexString(txSigned.getEncoded())); - - assertEquals(BigInteger.ZERO, new BigInteger(1, txSigned.getNonce())); - assertEquals(new BigInteger(1, testGasPrice), new BigInteger(1, txSigned.getGasPrice())); - assertEquals(new BigInteger(1, testGasLimit), new BigInteger(1, txSigned.getGasLimit())); - assertEquals(Hex.toHexString(testReceiveAddress), Hex.toHexString(txSigned.getReceiveAddress())); - assertEquals(new BigInteger(1, testValue), new BigInteger(1, txSigned.getValue())); - assertNull(txSigned.getData()); - assertEquals(27, txSigned.getSignature().v); - assertEquals("eab47c1a49bf2fe5d40e01d313900e19ca485867d462fe06e139e3a536c6d4f4", Hex.toHexString(BigIntegers.asUnsignedByteArray(txSigned.getSignature().r))); - assertEquals("14a569d327dcda4b29f74f93c0e9729d2f49ad726e703f9cd90dbb0fbf6649f1", Hex.toHexString(BigIntegers.asUnsignedByteArray(txSigned.getSignature().s))); - } - - @Test - public void testTransactionFromUnsignedRLP() throws Exception { - Transaction txUnsigned = new Transaction(Hex.decode(RLP_ENCODED_UNSIGNED_TX)); - - assertEquals(HASH_TX, Hex.toHexString(txUnsigned.getHash())); - assertEquals(RLP_ENCODED_UNSIGNED_TX, Hex.toHexString(txUnsigned.getEncoded())); - txUnsigned.sign(Hex.decode(KEY)); - assertEquals(RLP_ENCODED_SIGNED_TX, Hex.toHexString(txUnsigned.getEncoded())); - - assertEquals(BigInteger.ZERO, new BigInteger(1, txUnsigned.getNonce())); - assertEquals(new BigInteger(1, testGasPrice), new BigInteger(1, txUnsigned.getGasPrice())); - assertEquals(new BigInteger(1, testGasLimit), new BigInteger(1, txUnsigned.getGasLimit())); - assertEquals(Hex.toHexString(testReceiveAddress), Hex.toHexString(txUnsigned.getReceiveAddress())); - assertEquals(new BigInteger(1, testValue), new BigInteger(1, txUnsigned.getValue())); - assertNull(txUnsigned.getData()); - assertEquals(27, txUnsigned.getSignature().v); - assertEquals("eab47c1a49bf2fe5d40e01d313900e19ca485867d462fe06e139e3a536c6d4f4", Hex.toHexString(BigIntegers.asUnsignedByteArray(txUnsigned.getSignature().r))); - assertEquals("14a569d327dcda4b29f74f93c0e9729d2f49ad726e703f9cd90dbb0fbf6649f1", Hex.toHexString(BigIntegers.asUnsignedByteArray(txUnsigned.getSignature().s))); - } - - @Test - public void testTransactionFromNew1() throws MissingPrivateKeyException { - Transaction txNew = new Transaction(testNonce, testGasPrice, testGasLimit, testReceiveAddress, testValue, testData); - - assertEquals("", Hex.toHexString(txNew.getNonce())); - assertEquals(new BigInteger(1, testGasPrice), new BigInteger(1, txNew.getGasPrice())); - assertEquals(new BigInteger(1, testGasLimit), new BigInteger(1, txNew.getGasLimit())); - assertEquals(Hex.toHexString(testReceiveAddress), Hex.toHexString(txNew.getReceiveAddress())); - assertEquals(new BigInteger(1, testValue), new BigInteger(1, txNew.getValue())); - assertEquals("", Hex.toHexString(txNew.getData())); - assertNull(txNew.getSignature()); - - assertEquals(RLP_ENCODED_RAW_TX, Hex.toHexString(txNew.getEncodedRaw())); - assertEquals(HASH_TX, Hex.toHexString(txNew.getHash())); - assertEquals(RLP_ENCODED_UNSIGNED_TX, Hex.toHexString(txNew.getEncoded())); - txNew.sign(Hex.decode(KEY)); - assertEquals(RLP_ENCODED_SIGNED_TX, Hex.toHexString(txNew.getEncoded())); - - assertEquals(27, txNew.getSignature().v); - assertEquals("eab47c1a49bf2fe5d40e01d313900e19ca485867d462fe06e139e3a536c6d4f4", Hex.toHexString(BigIntegers.asUnsignedByteArray(txNew.getSignature().r))); - assertEquals("14a569d327dcda4b29f74f93c0e9729d2f49ad726e703f9cd90dbb0fbf6649f1", Hex.toHexString(BigIntegers.asUnsignedByteArray(txNew.getSignature().s))); - } - - @Test - public void testTransactionFromNew2() throws MissingPrivateKeyException { - byte[] privKeyBytes = Hex.decode("c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4"); - - String RLP_TX_UNSIGNED = "eb8085e8d4a510008227109413978aee95f38490e9769c39b2773ed763d9cd5f872386f26fc1000080808080"; - String RLP_TX_SIGNED = "f86b8085e8d4a510008227109413978aee95f38490e9769c39b2773ed763d9cd5f872386f26fc10000801ba0eab47c1a49bf2fe5d40e01d313900e19ca485867d462fe06e139e3a536c6d4f4a014a569d327dcda4b29f74f93c0e9729d2f49ad726e703f9cd90dbb0fbf6649f1"; - String HASH_TX_UNSIGNED = "328ea6d24659dec48adea1aced9a136e5ebdf40258db30d1b1d97ed2b74be34e"; - - byte[] nonce = BigIntegers.asUnsignedByteArray(BigInteger.ZERO); - byte[] gasPrice = Hex.decode("e8d4a51000"); // 1000000000000 - byte[] gas = Hex.decode("2710"); // 10000 - byte[] recieveAddress = Hex.decode("13978aee95f38490e9769c39b2773ed763d9cd5f"); - byte[] value = Hex.decode("2386f26fc10000"); //10000000000000000" - byte[] data = new byte[0]; - - Transaction tx = new Transaction(nonce, gasPrice, gas, recieveAddress, value, data); - - // Testing unsigned - String encodedUnsigned = Hex.toHexString(tx.getEncoded()); - assertEquals(RLP_TX_UNSIGNED, encodedUnsigned); - assertEquals(HASH_TX_UNSIGNED, Hex.toHexString(tx.getHash())); - - // Testing signed - tx.sign(privKeyBytes); - String encodedSigned = Hex.toHexString(tx.getEncoded()); - assertEquals(RLP_TX_SIGNED, encodedSigned); - assertEquals(HASH_TX_UNSIGNED, Hex.toHexString(tx.getHash())); - } - - @Test - public void testTransactionCreateContract() { - -// String rlp = -// "f89f808609184e72a0008203e8808203e8b84b4560005444602054600f60056002600a02010b0d630000001d596002602054630000003b5860066000530860056006600202010a0d6300000036596004604054630000003b5860056060541ca0ddc901d83110ea50bc40803f42083afea1bbd420548f6392a679af8e24b21345a06620b3b512bea5f0a272703e8d6933177c23afc79516fd0ca4a204aa6e34c7e9"; - - byte[] senderPrivKey = HashUtil.sha3("cow".getBytes()); - - byte[] nonce = BigIntegers.asUnsignedByteArray(BigInteger.ZERO); - byte[] gasPrice = Hex.decode("09184e72a000"); // 10000000000000 - byte[] gas = Hex.decode("03e8"); // 1000 - byte[] recieveAddress = null; - byte[] endowment = Hex.decode("03e8"); //10000000000000000" - byte[] init = Hex.decode - ("4560005444602054600f60056002600a02010b0d630000001d596002602054630000003b5860066000530860056006600202010a0d6300000036596004604054630000003b586005606054"); - - - Transaction tx1 = new Transaction(nonce, gasPrice, gas, - recieveAddress, endowment, init); - tx1.sign(senderPrivKey); - - byte[] payload = tx1.getEncoded(); - - - System.out.println(Hex.toHexString(payload)); - Transaction tx2 = new Transaction(payload); -// tx2.getSender(); - - String plainTx1 = Hex.toHexString(tx1.getEncodedRaw()); - String plainTx2 = Hex.toHexString(tx2.getEncodedRaw()); - -// Transaction tx = new Transaction(Hex.decode(rlp)); - - System.out.println("tx1.hash: " + Hex.toHexString(tx1.getHash())); - System.out.println("tx2.hash: " + Hex.toHexString(tx2.getHash())); - System.out.println(); - System.out.println("plainTx1: " + plainTx1); - System.out.println("plainTx2: " + plainTx2); - - System.out.println(Hex.toHexString(tx2.getSender())); - } - - - @Test - public void encodeReceiptTest() { - - String data = "f90244a0f5ff3fbd159773816a7c707a9b8cb6bb778b934a8f6466c7830ed970498f4b688301e848b902000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dbda94cd2a3d9f938e13cd947ec05abc7fe734df8dd826c083a1a1a1"; - - byte[] stateRoot = Hex.decode("f5ff3fbd159773816a7c707a9b8cb6bb778b934a8f6466c7830ed970498f4b68"); - byte[] gasUsed = Hex.decode("01E848"); - Bloom bloom = new Bloom(Hex.decode("0000000000000000800000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")); - - LogInfo logInfo1 = new LogInfo( - Hex.decode("cd2a3d9f938e13cd947ec05abc7fe734df8dd826"), - null, - Hex.decode("a1a1a1") - ); - - List logs = new ArrayList<>(); - logs.add(logInfo1); - - TransactionReceipt receipt = new TransactionReceipt(stateRoot, gasUsed, bloom, logs); - - assertEquals(data, - Hex.toHexString(receipt.getEncoded())); - } -} diff --git a/ethereumj-core/src/test/java/test/ethereum/core/WalletTest.java b/ethereumj-core/src/test/java/test/ethereum/core/WalletTest.java deleted file mode 100644 index 383998f9..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/core/WalletTest.java +++ /dev/null @@ -1,151 +0,0 @@ -package test.ethereum.core; - -import test.ethereum.TestContext; - -import org.ethereum.config.SystemProperties; -import org.ethereum.core.Transaction; -import org.ethereum.core.Wallet; -import org.ethereum.crypto.ECKey; -import org.ethereum.crypto.HashUtil; -import org.ethereum.facade.Repository; -import org.ethereum.manager.WorldManager; - -import org.junit.After; -import org.junit.Assert; -import org.junit.FixMethodOrder; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.MethodSorters; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.spongycastle.util.encoders.Hex; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.support.AnnotationConfigContextLoader; - -import org.xml.sax.SAXException; - -import java.io.IOException; - -import java.math.BigInteger; - -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.TransformerException; - -/** - * @author Roman Mandeleil - * @since 17.05.14 - */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(loader = AnnotationConfigContextLoader.class) -public class WalletTest { - - private static final Logger logger = LoggerFactory.getLogger("test"); - - @Configuration - @ComponentScan(basePackages = "org.ethereum") - static class ContextConfiguration extends TestContext { - static { - SystemProperties.CONFIG.setDataBaseDir("test_db/" + WalletTest.class); - } - } - - @Autowired - WorldManager worldManager; - - @After - public void doReset() { - worldManager.reset(); - } - - - @Ignore - @Test // Testing account for simple balance set - public void accountTest_1() { - - Repository repository = worldManager.getRepository(); - - ECKey cowKey = ECKey.fromPrivate(HashUtil.sha3("cow".getBytes())); - repository.createAccount(cowKey.getAddress()); - repository.addBalance(cowKey.getAddress(), BigInteger.TEN); - - Wallet wallet = new Wallet(); - wallet.setWorldManager(worldManager); - - wallet.importKey(cowKey.getPrivKeyBytes()); - - BigInteger walletBalance = wallet.getBalance(cowKey.getAddress()); - Assert.assertEquals(BigInteger.TEN, walletBalance); - - } - - - @Ignore - @Test // test account balance with pending "unblocked" transaction - public void accountTest_2() { - - Repository repository = worldManager.getRepository(); - - ECKey cowKey = ECKey.fromPrivate(HashUtil.sha3("cow".getBytes())); - repository.createAccount(cowKey.getAddress()); - repository.addBalance(cowKey.getAddress(), BigInteger.TEN); - - Wallet wallet = new Wallet(); - wallet.setWorldManager(worldManager); - - wallet.importKey(cowKey.getPrivKeyBytes()); - - Transaction tx = new Transaction( - new byte[]{}, - Hex.decode("09184E72A000"), - Hex.decode("03E8"), - cowKey.getAddress(), - Hex.decode("0A"), - new byte[]{} - ); - - ECKey catKey = ECKey.fromPrivate(HashUtil.sha3("cat".getBytes())); - tx.sign(catKey.getPrivKeyBytes()); - - wallet.applyTransaction(tx); - - BigInteger walletBalance = wallet.getBalance(cowKey.getAddress()); - Assert.assertEquals(BigInteger.valueOf(20), walletBalance); - } - - - @Ignore - @Test - public void testSave1() throws TransformerException, ParserConfigurationException { - - Wallet wallet = new Wallet(); - wallet.setWorldManager(worldManager); - - ECKey cowKey = ECKey.fromPrivate(HashUtil.sha3("cow".getBytes())); - ECKey catKey = ECKey.fromPrivate(HashUtil.sha3("cat".getBytes())); - - wallet.importKey(cowKey.getPrivKeyBytes()); - wallet.importKey(catKey.getPrivKeyBytes()); - - wallet.setHigh(4354); - - wallet.save(); - } - - @Test - @Ignore - public void testLoad1() throws TransformerException, - ParserConfigurationException, IOException, SAXException { - Wallet wallet = new Wallet(); - wallet.load(); - } - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/crypto/CryptoTest.java b/ethereumj-core/src/test/java/test/ethereum/crypto/CryptoTest.java deleted file mode 100644 index c6d8871d..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/crypto/CryptoTest.java +++ /dev/null @@ -1,105 +0,0 @@ -package test.ethereum.crypto; - -import org.ethereum.crypto.ECKey; -import org.ethereum.crypto.HashUtil; -import org.ethereum.util.Utils; - -import org.junit.Test; - -import org.spongycastle.util.encoders.Hex; - -import java.math.BigInteger; - -import static org.junit.Assert.assertEquals; - -public class CryptoTest { - - @Test - public void test1() { - - byte[] result = HashUtil.sha3("horse".getBytes()); - - assertEquals("c87f65ff3f271bf5dc8643484f66b200109caffe4bf98c4cb393dc35740b28c0", - Hex.toHexString(result)); - - result = HashUtil.sha3("cow".getBytes()); - - assertEquals("c85ef7d79691fe79573b1a7064c19c1a9819ebdbd1faaab1a8ec92344438aaf4", - Hex.toHexString(result)); - } - - @Test - public void test3() { - BigInteger privKey = new BigInteger("cd244b3015703ddf545595da06ada5516628c5feadbf49dc66049c4b370cc5d8", 16); - byte[] addr = ECKey.fromPrivate(privKey).getAddress(); - assertEquals("89b44e4d3c81ede05d0f5de8d1a68f754d73d997", Hex.toHexString(addr)); - } - - - @Test - public void test4() { - byte[] cowBytes = HashUtil.sha3("cow".getBytes()); - byte[] addr = ECKey.fromPrivate(cowBytes).getAddress(); - assertEquals("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826", Hex.toHexString(addr).toUpperCase()); - } - - @Test - public void test5() { - byte[] horseBytes = HashUtil.sha3("horse".getBytes()); - byte[] addr = ECKey.fromPrivate(horseBytes).getAddress(); - assertEquals("13978AEE95F38490E9769C39B2773ED763D9CD5F", Hex.toHexString(addr).toUpperCase()); - } - - @Test /* performance test */ - public void test6() { - - long firstTime = System.currentTimeMillis(); - System.out.println(firstTime); - for (int i = 0; i < 1000; ++i) { - - byte[] horseBytes = HashUtil.sha3("horse".getBytes()); - byte[] addr = ECKey.fromPrivate(horseBytes).getAddress(); - assertEquals("13978AEE95F38490E9769C39B2773ED763D9CD5F", Hex.toHexString(addr).toUpperCase()); - } - long secondTime = System.currentTimeMillis(); - System.out.println(secondTime); - System.out.println(secondTime - firstTime + " millisec"); - // 1) result: ~52 address calculation every second - } - - @Test /* real tx hash calc */ - public void test7() { - - String txRaw = "F89D80809400000000000000000000000000000000000000008609184E72A000822710B3606956330C0D630000003359366000530A0D630000003359602060005301356000533557604060005301600054630000000C5884336069571CA07F6EB94576346488C6253197BDE6A7E59DDC36F2773672C849402AA9C402C3C4A06D254E662BF7450DD8D835160CBB053463FED0B53F2CDD7F3EA8731919C8E8CC"; - byte[] txHashB = HashUtil.sha3(Hex.decode(txRaw)); - String txHash = Hex.toHexString(txHashB); - assertEquals("4b7d9670a92bf120d5b43400543b69304a14d767cf836a7f6abff4edde092895", txHash); - } - - @Test /* real block hash calc */ - public void test8() { - - String blockRaw = "F885F8818080A01DCC4DE8DEC75D7AAB85B567B6CCD41AD312451B948A7413F0A142FD40D49347940000000000000000000000000000000000000000A0BCDDD284BF396739C224DBA0411566C891C32115FEB998A3E2B4E61F3F35582AA01DCC4DE8DEC75D7AAB85B567B6CCD41AD312451B948A7413F0A142FD40D4934783800000808080C0C0"; - - byte[] blockHashB = HashUtil.sha3(Hex.decode(blockRaw)); - String blockHash = Hex.toHexString(blockHashB); - System.out.println(blockHash); - } - - @Test - public void test9() { - // TODO: https://tools.ietf.org/html/rfc6979#section-2.2 - // TODO: https://github.com/bcgit/bc-java/blob/master/core/src/main/java/org/bouncycastle/crypto/signers/ECDSASigner.java - - System.out.println(new BigInteger(Hex.decode("3913517ebd3c0c65000000"))); - System.out.println(Utils.getValueShortString(new BigInteger("69000000000000000000000000"))); - } - - @Test - public void test10() { - BigInteger privKey = new BigInteger("74ef8a796480dda87b4bc550b94c408ad386af0f65926a392136286784d63858", 16); - byte[] addr = ECKey.fromPrivate(privKey).getAddress(); - assertEquals("ba73facb4f8291f09f27f90fe1213537b910065e", Hex.toHexString(addr)); - } - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/crypto/ECIESCoderTest.java b/ethereumj-core/src/test/java/test/ethereum/crypto/ECIESCoderTest.java deleted file mode 100644 index a593c504..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/crypto/ECIESCoderTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package test.ethereum.crypto; - -import org.ethereum.crypto.ECIESCoder; -import org.ethereum.crypto.ECKey; -import org.junit.Assert; -import org.junit.Test; -import org.spongycastle.math.ec.ECPoint; -import org.spongycastle.util.encoders.Hex; - -import java.math.BigInteger; - -public class ECIESCoderTest { - - - @Test // decrypt cpp data - public void test1(){ - BigInteger privKey = new BigInteger("5e173f6ac3c669587538e7727cf19b782a4f2fda07c1eaa662c593e5e85e3051", 16); - byte[] cipher = Hex.decode("049934a7b2d7f9af8fd9db941d9da281ac9381b5740e1f64f7092f3588d4f87f5ce55191a6653e5e80c1c5dd538169aa123e70dc6ffc5af1827e546c0e958e42dad355bcc1fcb9cdf2cf47ff524d2ad98cbf275e661bf4cf00960e74b5956b799771334f426df007350b46049adb21a6e78ab1408d5e6ccde6fb5e69f0f4c92bb9c725c02f99fa72b9cdc8dd53cff089e0e73317f61cc5abf6152513cb7d833f09d2851603919bf0fbe44d79a09245c6e8338eb502083dc84b846f2fee1cc310d2cc8b1b9334728f97220bb799376233e113"); - - byte[] payload = new byte[0]; - try { - payload = ECIESCoder.decrypt(privKey, cipher); - } catch (Throwable e) {e.printStackTrace();} - - Assert.assertEquals("802b052f8b066640bba94a4fc39d63815c377fced6fcb84d27f791c9921ddf3e9bf0108e298f490812847109cbd778fae393e80323fd643209841a3b7f110397f37ec61d84cea03dcc5e8385db93248584e8af4b4d1c832d8c7453c0089687a700", - Hex.toHexString(payload)); - } - - - @Test // encrypt decrypt round trip - public void test2(){ - - BigInteger privKey = new BigInteger("5e173f6ac3c669587538e7727cf19b782a4f2fda07c1eaa662c593e5e85e3051", 16); - - byte[] payload = Hex.decode("1122334455"); - - ECKey ecKey = ECKey.fromPrivate(privKey); - ECPoint pubKeyPoint = ecKey.getPubKeyPoint(); - - byte[] cipher = new byte[0]; - try { - cipher = ECIESCoder.encrypt(pubKeyPoint, payload); - } catch (Throwable e) {e.printStackTrace();} - - System.out.println(Hex.toHexString(cipher)); - - byte[] decrypted_payload = new byte[0]; - try { - decrypted_payload = ECIESCoder.decrypt(privKey, cipher); - } catch (Throwable e) {e.printStackTrace();} - - System.out.println(Hex.toHexString(decrypted_payload)); - } - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/crypto/ECIESTest.java b/ethereumj-core/src/test/java/test/ethereum/crypto/ECIESTest.java deleted file mode 100644 index 2b636e38..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/crypto/ECIESTest.java +++ /dev/null @@ -1,146 +0,0 @@ -package test.ethereum.crypto; - -import org.ethereum.ConcatKDFBytesGenerator; -import org.ethereum.crypto.ECKey; -import org.ethereum.crypto.EthereumIESEngine; -import org.junit.BeforeClass; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.spongycastle.asn1.sec.SECNamedCurves; -import org.spongycastle.asn1.x9.X9ECParameters; -import org.spongycastle.crypto.*; -import org.spongycastle.crypto.agreement.ECDHBasicAgreement; -import org.spongycastle.crypto.digests.SHA256Digest; -import org.spongycastle.crypto.engines.AESFastEngine; -import org.spongycastle.crypto.generators.ECKeyPairGenerator; -import org.spongycastle.crypto.macs.HMac; -import org.spongycastle.crypto.modes.SICBlockCipher; -import org.spongycastle.crypto.params.*; -import org.spongycastle.math.ec.ECPoint; -import org.spongycastle.util.encoders.Hex; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.math.BigInteger; -import java.security.SecureRandom; -import java.security.Security; - -import static org.junit.Assert.assertArrayEquals; - -public class ECIESTest { - public static final int KEY_SIZE = 128; - static Logger log = LoggerFactory.getLogger("test"); - private static ECDomainParameters curve; - private static final String CIPHERTEXT1 = "042a851331790adacf6e64fcb19d0872fcdf1285a899a12cdc897da941816b0ea6485402aaf6c2e0a5d98ae3af1b05c68b307d1e0eb7a426a46f1617ba5b94f90b606eee3b5e9d2b527a9ee52cfa377bcd118b9390ed27ffe7d48e8155004375cae209012c3e057bb13a478a64a201d79ad4ae83"; - private static final X9ECParameters IES_CURVE_PARAM = SECNamedCurves.getByName("secp256r1"); - private static final BigInteger PRIVATE_KEY1 = new BigInteger("51134539186617376248226283012294527978458758538121566045626095875284492680246"); - - private static ECPoint pub(BigInteger d) { - return curve.getG().multiply(d); - } - - @BeforeClass - public static void beforeAll() { - if (Security.getProvider("SC") == null) - Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1); - curve = new ECDomainParameters(IES_CURVE_PARAM.getCurve(), IES_CURVE_PARAM.getG(), IES_CURVE_PARAM.getN(), IES_CURVE_PARAM.getH()); - } - - @Test - public void testKDF() { - ConcatKDFBytesGenerator kdf = new ConcatKDFBytesGenerator(new SHA256Digest()); - kdf.init(new KDFParameters("Hello".getBytes(), new byte[0])); - byte[] bytes = new byte[2]; - kdf.generateBytes(bytes, 0, bytes.length); - assertArrayEquals(new byte[]{-66, -89}, bytes); - } - - @Test - public void testDecryptTestVector() throws IOException, InvalidCipherTextException { - ECPoint pub1 = pub(PRIVATE_KEY1); - byte[] ciphertext = Hex.decode(CIPHERTEXT1); - byte[] plaintext = decrypt(PRIVATE_KEY1, ciphertext); - assertArrayEquals(new byte[]{1,1,1}, plaintext); - } - - @Test - public void testRoundTrip() throws InvalidCipherTextException, IOException { - ECPoint pub1 = pub(PRIVATE_KEY1); - byte[] plaintext = "Hello world".getBytes(); - byte[] ciphertext = encrypt(pub1, plaintext); - byte[] plaintext1 = decrypt(PRIVATE_KEY1, ciphertext); - assertArrayEquals(plaintext, plaintext1); - } - - public static byte[] decrypt(BigInteger prv, byte[] cipher) throws InvalidCipherTextException, IOException { - ByteArrayInputStream is = new ByteArrayInputStream(cipher); - byte[] ephemBytes = new byte[2*((curve.getCurve().getFieldSize()+7)/8) + 1]; - is.read(ephemBytes); - ECPoint ephem = curve.getCurve().decodePoint(ephemBytes); - byte[] IV = new byte[KEY_SIZE /8]; - is.read(IV); - byte[] cipherBody = new byte[is.available()]; - is.read(cipherBody); - - EthereumIESEngine iesEngine = makeIESEngine(false, ephem, prv, IV); - - byte[] message = iesEngine.processBlock(cipherBody, 0, cipherBody.length); - return message; - } - - public static byte[] encrypt(ECPoint toPub, byte[] plaintext) throws InvalidCipherTextException, IOException { - - ECKeyPairGenerator eGen = new ECKeyPairGenerator(); - SecureRandom random = new SecureRandom(); - KeyGenerationParameters gParam = new ECKeyGenerationParameters(curve, random); - - eGen.init(gParam); - - byte[] IV = new byte[KEY_SIZE/8]; - new SecureRandom().nextBytes(IV); - - AsymmetricCipherKeyPair ephemPair = eGen.generateKeyPair(); - BigInteger prv = ((ECPrivateKeyParameters)ephemPair.getPrivate()).getD(); - ECPoint pub = ((ECPublicKeyParameters)ephemPair.getPublic()).getQ(); - EthereumIESEngine iesEngine = makeIESEngine(true, toPub, prv, IV); - - - ECKeyGenerationParameters keygenParams = new ECKeyGenerationParameters(curve, random); - ECKeyPairGenerator generator = new ECKeyPairGenerator(); - generator.init(keygenParams); - - ECKeyPairGenerator gen = new ECKeyPairGenerator(); - gen.init(new ECKeyGenerationParameters(ECKey.CURVE, random)); - - byte[] cipher = iesEngine.processBlock(plaintext, 0, plaintext.length); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - bos.write(pub.getEncoded(false)); - bos.write(IV); - bos.write(cipher); - return bos.toByteArray(); - } - - private static EthereumIESEngine makeIESEngine(boolean isEncrypt, ECPoint pub, BigInteger prv, byte[] IV) { - AESFastEngine aesFastEngine = new AESFastEngine(); - - EthereumIESEngine iesEngine = new EthereumIESEngine( - new ECDHBasicAgreement(), - new ConcatKDFBytesGenerator(new SHA256Digest()), - new HMac(new SHA256Digest()), - new SHA256Digest(), - new BufferedBlockCipher(new SICBlockCipher(aesFastEngine))); - - - byte[] d = new byte[] {}; - byte[] e = new byte[] {}; - - IESParameters p = new IESWithCipherParameters(d, e, KEY_SIZE, KEY_SIZE); - ParametersWithIV parametersWithIV = new ParametersWithIV(p, IV); - - iesEngine.init(isEncrypt, new ECPrivateKeyParameters(prv, curve), new ECPublicKeyParameters(pub, curve), parametersWithIV); - return iesEngine; - } - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/crypto/ECKeyTest.java b/ethereumj-core/src/test/java/test/ethereum/crypto/ECKeyTest.java deleted file mode 100644 index 24c1cbf8..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/crypto/ECKeyTest.java +++ /dev/null @@ -1,291 +0,0 @@ -package test.ethereum.crypto; - -import org.ethereum.core.Transaction; -import org.ethereum.crypto.ECKey; -import org.ethereum.crypto.ECKey.ECDSASignature; -import org.ethereum.crypto.HashUtil; - -import com.google.common.collect.Lists; -import com.google.common.util.concurrent.Futures; -import com.google.common.util.concurrent.ListenableFuture; -import com.google.common.util.concurrent.ListeningExecutorService; -import com.google.common.util.concurrent.MoreExecutors; - -import org.junit.Assert; -import org.junit.Test; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.spongycastle.util.encoders.Hex; - -import java.io.IOException; - -import java.math.BigInteger; - -import java.security.SignatureException; - -import java.util.List; -import java.util.concurrent.Callable; -import java.util.concurrent.Executors; - -import static com.google.common.base.Preconditions.checkNotNull; -import static org.junit.Assert.*; - -public class ECKeyTest { - private static final Logger log = LoggerFactory.getLogger(ECKeyTest.class); - - private String privString = "3ecb44df2159c26e0f995712d4f39b6f6e499b40749b1cf1246c37f9516cb6a4"; - private BigInteger privateKey = new BigInteger(Hex.decode(privString)); - - private String pubString = "0497466f2b32bc3bb76d4741ae51cd1d8578b48d3f1e68da206d47321aec267ce78549b514e4453d74ef11b0cd5e4e4c364effddac8b51bcfc8de80682f952896f"; - private String compressedPubString = "0397466f2b32bc3bb76d4741ae51cd1d8578b48d3f1e68da206d47321aec267ce7"; - private byte[] pubKey = Hex.decode(pubString); - private byte[] compressedPubKey = Hex.decode(compressedPubString); - private String address = "8a40bfaa73256b60764c1bf40675a99083efb075"; - - private String exampleMessage = new String("This is an example of a signed message."); - private String sigBase64 = "HD5AsBr4wuH6UU9tXuSJhUvgfGayfwoY0cKT03sFUjnpQsupHznd/3mCIRfLuNHlRCVGdAyHecdyM8IVZMtc1I8="; - - @Test - public void testHashCode() { - Assert.assertEquals(1866897155, ECKey.fromPrivate(privateKey).hashCode()); - } - - @Test - public void testECKey() { - ECKey key = new ECKey(); - assertTrue(key.isPubKeyCanonical()); - assertNotNull(key.getPubKey()); - assertNotNull(key.getPrivKeyBytes()); - log.debug(Hex.toHexString(key.getPrivKeyBytes()) + " :Generated privkey"); - log.debug(Hex.toHexString(key.getPubKey()) + " :Generated pubkey"); - } - - @Test - public void testFromPrivateKey() { - ECKey key = ECKey.fromPrivate(privateKey).decompress(); - assertTrue(key.isPubKeyCanonical()); - assertTrue(key.hasPrivKey()); - assertArrayEquals(pubKey, key.getPubKey()); - } - - @Test(expected = IllegalArgumentException.class) - public void testPrivatePublicKeyBytesNoArg() { - new ECKey(null, null); - fail("Expecting an IllegalArgumentException for using only null-parameters"); - } - - @Test - public void testIsPubKeyOnly() { - ECKey key = ECKey.fromPublicOnly(pubKey); - assertTrue(key.isPubKeyCanonical()); - assertTrue(key.isPubKeyOnly()); - assertArrayEquals(key.getPubKey(), pubKey); - } - - - @Test - public void testPublicKeyFromPrivate() { - byte[] pubFromPriv = ECKey.publicKeyFromPrivate(privateKey, false); - assertArrayEquals(pubKey, pubFromPriv); - } - - @Test - public void testPublicKeyFromPrivateCompressed() { - byte[] pubFromPriv = ECKey.publicKeyFromPrivate(privateKey, true); - assertArrayEquals(compressedPubKey, pubFromPriv); - } - - @Test - public void testGetAddress() { - ECKey key = ECKey.fromPublicOnly(pubKey); - assertArrayEquals(Hex.decode(address), key.getAddress()); - } - - @Test - public void testToString() { - ECKey key = ECKey.fromPrivate(BigInteger.TEN); // An example private key. - assertEquals("pub:04a0434d9e47f3c86235477c7b1ae6ae5d3442d49b1943c2b752a68e2a47e247c7893aba425419bc27a3b6c7e693a24c696f794c2ed877a1593cbee53b037368d7", key.toString()); - } - - @Test - public void testEthereumSign() throws IOException { - // TODO: Understand why key must be decompressed for this to work - ECKey key = ECKey.fromPrivate(privateKey).decompress(); - System.out.println("Secret\t: " + Hex.toHexString(key.getPrivKeyBytes())); - System.out.println("Pubkey\t: " + Hex.toHexString(key.getPubKey())); - System.out.println("Data\t: " + exampleMessage); - byte[] messageHash = HashUtil.sha3(exampleMessage.getBytes()); - ECDSASignature signature = key.sign(messageHash); - String output = signature.toBase64(); - System.out.println("Signtr\t: " + output + " (Base64, length: " + output.length() + ")"); - assertEquals(sigBase64, output); - } - - @Test - public void testVerifySignature1() { - ECKey key = ECKey.fromPublicOnly(pubKey); - BigInteger r = new BigInteger("28157690258821599598544026901946453245423343069728565040002908283498585537001"); - BigInteger s = new BigInteger("30212485197630673222315826773656074299979444367665131281281249560925428307087"); - ECDSASignature sig = ECDSASignature.fromComponents(r.toByteArray(), s.toByteArray(), (byte) 28); - key.verify(HashUtil.sha3(exampleMessage.getBytes()), sig); - } - - @Test - public void testVerifySignature2() { - BigInteger r = new BigInteger("c52c114d4f5a3ba904a9b3036e5e118fe0dbb987fe3955da20f2cd8f6c21ab9c", 16); - BigInteger s = new BigInteger("6ba4c2874299a55ad947dbc98a25ee895aabf6b625c26c435e84bfd70edf2f69", 16); - ECDSASignature sig = ECDSASignature.fromComponents(r.toByteArray(), s.toByteArray(), (byte) 0x1b); - byte[] rawtx = Hex.decode("f82804881bc16d674ec8000094cd2a3d9f938e13cd947ec05abc7fe734df8dd8268609184e72a0006480"); - try { - ECKey key = ECKey.signatureToKey(HashUtil.sha3(rawtx), sig.toBase64()); - System.out.println("Signature public key\t: " + Hex.toHexString(key.getPubKey())); - System.out.println("Sender is\t\t: " + Hex.toHexString(key.getAddress())); - assertEquals("cd2a3d9f938e13cd947ec05abc7fe734df8dd826", Hex.toHexString(key.getAddress())); - key.verify(HashUtil.sha3(rawtx), sig); - } catch (SignatureException e) { - fail(); - } - } - - @Test - public void testVerifySignature3() throws SignatureException { - - byte[] rawtx = Hex.decode("f86e80893635c9adc5dea000008609184e72a00082109f9479b08ad8787060333663d19704909ee7b1903e58801ba0899b92d0c76cbf18df24394996beef19c050baa9823b4a9828cd9b260c97112ea0c9e62eb4cf0a9d95ca35c8830afac567619d6b3ebee841a3c8be61d35acd8049"); - - Transaction tx = new Transaction(rawtx); - ECKey key = ECKey.signatureToKey(HashUtil.sha3(rawtx), tx.getSignature().toBase64()); - - System.out.println("Signature public key\t: " + Hex.toHexString(key.getPubKey())); - System.out.println("Sender is\t\t: " + Hex.toHexString(key.getAddress())); - - // sender: CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826 - // todo: add test assertion when the sign/verify part actually works. - } - - - @Test - public void testSValue() throws Exception { - // Check that we never generate an S value that is larger than half the curve order. This avoids a malleability - // issue that can allow someone to change a transaction [hash] without invalidating the signature. - final int ITERATIONS = 10; - ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(ITERATIONS)); - List> sigFutures = Lists.newArrayList(); - final ECKey key = new ECKey(); - for (byte i = 0; i < ITERATIONS; i++) { - final byte[] hash = HashUtil.sha3(new byte[]{i}); - sigFutures.add(executor.submit(new Callable() { - @Override - public ECKey.ECDSASignature call() throws Exception { - return key.doSign(hash); - } - })); - } - List sigs = Futures.allAsList(sigFutures).get(); - for (ECKey.ECDSASignature signature : sigs) { - assertTrue(signature.s.compareTo(ECKey.HALF_CURVE_ORDER) <= 0); - } - final ECKey.ECDSASignature duplicate = new ECKey.ECDSASignature(sigs.get(0).r, sigs.get(0).s); - assertEquals(sigs.get(0), duplicate); - assertEquals(sigs.get(0).hashCode(), duplicate.hashCode()); - } - - @Test - public void testSignVerify() { - ECKey key = ECKey.fromPrivate(privateKey); - String message = new String("This is an example of a signed message."); - ECDSASignature output = key.doSign(message.getBytes()); - assertTrue(key.verify(message.getBytes(), output)); - } - - @Test - public void testIsPubKeyCanonicalCorect() { - // Test correct prefix 4, right length 65 - byte[] canonicalPubkey1 = new byte[65]; - canonicalPubkey1[0] = 0x04; - assertTrue(ECKey.isPubKeyCanonical(canonicalPubkey1)); - // Test correct prefix 2, right length 33 - byte[] canonicalPubkey2 = new byte[33]; - canonicalPubkey2[0] = 0x02; - assertTrue(ECKey.isPubKeyCanonical(canonicalPubkey2)); - // Test correct prefix 3, right length 33 - byte[] canonicalPubkey3 = new byte[33]; - canonicalPubkey3[0] = 0x03; - assertTrue(ECKey.isPubKeyCanonical(canonicalPubkey3)); - } - - @Test - public void testIsPubKeyCanonicalWrongLength() { - // Test correct prefix 4, but wrong length !65 - byte[] nonCanonicalPubkey1 = new byte[64]; - nonCanonicalPubkey1[0] = 0x04; - assertFalse(ECKey.isPubKeyCanonical(nonCanonicalPubkey1)); - // Test correct prefix 2, but wrong length !33 - byte[] nonCanonicalPubkey2 = new byte[32]; - nonCanonicalPubkey2[0] = 0x02; - assertFalse(ECKey.isPubKeyCanonical(nonCanonicalPubkey2)); - // Test correct prefix 3, but wrong length !33 - byte[] nonCanonicalPubkey3 = new byte[32]; - nonCanonicalPubkey3[0] = 0x03; - assertFalse(ECKey.isPubKeyCanonical(nonCanonicalPubkey3)); - } - - @Test - public void testIsPubKeyCanonicalWrongPrefix() { - // Test wrong prefix 4, right length 65 - byte[] nonCanonicalPubkey4 = new byte[65]; - assertFalse(ECKey.isPubKeyCanonical(nonCanonicalPubkey4)); - // Test wrong prefix 2, right length 33 - byte[] nonCanonicalPubkey5 = new byte[33]; - assertFalse(ECKey.isPubKeyCanonical(nonCanonicalPubkey5)); - // Test wrong prefix 3, right length 33 - byte[] nonCanonicalPubkey6 = new byte[33]; - assertFalse(ECKey.isPubKeyCanonical(nonCanonicalPubkey6)); - } - - @Test - public void keyRecovery() throws Exception { - ECKey key = new ECKey(); - String message = "Hello World!"; - byte[] hash = HashUtil.sha256(message.getBytes()); - ECKey.ECDSASignature sig = key.doSign(hash); - key = ECKey.fromPublicOnly(key.getPubKeyPoint()); - boolean found = false; - for (int i = 0; i < 4; i++) { - ECKey key2 = ECKey.recoverFromSignature(i, sig, hash, true); - checkNotNull(key2); - if (key.equals(key2)) { - found = true; - break; - } - } - assertTrue(found); - } - - @Test - public void testSignedMessageToKey() throws SignatureException { - byte[] messageHash = HashUtil.sha3(exampleMessage.getBytes()); - ECKey key = ECKey.signatureToKey(messageHash, sigBase64); - assertNotNull(key); - assertArrayEquals(pubKey, key.getPubKey()); - } - - @Test - public void testGetPrivKeyBytes() { - ECKey key = new ECKey(); - assertNotNull(key.getPrivKeyBytes()); - assertEquals(32, key.getPrivKeyBytes().length); - } - - @Test - public void testEqualsObject() { - ECKey key0 = new ECKey(); - ECKey key1 = ECKey.fromPrivate(privateKey); - ECKey key2 = ECKey.fromPrivate(privateKey); - - assertFalse(key0.equals(key1)); - assertTrue(key1.equals(key1)); - assertTrue(key1.equals(key2)); - } -} diff --git a/ethereumj-core/src/test/java/test/ethereum/datasource/AbstractRedisTest.java b/ethereumj-core/src/test/java/test/ethereum/datasource/AbstractRedisTest.java deleted file mode 100644 index 0193a5c8..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/datasource/AbstractRedisTest.java +++ /dev/null @@ -1,58 +0,0 @@ -package test.ethereum.datasource; - -import org.ethereum.datasource.redis.RedisConnection; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.support.AnnotationConfigContextLoader; -import org.springframework.util.StringUtils; -import redis.clients.jedis.Jedis; -import redis.clients.jedis.JedisPool; -import redis.clients.jedis.JedisPoolConfig; -import redis.clients.jedis.Protocol; -import test.ethereum.TestContext; - -import java.net.URI; -import java.net.URISyntaxException; - -import static org.junit.Assert.assertFalse; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(loader = AnnotationConfigContextLoader.class) -public abstract class AbstractRedisTest { - - @Configuration - @ComponentScan(basePackages = "org.ethereum") - static class ContextConfiguration extends TestContext { } - - @Autowired - private RedisConnection redisConnection; - - private Boolean connected; - - protected RedisConnection getRedisConnection() { - return redisConnection; - } - - protected Boolean isConnected() { - if (connected == null) { - String url = System.getenv(RedisConnection.REDISCLOUD_URL); - try { - Jedis jedis = new Jedis(new URI(url)); - connected = jedis.ping().equals("PONG"); - jedis.close(); - } catch (Exception e) { - System.out.printf("Cannot connect to '%s' Redis cloud.\n", url); - } - - assertFalse(connected ^ redisConnection.isAvailable()); - } - - return connected; - } - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/datasource/RedisDataSourceTest.java b/ethereumj-core/src/test/java/test/ethereum/datasource/RedisDataSourceTest.java deleted file mode 100644 index c68ec9dd..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/datasource/RedisDataSourceTest.java +++ /dev/null @@ -1,75 +0,0 @@ -package test.ethereum.datasource; - -import org.ethereum.datasource.KeyValueDataSource; -import org.ethereum.datasource.redis.RedisConnection; -import org.ethereum.datasource.redis.RedisDataSource; -import org.junit.Assert; -import org.junit.Test; -import org.spongycastle.util.encoders.Hex; -import redis.clients.jedis.Jedis; - -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Set; - -/** - * @author Roman Mandeleil - */ -public class RedisDataSourceTest extends AbstractRedisTest { - - @Test - public void testSet1() { - if (!isConnected()) return; - - KeyValueDataSource dataSource = createDataSource("test-state"); - try { - byte[] key = Hex.decode("a1a2a3"); - byte[] val = Hex.decode("b1b2b3"); - - dataSource.put(key, val); - byte[] val2 = dataSource.get(key); - - Assert.assertEquals(Hex.toHexString(val), Hex.toHexString(val2)); - } finally { - clear(dataSource); - } - } - - @Test - public void testSet2() { - if (!isConnected()) return; - - KeyValueDataSource states = createDataSource("test-state"); - KeyValueDataSource details = createDataSource("test-details"); - - try { - byte[] key = Hex.decode("a1a2a3"); - byte[] val1 = Hex.decode("b1b2b3"); - byte[] val2 = Hex.decode("c1c2c3"); - - states.put(key, val1); - details.put(key, val2); - - byte[] res1 = states.get(key); - byte[] res2 = details.get(key); - - Assert.assertEquals(Hex.toHexString(val1), Hex.toHexString(res1)); - Assert.assertEquals(Hex.toHexString(val2), Hex.toHexString(res2)); - } finally { - clear(states); - clear(details); - } - } - - private KeyValueDataSource createDataSource(String name) { - KeyValueDataSource result = getRedisConnection().createDataSource(name); - result.setName(name); - result.init(); - return result; - } - - private void clear(KeyValueDataSource dataSource) { - ((RedisDataSource) dataSource).clear(); - } - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/datasource/RedisStorageTest.java b/ethereumj-core/src/test/java/test/ethereum/datasource/RedisStorageTest.java deleted file mode 100644 index 97c04abc..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/datasource/RedisStorageTest.java +++ /dev/null @@ -1,130 +0,0 @@ -package test.ethereum.datasource; - -import org.ethereum.core.Transaction; -import org.ethereum.crypto.ECKey; -import org.ethereum.crypto.HashUtil; -import org.junit.Test; -import org.spongycastle.util.encoders.Hex; - -import java.math.BigInteger; -import java.util.Set; - -import static java.util.Arrays.asList; -import static org.junit.Assert.*; - -public class RedisStorageTest extends AbstractRedisTest { - - @Test - public void testRedisSet() { - if (!isConnected()) return; - - Pojo elephant = Pojo.create(5L, "elephant"); - Pojo lion = Pojo.create(5L, "lion"); - - Set ranch = getRedisConnection().createSetFor(Pojo.class, "ranch"); - Pojo chicken = Pojo.create(1L, "chicken"); - Pojo cow = Pojo.create(2L, "cow"); - Pojo puppy = Pojo.create(3L, "puppy"); - Pojo kitten = Pojo.create(4L, "kitten"); - - assertTrue(ranch.add(chicken)); - assertFalse(ranch.add(chicken)); - assertTrue(ranch.contains(chicken)); - assertEquals(1, ranch.size()); - - Pojo next = ranch.iterator().next(); - assertNotNull(next); - assertEquals(chicken, next); - - assertTrue(ranch.addAll(asList(cow, puppy, kitten))); - assertEquals(4, ranch.size()); - assertFalse(ranch.isEmpty()); - assertFalse(ranch.remove(elephant)); - assertFalse(ranch.removeAll(asList(cow, lion, elephant))); - assertEquals(3, ranch.size()); - - assertTrue(ranch.retainAll(asList(kitten, puppy))); - assertEquals(2, ranch.size()); - - ranch.clear(); - assertEquals(0, ranch.size()); - assertTrue(ranch.isEmpty()); - } - - @Test - public void testSeveralSetsWithOneName() { - if (!isConnected()) return; - - final String name = "testTransactions"; - Set transactions = getRedisConnection().createTransactionSet(name); - transactions.add(createTransaction("09184e72a000", "4255", "1000000000000000000000", "cat")); - transactions.add(createTransaction("09184e72a000", "4255", "1000000000000000000000", "dog")); - transactions.add(createTransaction("09184e72a000", "4255", "1000000000000000000000", "rabbit")); - - Set transactions1 = getRedisConnection().createTransactionSet(name); - transactions1.add(createTransaction("09184e72a000", "4255", "1000000000000000000000", "duck")); - transactions1.add(createTransaction("09184e72a000", "4255", "1000000000000000000000", "chicken")); - transactions1.add(createTransaction("09184e72a000", "4255", "1000000000000000000000", "cow")); - - assertEquals(6, transactions1.size()); - transactions.clear(); - assertTrue(transactions1.isEmpty()); - } - - private static class Pojo { - private Long id; - private String name; - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public static Pojo create(long id, String name) { - Pojo result = new Pojo(); - result.setId(id); - result.setName(name); - return result; - } - - @Override - public boolean equals(Object obj) { - if (obj == null || !getClass().isInstance(obj)) return false; - if (this == obj) return true; - - Pojo another = (Pojo) obj; - return (another.getId() == getId()) && another.getName().equals(getName()); - } - - @Override - public int hashCode() { - int hashCode = 17; - - hashCode += ((getId() == null) ? 0 : getId().hashCode()) * 31; - hashCode += ((getName() == null) ? 0 : getName().hashCode()) * 31; - - return hashCode; - } - } - - public static Transaction createTransaction(String gasPrice, String gas, String val, String secret) { - - ECKey ecKey = ECKey.fromPrivate(HashUtil.sha3(secret.getBytes())); - - // Tn (nonce); Tp(pgas); Tg(gaslimi); Tt(value); Tv(value); Ti(sender); Tw; Tr; Ts - return new Transaction(null, Hex.decode(gasPrice), Hex.decode(gas), ecKey.getAddress(), - new BigInteger(val).toByteArray(), - null); - } -} \ No newline at end of file diff --git a/ethereumj-core/src/test/java/test/ethereum/db/ByteArrayWrapperTest.java b/ethereumj-core/src/test/java/test/ethereum/db/ByteArrayWrapperTest.java deleted file mode 100644 index 14aba8fe..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/db/ByteArrayWrapperTest.java +++ /dev/null @@ -1,144 +0,0 @@ -package test.ethereum.db; - -import org.ethereum.db.ByteArrayWrapper; -import org.ethereum.util.FastByteComparisons; - -import com.google.common.primitives.UnsignedBytes; - -import org.junit.BeforeClass; -import org.junit.Test; - -import org.spongycastle.util.encoders.Hex; - -import java.util.Arrays; -import java.util.Comparator; - -import static org.junit.Assert.*; - -public class ByteArrayWrapperTest { - - static ByteArrayWrapper wrapper1; - static ByteArrayWrapper wrapper2; - static ByteArrayWrapper wrapper3; - static ByteArrayWrapper wrapper4; - - @BeforeClass - public static void loadByteArrays() { - - String block = "f9072df8d3a077ef4fdaf389dca53236bcf7f72698e154eab2828f86fbc4fc6c" - + "d9225d285c89a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0" - + "a142fd40d493479476f5eabe4b342ee56b8ceba6ab2a770c3e2198e7a0faa0ca" - + "43105f667dceb168eb4e0cdc98ef28a9da5c381edef70d843207601719a06785" - + "f3860460b2aa29122698e83a5151b270e82532c1663e89e3df8c5445b8ca833f" - + "f000018609184e72a000830f3e6f8227d2845387c58f80a00000000000000000" - + "0000000000000000000000000000000094148d7738f78c04f90654f8c6f8a080" - + "8609184e72a00082271094000000000000000000000000000000000000000080" - + "b83a33604557602a5160106000396000f200604556330e0f602a59366000530a" - + "0f602a596020600053013560005335576040600053016000546009581ca033a6" - + "bfa5eb2f4b63f1b98bed9a987d096d32e56deecb050367c84955508f5365a015" - + "034e7574ec073f0c448aac1d9f844387610dfef5342834b6825fbc35df5913a0" - + "ee258e73d41ada73d8d6071ba7d236fbbe24fcfb9627fbd4310e24ffd87b961a" - + "8203e9f90194f9016d018609184e72a000822710940000000000000000000000" - + "00000000000000000080b901067f4e616d655265670000000000000000000000" - + "00000000000000000000000000003057307f4e616d6552656700000000000000" - + "000000000000000000000000000000000000577f436f6e666967000000000000" - + "000000000000000000000000000000000000000073ccdeac59d35627b7de0933" - + "2e819d5159e7bb72505773ccdeac59d35627b7de09332e819d5159e7bb72507f" - + "436f6e6669670000000000000000000000000000000000000000000000000000" - + "57336045576041516100c56000396000f20036602259604556330e0f600f5933" - + "ff33560f601e5960003356576000335700604158600035560f602b590033560f" - + "603659600033565733600035576000353357001ca0f3c527e484ea5546189979" - + "c767b69aa9f1ad5a6f4b6077d4bccf5142723a67c9a069a4a29a2a315102fcd0" - + "822d39ad696a6d7988c993bb2b911cc2a78bb8902d91a01ebe4782ea3ed224cc" - + "bb777f5de9ee7b5bbb282ac08f7fa0ef95d3d1c1c6d1a1820ef7f8ccf8a60286" - + "09184e72a00082271094ccdeac59d35627b7de09332e819d5159e7bb725080b8" - + "4000000000000000000000000000000000000000000000000000000000000000" - + "000000000000000000000000002d0aceee7e5ab874e22ccf8d1a649f59106d74" - + "e81ba095ad45bf574c080e4d72da2cfd3dbe06cc814c1c662b5f74561f13e1e7" - + "5058f2a057745a3db5482bccb5db462922b074f4b79244c4b1fa811ed094d728" - + "e7b6da92a08599ea5d6cb6b9ad3311f0d82a3337125e05f4a82b9b0556cb3776" - + "a6e1a02f8782132df8abf885038609184e72a000822710942d0aceee7e5ab874" - + "e22ccf8d1a649f59106d74e880a0476176000000000000000000000000000000" - + "00000000000000000000000000001ca09b5fdabd54ebc284249d2d2df6d43875" - + "cb86c52bd2bac196d4f064c8ade054f2a07b33f5c8b277a408ec38d2457441d2" - + "af32e55681c8ecb28eef3d2a152e8db5a9a0227a67fceb1bf4ddd31a7047e24b" - + "e93c947ab3b539471555bb3509ed6e393c8e82178df90277f90250048609184e" - + "72a0008246dd94000000000000000000000000000000000000000080b901e961" - + "010033577f476176436f696e0000000000000000000000000000000000000000" - + "000000000060005460006000600760006000732d0aceee7e5ab874e22ccf8d1a" - + "649f59106d74e860645c03f150436000576000600157620f424060025761017d" - + "5161006c6000396000f2006020360e0f61013f59602060006000374360205460" - + "0056600054602056602054437f6e000000000000000000000000000000000000" - + "00000000000000000000000000560e0f0f61008059437f6e0000000000000000" - + "0000000000000000000000000000000000000000000000576000602054610400" - + "60005304600053036000547f6400000000000000000000000000000000000000" - + "0000000000000000000000005660016000030460406000200a0f61013e596001" - + "60205301602054600a6020530b0f6100f45961040060005304600053017f6400" - + "0000000000000000000000000000000000000000000000000000000000005760" - + "20537f6900000000000000000000000000000000000000000000000000000000" - + "000000576000537f640000000000000000000000000000000000000000000000" - + "000000000000000057006040360e0f0f61014a59003356604054600035566060" - + "546020356080546080536040530a0f6101695900608053604053033357608053" - + "60605301600035571ba0190fc7ab634dc497fe1656fde523a4c26926d51a93db" - + "2ba37af8e83c3741225da066ae0ec1217b0ca698a5369d4881e1c4cbde56af99" - + "31ebf9281580a23b659c08a051f947cb2315d0259f55848c630caa10cd91d6e4" - + "4ff8bad7758c65b25e2191308227d2c0"; - - byte[] test1 = Hex.decode(block); - byte[] test2 = Hex.decode(block); - byte[] test3 = Hex.decode("4ff8bad7758c65b25e2191308227d2c0"); - byte[] test4 = Hex.decode(""); - - wrapper1 = new ByteArrayWrapper(test1); - wrapper2 = new ByteArrayWrapper(test2); - wrapper3 = new ByteArrayWrapper(test3); - wrapper4 = new ByteArrayWrapper(test4); - } - - @Test - public void testEqualsObject() { - assertTrue(wrapper1.equals(wrapper2)); - assertFalse(wrapper1.equals(wrapper3)); - assertFalse(wrapper1.equals(wrapper4)); - assertFalse(wrapper1.equals(null)); - assertFalse(wrapper2.equals(wrapper3)); - } - - @Test - public void testCompareTo() { - assertTrue(wrapper1.compareTo(wrapper2) == 0); - assertTrue(wrapper1.compareTo(wrapper3) > 1); - assertTrue(wrapper1.compareTo(wrapper4) > 1); - assertTrue(wrapper2.compareTo(wrapper3) > 1); - } - - @Test - public void testEqualsPerformance() { - boolean testEnabled = false; - - if (testEnabled) { - final int ITERATIONS = 10000000; - long start1 = System.currentTimeMillis(); - for (int i = 0; i < ITERATIONS; i++) { - Comparator comparator = UnsignedBytes - .lexicographicalComparator(); - - comparator.compare(wrapper1.getData(), - wrapper2.getData()); - } - System.out.println(System.currentTimeMillis() - start1 + "ms"); - - long start2 = System.currentTimeMillis(); - for (int i = 0; i < ITERATIONS; i++) { - Arrays.equals(wrapper1.getData(), wrapper2.getData()); - } - System.out.println(System.currentTimeMillis() - start2 + "ms"); - - long start3 = System.currentTimeMillis(); - for (int i = 0; i < ITERATIONS; i++) { - FastByteComparisons.compareTo(wrapper1.getData(), 0, wrapper1.getData().length, wrapper2.getData(), 0, wrapper1.getData().length); - } - System.out.println(System.currentTimeMillis() - start3 + "ms"); - } - } -} diff --git a/ethereumj-core/src/test/java/test/ethereum/db/MockDB.java b/ethereumj-core/src/test/java/test/ethereum/db/MockDB.java deleted file mode 100644 index 83a1ac94..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/db/MockDB.java +++ /dev/null @@ -1,67 +0,0 @@ -package test.ethereum.db; - -import org.ethereum.datasource.KeyValueDataSource; -import org.ethereum.db.ByteArrayWrapper; - -import org.iq80.leveldb.DBException; - -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -public class MockDB implements KeyValueDataSource { - - Map storage = new HashMap<>(); - - - @Override - public void delete(byte[] arg0) throws DBException { - storage.remove(arg0); - } - - - @Override - public byte[] get(byte[] arg0) throws DBException { - return storage.get(new ByteArrayWrapper(arg0)); - } - - - @Override - public byte[] put(byte[] key, byte[] value) throws DBException { - return storage.put(new ByteArrayWrapper(key), value); - } - - /** - * Returns the number of items added to this Mock DB - * - * @return int - */ - public int getAddedItems() { - return storage.size(); - } - - @Override - public void init() { - - } - - @Override - public void setName(String name) { - - } - - @Override - public Set keys() { - return null; - } - - @Override - public void updateBatch(Map rows) { - - } - - @Override - public void close() { - - } -} \ No newline at end of file diff --git a/ethereumj-core/src/test/java/test/ethereum/db/RepositoryTest.java b/ethereumj-core/src/test/java/test/ethereum/db/RepositoryTest.java deleted file mode 100644 index 776dc7df..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/db/RepositoryTest.java +++ /dev/null @@ -1,531 +0,0 @@ -package test.ethereum.db; - -import org.ethereum.config.SystemProperties; -import org.ethereum.core.Genesis; -import org.ethereum.core.PremineRaw; -import org.ethereum.crypto.HashUtil; -import org.ethereum.datasource.LevelDbDataSource; -import org.ethereum.db.RepositoryImpl; -import org.ethereum.facade.Repository; -import org.ethereum.vm.DataWord; - -import org.junit.Assert; -import org.junit.FixMethodOrder; -import org.junit.Test; -import org.junit.runners.MethodSorters; - -import org.spongycastle.util.encoders.Hex; - -import java.math.BigInteger; - -import static org.junit.Assert.*; - -/** - * @author Roman Mandeleil - * @since 17.11.2014 - */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class RepositoryTest { - - - @Test - public void test1() { - - SystemProperties.CONFIG.setDataBaseDir("test_db/" + RepositoryTest.class); - Repository repository = new RepositoryImpl(new LevelDbDataSource(), new LevelDbDataSource()); - - byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); - byte[] horse = Hex.decode("13978AEE95F38490E9769C39B2773ED763D9CD5F"); - - repository.increaseNonce(cow); - repository.increaseNonce(horse); - - assertEquals(BigInteger.ONE, repository.getNonce(cow)); - assertEquals(BigInteger.ONE, repository.getNonce(horse)); - - repository.close(); - } - - - @Test - public void test2() { - - SystemProperties.CONFIG.setDataBaseDir("test_db/" + RepositoryTest.class); - Repository repository = new RepositoryImpl(new LevelDbDataSource(), new LevelDbDataSource()); - - byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); - byte[] horse = Hex.decode("13978AEE95F38490E9769C39B2773ED763D9CD5F"); - - repository.addBalance(cow, BigInteger.TEN); - repository.addBalance(horse, BigInteger.ONE); - - assertEquals(BigInteger.TEN, repository.getBalance(cow)); - assertEquals(BigInteger.ONE, repository.getBalance(horse)); - - repository.close(); - } - - - @Test - public void test3() { - - SystemProperties.CONFIG.setDataBaseDir("test_db/" + RepositoryTest.class); - Repository repository = new RepositoryImpl(new LevelDbDataSource(), new LevelDbDataSource()); - - byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); - byte[] horse = Hex.decode("13978AEE95F38490E9769C39B2773ED763D9CD5F"); - - byte[] cowCode = Hex.decode("A1A2A3"); - byte[] horseCode = Hex.decode("B1B2B3"); - - repository.saveCode(cow, cowCode); - repository.saveCode(horse, horseCode); - - assertArrayEquals(cowCode, repository.getCode(cow)); - assertArrayEquals(horseCode, repository.getCode(horse)); - - repository.close(); - } - - @Test - public void test4() { - - SystemProperties.CONFIG.setDataBaseDir("test_db/" + RepositoryTest.class); - Repository repository = new RepositoryImpl(new LevelDbDataSource(), new LevelDbDataSource()); - - byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); - byte[] horse = Hex.decode("13978AEE95F38490E9769C39B2773ED763D9CD5F"); - - byte[] cowKey = Hex.decode("A1A2A3"); - byte[] cowValue = Hex.decode("A4A5A6"); - - byte[] horseKey = Hex.decode("B1B2B3"); - byte[] horseValue = Hex.decode("B4B5B6"); - - repository.addStorageRow(cow, new DataWord(cowKey), new DataWord(cowValue)); - repository.addStorageRow(horse, new DataWord(horseKey), new DataWord(horseValue)); - - assertEquals(new DataWord(cowValue), repository.getStorageValue(cow, new DataWord(cowKey))); - assertEquals(new DataWord(horseValue), repository.getStorageValue(horse, new DataWord(horseKey))); - - repository.close(); - } - - - @Test - public void test5() { - - SystemProperties.CONFIG.setDataBaseDir("test_db/" + RepositoryTest.class); - Repository repository = new RepositoryImpl(new LevelDbDataSource(), new LevelDbDataSource()); - Repository track = repository.startTracking(); - - byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); - byte[] horse = Hex.decode("13978AEE95F38490E9769C39B2773ED763D9CD5F"); - - track.increaseNonce(cow); - track.increaseNonce(cow); - track.increaseNonce(cow); - track.increaseNonce(cow); - track.increaseNonce(cow); - track.increaseNonce(cow); - track.increaseNonce(cow); - track.increaseNonce(cow); - track.increaseNonce(cow); - track.increaseNonce(cow); - - track.increaseNonce(horse); - - track.commit(); - - assertEquals(BigInteger.TEN, repository.getNonce(cow)); - assertEquals(BigInteger.ONE, repository.getNonce(horse)); - - repository.close(); - } - - @Test - public void test6() { - - SystemProperties.CONFIG.setDataBaseDir("test_db/" + RepositoryTest.class); - Repository repository = new RepositoryImpl(new LevelDbDataSource(), new LevelDbDataSource()); - Repository track = repository.startTracking(); - - byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); - byte[] horse = Hex.decode("13978AEE95F38490E9769C39B2773ED763D9CD5F"); - - track.increaseNonce(cow); - track.increaseNonce(cow); - track.increaseNonce(cow); - track.increaseNonce(cow); - track.increaseNonce(cow); - track.increaseNonce(cow); - track.increaseNonce(cow); - track.increaseNonce(cow); - track.increaseNonce(cow); - track.increaseNonce(cow); - - track.increaseNonce(horse); - - assertEquals(BigInteger.TEN, track.getNonce(cow)); - assertEquals(BigInteger.ONE, track.getNonce(horse)); - - track.rollback(); - - assertEquals(BigInteger.ZERO, repository.getNonce(cow)); - assertEquals(BigInteger.ZERO, repository.getNonce(horse)); - - repository.close(); - } - - @Test - public void test7() { - - SystemProperties.CONFIG.setDataBaseDir("test_db/" + RepositoryTest.class); - Repository repository = new RepositoryImpl(new LevelDbDataSource(), new LevelDbDataSource()); - Repository track = repository.startTracking(); - - byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); - byte[] horse = Hex.decode("13978AEE95F38490E9769C39B2773ED763D9CD5F"); - - track.addBalance(cow, BigInteger.TEN); - track.addBalance(horse, BigInteger.ONE); - - assertEquals(BigInteger.TEN, track.getBalance(cow)); - assertEquals(BigInteger.ONE, track.getBalance(horse)); - - track.commit(); - - assertEquals(BigInteger.TEN, repository.getBalance(cow)); - assertEquals(BigInteger.ONE, repository.getBalance(horse)); - - repository.close(); - } - - - @Test - public void test8() { - - SystemProperties.CONFIG.setDataBaseDir("test_db/" + RepositoryTest.class); - Repository repository = new RepositoryImpl(new LevelDbDataSource(), new LevelDbDataSource()); - Repository track = repository.startTracking(); - - byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); - byte[] horse = Hex.decode("13978AEE95F38490E9769C39B2773ED763D9CD5F"); - - track.addBalance(cow, BigInteger.TEN); - track.addBalance(horse, BigInteger.ONE); - - assertEquals(BigInteger.TEN, track.getBalance(cow)); - assertEquals(BigInteger.ONE, track.getBalance(horse)); - - track.rollback(); - - assertEquals(BigInteger.ZERO, repository.getBalance(cow)); - assertEquals(BigInteger.ZERO, repository.getBalance(horse)); - - repository.close(); - } - - @Test - public void test9() { - - SystemProperties.CONFIG.setDataBaseDir("test_db/" + RepositoryTest.class); - Repository repository = new RepositoryImpl(new LevelDbDataSource(), new LevelDbDataSource()); - Repository track = repository.startTracking(); - - byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); - byte[] horse = Hex.decode("13978AEE95F38490E9769C39B2773ED763D9CD5F"); - - DataWord cowKey = new DataWord(Hex.decode("A1A2A3")); - DataWord cowValue = new DataWord(Hex.decode("A4A5A6")); - - DataWord horseKey = new DataWord(Hex.decode("B1B2B3")); - DataWord horseValue = new DataWord(Hex.decode("B4B5B6")); - - track.addStorageRow(cow, cowKey, cowValue); - track.addStorageRow(horse, horseKey, horseValue); - - assertEquals(cowValue, track.getStorageValue(cow, cowKey)); - assertEquals(horseValue, track.getStorageValue(horse, horseKey)); - - track.commit(); - - assertEquals(cowValue, repository.getStorageValue(cow, cowKey)); - assertEquals(horseValue, repository.getStorageValue(horse, horseKey)); - - repository.close(); - } - - @Test - public void test10() { - - SystemProperties.CONFIG.setDataBaseDir("test_db/" + RepositoryTest.class); - Repository repository = new RepositoryImpl(new LevelDbDataSource(), new LevelDbDataSource()); - Repository track = repository.startTracking(); - - byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); - byte[] horse = Hex.decode("13978AEE95F38490E9769C39B2773ED763D9CD5F"); - - DataWord cowKey = new DataWord(Hex.decode("A1A2A3")); - DataWord cowValue = new DataWord(Hex.decode("A4A5A6")); - - DataWord horseKey = new DataWord(Hex.decode("B1B2B3")); - DataWord horseValue = new DataWord(Hex.decode("B4B5B6")); - - track.addStorageRow(cow, cowKey, cowValue); - track.addStorageRow(horse, horseKey, horseValue); - - assertEquals(cowValue, track.getStorageValue(cow, cowKey)); - assertEquals(horseValue, track.getStorageValue(horse, horseKey)); - - track.rollback(); - - assertEquals(null, repository.getStorageValue(cow, cowKey)); - assertEquals(null, repository.getStorageValue(horse, horseKey)); - - repository.close(); - } - - - @Test - public void test11() { - - SystemProperties.CONFIG.setDataBaseDir("test_db/" + RepositoryTest.class); - Repository repository = new RepositoryImpl(new LevelDbDataSource(), new LevelDbDataSource()); - Repository track = repository.startTracking(); - - byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); - byte[] horse = Hex.decode("13978AEE95F38490E9769C39B2773ED763D9CD5F"); - - byte[] cowCode = Hex.decode("A1A2A3"); - byte[] horseCode = Hex.decode("B1B2B3"); - - track.saveCode(cow, cowCode); - track.saveCode(horse, horseCode); - - assertArrayEquals(cowCode, track.getCode(cow)); - assertArrayEquals(horseCode, track.getCode(horse)); - - track.commit(); - - assertArrayEquals(cowCode, repository.getCode(cow)); - assertArrayEquals(horseCode, repository.getCode(horse)); - - repository.close(); - } - - - @Test - public void test12() { - - SystemProperties.CONFIG.setDataBaseDir("test_db/" + RepositoryTest.class); - Repository repository = new RepositoryImpl(new LevelDbDataSource(), new LevelDbDataSource()); - Repository track = repository.startTracking(); - - byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); - byte[] horse = Hex.decode("13978AEE95F38490E9769C39B2773ED763D9CD5F"); - - byte[] cowCode = Hex.decode("A1A2A3"); - byte[] horseCode = Hex.decode("B1B2B3"); - - track.saveCode(cow, cowCode); - track.saveCode(horse, horseCode); - - assertArrayEquals(cowCode, track.getCode(cow)); - assertArrayEquals(horseCode, track.getCode(horse)); - - track.rollback(); - - assertArrayEquals(null, repository.getCode(cow)); - assertArrayEquals(null, repository.getCode(horse)); - - repository.close(); - } - - @Test // Let's upload genesis pre-mine just like in the real world - public void test13() { - - SystemProperties.CONFIG.setDataBaseDir("test_db/" + RepositoryTest.class); - Repository repository = new RepositoryImpl(new LevelDbDataSource(), new LevelDbDataSource()); - Repository track = repository.startTracking(); - - for (PremineRaw raw : Genesis.getPremine()) { - track.addBalance(raw.getAddr(), raw.getValue().multiply(raw.getDenomination().value())); - } - - track.commit(); - - assertArrayEquals(Genesis.getInstance().getStateRoot(), repository.getRoot()); - - repository.close(); - } - - - @Test - public void test14() { - - SystemProperties.CONFIG.setDataBaseDir("test_db/" + RepositoryTest.class); - Repository repository = new RepositoryImpl(new LevelDbDataSource(), new LevelDbDataSource()); - - byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); - byte[] horse = Hex.decode("13978AEE95F38490E9769C39B2773ED763D9CD5F"); - final BigInteger ELEVEN = BigInteger.TEN.add(BigInteger.ONE); - - - // changes level_1 - Repository track1 = repository.startTracking(); - track1.addBalance(cow, BigInteger.TEN); - track1.addBalance(horse, BigInteger.ONE); - - assertEquals(BigInteger.TEN, track1.getBalance(cow)); - assertEquals(BigInteger.ONE, track1.getBalance(horse)); - - - // changes level_2 - Repository track2 = track1.startTracking(); - track2.addBalance(cow, BigInteger.ONE); - track2.addBalance(horse, BigInteger.TEN); - - assertEquals(ELEVEN, track2.getBalance(cow)); - assertEquals(ELEVEN, track2.getBalance(horse)); - - track2.commit(); - track1.commit(); - - assertEquals(ELEVEN, repository.getBalance(cow)); - assertEquals(ELEVEN, repository.getBalance(horse)); - - repository.close(); - } - - - @Test - public void test15() { - - SystemProperties.CONFIG.setDataBaseDir("test_db/" + RepositoryTest.class); - Repository repository = new RepositoryImpl(new LevelDbDataSource(), new LevelDbDataSource()); - - byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); - byte[] horse = Hex.decode("13978AEE95F38490E9769C39B2773ED763D9CD5F"); - final BigInteger ELEVEN = BigInteger.TEN.add(BigInteger.ONE); - - - // changes level_1 - Repository track1 = repository.startTracking(); - track1.addBalance(cow, BigInteger.TEN); - track1.addBalance(horse, BigInteger.ONE); - - assertEquals(BigInteger.TEN, track1.getBalance(cow)); - assertEquals(BigInteger.ONE, track1.getBalance(horse)); - - // changes level_2 - Repository track2 = track1.startTracking(); - track2.addBalance(cow, BigInteger.ONE); - track2.addBalance(horse, BigInteger.TEN); - - assertEquals(ELEVEN, track2.getBalance(cow)); - assertEquals(ELEVEN, track2.getBalance(horse)); - - track2.rollback(); - track1.commit(); - - assertEquals(BigInteger.TEN, repository.getBalance(cow)); - assertEquals(BigInteger.ONE, repository.getBalance(horse)); - - repository.close(); - } - - - @Test - public void test16() { - - SystemProperties.CONFIG.setDataBaseDir("test_db/" + RepositoryTest.class); - Repository repository = new RepositoryImpl(new LevelDbDataSource(), new LevelDbDataSource()); - - byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); - byte[] horse = Hex.decode("13978AEE95F38490E9769C39B2773ED763D9CD5F"); - - byte[] cowKey1 = "key-c-1".getBytes(); - byte[] cowValue1 = "val-c-1".getBytes(); - - byte[] horseKey1 = "key-h-1".getBytes(); - byte[] horseValue1 = "val-h-1".getBytes(); - - byte[] cowKey2 = "key-c-2".getBytes(); - byte[] cowValue2 = "val-c-2".getBytes(); - - byte[] horseKey2 = "key-h-2".getBytes(); - byte[] horseValue2 = "val-h-2".getBytes(); - - // changes level_1 - Repository track1 = repository.startTracking(); - track1.addStorageRow(cow, new DataWord(cowKey1), new DataWord(cowValue1)); - track1.addStorageRow(horse, new DataWord(horseKey1), new DataWord(horseValue1)); - - assertEquals(new DataWord(cowValue1), track1.getStorageValue(cow, new DataWord(cowKey1))); - assertEquals(new DataWord(horseValue1), track1.getStorageValue(horse, new DataWord(horseKey1))); - - // changes level_2 - Repository track2 = track1.startTracking(); - track2.addStorageRow(cow, new DataWord(cowKey2), new DataWord(cowValue2)); - track2.addStorageRow(horse, new DataWord(horseKey2), new DataWord(horseValue2)); - - assertEquals(new DataWord(cowValue1), track2.getStorageValue(cow, new DataWord(cowKey1))); - assertEquals(new DataWord(horseValue1), track2.getStorageValue(horse, new DataWord(horseKey1))); - - assertEquals(new DataWord(cowValue2), track2.getStorageValue(cow, new DataWord(cowKey2))); - assertEquals(new DataWord(horseValue2), track2.getStorageValue(horse, new DataWord(horseKey2))); - - track2.commit(); - // leaving level_2 - - assertEquals(new DataWord(cowValue1), track1.getStorageValue(cow, new DataWord(cowKey1))); - assertEquals(new DataWord(horseValue1), track1.getStorageValue(horse, new DataWord(horseKey1))); - - assertEquals(new DataWord(cowValue2), track1.getStorageValue(cow, new DataWord(cowKey2))); - assertEquals(new DataWord(horseValue2), track1.getStorageValue(horse, new DataWord(horseKey2))); - - - track1.commit(); - // leaving level_1 - - assertEquals(new DataWord(cowValue1), repository.getStorageValue(cow, new DataWord(cowKey1))); - assertEquals(new DataWord(horseValue1), repository.getStorageValue(horse, new DataWord(horseKey1))); - - assertEquals(new DataWord(cowValue2), repository.getStorageValue(cow, new DataWord(cowKey2))); - assertEquals(new DataWord(horseValue2), repository.getStorageValue(horse, new DataWord(horseKey2))); - - repository.close(); - } - - - @Test - public void test17() { - - SystemProperties.CONFIG.setDataBaseDir("test_db/" + RepositoryTest.class); - Repository repository = new RepositoryImpl(new LevelDbDataSource(), new LevelDbDataSource()); - - byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); - - byte[] cowKey1 = "key-c-1".getBytes(); - byte[] cowValue1 = "val-c-1".getBytes(); - - // changes level_1 - Repository track1 = repository.startTracking(); - - // changes level_2 - Repository track2 = track1.startTracking(); - track2.addStorageRow(cow, new DataWord(cowKey1), new DataWord(cowValue1)); - assertEquals(new DataWord(cowValue1), track2.getStorageValue(cow, new DataWord(cowKey1))); - track2.rollback(); - // leaving level_2 - - track1.commit(); - // leaving level_1 - - Assert.assertEquals(Hex.toHexString(HashUtil.EMPTY_TRIE_HASH), Hex.toHexString(repository.getRoot())); - repository.close(); - } - - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/db/TrackDatabaseTest.java b/ethereumj-core/src/test/java/test/ethereum/db/TrackDatabaseTest.java deleted file mode 100644 index 604ea82f..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/db/TrackDatabaseTest.java +++ /dev/null @@ -1,67 +0,0 @@ -package test.ethereum.db; - -import org.ethereum.datasource.KeyValueDataSource; -import org.ethereum.datasource.LevelDbDataSource; -import org.ethereum.db.DatabaseImpl; -import org.ethereum.db.TrackDatabase; - -import org.iq80.leveldb.Options; - -import org.junit.AfterClass; -import org.junit.Test; - -import org.spongycastle.util.encoders.Hex; - -import java.io.File; -import java.io.IOException; - -import static org.iq80.leveldb.impl.Iq80DBFactory.factory; -import static org.junit.Assert.*; - -/** - * @author Roman Mandeleil - * @since 11.06.2014 - */ -public class TrackDatabaseTest { - - @Test - public void test1() { - - KeyValueDataSource keyValueDataSource = new LevelDbDataSource("temp"); - keyValueDataSource.init(); - - DatabaseImpl db1 = new DatabaseImpl(keyValueDataSource); - TrackDatabase trackDatabase1 = new TrackDatabase(db1); - - trackDatabase1.put(Hex.decode("abcdef"), Hex.decode("abcdef")); - byte[] value = trackDatabase1.get(Hex.decode("abcdef")); - assertEquals("abcdef", Hex.toHexString(value)); - - trackDatabase1.startTrack(); - trackDatabase1.put(Hex.decode("abcdef"), Hex.decode("ffffff")); - value = trackDatabase1.get(Hex.decode("abcdef")); - assertEquals("ffffff", Hex.toHexString(value)); - - trackDatabase1.rollbackTrack(); - value = trackDatabase1.get(Hex.decode("abcdef")); - assertEquals("abcdef", Hex.toHexString(value)); - - trackDatabase1.startTrack(); - trackDatabase1.put(Hex.decode("abcdef"), Hex.decode("ffffff")); - trackDatabase1.commitTrack(); - value = trackDatabase1.get(Hex.decode("abcdef")); - assertEquals("ffffff", Hex.toHexString(value)); - - db1.close(); - } - - @AfterClass - public static void destroyDB() { - try { - Options options = new Options(); - factory.destroy(new File("temp"), options); - } catch (IOException e) { - fail("Destroying temp-db failed"); - } - } -} diff --git a/ethereumj-core/src/test/java/test/ethereum/jsontestsuite/GitHubJSONTestSuite.java b/ethereumj-core/src/test/java/test/ethereum/jsontestsuite/GitHubJSONTestSuite.java deleted file mode 100644 index 533efac4..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/jsontestsuite/GitHubJSONTestSuite.java +++ /dev/null @@ -1,187 +0,0 @@ -package test.ethereum.jsontestsuite; - -import org.ethereum.jsontestsuite.StateTestCase; -import org.ethereum.jsontestsuite.StateTestSuite; -import org.ethereum.jsontestsuite.TestCase; -import org.ethereum.jsontestsuite.TestRunner; -import org.ethereum.jsontestsuite.TestSuite; - -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; - -import org.junit.Assert; -import org.junit.Assume; -import org.junit.runner.RunWith; -import org.junit.runners.Suite; -import org.junit.runners.Suite.SuiteClasses; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.*; - -/** - * Test file specific for tests maintained in the GitHub repository - * by the Ethereum DEV team.
- * - * @see https://github.com/ethereum/tests/ - */ -@RunWith(Suite.class) -@SuiteClasses({ - GitHubVMTest.class, -}) -public class GitHubJSONTestSuite { - - private static Logger logger = LoggerFactory.getLogger("TCK-Test"); - - - protected static void runGitHubJsonVMTest(String json, String testName) throws ParseException { - Assume.assumeFalse("Online test is not available", json.equals("")); - - JSONParser parser = new JSONParser(); - JSONObject testSuiteObj = (JSONObject) parser.parse(json); - - TestSuite testSuite = new TestSuite(testSuiteObj); - Iterator testIterator = testSuite.iterator(); - - for (TestCase testCase : testSuite.getAllTests()) { - - String prefix = " "; - if (testName.equals(testCase.getName())) prefix = " => "; - - logger.info(prefix + testCase.getName()); - } - - while (testIterator.hasNext()) { - - TestCase testCase = testIterator.next(); - if (testName.equals((testCase.getName()))) { - TestRunner runner = new TestRunner(); - List result = runner.runTestCase(testCase); - Assert.assertTrue(result.isEmpty()); - return; - } - } - } - - protected static void runGitHubJsonVMTest(String json) throws ParseException { - Set excluded = new HashSet<>(); - runGitHubJsonVMTest(json, excluded); - } - - - protected static void runGitHubJsonVMTest(String json, Set excluded) throws ParseException { - Assume.assumeFalse("Online test is not available", json.equals("")); - - JSONParser parser = new JSONParser(); - JSONObject testSuiteObj = (JSONObject) parser.parse(json); - - TestSuite testSuite = new TestSuite(testSuiteObj); - Iterator testIterator = testSuite.iterator(); - - for (TestCase testCase : testSuite.getAllTests()) { - - String prefix = " "; - if (excluded.contains(testCase.getName())) prefix = "[X] "; - - logger.info(prefix + testCase.getName()); - } - - - while (testIterator.hasNext()) { - - TestCase testCase = testIterator.next(); - if (excluded.contains(testCase.getName())) - continue; - - TestRunner runner = new TestRunner(); - List result = runner.runTestCase(testCase); - Assert.assertTrue(result.isEmpty()); - } - } - - protected static void runGitHubJsonStateTest(String json, String testName) throws ParseException { - Assume.assumeFalse("Online test is not available", json.equals("")); - - JSONParser parser = new JSONParser(); - JSONObject testSuiteObj = (JSONObject) parser.parse(json); - - StateTestSuite testSuite = new StateTestSuite(testSuiteObj); - - for (StateTestCase testCase : testSuite.getAllTests()) { - if (testCase.getName().equals(testName)) - logger.info(" => " + testCase.getName()); - else - logger.info(" " + testCase.getName()); - } - - StateTestCase testCase = testSuite.getTestCase(testName); - TestRunner runner = new TestRunner(); - List result = runner.runTestCase(testCase); - - if (!result.isEmpty()) - for (String single : result) - logger.info(single); - - Assert.assertTrue(result.isEmpty()); - } - - protected static void runGitHubJsonStateTest(String json, Set excluded) throws ParseException { - Assume.assumeFalse("Online test is not available", json.equals("")); - - JSONParser parser = new JSONParser(); - JSONObject testSuiteObj = (JSONObject) parser.parse(json); - - StateTestSuite testSuite = new StateTestSuite(testSuiteObj); - Collection testCollection = testSuite.getAllTests(); - - for (StateTestCase testCase : testSuite.getAllTests()) { - - String prefix = " "; - if (excluded.contains(testCase.getName())) prefix = "[X] "; - - logger.info(prefix + testCase.getName()); - } - - for (StateTestCase testCase : testCollection) { - - if (excluded.contains(testCase.getName())) continue; - TestRunner runner = new TestRunner(); - List result = runner.runTestCase(testCase); - - if (!result.isEmpty()) - for (String single : result) - logger.info(single); - - Assert.assertTrue(result.isEmpty()); - } - } - - - protected static void runGitHubJsonStateTest(String json) throws ParseException { - Assume.assumeFalse("Online test is not available", json.equals("")); - - JSONParser parser = new JSONParser(); - JSONObject testSuiteObj = (JSONObject) parser.parse(json); - - StateTestSuite testSuite = new StateTestSuite(testSuiteObj); - Collection testCollection = testSuite.getAllTests(); - - - for (StateTestCase testCase : testCollection) { - - TestRunner runner = new TestRunner(); - List result = runner.runTestCase(testCase); - - if (!result.isEmpty()) - for (String single : result) - logger.info(single); - - Assert.assertTrue(result.isEmpty()); - logger.info(" *** Passed: " + testCase.getName()); - } - } - - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/jsontestsuite/GitHubStateTest.java b/ethereumj-core/src/test/java/test/ethereum/jsontestsuite/GitHubStateTest.java deleted file mode 100644 index ca024050..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/jsontestsuite/GitHubStateTest.java +++ /dev/null @@ -1,125 +0,0 @@ -package test.ethereum.jsontestsuite; - -import org.ethereum.jsontestsuite.JSONReader; - -import org.json.simple.parser.ParseException; - -import org.junit.FixMethodOrder; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runners.MethodSorters; - -import java.util.HashSet; -import java.util.Set; - -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class GitHubStateTest { - - //SHACOMMIT of tested commit, ethereum/tests.git - public String shacommit = "cfb120d1793dbb14404d9991f67cfb16bf573887"; - - @Ignore - @Test // this method is mostly for hands-on convenient testing - public void stSingleTest() throws ParseException { - String json = JSONReader.loadJSONFromCommit("StateTests/stSystemOperationsTest.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonStateTest(json, "CallRecursiveBombLog2"); - } - - @Test // this method is mostly for hands-on convenient testing - public void runWithExcludedTest() throws ParseException { - - Set excluded = new HashSet<>(); - excluded.add("CallRipemd160_5"); - excluded.add("CallSha256_5"); - String json = JSONReader.loadJSONFromCommit("StateTests/stPreCompiledContracts.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonStateTest(json, excluded); - } - - @Test - public void stExample() throws ParseException { // [V] - - String json = JSONReader.loadJSONFromCommit("StateTests/stExample.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonStateTest(json); - } - - @Test // todo: fix: excluded test - public void stInitCodeTest() throws ParseException { // [V] - - Set excluded = new HashSet<>(); - String json = JSONReader.loadJSONFromCommit("StateTests/stInitCodeTest.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonStateTest(json, excluded); - } - - @Test - public void stLogTests() throws ParseException { // [V] - - String json = JSONReader.loadJSONFromCommit("StateTests/stLogTests.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonStateTest(json); - } - - @Test - public void stPreCompiledContracts() throws ParseException { - Set excluded = new HashSet<>(); - excluded.add("CallRipemd160_5"); - excluded.add("CallSha256_5"); - String json = JSONReader.loadJSONFromCommit("StateTests/stPreCompiledContracts.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonStateTest(json, excluded); - } - - @Test - public void stRecursiveCreate() throws ParseException { // [V] - - String json = JSONReader.loadJSONFromCommit("StateTests/stRecursiveCreate.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonStateTest(json); - } - - @Test - public void stRefundTest() throws ParseException { // [V] - Set excluded = new HashSet<>(); - excluded.add("refund_CallA"); - excluded.add("refund_CallA2"); - String json = JSONReader.loadJSONFromCommit("StateTests/stRefundTest.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonStateTest(json, excluded); - } - - @Test - public void stSpecialTest() throws ParseException { // [V] - - String json = JSONReader.loadJSONFromCommit("StateTests/stSpecialTest.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonStateTest(json); - } - - @Test - public void stBlockHashTest() throws ParseException { - - String json = JSONReader.loadJSONFromCommit("StateTests/stBlockHashTest.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonStateTest(json); - } - - @Ignore //Input error (too large / badly formatted input) - @Test - public void stSystemOperationsTest() throws ParseException { - - Set excluded = new HashSet<>(); - String json = JSONReader.loadJSONFromCommit("StateTests/stSystemOperationsTest.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonStateTest(json, excluded); - } - - @Test // todo: fix: excluded test - public void stTransactionTest() throws ParseException { - - Set excluded = new HashSet<>(); - //todo: it goes OOG, because no gasLimit is given. So it does not change the state. - excluded.add("HighGasLimit"); - excluded.add("RefundOverflow"); - excluded.add("UserTransactionZeroCostWithData"); - excluded.add("UserTransactionGasLimitIsTooLowWhenZeroCost"); - excluded.add("SuicidesAndInternlCallSuicides"); - excluded.add("SuicidesMixingCoinbase"); - excluded.add("CreateTransactionReverted"); - String json = JSONReader.loadJSONFromCommit("StateTests/stTransactionTest.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonStateTest(json, excluded); - } - -} - diff --git a/ethereumj-core/src/test/java/test/ethereum/jsontestsuite/GitHubVMTest.java b/ethereumj-core/src/test/java/test/ethereum/jsontestsuite/GitHubVMTest.java deleted file mode 100644 index 679bee97..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/jsontestsuite/GitHubVMTest.java +++ /dev/null @@ -1,138 +0,0 @@ -package test.ethereum.jsontestsuite; - -import org.ethereum.jsontestsuite.JSONReader; -import org.json.simple.parser.ParseException; -import org.junit.FixMethodOrder; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runners.MethodSorters; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import static org.ethereum.jsontestsuite.JSONReader.getFileNamesForTreeSha; - -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class GitHubVMTest { - - //SHACOMMIT of tested commit, ethereum/tests.git - public String shacommit = "eecee75336681dc8c0b7a2423997178eb2101f4e"; - //public List vmTestFiles = getFileNamesForTreeSha(shacommit); - - @Test - public void runSingle() throws ParseException { - String json = JSONReader.loadJSONFromCommit("VMTests/vmEnvironmentalInfoTest.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonVMTest(json, "balance0"); - } - - @Test - @Ignore - public void testArithmeticFromGitHub() throws ParseException { - Set excluded = new HashSet<>(); - excluded.add("addmod1_overflowDiff"); - excluded.add("addmod1_overflow3"); - String json = JSONReader.loadJSONFromCommit("VMTests/vmArithmeticTest.json", shacommit); - //String json = JSONReader.getTestBlobForTreeSha(shacommit, "vmArithmeticTest.json"); - GitHubJSONTestSuite.runGitHubJsonVMTest(json, excluded); - } - - @Test // testing full suite - public void testBitwiseLogicOperationFromGitHub() throws ParseException { - Set excluded = new HashSet<>(); - String json = JSONReader.loadJSONFromCommit("VMTests/vmBitwiseLogicOperationTest.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonVMTest(json, excluded); - } - - - @Test // testing full suite - public void testBlockInfoFromGitHub() throws ParseException { - Set excluded = new HashSet<>(); - String json = JSONReader.loadJSONFromCommit("VMTests/vmBlockInfoTest.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonVMTest(json, excluded); - } - - - @Test // testing full suite - public void testEnvironmentalInfoFromGitHub() throws ParseException { - Set excluded = new HashSet<>(); - excluded.add("env1"); //Bug in test runner- this passes if VM logging is on "ALL" - String json = JSONReader.loadJSONFromCommit("VMTests/vmEnvironmentalInfoTest.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonVMTest(json, excluded); - } - - - @Test // testing full suite - public void testIOandFlowOperationsFromGitHub() throws ParseException { - Set excluded = new HashSet<>(); - String json = JSONReader.loadJSONFromCommit("VMTests/vmIOandFlowOperationsTest.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonVMTest(json, excluded); - } - - @Ignore - @Test // testing random - public void testvmInputLimitsTest1FromGitHub() throws ParseException { - Set excluded = new HashSet<>(); - String json = JSONReader.loadJSONFromCommit("VMTests/vmInputLimitsTest1.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonVMTest(json, excluded); - } - - @Test // testing full suite - public void testVMLogGitHub() throws ParseException { - Set excluded = new HashSet<>(); - String json = JSONReader.loadJSONFromCommit("VMTests/vmLogTest.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonVMTest(json, excluded); - } - - @Test // testing full suite - public void testPushDupSwapFromGitHub() throws ParseException { - Set excluded = new HashSet<>(); - String json = JSONReader.loadJSONFromCommit("VMTests/vmPushDupSwapTest.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonVMTest(json, excluded); - } - - @Test // testing full suite - public void testShaFromGitHub() throws ParseException { - Set excluded = new HashSet<>(); - String json = JSONReader.loadJSONFromCommit("VMTests/vmSha3Test.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonVMTest(json, excluded); - } - - @Ignore - @Test // testing full suite - public void testvmSystemOperationsTestGitHub() throws ParseException { - Set excluded = new HashSet<>(); - String json = JSONReader.loadJSONFromCommit("VMTests/vmSystemOperationsTest.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonVMTest(json, excluded); - } - - - @Test // testing full suite - public void testVMGitHub() throws ParseException { - Set excluded = new HashSet<>(); - String json = JSONReader.loadJSONFromCommit("VMTests/vmtests.json", shacommit); - GitHubJSONTestSuite.runGitHubJsonVMTest(json, excluded); - } - - @Test // testing full suite - public void testRandomVMGitHub() throws ParseException { - - String sha = "60b921af8bf7bbe38565f8543e52a54e5f465ae8"; - List fileNames = getFileNamesForTreeSha(sha); - List excludedFiles = - Arrays.asList( - "201501150842LARGE_DATA_IN_CALLCREATE_GOjson" //Badly named file - ); - - for (String fileName : fileNames) { - - if (excludedFiles.contains(fileName)) continue; - System.out.println("Running: " + fileName); - String json = JSONReader.loadJSON("VMTests//RandomTests/" + fileName); - GitHubJSONTestSuite.runGitHubJsonVMTest(json); - } - - } - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/mine/ForkGenTest.java b/ethereumj-core/src/test/java/test/ethereum/mine/ForkGenTest.java deleted file mode 100644 index 076d8dd2..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/mine/ForkGenTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package test.ethereum.mine; - - -import org.ethereum.core.Block; -import org.ethereum.mine.Miner; - -import org.junit.Ignore; -import org.junit.Test; - -import org.spongycastle.util.encoders.Hex; - -/** - * @author Roman Mandeleil - * @since 09.11.2014 - */ -public class ForkGenTest { - - - @Test - @Ignore - public void mineOnBlock() { - - byte[] blockRaw = Hex.decode("f90139f90134a077702830ce2f66cdbf82cabd600ddb760a68b73c93739bdd439309989b22f93ba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794907a0f5f767664ac77c8e431b99e74abc9288a40a0a2deb803ea8704997ae17efd0adf038df2833505da8776f095e32174dcb8e4aba056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b840000000000000000000000000000000000000000000002000000000004000000000000020000000000000000000000000000000000000000000000000000000008301f2363c8609184e72a000830e63bb80845461623980a05643fd40385c6520e3320109adc71917fdbbcdffe61f0b476ccb3b34111af194c0c0"); - byte[] coinbase = Hex.decode("cd2a3d9f938e13cd947ec05abc7fe734df8dd826"); - - Block block = new Block(blockRaw); - Block newBlock = MinerThread.createBlock(block, coinbase); - newBlock.setStateRoot(Hex.decode("43bb67bea1931eca8f9e06f9cca66a9f9914cc3e3d4e9ceb2e08e58ab9f92bab")); - - Miner miner = new Miner(); - miner.mine(newBlock, newBlock.getDifficulty()); - - System.out.println(newBlock); - - //f8f9f8f5a0a02852f3f5e7d06936bd5f39e7cc65a9f11e37656255f92c7eb32cb878a70213a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794cd2a3d9f938e13cd947ec05abc7fe734df8dd826a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421808301ef4e518609184e72a000830e1c69808601499c9bf5dd80a0000000000000000000000000000000000000000000000000000000000000f599c0c0 - - } - - - @Test - @Ignore - public void makeFork() { - - - MineSwarm swarm = new MineSwarm(); - swarm.start(); - - - while (swarm.started.get()) { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - - } -} diff --git a/ethereumj-core/src/test/java/test/ethereum/mine/MineSwarm.java b/ethereumj-core/src/test/java/test/ethereum/mine/MineSwarm.java deleted file mode 100644 index 2f9956d8..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/mine/MineSwarm.java +++ /dev/null @@ -1,96 +0,0 @@ -package test.ethereum.mine; - -import org.ethereum.core.Block; -import org.ethereum.net.peerdiscovery.RejectionLogger; - -import org.spongycastle.util.encoders.Hex; - -import java.util.ArrayList; -import java.util.List; -import java.util.Queue; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.Executors; -import java.util.concurrent.RejectedExecutionHandler; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * @author Roman Mandeleil - * @since 08.11.2014 - */ -public class MineSwarm { - - public AtomicBoolean started = new AtomicBoolean(false); - - private ThreadFactory threadFactory; - private ThreadPoolExecutor executorPool; - private RejectedExecutionHandler rejectionHandler; - - private AtomicBoolean found = new AtomicBoolean(false); - List workers = new ArrayList<>(); - - private Queue blockAppearQueue = new ConcurrentLinkedQueue<>(); - - public void start() { - - started.set(true); - // RejectedExecutionHandler implementation - rejectionHandler = new RejectionLogger(); - - // Get the ThreadFactory implementation to use - threadFactory = Executors.defaultThreadFactory(); - - MinerThread mt1 = new MinerThread("miner1", this, Hex.decode("2bd26d8f796719923ff13d295644f9b45db1f730")); - Thread miner1 = new Thread(mt1); - miner1.start(); - workers.add(mt1); - - MinerThread mt2 = new MinerThread("miner2", this, Hex.decode("f92c0f3e4825f09490ca264dc0cdacffeb566f06")); - Thread miner2 = new Thread(mt2); - miner2.start(); - workers.add(mt2); - - MinerThread mt3 = new MinerThread("miner3", this, Hex.decode("407d73d8a49eeb85d32cf465507dd71d507100c1")); - Thread miner3 = new Thread(mt3); - miner3.start(); - workers.add(mt3); - - while (!mt1.isDone() || !mt2.isDone() || !mt3.isDone()) { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - while (!blockAppearQueue.isEmpty()) { - System.out.println( - Hex.toHexString(blockAppearQueue.poll().getEncoded()) - ); - } - - System.out.println("miner-1: TD: " + mt1.getChain().getTotalDifficulty() + - " chain.size: " + mt1.getChain().getSize()); - - System.out.println("miner-2: TD: " + mt2.getChain().getTotalDifficulty() + - " chain.size: " + mt2.getChain().getSize()); - - System.out.println("miner-3: TD: " + mt3.getChain().getTotalDifficulty() + - " chain.size: " + mt3.getChain().getSize()); - - } - - - public void announceBlock(Block block) { - for (MinerThread mt : workers) { - mt.onNewBlock(block); - } - } - - public void addToQueue(Block block) { - synchronized (blockAppearQueue) { - blockAppearQueue.add(block); - } - } -} diff --git a/ethereumj-core/src/test/java/test/ethereum/mine/MinerThread.java b/ethereumj-core/src/test/java/test/ethereum/mine/MinerThread.java deleted file mode 100644 index 93afc482..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/mine/MinerThread.java +++ /dev/null @@ -1,177 +0,0 @@ -package test.ethereum.mine; - -import org.ethereum.core.Block; -import org.ethereum.core.BlockHeader; -import org.ethereum.core.Chain; -import org.ethereum.core.Genesis; -import org.ethereum.mine.Miner; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.spongycastle.util.encoders.Hex; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Roman Mandeleil - * @since 22.05.2014 - */ -public class MinerThread implements Runnable { - - - private final static Logger logger = LoggerFactory.getLogger("miner"); - private final byte[] coinbase; - - private MineSwarm mineSwarm; - private String name; - private boolean done = false; - private Miner miner = new Miner(); - - private Chain mainChain = new Chain(); - private List altChains = new ArrayList<>(); - private Block tmpBlock = null; - private List uncles = new ArrayList<>(); - - private Block announcedBlock = null; - - public MinerThread(String name, MineSwarm mineSwarm, byte[] coinbase) { - this.name = name; - this.mineSwarm = mineSwarm; - this.coinbase = coinbase; - - Block genesis = Genesis.getInstance(); - mainChain.add(genesis); - - } - - @Override - public void run() { - logger.debug("{} start", name); - doRun(); - logger.debug("{} end", name); - } - - public void onNewBlock(Block foundBlock) { - - if (mainChain.getLast().isEqual(foundBlock)) { - // That is our announcement, do nothing. - return; - } - - logger.info("{}: Ohh.. I heard the block was found already: {}: {} ^ {}", name, - foundBlock.getNumber(), Hex.toHexString(foundBlock.getHash()).substring(0, 6), - Hex.toHexString(foundBlock.getParentHash()).substring(0, 6)); - - - if (mainChain.getLast().isParentOf(foundBlock)) { - logger.info("{}: adding by announce to main chain. hash:{} ", name, - Hex.toHexString(foundBlock.getHash()).substring(0, 6)); - // add it as main block - announcedBlock = foundBlock; - miner.stop(); - } else { - - if (mainChain.isParentOnTheChain(foundBlock)) { - - logger.info("{} found an uncle. on index: {}", name, foundBlock.getNumber()); - // add it as a future uncle - uncles.add(foundBlock); - } else { - logger.info("{}: nothing to do, maybe alt chain: {}: {} ^ {}", name, - foundBlock.getNumber(), Hex.toHexString(foundBlock.getHash()).substring(0, 6), - Hex.toHexString(foundBlock.getParentHash()).substring(0, 6)); - } - } - } - - public void announceBlock(Block block) { - mineSwarm.announceBlock(block); - } - - private void doRun() { - - Block genesis = mainChain.getLast(); - tmpBlock = createBlock(genesis, coinbase); - while (!done) { - - this.announcedBlock = null; - logger.info("{}: before mining: chain.size: [{}], chain.TD: [{}]", name, - mainChain.getSize(), mainChain.getTotalDifficulty()); - boolean found = miner.mine(tmpBlock, tmpBlock.getDifficulty()); - logger.info("{}: finished mining, found: [{}]", name, found); - - if (!found && announcedBlock != null) { - mainChain.add(announcedBlock); - tmpBlock = createBlock(announcedBlock, coinbase); - } - - if (found) { - mineSwarm.addToQueue(tmpBlock); - logger.info("{}: mined block: {} --> {} ^ {}", name, tmpBlock.getNumber(), - Hex.toHexString(tmpBlock.getHash()).substring(0, 6), - Hex.toHexString(tmpBlock.getParentHash()).substring(0, 6)); - if (announcedBlock != null) - logger.info("{}: forked on: {}", name, tmpBlock.getNumber()); - - logger.info("{}: adding to main chain. hash:{} ", name, - Hex.toHexString(tmpBlock.getHash()).substring(0, 6)); - mainChain.add(tmpBlock); - sleep(); - announceBlock(tmpBlock); - tmpBlock = createBlock(tmpBlock, coinbase); - } - - if (!uncles.isEmpty()) { - for (Block uncle : uncles) { - BlockHeader uncleHeader = uncle.getHeader(); - tmpBlock.addUncle(uncleHeader); - logger.info("{} adding {} uncles to block: {}", name, uncles.size(), tmpBlock.getNumber()); - } - uncles.clear(); - } - - if (mainChain.getSize() == 100) done = true; - } - - } - - - public static Block createBlock(Block lastBlock, byte[] coinbase) { - - long timeDiff = System.currentTimeMillis() - lastBlock.getTimestamp(); - - byte[] difficulty = lastBlock.getDifficulty(); -// if (timeDiff < 5000){ -// System.out.println("increase"); -// BigInteger diff = (new BigInteger(1, lastBlock.getDifficulty()).add(new BigInteger("FFF", 16))); -// difficulty = diff.toByteArray(); -// } - - Block newBlock = new Block(lastBlock.getHash(), lastBlock.getUnclesHash(), coinbase, lastBlock.getLogBloom(), - difficulty, lastBlock.getNumber() + 1, - lastBlock.getGasLimit(), lastBlock.getGasUsed(), System.currentTimeMillis() / 1000, - null, null, null, null); - - return newBlock; - } - - public boolean isDone() { - return done; - } - - public Chain getChain() { - return mainChain; - } - - private void sleep() { - try { - Thread.sleep(500); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/net/BlockHashesMessageTest.java b/ethereumj-core/src/test/java/test/ethereum/net/BlockHashesMessageTest.java deleted file mode 100644 index 568d21dd..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/net/BlockHashesMessageTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package test.ethereum.net; - -import org.ethereum.net.eth.BlockHashesMessage; -import org.ethereum.net.eth.EthMessageCodes; - -import org.junit.Test; - -import org.spongycastle.util.encoders.Hex; - -import java.util.Arrays; -import java.util.List; - -import static org.junit.Assert.assertEquals; - -public class BlockHashesMessageTest { - - /* BLOCK_HASHES_MESSAGE */ - - @Test /* BlockHashesMessage 1 from network */ - public void test_1() { - - String blockHashesMessageRaw = "f9108114a04ee6424d776b3f59affc20bc2de59e67f36e22cc07897ff8df152242c921716ba07d2fe4df0dbbc9011da2b3bf177f0c6b7e71a11c509035c5d751efa5cf9b4817a0e32d9ac70a95a5084447143cba713ceae2cae614e79817bf76fc081480509912a07167d51e20b6bdd1457101b81300519f9eeb741008ba45ff9682912b96cc3231a05dc40186092d08fdb83e938774b318ce598ed3b44f2b0382cd8991d912135a08a08b7036a775a190094c4eb994a0e7a2f89ffa59d1f3461bd1de104f37aa0098eca0b0301705ba576e32d9e47fc5983fa49ba5e8f00e3e2d0a7e1b281a9625445ff5a033124a8da5113edff6afe4fb5efece3741895a7fba3d1c167586f4c3374f1d78a03c1aa5542d3fdafbd7b03c2085bcc940343f26b9711f8a215c4ea3f84364472fa0c959599f529ac1f085c4f9aadc0a17aad1c61311b0ad6b4e3f4a12eb3f93ad76a0eb26c71de8706185a717e21753b6e47e2d4b34e00e034f64b6c76f2de3af7f75a0e679e8b274cca37c2e449b993eb2228d062a78b4406f9323fa48fa182de640f3a0df26cd027609ad25739a041b3d9d81705b4fa73c86f6df04b836984e8b4c8489a0cfaad0dba4a266e9ccbf7474079647a4ac659d93f071091c90d454c1af48ae25a06f5232f5058b5b70fcd28070dfe716a6327b899d639cff2106b9907978c6dc7ca0ba3266b0a3877b4a81e8f6dd6c36aeb587a1a14acd10976d3ed6f686a35d8c13a08014d1ff07221b83a1996e6b80546310d430589f7cd6a9137e16f14c3a49e855a0dfce9bc6e8947b440f03a86f37ae639a4446ed27d8f56f9c7c1b00e9fc120aa2a03cfd099c3e1c974284477f6366b242372833ff6f618b4fd94d9cefb9912eaee4a085c4ac37b8a8d466dc66870838ccdec34a5df6f6548bf6c06cbb645f6980491ea0f3085b2449501113981af5274706a9dfea891fb28a6228375ba2cd28970d37fda0a63e45fcc5050d52a0eaee0a0c118e1b94c8ee6f2312e01f143f27fd360aee67a0c51c71816bf7c79475a7ebc1f1dcd6137e0950c4db57d7b947372751c114b6bea05e66b8849b5a2e90d98663c0428ca7c7483fbe8bcd1ae77f9dfd91fccb7a66ffa008a1e472e019b8f5b3b899ad1185c0fe953ee336ae3fe807cceca5e47728bcdda04700e66f3a96965ab08a7760f0ac9f15f4a282cfc09a50dce09e573e27054a3aa0c820e85e4b5bbf8f19f44e00b9ac43bbc2148f599b48c1257088616cf1909d50a0201bd78f79fded601eaa4b7484b079bf5e6214ee25b633988008ffbc2ff6fe86a033cb48d0197a0dfddd1ad4623df688784bbba4ada03a80ac560cf4f92d3eaf7fa053f100fa3088a48c17dba35efcf96a4c02a15a136d16c9b32bafff5771e969f2a0ab3db92acb1f5552c90d65efb93ba505d7390db6cfe2ddd7768282931b9d0e64a0e6cec0ca20da89288461e69d6e5eaaf466cc15feab145206a0f9e19783aab0b5a0c6bff7771c8d4d59dfe39abbc980b0e21fc68295961a0804139f10ce827e7f2da02bb1ce267a1fb3757daeebfc8ecac8ad417b66fa6a5211d3fc1cf2f6f401a048a06393a130996fce7024030531869d66ad4ed0264bc6efc34ebc246e9b739baf14a013ca792bb72a8f6f641af3d9c7ba4739181b6fbffecea9319fa3afe9185fe996a03330c6e385b275391ed715867746c8fb9eb7b6b939e9a2ca561593e54148618ba00accdcad654f4a9fdefd7a69cabc47e02a60840b93890a70b4e378189933264aa0a0e507ee34150a0cb777254a6fb5fc658d19f03fe00be84d6c2fb92eff1bf008a0319e9bc452c23f7dae6368729a6f6ce7c557a3f4c8c031902a84d07a0ad7279aa0b46e49cbe43a01deef74bb03727987822678f840f665251c4fe060c4d43cef99a0c6c820d402c873b50adc53582195f97ba4dcea02c4aac1f37680c1c5b786d3a1a070740ab0275db1cb4f06d1e7320984b3ad708dfbd999879e5bde12cda5641583a0b537199eabbf6aaa120ab4c3cbeed02311f2e2e7158b5f3a239147522d1c001aa0bdeaf137c59ee9985dcbae18410a223bd0cc061659ae76c85bff34c3831f4181a079a4d2a87b47f848524378abc99dd6b205ee19af316c8f3769f6ad870745845fa037dc76bdad66f0fb907b3244eb64c4193e3d84b4c81c0c2e006ad57866db0d48a071aaa649a631f724f95e71dd78dd97b69ab93d75082042944b76333c51bc6e85a0a22b3c6eb1b43fc1ffa79a6ff78255074cff4db7d3bbafae7ae13c3b493eeb5aa06426f3bc465d89db7fee576b1f97c97f13744dfa33561ece7e0d38bbcd34e9f0a0ff62c6aa7567b262f31fbcc794ac46bd96504ccb8f98451ea034b8aa434c6bcca06b942d48699b609829f1ecc89db076d59faec6664af3dc2b13da46d40daa9763a05f325608455045794b77a5fd8f2ed12e7cda40df2d8aeeec7e5a517b455a8157a0c054b8bd53545d78206de7fa0c8e206997d9c68f435fe06c3057f9545ba196f0a08ad94a4c53c397f3c63bffdcd790486c3f7588d155d6d86e0ff08907c7f7f682a0c3d9f991dac6c0e3ba032b6da7bc0cdc38c8c76e95a12c4f86326d09a2d69754a01b1cba8bdcbbbf02b9b876194713dfaf941f3f03bfc4a91746187e001edbb20ea0ec32df0dc1ce371c866d817f90497e620efb59b1baabe1e90f00e28fb57e1823a0d3a29747ed5cfed3467687eb63adc28bc646a5c66f610f55bb840c8e59f8b360a010bcf47b3c6c09b919db63b8e054458fad45f1dd8ca8cfda9759e5c53d90b0eba0075a78486d263b530834e88572a5e750658e263c1e3a3dc5801039101ece5ae9a0119b8487dc9ba0a2e95cb0dde90c26a70b48611baed1c9cca5ec73c161e8c98fa032c248078737a2f8542e70edf44854f87544b540a47c55292a0c718c57fa4578a0f38d4b93d2edc95ed526dc7f65d01bddbfb1e3e14f9a870bc3b23b164db62b24a030649acc70269c05316bfa3c20452ea21cff552c1e4da38e3fdde05371027660a000db5540f1ffd4d21aa351c511806e675cc3348604322c34e28970f9060e8d9fa06be5873726f8a76871141255c1332f4b1fb11906a5ab352ac1c8f262f2a0a817a0ae40366642d2f4d6b19e61978e84a27170648315bf93772bd9771f55abd61bbba0b8e6e8cb6008ae9a73a8d6b6d04e25d24e87b2f6f20a6714e59032550e37e213a0db0272777c2a5b49a89852bc5858bb531a7b37d08f72a4a5a9d109a40788d8c6a0d6fef3c812213467205f47f3edece2d74908e8cab599a5e42425520ad6b002e3a084856e32b9e8a0a4db75b4586ae492528f427fc814c2086340d942d24a1eb3bda0121bf2d712eb87605253775a4f93cd125e3c714388c74a4a5a321a43b8fe912aa0e13b4ddd63b6bd4abfff393463c62f298238d118c134328eee255b7fc191227ea01e278eab5967765720e5b791684a9dbe3d8d46e39c5dd615de92f02419a70fcda0a26ad0b4c36c77e619fe3100b9a44447c9d16a7db1780014cf6f409ee73145d7a0d113188b5bd282b9e9fd8e58df4431725ef85098db0bc845ed3a44132cc597efa0d303b816fbfcabe1c2eb6507ed886f6c35fa423d02ba0c5b38e268dafb38231aa017786974a83c2513e69451ae7a0bfed75f4fe09b194ae979a467e6f615bc08f1a07bde7299bbae3ff0178eae928f465070a88db0df33c4c3de53c681b8eaf17f1aa0d0c0e668f5bd6bd36b727688ba6212128390400ae3f00b42be3c2b587db24b75a0ee437f296d523f07de580979e598e522a05c0025ea8f79c7fbdbee0b679c3382a01cb65eaf5a15bd573d26fb4100208dd9389f87c1151bf46f77e6df8e3a113638a05c707c3a379ef1e2587dd0c60b252e8eb62992f0e6f3c2d7a964f0c6e9fbc3cda05ba3646ffacb6cf0cd648b4d471105291a217b23e118581f02ecd0b73fdb4691a0c102b0807c0f495eea1fa1000b9eedb2f692ab7e71c9dd47e83792e4153d3145a0ee15b8a5ef01c5fcfa73f29028b5310268302bcdf1a1a58a30d3027f375e08fda0d44965bf82d2c77e3e92d1c0e1091f87858c5e1b11b61db46feb57ebd7c046c5a04f34602a1e223e5e1325d3f55e0d8c10c0cacfdf490eb909c105876d62cb6912a0fbdc0438cd3cb503bff3f206cea3a02728ca7abd1b3316c5c1ed5cd59a79cc1ba00f628b7c8c50137b0c78ef962f6e6ee299b6600caa1dcd492c162041e2cfa893a0d9bb3e9b92d2246f00d2f28b544c9cd8c187d31d8a9f3d96a4368df575156d0ea0fa7159b9b87ea9943d12f4003e49c90b436a0654bb6ce6bcc979a7decc45ee1ca095052c3e80bedc1cb11aa0944fef5bcdc0e270fac53f8a416e7bad469e8cbbf6a0b83edf3de91030ee463552f8297d190b11068f5419d77c34e7e461f09443be35a0e4f4c4a3041e89f801e366aa6816e951d90d95ac87764fe1fe9bca9b224fb34da0796a235e7afb0160ed5a13a59649ac3ca5fda480a416741f8e9f6d6bf047d59aa041171c6698700a5f8519250d560053e4cc0696d9c878f3bc2aae47bd80918baea0c2918de602864702d9cb82ec306ff3167c687847caa0cabf707bb7691d9cd35da092c31980bd54614ce7b942d22c99200c2348b78d830ecc07775f4d72994df6b7a095f5cdbc3780f2214fc646c00cba5207c57c710ec01d3ab1c99b57d2985ae110a0b3cb73c4db8f9804456053c56ca19b0c7192a01e0b9df8d2438511fc36392be5a005e6f2ff464bbbac673aa2265b2e539e1de710cb5fa478ceda3f86572d4f22c2a0142bbc3c5165103b52b03d3ac7649d27f28f8d23244203f2dad6ac0f86c23288a06ee55fe32ec8b5832c099e83d802e24bc7b2d8255c9e4cdbcb28b190f06643eda0d119d6a03a7f77fd5af0804e1d0a1cd7e4b22b39b8554811fa014949db2791fca00fcd650300dc9383c6a3c4530e63cc29e28c8a773950faf2b886d805a1075ba3a0d4d65579b429665f8eece57164610cddde236e67d4a3a8e9ab518d19b4a5d6f4a07f3db2b8df96ff63907ac11dcca8f499bbb9a1e1ed021d13c6c29d1ef3337439a0ed254029ceb98dea0a11967a0dbf50b84d262f0397a7bcaac7c95fd52090af9fa0a879c624e761b93047c76db45ef4f2408075d5cd6190bd281b4efe1f034726a5a0a07e9452ebb9ef9f56e9e05d434ae452ee9972bc7f7ff9c729117608953b146fa0ee672fc517fb4c9a957ec3a8ded2a2fd89b80c398f393e29b1e98102e8f61053a0b61db41a25bbaa6acbb468b20a0085a74edcafefd8b0d78d8ee095387d0198efa0d612101516e4cdedbd21345b4caf48f96e82233f4f361bb3f96d77925fa667ada077dc1f4a8b062581425106878839c7e210abe2b38735bb9d7db8011204327d0ca0e152b9b0ab7499bee9bdfb14c3c3dc84072669506765959b3da1f6169e4ed458a0455408387e6c5b029b0d51f7d617a4d1dc4895fa6eda09455cc2ee62c08d907ea01fb1a00145067c01d2ac77f32edede63eb8b70a4308126dd505ce7b131dff013a064254a100bc90a6976fe0c41a91f1dc4a989a849b27299a88c3c327ed2b0bf96a08b13c687cb586af34da7b53329dd884fb6f903b2dd783cf6e72643ffb0331d6da011566138aa5f1ae4634bb3157557b57ac05d0c6eaa7f3f5e7cfaadfc77f34743a09aa82ceca9faba8fd1f3d00c4da529320e90dc141d70995cb52bfafdb92873d1a0ad3ec8c67e9a836420a3de77ade645f064ae1b642272014879e18ea6c56bbcfaa077f6a32b87b81d0ff453906c5098c0146190413cb0d3d4a505af2db3402df19ba0c99fb3ba58b9d24a7e07bcfe1a4de27e0563fbbf6d1c85b77f9f70c61e302f5ca03b5380620a07d1b4f0050a832a8865e58a8625df072c10bb6963a73fbc3fb649a05a29c29b6d492235af1d7978813502bea84bd1c79209374c50cd634e1fd501f7"; - - byte[] payload = Hex.decode(blockHashesMessageRaw); - BlockHashesMessage blockHashesMessage = new BlockHashesMessage(payload); - System.out.println(blockHashesMessage); - - assertEquals(EthMessageCodes.BLOCK_HASHES, blockHashesMessage.getCommand()); - assertEquals(128, blockHashesMessage.getBlockHashes().size()); - // TODO maybe also assert values for individual hashes - assertEquals(null, blockHashesMessage.getAnswerMessage()); - } - - @Test /* BlockHashesMessage 2 from new */ - public void test_2() { - List blockHashes = Arrays.asList( - Hex.decode("4ee6424d776b3f59affc20bc2de59e67f36e22cc07897ff8df152242c921716b"), - Hex.decode("7d2fe4df0dbbc9011da2b3bf177f0c6b7e71a11c509035c5d751efa5cf9b4817") - ); - BlockHashesMessage blockHashesMessage = new BlockHashesMessage(blockHashes); - System.out.println(blockHashesMessage); - - String expected = "f84304a04ee6424d776b3f59affc20bc2de59e67f36e22cc07897ff8df152242c921716ba07d2fe4df0dbbc9011da2b3bf177f0c6b7e71a11c509035c5d751efa5cf9b4817"; - assertEquals(expected, Hex.toHexString(blockHashesMessage.getEncoded())); - - assertEquals(EthMessageCodes.BLOCK_HASHES, blockHashesMessage.getCommand()); - assertEquals(2, blockHashesMessage.getBlockHashes().size()); - // TODO maybe also assert values for individual hashes - assertEquals(null, blockHashesMessage.getAnswerMessage()); - } -} diff --git a/ethereumj-core/src/test/java/test/ethereum/net/BlocksMessageTest.java b/ethereumj-core/src/test/java/test/ethereum/net/BlocksMessageTest.java deleted file mode 100644 index 0ebc707d..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/net/BlocksMessageTest.java +++ /dev/null @@ -1,125 +0,0 @@ -package test.ethereum.net; - -import org.ethereum.core.Block; -import org.ethereum.net.eth.BlocksMessage; - -import org.junit.Ignore; -import org.junit.Test; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.spongycastle.util.encoders.Hex; - -import java.io.File; -import java.io.IOException; - -import java.net.URISyntaxException; -import java.net.URL; - -import java.nio.file.Files; - -import java.util.List; - -import static org.junit.Assert.assertEquals; - -@Ignore -public class BlocksMessageTest { - - private static final Logger logger = LoggerFactory.getLogger("test"); - - /* BLOCKS */ - - @Test /* BlocksMessage really big message parsing */ - public void test_1() { - - String blocksRaw = "f9339416f93390f90138a0ebc60a31c19975e4b0e965d450f76343b3329f170d1669c0748a0f20ef75b705a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347947fda239cccacf704ecd59ff2d21b27f40f40e9cfa054fb8d2f4641518b8ef6919fe2489e9ab85e811d32d1e95338c286779393cc06a0cba2daf227a25589c73cba8c02d90a68c6172a76276b3de27d1e5408585ab361a04f74441e5e3d67ecc99ca1852124a16004c9717d6e606dd143d15693a380d9d9b8400000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000080000000000000000002000000000000082f2f08258ff8609184e72a0008301e8488301d1b7845460278e80a0e560621eac742eb5982ea5a78c88256b63db6e161efaa72b5b537bbd90cd7257f93251f885088609184e72a00082271094a129a36146edcf524b8700420c3b16a4bb7f212280a06b696c6c000000000000000000000000000000000000000000000000000000001ba0d3b3a548bd62fd611b9bf58c65e8d457aa923686461461e8fb2cecffe849329ca04bf07edca2f3a3b13d68c89d554ea9560d4ffe070eca168c2d91b538f5920c16f9046f098609184e72a0008227108080b9041c336045557f30782066756e644164647265737300000000000000000000000000000000000060805560ff7f30782073746174696341646472657373310000000000000000000000000000005560ff7f3078207374617469634164647265737332000000000000000000000000000000556103568060c660003960006000f060a055603980608d6000396000f20060007f6b696c6c0000000000000000000000000000000000000000000000000000000060003514156031575060455433145b1560385733ff5b3360c0556103458060116000396000f20061010060e0526040355060e051546026576101668060df60003960006000f060e05155607c565b60007f7472616e736665720000000000000000000000000000000000000000000000006101201415605957503360e05154145b60615700607b565b6020356101405561016180607e60003960006000f060e051555b5b003360a05561011e8060436000396000f26000600060006000610140547f6e65774f776e657200000000000000000000000000000000000000000000000060e05154f10060007f6e65774f776e65720000000000000000000000000000000000000000000000007f616374696f6e0000000000000000000000000000000000000000000000000000141561005157503361016054145b1561005e57602035610180555b60007f76657269667900000000000000000000000000000000000000000000000000007f616374696f6e000000000000000000000000000000000000000000000000000014156100b057503361018054145b156100c157600160005260206000f2005b60007f7472616e736665720000000000000000000000000000000000000000000000007f616374696f6e0000000000000000000000000000000000000000000000000000141561011357503361018054145b1561011d5760a054505b3360a055336101405561011e8060486000396000f26000600060006000610140547f6e65774f77656e6572000000000000000000000000000000000000000000000060e05154f10060007f6e65774f776e65720000000000000000000000000000000000000000000000007f616374696f6e0000000000000000000000000000000000000000000000000000141561005157503361016054145b1561005e57602035610180555b60007f76657269667900000000000000000000000000000000000000000000000000007f616374696f6e000000000000000000000000000000000000000000000000000014156100b057503361018054145b156100c157600160005260206000f2005b60007f7472616e736665720000000000000000000000000000000000000000000000007f616374696f6e0000000000000000000000000000000000000000000000000000141561011357503361018054145b1561011d5760a054505b1ba0ada9e916e9f129dffe5e5fcf504a7ea21e2c9541d842a303ec8b8481b27a1c31a051df1ef48b6832d22bc5867e53e2d2210008a2474e7aea11d6f753f219a012cbf8850a8609184e72a00082271094467d68f943c0110bf0f34212170a12b4141b7bcc80a000000000000000000000000000000000000000000000000000000000000000de1ca040c4b0bff7a3114b8b771c70190e385e87e7edd5469c60c9127946cbd3dfb041a0f4f4daedf7a18c9e4bc062240f99204ff1076b8c04e14d86c59fb77b28cab9e7f8b50b8609184e72a0008227108080b863605780600c6000396000f20060007f6b696c6c000000000000000000000000000000000000000000000000000000006000351415604f57507f307865373162323864633065376135393762323631306636306534326334663333145b1560565733ff5b1ba0e8b009337290ec30fff9426d4f45e4fca3f981bf7cd0ea520b7140fed0fb82c0a03d360635682e8b8d59b87453c1a8570eaee13b54524ee3172622f5a4ed9e289ef8850c8609184e72a00082271094467d68f943c0110bf0f34212170a12b4141b7bcc80a06b696c6c000000000000000000000000000000000000000000000000000000001ca08370743c18e0d5f381292396696f10edd72bde41ca5611bed5e071fc88db90bca0cd19296eb49c5e1a8aeca252d5531c920296d7641f4bf763fe191f7ac164538bf8850d8609184e72a000822710948969fb72d175dfad6c7f7dc1d677ca7d49d339a880a06b696c6c000000000000000000000000000000000000000000000000000000001ba0f13e54f2bb4c5fdd7259319ec92037eaafea292bb4ae6ec76c9bbfd156df3afda0c16668c507b4ad39b2bfe051da58637ebbc670317ca7909358c9db90ab29f3d4f8850e8609184e72a000822710948969fb72d175dfad6c7f7dc1d677ca7d49d339a880a06b696c6c000000000000000000000000000000000000000000000000000000001ba0095863aa19bd0813b69c3373d91cbfc2d08018ca9c7632f8f21a408bddd9b952a0ace5ae060840a721c64c3a42607d9ceec871823a9590bc00155e5b8a1563345bf8a00f8609184e72a0008227108080b84e33604555608060465560398060156000396000f20060007f6b696c6c0000000000000000000000000000000000000000000000000000000060003514156031575060455433145b1560385733ff5b1ca04293ba8f8e4f189ab121d346b5ec4dc03a11ac1ada0eec6b905a36ed13491f59a09b582b238f915e8a3788ac11b068c23e8ef4f04f60e8c55acfef16c75ea02a52f8af108609184e72a0008227108080b85d73e71b28dc0e7a597b2610f60e42c4f3f28c6484b560455560398060246000396000f20060007f6b696c6c0000000000000000000000000000000000000000000000000000000060003514156031575060455433145b1560385733ff5b1ba06b240ce6e81f2a5316fb73cb75c79ad8fb74a341502ac0e139bbd1361a939997a05571652fc4ece5a7277fec81e58f127bcfb3da0b2b7548aeaf25683f739f4ffbf885118609184e72a00082271094e95f9bfb953a8c7d6032273d802e3ecb7ba712dd80a06b696c6c000000000000000000000000000000000000000000000000000000001ca0d4574fcdfb5155f138e3c38135db949fbdbd7f92a2621fa1074d2fa581e7bd7fa0f680c8c5ea178d06d6e64d5ff7a776b0afb334b9e75b3bb3a34d2c4f481337d3f885128609184e72a000822710948dfbf6e1e1ee8dd807eb73fba4c133efd1df45d980a06b696c6c000000000000000000000000000000000000000000000000000000001ba03579769c139925ef6bd9f1d24786b28f63bcf8b668b4198c31dc9bad1c3a6143a04b5c74ae936696f7eecf9d90509bff74f0bb39eb31d9334401fcfe42b87e9ecff8a6138609184e72a000822710948dfbf6e1e1ee8dd807eb73fba4c133efd1df45d980b840000000000000000000000000e71b28dc0e7a597b2610f60e42c4f3f28c6484b500000000000000000000000000000000000000000000000000000000000000de1ca0fa5b5c27f29b1fdc66f8b26467dcf612d7d01eba0815fa2cc65404748baa127aa09a969f0994c51ba7835dc7c822bf73e25fe2a70c8e130e1b573280f568c35656f8a6148609184e72a000822710948dfbf6e1e1ee8dd807eb73fba4c133efd1df45d980b840000000000000000000000000e71b28dc0e7a597b2610f60e42c4f3f28c6484b500000000000000000000000000000000000000000000000000000000000000de1ca0230786cf3dbda0ca46c5c57f81ad1fbdeeda73416af7d487d36b71b8815e14baa0f0f2bba02a1f4ae1387f717a4ccb9cc390636acf05b88c0edb3a499df5628387f8b3158609184e72a0008227108080b8613360455573e71b28dc0e7a597b2610f60e42c4f3f28c6484b560465560398060286000396000f20060007f6b696c6c0000000000000000000000000000000000000000000000000000000060003514156031575060455433145b1560385733ff5b1ba0b593e2837c2c5a4d45129fc10ddf86c80c0cb76f8ee53f99a87b2f6faf5d1539a057b918fde436b8ee64cea66cdcf6ec92891887ad2617012bb1dc2127846cef2bf8af168609184e72a0008227108080b85d73e71b28dc0e7a597b2610f60e42c4f3f28c6484b560455560398060246000396000f20060007f6b696c6c0000000000000000000000000000000000000000000000000000000060003514156031575060455433145b1560385733ff5b1ba0354722d04cd298f5eb86290c722ce591614600a6e8e0c207e4cd53b44f5cdd4ba03e5f5d99447f09021e48ce081872f1f3ce9d11af867184e0cf96a2db903b4df4f865178609184e72a00082271094badada73290fe66990bb7ab66c4343c02d5f4c1c80801ba0ff92367fcce5c59bf614543dbea0c0af592842953acfd50d558962d381ce4c09a0f0431652632ced2083bbbc3599f326b74d656492448cfcf90558fcefea8a947df865188609184e72a00082271094d920d79e3ab35799a3f579807c89f7f0561f1fbb80801ba0bbf7b05d3399f4eed39c61b1a4a8b85f63b778e93bcc3ffc2c5c0b4eff2ce136a06d5cac2dd10eb94432d79fe32965e62c3453244fc089940aa6128d0874beb5c1f865198609184e72a00082271094e80e7941096fc8dfc72fa42dca23e595975a54a880801ca0cd139f9807590b7ab3f1d7e85f0fd6737d6509bad98edad095d8cc5f9f2f9876a044bc64a323ad77d42257f01b329aeb61d787c13ab34f82886ecfd1590876be96f8a91a8609184e72a0008227108080b857604b80600c6000396000f20060007f6b696c6c0000000000000000000000000000000000000000000000000000000060003514156043575073e71b28dc0e7a597b2610f60e42c4f3f28c6484b533145b15604a5733ff5b1ba08c642da379173718a2609b0bd9c26a8f8aa0fe26daece557851b9893b1da26d4a0cdb7bd079f18ba55f3edbc3ebdcc88848e21226ba00728d4838bbff1c575fcc2f8851b8609184e72a00082271094e80e7941096fc8dfc72fa42dca23e595975a54a880a06b696c6c000000000000000000000000000000000000000000000000000000001ba0bebe1f6705e6ecba80b5c01877cbbc56aacad6c4142ae38a6d192c732c970240a07a3dd2c507a9f252846bb821236eda25172d5b46cf4f015e0098334f74ad2d10f8651c8609184e72a00082271094d920d79e3ab35799a3f579807c89f7f0561f1fbb80801ca0c51ff787173b97c2b929c455a8884709613ef0cf2984e2054b097b6b69f84022a09d120bb322e968e84b8c686e67df98b10f02134c397890ac8b42e1e7138dbe76f8851d8609184e72a00082271094d920d79e3ab35799a3f579807c89f7f0561f1fbb80a06b696c6c000000000000000000000000000000000000000000000000000000001ba089cc16d674ca351456dce0778babd5705555ecc1f693d0914f8375c3485cb97fa0654c61cf05df7c3fb3a4180b4529fa33056db89d70cf816a5f05e277ce69786ff8851e8609184e72a00082271094badada73290fe66990bb7ab66c4343c02d5f4c1c80a06b696c6c000000000000000000000000000000000000000000000000000000001ca0c153b670ffa323e1b10632b33607ac98c7463c2f7cff2b3022f83f6eed5b1813a0e05505d1be246b088067e0fcc3971bc01d505e75ec7a728e34892a0a94c48296f905661f8609184e72a0008227108080b90513336045557f30782066756e644164647265737300000000000000000000000000000000000060805560ff7f30782073746174696341646472657373310000000000000000000000000000005560ff7f30782073746174696341646472657373320000000000000000000000000000005561043b8060d860003960006000f060a055604b80608d6000396000f20060007f6b696c6c0000000000000000000000000000000000000000000000000000000060003514156043575073e71b28dc0e7a597b2610f60e42c4f3f28c6484b533145b15604a5733ff5b3360c05561042a8060116000396000f20060007f6b696c6c0000000000000000000000000000000000000000000000000000000060003514156043575073e71b28dc0e7a597b2610f60e42c4f3f28c6484b533145b15604a5733ff5b61010060e0526040355060e051546071576101b38060c960003960006000f060e0515560c7565b60007f7472616e73666572000000000000000000000000000000000000000000000000610120141560a457503360e05154145b60ac570060c6565b602035610140556101ae80607c60003960006000f060e051555b5b003360a055336101405561016b8060486000396000f26000600060006000610140547f6e65774f77656e6572000000000000000000000000000000000000000000000060e05154f10060007f6b696c6c000000000000000000000000000000000000000000000000000000006000351415610044575073e71b28dc0e7a597b2610f60e42c4f3f28c6484b533145b1561004c5733ff5b60007f6e65774f776e65720000000000000000000000000000000000000000000000007f616374696f6e0000000000000000000000000000000000000000000000000000141561009e57503361016054145b156100ab57602035610180555b60007f76657269667900000000000000000000000000000000000000000000000000007f616374696f6e000000000000000000000000000000000000000000000000000014156100fd57503361018054145b1561010e57600160005260206000f2005b60007f7472616e736665720000000000000000000000000000000000000000000000007f616374696f6e0000000000000000000000000000000000000000000000000000141561016057503361018054145b1561016a5760a054505b3360a05561016b8060436000396000f26000600060006000610140547f6e65774f776e657200000000000000000000000000000000000000000000000060e05154f10060007f6b696c6c000000000000000000000000000000000000000000000000000000006000351415610044575073e71b28dc0e7a597b2610f60e42c4f3f28c6484b533145b1561004c5733ff5b60007f6e65774f776e65720000000000000000000000000000000000000000000000007f616374696f6e0000000000000000000000000000000000000000000000000000141561009e57503361016054145b156100ab57602035610180555b60007f76657269667900000000000000000000000000000000000000000000000000007f616374696f6e000000000000000000000000000000000000000000000000000014156100fd57503361018054145b1561010e57600160005260206000f2005b60007f7472616e736665720000000000000000000000000000000000000000000000007f616374696f6e0000000000000000000000000000000000000000000000000000141561016057503361018054145b1561016a5760a054505b1ba02076ac62b937cf962101119216d4e103e2fae88f45a875a77a70d0193b2a4aa3a0061c25445dc00af889784cac16f2a62bfc120b1e7681c2ca914af390e602add0f885208609184e72a0008238f5944e1166d7eff58898af02cc28dde14e2f4848b04d80a06b696c6c000000000000000000000000000000000000000000000000000000001ca0d1f1a131f8c5af602b8ad00ad2277c689484fb9fae28c4e55e11ae94c86aebdaa028a7bfe9fdb9bb17240f4cb92fb9c4f29254d353fa2fe33842c920233ae79e35f885218609184e72a0008238f5948cd870f373fc63dac6e42d31a142c3d1e428d42c80a06b696c6c000000000000000000000000000000000000000000000000000000001ba0824902cf09d74a274112298fa1838662f7a2a8a69efa75d5dc5872135720dbc3a0f2a3e1e0e333da00b44598183f69d12a4ef574800848890530bd66dddaa33cf0f90566228609184e72a0008238f58080b90513336045557f30782066756e644164647265737300000000000000000000000000000000000060805560ff7f30782073746174696341646472657373310000000000000000000000000000005560ff7f30782073746174696341646472657373320000000000000000000000000000005561043b80608d60003960006000f060a055604b8060c86000396000f2003360c05561042a8060116000396000f20060007f6b696c6c0000000000000000000000000000000000000000000000000000000060003514156043575073e71b28dc0e7a597b2610f60e42c4f3f28c6484b533145b15604a5733ff5b61010060e0526040355060e051546071576101b38060c960003960006000f060e0515560c7565b60007f7472616e73666572000000000000000000000000000000000000000000000000610120141560a457503360e05154145b60ac570060c6565b602035610140556101ae80607c60003960006000f060e051555b5b003360a055336101405561016b8060486000396000f26000600060006000610140547f6e65774f77656e6572000000000000000000000000000000000000000000000060e05154f10060007f6b696c6c000000000000000000000000000000000000000000000000000000006000351415610044575073e71b28dc0e7a597b2610f60e42c4f3f28c6484b533145b1561004c5733ff5b60007f6e65774f776e65720000000000000000000000000000000000000000000000007f616374696f6e0000000000000000000000000000000000000000000000000000141561009e57503361016054145b156100ab57602035610180555b60007f76657269667900000000000000000000000000000000000000000000000000007f616374696f6e000000000000000000000000000000000000000000000000000014156100fd57503361018054145b1561010e57600160005260206000f2005b60007f7472616e736665720000000000000000000000000000000000000000000000007f616374696f6e0000000000000000000000000000000000000000000000000000141561016057503361018054145b1561016a5760a054505b3360a05561016b8060436000396000f26000600060006000610140547f6e65774f776e657200000000000000000000000000000000000000000000000060e05154f10060007f6b696c6c000000000000000000000000000000000000000000000000000000006000351415610044575073e71b28dc0e7a597b2610f60e42c4f3f28c6484b533145b1561004c5733ff5b60007f6e65774f776e65720000000000000000000000000000000000000000000000007f616374696f6e0000000000000000000000000000000000000000000000000000141561009e57503361016054145b156100ab57602035610180555b60007f76657269667900000000000000000000000000000000000000000000000000007f616374696f6e000000000000000000000000000000000000000000000000000014156100fd57503361018054145b1561010e57600160005260206000f2005b60007f7472616e736665720000000000000000000000000000000000000000000000007f616374696f6e0000000000000000000000000000000000000000000000000000141561016057503361018054145b1561016a5760a054505b60007f6b696c6c0000000000000000000000000000000000000000000000000000000060003514156043575073e71b28dc0e7a597b2610f60e42c4f3f28c6484b533145b15604a5733ff5b1ca0a40a8a2c3cfbe0b64a3d9deefd9969c5f8aef70aa5def4807192bd8ad2a4f439a0df3ed3e85ac94ecf276069e68bba1ff1e8fc8076a0b73a17156834508b65a3abf885238609184e72a0008238f594ed7e1aa4d9e666bcf997306b1cb2c5d5396107a080a06b696c6c000000000000000000000000000000000000000000000000000000001ba0598e1d956c67f1194abb7bbc3d698dad02c349e6a37ba7d681220aa3ab23671ca09856f06420cb1bcafaa5b5dbd613df56f25e198dbd5e496ca0719c3823a10610f885248609184e72a0008238f59445a82a87f0e06d36acbd45621b362faee2f9625380a06b696c6c000000000000000000000000000000000000000000000000000000001ca040a0df348b6af5e0724c0a3f64dfd91d6471aa53aa7d168039f9a32e33f4568ca02ec919453ab4468d9c47f547156dc27b8ebefe69449dfe0dfc8359a422cbe17ef885258609184e72a0008238f594ed7e1aa4d9e666bcf997306b1cb2c5d5396107a080a06b696c6c000000000000000000000000000000000000000000000000000000001ba05fdc8c131a6122e46a7d327154ccdf070aed0ae82dba05b66eade1dd816cdf00a0c02473cb22b09ef467051a11e393cef4c9da25e72a2bb8e75c18e73b518b03bbf885268609184e72a0008238f5941ee3e96e1d2af537a8aadf93f2fbce05ea2061eb80a06b696c6c000000000000000000000000000000000000000000000000000000001ba037a471a56aad4c159dd55b2994f16a4fa2cf987aef802e2da8afa6fc98e4d4f5a01ec7b53df234cbe6e7c32b6ad5d0349c5c79a55dd053ab7aec72d928b239ff99f90b67278609184e72a0008238f4941ee3e96e1d2af537a8aadf93f2fbce05ea2061eb80b90b0000000000000000000000000000000000000000000000000000000000000000ce000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000add0000000000000000000000000000000000000000000000000000000000000ada000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000face000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000def0000000000000000000000000000000000000000000000000000000000000def000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000def00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000def000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000ff00000000000000000000000000000000000000000000000000000000000000ff000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000be000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de0000000000000000000000000000000000000000000000000000000000000def000000000000000000000000000000000000000000000000000000000000000d0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000ed000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000def00000000000000000000000000000000000000000000000000000000000000ad00000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000def00000000000000000000000000000000000000000000000000000000000000ad00000000000000000000000000000000000000000000000000000000000000ad000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de1ca057b1b28d6b77749ba7638eabc1be977ed54c7333c486ccfd5e1f6cb170b67564a0512c893e3d84c2aa9ad34f621255f00ae1d5231a46859d98b1d3a1d26bd7f85df90566288609184e72a0008238f58080b90513336045557f30782066756e644164647265737300000000000000000000000000000000000060805560ff7f30782073746174696341646472657373310000000000000000000000000000005560ff7f30782073746174696341646472657373320000000000000000000000000000005561043b80608d60003960006000f060a055604b8060c86000396000f2003360c05561042a8060116000396000f20060007f6b696c6c0000000000000000000000000000000000000000000000000000000060003514156043575073e71b28dc0e7a597b2610f60e42c4f3f28c6484b533145b15604a5733ff5b61010060e0526040355060e051546071576101b38060c960003960006000f060e0515560c7565b60007f7472616e73666572000000000000000000000000000000000000000000000000610120141560a457503360e05154145b60ac570060c6565b602035610140556101ae80607c60003960006000f060e051555b5b003360a055336101405561016b8060486000396000f26000600060006000610140547f6e65774f77656e6572000000000000000000000000000000000000000000000060e05154f10060007f6b696c6c000000000000000000000000000000000000000000000000000000006000351415610044575073e71b28dc0e7a597b2610f60e42c4f3f28c6484b533145b1561004c5733ff5b60007f6e65774f776e65720000000000000000000000000000000000000000000000007f616374696f6e0000000000000000000000000000000000000000000000000000141561009e57503361016054145b156100ab57602035610180555b60007f76657269667900000000000000000000000000000000000000000000000000007f616374696f6e000000000000000000000000000000000000000000000000000014156100fd57503361018054145b1561010e57600160005260206000f2005b60007f7472616e736665720000000000000000000000000000000000000000000000007f616374696f6e0000000000000000000000000000000000000000000000000000141561016057503361018054145b1561016a5760a054505b3360a05561016b8060436000396000f26000600060006000610140547f6e65774f776e657200000000000000000000000000000000000000000000000060e05154f10060007f6b696c6c000000000000000000000000000000000000000000000000000000006000351415610044575073e71b28dc0e7a597b2610f60e42c4f3f28c6484b533145b1561004c5733ff5b60007f6e65774f776e65720000000000000000000000000000000000000000000000007f616374696f6e0000000000000000000000000000000000000000000000000000141561009e57503361016054145b156100ab57602035610180555b60007f76657269667900000000000000000000000000000000000000000000000000007f616374696f6e000000000000000000000000000000000000000000000000000014156100fd57503361018054145b1561010e57600160005260206000f2005b60007f7472616e736665720000000000000000000000000000000000000000000000007f616374696f6e0000000000000000000000000000000000000000000000000000141561016057503361018054145b1561016a5760a054505b60007f6b696c6c0000000000000000000000000000000000000000000000000000000060003514156043575073e71b28dc0e7a597b2610f60e42c4f3f28c6484b533145b15604a5733ff5b1ca0912c887cd5f1d3d02bceb22d37e7f1541174eb9fe27f63631ed351191bc150c6a04ac734ba5449651d047c389c939de9f6d6a786bd2dc5f0596b687fb9f2264017f8a6298609184e72a0008238f594a914a163554f3d049a1afeb50fa64e341f54f40080b840637265617465000000000000000000000000000000000000000000000000000061626300000000000000000000000000000000000000000000000000000000001ca044756539da1e0879bc8759a0032bc7a44efd609f81f313be9cca2d86ce636750a0b56c22f2a4856a485abc162ff7d2df32e478ae3552580019b3e2675f796f559df8852a8609184e72a0008238f594a914a163554f3d049a1afeb50fa64e341f54f40080a06b696c6c000000000000000000000000000000000000000000000000000000001ca0523a78ffef6dd132e85386150e41c8a91fe0f9bd955596b477fdf4bd6295d5a7a07e85123566e76895e99909c80b3fd8acaa90c12348b2f59f6e6c9a5be3435796f8852b8609184e72a0008238f59485b0375dcfa4e018c4cefa21681cf77303bfb2ce80a06b696c6c000000000000000000000000000000000000000000000000000000001ba0294c826752dfde0a2fabde10ae4a038a0ee047d95a366981ad5f5c59e061c9b6a034cbcbb729c61ddb71105c0245593ec1111def29f6e9629c5a841b293059b266f8842c8609184e72a0008238f5948dfbf6e1e1ee8dd807eb73fba4c133efd1df45d980a06b696c6c000000000000000000000000000000000000000000000000000000001c9fde64adaf932dcce00a7abaace8cbd5a5604e9f0ba4edae999beb2a41b7d038a02eed4f96ced86d888570ddb8d5af7fdb4d3abc69321368ff3d82230814980b60f8852d8609184e72a0008238f594a45e138444d53ee1ee925229e37a8241c2110e5980a06b696c6c000000000000000000000000000000000000000000000000000000001ba05ac414ed440b446eb0a0ddd9341fb6627c0bbff287d939abc7c1b41cf3683de6a09f2600719b016cc3c571d264a2f0a982e6fd9c4f308acb58fb37360981332a67c0"; - - byte[] payload = Hex.decode(blocksRaw); - - BlocksMessage blocksMessage = new BlocksMessage(payload); - List list = blocksMessage.getBlocks(); - logger.info(blocksMessage.toString()); - - Block block = list.get(0); - assertEquals(38, block.getTransactionsList().size()); - assertEquals(22783, block.getNumber()); - assertEquals("a6fa4bbd52734c654ce0f8420eecfc7b81fa23dd427829d40ee8a119039fba1a", - Hex.toHexString(block.getHash())); - assertEquals("54fb8d2f4641518b8ef6919fe2489e9ab85e811d32d1e95338c286779393cc06", - Hex.toHexString(block.getStateRoot())); - } - - @Test - public void test_2() { - - String blocksRaw = "f901aa16f901a6f90137a0426ec7d3a5397801f927ec43fa3bf4d632a9b78ab2726a02aaf9d92b0764e407a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794f92c0f3e4825f09490ca264dc0cdacffeb566f06a0396d2ff722ae3811cb5deb69270933c8016f2397a5189aac429bc6fc466607bba034ade8aa1bcc3aaaa9211ef3ff6c654898034e8dadcf97375c7a9bb9a0040a49a0336e21fc7b24e124884ab67adafa5bc89e03fee9612620ed790e34dc50beed68b8400000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000010000400000000000000000000082ec30820f478609184e72a0008301e8488201f484545c2bbc80a01cba64e27a88b7f679858d56439122006bb0b03688998eb0bcbad9e14a286795f869f867821a138609184e72a0008203e894885f93eed577f2fc341ebb9a5c9b2ce4465d96c40c801ca0fd5c7e9ffcba7212ba9c669022a4c32e63a167b69da3d2f984a1b30508b52764a009d0578b89c12acb48042fc5da0b1be18776e2b14112071e5913b3bdfeaf4d45c0"; - - byte[] payload = Hex.decode(blocksRaw); - - BlocksMessage blocksMessage = new BlocksMessage(payload); - List list = blocksMessage.getBlocks(); - logger.info(blocksMessage.toString()); - - Block block = list.get(0); - assertEquals(1, block.getTransactionsList().size()); - assertEquals(3911, block.getNumber()); - assertEquals("140446b9f55bbbe9bad9fe963157cf0fc6ab2d068433eb95e161847f197362b2", - Hex.toHexString(block.getHash())); - assertEquals("396d2ff722ae3811cb5deb69270933c8016f2397a5189aac429bc6fc466607bb", - Hex.toHexString(block.getStateRoot())); - } - - @Test - public void test_3() { - - String blocksRaw = "f9021316f9020ff90137a0986cff0ebad855d786464e5d080c0c4bd81289b6b08feb98df038fbc22ae3a7ca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794f92c0f3e4825f09490ca264dc0cdacffeb566f06a014fd76260a37d307936e721ed7999c61e58dfc42b2680a6de01de2aa80fece52a0a41b6702988f5c9aa4c428d050a9fbd7821c5032daeb9c04a0ce72932cb8cd58a04e4c819c66c4602657e2ca08a55cbc12ede988ebdd3ee7f2ccf2c87083039ee0b8400000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000010000400000000000000000000082f10d820eee8609184e72a0008301e8488203e884545c28ee80a0126e01943d13ca185cbb478f171af4bb3414deed270bbf4a179e9e4d191a8faff8d2f8678219878609184e72a0008203e894885f93eed577f2fc341ebb9a5c9b2ce4465d96c40c801ca0f2c8f181b6752e71f5f32184fee5d826ec1d96a93ba6fc659eb8897494ac1e99a071b43f5cb2a5b7534f9cbe492bc4baea648b434c187821ef7b2bc87973b40a89f8678219888609184e72a0008203e894885f93eed577f2fc341ebb9a5c9b2ce4465d96c40c801ca0e3799545400eb66e75c51d99eb0ffbbcc241b32fd4b8a39db49f9104111cac31a01b9fcdc1164e01f1975f74d9ec12ba92e750fbf20ea57dae527c5d185ca24db7c0"; - - byte[] payload = Hex.decode(blocksRaw); - - BlocksMessage blocksMessage = new BlocksMessage(payload); - List list = blocksMessage.getBlocks(); - logger.info(blocksMessage.toString()); - - Block block = list.get(0); - - assertEquals(2, block.getTransactionsList().size()); - assertEquals(3822, block.getNumber()); - assertEquals("faced238a53a0bf1cd13c93e9fe1329e165e6d90d1c19aa1babd7d851cebad8f", - Hex.toHexString(block.getHash())); - assertEquals("14fd76260a37d307936e721ed7999c61e58dfc42b2680a6de01de2aa80fece52", - Hex.toHexString(block.getStateRoot())); - - } - - @Ignore - @Test /* Block msg decode - found bug tool */ - public void test_4() throws URISyntaxException, IOException { - - // f8b3a014d130c317eb9440123b1db01bfb1f2e081d83200216bc032d7de2fc9ff3b46ba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794e559de5527492bcb42ec68d07df0742a98ec3f1ea063bb3d8f8428483b2dfd838bef3e7fba6df53fd088f176a4831065f36b93346a808372c7b0821e448609184e72a0008301e848808453c9b36980a078cc350ffafd409d918e0a015dcfa0bddeec4637fe266da36298577aa13173ad - - URL rlpMsg_1 = ClassLoader - .getSystemResource("rlp/rlp-msg-1.dmp"); - - File file = new File(rlpMsg_1.toURI()); - byte[] strData = Files.readAllBytes(file.toPath()); - byte[] data = Hex.decode(new String(strData)); - - BlocksMessage blocksMessage = new BlocksMessage(data); - - int size = blocksMessage.getBlocks().size(); - for (int i = 0; i < size; ++i) { - - Block block = blocksMessage.getBlocks().get(i); - - int unclesSize = block.getUncleList().size(); - for (int j = 0; j < unclesSize; ++j) { - System.out.println("*** uncle: " + Hex.toHexString(block.getUncleList().get(j).getCoinbase())); - } - - System.out.println(block); - System.out.println("==============================="); - } - } -} - diff --git a/ethereumj-core/src/test/java/test/ethereum/net/DisconnectMessageTest.java b/ethereumj-core/src/test/java/test/ethereum/net/DisconnectMessageTest.java deleted file mode 100644 index 0eb2741a..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/net/DisconnectMessageTest.java +++ /dev/null @@ -1,106 +0,0 @@ -package test.ethereum.net; - -import org.ethereum.net.message.ReasonCode; -import org.ethereum.net.p2p.DisconnectMessage; - -import org.junit.Test; - -import org.spongycastle.util.encoders.Hex; - -import static org.junit.Assert.*; - -public class DisconnectMessageTest { - - /* DISCONNECT_MESSAGE */ - - @Test /* DisconnectMessage 1 - Requested */ - public void test_1() { - - String disconnectMessageRaw = "C20100"; - byte[] payload = Hex.decode(disconnectMessageRaw); - - DisconnectMessage disconnectMessage = new DisconnectMessage(payload); - System.out.println(disconnectMessage); - - assertEquals(disconnectMessage.getReason(), ReasonCode.REQUESTED); - } - - @Test /* DisconnectMessage 2 - TCP Error */ - public void test_2() { - - String disconnectMessageRaw = "C20101"; - byte[] payload = Hex.decode(disconnectMessageRaw); - - DisconnectMessage disconnectMessage = new DisconnectMessage(payload); - System.out.println(disconnectMessage); - - assertEquals(disconnectMessage.getReason(), ReasonCode.TCP_ERROR); - } - - @Test /* DisconnectMessage 2 - from constructor */ - public void test_3() { - - DisconnectMessage disconnectMessage = new DisconnectMessage(ReasonCode.INCOMPATIBLE_NETWORK); - System.out.println(disconnectMessage); - - String expected = "c20107"; - assertEquals(expected, Hex.toHexString(disconnectMessage.getEncoded())); - - assertEquals(ReasonCode.INCOMPATIBLE_NETWORK, disconnectMessage.getReason()); - } - - @Test //handling boundary-high - public void test_4() { - - String disconnectMessageRaw = "C28080"; - byte[] payload = Hex.decode(disconnectMessageRaw); - - DisconnectMessage disconnectMessage = new DisconnectMessage(payload); - System.out.println(disconnectMessage); - - assertEquals(disconnectMessage.getReason(), ReasonCode.REQUESTED); //high numbers are zeroed - } - - @Test //handling boundary-low - public void test_5() { - - String disconnectMessageRaw = "C20000"; - byte[] payload = Hex.decode(disconnectMessageRaw); - - DisconnectMessage disconnectMessage = new DisconnectMessage(payload); - System.out.println(disconnectMessage); - - assertEquals(disconnectMessage.getReason(), ReasonCode.REQUESTED); - } - - @Test //handling boundary-low minus 1 (error) - public void test_6() { - - String disconnectMessageRaw = "C19999"; - byte[] payload = Hex.decode(disconnectMessageRaw); - - try { - DisconnectMessage disconnectMessage = new DisconnectMessage(payload); - disconnectMessage.toString(); //throws exception - assertTrue("Valid raw encoding for disconnectMessage", false); - } catch (RuntimeException e) { - assertTrue("Invalid raw encoding for disconnectMessage", true); - } - } - - @Test //handling boundary-high plus 1 (error) - public void test_7() { - - String disconnectMessageRaw = "C28081"; - byte[] payload = Hex.decode(disconnectMessageRaw); - - try { - DisconnectMessage disconnectMessage = new DisconnectMessage(payload); - disconnectMessage.toString(); //throws exception - assertTrue("Valid raw encoding for disconnectMessage", false); - } catch (RuntimeException e) { - assertTrue("Invalid raw encoding for disconnectMessage", true); - } - } -} - diff --git a/ethereumj-core/src/test/java/test/ethereum/net/GetBlockHashesMessageTest.java b/ethereumj-core/src/test/java/test/ethereum/net/GetBlockHashesMessageTest.java deleted file mode 100644 index c277d879..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/net/GetBlockHashesMessageTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package test.ethereum.net; - -import org.ethereum.net.eth.BlockHashesMessage; -import org.ethereum.net.eth.EthMessageCodes; -import org.ethereum.net.eth.GetBlockHashesMessage; - -import org.junit.Test; - -import org.spongycastle.util.encoders.Hex; - -import static org.junit.Assert.assertEquals; - -public class GetBlockHashesMessageTest { - - /* BLOCK_HASHES_MESSAGE */ - - @Test /* BlockHashesMessage 1 from network */ - public void test_1() { - String blockHashesMessageRaw = "e513a05ad1c9caeade4cdf5798e796dc87939231d9c76c20a6a33fea6dab8e9d6dd009820100"; - - byte[] payload = Hex.decode(blockHashesMessageRaw); - GetBlockHashesMessage getBlockHashesMessage = new GetBlockHashesMessage(payload); - System.out.println(getBlockHashesMessage); - - assertEquals(EthMessageCodes.GET_BLOCK_HASHES, getBlockHashesMessage.getCommand()); - assertEquals("5ad1c9caeade4cdf5798e796dc87939231d9c76c20a6a33fea6dab8e9d6dd009", Hex.toHexString(getBlockHashesMessage.getBestHash())); - assertEquals(256, getBlockHashesMessage.getMaxBlocks()); - assertEquals(BlockHashesMessage.class, getBlockHashesMessage.getAnswerMessage()); - } - - @Test /* GetBlockHashesMessage 2 from new */ - public void test_2() { - byte[] bestHash = Hex.decode("455408387e6c5b029b0d51f7d617a4d1dc4895fa6eda09455cc2ee62c08d907e"); - GetBlockHashesMessage getBlockHashesMessage = new GetBlockHashesMessage(bestHash, 128); - System.out.println(getBlockHashesMessage); - - String expected = "e403a0455408387e6c5b029b0d51f7d617a4d1dc4895fa6eda09455cc2ee62c08d907e8180"; - assertEquals(expected, Hex.toHexString(getBlockHashesMessage.getEncoded())); - - assertEquals(EthMessageCodes.GET_BLOCK_HASHES, getBlockHashesMessage.getCommand()); - assertEquals(Hex.toHexString(bestHash), Hex.toHexString(getBlockHashesMessage.getBestHash())); - assertEquals(128, getBlockHashesMessage.getMaxBlocks()); - assertEquals(BlockHashesMessage.class, getBlockHashesMessage.getAnswerMessage()); - } - - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/net/GetBlocksMessageTest.java b/ethereumj-core/src/test/java/test/ethereum/net/GetBlocksMessageTest.java deleted file mode 100644 index e1648147..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/net/GetBlocksMessageTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package test.ethereum.net; - -import org.ethereum.net.eth.BlocksMessage; -import org.ethereum.net.eth.EthMessageCodes; -import org.ethereum.net.eth.GetBlocksMessage; - -import org.junit.Test; - -import org.spongycastle.util.encoders.Hex; - -import java.util.Arrays; -import java.util.List; - -import static org.junit.Assert.assertEquals; - -public class GetBlocksMessageTest { - - /* GET_BLOCKS */ - - @Test /* GetBlocks message parsing */ - public void test_1() { - - String getBlocksMessageRaw = "f8a615a0497dcbd12fa99ced7b27cda6611f64eb13ab50e20260eec5ee6b7190e7206d54a00959bdfba5e54fcc9370e86b7996fbe32a277bab65c31a0102226f83c4d3e0f2a001a333c156485880776e929e84c26c9778c1e9b4dcb5cd3bff8ad0aeff385df0a0690e13595c9e8e4fa9a621dfed6ad828a6e8e591479af6897c979a83daf73084a0b20f253d2b62609e932c13f3bca59a22913ea5b1e532d8a707976997461ec143"; - - byte[] payload = Hex.decode(getBlocksMessageRaw); - GetBlocksMessage getBlocksMessage = new GetBlocksMessage(payload); - System.out.println(getBlocksMessage); - - assertEquals(EthMessageCodes.GET_BLOCKS, getBlocksMessage.getCommand()); - assertEquals(5, getBlocksMessage.getBlockHashes().size()); - String hash1 = "497dcbd12fa99ced7b27cda6611f64eb13ab50e20260eec5ee6b7190e7206d54"; - String hash4 = "b20f253d2b62609e932c13f3bca59a22913ea5b1e532d8a707976997461ec143"; - assertEquals(hash1, Hex.toHexString(getBlocksMessage.getBlockHashes().get(0))); - assertEquals(hash4, Hex.toHexString(getBlocksMessage.getBlockHashes().get(4))); - - assertEquals(BlocksMessage.class, getBlocksMessage.getAnswerMessage()); - } - - @Test /* GetBlocks from new */ - public void test_2() { - - List hashList = Arrays.asList( - Hex.decode("497dcbd12fa99ced7b27cda6611f64eb13ab50e20260eec5ee6b7190e7206d54"), - Hex.decode("0959bdfba5e54fcc9370e86b7996fbe32a277bab65c31a0102226f83c4d3e0f2"), - Hex.decode("01a333c156485880776e929e84c26c9778c1e9b4dcb5cd3bff8ad0aeff385df0"), - Hex.decode("690e13595c9e8e4fa9a621dfed6ad828a6e8e591479af6897c979a83daf73084"), - Hex.decode("b20f253d2b62609e932c13f3bca59a22913ea5b1e532d8a707976997461ec143")); - - GetBlocksMessage getBlocksMessage = new GetBlocksMessage(hashList); - System.out.println(getBlocksMessage); - - String expected = "f8a605a0497dcbd12fa99ced7b27cda6611f64eb13ab50e20260eec5ee6b7190e7206d54a00959bdfba5e54fcc9370e86b7996fbe32a277bab65c31a0102226f83c4d3e0f2a001a333c156485880776e929e84c26c9778c1e9b4dcb5cd3bff8ad0aeff385df0a0690e13595c9e8e4fa9a621dfed6ad828a6e8e591479af6897c979a83daf73084a0b20f253d2b62609e932c13f3bca59a22913ea5b1e532d8a707976997461ec143"; - assertEquals(expected, Hex.toHexString(getBlocksMessage.getEncoded())); - - assertEquals(EthMessageCodes.GET_BLOCKS, getBlocksMessage.getCommand()); - assertEquals(5, getBlocksMessage.getBlockHashes().size()); - assertEquals(BlocksMessage.class, getBlocksMessage.getAnswerMessage()); - } -} diff --git a/ethereumj-core/src/test/java/test/ethereum/net/GetPeersMessageTest.java b/ethereumj-core/src/test/java/test/ethereum/net/GetPeersMessageTest.java deleted file mode 100644 index c22e2ae2..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/net/GetPeersMessageTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package test.ethereum.net; - -import org.ethereum.net.p2p.GetPeersMessage; -import org.ethereum.net.p2p.P2pMessageCodes; - -import org.junit.Test; - -import org.spongycastle.util.encoders.Hex; - -import static org.junit.Assert.assertEquals; - -public class GetPeersMessageTest { - - /* GETPEERS_MESSAGE */ - - @Test - public void testGetPeers() { - - //Init - GetPeersMessage getPeersMessage = new GetPeersMessage(); - - //toString - assertEquals("[GET_PEERS]", getPeersMessage.toString()); - - //getEncoded - assertEquals("C104", Hex.toHexString(getPeersMessage.getEncoded()).toUpperCase()); - - //getAnswerMessage - assertEquals(null, getPeersMessage.getAnswerMessage()); - - //getCommand - assertEquals(P2pMessageCodes.GET_PEERS, getPeersMessage.getCommand()); - } -} - diff --git a/ethereumj-core/src/test/java/test/ethereum/net/HelloMessageTest.java b/ethereumj-core/src/test/java/test/ethereum/net/HelloMessageTest.java deleted file mode 100644 index 099fc36b..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/net/HelloMessageTest.java +++ /dev/null @@ -1,95 +0,0 @@ -package test.ethereum.net; - -import org.ethereum.net.client.Capability; -import org.ethereum.net.eth.EthHandler; -import org.ethereum.net.p2p.HelloMessage; -import org.ethereum.net.p2p.P2pHandler; -import org.ethereum.net.p2p.P2pMessageCodes; -import org.ethereum.net.shh.ShhHandler; - -import org.junit.Test; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.spongycastle.util.encoders.Hex; - -import java.util.Arrays; -import java.util.List; - -import static org.junit.Assert.assertEquals; - -public class HelloMessageTest { - - /* HELLO_MESSAGE */ - private static final Logger logger = LoggerFactory.getLogger("test"); - - //Parsing from raw bytes - @Test - public void test1() { - String helloMessageRaw = "f87a8002a5457468657265756d282b2b292f76302e372e392f52656c656173652f4c696e75782f672b2bccc58365746827c583736868018203e0b8401fbf1e41f08078918c9f7b6734594ee56d7f538614f602c71194db0a1af5a77f9b86eb14669fe7a8a46a2dd1b7d070b94e463f4ecd5b337c8b4d31bbf8dd5646"; - - byte[] payload = Hex.decode(helloMessageRaw); - HelloMessage helloMessage = new HelloMessage(payload); - logger.info(helloMessage.toString()); - - assertEquals(P2pMessageCodes.HELLO, helloMessage.getCommand()); - assertEquals(2, helloMessage.getP2PVersion()); - assertEquals("Ethereum(++)/v0.7.9/Release/Linux/g++", helloMessage.getClientId()); - assertEquals(2, helloMessage.getCapabilities().size()); - assertEquals(992, helloMessage.getListenPort()); - assertEquals( - "1fbf1e41f08078918c9f7b6734594ee56d7f538614f602c71194db0a1af5a77f9b86eb14669fe7a8a46a2dd1b7d070b94e463f4ecd5b337c8b4d31bbf8dd5646", - helloMessage.getPeerId()); - } - - //Instantiate from constructor - @Test - public void test2() { - //Init - byte version = 2; - String clientStr = "Ethereum(++)/v0.7.9/Release/Linux/g++"; - List capabilities = Arrays.asList( - new Capability(Capability.ETH, EthHandler.VERSION), - new Capability(Capability.SHH, ShhHandler.VERSION), - new Capability(Capability.P2P, P2pHandler.VERSION)); - int listenPort = 992; - String peerId = "1fbf1e41f08078918c9f7b6734594ee56d7f538614f602c71194db0a1af5a"; - - HelloMessage helloMessage = new HelloMessage(version, clientStr, capabilities, listenPort, peerId); - logger.info(helloMessage.toString()); - - assertEquals(P2pMessageCodes.HELLO, helloMessage.getCommand()); - assertEquals(version, helloMessage.getP2PVersion()); - assertEquals(clientStr, helloMessage.getClientId()); - assertEquals(3, helloMessage.getCapabilities().size()); - assertEquals(listenPort, helloMessage.getListenPort()); - assertEquals(peerId, helloMessage.getPeerId()); - - //TODO tostring? - } - - //Fail test - @Test - public void test3() { - //Init - byte version = -1; //invalid version - String clientStr = ""; //null id - List capabilities = Arrays.asList( - new Capability(null, (byte) 0), - new Capability(null, (byte) 0), - null, //null here causes NullPointerException when using toString - new Capability(null, (byte) 0)); //encoding null capabilities - int listenPort = 99999; //invalid port - String peerId = ""; //null id - - HelloMessage helloMessage = new HelloMessage(version, clientStr, capabilities, listenPort, peerId); - - assertEquals(P2pMessageCodes.HELLO, helloMessage.getCommand()); - assertEquals(version, helloMessage.getP2PVersion()); - assertEquals(clientStr, helloMessage.getClientId()); - assertEquals(4, helloMessage.getCapabilities().size()); - assertEquals(listenPort, helloMessage.getListenPort()); - assertEquals(peerId, helloMessage.getPeerId()); - } -} diff --git a/ethereumj-core/src/test/java/test/ethereum/net/NewBlockMessageTest.java b/ethereumj-core/src/test/java/test/ethereum/net/NewBlockMessageTest.java deleted file mode 100644 index 81a95471..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/net/NewBlockMessageTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package test.ethereum.net; - -import org.ethereum.core.Block; -import org.ethereum.net.eth.NewBlockMessage; - -import org.junit.Test; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.spongycastle.util.encoders.Hex; - -public class NewBlockMessageTest { - - private static final Logger logger = LoggerFactory.getLogger("test"); - - - /* NEW_BLOCK */ - - @Test - public void test_1() { - - String newBlockRaw = "f9014517f9013Bf90136a0d8faffbc4c4213d35db9007de41cece45d95db7fd6c0f129e158baa888c48eefa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794baedba0480e1b882b606cd302d8c4f5701cabac7a0c7d4565fb7b3d98e54a0dec8b76f8c001a784a5689954ce0aedcc1bbe8d13095a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b8400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083063477825fc88609184e72a0008301e8488084543ffee680a00de0b9d4a0f0c23546d31f1f70db00d25cf6a7af79365b4e058e4a6a3b69527bc0c0850177ddbebe"; - - byte[] payload = Hex.decode(newBlockRaw); - - NewBlockMessage newBlockMessage = new NewBlockMessage(payload); - logger.info(newBlockMessage.toString()); - } - - @Test - public void test_2() { - - Block block = new Block( - Hex.decode("f90277f8cfa0887ef3904d3c464cbb3ce2a7e2ce02c57b1a38caaa5013ad1202ead0fc1077baa0a962ba850109a5112e7bd3109db477014057b478772825173cc3da54cfc3264e94407d73d8a49eeb85d32cf465507dd71d507100c180a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000380830f42408086014997893f1080a000000000000000000000000000000000000000000000000000000000000018e9c0f901a2f8cfa0955f36d073ccb026b78ab3424c15cf966a7563aa270413859f78702b9e8e22cba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942bd26d8f796719923ff13d295644f9b45db1f73080a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000180830f4240808601499789326680a00000000000000000000000000000000000000000000000000000000000010da5f8cfa0717e058643634a0f80b9cf33da423d304dabaa826c586f50a783ba6c70cfd60da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794f92c0f3e4825f09490ca264dc0cdacffeb566f0680a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000280830f424080860149978936fe80a0000000000000000000000000000000000000000000000000000000000001d01f")); - byte[] diff = new byte[]{0}; - - NewBlockMessage nbm = new NewBlockMessage(block, diff); - - System.out.println(nbm.toString()); - - } - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/net/PeerTest.java b/ethereumj-core/src/test/java/test/ethereum/net/PeerTest.java deleted file mode 100644 index e4b3e0c3..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/net/PeerTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package test.ethereum.net; - -import org.ethereum.net.client.Capability; -import org.ethereum.net.p2p.Peer; - -import org.junit.Test; - -import org.spongycastle.util.encoders.Hex; - -import java.net.InetAddress; - -import java.util.ArrayList; -import java.util.List; - -import static org.junit.Assert.assertEquals; - -public class PeerTest { - - /* PEER */ - - @Test - public void testPeer() { - - //Init - InetAddress address = InetAddress.getLoopbackAddress(); - List capabilities = new ArrayList<>(); - int port = 1010; - String peerId = "1010"; - Peer peerCopy = new Peer(address, port, peerId); - - //Peer - Peer peer = new Peer(address, port, peerId); - - //getAddress - assertEquals("127.0.0.1", peer.getAddress().getHostAddress()); - - //getPort - assertEquals(port, peer.getPort()); - - //getPeerId - assertEquals(peerId, peer.getPeerId()); - - //getCapabilities - assertEquals(capabilities, peer.getCapabilities()); - - //getEncoded - assertEquals("CC847F0000018203F2821010C0", Hex.toHexString(peer.getEncoded()).toUpperCase()); - - //toString - assertEquals("[ip=" + address.getHostAddress() + " port=" + Integer.toString(port) + " peerId=" + peerId + "]", peer.toString()); - - //equals - assertEquals(true, peer.equals(peerCopy)); - assertEquals(false, peer.equals(null)); - - //hashCode - assertEquals(-1, peer.hashCode()); - } -} - diff --git a/ethereumj-core/src/test/java/test/ethereum/net/PeersMessageTest.java b/ethereumj-core/src/test/java/test/ethereum/net/PeersMessageTest.java deleted file mode 100644 index e2987e97..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/net/PeersMessageTest.java +++ /dev/null @@ -1,118 +0,0 @@ -package test.ethereum.net; - -import org.ethereum.net.client.Capability; -import org.ethereum.net.p2p.GetPeersMessage; -import org.ethereum.net.p2p.P2pMessageCodes; -import org.ethereum.net.p2p.Peer; -import org.ethereum.net.p2p.PeersMessage; - -import org.junit.Test; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.spongycastle.util.encoders.Hex; - -import java.net.InetAddress; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -import static org.junit.Assert.assertEquals; - -public class PeersMessageTest { - - /* GET_PEERS */ - private static final Logger logger = LoggerFactory.getLogger("test"); - - @Test /* GetPeersMessage */ - public void testGetPeers() { - - GetPeersMessage getPeersMessage = new GetPeersMessage(); - logger.info(getPeersMessage.toString()); - - assertEquals(P2pMessageCodes.GET_PEERS, getPeersMessage.getCommand()); - } - - /* PEERS */ - - @Test /* PeersMessage 1 from RLP */ - public void testPeers_1() { - - String peersMessageRaw = "f84b05f848846894d84870b84036659c3656c488437cceb11abeb9b9fc69b8055144a7e7db3584d03e606083f90e17a1d3021d674579407cdaaafdfeef485872ab719db9f2b6283f498bb90a71"; - byte[] payload = Hex.decode(peersMessageRaw); - - PeersMessage peersMessage = new PeersMessage(payload); - logger.info(peersMessage.toString()); - - assertEquals(1, peersMessage.getPeers().size()); - - Iterator it = peersMessage.getPeers().iterator(); - Peer peer = it.next(); - - assertEquals(P2pMessageCodes.PEERS, peersMessage.getCommand()); - assertEquals("/104.148.216.72", peer.getAddress().toString()); - assertEquals(112, peer.getPort()); - assertEquals("36659c3656c488437cceb11abeb9b9fc69b8055144a7e7db3584d03e606083f90e17a1d3021d674579407cdaaafdfeef485872ab719db9f2b6283f498bb90a71", - peer.getPeerId()); - } - - @Test /* PeersMessage 1 from constructor */ - public void testPeers_2() { - //Init - InetAddress address = InetAddress.getLoopbackAddress(); - List capabilities = new ArrayList<>(); - int port = 112; - String peerId = "36659c3656c488437cceb11abeb9b9fc69b8055144a7e7db3584d03e606083f90e" + - "17a1d3021d674579407cdaaafdfeef485872ab719db9f2b6283f498bb90a71"; - - Set peers = new HashSet<>(); - peers.add(new Peer(address, port, peerId)); - - PeersMessage peersMessage = new PeersMessage(peers); - logger.info(peersMessage.toString()); - - assertEquals(1, peersMessage.getPeers().size()); - - Iterator it = peersMessage.getPeers().iterator(); - Peer peer = it.next(); - - assertEquals(P2pMessageCodes.PEERS, peersMessage.getCommand()); - assertEquals("127.0.0.1", peer.getAddress().getHostAddress()); - assertEquals(112, peer.getPort()); - assertEquals("36659c3656c488437cceb11abeb9b9fc69b8055144a7e7db3584d03e6" + - "06083f90e17a1d3021d674579407cdaaafdfeef485872ab719db9f2b6283f498bb90a71", peer.getPeerId()); - } - - @Test /* failing test */ - public void testPeers_3() { - //Init - InetAddress address = InetAddress.getLoopbackAddress(); - List capabilities = Arrays.asList( - new Capability(null, (byte) 0), - null //null here can cause NullPointerException when using toString - ); //encoding null capabilities - int port = -1; //invalid port - String peerId = ""; //invalid peerid - - Set peers = new HashSet<>(); - peers.add(new Peer(address, port, peerId)); - - PeersMessage peersMessage = new PeersMessage(peers); - logger.info(peersMessage.toString()); - - assertEquals(1, peersMessage.getPeers().size()); - - Iterator it = peersMessage.getPeers().iterator(); - Peer peer = it.next(); - - assertEquals(P2pMessageCodes.PEERS, peersMessage.getCommand()); - assertEquals("127.0.0.1", peer.getAddress().getHostAddress()); - assertEquals(-1, peer.getPort()); - assertEquals("", peer.getPeerId()); - } -} diff --git a/ethereumj-core/src/test/java/test/ethereum/net/PingPongMessageTest.java b/ethereumj-core/src/test/java/test/ethereum/net/PingPongMessageTest.java deleted file mode 100644 index 2e2af822..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/net/PingPongMessageTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package test.ethereum.net; - -import org.ethereum.net.p2p.P2pMessageCodes; -import org.ethereum.net.p2p.PingMessage; -import org.ethereum.net.p2p.PongMessage; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class PingPongMessageTest { - - /* PING_MESSAGE & PONG_MESSAGE */ - - @Test /* PingMessage */ - public void testPing() { - - PingMessage pingMessage = new PingMessage(); - System.out.println(pingMessage); - - assertEquals(PongMessage.class, pingMessage.getAnswerMessage()); - - assertEquals(P2pMessageCodes.PING, pingMessage.getCommand()); - } - - @Test /* PongMessage */ - public void testPong() { - - PongMessage pongMessage = new PongMessage(); - System.out.println(pongMessage); - - assertEquals(P2pMessageCodes.PONG, pongMessage.getCommand()); - assertEquals(null, pongMessage.getAnswerMessage()); - } -} - diff --git a/ethereumj-core/src/test/java/test/ethereum/net/RLPXTest.java b/ethereumj-core/src/test/java/test/ethereum/net/RLPXTest.java deleted file mode 100644 index 87b0effd..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/net/RLPXTest.java +++ /dev/null @@ -1,246 +0,0 @@ -package test.ethereum.net; - -import org.ethereum.crypto.ECKey; -import org.ethereum.net.rlpx.*; -import org.ethereum.util.RLP; -import org.ethereum.util.RLPList; -import org.junit.Assert; -import org.junit.Ignore; -import org.junit.Test; -import org.slf4j.LoggerFactory; -import org.spongycastle.util.encoders.Hex; - -import java.math.BigInteger; -import java.nio.charset.Charset; -import java.util.Arrays; -import java.util.List; - -import static org.ethereum.crypto.HashUtil.sha3; -import static org.ethereum.util.ByteUtil.merge; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -public class RLPXTest { - - private static final org.slf4j.Logger logger = LoggerFactory.getLogger("test"); - - @Test // ping test - public void test1() { - - String ip = "85.65.19.231"; - int port = 30303; - ECKey key = ECKey.fromPrivate(BigInteger.TEN); - - Message ping = PingMessage.create(ip, port, key); - logger.info("{}", ping); - - byte[] wire = ping.getPacket(); - PingMessage ping2 = (PingMessage) Message.decode(wire); - logger.info("{}", ping2); - - assertEquals(ping.toString(), ping2.toString()); - - String key2 = ping2.getKey().toString(); - assertEquals(key.toString(), key2.toString()); - } - - @Ignore - @Test // pong test - public void test2() { - - byte[] token = sha3("+++".getBytes(Charset.forName("UTF-8"))); - ECKey key = ECKey.fromPrivate(BigInteger.TEN); - - Message pong = PongMessage.create(token, key); - logger.info("{}", pong); - - byte[] wire = pong.getPacket(); - PongMessage pong2 = (PongMessage) Message.decode(wire); - logger.info("{}", pong); - - assertEquals(pong.toString(), pong2.toString()); - - String key2 = pong2.getKey().toString(); - assertEquals(key.toString(), key2.toString()); - } - - @Test // neighbors message - public void test3() { - - String ip = "85.65.19.231"; - int port = 30303; - - byte[] part1 = sha3("007".getBytes(Charset.forName("UTF-8"))); - byte[] part2 = sha3("007".getBytes(Charset.forName("UTF-8"))); - byte[] id = merge(part1, part2); - - Node node = new Node(id, ip, port); - - List nodes = Arrays.asList(node); - ECKey key = ECKey.fromPrivate(BigInteger.TEN); - - Message neighbors = NeighborsMessage.create(nodes, key); - logger.info("{}", neighbors); - - byte[] wire = neighbors.getPacket(); - NeighborsMessage neighbors2 = (NeighborsMessage) Message.decode(wire); - logger.info("{}", neighbors2); - - assertEquals(neighbors.toString(), neighbors2.toString()); - - String key2 = neighbors2.getKey().toString(); - assertEquals(key.toString(), key2.toString()); - } - - @Test // find node message - public void test4() { - - byte[] id = sha3("+++".getBytes(Charset.forName("UTF-8"))); - ECKey key = ECKey.fromPrivate(BigInteger.TEN); - - Message findNode = FindNodeMessage.create(id, key); - logger.info("{}", findNode); - - byte[] wire = findNode.getPacket(); - FindNodeMessage findNode2 = (FindNodeMessage) Message.decode(wire); - logger.info("{}", findNode2); - - assertEquals(findNode.toString(), findNode2.toString()); - - String key2 = findNode2.getKey().toString(); - assertEquals(key.toString(), key2.toString()); - } - - - @Test(expected = Error.class)// failure on MDC - public void test5() { - - byte[] id = sha3("+++".getBytes(Charset.forName("UTF-8"))); - ECKey key = ECKey.fromPrivate(BigInteger.TEN); - - Message findNode = FindNodeMessage.create(id, key); - logger.info("{}", findNode); - - byte[] wire = findNode.getPacket(); - wire[64] = 0; - - FindNodeMessage findNode2 = (FindNodeMessage) Message.decode(wire); - logger.info("{}", findNode2); - - assertEquals(findNode.toString(), findNode2.toString()); - } - - - @Test - public void test6() { - - byte[] id_1 = sha3("+++".getBytes(Charset.forName("UTF-8"))); - String host_1 = "85.65.19.231"; - int port_1 = 30303; - - Node node_1 = new Node(id_1, host_1 , port_1); - Node node_2 = new Node(node_1.getRLP()); - - byte[] id_2 = node_2.getId(); - String host_2 = node_2.getHost(); - int port_2 = node_2.getPort(); - - assertEquals(Hex.toHexString(id_1), Hex.toHexString(id_2)); - assertEquals(host_1, host_2); - assertTrue(port_1 == port_2); - } - - - - @Test // Neighbors parse data - public void test7() { - - byte[] wire = - Hex.decode("d5106e888eeca1e0b4a93bf17c325f912b43ca4176a000966619aa6a96ac9d5a60e66c73ed5629c13d4d0c806a3127379541e8d90d7fcb52c33c5e36557ad92dfed9619fcd3b92e42683aed89bd3c6eef6b59bd0237c36d83ebb0075a59903f50104f90200f901f8f8528c38352e36352e31392e32333182f310b840aeb2dd107edd996adf1bbf835fb3f9a11aabb7ed3dfef84c7a3c8767482bff522906a11e8cddee969153bf5944e64e37943db509bb4cc714c217f20483802ec0f8528c38352e36352e31392e32333182e5b4b840b70cdf8f23024a65afbf12110ca06fa5c37bd9fe4f6234a0120cdaaf16e8bb96d090d0164c316aaa18158d346e9b0a29ad9bfa0404ab4ee9906adfbacb01c21bf8528c38352e36352e31392e32333182df38b840ed8e01b5f5468f32de23a7524af1b35605ffd7cdb79af4eacd522c94f8ed849bb81dfed4992c179caeef0952ecad2d868503164a434c300356b369a33c159289f8528c38352e36352e31392e32333182df38b840136996f11c2c80f231987fc4f0cbd061cb021c63afaf5dd879e7c851a57be8d023af14bc201be81588ecab7971693b3f689a4854df74ad2e2334e88ae76aa122f8528c38352e36352e31392e32333182f303b840742eac32e1e2343b89c03a20fc051854ea6a3ff28ca918d1994fe1e32d6d77ab63352131db3ed0e7d6cc057d859c114b102f49052daee3d1c5f5fdaab972e655f8528c38352e36352e31392e32333182f310b8407d9e1f9ceb66fc21787b830554d604f933be203be9366710fb33355975e874a72b87837cf28b1b9ae171826b64e3c5d178326cbf71f89b3dec614816a1a40ce38454f6b578"); - - NeighborsMessage msg1 = (NeighborsMessage) NeighborsMessage.decode(wire); - - ECKey key = ECKey.fromPrivate(BigInteger.TEN); - NeighborsMessage msg2 = (NeighborsMessage) NeighborsMessage.create(msg1.getNodes(), key); - - NeighborsMessage msg3 = (NeighborsMessage) NeighborsMessage.decode(msg2.getPacket()); - - for (int i = 0; i < msg1.getNodes().size(); ++i) { - - Node node_1 = msg1.getNodes().get(i); - Node node_3 = msg3.getNodes().get(i); - - assertEquals(node_1.toString(), node_3.toString()); - } - - System.out.println(msg1); - - } - - - @Test // FindNodeMessage parse data - public void test8() { - - byte[] wire = - Hex.decode("3770d98825a42cb69edf70ffdf8d6d2b28a8c5499a7e3350e4a42c94652339cac3f8e9c3b5a181c8dd13e491ad9229f6a8bd018d786e1fb9e5264f43bbd6ce93af9bc85b468dee651bcd518561f83cb166da7aef7e506057dc2fbb2ea582bcc00003f847b84083fba54f6bb80ce31f6d5d1ec0a9a2e4685bc185115b01da6dcb70cd13116a6bd08b86ffe60b7d7ea56c6498848e3741113f8e70b9f0d12dbfe895680d03fd658454f6e772"); - - FindNodeMessage msg1 = (FindNodeMessage) FindNodeMessage.decode(wire); - - ECKey key = ECKey.fromPrivate(BigInteger.TEN); - FindNodeMessage msg2 = FindNodeMessage.create(msg1.getTarget(), key); - - FindNodeMessage msg3 = (FindNodeMessage) FindNodeMessage.decode(msg2.getPacket()); - - Assert.assertEquals(Hex.toHexString(msg1.getTarget()), Hex.toHexString(msg3.getTarget())); - } - - @Test // Ping parse data - public void test9() { -// wire: 4c62e1b75f4003ef77032006a142bbf31772936a1e5098566b28a04a5c71c73f1f2c9f539a85458c50a554de12da9d7e69fb2507f7c0788885508d385bbe7a9538fa675712aa1eaad29902bb46eee4531d00a10fd81179e4151929f60fec4dc50001ce87302e302e302e30808454f8483c -// PingMessage: {mdc=4c62e1b75f4003ef77032006a142bbf31772936a1e5098566b28a04a5c71c73f, signature=1f2c9f539a85458c50a554de12da9d7e69fb2507f7c0788885508d385bbe7a9538fa675712aa1eaad29902bb46eee4531d00a10fd81179e4151929f60fec4dc500, type=01, data=ce87302e302e302e30808454f8483c} - - byte[] wire = - Hex.decode("4c62e1b75f4003ef77032006a142bbf31772936a1e5098566b28a04a5c71c73f1f2c9f539a85458c50a554de12da9d7e69fb2507f7c0788885508d385bbe7a9538fa675712aa1eaad29902bb46eee4531d00a10fd81179e4151929f60fec4dc50001ce87302e302e302e30808454f8483c"); - - PingMessage msg1 = (PingMessage)Message.decode(wire); - - ECKey key = ECKey.fromPrivate(BigInteger.TEN); - PingMessage msg2 = PingMessage.create(msg1.getHost(), msg1.getPort(), key); - PingMessage msg3 = (PingMessage)Message.decode(msg2.getPacket()); - - assertEquals(msg1.getHost(), msg3.getHost()); - } - - - @Test // Pong parse data - public void test10(){ -// wire: 84db9bf6a1f7a3444f4d4946155da16c63a51abdd6822ac683d8243f260b99b265601b769acebfe3c76ddeb6e83e924f2bac2beca0c802ff0745d349bd58bc6662d62d38c2a3bb3e167a333d7d099496ebd35e096c5c1ee1587e9bd11f20e3d80002e6a079d49bdba3a7acfc9a2881d768d1aa246c2486ab166f0305a863bd47c5d21e0e8454f8483c -// PongMessage: {mdc=84db9bf6a1f7a3444f4d4946155da16c63a51abdd6822ac683d8243f260b99b2, signature=65601b769acebfe3c76ddeb6e83e924f2bac2beca0c802ff0745d349bd58bc6662d62d38c2a3bb3e167a333d7d099496ebd35e096c5c1ee1587e9bd11f20e3d800, type=02, data=e6a079d49bdba3a7acfc9a2881d768d1aa246c2486ab166f0305a863bd47c5d21e0e8454f8483c} - - byte[] wire = - Hex.decode("84db9bf6a1f7a3444f4d4946155da16c63a51abdd6822ac683d8243f260b99b265601b769acebfe3c76ddeb6e83e924f2bac2beca0c802ff0745d349bd58bc6662d62d38c2a3bb3e167a333d7d099496ebd35e096c5c1ee1587e9bd11f20e3d80002e6a079d49bdba3a7acfc9a2881d768d1aa246c2486ab166f0305a863bd47c5d21e0e8454f8483c"); - - PongMessage msg1 = (PongMessage)Message.decode(wire); - - ECKey key = ECKey.fromPrivate(BigInteger.TEN); - PongMessage msg2 = PongMessage.create(msg1.getToken(), key); - - PongMessage msg3 = (PongMessage)Message.decode(msg2.getPacket()); - assertEquals( Hex.toHexString(msg1.getToken()), Hex.toHexString(msg3.getToken())); - } - - - - - -} - - - - - - - - - - diff --git a/ethereumj-core/src/test/java/test/ethereum/net/StatusMessageTest.java b/ethereumj-core/src/test/java/test/ethereum/net/StatusMessageTest.java deleted file mode 100644 index b0c8a851..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/net/StatusMessageTest.java +++ /dev/null @@ -1,79 +0,0 @@ -package test.ethereum.net; - -import org.ethereum.net.eth.StatusMessage; - -import org.junit.Test; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.spongycastle.util.encoders.Hex; - -import java.math.BigInteger; - -import static org.junit.Assert.assertEquals; - -public class StatusMessageTest { - - /* STATUS_MESSAGE */ - private static final Logger logger = LoggerFactory.getLogger("test"); - - @Test - public void test1() { - - String raw = "f84a1027808425c60144a0832056d3c93ff2739ace7199952e5365aa29f18805be05634c4db125c5340216a0955f36d073ccb026b78ab3424c15cf966a7563aa270413859f78702b9e8e22cb"; - byte[] payload = Hex.decode(raw); - StatusMessage statusMessage = new StatusMessage(payload); - - logger.info(statusMessage.toString()); - - assertEquals(39, statusMessage.getProtocolVersion()); - assertEquals("25c60144", - Hex.toHexString(statusMessage.getTotalDifficulty())); - assertEquals("832056d3c93ff2739ace7199952e5365aa29f18805be05634c4db125c5340216", - Hex.toHexString(statusMessage.getBestHash())); - } - - @Test //from constructor - public void test2() { - //Init - byte version = 39; - byte netId = 0; - byte[] difficulty = new BigInteger("25c60144", 16).toByteArray(); - byte[] bestHash = - new BigInteger("832056d3c93ff2739ace7199952e5365aa29f18805be05634c4db125c5340216", 16).toByteArray(); - byte[] genesisHash = - new BigInteger("955f36d073ccb026b78ab3424c15cf966a7563aa270413859f78702b9e8e22cb", 16).toByteArray(); - - StatusMessage statusMessage = new StatusMessage(version, netId, difficulty, bestHash, genesisHash); - - logger.info(statusMessage.toString()); - - assertEquals(39, statusMessage.getProtocolVersion()); - assertEquals("25c60144", Hex.toHexString(statusMessage.getTotalDifficulty())); - assertEquals("00832056d3c93ff2739ace7199952e5365aa29f18805be05634c4db125c5340216", - Hex.toHexString(statusMessage.getBestHash())); - assertEquals("00955f36d073ccb026b78ab3424c15cf966a7563aa270413859f78702b9e8e22cb", - Hex.toHexString(statusMessage.getGenesisHash())); - } - - @Test //fail test - public void test3() { - //Init - byte version = -1; //invalid version - byte netId = -1; //invalid netid - byte[] difficulty = new BigInteger("-1000000", 16).toByteArray(); //negative difficulty - byte[] bestHash = new BigInteger("-100000000000000000000000000", 16).toByteArray(); //invalid hash - byte[] genesisHash = new BigInteger("-1000000000000000000000000000000", 16).toByteArray(); //invalid hash - - StatusMessage statusMessage = new StatusMessage(version, netId, difficulty, bestHash, genesisHash); - - logger.info(statusMessage.toString()); - - assertEquals(-1, statusMessage.getProtocolVersion()); - assertEquals("ff000000", Hex.toHexString(statusMessage.getTotalDifficulty())); - assertEquals("ff00000000000000000000000000", Hex.toHexString(statusMessage.getBestHash())); - assertEquals("ff000000000000000000000000000000", Hex.toHexString(statusMessage.getGenesisHash())); - } -} - diff --git a/ethereumj-core/src/test/java/test/ethereum/net/TransactionsMessageTest.java b/ethereumj-core/src/test/java/test/ethereum/net/TransactionsMessageTest.java deleted file mode 100644 index 99f87ed1..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/net/TransactionsMessageTest.java +++ /dev/null @@ -1,200 +0,0 @@ -package test.ethereum.net; - -import org.ethereum.core.Transaction; -import org.ethereum.crypto.ECKey; -import org.ethereum.crypto.HashUtil; -import org.ethereum.net.eth.EthMessageCodes; -import org.ethereum.net.eth.GetTransactionsMessage; -import org.ethereum.net.eth.TransactionsMessage; -import org.ethereum.util.ByteUtil; - -import org.junit.Ignore; -import org.junit.Test; - -import org.spongycastle.util.encoders.Hex; - -import java.math.BigInteger; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; - -import static org.junit.Assert.*; - -public class TransactionsMessageTest { - - /* GET_TRANSACTIONS */ - - @Test /* GetTransactions message 1 */ - public void testGetTransactions() { - - GetTransactionsMessage getTransactionsMessage = new GetTransactionsMessage(); - System.out.println(getTransactionsMessage); - - assertEquals(EthMessageCodes.GET_TRANSACTIONS, getTransactionsMessage.getCommand()); - assertEquals(TransactionsMessage.class, getTransactionsMessage.getAnswerMessage()); - } - - /* TRANSACTIONS */ - - @Ignore - @Test /* Transactions message 1 */ - public void test_1() { - - String txsPacketRaw = "f86e12f86b04648609184e72a00094cd2a3d9f938e13cd947ec05abc7fe734df8dd826" - + "881bc16d674ec80000801ba05c89ebf2b77eeab88251e553f6f9d53badc1d800" - + "bbac02d830801c2aa94a4c9fa00b7907532b1f29c79942b75fff98822293bf5f" - + "daa3653a8d9f424c6a3265f06c"; - - byte[] payload = Hex.decode(txsPacketRaw); - - TransactionsMessage transactionsMessage = new TransactionsMessage(payload); - System.out.println(transactionsMessage); - - assertEquals(EthMessageCodes.TRANSACTIONS, transactionsMessage.getCommand()); - assertEquals(1, transactionsMessage.getTransactions().size()); - - Transaction tx = transactionsMessage.getTransactions().iterator().next(); - - assertEquals("5d2aee0490a9228024158433d650335116b4af5a30b8abb10e9b7f9f7e090fd8", Hex.toHexString(tx.getHash())); - assertEquals("04", Hex.toHexString(tx.getNonce())); - assertEquals("1bc16d674ec80000", Hex.toHexString(tx.getValue())); - assertEquals("cd2a3d9f938e13cd947ec05abc7fe734df8dd826", Hex.toHexString(tx.getReceiveAddress())); - assertEquals("64", Hex.toHexString(tx.getGasPrice())); - assertEquals("09184e72a000", Hex.toHexString(tx.getGasLimit())); - assertEquals("", ByteUtil.toHexString(tx.getData())); - - assertEquals("1b", Hex.toHexString(new byte[]{tx.getSignature().v})); - assertEquals("5c89ebf2b77eeab88251e553f6f9d53badc1d800bbac02d830801c2aa94a4c9f", Hex.toHexString(tx.getSignature().r.toByteArray())); - assertEquals("0b7907532b1f29c79942b75fff98822293bf5fdaa3653a8d9f424c6a3265f06c", Hex.toHexString(tx.getSignature().s.toByteArray())); - } - - @Ignore - @Test /* Transactions message 2 */ - public void test_2() { - - String txsPacketRaw = "f9025012f89d8080940000000000000000000000000000000000000000860918" - + "4e72a000822710b3606956330c0d630000003359366000530a0d630000003359" - + "602060005301356000533557604060005301600054630000000c588433606957" - + "1ca07f6eb94576346488c6253197bde6a7e59ddc36f2773672c849402aa9c402" - + "c3c4a06d254e662bf7450dd8d835160cbb053463fed0b53f2cdd7f3ea8731919" - + "c8e8ccf901050180940000000000000000000000000000000000000000860918" - + "4e72a000822710b85336630000002e59606956330c0d63000000155933ff3356" - + "0d63000000275960003356576000335700630000005358600035560d63000000" - + "3a590033560d63000000485960003356573360003557600035335700b84a7f4e" - + "616d655265670000000000000000000000000000000000000000000000000030" - + "57307f4e616d6552656700000000000000000000000000000000000000000000" - + "00000057336069571ba04af15a0ec494aeac5b243c8a2690833faa74c0f73db1" - + "f439d521c49c381513e9a05802e64939be5a1f9d4d614038fbd5479538c48795" - + "614ef9c551477ecbdb49d2f8a6028094ccdeac59d35627b7de09332e819d5159" - + "e7bb72508609184e72a000822710b84000000000000000000000000000000000" - + "000000000000000000000000000000000000000000000000000000002d0aceee" - + "7e5ab874e22ccf8d1a649f59106d74e81ba0d05887574456c6de8f7a0d172342" - + "c2cbdd4cf7afe15d9dbb8b75b748ba6791c9a01e87172a861f6c37b5a9e3a5d0" - + "d7393152a7fbe41530e5bb8ac8f35433e5931b"; - - byte[] payload = Hex.decode(txsPacketRaw); - - TransactionsMessage transactionsMessage = new TransactionsMessage(payload); - System.out.println(transactionsMessage); - - assertEquals(EthMessageCodes.TRANSACTIONS, transactionsMessage.getCommand()); - - assertEquals(3, transactionsMessage.getTransactions().size()); - - Iterator txIter = transactionsMessage.getTransactions().iterator(); - Transaction tx1 = txIter.next(); - txIter.next(); // skip one - Transaction tx3 = txIter.next(); - - assertEquals("1b9d9456293cbcbc2f28a0fdc67028128ea571b033fb0e21d0ee00bcd6167e5d", - Hex.toHexString(tx3.getHash())); - - assertEquals("00", - Hex.toHexString(tx3.getNonce())); - - assertEquals("2710", - Hex.toHexString(tx3.getValue())); - - assertEquals("09184e72a000", - Hex.toHexString(tx3.getReceiveAddress())); - - assertNull(tx3.getGasPrice()); - - assertEquals("0000000000000000000000000000000000000000", - Hex.toHexString(tx3.getGasLimit())); - - assertEquals("606956330c0d630000003359366000530a0d630000003359602060005301356000533557604060005301600054630000000c58", - Hex.toHexString(tx3.getData())); - - assertEquals("33", - Hex.toHexString(new byte[]{tx3.getSignature().v})); - - assertEquals("1c", - Hex.toHexString(tx3.getSignature().r.toByteArray())); - - assertEquals("7f6eb94576346488c6253197bde6a7e59ddc36f2773672c849402aa9c402c3c4", - Hex.toHexString(tx3.getSignature().s.toByteArray())); - - // Transaction #2 - - assertEquals("dde9543921850f41ca88e5401322cd7651c78a1e4deebd5ee385af8ac343f0ad", - Hex.toHexString(tx1.getHash())); - - assertEquals("02", - Hex.toHexString(tx1.getNonce())); - - assertEquals("2710", - Hex.toHexString(tx1.getValue())); - - assertEquals("09184e72a000", - Hex.toHexString(tx1.getReceiveAddress())); - - assertNull(tx1.getGasPrice()); - - assertEquals("ccdeac59d35627b7de09332e819d5159e7bb7250", - Hex.toHexString(tx1.getGasLimit())); - - assertEquals - ("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d0aceee7e5ab874e22ccf8d1a649f59106d74e8", - Hex.toHexString(tx1.getData())); - - assertEquals("1b", - Hex.toHexString(new byte[]{tx1.getSignature().v})); - - assertEquals("00d05887574456c6de8f7a0d172342c2cbdd4cf7afe15d9dbb8b75b748ba6791c9", - Hex.toHexString(tx1.getSignature().r.toByteArray())); - - assertEquals("1e87172a861f6c37b5a9e3a5d0d7393152a7fbe41530e5bb8ac8f35433e5931b", - Hex.toHexString(tx1.getSignature().s.toByteArray())); - } - - @Test /* Transactions msg encode */ - public void test_3() throws Exception { - - String expected = - "f87302f870808b00d3c21bcecceda10000009479b08ad8787060333663d19704909ee7b1903e588609184e72a000824255801ca00f410a70e42b2c9854a8421d32c87c370a2b9fff0a27f9f031bb4443681d73b5a018a7dc4c4f9dee9f3dc35cb96ca15859aa27e219a8e4a8547be6bd3206979858"; - - BigInteger value = new BigInteger("1000000000000000000000000"); - - byte[] privKey = HashUtil.sha3("cat".getBytes()); - ECKey ecKey = ECKey.fromPrivate(privKey); - - byte[] gasPrice = Hex.decode("09184e72a000"); - byte[] gas = Hex.decode("4255"); - - Transaction tx = new Transaction(null, value.toByteArray(), - ecKey.getAddress(), gasPrice, gas, null); - - tx.sign(privKey); - tx.getEncoded(); - - Set txs = new HashSet<>(Arrays.asList(tx)); - TransactionsMessage transactionsMessage = new TransactionsMessage(txs); - - assertEquals(EthMessageCodes.TRANSACTIONS, transactionsMessage.getCommand()); - assertEquals(expected, Hex.toHexString(transactionsMessage.getEncoded())); - } -} - diff --git a/ethereumj-core/src/test/java/test/ethereum/net/wire/AdaptiveMessageIdsTest.java b/ethereumj-core/src/test/java/test/ethereum/net/wire/AdaptiveMessageIdsTest.java deleted file mode 100644 index fdc5878b..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/net/wire/AdaptiveMessageIdsTest.java +++ /dev/null @@ -1,150 +0,0 @@ -package test.ethereum.net.wire; - -import org.ethereum.net.client.Capability; -import org.ethereum.net.eth.EthHandler; -import org.ethereum.net.eth.EthMessageCodes; -import org.ethereum.net.p2p.P2pHandler; -import org.ethereum.net.p2p.P2pMessageCodes; -import org.ethereum.net.shh.ShhHandler; -import org.ethereum.net.shh.ShhMessageCodes; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import java.util.Arrays; -import java.util.List; - -/** - * @author Roman Mandeleil - * @since 15.10.2014 - */ -public class AdaptiveMessageIdsTest { - - @Before - public void setUp() { - EthMessageCodes.setOffset((byte) 0x00); - ShhMessageCodes.setOffset((byte) 0x00); - } - - @After - public void tearDown() { - EthMessageCodes.setOffset((byte) 0x00); - ShhMessageCodes.setOffset((byte) 0x00); - } - - @Test - public void test1() { - - Assert.assertEquals(7, P2pMessageCodes.values().length); - - Assert.assertEquals(0, P2pMessageCodes.HELLO.asByte()); - Assert.assertEquals(1, P2pMessageCodes.DISCONNECT.asByte()); - Assert.assertEquals(2, P2pMessageCodes.PING.asByte()); - Assert.assertEquals(3, P2pMessageCodes.PONG.asByte()); - Assert.assertEquals(4, P2pMessageCodes.GET_PEERS.asByte()); - Assert.assertEquals(5, P2pMessageCodes.PEERS.asByte()); - Assert.assertEquals(15, P2pMessageCodes.USER.asByte()); - } - - @Test - public void test2() { - - Assert.assertEquals(9, EthMessageCodes.values().length); - - Assert.assertEquals(0, EthMessageCodes.STATUS.asByte()); - Assert.assertEquals(1, EthMessageCodes.GET_TRANSACTIONS.asByte()); - Assert.assertEquals(2, EthMessageCodes.TRANSACTIONS.asByte()); - Assert.assertEquals(3, EthMessageCodes.GET_BLOCK_HASHES.asByte()); - Assert.assertEquals(4, EthMessageCodes.BLOCK_HASHES.asByte()); - Assert.assertEquals(5, EthMessageCodes.GET_BLOCKS.asByte()); - Assert.assertEquals(6, EthMessageCodes.BLOCKS.asByte()); - Assert.assertEquals(7, EthMessageCodes.NEW_BLOCK.asByte()); - Assert.assertEquals(8, EthMessageCodes.PACKET_COUNT.asByte()); - - EthMessageCodes.setOffset((byte) 0x10); - Assert.assertEquals(0x10 + 0, EthMessageCodes.STATUS.asByte()); - Assert.assertEquals(0x10 + 1, EthMessageCodes.GET_TRANSACTIONS.asByte()); - Assert.assertEquals(0x10 + 2, EthMessageCodes.TRANSACTIONS.asByte()); - Assert.assertEquals(0x10 + 3, EthMessageCodes.GET_BLOCK_HASHES.asByte()); - Assert.assertEquals(0x10 + 4, EthMessageCodes.BLOCK_HASHES.asByte()); - Assert.assertEquals(0x10 + 5, EthMessageCodes.GET_BLOCKS.asByte()); - Assert.assertEquals(0x10 + 6, EthMessageCodes.BLOCKS.asByte()); - Assert.assertEquals(0x10 + 7, EthMessageCodes.NEW_BLOCK.asByte()); - Assert.assertEquals(0x10 + 8, EthMessageCodes.PACKET_COUNT.asByte()); - } - - @Test - public void test3() { - - Assert.assertEquals(5, ShhMessageCodes.values().length); - - Assert.assertEquals(0, ShhMessageCodes.STATUS.asByte()); - Assert.assertEquals(1, ShhMessageCodes.MESSAGE.asByte()); - Assert.assertEquals(2, ShhMessageCodes.ADD_FILTER.asByte()); - Assert.assertEquals(3, ShhMessageCodes.REMOVE_FILTER.asByte()); - Assert.assertEquals(4, ShhMessageCodes.PACKET_COUNT.asByte()); - - ShhMessageCodes.setOffset((byte) 0x20); - Assert.assertEquals(0x20 + 0, ShhMessageCodes.STATUS.asByte()); - Assert.assertEquals(0x20 + 1, ShhMessageCodes.MESSAGE.asByte()); - Assert.assertEquals(0x20 + 2, ShhMessageCodes.ADD_FILTER.asByte()); - Assert.assertEquals(0x20 + 3, ShhMessageCodes.REMOVE_FILTER.asByte()); - Assert.assertEquals(0x20 + 4, ShhMessageCodes.PACKET_COUNT.asByte()); - } - - @Test - public void test4() { - - P2pHandler p2pHandler = new P2pHandler(); - - List capabilities = Arrays.asList( - new Capability(Capability.ETH, EthHandler.VERSION), - new Capability(Capability.SHH, ShhHandler.VERSION)); - p2pHandler.adaptMessageIds(capabilities); - - Assert.assertEquals(0x10 + 0, EthMessageCodes.STATUS.asByte()); - Assert.assertEquals(0x10 + 1, EthMessageCodes.GET_TRANSACTIONS.asByte()); - Assert.assertEquals(0x10 + 2, EthMessageCodes.TRANSACTIONS.asByte()); - Assert.assertEquals(0x10 + 3, EthMessageCodes.GET_BLOCK_HASHES.asByte()); - Assert.assertEquals(0x10 + 4, EthMessageCodes.BLOCK_HASHES.asByte()); - Assert.assertEquals(0x10 + 5, EthMessageCodes.GET_BLOCKS.asByte()); - Assert.assertEquals(0x10 + 6, EthMessageCodes.BLOCKS.asByte()); - Assert.assertEquals(0x10 + 7, EthMessageCodes.NEW_BLOCK.asByte()); - Assert.assertEquals(0x10 + 8, EthMessageCodes.PACKET_COUNT.asByte()); - - Assert.assertEquals(0x19 + 0, ShhMessageCodes.STATUS.asByte()); - Assert.assertEquals(0x19 + 1, ShhMessageCodes.MESSAGE.asByte()); - Assert.assertEquals(0x19 + 2, ShhMessageCodes.ADD_FILTER.asByte()); - Assert.assertEquals(0x19 + 3, ShhMessageCodes.REMOVE_FILTER.asByte()); - Assert.assertEquals(0x19 + 4, ShhMessageCodes.PACKET_COUNT.asByte()); - } - - @Test // Capabilities should be read in alphabetical order - public void test5() { - - P2pHandler p2pHandler = new P2pHandler(); - - List capabilities = Arrays.asList( - new Capability(Capability.SHH, ShhHandler.VERSION), - new Capability(Capability.ETH, EthHandler.VERSION)); - p2pHandler.adaptMessageIds(capabilities); - - Assert.assertEquals(0x10 + 0, EthMessageCodes.STATUS.asByte()); - Assert.assertEquals(0x10 + 1, EthMessageCodes.GET_TRANSACTIONS.asByte()); - Assert.assertEquals(0x10 + 2, EthMessageCodes.TRANSACTIONS.asByte()); - Assert.assertEquals(0x10 + 3, EthMessageCodes.GET_BLOCK_HASHES.asByte()); - Assert.assertEquals(0x10 + 4, EthMessageCodes.BLOCK_HASHES.asByte()); - Assert.assertEquals(0x10 + 5, EthMessageCodes.GET_BLOCKS.asByte()); - Assert.assertEquals(0x10 + 6, EthMessageCodes.BLOCKS.asByte()); - Assert.assertEquals(0x10 + 7, EthMessageCodes.NEW_BLOCK.asByte()); - Assert.assertEquals(0x10 + 8, EthMessageCodes.PACKET_COUNT.asByte()); - - Assert.assertEquals(0x19 + 0, ShhMessageCodes.STATUS.asByte()); - Assert.assertEquals(0x19 + 1, ShhMessageCodes.MESSAGE.asByte()); - Assert.assertEquals(0x19 + 2, ShhMessageCodes.ADD_FILTER.asByte()); - Assert.assertEquals(0x19 + 3, ShhMessageCodes.REMOVE_FILTER.asByte()); - Assert.assertEquals(0x19 + 4, ShhMessageCodes.PACKET_COUNT.asByte()); - } -} diff --git a/ethereumj-core/src/test/java/test/ethereum/serpent/MachineCompileTest.java b/ethereumj-core/src/test/java/test/ethereum/serpent/MachineCompileTest.java deleted file mode 100644 index 72f5316a..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/serpent/MachineCompileTest.java +++ /dev/null @@ -1,59 +0,0 @@ -package test.ethereum.serpent; - -import org.ethereum.serpent.SerpentCompiler; - -import org.junit.Test; - -import org.spongycastle.util.encoders.Hex; - -import static org.junit.Assert.assertEquals; - -/** - * @author Roman Mandeleil - * @since 28.05.2014 - */ -public class MachineCompileTest { - - @Test // very simple contract - public void test1() { - - String code = "a=2"; - String expected = "6005600c60003960056000f36002600052"; - String asm = SerpentCompiler.compile(code); - byte[] machineCode = SerpentCompiler.compileAssemblyToMachine(asm); - byte[] vmReadyCode = SerpentCompiler.encodeMachineCodeForVMRun(machineCode, null); - - String result = Hex.toHexString(vmReadyCode); - assertEquals(expected, result); - } - - @Test // contract for 256 bytes (len 2 bytes) - public void test2() { - - String code = "a=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\na=2\n[asm PUSH10 asm]"; - String expected = "610100600e6000396101006000f360026000526002600052600260005260026000526002600052600260005260026000526002600052600260005260026000526002600052600260005260026000526002600052600260005260026000526002600052600260005260026000526002600052600260005260026000526002600052600260005260026000526002600052600260005260026000526002600052600260005260026000526002600052600260005260026000526002600052600260005260026000526002600052600260005260026000526002600052600260005260026000526002600052600260005260026000526002600052600260005260026000526002600052600260005269"; - String asm = SerpentCompiler.compile(code); - byte[] machineCode = SerpentCompiler.compileAssemblyToMachine(asm); - byte[] vmReadyCode = SerpentCompiler.encodeMachineCodeForVMRun(machineCode, null); - - String result = Hex.toHexString(vmReadyCode); - - assertEquals(expected, result); - } - - @Test // contract for if jump - public void test3() { - - String code = "a=2\n" + - "if a>0:\n" + - " b = 3\n" + - "else: \n" + - " c = 4"; -// String expected = "610100600e6000396101006000f260026000546002600054600260005460026000546002600054600260005460026000546002600054600260005460026000546002600054600260005460026000546002600054600260005460026000546002600054600260005460026000546002600054600260005460026000546002600054600260005460026000546002600054600260005460026000546002600054600260005460026000546002600054600260005460026000546002600054600260005460026000546002600054600260005460026000546002600054600260005460026000546002600054600260005460026000546002600054600260005460026000546002600054600260005469"; - String asm = SerpentCompiler.compile(code); - byte[] machineCode = SerpentCompiler.compileAssemblyToMachine(asm); - byte[] vmReadyCode = SerpentCompiler.encodeMachineCodeForVMRun(machineCode, null); - - System.out.println(asm); - } -} diff --git a/ethereumj-core/src/test/java/test/ethereum/serpent/SerpentCompileTest.java b/ethereumj-core/src/test/java/test/ethereum/serpent/SerpentCompileTest.java deleted file mode 100644 index 96a7c0b9..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/serpent/SerpentCompileTest.java +++ /dev/null @@ -1,1330 +0,0 @@ -package test.ethereum.serpent; - -import org.ethereum.serpent.ParserUtils; -import org.ethereum.serpent.SerpentCompiler; -import org.ethereum.serpent.SerpentLexer; -import org.ethereum.serpent.SerpentParser; -import org.ethereum.serpent.SerpentToAssemblyCompiler; - -import org.antlr.v4.runtime.tree.ParseTree; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * @author Roman Mandeleil - * @since 13.05.14 - */ -public class SerpentCompileTest { - - @Test // assign test 1 - public void test1() { - - String code = "a=2"; - String expected = "2 0 MSTORE"; - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // assign test 2 - public void test2() { - - String code = "a=2\n" + - "b=6"; - String expected = "2 0 MSTORE 6 32 MSTORE"; - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // assign test 3 - public void test3() { - - String code = "a=2\n" + - "b=6\n" + - "c=b"; - String expected = "2 0 MSTORE 6 32 MSTORE 32 MLOAD 64 MSTORE"; - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // assign test 4 - public void test4() { - - String code = "a=2\n" + - "b=6\n" + - "c=b\n" + - "a=c"; - String expected = "2 0 MSTORE 6 32 MSTORE 32 MLOAD 64 MSTORE 64 MLOAD 0 MSTORE"; - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test(expected = SerpentToAssemblyCompiler.UnassignVarException.class) // assign test 5 - public void test5() { - - String code = "a=2\n" + - "b=6\n" + - "c=b\n" + - "a=c\n" + - "a=d"; - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - new SerpentToAssemblyCompiler().visit(tree); - fail("No exception was thrown"); - } - - @Test // expression test 1 - public void test6() { - - String code = "a = 2 * 2"; - String expected = "2 2 MUL 0 MSTORE"; - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // expression test 2 - public void test7() { - - String code = "a = 2 * 2 xor 2 * 2"; - String expected = "2 2 MUL 2 2 MUL XOR 0 MSTORE"; - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // expression test 3 - public void test8() { - - String code = "a = 2 | 2 xor 2 * 2"; - String expected = "2 2 MUL 2 XOR 2 OR 0 MSTORE"; - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // expression test 4 - public void test9() { - - String code = "a = (2 | 2) xor (2 * 2)"; - String expected = "2 2 MUL 2 2 OR XOR 0 MSTORE"; - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // expression test 5 - public void test10() { - - String code = "a = !(2 | 2 xor 2 * 2)"; - String expected = "2 2 MUL 2 XOR 2 OR NOT 0 MSTORE"; - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // expression test 6 - public void test11() { - - String code = "a = 2 + 2 * 2 + 2"; - String expected = "2 2 2 MUL 2 ADD ADD 0 MSTORE"; - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // expression test 7 - public void test12() { - - String code = "a = 2 / 1 * 2 + 2"; - String expected = "2 2 1 2 DIV MUL ADD 0 MSTORE"; - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // expression test 8 - public void test13() { - - String code = "a = 2 - 0x1a * 5 + 0xA"; - String expected = "10 5 26 MUL 2 SUB ADD 0 MSTORE"; - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // expression test 9 - public void test14() { - - String code = "a = 1 > 2 > 3 > 4"; - String expected = "4 3 2 1 GT GT GT 0 MSTORE"; - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // expression test 10 - public void test15() { - - String code = "a = !( 1 + 2 * 9 | 8 == 2)"; - String expected = "2 8 EQ 9 2 MUL 1 ADD OR NOT 0 MSTORE"; - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // if elif else test 1 - public void test16() { - - String code = "if 1>2: \n" + - " a=2"; - String expected = "2 1 GT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 LABEL_0"; - - /** - - 2 1 GT NOT REF_1 JUMPI - 2 0 MSTORE - REF_0 JUMP - LABEL_1 LABEL_0 - - */ - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, SerpentParser.class, - code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // if elif else test 2 - public void test17() { - - String code = "if 10 > 2 + 5: \n" + - " a=2"; - String expected = "5 2 ADD 10 GT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 LABEL_0"; - - /** - - 5 2 ADD 10 GT NOT REF_1 JUMPI - 2 0 MSTORE - REF_0 JUMP - LABEL_1 LABEL_0 - - */ - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // if elif else test 3 - public void test18() { - - String code = "if 10 > 2 + 5: \n" + - " a=2\n" + - "else: \n" + - " c=3\n"; - String expected = "5 2 ADD 10 GT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 3 32 MSTORE LABEL_0"; - - /** - 5 2 ADD 10 GT NOT REF_1 JUMPI - 2 0 MSTORE - REF_0 JUMP - LABEL_1 - 3 32 MSTORE - LABEL_0 - */ - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // if elif else test 4 - public void test19() { - - String code = "if 10 > 2 + 5: \n" + - " a=2\n" + - "else: \n" + - " c=123\n" + - " d=0xFFAA"; - String expected = "5 2 ADD 10 GT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 123 32 MSTORE 65450 64 MSTORE LABEL_0"; - - /** - 5 2 ADD 10 GT NOT REF_1 JUMPI - 2 0 MSTORE - REF_0 JUMP - LABEL_1 - 123 32 MSTORE - 65450 64 MSTORE - LABEL_0 - */ - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // if elif else test 5 - public void test20() { - - String code = "if 10 > 2 + 5: \n" + - " a=2\n" + - "elif 2*2==4: \n" + - " a=3\n" + - "else: \n" + - " c=123\n" + - " d=0xFFAA"; - String expected = "5 2 ADD 10 GT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 4 2 2 MUL EQ NOT REF_2 JUMPI 3 0 MSTORE REF_0 JUMP LABEL_2 123 32 MSTORE 65450 64 MSTORE LABEL_0"; - - /** - 5 2 ADD 10 GT NOT REF_1 JUMPI - 2 0 MSTORE - REF_0 JUMP - LABEL_1 - 4 2 2 MUL EQ NOT REF_2 JUMPI - 3 0 MSTORE - REF_0 JUMP - LABEL_2 - 123 32 MSTORE - 65450 64 MSTORE - LABEL_0 - */ - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // if elif else test 6 - public void test21() { - - String code = "if 10 < 2 + 5: \n" + - " a=2\n" + - "elif 2*2==4: \n" + - " a=3\n" + - "elif 2*2+10==40: \n" + - " a=3\n" + - " a=9\n" + - " a=21\n" + - "else: \n" + - " c=123\n" + - " d=0xFFAA"; - String expected = "5 2 ADD 10 LT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 4 2 2 MUL EQ NOT REF_2 JUMPI 3 0 MSTORE REF_0 JUMP LABEL_2 40 10 2 2 MUL ADD EQ NOT REF_3 JUMPI 3 0 MSTORE 9 0 MSTORE 21 0 MSTORE REF_0 JUMP LABEL_3 123 32 MSTORE 65450 64 MSTORE LABEL_0"; - - /** - - 5 2 ADD 10 LT NOT REF_1 JUMPI - 2 0 MSTORE - REF_0 JUMP - LABEL_1 - 4 2 2 MUL EQ NOT REF_2 JUMPI - 3 0 MSTORE - REF_0 JUMP - LABEL_2 - 40 10 2 2 MUL ADD EQ NOT REF_3 JUMPI - 3 0 MSTORE - 9 0 MSTORE - 21 0 MSTORE - REF_0 JUMP - LABEL_3 - 123 32 MSTORE - 65450 64 MSTORE - LABEL_0 - - */ - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // if elif else test 7 - public void test22() { - - String code = "if 10 > 2 + 5: \n" + - " a=2\n" + - "elif 2*2==4: \n" + - " a=3\n" + - " if a==3:\n" + - " q=123\n" + - "elif 2*2+10==40: \n" + - " a=3\n" + - " a=9\n" + - " a=21\n" + - "else: \n" + - " c=123\n" + - " d=0xFFAA"; - String expected = "5 2 ADD 10 GT NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 4 2 2 MUL EQ NOT REF_2 JUMPI 3 0 MSTORE 3 0 MLOAD EQ NOT REF_4 JUMPI 123 32 MSTORE REF_3 JUMP LABEL_4 LABEL_3 REF_0 JUMP LABEL_2 40 10 2 2 MUL ADD EQ NOT REF_5 JUMPI 3 0 MSTORE 9 0 MSTORE 21 0 MSTORE REF_0 JUMP LABEL_5 123 64 MSTORE 65450 96 MSTORE LABEL_0"; - - /** - 5 2 ADD 10 GT NOT REF_1 JUMPI - 2 0 MSTORE - REF_0 JUMP - LABEL_1 - 4 2 2 MUL EQ NOT REF_2 JUMPI - 3 0 MSTORE - 3 0 MLOAD EQ NOT REF_4 JUMPI - 123 32 MSTORE - REF_3 JUMP - LABEL_4 - LABEL_3 - REF_0 - JUMP LABEL_2 - 40 10 2 2 MUL ADD EQ NOT REF_5 JUMPI - 3 0 MSTORE - 9 0 MSTORE - 21 0 MSTORE - REF_0 JUMP - LABEL_5 - 123 64 MSTORE - 65450 96 MSTORE - LABEL_0 - */ - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // if elif else test 8 - public void test23() { - - String code = "if (10 >= 2 + 5) && (2 * 7 > 96): \n" + - " a=2\n" + - "elif 2*2==4: \n" + - " a=3\n" + - " if a==3:\n" + - " q=123\n" + - "elif 2*2+10==40: \n" + - " a=3\n" + - " a=9\n" + - " a=21\n" + - "else: \n" + - " c=123\n" + - " d=0xFFAA"; - String expected = "96 7 2 MUL GT 5 2 ADD 10 LT NOT NOT NOT MUL NOT REF_1 JUMPI 2 0 MSTORE REF_0 JUMP LABEL_1 4 2 2 MUL EQ NOT REF_2 JUMPI 3 0 MSTORE 3 0 MLOAD EQ NOT REF_4 JUMPI 123 32 MSTORE REF_3 JUMP LABEL_4 LABEL_3 REF_0 JUMP LABEL_2 40 10 2 2 MUL ADD EQ NOT REF_5 JUMPI 3 0 MSTORE 9 0 MSTORE 21 0 MSTORE REF_0 JUMP LABEL_5 123 64 MSTORE 65450 96 MSTORE LABEL_0"; - - /** - 96 7 2 MUL GT 5 2 ADD 10 LT NOT NOT NOT MUL NOT REF_1 JUMPI - 2 0 MSTORE - REF_0 JUMP - LABEL_1 - 4 2 2 MUL EQ NOT REF_2 JUMPI - 3 0 MSTORE - 3 0 MLOAD EQ NOT REF_4 JUMPI - 123 32 MSTORE - REF_3 JUMP - LABEL_4 - LABEL_3 - REF_0 JUMP - LABEL_2 - 40 10 2 2 MUL ADD EQ NOT REF_5 JUMPI - 3 0 MSTORE - 9 0 MSTORE - 21 0 MSTORE - REF_0 JUMP - LABEL_5 - 123 64 MSTORE - 65450 96 MSTORE - LABEL_0 - */ - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // if elif else test 9 - public void test24() { - - String code = "a = 20\n" + - "b = 40\n" + - "if a == 20: \n" + - " a = 30\n" + - "if b == 40: \n" + - " b = 50\n"; - String expected = "20 0 MSTORE 40 32 MSTORE 20 0 MLOAD EQ NOT REF_1 JUMPI 30 0 MSTORE REF_0 JUMP LABEL_1 LABEL_0 40 32 MLOAD EQ NOT REF_3 JUMPI 50 32 MSTORE REF_2 JUMP LABEL_3 LABEL_2"; - - /** - - 20 0 MSTORE - 40 32 MSTORE - 20 0 MLOAD EQ NOT REF_1 JUMPI - 30 0 MSTORE REF_0 JUMP - LABEL_1 - LABEL_0 - 40 32 MLOAD EQ NOT REF_3 JUMPI - 50 32 MSTORE - REF_2 JUMP - LABEL_3 LABEL_2 - - */ - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // if elif else test 10 - public void test25() { - - String code = "a = 20\n" + - "b = 40\n" + - "if a == 20: \n" + - " a = 30\n" + - "a = 70\n" + - "if b == 40: \n" + - " b = 50\n"; - String expected = "20 0 MSTORE 40 32 MSTORE 20 0 MLOAD EQ NOT REF_1 JUMPI 30 0 MSTORE REF_0 JUMP LABEL_1 LABEL_0 70 0 MSTORE 40 32 MLOAD EQ NOT REF_3 JUMPI 50 32 MSTORE REF_2 JUMP LABEL_3 LABEL_2"; - - /** - - 20 0 MSTORE - 40 32 MSTORE - 20 0 MLOAD EQ NOT REF_1 JUMPI - 30 0 MSTORE - REF_0 JUMP - LABEL_1 - LABEL_0 - 70 0 MSTORE - 40 32 MLOAD EQ NOT REF_3 JUMPI - 50 32 MSTORE - REF_2 JUMP - LABEL_3 LABEL_2 - - */ - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // if elif else test 11 - public void test26() { - - String code = "if 2>1: \n" + - " if 3>2: \n" + - " if 4>3:\n" + - " if 5>4:\n" + - " a = 10\n"; - String expected = "1 2 GT NOT REF_7 JUMPI 2 3 GT NOT REF_6 JUMPI 3 4 GT NOT REF_5 JUMPI 4 5 GT NOT REF_4 JUMPI 10 0 MSTORE REF_3 JUMP LABEL_4 LABEL_3 REF_2 JUMP LABEL_5 LABEL_2 REF_1 JUMP LABEL_6 LABEL_1 REF_0 JUMP LABEL_7 LABEL_0"; - - /** - - 1 2 GT NOT REF_7 JUMPI - 2 3 GT NOT REF_6 JUMPI - 3 4 GT NOT REF_5 JUMPI - 4 5 GT NOT REF_4 JUMPI - 10 0 MSTORE - REF_3 JUMP - LABEL_4 LABEL_3 REF_2 JUMP LABEL_5 LABEL_2 REF_1 JUMP LABEL_6 LABEL_1 REF_0 JUMP LABEL_7 LABEL_0 - - */ - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // if elif else test 12 - public void test27() { - - String code = "if 2>1: \n" + - " if 3>2: \n" + - " if 4>3:\n" + - " if 5>4:\n" + - " a = 10\n"; - String expected = "1 2 GT NOT REF_7 JUMPI 2 3 GT NOT REF_6 JUMPI 3 4 GT NOT REF_5 JUMPI 4 5 GT NOT REF_4 JUMPI 10 0 MSTORE REF_3 JUMP LABEL_4 LABEL_3 REF_2 JUMP LABEL_5 LABEL_2 REF_1 JUMP LABEL_6 LABEL_1 REF_0 JUMP LABEL_7 LABEL_0"; - - /** - - 1 2 GT NOT REF_7 JUMPI - 2 3 GT NOT REF_6 JUMPI - 3 4 GT NOT REF_5 JUMPI - 4 5 GT NOT REF_4 JUMPI - 10 0 MSTORE - REF_3 JUMP - LABEL_4 LABEL_3 REF_2 JUMP LABEL_5 LABEL_2 REF_1 JUMP LABEL_6 LABEL_1 REF_0 JUMP LABEL_7 LABEL_0 - */ - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // if elif else test 13 - public void test28() { - - String code = "if 2>1: \n" + - " if 3>2: \n" + - " if 4>3:\n" + - " if 5>4:\n" + - " a = 10\n" + - " else:\n" + - " b = 20\n"; - String expected = "1 2 GT NOT REF_7 JUMPI 2 3 GT NOT REF_6 JUMPI 3 4 GT NOT REF_5 JUMPI 4 5 GT NOT REF_4 JUMPI 10 0 MSTORE REF_3 JUMP LABEL_4 20 32 MSTORE LABEL_3 REF_2 JUMP LABEL_5 LABEL_2 REF_1 JUMP LABEL_6 LABEL_1 REF_0 JUMP LABEL_7 LABEL_0"; - - /** - - 1 2 GT NOT REF_7 JUMPI - 2 3 GT NOT REF_6 JUMPI - 3 4 GT NOT REF_5 JUMPI - 4 5 GT NOT REF_4 JUMPI - 10 0 MSTORE - REF_3 JUMP - LABEL_4 - 20 32 MSTORE - LABEL_3 REF_2 JUMP LABEL_5 LABEL_2 REF_1 JUMP LABEL_6 LABEL_1 REF_0 JUMP LABEL_7 LABEL_0 - - */ - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test(expected = ParserUtils.AntlrParseException.class) // if elif else test 14 - public void test29() { - - String code = " if 2>4: \n" + - " a=20 \n" + - " \n" + - " \n"; - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - - parser.parse(); - fail("Should be indent error thrown"); - } - - @Test(expected = ParserUtils.AntlrParseException.class) // if elif else test 15 - public void test30() { - - String code = "if 2>4: \n" + - " a=20 \n" + - " else: \n" + - " a=40 \n"; - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - - parser.parse(); - fail("Should be indent error thrown"); - } - - @Test(expected = ParserUtils.AntlrParseException.class) // if elif else test 16 - public void test31() { - - String code = "if 2>4: \n" + - " a=20 \n" + - " elif 2<9: \n" + - " a=40 \n" + - "else: \n" + - " a=40 \n"; - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - - parser.parse(); - fail("Should be indent error thrown"); - } - - @Test // if elif else test 17 - public void test32() { - - String code = "if 2*2==4: \n" + - " if 3*3==9: \n" + - " if 4*4==16: \n" + - " a=20 \n" + - " else: \n" + - " b=20 \n"; - String expected = "4 2 2 MUL EQ NOT REF_5 JUMPI 9 3 3 MUL EQ NOT REF_4 JUMPI 16 4 4 MUL EQ NOT REF_3 JUMPI 20 0 MSTORE REF_2 JUMP LABEL_3 LABEL_2 REF_1 JUMP LABEL_4 20 32 MSTORE LABEL_1 REF_0 JUMP LABEL_5 LABEL_0"; - - /** - - 4 2 2 MUL EQ NOT REF_5 JUMPI - 9 3 3 MUL EQ NOT REF_4 JUMPI - 16 4 4 MUL EQ NOT REF_3 JUMPI - 20 0 MSTORE - REF_2 JUMP - LABEL_3 LABEL_2 REF_1 JUMP LABEL_4 - 20 32 MSTORE - LABEL_1 REF_0 JUMP LABEL_5 LABEL_0 - */ - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test(expected = ParserUtils.AntlrParseException.class) // if elif else test 18 - public void test33() { - - String code = "if 2*2==4: \n" + - " if 3*3==9: \n" + - " if 4*4==16: \n" + - " a=20 \n" + - " else: \n" + - " \n"; - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - - parser.parse(); - fail("Should be indent error thrown"); - } - - @Test // if elif else test 19 - public void test34() { - - String code = "if 2>1: \n" + - " if 3>2: \n" + - " if 4>3: \n" + - " if 5>4: \n" + - " a = 10\n" + - " else: \n" + - " b = 20\n" + - " elif 2*2 != 4: \n" + - " a = 15\n"; - String expected = "1 2 GT NOT REF_8 JUMPI 2 3 GT NOT REF_7 JUMPI 3 4 GT NOT REF_5 JUMPI 4 5 GT NOT REF_4 JUMPI 10 0 MSTORE REF_3 JUMP LABEL_4 20 32 MSTORE LABEL_3 REF_2 JUMP LABEL_5 4 2 2 MUL EQ NOT NOT REF_6 JUMPI 15 0 MSTORE REF_2 JUMP LABEL_6 LABEL_2 REF_1 JUMP LABEL_7 LABEL_1 REF_0 JUMP LABEL_8 LABEL_0"; - - /** - - 1 2 GT NOT REF_8 JUMPI - 2 3 GT NOT REF_7 JUMPI - 3 4 GT NOT REF_5 JUMPI - 4 5 GT NOT REF_4 JUMPI - 10 0 MSTORE - REF_3 JUMP - LABEL_4 - 20 32 MSTORE - LABEL_3 REF_2 JUMP - LABEL_5 - 4 2 2 MUL EQ NOT NOT REF_6 JUMPI - 15 0 MSTORE - REF_2 JUMP LABEL_6 LABEL_2 REF_1 JUMP LABEL_7 LABEL_1 REF_0 JUMP LABEL_8 LABEL_0 - - */ - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // if elif else test 20 - public void test35() { - - String code = "if 2>1: \n" + - " a=20 \n" + - "elif 5<1: \n" + - " a=30 \n" + - "elif 6>6: \n" + - " a=40 \n" + - "else: \n" + - " a=50 \n"; - - String expected = "1 2 GT NOT REF_1 JUMPI 20 0 MSTORE REF_0 JUMP LABEL_1 1 5 LT NOT REF_2 JUMPI 30 0 MSTORE REF_0 JUMP LABEL_2 6 6 GT NOT REF_3 JUMPI 40 0 MSTORE REF_0 JUMP LABEL_3 50 0 MSTORE LABEL_0"; - - /** - - 1 2 GT NOT REF_1 JUMPI - 20 0 MSTORE - REF_0 JUMP - LABEL_1 - 1 5 LT NOT REF_2 JUMPI - 30 0 MSTORE - REF_0 JUMP - LABEL_2 - 6 6 GT NOT REF_3 JUMPI - 40 0 MSTORE - REF_0 JUMP - LABEL_3 - 50 0 MSTORE - LABEL_0 - - */ - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // while test 1 - public void test36() { - - String code = "a = 20 \n" + - "while a>0: \n" + - " a = a - 1 \n"; - - String expected = "20 0 MSTORE LABEL_0 0 0 MLOAD GT NOT REF_1 JUMPI 1 0 MLOAD SUB 0 MSTORE REF_0 JUMP LABEL_1"; - - /** - - 20 0 MSTORE - LABEL_0 - 0 0 MLOAD GT EQ NOT REF_1 JUMPI - 1 0 MLOAD SUB 0 MSTORE - REF_0 JUMP - LABEL_1 - - */ - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // while test 2 - public void test37() { - - String code = "x = 248 \n" + - "while x > 1: \n" + - " if (x % 2) == 0: \n" + - " x = x / 2 \n" + - " else: \n " + - " x = 3 * x + 1 \n"; - - String expected = "248 0 MSTORE LABEL_0 1 0 MLOAD GT NOT REF_1 JUMPI 0 2 0 MLOAD MOD EQ NOT REF_3 JUMPI 2 0 MLOAD DIV 0 MSTORE REF_2 JUMP LABEL_3 1 0 MLOAD 3 MUL ADD 0 MSTORE LABEL_2 REF_0 JUMP LABEL_1"; - - /** - - 248 0 MSTORE - LABEL_0 - 1 0 MLOAD GT NOT REF_1 JUMPI - 0 2 0 MLOAD MOD EQ NOT REF_3 JUMPI - 2 0 MLOAD DIV 0 MSTORE - REF_2 JUMP - LABEL_3 - 1 0 MLOAD 3 MUL ADD 0 MSTORE - LABEL_2 - - REF_0 JUMP - LABEL_1 - - */ - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // while test 3 - public void test38() { - - String code = "x = 0xFF \n" + - "while x > 1: \n" + - " if (x % 2) == 0: \n" + - " x = x / 2 \n" + - "x = x +2 \n" + - "x = 3 * x + 1 \n"; - - String expected = "255 0 MSTORE LABEL_0 1 0 MLOAD GT NOT REF_1 JUMPI 0 2 0 MLOAD MOD EQ NOT REF_3 JUMPI 2 0 MLOAD DIV 0 MSTORE REF_2 JUMP LABEL_3 LABEL_2 REF_0 JUMP LABEL_1 2 0 MLOAD ADD 0 MSTORE 1 0 MLOAD 3 MUL ADD 0 MSTORE"; - - /** - - 255 0 MSTORE - LABEL_0 - 1 0 MLOAD GT EQ NOT REF_1 JUMPI - 0 2 0 MLOAD MOD EQ NOT REF_3 JUMPI - 2 0 MLOAD DIV 0 MSTORE REF_2 JUMP - LABEL_3 LABEL_2 - REF_0 JUMP - LABEL_1 - 2 0 MLOAD ADD 0 MSTORE - 1 0 MLOAD 3 MUL ADD 0 MSTORE - - */ - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test(expected = ParserUtils.AntlrParseException.class) // while test 4 - public void test39() { - - String code = "x = 0xFF\n" + - "while x > 1:\n" + - "x = x +2\n" + - "x = 3 * x + 1"; - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - - parser.parse(); - fail("Should be indent error thrown"); - } - - @Test // while test 5 - public void test40() { - - String code = "x = 0xFF\n" + - "while (x > 1) && (x > 2) && (x > 3) && (2 <9):\n" + - " x = x -2\n"; - - String expected = "255 0 MSTORE LABEL_0 9 2 LT 3 0 MLOAD GT 2 0 MLOAD GT 1 0 MLOAD GT NOT NOT MUL NOT NOT MUL NOT NOT MUL NOT REF_1 JUMPI 2 0 MLOAD SUB 0 MSTORE REF_0 JUMP LABEL_1"; - - /** - - 255 0 MSTORE - LABEL_0 - 9 2 LT 3 0 MLOAD GT 2 0 MLOAD GT 1 0 MLOAD GT NOT NOT MUL NOT NOT MUL NOT NOT MUL EQ NOT REF_1 JUMPI - 2 0 MLOAD SUB 0 MSTORE - REF_0 JUMP - LABEL_1 - - */ - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // special functions test 1 - public void test41() { - - String code = "a = msg.datasize\n" + - "b = msg.sender\n" + - "c = msg.value\n" + - "d = tx.gasprice\n" + - "e = tx.origin\n" + - "f = tx.gas\n" + - "g = contract.balance\n" + - "h = block.prevhash\n" + - "i = block.coinbase\n" + - "j = block.timestamp\n" + - "k = block.number\n" + - "l = block.difficulty\n" + - "m = block.gaslimit\n"; - - String expected = "32 CALLDATASIZE DIV 0 MSTORE CALLER 32 MSTORE CALLVALUE 64 MSTORE GASPRICE 96 MSTORE ORIGIN 128 MSTORE GAS 160 MSTORE BALANCE 192 MSTORE PREVHASH 224 MSTORE COINBASE 256 MSTORE TIMESTAMP 288 MSTORE NUMBER 320 MSTORE DIFFICULTY 352 MSTORE GASLIMIT 384 MSTORE"; - - /** - - 32 CALLDATASIZE DIV 0 MSTORE - CALLER 32 MSTORE - CALLVALUE 64 MSTORE - GASPRICE 96 MSTORE - ORIGIN 128 MSTORE - GAS 160 MSTORE - BALANCE 192 MSTORE - PREVHASH 224 MSTORE - COINBASE 256 MSTORE - TIMESTAMP 288 MSTORE - NUMBER 320 MSTORE - DIFFICULTY 352 MSTORE - GASLIMIT 384 MSTORE - - */ - - SerpentParser parser = ParserUtils.getParser(SerpentLexer.class, - SerpentParser.class, code); - ParseTree tree = parser.parse(); - - String result = new SerpentToAssemblyCompiler().visit(tree); - result = result.replaceAll("\\s+", " "); - result = result.trim(); - - assertEquals(expected, result); - } - - @Test // compile to machine code 1 - public void test42() { - - String code = "x = 256 \n" + - "while x > 1: \n" + - " if (x % 2) == 0: \n" + - " x = x / 2 \n" + - " else: \n " + - " x = 3 * x + 1 \n"; - - String expected = "97 1 0 96 0 84 96 1 96 0 83 11 12 13 99 0 0 0 53 89 96 0 96 2 96 0 83 6 12 13 99 0 0 0 39 89 96 2 96 0 83 4 96 0 84 99 0 0 0 51 88 96 1 96 0 83 96 3 2 1 96 0 84 99 0 0 0 6 88"; - - String asmResult = SerpentCompiler.compile(code); - byte[] machineCode = SerpentCompiler.compileAssemblyToMachine(asmResult); - - } - - @Test // test init/code blocks 1 - public void test43() { - String code = "init:\n" + - " a = 2\n" + - "code:\n" + - " b=msg.data[1]\n" + - " stop\n"; - - String expected = "[init 2 0 MSTORE init] [code 1 32 MUL CALLDATALOAD 0 MSTORE STOP code]"; - String asmResult = SerpentCompiler.compileFullNotion(code); - assertEquals(expected, asmResult); - } - - @Test // test arrays 1 simple create - public void test45() { - String code = "c = 2\n" + - "d = 3\n" + - "a = [11, 22, 33]"; - String expected = "0 63 MSTORE8 2 0 MSTORE 3 32 MSTORE MSIZE 32 ADD MSIZE DUP 32 ADD 11 SWAP MSTORE DUP 64 ADD 22 SWAP MSTORE DUP 96 ADD 33 SWAP MSTORE 128 SWAP MSTORE"; - - String asmResult = SerpentCompiler.compile(code); - assertEquals(expected, asmResult); - } - - @Test // test arrays 2 simple set - public void test46() { - String code = "a = [11, 22, 33]\n" + - "a[ 2 ] = 3"; - String expected = "MSIZE 32 ADD MSIZE DUP 32 ADD 11 SWAP MSTORE DUP 64 ADD 22 SWAP MSTORE DUP 96 ADD 33 SWAP MSTORE 128 SWAP MSTORE 3 32 2 MUL 32 ADD 0 ADD 0 ADD MSTORE"; - - String asmResult = SerpentCompiler.compile(code); - assertEquals(expected, asmResult); - } - - @Test // test arrays 3 simple - public void test46_1() { - String code = "a = [11, 22, 33]\n"; - String expected = "MSIZE 32 ADD MSIZE DUP 32 ADD 11 SWAP MSTORE DUP 64 ADD 22 SWAP MSTORE DUP 96 ADD 33 SWAP MSTORE 128 SWAP MSTORE"; - - String asmResult = SerpentCompiler.compile(code); - assertEquals(expected, asmResult); - } - - @Test // test arrays 3 complicated set after 2 arrays - public void test47() { - String code = "a = [2, 4, 6]\n" + - "b = [12, 14]\n" + - "c = [22, 24, 25]\n" + - "c[ 0 ] = 3"; - String expected = "MSIZE 32 ADD MSIZE DUP 32 ADD 2 SWAP MSTORE DUP 64 ADD 4 SWAP MSTORE DUP 96 ADD 6 SWAP MSTORE 128 SWAP MSTORE MSIZE 32 ADD MSIZE DUP 32 ADD 12 SWAP MSTORE DUP 64 ADD 14 SWAP MSTORE 96 SWAP MSTORE MSIZE 32 ADD MSIZE DUP 32 ADD 22 SWAP MSTORE DUP 64 ADD 24 SWAP MSTORE DUP 96 ADD 25 SWAP MSTORE 128 SWAP MSTORE 3 32 0 MUL 32 ADD 224 ADD 0 ADD MSTORE"; - - String asmResult = SerpentCompiler.compile(code); - assertEquals(expected, asmResult); - } - - @Test // test arrays 4 simple set - public void test48() { - String code = "b = 1\n" + - "c = 2\n" + - "a = [11, 22, 33]\n" + - "a[ 2 ] = 3"; - String expected = "0 63 MSTORE8 1 0 MSTORE 2 32 MSTORE MSIZE 32 ADD MSIZE DUP 32 ADD 11 SWAP MSTORE DUP 64 ADD 22 SWAP MSTORE DUP 96 ADD 33 SWAP MSTORE 128 SWAP MSTORE 3 32 2 MUL 32 ADD 0 ADD 64 ADD MSTORE"; - - String asmResult = SerpentCompiler.compile(code); - assertEquals(expected, asmResult); - } - - @Test // test arrays 5 simple retrieve value - public void test49() { - String code = "c = [5]\n" + - "a = [11, 22, 33]\n" + - "b = a [0]"; - String expected = "0 31 MSTORE8 MSIZE 32 ADD MSIZE DUP 32 ADD 5 SWAP MSTORE 64 SWAP MSTORE MSIZE 32 ADD MSIZE DUP 32 ADD 11 SWAP MSTORE DUP 64 ADD 22 SWAP MSTORE DUP 96 ADD 33 SWAP MSTORE 128 SWAP MSTORE 32 0 MUL 96 ADD 32 ADD MLOAD 0 MSTORE"; - - String asmResult = SerpentCompiler.compile(code); - assertEquals(expected, asmResult); - } - - @Test // test msg(gas, to , val, [arr_in], in_len, out_len), and out access - public void test50() { - String code = "\n" + - "a = msg(1, 2, 3, [11, 22, 33], 3, 6) \n" + - "b = a[0]\n"; - String expected = "0 31 MSTORE8 224 MSIZE 224 MSIZE MSTORE 0 192 MSIZE ADD MSTORE8 96 MSIZE 32 ADD MSIZE DUP 32 ADD 11 SWAP MSTORE DUP 64 ADD 22 SWAP MSTORE DUP 96 ADD 33 SWAP MSTORE 128 SWAP MSTORE 3 2 1 CALL 32 0 MUL 160 ADD 32 ADD MLOAD 0 MSTORE"; - - String asmResult = SerpentCompiler.compile(code); - assertEquals(expected, asmResult); - } - - @Test // test create(gas, mem_start , mem_size) - public void test51() { - String code = "\n" + - "create(100, 0, 32) \n"; - String expected = "32 0 100 CREATE"; - - String asmResult = SerpentCompiler.compile(code); - assertEquals(expected, asmResult); - } - -/* - TODO: more to implement - -# *) a = msg.data -# 0) sha(); -# 3) x = sha3(v) -# 4) x = byte(y,z) -# 5) v = getch(x,i) -# 6) setch(x,i,v) - - -# 7) a=array(30) -# 8) x = bytes(n) - - */ - - /** - * TODO: a = msg(gas, to , value, in_ptr, in_len, out_ptr, out_len) testing - * - * TODO: return(1) testing - * TODO: return (1,2) testing - * TODO: msg.data testing - * TODO: send(1, 2, 3) - * - * TODO: contract.storage get/set testing - * TODO: [asm asm] testing - * TODO: suicide(1) testing - * TODO: stop testing - */ - - /** - TODO: add this namecoin sample to the testing - if !(contract.storage[msg.data[0]]): - contract.storage[msg.data[0]] = msg.data[1] - return(1) - else: - return(0) - */ - -/* - TODO: add this curency creation sample for testing - "if msg.datasize == 1:\n" + - " addr = msg.data[0]\n" + - " return(contract.storage[addr])\n" + - "else:\n" + - " from = msg.sender\n" + - " fromvalue = contract.storage[from]\n" + - " to = msg.data[0]\n" + - " value = msg.data[1]\n" + - " if fromvalue >= value:\n" + - " contract.storage[from] = fromvalue - value\n" + - " contract.storage[to] = contract.storage[to] + value\n" + - " return(1)\n" + - " else:\n" + - " return(0)" + -*/ - -// MSTORE DUP DUP MSOTRE8 FUCK I AM LOST FUCK SWAP DUP SWAP DUP DUP -} diff --git a/ethereumj-core/src/test/java/test/ethereum/trie/TrieTest.java b/ethereumj-core/src/test/java/test/ethereum/trie/TrieTest.java deleted file mode 100644 index bf796a1d..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/trie/TrieTest.java +++ /dev/null @@ -1,933 +0,0 @@ -package test.ethereum.trie; - -import org.ethereum.datasource.KeyValueDataSource; -import org.ethereum.datasource.LevelDbDataSource; -import test.ethereum.db.MockDB; - -import org.ethereum.core.AccountState; -import org.ethereum.db.DatabaseImpl; -import org.ethereum.trie.TrieImpl; - -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; - -import org.junit.After; -import org.junit.Assert; -import org.junit.Ignore; -import org.junit.Test; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.spongycastle.util.encoders.Hex; - -import java.io.File; -import java.io.IOException; - -import java.math.BigInteger; - -import java.net.URISyntaxException; -import java.net.URL; - -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.Set; - -import static org.ethereum.crypto.HashUtil.EMPTY_TRIE_HASH; -import static org.junit.Assert.*; - -import redis.clients.jedis.Jedis; -import redis.clients.jedis.Pipeline; - -public class TrieTest { - - private static final Logger logger = LoggerFactory.getLogger("test"); - - private static String LONG_STRING = "1234567890abcdefghijklmnopqrstuvwxxzABCEFGHIJKLMNOPQRSTUVWXYZ"; - private static String ROOT_HASH_EMPTY = Hex.toHexString(EMPTY_TRIE_HASH); - - private static String c = "c"; - private static String ca = "ca"; - private static String cat = "cat"; - private static String dog = "dog"; - private static String doge = "doge"; - private static String test = "test"; - private static String dude = "dude"; - - private MockDB mockDb = new MockDB(); - private MockDB mockDb_2 = new MockDB(); - -// ROOT: [ '\x16', A ] -// A: [ '', '', '', '', B, '', '', '', C, '', '', '', '', '', '', '', '' ] -// B: [ '\x00\x6f', D ] -// D: [ '', '', '', '', '', '', E, '', '', '', '', '', '', '', '', '', 'verb' ] -// E: [ '\x17', F ] -// F: [ '', '', '', '', '', '', G, '', '', '', '', '', '', '', '', '', 'puppy' ] -// G: [ '\x35', 'coin' ] -// C: [ '\x20\x6f\x72\x73\x65', 'stallion' ] - - @After - public void closeMockDb() throws IOException { - mockDb.close(); - mockDb_2.close(); - } - - @Test - public void testEmptyKey() { - TrieImpl trie = new TrieImpl(mockDb); - - trie.update("", dog); - assertEquals(dog, new String(trie.get(""))); - } - - @Test - public void testInsertShortString() { - TrieImpl trie = new TrieImpl(mockDb); - - trie.update(cat, dog); - assertEquals(dog, new String(trie.get(cat))); - } - - @Test - public void testInsertLongString() { - TrieImpl trie = new TrieImpl(mockDb); - - trie.update(cat, LONG_STRING); - assertEquals(LONG_STRING, new String(trie.get(cat))); - } - - @Test - public void testInsertMultipleItems1() { - TrieImpl trie = new TrieImpl(mockDb); - trie.update(ca, dude); - assertEquals(dude, new String(trie.get(ca))); - - trie.update(cat, dog); - assertEquals(dog, new String(trie.get(cat))); - - trie.update(dog, test); - assertEquals(test, new String(trie.get(dog))); - - trie.update(doge, LONG_STRING); - assertEquals(LONG_STRING, new String(trie.get(doge))); - - trie.update(test, LONG_STRING); - assertEquals(LONG_STRING, new String(trie.get(test))); - - // Test if everything is still there - assertEquals(dude, new String(trie.get(ca))); - assertEquals(dog, new String(trie.get(cat))); - assertEquals(test, new String(trie.get(dog))); - assertEquals(LONG_STRING, new String(trie.get(doge))); - assertEquals(LONG_STRING, new String(trie.get(test))); - } - - @Test - public void testInsertMultipleItems2() { - TrieImpl trie = new TrieImpl(mockDb); - - trie.update(cat, dog); - assertEquals(dog, new String(trie.get(cat))); - - trie.update(ca, dude); - assertEquals(dude, new String(trie.get(ca))); - - trie.update(doge, LONG_STRING); - assertEquals(LONG_STRING, new String(trie.get(doge))); - - trie.update(dog, test); - assertEquals(test, new String(trie.get(dog))); - - trie.update(test, LONG_STRING); - assertEquals(LONG_STRING, new String(trie.get(test))); - - // Test if everything is still there - assertEquals(dog, new String(trie.get(cat))); - assertEquals(dude, new String(trie.get(ca))); - assertEquals(LONG_STRING, new String(trie.get(doge))); - assertEquals(test, new String(trie.get(dog))); - assertEquals(LONG_STRING, new String(trie.get(test))); - } - - @Test - public void testUpdateShortToShortString() { - TrieImpl trie = new TrieImpl(mockDb); - - trie.update(cat, dog); - assertEquals(dog, new String(trie.get(cat))); - - trie.update(cat, dog + "1"); - assertEquals(dog + "1", new String(trie.get(cat))); - } - - @Test - public void testUpdateLongToLongString() { - TrieImpl trie = new TrieImpl(mockDb); - trie.update(cat, LONG_STRING); - assertEquals(LONG_STRING, new String(trie.get(cat))); - trie.update(cat, LONG_STRING + "1"); - assertEquals(LONG_STRING + "1", new String(trie.get(cat))); - } - - @Test - public void testUpdateShortToLongString() { - TrieImpl trie = new TrieImpl(mockDb); - - trie.update(cat, dog); - assertEquals(dog, new String(trie.get(cat))); - - trie.update(cat, LONG_STRING + "1"); - assertEquals(LONG_STRING + "1", new String(trie.get(cat))); - } - - @Test - public void testUpdateLongToShortString() { - TrieImpl trie = new TrieImpl(mockDb); - - trie.update(cat, LONG_STRING); - assertEquals(LONG_STRING, new String(trie.get(cat))); - - trie.update(cat, dog + "1"); - assertEquals(dog + "1", new String(trie.get(cat))); - } - - @Test - public void testDeleteShortString1() { - String ROOT_HASH_BEFORE = "a9539c810cc2e8fa20785bdd78ec36cc1dab4b41f0d531e80a5e5fd25c3037ee"; - String ROOT_HASH_AFTER = "fc5120b4a711bca1f5bb54769525b11b3fb9a8d6ac0b8bf08cbb248770521758"; - TrieImpl trie = new TrieImpl(mockDb); - - trie.update(cat, dog); - assertEquals(dog, new String(trie.get(cat))); - - trie.update(ca, dude); - assertEquals(dude, new String(trie.get(ca))); - assertEquals(ROOT_HASH_BEFORE, Hex.toHexString(trie.getRootHash())); - - trie.delete(ca); - assertEquals("", new String(trie.get(ca))); - assertEquals(ROOT_HASH_AFTER, Hex.toHexString(trie.getRootHash())); - } - - @Test - public void testDeleteShortString2() { - String ROOT_HASH_BEFORE = "a9539c810cc2e8fa20785bdd78ec36cc1dab4b41f0d531e80a5e5fd25c3037ee"; - String ROOT_HASH_AFTER = "b25e1b5be78dbadf6c4e817c6d170bbb47e9916f8f6cc4607c5f3819ce98497b"; - TrieImpl trie = new TrieImpl(mockDb); - - trie.update(ca, dude); - assertEquals(dude, new String(trie.get(ca))); - - trie.update(cat, dog); - assertEquals(dog, new String(trie.get(cat))); - assertEquals(ROOT_HASH_BEFORE, Hex.toHexString(trie.getRootHash())); - - trie.delete(cat); - assertEquals("", new String(trie.get(cat))); - assertEquals(ROOT_HASH_AFTER, Hex.toHexString(trie.getRootHash())); - } - - @Test - public void testDeleteShortString3() { - String ROOT_HASH_BEFORE = "778ab82a7e8236ea2ff7bb9cfa46688e7241c1fd445bf2941416881a6ee192eb"; - String ROOT_HASH_AFTER = "05875807b8f3e735188d2479add82f96dee4db5aff00dc63f07a7e27d0deab65"; - TrieImpl trie = new TrieImpl(mockDb); - - trie.update(cat, dude); - assertEquals(dude, new String(trie.get(cat))); - - trie.update(dog, test); - assertEquals(test, new String(trie.get(dog))); - assertEquals(ROOT_HASH_BEFORE, Hex.toHexString(trie.getRootHash())); - - trie.delete(dog); - assertEquals("", new String(trie.get(dog))); - assertEquals(ROOT_HASH_AFTER, Hex.toHexString(trie.getRootHash())); - } - - @Test - public void testDeleteLongString1() { - String ROOT_HASH_BEFORE = "318961a1c8f3724286e8e80d312352f01450bc4892c165cc7614e1c2e5a0012a"; - String ROOT_HASH_AFTER = "63356ecf33b083e244122fca7a9b128cc7620d438d5d62e4f8b5168f1fb0527b"; - TrieImpl trie = new TrieImpl(mockDb); - - trie.update(cat, LONG_STRING); - assertEquals(LONG_STRING, new String(trie.get(cat))); - - trie.update(dog, LONG_STRING); - assertEquals(LONG_STRING, new String(trie.get(dog))); - assertEquals(ROOT_HASH_BEFORE, Hex.toHexString(trie.getRootHash())); - - trie.delete(dog); - assertEquals("", new String(trie.get(dog))); - assertEquals(ROOT_HASH_AFTER, Hex.toHexString(trie.getRootHash())); - } - - @Test - public void testDeleteLongString2() { - String ROOT_HASH_BEFORE = "e020de34ca26f8d373ff2c0a8ac3a4cb9032bfa7a194c68330b7ac3584a1d388"; - String ROOT_HASH_AFTER = "334511f0c4897677b782d13a6fa1e58e18de6b24879d57ced430bad5ac831cb2"; - TrieImpl trie = new TrieImpl(mockDb); - - trie.update(ca, LONG_STRING); - assertEquals(LONG_STRING, new String(trie.get(ca))); - - trie.update(cat, LONG_STRING); - assertEquals(LONG_STRING, new String(trie.get(cat))); - assertEquals(ROOT_HASH_BEFORE, Hex.toHexString(trie.getRootHash())); - - trie.delete(cat); - assertEquals("", new String(trie.get(cat))); - assertEquals(ROOT_HASH_AFTER, Hex.toHexString(trie.getRootHash())); - } - - @Test - public void testDeleteLongString3() { - String ROOT_HASH_BEFORE = "e020de34ca26f8d373ff2c0a8ac3a4cb9032bfa7a194c68330b7ac3584a1d388"; - String ROOT_HASH_AFTER = "63356ecf33b083e244122fca7a9b128cc7620d438d5d62e4f8b5168f1fb0527b"; - TrieImpl trie = new TrieImpl(mockDb); - - trie.update(cat, LONG_STRING); - assertEquals(LONG_STRING, new String(trie.get(cat))); - - trie.update(ca, LONG_STRING); - assertEquals(LONG_STRING, new String(trie.get(ca))); - assertEquals(ROOT_HASH_BEFORE, Hex.toHexString(trie.getRootHash())); - - trie.delete(ca); - assertEquals("", new String(trie.get(ca))); - assertEquals(ROOT_HASH_AFTER, Hex.toHexString(trie.getRootHash())); - } - - @Test - public void testDeleteMultipleItems1() { - String ROOT_HASH_BEFORE = "3a784eddf1936515f0313b073f99e3bd65c38689021d24855f62a9601ea41717"; - String ROOT_HASH_AFTER1 = "60a2e75cfa153c4af2783bd6cb48fd6bed84c6381bc2c8f02792c046b46c0653"; - String ROOT_HASH_AFTER2 = "a84739b4762ddf15e3acc4e6957e5ab2bbfaaef00fe9d436a7369c6f058ec90d"; - TrieImpl trie = new TrieImpl(mockDb); - - trie.update(cat, dog); - assertEquals(dog, new String(trie.get(cat))); - - trie.update(ca, dude); - assertEquals(dude, new String(trie.get(ca))); - - trie.update(doge, LONG_STRING); - assertEquals(LONG_STRING, new String(trie.get(doge))); - - trie.update(dog, test); - assertEquals(test, new String(trie.get(dog))); - - trie.update(test, LONG_STRING); - assertEquals(LONG_STRING, new String(trie.get(test))); - assertEquals(ROOT_HASH_BEFORE, Hex.toHexString(trie.getRootHash())); - - trie.delete(dog); - assertEquals("", new String(trie.get(dog))); - assertEquals(ROOT_HASH_AFTER1, Hex.toHexString(trie.getRootHash())); - - trie.delete(test); - assertEquals("", new String(trie.get(test))); - assertEquals(ROOT_HASH_AFTER2, Hex.toHexString(trie.getRootHash())); - } - - @Test - public void testDeleteMultipleItems2() { - String ROOT_HASH_BEFORE = "cf1ed2b6c4b6558f70ef0ecf76bfbee96af785cb5d5e7bfc37f9804ad8d0fb56"; - String ROOT_HASH_AFTER1 = "f586af4a476ba853fca8cea1fbde27cd17d537d18f64269fe09b02aa7fe55a9e"; - String ROOT_HASH_AFTER2 = "c59fdc16a80b11cc2f7a8b107bb0c954c0d8059e49c760ec3660eea64053ac91"; - - TrieImpl trie = new TrieImpl(mockDb); - trie.update(c, LONG_STRING); - assertEquals(LONG_STRING, new String(trie.get(c))); - - trie.update(ca, LONG_STRING); - assertEquals(LONG_STRING, new String(trie.get(ca))); - - trie.update(cat, LONG_STRING); - assertEquals(LONG_STRING, new String(trie.get(cat))); - assertEquals(ROOT_HASH_BEFORE, Hex.toHexString(trie.getRootHash())); - - trie.delete(ca); - assertEquals("", new String(trie.get(ca))); - assertEquals(ROOT_HASH_AFTER1, Hex.toHexString(trie.getRootHash())); - - trie.delete(cat); - assertEquals("", new String(trie.get(cat))); - assertEquals(ROOT_HASH_AFTER2, Hex.toHexString(trie.getRootHash())); - } - - @Test - public void testDeleteAll() { - String ROOT_HASH_BEFORE = "a84739b4762ddf15e3acc4e6957e5ab2bbfaaef00fe9d436a7369c6f058ec90d"; - TrieImpl trie = new TrieImpl(mockDb); - assertEquals(ROOT_HASH_EMPTY, Hex.toHexString(trie.getRootHash())); - - trie.update(ca, dude); - trie.update(cat, dog); - trie.update(doge, LONG_STRING); - assertEquals(ROOT_HASH_BEFORE, Hex.toHexString(trie.getRootHash())); - - trie.delete(ca); - trie.delete(cat); - trie.delete(doge); - assertEquals(ROOT_HASH_EMPTY, Hex.toHexString(trie.getRootHash())); - } - - @Test - public void testTrieEquals() { - TrieImpl trie1 = new TrieImpl(mockDb); - TrieImpl trie2 = new TrieImpl(mockDb); - - trie1.update(doge, LONG_STRING); - trie2.update(doge, LONG_STRING); - assertTrue("Expected tries to be equal", trie1.equals(trie2)); - assertEquals(Hex.toHexString(trie1.getRootHash()), Hex.toHexString(trie2.getRootHash())); - - trie1.update(dog, LONG_STRING); - trie2.update(cat, LONG_STRING); - assertFalse("Expected tries not to be equal", trie1.equals(trie2)); - assertNotEquals(Hex.toHexString(trie1.getRootHash()), Hex.toHexString(trie2.getRootHash())); - } - - @Ignore - @Test - public void testTrieSync() { - TrieImpl trie = new TrieImpl(mockDb); - - trie.update(dog, LONG_STRING); - assertEquals("Expected no data in database", mockDb.getAddedItems(), 0); - - trie.sync(); - assertNotEquals("Expected data to be persisted", mockDb.getAddedItems(), 0); - } - - @Ignore - @Test - public void TestTrieDirtyTracking() { - TrieImpl trie = new TrieImpl(mockDb); - trie.update(dog, LONG_STRING); - assertTrue("Expected trie to be dirty", trie.getCache().isDirty()); - - trie.sync(); - assertFalse("Expected trie not to be dirty", trie.getCache().isDirty()); - - trie.update(test, LONG_STRING); - trie.getCache().undo(); - assertFalse("Expected trie not to be dirty", trie.getCache().isDirty()); - } - - @Test - public void TestTrieReset() { - TrieImpl trie = new TrieImpl(mockDb); - - trie.update(cat, LONG_STRING); - assertNotEquals("Expected cached nodes", 0, trie.getCache().getNodes().size()); - - trie.getCache().undo(); - - assertEquals("Expected no nodes after undo", 0, trie.getCache().getNodes().size()); - } - - @Test - public void testTrieCopy() { - TrieImpl trie = new TrieImpl(mockDb); - trie.update("doe", "reindeer"); - TrieImpl trie2 = trie.copy(); - assertNotEquals(trie.hashCode(), trie2.hashCode()); // avoid possibility that its just a reference copy - assertEquals(Hex.toHexString(trie.getRootHash()), Hex.toHexString(trie2.getRootHash())); - assertTrue(trie.equals(trie2)); - } - - @Test - public void testTrieUndo() { - TrieImpl trie = new TrieImpl(mockDb); - trie.update("doe", "reindeer"); - assertEquals("11a0327cfcc5b7689b6b6d727e1f5f8846c1137caaa9fc871ba31b7cce1b703e", Hex.toHexString(trie.getRootHash())); - trie.sync(); - - trie.update("dog", "puppy"); - assertEquals("05ae693aac2107336a79309e0c60b24a7aac6aa3edecaef593921500d33c63c4", Hex.toHexString(trie.getRootHash())); - - trie.undo(); - assertEquals("11a0327cfcc5b7689b6b6d727e1f5f8846c1137caaa9fc871ba31b7cce1b703e", Hex.toHexString(trie.getRootHash())); - } - - // Using tests from: https://github.com/ethereum/tests/blob/master/trietest.json - - @Test - public void testSingleItem() { - TrieImpl trie = new TrieImpl(mockDb); - trie.update("A", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"); - - assertEquals("d23786fb4a010da3ce639d66d5e904a11dbc02746d1ce25029e53290cabf28ab", Hex.toHexString(trie.getRootHash())); - } - - @Test - public void testDogs() { - TrieImpl trie = new TrieImpl(mockDb); - trie.update("doe", "reindeer"); - assertEquals("11a0327cfcc5b7689b6b6d727e1f5f8846c1137caaa9fc871ba31b7cce1b703e", Hex.toHexString(trie.getRootHash())); - - trie.update("dog", "puppy"); - assertEquals("05ae693aac2107336a79309e0c60b24a7aac6aa3edecaef593921500d33c63c4", Hex.toHexString(trie.getRootHash())); - - trie.update("dogglesworth", "cat"); - assertEquals("8aad789dff2f538bca5d8ea56e8abe10f4c7ba3a5dea95fea4cd6e7c3a1168d3", Hex.toHexString(trie.getRootHash())); - } - - @Test - public void testPuppy() { - TrieImpl trie = new TrieImpl(mockDb); - trie.update("do", "verb"); - trie.update("doge", "coin"); - trie.update("horse", "stallion"); - trie.update("dog", "puppy"); - - assertEquals("5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84", Hex.toHexString(trie.getRootHash())); - } - - @Test - public void testEmptyValues() { - TrieImpl trie = new TrieImpl(mockDb); - trie.update("do", "verb"); - trie.update("ether", "wookiedoo"); - trie.update("horse", "stallion"); - trie.update("shaman", "horse"); - trie.update("doge", "coin"); - trie.update("ether", ""); - trie.update("dog", "puppy"); - trie.update("shaman", ""); - - assertEquals("5991bb8c6514148a29db676a14ac506cd2cd5775ace63c30a4fe457715e9ac84", Hex.toHexString(trie.getRootHash())); - } - - @Test - public void testFoo() { - TrieImpl trie = new TrieImpl(mockDb); - trie.update("foo", "bar"); - trie.update("food", "bat"); - trie.update("food", "bass"); - - assertEquals("17beaa1648bafa633cda809c90c04af50fc8aed3cb40d16efbddee6fdf63c4c3", Hex.toHexString(trie.getRootHash())); - } - - @Test - public void testSmallValues() { - TrieImpl trie = new TrieImpl(mockDb); - - trie.update("be", "e"); - trie.update("dog", "puppy"); - trie.update("bed", "d"); - assertEquals("3f67c7a47520f79faa29255d2d3c084a7a6df0453116ed7232ff10277a8be68b", Hex.toHexString(trie.getRootHash())); - } - - @Test - public void testTesty() { - TrieImpl trie = new TrieImpl(mockDb); - - trie.update("test", "test"); - assertEquals("85d106d4edff3b7a4889e91251d0a87d7c17a1dda648ebdba8c6060825be23b8", Hex.toHexString(trie.getRootHash())); - - trie.update("te", "testy"); - assertEquals("8452568af70d8d140f58d941338542f645fcca50094b20f3c3d8c3df49337928", Hex.toHexString(trie.getRootHash())); - } - - private final String randomDictionary = "spinneries, archipenko, prepotency, herniotomy, preexpress, relaxative, insolvably, debonnaire, apophysate, virtuality, cavalryman, utilizable, diagenesis, vitascopic, governessy, abranchial, cyanogenic, gratulated, signalment, predicable, subquality, crystalize, prosaicism, oenologist, repressive, impanelled, cockneyism, bordelaise, compigne, konstantin, predicated, unsublimed, hydrophane, phycomyces, capitalise, slippingly, untithable, unburnable, deoxidizer, misteacher, precorrect, disclaimer, solidified, neuraxitis, caravaning, betelgeuse, underprice, uninclosed, acrogynous, reirrigate, dazzlingly, chaffiness, corybantes, intumesced, intentness, superexert, abstrusely, astounding, pilgrimage, posttarsal, prayerless, nomologist, semibelted, frithstool, unstinging, ecalcarate, amputating, megascopic, graphalloy, platteland, adjacently, mingrelian, valentinus, appendical, unaccurate, coriaceous, waterworks, sympathize, doorkeeper, overguilty, flaggingly, admonitory, aeriferous, normocytic, parnellism, catafalque, odontiasis, apprentice, adulterous, mechanisma, wilderness, undivorced, reinterred, effleurage, pretrochal, phytogenic, swirlingly, herbarized, unresolved, classifier, diosmosing, microphage, consecrate, astarboard, predefying, predriving, lettergram, ungranular, overdozing, conferring, unfavorite, peacockish, coinciding, erythraeum, freeholder, zygophoric, imbitterer, centroidal, appendixes, grayfishes, enological, indiscreet, broadcloth, divulgated, anglophobe, stoopingly, bibliophil, laryngitis, separatist, estivating, bellarmine, greasiness, typhlology, xanthation, mortifying, endeavorer, aviatrices, unequalise, metastatic, leftwinger, apologizer, quatrefoil, nonfouling, bitartrate, outchiding, undeported, poussetted, haemolysis, asantehene, montgomery, unjoinable, cedarhurst, unfastener, nonvacuums, beauregard, animalized, polyphides, cannizzaro, gelatinoid, apologised, unscripted, tracheidal, subdiscoid, gravelling, variegated, interabang, inoperable, immortelle, laestrygon, duplicatus, proscience, deoxidised, manfulness, channelize, nondefense, ectomorphy, unimpelled, headwaiter, hexaemeric, derivation, prelexical, limitarian, nonionized, prorefugee, invariably, patronizer, paraplegia, redivision, occupative, unfaceable, hypomnesia, psalterium, doctorfish, gentlefolk, overrefine, heptastich, desirously, clarabelle, uneuphonic, autotelism, firewarden, timberjack, fumigation, drainpipes, spathulate, novelvelle, bicorporal, grisliness, unhesitant, supergiant, unpatented, womanpower, toastiness, multichord, paramnesia, undertrick, contrarily, neurogenic, gunmanship, settlement, brookville, gradualism, unossified, villanovan, ecospecies, organising, buckhannon, prefulfill, johnsonese, unforegone, unwrathful, dunderhead, erceldoune, unwadeable, refunction, understuff, swaggering, freckliest, telemachus, groundsill, outslidden, bolsheviks, recognizer, hemangioma, tarantella, muhammedan, talebearer, relocation, preemption, chachalaca, septuagint, ubiquitous, plexiglass, humoresque, biliverdin, tetraploid, capitoline, summerwood, undilating, undetested, meningitic, petrolatum, phytotoxic, adiphenine, flashlight, protectory, inwreathed, rawishness, tendrillar, hastefully, bananaquit, anarthrous, unbedimmed, herborized, decenniums, deprecated, karyotypic, squalidity, pomiferous, petroglyph, actinomere, peninsular, trigonally, androgenic, resistance, unassuming, frithstool, documental, eunuchised, interphone, thymbraeus, confirmand, expurgated, vegetation, myographic, plasmagene, spindrying, unlackeyed, foreknower, mythically, albescence, rebudgeted, implicitly, unmonastic, torricelli, mortarless, labialized, phenacaine, radiometry, sluggishly, understood, wiretapper, jacobitely, unbetrayed, stadholder, directress, emissaries, corelation, sensualize, uncurbable, permillage, tentacular, thriftless, demoralize, preimagine, iconoclast, acrobatism, firewarden, transpired, bluethroat, wanderjahr, groundable, pedestrian, unulcerous, preearthly, freelanced, sculleries, avengingly, visigothic, preharmony, bressummer, acceptable, unfoolable, predivider, overseeing, arcosolium, piriformis, needlecord, homebodies, sulphation, phantasmic, unsensible, unpackaged, isopiestic, cytophagic, butterlike, frizzliest, winklehawk, necrophile, mesothorax, cuchulainn, unrentable, untangible, unshifting, unfeasible, poetastric, extermined, gaillardia, nonpendent, harborside, pigsticker, infanthood, underrower, easterling, jockeyship, housebreak, horologium, undepicted, dysacousma, incurrable, editorship, unrelented, peritricha, interchaff, frothiness, underplant, proafrican, squareness, enigmatise, reconciled, nonnumeral, nonevident, hamantasch, victualing, watercolor, schrdinger, understand, butlerlike, hemiglobin, yankeeland"; - - @Test - public void testMasiveUpdate() { - boolean massiveUpdateTestEnabled = false; - - if (massiveUpdateTestEnabled) { - List randomWords = Arrays.asList(randomDictionary.split(",")); - HashMap testerMap = new HashMap<>(); - - TrieImpl trie = new TrieImpl(mockDb); - Random generator = new Random(); - - // Random insertion - for (int i = 0; i < 100000; ++i) { - - int randomIndex1 = generator.nextInt(randomWords.size()); - int randomIndex2 = generator.nextInt(randomWords.size()); - - String word1 = randomWords.get(randomIndex1).trim(); - String word2 = randomWords.get(randomIndex2).trim(); - - trie.update(word1, word2); - testerMap.put(word1, word2); - } - - int half = testerMap.size() / 2; - for (int r = 0; r < half; ++r) { - - int randomIndex = generator.nextInt(randomWords.size()); - String word1 = randomWords.get(randomIndex).trim(); - - testerMap.remove(word1); - trie.delete(word1); - } - - trie.cleanCache(); - trie.sync(); - - // Assert the result now - Iterator keys = testerMap.keySet().iterator(); - while (keys.hasNext()) { - - String mapWord1 = keys.next(); - String mapWord2 = testerMap.get(mapWord1); - String treeWord2 = new String(trie.get(mapWord1)); - - Assert.assertEquals(mapWord2, treeWord2); - } - } - } - - - @Ignore - @Test - public void reddisTest() throws URISyntaxException, IOException { - - URL massiveUpload_1 = ClassLoader - .getSystemResource("trie/massive-upload.dmp"); - - File file = new File(massiveUpload_1.toURI()); - List strData = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8); - String dbName = "state"; - - long startTime = System.currentTimeMillis(); - - Jedis jedis = new Jedis("localhost"); - jedis.flushAll(); - Pipeline pipeline = jedis.pipelined(); - Set keys = jedis.keys("*"); - System.out.println("before: all " + keys.size()); - - for (String aStrData : strData) { - String[] keyVal = aStrData.split("="); - - if (keyVal[0].equals("*")) - pipeline.del(keyVal[1].getBytes()); - else - pipeline.set(keyVal[0].getBytes(), keyVal[1].getBytes()); - } - - pipeline.sync(); - keys = jedis.keys("*"); - System.out.println("all " + keys.size()); - for (String key : keys) - System.out.println(key + " -> " + jedis.get(key)); - - - System.out.println("time: " + (System.currentTimeMillis() - startTime)); - } - - - @Ignore - @Test - public void testMasiveDetermenisticUpdate() throws IOException, URISyntaxException { - - // should be root: cfd77c0fcb037adefce1f4e2eb94381456a4746379d2896bb8f309c620436d30 - - URL massiveUpload_1 = ClassLoader - .getSystemResource("trie/massive-upload.dmp"); - - File file = new File(massiveUpload_1.toURI()); - List strData = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8); - - // *** Part - 1 *** - // 1. load the data from massive-upload.dmp - // which includes deletes/upadtes (5000 operations) - TrieImpl trieSingle = new TrieImpl(mockDb_2); - for (String aStrData : strData) { - - String[] keyVal = aStrData.split("="); - - if (keyVal[0].equals("*")) - trieSingle.delete(keyVal[1].trim()); - else - trieSingle.update(keyVal[0].trim(), keyVal[1].trim()); - } - - - System.out.println("root_1: => " + Hex.toHexString(trieSingle.getRootHash())); - - // *** Part - 2 *** - // pre. we use the same data from massive-upload.dmp - // which includes deletes/upadtes (100000 operations) - // 1. part of the data loaded - // 2. the trie cache sync to the db - // 3. the rest of the data loaded with part of the trie not in the cache - TrieImpl trie = new TrieImpl(mockDb); - - for (int i = 0; i < 2000; ++i) { - - String[] keyVal = strData.get(i).split("="); - - if (keyVal[0].equals("*")) - trie.delete(keyVal[1].trim()); - else - trie.update(keyVal[0].trim(), keyVal[1].trim()); - } - - trie.cleanCache(); - trie.sync(); - - TrieImpl trie2 = new TrieImpl(mockDb, trie.getRootHash()); - - for (int i = 2000; i < strData.size(); ++i) { - - String[] keyVal = strData.get(i).split("="); - - if (keyVal[0].equals("*")) - trie2.delete(keyVal[1].trim()); - else - trie2.update(keyVal[0].trim(), keyVal[1].trim()); - } - - System.out.println("root_2: => " + Hex.toHexString(trie2.getRootHash())); - - assertEquals(trieSingle.getRootHash(), trie2.getRootHash()); - - } - - @Test // tests saving keys to the file // - public void testMasiveUpdateFromDB() { - boolean massiveUpdateFromDBEnabled = false; - - if (massiveUpdateFromDBEnabled) { - List randomWords = Arrays.asList(randomDictionary.split(",")); - Map testerMap = new HashMap<>(); - - TrieImpl trie = new TrieImpl(mockDb); - Random generator = new Random(); - - // Random insertion - for (int i = 0; i < 50000; ++i) { - - int randomIndex1 = generator.nextInt(randomWords.size()); - int randomIndex2 = generator.nextInt(randomWords.size()); - - String word1 = randomWords.get(randomIndex1).trim(); - String word2 = randomWords.get(randomIndex2).trim(); - - trie.update(word1, word2); - testerMap.put(word1, word2); - } - - trie.cleanCache(); - trie.sync(); - - // Assert the result now - Iterator keys = testerMap.keySet().iterator(); - while (keys.hasNext()) { - - String mapWord1 = keys.next(); - String mapWord2 = testerMap.get(mapWord1); - String treeWord2 = new String(trie.get(mapWord1)); - - Assert.assertEquals(mapWord2, treeWord2); - } - - TrieImpl trie2 = new TrieImpl(mockDb, trie.getRootHash()); - - // Assert the result now - keys = testerMap.keySet().iterator(); - while (keys.hasNext()) { - - String mapWord1 = keys.next(); - String mapWord2 = testerMap.get(mapWord1); - String treeWord2 = new String(trie2.get(mapWord1)); - - Assert.assertEquals(mapWord2, treeWord2); - } - } - } - - - @Test - public void testRollbackTrie() throws URISyntaxException, IOException { - - TrieImpl trieSingle = new TrieImpl(mockDb); - - URL massiveUpload_1 = ClassLoader - .getSystemResource("trie/massive-upload.dmp"); - - File file = new File(massiveUpload_1.toURI()); - List strData = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8); - - List roots = new ArrayList<>(); - Map trieDumps = new HashMap<>(); - - for (int i = 0; i < 100; ++i) { - - String[] keyVal = strData.get(i).split("="); - - if (keyVal[0].equals("*")) - trieSingle.delete(keyVal[1].trim()); - else - trieSingle.update(keyVal[0].trim(), keyVal[1].trim()); - - byte[] hash = trieSingle.getRootHash(); - roots.add(hash); - - String key = Hex.toHexString(hash); - String dump = trieSingle.getTrieDump(); - trieDumps.put(key, dump); - } - - // compare all 100 rollback dumps and - // the originaly saved dumps - for (int i = 1; i < roots.size(); ++i) { - - byte[] root = roots.get(i); - logger.info("rollback over root : {}", Hex.toHexString(root)); - - trieSingle.setRoot(root); - String currDump = trieSingle.getTrieDump(); - String originDump = trieDumps.get(Hex.toHexString(root)); -// System.out.println(currDump); - Assert.assertEquals(currDump, originDump); - } - - } - - - @Ignore - @Test - public void testGetFromRootNode() { - TrieImpl trie1 = new TrieImpl(mockDb); - trie1.update(cat, LONG_STRING); - trie1.sync(); - TrieImpl trie2 = new TrieImpl(mockDb, trie1.getRootHash()); - assertEquals(LONG_STRING, new String(trie2.get(cat))); - } - - -/* - 0x7645b9fbf1b51e6b980801fafe6bbc22d2ebe218 0x517eaccda568f3fa24915fed8add49d3b743b3764c0bc495b19a47c54dbc3d62 0x 0x1 - 0x0000000000000000000000000000000000000000000000000000000000000010 0x947e70f9460402290a3e487dae01f610a1a8218fda - 0x0000000000000000000000000000000000000000000000000000000000000014 0x40 - 0x0000000000000000000000000000000000000000000000000000000000000016 0x94412e0c4f0102f3f0ac63f0a125bce36ca75d4e0d - 0x0000000000000000000000000000000000000000000000000000000000000017 0x01 -*/ - - @Test - public void storageHashCalc_1() { - - byte[] key1 = Hex.decode("0000000000000000000000000000000000000000000000000000000000000010"); - byte[] key2 = Hex.decode("0000000000000000000000000000000000000000000000000000000000000014"); - byte[] key3 = Hex.decode("0000000000000000000000000000000000000000000000000000000000000016"); - byte[] key4 = Hex.decode("0000000000000000000000000000000000000000000000000000000000000017"); - - byte[] val1 = Hex.decode("947e70f9460402290a3e487dae01f610a1a8218fda"); - byte[] val2 = Hex.decode("40"); - byte[] val3 = Hex.decode("94412e0c4f0102f3f0ac63f0a125bce36ca75d4e0d"); - byte[] val4 = Hex.decode("01"); - - TrieImpl storage = new TrieImpl(new MockDB()); - storage.update(key1, val1); - storage.update(key2, val2); - storage.update(key3, val3); - storage.update(key4, val4); - - String hash = Hex.toHexString(storage.getRootHash()); - - System.out.println(hash); - Assert.assertEquals("517eaccda568f3fa24915fed8add49d3b743b3764c0bc495b19a47c54dbc3d62", hash); - } - - - @Test - public void testFromDump_1() throws URISyntaxException, IOException, ParseException { - - - // LOAD: real dump from real state run - URL dbDump = ClassLoader - .getSystemResource("dbdump/dbdump.json"); - - File dbDumpFile = new File(dbDump.toURI()); - byte[] testData = Files.readAllBytes(dbDumpFile.toPath()); - String testSrc = new String(testData); - - JSONParser parser = new JSONParser(); - JSONArray dbDumpJSONArray = (JSONArray) parser.parse(testSrc); - - KeyValueDataSource keyValueDataSource = new LevelDbDataSource("testState"); - keyValueDataSource.init(); - - DatabaseImpl db = new DatabaseImpl(keyValueDataSource); - - for (Object aDbDumpJSONArray : dbDumpJSONArray) { - - JSONObject obj = (JSONObject) aDbDumpJSONArray; - byte[] key = Hex.decode(obj.get("key").toString()); - byte[] val = Hex.decode(obj.get("val").toString()); - - db.put(key, val); - } - - // TEST: load trie out of this run up to block#33 - byte[] rootNode = Hex.decode("bb690805d24882bc7ccae6fc0f80ac146274d5b81c6a6e9c882cd9b0a649c9c7"); - TrieImpl trie = new TrieImpl(db.getDb(), rootNode); - - // first key added in genesis - byte[] val1 = trie.get(Hex.decode("51ba59315b3a95761d0863b05ccc7a7f54703d99")); - AccountState accountState1 = new AccountState(val1); - - assertEquals(BigInteger.valueOf(2).pow(200), accountState1.getBalance()); - assertEquals("c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", Hex.toHexString(accountState1.getCodeHash())); - assertEquals(BigInteger.ZERO, accountState1.getNonce()); - assertEquals(null, accountState1.getStateRoot()); - - // last key added up to block#33 - byte[] val2 = trie.get(Hex.decode("a39c2067eb45bc878818946d0f05a836b3da44fa")); - AccountState accountState2 = new AccountState(val2); - - assertEquals(new BigInteger("1500000000000000000"), accountState2.getBalance()); - assertEquals("c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", Hex.toHexString(accountState2.getCodeHash())); - assertEquals(BigInteger.ZERO, accountState2.getNonce()); - assertEquals(null, accountState2.getStateRoot()); - - db.close(); - } - - - @Test // update the trie with blog key/val - // each time dump the entire trie - public void testSample_1() { - - TrieImpl trie = new TrieImpl(mockDb); - - trie.update("dog", "puppy"); - String dmp = trie.getTrieDump(); - System.out.println(dmp); - System.out.println(); - Assert.assertEquals("ed6e08740e4a267eca9d4740f71f573e9aabbcc739b16a2fa6c1baed5ec21278", Hex.toHexString(trie.getRootHash())); - - trie.update("do", "verb"); - dmp = trie.getTrieDump(); - System.out.println(dmp); - System.out.println(); - Assert.assertEquals("779db3986dd4f38416bfde49750ef7b13c6ecb3e2221620bcad9267e94604d36", Hex.toHexString(trie.getRootHash())); - - trie.update("doggiestan", "aeswome_place"); - dmp = trie.getTrieDump(); - System.out.println(dmp); - System.out.println(); - Assert.assertEquals("8bd5544747b4c44d1274aa99a6293065fe319b3230e800203317e4c75a770099", Hex.toHexString(trie.getRootHash())); - } - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/util/ByteUtilTest.java b/ethereumj-core/src/test/java/test/ethereum/util/ByteUtilTest.java deleted file mode 100644 index 7f26b413..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/util/ByteUtilTest.java +++ /dev/null @@ -1,331 +0,0 @@ -package test.ethereum.util; - -import org.ethereum.util.ByteUtil; -import org.ethereum.util.FastByteComparisons; - -import org.junit.Assert; -import org.junit.Test; - -import org.spongycastle.util.BigIntegers; -import org.spongycastle.util.encoders.Hex; - -import java.math.BigInteger; - -import java.nio.ByteBuffer; - -import java.util.ArrayList; -import java.util.List; - -import static org.junit.Assert.*; - -public class ByteUtilTest { - - @Test - public void testAppendByte() { - byte[] bytes = "tes".getBytes(); - byte b = 0x74; - Assert.assertArrayEquals("test".getBytes(), ByteUtil.appendByte(bytes, b)); - } - - @Test - public void testBigIntegerToBytes() { - byte[] expecteds = new byte[]{(byte) 0xff, (byte) 0xec, 0x78}; - BigInteger b = BigInteger.valueOf(16772216); - byte[] actuals = ByteUtil.bigIntegerToBytes(b); - assertArrayEquals(expecteds, actuals); - } - - @Test - public void testBigIntegerToBytesNegative() { - byte[] expecteds = new byte[]{(byte) 0xff, 0x0, 0x13, (byte) 0x88}; - BigInteger b = BigInteger.valueOf(-16772216); - byte[] actuals = ByteUtil.bigIntegerToBytes(b); - assertArrayEquals(expecteds, actuals); - } - - @Test - public void testBigIntegerToBytesZero() { - byte[] expecteds = new byte[]{0x00}; - BigInteger b = BigInteger.ZERO; - byte[] actuals = ByteUtil.bigIntegerToBytes(b); - assertArrayEquals(expecteds, actuals); - } - - @Test - public void testToHexString() { - assertEquals("", ByteUtil.toHexString(null)); - } - - @Test - public void testCalcPacketLength() { - byte[] test = new byte[]{0x0f, 0x10, 0x43}; - byte[] expected = new byte[]{0x00, 0x00, 0x00, 0x03}; - assertArrayEquals(expected, ByteUtil.calcPacketLength(test)); - } - - @Test - public void testByteArrayToInt() { - assertEquals(0, ByteUtil.byteArrayToInt(null)); - assertEquals(0, ByteUtil.byteArrayToInt(new byte[0])); - -// byte[] x = new byte[] { 5,1,7,0,8 }; -// long start = System.currentTimeMillis(); -// for (int i = 0; i < 100000000; i++) { -// ByteArray.read32bit(x, 0); -// } -// long end = System.currentTimeMillis(); -// System.out.println(end - start + "ms"); -// -// long start1 = System.currentTimeMillis(); -// for (int i = 0; i < 100000000; i++) { -// new BigInteger(1, x).intValue(); -// } -// long end1 = System.currentTimeMillis(); -// System.out.println(end1 - start1 + "ms"); - - } - - @Test - public void testNumBytes() { - String test1 = "0"; - String test2 = "1"; - String test3 = "1000000000"; //3B9ACA00 - int expected1 = 1; - int expected2 = 1; - int expected3 = 4; - assertEquals(expected1, ByteUtil.numBytes(test1)); - assertEquals(expected2, ByteUtil.numBytes(test2)); - assertEquals(expected3, ByteUtil.numBytes(test3)); - } - - @Test - public void testStripLeadingZeroes() { - byte[] test1 = null; - byte[] test2 = new byte[]{}; - byte[] test3 = new byte[]{0x00}; - byte[] test4 = new byte[]{0x00, 0x01}; - byte[] test5 = new byte[]{0x00, 0x00, 0x01}; - byte[] expected1 = null; - byte[] expected2 = new byte[]{0}; - byte[] expected3 = new byte[]{0}; - byte[] expected4 = new byte[]{0x01}; - byte[] expected5 = new byte[]{0x01}; - assertArrayEquals(expected1, ByteUtil.stripLeadingZeroes(test1)); - assertArrayEquals(expected2, ByteUtil.stripLeadingZeroes(test2)); - assertArrayEquals(expected3, ByteUtil.stripLeadingZeroes(test3)); - assertArrayEquals(expected4, ByteUtil.stripLeadingZeroes(test4)); - assertArrayEquals(expected5, ByteUtil.stripLeadingZeroes(test5)); - } - - @Test - public void testMatchingNibbleLength1() { - // a larger than b - byte[] a = new byte[]{0x00, 0x01}; - byte[] b = new byte[]{0x00}; - int result = ByteUtil.matchingNibbleLength(a, b); - assertEquals(1, result); - } - - @Test - public void testMatchingNibbleLength2() { - // b larger than a - byte[] a = new byte[]{0x00}; - byte[] b = new byte[]{0x00, 0x01}; - int result = ByteUtil.matchingNibbleLength(a, b); - assertEquals(1, result); - } - - @Test - public void testMatchingNibbleLength3() { - // a and b the same length equal - byte[] a = new byte[]{0x00}; - byte[] b = new byte[]{0x00}; - int result = ByteUtil.matchingNibbleLength(a, b); - assertEquals(1, result); - } - - @Test - public void testMatchingNibbleLength4() { - // a and b the same length not equal - byte[] a = new byte[]{0x01}; - byte[] b = new byte[]{0x00}; - int result = ByteUtil.matchingNibbleLength(a, b); - assertEquals(0, result); - } - - @Test - public void testNiceNiblesOutput_1() { - byte[] test = {7, 0, 7, 5, 7, 0, 7, 0, 7, 9}; - String result = "\\x07\\x00\\x07\\x05\\x07\\x00\\x07\\x00\\x07\\x09"; - assertEquals(result, ByteUtil.nibblesToPrettyString(test)); - } - - @Test - public void testNiceNiblesOutput_2() { - byte[] test = {7, 0, 7, 0xf, 7, 0, 0xa, 0, 7, 9}; - String result = "\\x07\\x00\\x07\\x0f\\x07\\x00\\x0a\\x00\\x07\\x09"; - assertEquals(result, ByteUtil.nibblesToPrettyString(test)); - } - - @Test(expected = NullPointerException.class) - public void testMatchingNibbleLength5() { - // a == null - byte[] a = null; - byte[] b = new byte[]{0x00}; - ByteUtil.matchingNibbleLength(a, b); - } - - @Test(expected = NullPointerException.class) - public void testMatchingNibbleLength6() { - // b == null - byte[] a = new byte[]{0x00}; - byte[] b = null; - ByteUtil.matchingNibbleLength(a, b); - } - - @Test - public void testMatchingNibbleLength7() { - // a or b is empty - byte[] a = new byte[0]; - byte[] b = new byte[]{0x00}; - int result = ByteUtil.matchingNibbleLength(a, b); - assertEquals(0, result); - } - - /** - * This test shows the difference between iterating over, - * and comparing byte[] vs BigInteger value. - * - * Results indicate that the former has ~15x better performance. - * Therefore this is used in the Miner.mine() method. - */ - @Test - public void testIncrementPerformance() { - boolean testEnabled = false; - - if (testEnabled) { - byte[] counter1 = new byte[4]; - byte[] max = ByteBuffer.allocate(4).putInt(Integer.MAX_VALUE).array(); - long start1 = System.currentTimeMillis(); - while (ByteUtil.increment(counter1)) { - if (FastByteComparisons.compareTo(counter1, 0, 4, max, 0, 4) == 0) { - break; - } - } - System.out.println(System.currentTimeMillis() - start1 + "ms to reach: " + Hex.toHexString(counter1)); - - BigInteger counter2 = BigInteger.ZERO; - long start2 = System.currentTimeMillis(); - while (true) { - if (counter2.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) == 0) { - break; - } - counter2 = counter2.add(BigInteger.ONE); - } - System.out.println(System.currentTimeMillis() - start2 + "ms to reach: " + Hex.toHexString(BigIntegers.asUnsignedByteArray(4, counter2))); - } - } - - - @Test - public void firstNonZeroByte_1() { - - byte[] data = Hex.decode("0000000000000000000000000000000000000000000000000000000000000000"); - int result = ByteUtil.firstNonZeroByte(data); - - assertEquals(-1, result); - } - - @Test - public void firstNonZeroByte_2() { - - byte[] data = Hex.decode("0000000000000000000000000000000000000000000000000000000000332211"); - int result = ByteUtil.firstNonZeroByte(data); - - assertEquals(29, result); - } - - @Test - public void firstNonZeroByte_3() { - - byte[] data = Hex.decode("2211009988776655443322110099887766554433221100998877665544332211"); - int result = ByteUtil.firstNonZeroByte(data); - - assertEquals(0, result); - } - - @Test - public void setBitTest() { - /* - Set on - */ - byte[] data = ByteBuffer.allocate(4).putInt(0).array(); - int posBit = 24; - int expected = 16777216; - int result = -1; - byte[] ret = ByteUtil.setBit(data, posBit, 1); - result = ByteUtil.byteArrayToInt(ret); - assertTrue(expected == result); - - posBit = 25; - expected = 50331648; - ret = ByteUtil.setBit(data, posBit, 1); - result = ByteUtil.byteArrayToInt(ret); - assertTrue(expected == result); - - posBit = 2; - expected = 50331652; - ret = ByteUtil.setBit(data, posBit, 1); - result = ByteUtil.byteArrayToInt(ret); - assertTrue(expected == result); - - /* - Set off - */ - posBit = 24; - expected = 33554436; - ret = ByteUtil.setBit(data, posBit, 0); - result = ByteUtil.byteArrayToInt(ret); - assertTrue(expected == result); - - posBit = 25; - expected = 4; - ret = ByteUtil.setBit(data, posBit, 0); - result = ByteUtil.byteArrayToInt(ret); - assertTrue(expected == result); - - posBit = 2; - expected = 0; - ret = ByteUtil.setBit(data, posBit, 0); - result = ByteUtil.byteArrayToInt(ret); - assertTrue(expected == result); - } - - @Test - public void getBitTest() { - byte[] data = ByteBuffer.allocate(4).putInt(0).array(); - ByteUtil.setBit(data, 24, 1); - ByteUtil.setBit(data, 25, 1); - ByteUtil.setBit(data, 2, 1); - - List found = new ArrayList<>(); - for (int i = 0; i < (data.length * 8); i++) { - int res = ByteUtil.getBit(data, i); - if (res == 1) - if (i != 24 && i != 25 && i != 2) - assertTrue(false); - else - found.add(i); - else { - if (i == 24 || i == 25 || i == 2) - assertTrue(false); - } - } - - if (found.size() != 3) - assertTrue(false); - assertTrue(found.get(0) == 2); - assertTrue(found.get(1) == 24); - assertTrue(found.get(2) == 25); - } -} diff --git a/ethereumj-core/src/test/java/test/ethereum/util/CompactEncoderTest.java b/ethereumj-core/src/test/java/test/ethereum/util/CompactEncoderTest.java deleted file mode 100644 index 3424f30b..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/util/CompactEncoderTest.java +++ /dev/null @@ -1,89 +0,0 @@ -package test.ethereum.util; - -import org.ethereum.util.CompactEncoder; - -import org.junit.Test; - -import static org.junit.Assert.assertArrayEquals; - -public class CompactEncoderTest { - - private final static byte T = 16; // terminator - - @Test - public void testCompactEncodeOddCompact() { - byte[] test = new byte[]{1, 2, 3, 4, 5}; - byte[] expectedData = new byte[]{0x11, 0x23, 0x45}; - assertArrayEquals("odd compact encode fail", expectedData, CompactEncoder.packNibbles(test)); - } - - @Test - public void testCompactEncodeEvenCompact() { - byte[] test = new byte[]{0, 1, 2, 3, 4, 5}; - byte[] expectedData = new byte[]{0x00, 0x01, 0x23, 0x45}; - assertArrayEquals("even compact encode fail", expectedData, CompactEncoder.packNibbles(test)); - } - - @Test - public void testCompactEncodeEvenTerminated() { - byte[] test = new byte[]{0, 15, 1, 12, 11, 8, T}; - byte[] expectedData = new byte[]{0x20, 0x0f, 0x1c, (byte) 0xb8}; - assertArrayEquals("even terminated compact encode fail", expectedData, CompactEncoder.packNibbles(test)); - } - - @Test - public void testCompactEncodeOddTerminated() { - byte[] test = new byte[]{15, 1, 12, 11, 8, T}; - byte[] expectedData = new byte[]{0x3f, 0x1c, (byte) 0xb8}; - assertArrayEquals("odd terminated compact encode fail", expectedData, CompactEncoder.packNibbles(test)); - } - - @Test - public void testCompactDecodeOddCompact() { - byte[] test = new byte[]{0x11, 0x23, 0x45}; - byte[] expected = new byte[]{1, 2, 3, 4, 5}; - assertArrayEquals("odd compact decode fail", expected, CompactEncoder.unpackToNibbles(test)); - } - - @Test - public void testCompactDecodeEvenCompact() { - byte[] test = new byte[]{0x00, 0x01, 0x23, 0x45}; - byte[] expected = new byte[]{0, 1, 2, 3, 4, 5}; - assertArrayEquals("even compact decode fail", expected, CompactEncoder.unpackToNibbles(test)); - } - - @Test - public void testCompactDecodeEvenTerminated() { - byte[] test = new byte[]{0x20, 0x0f, 0x1c, (byte) 0xb8}; - byte[] expected = new byte[]{0, 15, 1, 12, 11, 8, T}; - assertArrayEquals("even terminated compact decode fail", expected, CompactEncoder.unpackToNibbles(test)); - } - - @Test - public void testCompactDecodeOddTerminated() { - byte[] test = new byte[]{0x3f, 0x1c, (byte) 0xb8}; - byte[] expected = new byte[]{15, 1, 12, 11, 8, T}; - assertArrayEquals("odd terminated compact decode fail", expected, CompactEncoder.unpackToNibbles(test)); - } - - @Test - public void testCompactHexEncode_1() { - byte[] test = "stallion".getBytes(); - byte[] result = new byte[]{7, 3, 7, 4, 6, 1, 6, 12, 6, 12, 6, 9, 6, 15, 6, 14, T}; - assertArrayEquals(result, CompactEncoder.binToNibbles(test)); - } - - @Test - public void testCompactHexEncode_2() { - byte[] test = "verb".getBytes(); - byte[] result = new byte[]{7, 6, 6, 5, 7, 2, 6, 2, T}; - assertArrayEquals(result, CompactEncoder.binToNibbles(test)); - } - - @Test - public void testCompactHexEncode_3() { - byte[] test = "puppy".getBytes(); - byte[] result = new byte[]{7, 0, 7, 5, 7, 0, 7, 0, 7, 9, T}; - assertArrayEquals(result, CompactEncoder.binToNibbles(test)); - } -} diff --git a/ethereumj-core/src/test/java/test/ethereum/util/HashUtilTest.java b/ethereumj-core/src/test/java/test/ethereum/util/HashUtilTest.java deleted file mode 100644 index a6271b30..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/util/HashUtilTest.java +++ /dev/null @@ -1,87 +0,0 @@ -package test.ethereum.util; - -import org.ethereum.crypto.HashUtil; - -import org.junit.Test; - -import org.spongycastle.util.encoders.Hex; - -import static org.junit.Assert.assertEquals; - -public class HashUtilTest { - - @Test - public void testSha256_EmptyString() { - String expected1 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; - String result1 = Hex.toHexString(HashUtil.sha256(new byte[0])); - assertEquals(expected1, result1); - } - - @Test - public void testSha256_Test() { - String expected2 = "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"; - String result2 = Hex.toHexString(HashUtil.sha256("test".getBytes())); - assertEquals(expected2, result2); - } - - @Test - public void testSha256_Multiple() { - String expected1 = "1b4f0e9851971998e732078544c96b36c3d01cedf7caa332359d6f1d83567014"; - String result1 = Hex.toHexString(HashUtil.sha256("test1".getBytes())); - assertEquals(expected1, result1); - - String expected2 = "60303ae22b998861bce3b28f33eec1be758a213c86c93c076dbe9f558c11c752"; - String result2 = Hex.toHexString(HashUtil.sha256("test2".getBytes())); - assertEquals(expected2, result2); - } - - @Test - public void testSha3_EmptyString() { - String expected1 = "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"; - String result1 = Hex.toHexString(HashUtil.sha3(new byte[0])); - assertEquals(expected1, result1); - } - - @Test - public void testSha3_Test() { - String expected2 = "9c22ff5f21f0b81b113e63f7db6da94fedef11b2119b4088b89664fb9a3cb658"; - String result2 = Hex.toHexString(HashUtil.sha3("test".getBytes())); - assertEquals(expected2, result2); - } - - @Test - public void testSha3_Multiple() { - String expected1 = "6d255fc3390ee6b41191da315958b7d6a1e5b17904cc7683558f98acc57977b4"; - String result1 = Hex.toHexString(HashUtil.sha3("test1".getBytes())); - assertEquals(expected1, result1); - - String expected2 = "4da432f1ecd4c0ac028ebde3a3f78510a21d54087b161590a63080d33b702b8d"; - String result2 = Hex.toHexString(HashUtil.sha3("test2".getBytes())); - assertEquals(expected2, result2); - } - - @Test - public void testRIPEMD160_EmptyString() { - String expected1 = "9c1185a5c5e9fc54612808977ee8f548b2258d31"; - String result1 = Hex.toHexString(HashUtil.ripemd160(new byte[0])); - assertEquals(expected1, result1); - } - - @Test - public void testRIPEMD160_Test() { - String expected2 = "5e52fee47e6b070565f74372468cdc699de89107"; - String result2 = Hex.toHexString(HashUtil.ripemd160("test".getBytes())); - assertEquals(expected2, result2); - } - - @Test - public void testRIPEMD160_Multiple() { - String expected1 = "9295fac879006ff44812e43b83b515a06c2950aa"; - String result1 = Hex.toHexString(HashUtil.ripemd160("test1".getBytes())); - assertEquals(expected1, result1); - - String expected2 = "80b85ebf641abccdd26e327c5782353137a0a0af"; - String result2 = Hex.toHexString(HashUtil.ripemd160("test2".getBytes())); - assertEquals(expected2, result2); - } -} diff --git a/ethereumj-core/src/test/java/test/ethereum/util/RLPTest.java b/ethereumj-core/src/test/java/test/ethereum/util/RLPTest.java deleted file mode 100644 index 68e54902..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/util/RLPTest.java +++ /dev/null @@ -1,986 +0,0 @@ -package test.ethereum.util; - -import org.ethereum.crypto.HashUtil; -import org.ethereum.util.DecodeResult; -import org.ethereum.util.RLP; -import org.ethereum.util.RLPList; - -import com.cedarsoftware.util.DeepEquals; - -import org.junit.Ignore; -import org.junit.Test; - -import org.spongycastle.util.encoders.Hex; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectOutputStream; -import java.io.Serializable; - -import java.math.BigInteger; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -import java.util.Arrays; -import java.util.LinkedList; -import java.util.Queue; - -import static org.ethereum.util.ByteUtil.byteArrayToInt; -import static org.junit.Assert.*; -import static test.ethereum.util.RlpTestData.*; - -public class RLPTest { - - @Test - public void test1() throws UnknownHostException { - - String peersPacket = "F8 4E 11 F8 4B C5 36 81 " + - "CC 0A 29 82 76 5F B8 40 D8 D6 0C 25 80 FA 79 5C " + - "FC 03 13 EF DE BA 86 9D 21 94 E7 9E 7C B2 B5 22 " + - "F7 82 FF A0 39 2C BB AB 8D 1B AC 30 12 08 B1 37 " + - "E0 DE 49 98 33 4F 3B CF 73 FA 11 7E F2 13 F8 74 " + - "17 08 9F EA F8 4C 21 B0"; - - byte[] payload = Hex.decode(peersPacket); - - byte[] ip = RLP.decodeIP4Bytes(payload, 5); - - assertEquals(InetAddress.getByAddress(ip).toString(), ("/54.204.10.41")); - } - - @Test - public void test2() throws UnknownHostException { - - String peersPacket = "F8 4E 11 F8 4B C5 36 81 " + - "CC 0A 29 82 76 5F B8 40 D8 D6 0C 25 80 FA 79 5C " + - "FC 03 13 EF DE BA 86 9D 21 94 E7 9E 7C B2 B5 22 " + - "F7 82 FF A0 39 2C BB AB 8D 1B AC 30 12 08 B1 37 " + - "E0 DE 49 98 33 4F 3B CF 73 FA 11 7E F2 13 F8 74 " + - "17 08 9F EA F8 4C 21 B0"; - - byte[] payload = Hex.decode(peersPacket); - int oneInt = RLP.decodeInt(payload, 11); - - assertEquals(oneInt, 30303); - } - - @Test - public void test3() throws UnknownHostException { - - String peersPacket = "F8 9A 11 F8 4B C5 36 81 " + - "CC 0A 29 82 76 5F B8 40 D8 D6 0C 25 80 FA 79 5C " + - "FC 03 13 EF DE BA 86 9D 21 94 E7 9E 7C B2 B5 22 " + - "F7 82 FF A0 39 2C BB AB 8D 1B AC 30 12 08 B1 37 " + - "E0 DE 49 98 33 4F 3B CF 73 FA 11 7E F2 13 F8 74 " + - "17 08 9F EA F8 4C 21 B0 F8 4A C4 36 02 0A 29 " + - "82 76 5F B8 40 D8 D6 0C 25 80 FA 79 5C FC 03 13 " + - "EF DE BA 86 9D 21 94 E7 9E 7C B2 B5 22 F7 82 FF " + - "A0 39 2C BB AB 8D 1B AC 30 12 08 B1 37 E0 DE 49 " + - "98 33 4F 3B CF 73 FA 11 7E F2 13 F8 74 17 08 9F " + - "EA F8 4C 21 B0 "; - - byte[] payload = Hex.decode(peersPacket); - - int nextIndex = 5; - byte[] ip = RLP.decodeIP4Bytes(payload, nextIndex); - assertEquals("/54.204.10.41", InetAddress.getByAddress(ip).toString()); - - nextIndex = RLP.getNextElementIndex(payload, nextIndex); - int port = RLP.decodeInt(payload, nextIndex); - assertEquals(30303, port); - - nextIndex = RLP.getNextElementIndex(payload, nextIndex); - BigInteger peerId = RLP.decodeBigInteger(payload, nextIndex); - - BigInteger expectedPeerId = - new BigInteger("9650128800487972697726795438087510101805200020100629942070155319087371611597658887860952245483247188023303607186148645071838189546969115967896446355306572"); - assertEquals(expectedPeerId, peerId); - - nextIndex = RLP.getNextElementIndex(payload, nextIndex); - nextIndex = RLP.getFirstListElement(payload, nextIndex); - ip = RLP.decodeIP4Bytes(payload, nextIndex); - assertEquals("/54.2.10.41", InetAddress.getByAddress(ip).toString()); - - nextIndex = RLP.getNextElementIndex(payload, nextIndex); - port = RLP.decodeInt(payload, nextIndex); - assertEquals(30303, port); - - nextIndex = RLP.getNextElementIndex(payload, nextIndex); - peerId = RLP.decodeBigInteger(payload, nextIndex); - - expectedPeerId = - new BigInteger("9650128800487972697726795438087510101805200020100629942070155319087371611597658887860952245483247188023303607186148645071838189546969115967896446355306572"); - - assertEquals(expectedPeerId, peerId); - - nextIndex = RLP.getNextElementIndex(payload, nextIndex); - nextIndex = RLP.getFirstListElement(payload, nextIndex); - assertEquals(-1, nextIndex); - } - - @Test - /** encode byte */ - public void test4() { - - byte[] expected = {(byte) 0x80}; - byte[] data = RLP.encodeByte((byte) 0); - assertArrayEquals(expected, data); - - byte[] expected2 = {(byte) 0x78}; - data = RLP.encodeByte((byte) 120); - assertArrayEquals(expected2, data); - - byte[] expected3 = {(byte) 0x81, (byte) 0x7F}; - data = RLP.encodeByte((byte) 127); - assertArrayEquals(expected3, data); - } - - @Test - /** encode short */ - public void test5() { - - byte[] expected = {(byte) 0x80}; - byte[] data = RLP.encodeShort((byte) 0); - assertArrayEquals(expected, data); - - byte[] expected2 = {(byte) 0x78}; - data = RLP.encodeShort((byte) 120); - assertArrayEquals(expected2, data); - - byte[] expected3 = {(byte) 0x81, (byte) 0x7F}; - data = RLP.encodeShort((byte) 127); - assertArrayEquals(expected3, data); - - byte[] expected4 = {(byte) 0x82, (byte) 0x76, (byte) 0x5F}; - data = RLP.encodeShort((short) 30303); - assertArrayEquals(expected4, data); - - byte[] expected5 = {(byte) 0x82, (byte) 0x4E, (byte) 0xEA}; - data = RLP.encodeShort((short) 20202); - assertArrayEquals(expected5, data); - } - - @Test - /** encode int */ - public void testEncodeInt() { - - byte[] expected = {(byte) 0x80}; - byte[] data = RLP.encodeInt(0); - assertArrayEquals(expected, data); - - byte[] expected2 = {(byte) 0x78}; - data = RLP.encodeInt(120); - assertArrayEquals(expected2, data); - - byte[] expected3 = {(byte) 0x81, (byte) 0x7F}; - data = RLP.encodeInt(127); - assertArrayEquals(expected3, data); - - byte[] expected4 = {(byte) 0x82, (byte) 0x76, (byte) 0x5F}; - data = RLP.encodeInt(30303); - assertArrayEquals(expected4, data); - - byte[] expected5 = {(byte) 0x82, (byte) 0x4E, (byte) 0xEA}; - data = RLP.encodeInt(20202); - assertArrayEquals(expected5, data); - - byte[] expected6 = {(byte) 0x83, 1, 0, 0}; - data = RLP.encodeInt(65536); - assertArrayEquals(expected6, data); - - byte[] expected7 = {(byte) 0x80}; - data = RLP.encodeInt(Integer.MIN_VALUE); - assertArrayEquals(expected7, data); - - byte[] expected8 = {(byte) 0x84, (byte) 0x7F, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF}; - data = RLP.encodeInt(Integer.MAX_VALUE); - assertArrayEquals(expected8, data); - } - - @Test - /** encode BigInteger */ - public void test6() { - - byte[] expected = new byte[]{(byte) 0x80}; - byte[] data = RLP.encodeBigInteger(BigInteger.ZERO); - assertArrayEquals(expected, data); - } - - @Test - /** encode string */ - public void test7() { - - byte[] data = RLP.encodeString(""); - assertArrayEquals(new byte[]{(byte) 0x80}, data); - - byte[] expected = {(byte) 0x90, (byte) 0x45, (byte) 0x74, (byte) 0x68, (byte) 0x65, (byte) 0x72, (byte) 0x65, - (byte) 0x75, (byte) 0x6D, (byte) 0x4A, (byte) 0x20, (byte) 0x43, (byte) 0x6C, - (byte) 0x69, (byte) 0x65, (byte) 0x6E, (byte) 0x74}; - - String test = "EthereumJ Client"; - data = RLP.encodeString(test); - - assertArrayEquals(expected, data); - - String test2 = "Ethereum(++)/ZeroGox/v0.5.0/ncurses/Linux/g++"; - - byte[] expected2 = {(byte) 0xAD, (byte) 0x45, (byte) 0x74, (byte) 0x68, (byte) 0x65, (byte) 0x72, (byte) 0x65, - (byte) 0x75, (byte) 0x6D, (byte) 0x28, (byte) 0x2B, (byte) 0x2B, (byte) 0x29, (byte) 0x2F, - (byte) 0x5A, (byte) 0x65, (byte) 0x72, (byte) 0x6F, (byte) 0x47, (byte) 0x6F, (byte) 0x78, - (byte) 0x2F, (byte) 0x76, (byte) 0x30, (byte) 0x2E, (byte) 0x35, (byte) 0x2E, (byte) 0x30, - (byte) 0x2F, (byte) 0x6E, (byte) 0x63, (byte) 0x75, (byte) 0x72, (byte) 0x73, (byte) 0x65, - (byte) 0x73, (byte) 0x2F, (byte) 0x4C, (byte) 0x69, (byte) 0x6E, (byte) 0x75, (byte) 0x78, - (byte) 0x2F, (byte) 0x67, (byte) 0x2B, (byte) 0x2B}; - - data = RLP.encodeString(test2); - assertArrayEquals(expected2, data); - - String test3 = "Ethereum(++)/ZeroGox/v0.5.0/ncurses/Linux/g++Ethereum(++)/ZeroGox/v0.5.0/ncurses/Linux/g++"; - - byte[] expected3 = {(byte) 0xB8, (byte) 0x5A, - (byte) 0x45, (byte) 0x74, (byte) 0x68, (byte) 0x65, (byte) 0x72, (byte) 0x65, - (byte) 0x75, (byte) 0x6D, (byte) 0x28, (byte) 0x2B, (byte) 0x2B, (byte) 0x29, (byte) 0x2F, - (byte) 0x5A, (byte) 0x65, (byte) 0x72, (byte) 0x6F, (byte) 0x47, (byte) 0x6F, (byte) 0x78, - (byte) 0x2F, (byte) 0x76, (byte) 0x30, (byte) 0x2E, (byte) 0x35, (byte) 0x2E, (byte) 0x30, - (byte) 0x2F, (byte) 0x6E, (byte) 0x63, (byte) 0x75, (byte) 0x72, (byte) 0x73, (byte) 0x65, - (byte) 0x73, (byte) 0x2F, (byte) 0x4C, (byte) 0x69, (byte) 0x6E, (byte) 0x75, (byte) 0x78, - (byte) 0x2F, (byte) 0x67, (byte) 0x2B, (byte) 0x2B, - - (byte) 0x45, (byte) 0x74, (byte) 0x68, (byte) 0x65, (byte) 0x72, (byte) 0x65, - (byte) 0x75, (byte) 0x6D, (byte) 0x28, (byte) 0x2B, (byte) 0x2B, (byte) 0x29, (byte) 0x2F, - (byte) 0x5A, (byte) 0x65, (byte) 0x72, (byte) 0x6F, (byte) 0x47, (byte) 0x6F, (byte) 0x78, - (byte) 0x2F, (byte) 0x76, (byte) 0x30, (byte) 0x2E, (byte) 0x35, (byte) 0x2E, (byte) 0x30, - (byte) 0x2F, (byte) 0x6E, (byte) 0x63, (byte) 0x75, (byte) 0x72, (byte) 0x73, (byte) 0x65, - (byte) 0x73, (byte) 0x2F, (byte) 0x4C, (byte) 0x69, (byte) 0x6E, (byte) 0x75, (byte) 0x78, - (byte) 0x2F, (byte) 0x67, (byte) 0x2B, (byte) 0x2B}; - - data = RLP.encodeString(test3); - assertArrayEquals(expected3, data); - } - - @Test - /** encode byte array */ - public void test8() { - - String byteArr = "ce73660a06626c1b3fda7b18ef7ba3ce17b6bf604f9541d3c6c654b7ae88b239" - + "407f659c78f419025d785727ed017b6add21952d7e12007373e321dbc31824ba"; - - byte[] byteArray = Hex.decode(byteArr); - - String expected = "b840" + byteArr; - - assertEquals(expected, Hex.toHexString(RLP.encodeElement(byteArray))); - } - - @Test - /** encode list */ - public void test9() { - - byte[] actuals = RLP.encodeList(); - assertArrayEquals(new byte[]{(byte) 0xc0}, actuals); - } - - @Test - /** encode null value */ - public void testEncodeElementNull() { - - byte[] actuals = RLP.encodeElement(null); - assertArrayEquals(new byte[]{(byte) 0x80}, actuals); - } - - @Test - /** encode single byte 0x00 */ - public void testEncodeElementZero() { - - byte[] actuals = RLP.encodeElement(new byte[]{0x00}); - assertArrayEquals(new byte[]{(byte) 0x00}, actuals); - } - - @Test - /** encode single byte 0x01 */ - public void testEncodeElementOne() { - - byte[] actuals = RLP.encodeElement(new byte[]{0x00}); - assertArrayEquals(new byte[]{(byte) 0x00}, actuals); - } - - @Test - /** found bug encode list affects element value, - hhh... not really at the end but keep the test */ - public void test10() { - - /* 2 */ - byte[] prevHash = - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - prevHash = RLP.encodeElement(prevHash); - - /* 2 */ - byte[] uncleList = HashUtil.sha3(RLP.encodeList(new byte[]{})); - - /* 3 */ - byte[] coinbase = - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00}; - coinbase = RLP.encodeElement(coinbase); - - byte[] header = RLP.encodeList( - prevHash, uncleList, coinbase); - - assertEquals("f856a000000000000000000000000000000000000000000000000000000000000000001dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000", - Hex.toHexString(header)); - } - - @Test - public void test11() { -// 2240089100000070 - String tx = "F86E12F86B80881BC16D674EC8000094CD2A3D9F938E13CD947EC05ABC7FE734DF8DD8268609184E72A00064801BA0C52C114D4F5A3BA904A9B3036E5E118FE0DBB987FE3955DA20F2CD8F6C21AB9CA06BA4C2874299A55AD947DBC98A25EE895AABF6B625C26C435E84BFD70EDF2F69"; - byte[] payload = Hex.decode(tx); - - Queue index = new LinkedList<>(); - RLP.fullTraverse(payload, 0, 0, payload.length, 1, index); - - // TODO: assert lenght overflow while parsing list in RLP - } - - @Test - public void test12() { - - String tx = "F86E12F86B80881BC16D674EC8000094CD2A3D9F938E13CD947EC05ABC7FE734DF8DD8268609184E72A00064801BA0C52C114D4F5A3BA904A9B3036E5E118FE0DBB987FE3955DA20F2CD8F6C21AB9CA06BA4C2874299A55AD947DBC98A25EE895AABF6B625C26C435E84BFD70EDF2F69"; - byte[] payload = Hex.decode(tx); - - RLPList rlpList = RLP.decode2(payload); - - RLPList.recursivePrint(rlpList); - // TODO: add some asserts in place of just printing the rlpList - } - - @Test /* very long peers msg */ - public void test13() { - - String peers = "f9 14 90 11 f8 4c c6 81 83 68 81 fc 04 82 76 5f b8 40 07 7e 53 7a 8b 36 73 e8 f1 b6 25 db cc " + - "90 2e a7 d4 ce d9 40 2e 46 64 e8 73 67 95 12 cc 23 60 69 8e 53 42 56 52 a0 46 24 fc f7 8c db a1 a3 " + - "23 30 87 a9 19 a3 4d 11 ae da ce ee b7 d8 33 fc bf 26 f8 4c c6 63 81 e7 58 81 af 82 76 5f b8 40 0a " + - "b2 cd e8 3a 09 84 03 dd c2 ea 54 14 74 0d 8a 01 93 e4 49 c9 6e 11 24 19 96 7a bc 62 eb 17 cd ce d7 " + - "7a e0 ab 07 5e 04 f7 dd dc d4 3f b9 04 8b e5 32 06 a0 40 62 0b de 26 cb 74 3f a3 12 31 9f f8 4d c7 " + - "81 cf 81 db 45 81 9a 82 76 5f b8 40 19 c3 3d a7 03 1c ff 17 7e fa 84 2f aa 3d 31 bd 83 e1 76 4e c6 " + - "10 f2 36 94 4a 9f 8a 21 c1 c5 1a 04 f4 7f 6b 5f c3 ef e6 5c af 36 94 43 63 5a fc 58 d8 f5 d4 e2 f1 " + - "2a f9 ee ec 3c 6e 30 bf 0a 2b f8 4c c6 44 30 81 ad 81 a3 82 76 5f b8 40 1e 59 c2 82 08 12 94 80 84 " + - "97 ae 7a 7e 97 67 98 c4 2b 8b cc e1 3c 9d 8b 0e cf 8a fe cd b5 df d4 ef a8 77 0f c0 d1 f7 de 63 c9 " + - "16 40 e7 e8 b4 35 8c 9e 3e d0 f3 d6 c9 86 20 ad 7e a4 24 18 c9 ec f8 4b c5 1f 12 81 9e 48 82 76 5f " + - "b8 40 1f 68 c0 75 c1 d8 7b c0 47 65 43 0f df b1 e5 d0 0f 1b 78 4e d6 be 72 1e 4c af f7 be b5 7b 4b " + - "21 7b 95 da 19 b5 ec 66 04 58 68 b3 9a ac 2e 08 76 cf 80 f0 b6 8d 0f a2 0b db 90 36 be aa 70 61 ea " + - "f8 4c c6 81 bf 81 ea 39 37 82 76 5f b8 40 21 78 0c 55 b4 7d b4 b1 14 67 b5 f5 5b 0b 55 5e 08 87 ce " + - "36 fb d9 75 e2 24 b1 c7 0e ac 7a b8 e8 c2 db 37 f0 a4 8b 90 ff dd 5a 37 9a da 99 b6 a0 f6 42 9c 4a " + - "53 c2 55 58 19 1a 68 26 36 ae f4 f2 f8 4c c6 44 30 81 ad 81 a3 82 76 5f b8 40 23 15 cb 7c f4 9b 8e " + - "ab 21 2c 5a 45 79 0b 50 79 77 39 73 8f 5f 73 34 39 b1 90 11 97 37 ee 8c 09 bc 72 37 94 71 2a a8 2f " + - "26 70 bc 58 1a b0 75 7e f2 31 37 ac 0f df 0f 8c 89 65 e7 dd 6b a7 9f 8c f8 4e c8 81 bf 81 b1 81 d1 " + - "81 9f 82 76 5f b8 40 24 9a 36 41 e5 a8 d0 8e 41 a5 cf c8 da e1 1f 17 61 25 4f 4f d4 7d 9b 13 33 8d " + - "b8 e6 e3 72 9e 6f 2a c9 ec 09 7a 5c 80 96 84 d6 2a 41 e6 df c2 ff f7 2d c3 db d9 7e a2 61 32 bb 97 " + - "64 05 65 bb 0c f8 4a c4 55 41 7e 2d 82 76 5f b8 40 2a 38 ea 5d 9a 7e fd 7f ff c0 a8 1d 8e a7 ed 28 " + - "31 1c 40 12 bb ab 14 07 c8 da d2 68 51 29 e0 42 17 27 34 a3 28 e8 90 7f 90 54 b8 22 5f e7 70 41 d8 " + - "a4 86 a9 79 76 d2 83 72 42 ab 6c 8c 59 05 e4 f8 4c c6 81 83 68 81 fc 04 82 76 5f b8 40 32 4d d9 36 " + - "38 4d 8c 0d de fd e0 4b a7 40 29 98 ab bd 63 d7 9c 0b f8 58 6b 3d d2 c7 db f6 c9 1e b8 0a 7b 6d e8 " + - "f1 6a 50 04 4f 14 9c 7b 39 aa fb 9c 3a d7 f2 ca a4 03 55 aa b0 98 88 18 6f cc a2 f8 4c c6 44 30 81 " + - "ad 81 a3 82 76 5f b8 40 39 42 45 c0 99 16 33 ed 06 0b af b9 64 68 53 d3 44 18 8b 80 4f e3 7e 25 a5 " + - "bc ac 44 ed 44 3a 84 a6 8b 3a af 15 5e fe 48 61 e8 4b 4b 51 5f 9a 5d ec db d7 da e9 81 92 d7 a3 20 " + - "a7 92 c7 d4 df af f8 4d c7 56 81 b7 81 e7 81 cd 82 76 5f b8 40 39 86 50 f6 7b 22 92 93 9d e3 4c 0e " + - "ae b9 14 1f 94 84 a0 fb 17 3f a3 3f 81 a1 f7 31 5d 0e b7 7b de 3a 76 c3 86 36 fa e6 6f a1 4b f2 af " + - "df d6 3e 60 ab d4 0e 29 b0 2a 91 4e 65 de 57 89 98 3f d4 f8 4c c6 44 81 b9 81 ea 40 82 76 5f b8 40 " + - "3a 15 58 7a 1c 3a da bf 02 91 b3 07 f7 1b 2c 04 d1 98 aa e3 6b 83 49 95 d3 30 5d ff 42 f1 ab 86 f4 " + - "83 ae 12 9e 92 03 fb c6 ef 21 87 c8 62 1e dd 18 f6 1d 53 ea a5 b5 87 ff de a4 d9 26 48 90 38 f8 4d " + - "c7 81 cf 81 db 45 81 9a 82 76 5f b8 40 3b 14 62 04 0e a7 78 e3 f7 5e 65 ce 24 53 41 8a 66 2e 62 12 " + - "c9 f6 5b 02 ea b5 8d 22 b2 87 e4 50 53 bd e5 eb f0 60 96 0c bf a0 d9 dc 85 bf 51 ba 7a a1 f2 ca a2 " + - "c1 36 82 d9 32 77 64 1d 60 db eb f8 4c c6 6a 81 a8 0e 81 f9 82 76 5f b8 40 3e cc 97 ab 15 d2 2f 7b " + - "9e df 19 c0 4c e3 b6 09 5f a2 50 42 14 00 2b 35 98 9c 6f 81 ee 4b 96 1c c2 a8 99 c4 94 15 c9 14 e3 " + - "13 90 83 40 04 7d 1d 3b 25 d7 4f 5b 9c 85 a0 6a fa 26 59 a5 39 99 2e f8 4b c5 2e 04 81 c1 09 82 76 " + - "5f b8 40 40 7c 22 00 3f 3b ba a6 cb eb 8e 4b 0a b7 07 30 73 fe ab 85 18 2b 40 55 25 f8 bd 28 32 55 " + - "04 3d 71 35 18 f7 47 48 d9 2c 43 fb b9 9e cc 7c 3f ba b9 5d 59 80 06 51 3a a8 e5 9c 48 04 1c 8b 41 " + - "c2 f8 4b c5 32 7e 56 81 c2 82 76 5f b8 40 40 8c 93 24 20 3b d8 26 2f ce 65 06 ba 59 dc dd 56 70 89 " + - "b0 eb 9a 5b b1 83 47 7b ab bf 61 63 91 4a cd c7 f4 95 f8 96 4d 8a c1 2f e2 40 18 87 b8 cd 8d 97 c0 " + - "c9 dc cf ad db b2 0a 3c 31 47 a7 89 f8 4a c4 26 6c 4f 68 82 76 5f b8 40 42 3e 40 04 da 2f a7 50 0b " + - "c0 12 c0 67 4a a6 57 15 02 c5 3a a4 d9 1e fa 6e 2b 5c b1 e4 68 c4 62 ca 31 14 a2 e2 eb 09 65 b7 04 " + - "4f 9c 95 75 96 5b 47 e4 7a 41 f1 3f 1a dc 03 a2 a4 b3 42 d7 12 8d f8 4b c5 40 81 e7 08 2d 82 76 5f " + - "b8 40 42 83 93 75 27 2c 2f 3d ea db 28 08 5d 06 05 5e 35 31 35 c6 c8 d8 96 09 7a 1b c4 80 c4 88 4f " + - "d1 60 45 18 cb df 73 1a c1 8f 09 84 b7 f0 21 48 e8 82 90 d1 3c 22 4d 82 46 43 14 e2 b5 96 2e 3f 89 " + - "f8 4d c7 32 81 aa 81 d8 81 c8 82 76 5f b8 40 44 cf 19 44 6c a4 65 01 8e 4d e6 c6 0f c0 df 52 9e ba " + - "25 02 92 ef 74 41 e1 db 59 84 1c 69 f0 22 f6 09 28 10 c9 a5 a7 f2 74 f2 f9 7c 4b d6 c7 6e ad c0 64 " + - "c7 d6 59 7c ae b1 7e d8 7c b2 57 73 5f f8 4b c5 32 81 9c 5a 53 82 76 5f b8 40 46 1c 9b 54 e9 19 53 " + - "c5 bb c3 1c 67 12 a9 17 38 2b e6 7d 60 f7 5e b7 f5 06 51 be a3 e5 94 d0 d1 9c 22 29 d8 f6 6a db 3f " + - "20 3f 60 00 38 e7 cc 93 4d c9 27 87 fa c4 39 2b 9b fa 7c bc 78 6f d0 5b f8 4b c5 81 86 64 7d 29 82 " + - "76 5f b8 40 48 35 3a 00 58 e2 64 48 d9 4e 59 33 6c ca 9d 28 a9 37 41 20 de f7 6c 4b cc fe e1 8b 01 " + - "23 e5 91 92 39 3a 2e e3 04 4d 80 e0 ee cb b0 94 76 be 62 fd e1 e8 74 f9 3d 05 ea 5c 4a 9a 45 c0 6e " + - "8f e1 f8 4b c5 4e 08 05 81 bb 82 76 5f b8 40 48 e8 95 09 49 d4 c0 0b cd bb e9 39 c5 bf 07 8f 2c bf " + - "f1 08 84 af 16 60 b1 c3 22 b9 ca a3 ba 35 7b b4 15 7f c6 b0 03 9a f9 43 8d fe 51 ec 27 8a 47 fc d3 " + - "b7 26 fa 0a 08 7d 4c 3c 01 a6 2f 33 5e f8 4a c6 58 45 81 c6 81 c6 07 b8 40 4a 02 55 fa 46 73 fa a3 " + - "0f c5 ab fd 3c 55 0b fd bc 0d 3c 97 3d 35 f7 26 46 3a f8 1c 54 a0 32 81 cf ff 22 c5 f5 96 5b 38 ac " + - "63 01 52 98 77 57 a3 17 82 47 85 49 c3 6f 7c 84 cb 44 36 ba 79 d6 d9 f8 4b c5 40 81 e7 08 2d 82 76 " + - "5f b8 40 4c 75 47 ab 4d 54 1e 10 16 4c d3 74 1f 34 76 ed 19 4b 0a b9 a1 36 df ca c3 94 3f 97 35 8c " + - "9b 05 14 14 27 36 ca 2f 17 0f 12 52 29 05 7b 47 32 44 a6 23 0b f5 47 1a d1 68 18 85 24 b2 b5 cd 8b " + - "7b f8 4c c6 44 30 81 ad 81 a3 82 76 5f b8 40 4d 5e 48 75 d6 0e b4 ee af b6 b2 a7 d3 93 6e d3 c9 bc " + - "58 ac aa de 6a 7f 3c 5f 25 59 8c 20 b3 64 f1 2b ea 2f b1 db 3b 2c 2e f6 47 85 a4 7d 6b 6b 5b 10 34 " + - "27 cb ac 0c 88 b1 8f e9 2a 9f 53 93 f8 f8 4b c5 52 0c 81 e3 54 82 76 5f b8 40 4f d8 98 62 75 74 d3 " + - "e8 6b 3f 5a 65 c3 ed c2 e5 da 84 53 59 26 e4 a2 88 20 b0 03 8b 19 63 6e 07 db 5e b0 04 d7 91 f8 04 " + - "1a 00 6e 33 e1 08 e4 ec 53 54 99 d1 28 d8 d9 c5 ca f6 bb dc 22 04 f7 6a f8 4b c5 81 b4 20 2b 08 82 " + - "76 5f b8 40 53 cc f2 5a b5 94 09 ec bb 90 3d 2e c3 a9 aa 2e b3 9d 7c c4 c7 db 7e 6f 68 fd 71 1a 7c " + - "eb c6 06 21 6d e7 37 82 6d a4 20 93 e3 e6 52 1e e4 77 0e b2 d6 69 dc 4b f3 54 6c c7 57 c3 40 12 69 " + - "6e ae f8 4c c6 6a 81 a8 0e 81 f9 82 76 5f b8 40 54 b3 93 15 69 91 39 87 80 50 2f a8 f4 14 13 79 bc " + - "e2 69 31 be 87 ba 8e 0b 74 9b a9 05 a9 e9 76 e5 de 6d 39 c9 8c f0 48 f2 5c 3c bb b8 c7 f3 02 c4 e6 " + - "04 ad 5b f7 2c db 06 10 0f 50 0d e3 a6 86 f8 4a c4 4c 67 37 47 82 76 5f b8 40 60 0a 77 fb 14 e7 92 " + - "c0 c7 0d c4 ad e3 82 ed 60 43 62 b9 78 b1 9b 94 c4 ed 18 83 38 a1 79 5d 2d b4 5f 7f 22 3b 66 ba eb " + - "a3 91 c5 9b 55 88 b4 4e ba f7 1c 7e b3 97 55 c2 72 29 c7 fd e6 41 be ce f8 4b c5 6d 2b 81 9a 42 82 " + - "76 5f b8 40 69 dd 44 5f 67 c3 be f3 94 f9 54 9f da e1 62 3d bc 20 88 4a 62 fd 56 16 dd bb 49 f8 4b " + - "a8 7e 14 7c b8 a5 0b a9 71 d7 30 c4 62 1d 0e b6 51 33 49 4e 94 fa 5e a2 e6 9c 66 1f 6b 12 e7 ed 2a " + - "8d 4e f8 4b c5 18 09 3d 81 9b 82 76 5f b8 40 6b 5d 4c 35 ff d1 f5 a1 98 03 8a 90 83 4d 29 a1 b8 8b " + - "e0 d5 ef ca 08 bc 8a 2d 58 81 18 0b 0b 41 6b e0 06 29 aa be 45 0a 50 82 8b 8d 1e e8 2d 98 f5 52 81 " + - "87 ee 67 ed 6e 07 3b ce ef cd fb 2b c9 f8 4a c4 55 41 7e 2d 82 76 5f b8 40 6c bb 1e d5 36 dc 38 58 " + - "c1 f0 63 42 9b d3 95 2a 5d 32 ef 8e 11 52 6c df e7 2f 41 fe a1 ac e9 60 18 7c 99 75 ab bc 23 78 35 " + - "11 c0 0f 26 98 35 47 47 f9 05 aa ac 11 dc d2 b7 47 8b 3e af 32 7a c6 f8 4b c5 40 81 e7 08 2d 82 76 " + - "5f b8 40 6e a2 8f 64 ea 1c c3 b6 57 25 44 fd 5b f7 43 b0 ea ab e0 17 f5 14 73 0c 89 7d a3 c7 7f 03 " + - "c5 16 f1 e5 f3 1d 79 3b 4b ce 3c aa 1d ed 56 35 6d 20 b2 eb b5 5a 70 66 f4 1c 25 b7 c3 d5 66 14 e0 " + - "6b f8 4a c4 55 41 7e 2d 82 76 5f b8 40 72 53 24 08 e8 be 6d 5e 2c 9f 65 0f b9 c9 f9 96 50 cc 1f a0 " + - "62 a4 a4 f2 cf e4 e6 ae 69 cd d2 e8 b2 3e d1 4a fe 66 95 5c 23 fa 04 8f 3a 97 6e 3c e8 16 9e 50 5b " + - "6a 89 cc 53 d4 fa c2 0c 2a 11 bf f8 4c c6 52 81 d9 48 81 a9 82 76 5f b8 40 7a ee a4 33 60 b9 36 8b " + - "30 e7 f4 82 86 61 3f d1 e3 b0 20 7f b7 1f 03 08 d5 04 12 11 44 63 e7 7a b8 30 27 c0 d4 0c ad aa b8 " + - "bb f6 12 fc 5b 69 67 fa 1c 40 73 29 d4 7e c6 1f b0 dc 3d a1 08 68 32 f8 4c c6 81 a6 81 93 53 4f 82 " + - "76 5f b8 40 7b 3c dd e0 58 d5 b4 5d 8d b2 24 36 60 cf ea 02 e0 74 ec 21 31 14 c2 51 d7 c0 c3 2d 04 " + - "03 bb 7a b4 77 13 d2 49 2f f6 c8 81 cf c2 aa c3 f5 2c b2 69 76 8c 89 68 f3 b6 b1 8b ac 97 22 d0 53 " + - "31 f6 f8 4c c6 6a 81 a8 0e 81 f9 82 76 5f b8 40 87 ab 58 1b b9 7c 21 2a 2d a7 ef 0d 6e 10 5e 41 b5 " + - "5e 4e 42 cb b6 a1 af 9a 76 1a 01 ca 8c 65 06 9a b4 b5 82 7e 32 2c f2 c5 f5 9e 7f 59 2b e2 a8 17 c4 " + - "5a b6 41 f5 a9 dd 36 89 63 c7 3f 9e e6 88 f8 4c c6 52 81 d9 48 81 a9 82 76 5f b8 40 8c 66 0d bc 6d " + - "3d b0 18 6a d1 0f 05 fd 4f 2f 06 43 77 8e c5 14 e8 45 2a 75 50 c6 30 da 21 17 1a 29 b1 bb 67 c2 e8 " + - "e1 01 ea 1d b3 97 43 f3 e7 8c 4d 26 76 a1 3d 15 51 51 21 51 5f c3 8b 04 8f 37 f8 4c c6 63 81 e7 58 " + - "81 af 82 76 5f b8 40 94 fe 3d 52 a2 89 4c ed c6 b1 54 24 15 6e b8 73 8a 84 41 dd 74 ba 9c ed 66 64 " + - "ed 30 a3 32 a9 5b 57 4d 89 26 2e a3 67 fa 90 0a e9 70 6f b8 1a 40 82 87 bd de f3 a9 dd 9f f4 4e 3a " + - "41 bc 09 0f dc f8 4d c7 81 d5 81 81 81 e6 0a 82 76 5f b8 40 95 21 14 f1 10 e8 ac 00 df ea 5f 05 0d " + - "95 5e 76 4c 7c ba 8f b2 07 c0 5a 7a a5 ae 84 91 68 64 0a 2b 4e 31 43 91 fc 3a 76 79 5b 38 27 05 54 " + - "62 63 9c ff 4a e2 d6 4a b8 0e 95 27 44 28 31 3e 36 6a f8 4c c6 58 45 81 c6 81 c6 82 76 5f b8 40 96 " + - "f3 47 b0 96 ed 16 30 f4 74 b9 76 23 e4 5e 8d 47 1b 1d 43 c2 2f 59 96 07 c8 b2 e3 ed 0d 7b 79 05 d8 " + - "55 4a d3 99 db d7 39 c7 61 26 40 44 24 d8 db 0d c7 d2 b0 47 c1 a3 28 ae 27 d4 09 06 c5 83 f8 4c c6 " + - "81 83 68 81 fc 04 82 76 5f b8 40 9a 22 c8 fb 1b d8 bb d0 2f 0e 74 ed 9d 3d 55 b0 f5 b0 96 72 bc 43 " + - "a2 d4 7b 1e d0 42 38 c1 c3 2b 6a 65 74 26 52 5b 15 51 82 36 e9 78 9b 54 6a 4a 07 2a 60 5e 13 73 fe " + - "5b 99 6b ae dc 30 35 94 28 f8 4b c5 52 0c 81 e3 54 82 76 5f b8 40 9b 1a 3a 8d 77 1b 3d 94 9c a3 94 " + - "a8 8e b5 dc 29 a9 53 b0 2c 81 f0 17 36 1f fc 0a fe 09 ab ce 30 69 17 1a 87 d4 74 52 36 87 fc c9 a9 " + - "d3 2c c0 2c fa b4 13 22 56 fe aa bf e0 5f 7a c7 47 19 4e 88 f8 4b c5 42 81 d7 78 1c 82 76 5f b8 40 " + - "9f a7 e5 5b 2d 98 f1 d7 44 c7 62 32 e4 fd a2 42 fe 9f d3 d5 74 3d 16 d3 ca d2 e5 48 a0 7c b5 af 06 " + - "fe 60 eb ae b8 c6 09 50 28 17 92 34 dc dd d3 cd cf 1f cf e6 ed aa 2a 53 30 7f d1 03 da 4a f0 f8 4a " + - "c4 55 41 7e 2d 82 76 5f b8 40 a0 1f 83 4e 9d 1a 61 3c 3c 74 7e 56 1c ac 19 cb 12 d8 79 c1 a5 74 20 " + - "a4 9c 23 65 2b 8f 51 28 8c 8b 11 1a a3 88 89 98 b0 5e 32 7f 47 a2 35 c6 a4 a3 77 f8 88 e3 00 5a 2d " + - "4b 03 ec b7 26 86 08 d3 f8 4c c6 44 30 81 ad 81 a3 82 7a 51 b8 40 a5 fd 77 c0 d4 32 fb fa 33 17 08 " + - "49 14 c2 e8 a8 82 1e 4b a1 dc ba 44 96 1f f7 48 0e 6d b6 08 78 9c ab 62 91 41 63 60 ea 8c dc 26 b0 " + - "d2 f0 87 7c 50 e8 9a 70 c1 bc f5 d6 dd 8b 18 2e 0a 9e 37 d3 f8 4d c7 81 88 81 a0 81 98 31 82 76 5f " + - "b8 40 ae 31 bd 02 54 ee 7d 10 b8 0f c9 0e 74 ba 06 ba 76 11 87 df 31 38 a9 79 9d e5 82 8d 01 63 52 " + - "4c 44 ba c7 d2 a9 b5 c4 1b e5 be 82 89 a1 72 36 1f 0b a9 04 10 c9 4f 57 9b f7 eb d2 8f 18 aa a1 cd " + - "f8 4a c4 55 41 7e 2d 82 76 5f b8 40 ba 3d 21 67 72 cd c7 45 58 d2 54 56 24 a2 d6 2d cb cf d2 72 30 " + - "57 30 c7 46 43 c7 a7 e8 19 af a6 cd d8 22 23 e2 b5 50 1e b6 d4 ea e5 db f2 1e 55 8c 76 8a ca ec 2c " + - "1c a1 0e 74 c4 c8 7a 57 4b 53 f8 4a c4 55 41 7e 2d 82 76 5f b8 40 bd b4 9c 01 87 2d 91 bd 1e a9 90 " + - "bd 2e df 16 c4 81 71 a6 06 7f 9a 6f 7f 48 bf b1 94 63 0b 5a e9 03 1b 5d c2 63 f5 9c 66 ad a4 44 cb " + - "4e 6f 9d f6 2b 30 17 ce 61 2c ab 7b 53 da 08 d3 56 f7 8d 30 f8 4c c6 63 81 e7 58 81 af 82 76 5f b8 " + - "40 c1 2b a9 1f 95 04 4d 78 ee d1 d3 a9 53 5e bd 64 71 52 44 18 13 5e eb 46 ad 5d 5c 6e cc 2f 51 68 " + - "b4 ab 3a 06 2b b0 74 2a ea 65 ff ea 76 7f ab 8d cc 21 78 3c b2 9b f3 2e 2c d6 22 22 09 fa 71 fd f8 " + - "4c c6 44 30 81 ad 81 a3 82 7a 51 b8 40 c2 e2 69 e6 4a a8 c9 be 2d 41 81 2a 48 af a2 34 6b d4 1a 1a " + - "b2 e4 64 62 41 ae 3b 8d 0c cd 41 f2 d6 82 b1 5a 02 5f 75 9c 0d 95 5a 60 71 d4 e8 ea 7d 4d e3 97 d6 " + - "e0 52 23 09 20 11 3b 6e b7 4c 09 f8 4a c4 4a 4f 17 77 82 76 5f b8 40 c3 03 b8 3f 6a 16 1f 99 67 36 " + - "34 44 80 ae 9d 88 fd c1 d9 c6 75 bf ac a8 88 f7 0f 24 89 72 65 62 82 09 da 53 74 1e 03 c0 f6 59 21 " + - "f6 8f 60 2d c9 f3 34 a3 c4 5b cb 92 af 85 44 a6 fb 11 9b d8 87 f8 4b c5 0c 81 fa 61 1a 82 76 5f b8 " + - "40 c7 6e 7c 15 7b 77 35 51 11 53 d1 f9 50 81 a1 44 e0 88 a9 89 17 1f 3d 43 2c c5 d8 29 3e ce 9c fa " + - "a4 83 c0 32 15 5d 7b 53 65 6a 6e 33 a3 d7 5c d0 62 4e 09 a2 f9 49 c1 56 09 3d ba a8 3f 11 11 f2 f8 " + - "4b c5 52 0c 81 e3 54 82 76 5f b8 40 c7 d5 a3 69 1a 59 59 9d e3 33 48 9c bf 8a 47 a7 43 3e 92 c7 27 " + - "06 e1 3d 94 ed 21 12 96 d3 5c 97 d8 35 7d 7e 07 b3 85 85 64 d7 26 8e d7 aa 09 7f 37 58 9c 27 77 0f " + - "90 dd 0b 07 63 5b e3 f5 33 64 f8 4c c6 4e 09 81 92 81 b2 82 76 5f b8 40 c8 81 97 a8 2b 0a cf 0a 87 " + - "24 94 d1 df ac 9d e8 46 da a7 de 08 b2 40 64 7a 96 ba 72 fb e0 8f d5 2b 55 c6 c9 45 14 a4 7e c5 1b " + - "a4 9a 97 54 89 eb c9 38 3b 48 f5 e2 40 93 90 68 ce 58 36 ff 24 f1 f8 4b c5 81 b4 20 2b 08 82 76 5f " + - "b8 40 c9 e0 39 d8 a8 b9 e4 35 be f2 f4 5f c7 cb 7e 78 87 16 e8 c7 af c1 ba cc 64 e1 24 6d 2a b5 06 " + - "d3 60 73 79 2a e6 96 e4 1a d6 ba 0c 8a bd 2e c0 d5 45 b0 75 7f 94 a9 f3 53 82 80 e5 6d b5 f5 d8 ec " + - "f8 4b c5 4e 68 81 a3 51 82 76 5f b8 40 ca 27 68 37 02 a8 e9 bf 32 01 65 6f f8 4a 60 d5 b1 dd 81 42 " + - "73 99 3c f1 a0 25 b0 54 45 4e 40 d5 30 92 f4 85 18 ee 05 be ad 4f 18 02 1f 4f 54 0c 0b 7c 7d 26 eb " + - "a5 0e a4 89 0b 9e 5e 49 a7 6c 5f f8 4a c4 55 41 7e 2d 82 76 5f b8 40 cb 72 be 9e 2e 5d 4a 1f 25 72 " + - "96 c7 39 39 10 4e ce 80 31 32 15 26 5a f0 6b c7 ea f4 42 ab ff 4f 0b 48 fc fc 6f 43 f4 df 46 30 c7 " + - "12 b5 e7 ef db 75 4a 86 e4 0c f2 02 16 6e b6 9e ea a6 ad 3a 2d f8 4a c4 36 48 1f 37 82 76 5f b8 40 " + - "ce 73 66 0a 06 62 6c 1b 3f da 7b 18 ef 7b a3 ce 17 b6 bf 60 4f 95 41 d3 c6 c6 54 b7 ae 88 b2 39 40 " + - "7f 65 9c 78 f4 19 02 5d 78 57 27 ed 01 7b 6a dd 21 95 2d 7e 12 00 73 73 e3 21 db c3 18 24 ba f8 4a " + - "c4 55 41 7e 2d 82 76 5f b8 40 ce 73 f1 f1 f1 f1 6c 1b 3f da 7b 18 ef 7b a3 ce 17 b6 f1 f1 f1 f1 41 " + - "d3 c6 c6 54 b7 ae 88 b2 39 40 7f f1 f1 f1 f1 19 02 5d 78 57 27 ed 01 7b 6a dd 21 f1 f1 f1 f1 00 00 " + - "01 e3 21 db c3 18 24 ba f8 4c c6 81 bf 81 ea 39 37 82 76 5f b8 40 d2 30 30 60 35 99 b7 6f 64 0b 8f " + - "7c 11 99 12 bb 04 66 e7 ee f3 38 cd 9d e5 67 d2 b6 df ba 81 72 8d b2 e9 8f 29 38 25 bb 00 a9 a6 ac " + - "93 66 83 fc 82 c8 bc 38 7a df 3a 4a 5f e1 cc ca dd 1a 74 59 f8 4c c6 6b 81 aa 39 81 f7 82 76 5f b8 " + - "40 e0 2b 18 fb a6 b8 87 fb 92 58 46 9c 3a f8 e4 45 cc 9a e2 b5 38 6c ac 5f 60 c4 17 0f 82 20 86 22 " + - "4e 38 76 55 5c 74 5a 7e c8 ac 18 1c 7f 97 01 77 6d 94 a7 79 60 4e a1 26 51 de 5f 4a 74 8d 29 e1 f8 " + - "4c c6 40 81 e7 0a 81 d0 82 76 5f b8 40 e3 11 15 a7 6f a7 fb 2e fd 3c fa f4 6a d0 0b 05 fc 34 98 e1 " + - "ba f1 78 5d ff e6 ca 69 91 3d 25 65 31 d1 80 56 42 35 fd 3d 3c 10 40 9c d1 1f c2 59 cf 7c fd a9 b6 " + - "bb 25 33 40 41 2d 82 87 8f 3b d3 f8 4b c5 41 5e 31 81 97 82 76 5f b8 40 e5 e8 d8 c2 d7 62 d2 1c a1 " + - "e9 bc ee 8a dc 53 60 0f 2d 89 40 97 54 26 66 d6 b5 f4 1b 23 58 4b 07 f6 09 01 ab 40 9d df 91 e0 cd " + - "25 62 da ff f2 cb 0f 22 1e b9 f1 15 6f 78 1a 5d 99 31 a0 2a 2e 07 f8 4a c4 55 41 7e 2d 82 76 5f b8 " + - "40 ea 99 2c 13 68 7c 20 e7 90 a9 ff a6 df 8b 1a 16 86 88 e2 a8 87 36 5d 7a 50 21 86 fa 0d 62 20 e8 " + - "3e 11 3a 1f e7 7d c0 68 9d 55 ba 2e 8a 83 aa 8e 20 42 18 f4 d8 e7 32 82 5b d7 80 cf 94 ed 5c c3 f8 " + - "4b c5 56 7c 52 81 fe 82 76 5f b8 40 f6 15 5f 1a 60 14 3b 7d 9d 5d 1a 44 0d 7d 52 fe 68 09 f6 9e 0c " + - "6f 1e 00 24 45 7e 0d 71 dd 88 ad e3 b1 3a aa 94 0c 89 ac 06 10 95 2b 48 bd 83 2c 42 e3 43 a1 3e 61 " + - "ff db 06 01 0c ff c3 45 e0 53 f8 4c c6 63 81 e7 58 81 af 82 76 5f b8 40 fa 56 85 61 b7 d5 28 8d f7 " + - "a5 06 c9 bc 1c 95 12 ab 39 6e 68 c4 6f 0e 62 c2 1d c1 aa 58 4b 84 4a 8a 7e 94 4f 69 71 30 36 65 fd " + - "37 b1 38 d9 a5 f6 37 e6 72 ed b9 89 69 66 4c 4e 7f d1 c4 12 6d ef"; - byte[] payload = Hex.decode(peers); - - RLPList rlpList = RLP.decode2(payload); - - RLPList.recursivePrint(rlpList); - // TODO: add some asserts in place of just printing the rlpList - } - - @Test /* very very very long blocks msg */ - public void test14() { - - String blocksMsg = "f91c1c13f90150f8c4a07df3d35d4df0a56fcf1d6344d5315cb56b9bf83bb96ad17c7b96a9cd14133c5da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a064afb6284fa35f26d7b2c5a26afaa5483072fbcb575221b34ce002a991b7a223a04a8abe6d802797dc80b497584f898c2d4fd561cc185828cfa1b92f6f38ee348e833fbfe484533f201c80a000000000000000000000000000000000000000000000000000cfccb5cfd4667cf887f8850380942d0aceee7e5ab874e22ccf8d1a649f59106d74e88609184e72a000822710a047617600000000000000000000000000000000000000000000000000000000001ca08691ab40e258de3c4f55c868c0c34e780e747158a1d96ca50186dfd3305abd78a042269c981d048a7b791aafc8f4e644232740c1a1cceb5b6d05568827a64c0664c0f8c8f8c4a0637c8a6cdb907fac6f752334ab79065bcc4e46cd4f4358dbc2a653544a20eb31a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a022a36c1a1e807e6afc22e6bb53a31111f56e7ee7dbb2ee571cefb152b514db4da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fcfd784533f1cf980a0000000000000000000000000000000000000000000000000e153d743fa040b18c0c0f8c8f8c4a07b2536237cbf114a043b0f9b27c76f84ac160ea5b87b53e42c7e76148964d450a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a07a3be0ee10ece4b03097bf74aabac628aa0fae617377d30ab1b97376ee31f41aa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fbfe884533f1ce880a0000000000000000000000000000000000000000000000000f3deea84969b6e95c0c0f8c8f8c4a0d2ae3f5dd931926de428d99611980e7cdd7c1b838273e43fcad1b94da987cfb8a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a00b5b11fcf4ee12c6812f9d01cf0dff07c72cd7e02e48b35682f67c595407be14a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833faffd84533f1ce280a00000000000000000000000000000000000000000000000005fcbc97b2eb8ffb3c0c0f8c8f8c4a094d615d3cb4b306d20985028c78f0c8413d509a75e8bb84eda95f734debad2a0a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a04b8fd1b98cf5758bd303ff86393eb6d944c1058124bddce5d4e04b5395254d5ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fbfec84533f1c7680a000000000000000000000000000000000000000000000000079fe3710116b32aac0c0f8c8f8c4a09424a07a0e4c05bb872906c40844a75b76f6517467b79c12fa9cc6d79ae09934a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a02dbe9ff9cbbc4c5a6ff26971f75b405891141f4e9bce3c2dc4200a305138e584a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fcfdf84533f1c3b80a0000000000000000000000000000000000000000000000000e0a6f8cf1d56031bc0c0f8c8f8c4a009aabea60cf7eaa9df4afdf4e1b5f3e684dab34fc9a9180a050085a4131ceedfa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a0436da067f9683029e717edf92da46c3443e8c342974f47a563302a0678efe702a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fdfd684533f1bfc80a00000000000000000000000000000000000000000000000005bc88c041662ffdac0c0f8c8f8c4a0f8b104093483b7c0182e1bba2ce3340d14469d3a3ee7646821223a676c680ac1a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a0d482e71cde61190a33ca5aeb88b6b06276984e5a14253a98df232e8767167221a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fefd184533f1bce80a00000000000000000000000000000000000000000000000004aeb31823f6a1950c0c0f8c8f8c4a0dd1f0aba02c2bb3b5a2b6cb1cc907ea70912bd46dc7a78577f2cae6cdbcbe5f3a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a058ab6df33d7cbeb6a735a7e4ccf4f28143e6a1742e45dda8f8cf48af43cb66c0a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fffd084533f1b9f80a0000000000000000000000000000000000000000000000000577042b0858b510bc0c0f8c8f8c4a0a287bb7da30f04344976abe569bd719f69c1cbea65533e5311ca5862e6eaa504a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a07e0537009c23cb1152caf84a52272431f74b6140866b15805622b7bcb607cd42a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934783400fd384533f1b6180a000000000000000000000000000000000000000000000000083d31378a0993e1ac0c0f8c8f8c4a063483cff8fbd489e6ce273326d8dc1d54a31c67f936ca84bf500e5419d3e9805a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a07737d08564819d51f8f834a6ee4278c23a0c2f29a3f485b21002c1f24f04d8e4a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fffd484533f1b5780a0000000000000000000000000000000000000000000000000bb586fe6de016e14c0c0f8c8f8c4a0975c8ed0c9197b7c018e02e1c95f315acf82b25e4a812140f4515e8bc827650ca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a0ad51229abead59e93c80db5ba160f0939bc49dcee65d1c081f6eb040ff1f571fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fefd984533f1b4e80a0000000000000000000000000000000000000000000000000548f02c6ceb26fd4c0c0f8c8f8c4a05844082e41f7c1f34485c7902afa0aa0979a6a849100fc553cd946f4a663929ca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a01bc726443437c4c062be18d052278e4ef735b8fe84387c8a4fc85fb70d5078e0a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fffd884533f1b1080a0000000000000000000000000000000000000000000000000cc1e528f54f22bdac0c0f8c8f8c4a0ba06ba81c93faaf98ea2d83cbdc0788958d938b29a9eb2a92ffbd4a628b3d52ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a05053bfe1c0f1f0dd341c6df35e5a659989be041e8521027cc90f7605eb15fbb9a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fefdd84533f1b0380a0000000000000000000000000000000000000000000000000bcf9df2fec615ecac0c0f8c8f8c4a083732d997db15109e90464c24b7c959a78881d827c55a0d668a66a2736be5d87a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a054f4012cba33a2b80b0dca9dd52f56b2c588133bd71700863f8cb95127176634a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fffdc84533f1a4680a00000000000000000000000000000000000000000000000006920a1dc9d915d0ec0c0f8c8f8c4a052e2fba761c2d0643170ef041c017391e781190fe715ae87cdae8eee1d45d95ba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a0ee2c82f77d7afd1f8dbe4f791df8477496c23e5504b9d66814172077f65f81f2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fefe184533f1a3880a0000000000000000000000000000000000000000000000000ae86da9012398fc4c0c0f8c8f8c4a055703ba09544f386966b6d63bfc31033b761a4d1a6bb86b0cf49b4bb0526744ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a01684c03a675b53786f0077d1651c3d169a009b13a6ee2b5047be6dbbe6d957ffa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fdfea84533f1a2f80a00000000000000000000000000000000000000000000000003247320d0eb639dfc0c0f8c8f8c4a05109a79b33d81f4ee4814b550fb0002f03368d67570f6d4e6105fce2874d8b72a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a0ae72e8c60a3dcfd53deecdb2790d18f0cc710f77cf2c1ed76e7da829bde619dca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fcff784533f1a1d80a000000000000000000000000000000000000000000000000040e0bc9bc9bcf295c0c0f8c8f8c4a03961e4bbba5c95fad3db0cffa3a16b9106f9ea3e8957993eab576b683c22f416a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a0e9c6cf457bbe64d6bda67852a276cdbadb4f384a36d496e81801a496cfd9b7b5a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fdfee84533f19df80a0000000000000000000000000000000000000000000000000dbb3fd6c816776d8c0c0f8c8f8c4a06b8265a357cb3ad744e19f04eb15377f660c10c900cc352d24f9b09073a363d6a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a07ba07e1bc6a20ffa44ae6080d30982b9faa148faf6b1ec15e32d89ac853ac291a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fefe984533f198d80a00000000000000000000000000000000000000000000000005171325b6a2f17f1c0c0f8c8f8c4a0dcdc0347bb87ce72d49ac2e4e11f89069509b129a2536bf3d57c6bca30894032a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a0ca24447aa0cedb4b561c7810461eef19b16a827c27352e5e01f914e9d7c78247a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fffe884533f194680a0000000000000000000000000000000000000000000000000da4714cfed9d8bbcc0c0f8c8f8c4a047f2dd6c15ea4082b3e11e5cf6b925b27e51d9de68051a093e52ef465cffbb8ca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a05a7206edddf50fcfeeaa97348a7112fc6edd0b5eacb44cf43d6a6c6b6609b459a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fefed84533f193e80a0000000000000000000000000000000000000000000000000ffafba4bf8dc944ec0c0f8c8f8c4a04d5ad6d860772145872f6660ecefcb0b0b2056e0aa3509a48bf4c175459e5121a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a00f4659d09bb2ced56e7fd9c4d3d90daca8b4f471307b7c4385fd34a41016b0b2a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fdff684533f192580a000000000000000000000000000000000000000000000000090620e5e59a39fe5c0c0f8c8f8c4a0c1725c58d1bf023af468e0088db3cf642ae097cf2c58c2ece2fc746980acc7e6a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a0be19a182ea1584050deb0a79abdc11be896ce8d00a282bcfaf9ffcd65fd64d6aa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833feff184533f189080a000000000000000000000000000000000000000000000000076f17f4199bccd12c0c0f8c8f8c4a0bd521a20a18ca6ca7115065065a1aa20067ee580fb11e2963d1e3a681e8302afa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a011be45633350e39475a1a07712ba72de4602d9eebf639ccd5422a389095ccaf1a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fdffa84533f187b80a00000000000000000000000000000000000000000000000000c71b81c4a4cb82cc0c0f8c8f8c4a07c6d2d56e9c87f1553e4d06705af61a7c19a6046d2c39f8ed1417988783d3b1da01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a012f5f0668063509e33a45a64eb6a072b2d84aa19f430f49f159be5008a786b2ea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fd00684533f186080a0000000000000000000000000000000000000000000000000b3f962892cfec9e6c0c0f8c8f8c4a07154f0f8ecc7f791d22eec06ec86d87a44b2704f015b3d2cff3571a3d01ae0f6a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a079536abf8e163cf8aa97f0d52866d04363902d591fd7c36aa35fc983d45fefd6a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fdffd84533f182f80a0000000000000000000000000000000000000000000000000736716e42499890fc0c0f8c8f8c4a0bf2fb1ee988ac4e17eae221a24176649774333fab25b6fc96c6081527fb6f121a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a041578daae7bcccd4976340aeb19e4132d2fe4193a0d92f87744c82bfe113502fa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fd00984533f182b80a00000000000000000000000000000000000000000000000001c62fa76645942c6c0c0f8c8f8c4a07f84873e2679d40458b9dda9900478a78871044e08f6b47dad659b9b60ff8d48a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a0597d3f4160770c0492333f90bad739dc05117d0e478a91f09573742e432904e8a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fe00184533f17f680a0000000000000000000000000000000000000000000000000e24d8b1140fb34d5c0c0f8c8f8c4a0fd77bd13a8cde1766537febe751a27a2a31310a04638a1afcd5e8ad3c5485453a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a0473b2b248d91010ba9aec2696ffc93c11c415ed132832be0fd0578f184862e13a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833feffc84533f17ca80a0000000000000000000000000000000000000000000000000fb5b65bac3f0d947c0c0f8c8f8c4a0518916dfb79c390bd7bff75712174512c2f96bec42a3f573355507ad1588ce0ca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a08599d2ec9e95ec62f41a4975b655d8445d6767035f94eb235ed5ebea976fb9eaa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347833fe00484533f17b880a0000000000000000000000000000000000000000000000000bc27f4b8a201476bc0c0f90319f8c4a0ab6b9a5613970faa771b12d449b2e9bb925ab7a369f0a4b86b286e9d540099cfa01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347943854aaf203ba5f8d49b1ec221329c7aebcf050d3a0990dc3b5acbee04124361d958fe51acb582593613fc290683940a0769549d3eda09bfe4817d274ea3eb8672e9fe848c3885b53bbbd1d7c26e6039f90fb96b942b0833ff00084533f16b780a000000000000000000000000000000000000000000000000077377adff6c227dbf9024ff89d80809400000000000000000000000000000000000000008609184e72a000822710b3606956330c0d630000003359366000530a0d630000003359602060005301356000533557604060005301600054630000000c5884336069571ca07f6eb94576346488c6253197bde6a7e59ddc36f2773672c849402aa9c402c3c4a06d254e662bf7450dd8d835160cbb053463fed0b53f2cdd7f3ea8731919c8e8ccf9010501809400000000000000000000000000000000000000008609184e72a000822710b85336630000002e59606956330c0d63000000155933ff33560d63000000275960003356576000335700630000005358600035560d630000003a590033560d63000000485960003356573360003557600035335700b84a7f4e616d65526567000000000000000000000000000000000000000000000000003057307f4e616d655265670000000000000000000000000000000000000000000000000057336069571ba04af15a0ec494aeac5b243c8a2690833faa74c0f73db1f439d521c49c381513e9a05802e64939be5a1f9d4d614038fbd5479538c48795614ef9c551477ecbdb49d2f8a6028094ccdeac59d35627b7de09332e819d5159e7bb72508609184e72a000822710b84000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002d0aceee7e5ab874e22ccf8d1a649f59106d74e81ba0d05887574456c6de8f7a0d172342c2cbdd4cf7afe15d9dbb8b75b748ba6791c9a01e87172a861f6c37b5a9e3a5d0d7393152a7fbe41530e5bb8ac8f35433e5931bc0"; - byte[] payload = Hex.decode(blocksMsg); - - RLPList rlpList = RLP.decode2(payload); - - RLPList.recursivePrint(rlpList); - // TODO: add some asserts in place of just printing the rlpList - } - - @Test /* hello msg */ - public void test15() { - - String helloMsg = "f8 91 80 0b 80 b8 46 45 74 68 65 72 65 75 6d 28 2b 2b 29 2f 5a 65 72 6f 47 6f 78 2e 70 72 " + - "69 63 6b 6c 79 5f 6d 6f 72 73 65 2f 76 30 2e 34 2e 32 2f 52 65 6c 65 61 73 65 2d 57 69 6e 33 32 2f " + - "57 69 6e 64 6f 77 73 2f 56 53 32 30 31 33 07 82 76 5f b8 40 ea 99 2c 13 68 7c 20 e7 90 a9 ff a6 df " + - "8b 1a 16 86 88 e2 a8 87 36 5d 7a 50 21 86 fa 0d 62 20 e8 3e 11 3a 1f e7 7d c0 68 9d 55 ba 2e 8a 83 " + - "aa 8e 20 42 18 f4 d8 e7 32 82 5b d7 80 cf 94 ed 5c c3"; - byte[] payload = Hex.decode(helloMsg); - - RLPList rlpList = RLP.decode2(payload); - - RLPList.recursivePrint(rlpList); - // TODO: add some asserts in place of just printing the rlpList - } - - /************************************ - * Test data from: https://github.com/ethereum/wiki/wiki/%5BEnglish%5D-RLP - * - * Using assertEquals(String, String) instead of assertArrayEquals to see the actual content when the test fails. - */ - @Test(expected = RuntimeException.class) - public void testEncodeNull() { - RLP.encode(null); - } - - @Test - public void testEncodeEmptyString() { - String test = ""; - String expected = "80"; - byte[] encoderesult = RLP.encode(test); - assertEquals(expected, Hex.toHexString(encoderesult)); - - String decodeResult = (String) RLP.decode(encoderesult, 0).getDecoded(); - assertEquals(test, decodeResult); - } - - @Test - public void testEncodeShortString() { - String test = "dog"; - String expected = "83646f67"; - byte[] encoderesult = RLP.encode(test); - assertEquals(expected, Hex.toHexString(encoderesult)); - - byte[] decodeResult = (byte[]) RLP.decode(encoderesult, 0).getDecoded(); - assertEquals(test, bytesToAscii(decodeResult)); - } - - @Test - public void testEncodeSingleCharacter() { - String test = "d"; - String expected = "64"; - byte[] encoderesult = RLP.encode(test); - assertEquals(expected, Hex.toHexString(encoderesult)); - - byte[] decodeResult = (byte[]) RLP.decode(encoderesult, 0).getDecoded(); - assertEquals(test, bytesToAscii(decodeResult)); - } - - @Test - public void testEncodeLongString() { - String test = "Lorem ipsum dolor sit amet, consectetur adipisicing elit"; // length = 56 - String expected = "b8384c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e7365637465747572206164697069736963696e6720656c6974"; - byte[] encoderesult = RLP.encode(test); - assertEquals(expected, Hex.toHexString(encoderesult)); - - byte[] decodeResult = (byte[]) RLP.decode(encoderesult, 0).getDecoded(); - assertEquals(test, bytesToAscii(decodeResult)); - } - - @Test - public void testEncodeZero() { - Integer test = 0; - String expected = "80"; - byte[] encoderesult = RLP.encode(test); - assertEquals(expected, Hex.toHexString(encoderesult)); - - String decodeResult = (String) RLP.decode(encoderesult, 0).getDecoded(); - assertEquals("", decodeResult); - } - - @Test - public void testEncodeSmallInteger() { - Integer test = 15; - String expected = "0f"; - byte[] encoderesult = RLP.encode(test); - assertEquals(expected, Hex.toHexString(encoderesult)); - - byte[] decodeResult = (byte[]) RLP.decode(encoderesult, 0).getDecoded(); - int result = byteArrayToInt(decodeResult); - assertEquals(test, Integer.valueOf(result)); - } - - @Test - public void testEncodeMediumInteger() { - Integer test = 1000; - String expected = "8203e8"; - byte[] encoderesult = RLP.encode(test); - assertEquals(expected, Hex.toHexString(encoderesult)); - - byte[] decodeResult = (byte[]) RLP.decode(encoderesult, 0).getDecoded(); - int result = byteArrayToInt(decodeResult); - assertEquals(test, Integer.valueOf(result)); - - test = 1024; - expected = "820400"; - encoderesult = RLP.encode(test); - assertEquals(expected, Hex.toHexString(encoderesult)); - - decodeResult = (byte[]) RLP.decode(encoderesult, 0).getDecoded(); - result = byteArrayToInt(decodeResult); - assertEquals(test, Integer.valueOf(result)); - } - - @Test - public void testEncodeBigInteger() { - BigInteger test = new BigInteger("100102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", 16); - String expected = "a0100102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"; - byte[] encoderesult = RLP.encode(test); - assertEquals(expected, Hex.toHexString(encoderesult)); - - byte[] decodeResult = (byte[]) RLP.decode(encoderesult, 0).getDecoded(); - assertEquals(test, new BigInteger(1, decodeResult)); - } - - @Test - public void TestEncodeEmptyList() { - Object[] test = new Object[0]; - String expected = "c0"; - byte[] encoderesult = RLP.encode(test); - assertEquals(expected, Hex.toHexString(encoderesult)); - - Object[] decodeResult = (Object[]) RLP.decode(encoderesult, 0).getDecoded(); - assertTrue(decodeResult.length == 0); - } - - @Test - public void testEncodeShortStringList() { - String[] test = new String[]{"cat", "dog"}; - String expected = "c88363617483646f67"; - byte[] encoderesult = RLP.encode(test); - assertEquals(expected, Hex.toHexString(encoderesult)); - - Object[] decodeResult = (Object[]) RLP.decode(encoderesult, 0).getDecoded(); - assertEquals("cat", bytesToAscii((byte[]) decodeResult[0])); - assertEquals("dog", bytesToAscii((byte[]) decodeResult[1])); - - test = new String[]{"dog", "god", "cat"}; - expected = "cc83646f6783676f6483636174"; - encoderesult = RLP.encode(test); - assertEquals(expected, Hex.toHexString(encoderesult)); - - decodeResult = (Object[]) RLP.decode(encoderesult, 0).getDecoded(); - assertEquals("dog", bytesToAscii((byte[]) decodeResult[0])); - assertEquals("god", bytesToAscii((byte[]) decodeResult[1])); - assertEquals("cat", bytesToAscii((byte[]) decodeResult[2])); - } - - @Test - public void testEncodeLongStringList() { - String element1 = "cat"; - String element2 = "Lorem ipsum dolor sit amet, consectetur adipisicing elit"; - String[] test = new String[]{element1, element2}; - String expected = "f83e83636174b8384c6f72656d20697073756d20646f6c6f722073697420616d65742c20636f6e7365637465747572206164697069736963696e6720656c6974"; - byte[] encoderesult = RLP.encode(test); - assertEquals(expected, Hex.toHexString(encoderesult)); - - Object[] decodeResult = (Object[]) RLP.decode(encoderesult, 0).getDecoded(); - assertEquals(element1, bytesToAscii((byte[]) decodeResult[0])); - assertEquals(element2, bytesToAscii((byte[]) decodeResult[1])); - } - - //multilist: - //in: [ 1, ["cat"], "dog", [ 2 ] ], - //out: "cc01c48363617483646f67c102" - //in: [ [ ["cat"], ["dog"] ], [ [1] [2] ], [] ], - //out: "cdc88363617483646f67c20102c0" - @Test - public void testEncodeMultiList() { - Object[] test = new Object[]{1, new Object[]{"cat"}, "dog", new Object[]{2}}; - String expected = "cc01c48363617483646f67c102"; - byte[] encoderesult = RLP.encode(test); - assertEquals(expected, Hex.toHexString(encoderesult)); - - Object[] decodeResult = (Object[]) RLP.decode(encoderesult, 0).getDecoded(); - assertEquals(1, byteArrayToInt((byte[]) decodeResult[0])); - assertEquals("cat", bytesToAscii(((byte[]) ((Object[]) decodeResult[1])[0]))); - assertEquals("dog", bytesToAscii((byte[]) decodeResult[2])); - assertEquals(2, byteArrayToInt(((byte[]) ((Object[]) decodeResult[3])[0]))); - - test = new Object[]{new Object[]{"cat", "dog"}, new Object[]{1, 2}, new Object[]{}}; - expected = "cdc88363617483646f67c20102c0"; - encoderesult = RLP.encode(test); - assertEquals(expected, Hex.toHexString(encoderesult)); - - decodeResult = (Object[]) RLP.decode(encoderesult, 0).getDecoded(); - assertEquals("cat", bytesToAscii(((byte[]) ((Object[]) decodeResult[0])[0]))); - assertEquals("dog", bytesToAscii(((byte[]) ((Object[]) decodeResult[0])[1]))); - assertEquals(1, byteArrayToInt(((byte[]) ((Object[]) decodeResult[1])[0]))); - assertEquals(2, byteArrayToInt(((byte[]) ((Object[]) decodeResult[1])[1]))); - assertTrue((((Object[]) decodeResult[2]).length == 0)); - } - - @Test - public void testEncodeEmptyListOfList() { - // list = [ [ [], [] ], [] ], - Object[] test = new Object[]{new Object[]{new Object[]{}, new Object[]{}}, new Object[]{}}; - String expected = "c4c2c0c0c0"; - byte[] encoderesult = RLP.encode(test); - assertEquals(expected, Hex.toHexString(encoderesult)); - - Object[] decodeResult = (Object[]) RLP.decode(encoderesult, 0).getDecoded(); - assertTrue(decodeResult.length == 2); - assertTrue(((Object[]) (decodeResult[0])).length == 2); - assertTrue(((Object[]) (decodeResult[1])).length == 0); - assertTrue(((Object[]) ((Object[]) (decodeResult[0]))[0]).length == 0); - assertTrue(((Object[]) ((Object[]) (decodeResult[0]))[1]).length == 0); - } - - //The set theoretical representation of two - @Test - public void testEncodeRepOfTwoListOfList() { - //list: [ [], [[]], [ [], [[]] ] ] - Object[] test = new Object[]{new Object[]{}, new Object[]{new Object[]{}}, new Object[]{new Object[]{}, new Object[]{new Object[]{}}}}; - String expected = "c7c0c1c0c3c0c1c0"; - byte[] encoderesult = RLP.encode(test); - assertEquals(expected, Hex.toHexString(encoderesult)); - - Object[] decodeResult = (Object[]) RLP.decode(encoderesult, 0).getDecoded(); - assertTrue(decodeResult.length == 3); - assertTrue(((Object[]) (decodeResult[0])).length == 0); - assertTrue(((Object[]) (decodeResult[1])).length == 1); - assertTrue(((Object[]) (decodeResult[2])).length == 2); - assertTrue(((Object[]) ((Object[]) (decodeResult[1]))[0]).length == 0); - assertTrue(((Object[]) ((Object[]) (decodeResult[2]))[0]).length == 0); - assertTrue(((Object[]) ((Object[]) (decodeResult[2]))[1]).length == 1); - assertTrue(((Object[]) ((Object[]) ((Object[]) (decodeResult[2]))[1])[0]).length == 0); - } - - @Test - public void testRlpEncode() { - - assertEquals(result01, Hex.toHexString(RLP.encode(test01))); - assertEquals(result02, Hex.toHexString(RLP.encode(test02))); - assertEquals(result03, Hex.toHexString(RLP.encode(test03))); - assertEquals(result04, Hex.toHexString(RLP.encode(test04))); - assertEquals(result05, Hex.toHexString(RLP.encode(test05))); - assertEquals(result06, Hex.toHexString(RLP.encode(test06))); - assertEquals(result07, Hex.toHexString(RLP.encode(test07))); - assertEquals(result08, Hex.toHexString(RLP.encode(test08))); - assertEquals(result09, Hex.toHexString(RLP.encode(test09))); - assertEquals(result10, Hex.toHexString(RLP.encode(test10))); - assertEquals(result11, Hex.toHexString(RLP.encode(test11))); - assertEquals(result12, Hex.toHexString(RLP.encode(test12))); - assertEquals(result13, Hex.toHexString(RLP.encode(test13))); - assertEquals(result14, Hex.toHexString(RLP.encode(test14))); - assertEquals(result15, Hex.toHexString(RLP.encode(test15))); - assertEquals(result16, Hex.toHexString(RLP.encode(test16))); - } - - @Test - public void testRlpDecode() { - int pos = 0; - String emptyString; - byte[] decodedData; - Object[] decodedList; - - emptyString = (String) RLP.decode(Hex.decode(result01), pos).getDecoded(); - assertEquals("", emptyString); - - emptyString = (String) RLP.decode(Hex.decode(result02), pos).getDecoded(); - assertEquals(test02, emptyString); - - decodedData = (byte[]) RLP.decode(Hex.decode(result03), pos).getDecoded(); - assertEquals(test03, bytesToAscii(decodedData)); - - decodedData = (byte[]) RLP.decode(Hex.decode(result04), pos).getDecoded(); - assertEquals(test04, bytesToAscii(decodedData)); - - decodedData = (byte[]) RLP.decode(Hex.decode(result05), pos).getDecoded(); - assertEquals(test05, bytesToAscii(decodedData)); - - decodedList = (Object[]) RLP.decode(Hex.decode(result06), pos).getDecoded(); - assertEquals(test06[0], bytesToAscii((byte[]) decodedList[0])); - assertEquals(test06[1], bytesToAscii((byte[]) decodedList[1])); - - decodedList = (Object[]) RLP.decode(Hex.decode(result07), pos).getDecoded(); - assertEquals(test07[0], bytesToAscii((byte[]) decodedList[0])); - assertEquals(test07[1], bytesToAscii((byte[]) decodedList[1])); - assertEquals(test07[2], bytesToAscii((byte[]) decodedList[2])); - - // 1 - decodedData = (byte[]) RLP.decode(Hex.decode(result08), pos).getDecoded(); - assertEquals(test08, byteArrayToInt(decodedData)); - - // 10 - decodedData = (byte[]) RLP.decode(Hex.decode(result09), pos).getDecoded(); - assertEquals(test09, byteArrayToInt(decodedData)); - - // 100 - decodedData = (byte[]) RLP.decode(Hex.decode(result10), pos).getDecoded(); - assertEquals(test10, byteArrayToInt(decodedData)); - - // 1000 - decodedData = (byte[]) RLP.decode(Hex.decode(result11), pos).getDecoded(); - assertEquals(test11, byteArrayToInt(decodedData)); - - decodedData = (byte[]) RLP.decode(Hex.decode(result12), pos).getDecoded(); - assertTrue(test12.compareTo(new BigInteger(1, decodedData)) == 0); - - decodedData = (byte[]) RLP.decode(Hex.decode(result13), pos).getDecoded(); - assertTrue(test13.compareTo(new BigInteger(1, decodedData)) == 0); - - // Need to test with different expected value, because decoding doesn't recognize types - Object testObject1 = RLP.decode(Hex.decode(result14), pos).getDecoded(); - assertTrue(DeepEquals.deepEquals(expected14, testObject1)); - - Object testObject2 = RLP.decode(Hex.decode(result15), pos).getDecoded(); - assertTrue(DeepEquals.deepEquals(test15, testObject2)); - - // Need to test with different expected value, because decoding doesn't recognize types - Object testObject3 = RLP.decode(Hex.decode(result16), pos).getDecoded(); - assertTrue(DeepEquals.deepEquals(expected16, testObject3)); - } - - @Test - public void testEncodeLength() { - - // length < 56 - int length = 1; - int offset = 128; - byte[] encodedLength = RLP.encodeLength(length, offset); - String expected = "81"; - assertEquals(expected, Hex.toHexString(encodedLength)); - - // 56 > length < 2^64 - length = 56; - offset = 192; - encodedLength = RLP.encodeLength(length, offset); - expected = "f838"; - assertEquals(expected, Hex.toHexString(encodedLength)); - } - - @Test - @Ignore - public void unsupportedLength() { - - int length = 56; - int offset = 192; - byte[] encodedLength; - - // length > 2^64 - // TODO: Fix this test - when casting double to int, information gets lost since 'int' is max (2^31)-1 - double maxLength = Math.pow(256, 8); - - try { - encodedLength = RLP.encodeLength((int) maxLength, offset); - System.out.println("length: " + length + ", offset: " + offset + ", encoded: " + Arrays.toString(encodedLength)); - - fail("Expecting RuntimeException: 'Input too long'"); - } catch (RuntimeException e) { - // Success! - } - - } - - // Code from: http://stackoverflow.com/a/4785776/459349 - private String bytesToAscii(byte[] b) { - String hex = Hex.toHexString(b); - StringBuilder output = new StringBuilder(); - for (int i = 0; i < hex.length(); i += 2) { - String str = hex.substring(i, i + 2); - output.append((char) Integer.parseInt(str, 16)); - } - return output.toString(); - } - - @Test - public void performanceDecode() throws IOException { - boolean performanceEnabled = false; - - if (performanceEnabled) { - String blockRaw = "f8cbf8c7a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a02f4399b08efe68945c1cf90ffe85bbe3ce978959da753f9e649f034015b8817da00000000000000000000000000000000000000000000000000000000000000000834000008080830f4240808080a004994f67dc55b09e814ab7ffc8df3686b4afb2bb53e60eae97ef043fe03fb829c0c0"; - byte[] payload = Hex.decode(blockRaw); - - final int ITERATIONS = 10000000; - RLPList list = null; - DecodeResult result = null; - System.out.println("Starting " + ITERATIONS + " decoding iterations..."); - - long start1 = System.currentTimeMillis(); - for (int i = 0; i < ITERATIONS; i++) { - result = RLP.decode(payload, 0); - } - long end1 = System.currentTimeMillis(); - - long start2 = System.currentTimeMillis(); - for (int i = 0; i < ITERATIONS; i++) { - list = RLP.decode2(payload); - } - long end2 = System.currentTimeMillis(); - - System.out.println("Result RLP.decode()\t: " + (end1 - start1) + "ms and\t " + determineSize(result) + " bytes for each resulting object list"); - System.out.println("Result RLP.decode2()\t: " + (end2 - start2) + "ms and\t " + determineSize(list) + " bytes for each resulting object list"); - } else { - System.out.println("Performance test for RLP.decode() disabled"); - } - } - - private int determineSize(Serializable ser) throws IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ObjectOutputStream oos = new ObjectOutputStream(baos); - oos.writeObject(ser); - oos.close(); - return baos.size(); - } - - - @Test // found this with a bug - nice to keep - public void encodeEdgeShortList() { - - String expectedOutput = "f7c0c0b4600160003556601359506301000000600035040f6018590060005660805460016080530160005760003560805760203560003557"; - - byte[] rlpKeysList = Hex.decode("c0"); - byte[] rlpValuesList = Hex.decode("c0"); - byte[] rlpCode = Hex.decode("b4600160003556601359506301000000600035040f6018590060005660805460016080530160005760003560805760203560003557"); - byte[] output = RLP.encodeList(rlpKeysList, rlpValuesList, rlpCode); - - assertEquals(expectedOutput, Hex.toHexString(output)); - } - - - @Test - public void encodeBigIntegerEdge_1() { - - BigInteger integer = new BigInteger("80", 10); - byte[] encodedData = RLP.encodeBigInteger(integer); - System.out.println(Hex.toHexString(encodedData)); - } - - -} \ No newline at end of file diff --git a/ethereumj-core/src/test/java/test/ethereum/util/RlpTestData.java b/ethereumj-core/src/test/java/test/ethereum/util/RlpTestData.java deleted file mode 100644 index f8ac0892..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/util/RlpTestData.java +++ /dev/null @@ -1,59 +0,0 @@ -package test.ethereum.util; - -import java.math.BigInteger; - -public class RlpTestData { - - /*********************************** - * https://github.com/ethereum/tests/blob/master/rlptest.txt - */ - public static int test01 = 0; - public static String result01 = "80"; - - public static String test02 = ""; - public static String result02 = "80"; - - public static String test03 = "d"; - public static String result03 = "64"; - - public static String test04 = "cat"; - public static String result04 = "83636174"; - - public static String test05 = "dog"; - public static String result05 = "83646f67"; - - public static String[] test06 = new String[]{"cat", "dog"}; - public static String result06 = "c88363617483646f67"; - - public static String[] test07 = new String[]{"dog", "god", "cat"}; - public static String result07 = "cc83646f6783676f6483636174"; - - public static int test08 = 1; - public static String result08 = "01"; - - public static int test09 = 10; - public static String result09 = "0a"; - - public static int test10 = 100; - public static String result10 = "64"; - - public static int test11 = 1000; - public static String result11 = "8203e8"; - - public static BigInteger test12 = new BigInteger("115792089237316195423570985008687907853269984665640564039457584007913129639935"); - public static String result12 = "a0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; - - public static BigInteger test13 = new BigInteger("115792089237316195423570985008687907853269984665640564039457584007913129639936"); - public static String result13 = "a1010000000000000000000000000000000000000000000000000000000000000000"; - - public static Object[] test14 = new Object[]{1, 2, new Object[]{}}; - public static String result14 = "c30102c0"; - public static Object[] expected14 = new Object[]{new byte[]{1}, new byte[]{2}, new Object[]{}}; - - public static Object[] test15 = new Object[]{new Object[]{new Object[]{}, new Object[]{}}, new Object[]{}}; - public static String result15 = "c4c2c0c0c0"; - - public static Object[] test16 = new Object[]{"zw", new Object[]{4}, "wz"}; - public static String result16 = "c8827a77c10482777a"; - public static Object[] expected16 = new Object[]{new byte[]{122, 119}, new Object[]{new byte[]{4}}, new byte[]{119, 122}}; -} diff --git a/ethereumj-core/src/test/java/test/ethereum/util/UtilsTest.java b/ethereumj-core/src/test/java/test/ethereum/util/UtilsTest.java deleted file mode 100644 index 49f395b8..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/util/UtilsTest.java +++ /dev/null @@ -1,92 +0,0 @@ -package test.ethereum.util; - -import org.ethereum.util.Utils; - -import org.junit.Test; - -import org.spongycastle.util.Arrays; -import org.spongycastle.util.encoders.Hex; - -import java.math.BigInteger; - -import static org.junit.Assert.assertEquals; - -/** - * @author Roman Mandeleil - * @since 17.05.14 - */ -public class UtilsTest { - - @Test - public void testGetValueShortString1() { - - String expected = "123·(10^24)"; - String result = Utils.getValueShortString(new BigInteger("123456789123445654363653463")); - - assertEquals(expected, result); - } - - @Test - public void testGetValueShortString2() { - - String expected = "123·(10^3)"; - String result = Utils.getValueShortString(new BigInteger("123456")); - - assertEquals(expected, result); - } - - @Test - public void testGetValueShortString3() { - - String expected = "1·(10^3)"; - String result = Utils.getValueShortString(new BigInteger("1234")); - - assertEquals(expected, result); - } - - @Test - public void testGetValueShortString4() { - - String expected = "123·(10^0)"; - String result = Utils.getValueShortString(new BigInteger("123")); - - assertEquals(expected, result); - } - - @Test - public void testGetValueShortString5() { - - byte[] decimal = Hex.decode("3913517ebd3c0c65000000"); - String expected = "69·(10^24)"; - String result = Utils.getValueShortString(new BigInteger(decimal)); - - assertEquals(expected, result); - } - - @Test - public void testAddressStringToBytes() { - // valid address - String HexStr = "6c386a4b26f73c802f34673f7248bb118f97424a"; - byte[] expected = Hex.decode(HexStr); - byte[] result = Utils.addressStringToBytes(HexStr); - assertEquals(Arrays.areEqual(expected, result), true); - - // invalid address, we removed the last char so it cannot decode - HexStr = "6c386a4b26f73c802f34673f7248bb118f97424"; - expected = null; - result = Utils.addressStringToBytes(HexStr); - assertEquals(expected, result); - - // invalid address, longer than 20 bytes - HexStr = new String(Hex.encode("I am longer than 20 bytes, i promise".getBytes())); - expected = null; - result = Utils.addressStringToBytes(HexStr); - assertEquals(expected, result); - - // invalid address, shorter than 20 bytes - HexStr = new String(Hex.encode("I am short".getBytes())); - expected = null; - result = Utils.addressStringToBytes(HexStr); - assertEquals(expected, result); - } -} diff --git a/ethereumj-core/src/test/java/test/ethereum/util/ValueTest.java b/ethereumj-core/src/test/java/test/ethereum/util/ValueTest.java deleted file mode 100644 index f7115640..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/util/ValueTest.java +++ /dev/null @@ -1,63 +0,0 @@ -package test.ethereum.util; - -import org.ethereum.util.Value; - -import org.junit.Test; - -import org.spongycastle.util.encoders.Hex; - -import java.math.BigInteger; - -import java.util.Arrays; - -import static org.junit.Assert.*; - -public class ValueTest { - - @Test - public void testCmp() { - Value val1 = new Value("hello"); - Value val2 = new Value("world"); - - assertFalse("Expected values not to be equal", val1.cmp(val2)); - - Value val3 = new Value("hello"); - Value val4 = new Value("hello"); - - assertTrue("Expected values to be equal", val3.cmp(val4)); - } - - @Test - public void testTypes() { - Value str = new Value("str"); - assertEquals(str.asString(), "str"); - - Value num = new Value(1); - assertEquals(num.asInt(), 1); - - Value inter = new Value(new Object[]{1}); - Object[] interExp = new Object[]{1}; - assertTrue(new Value(inter.asObj()).cmp(new Value(interExp))); - - Value byt = new Value(new byte[]{1, 2, 3, 4}); - byte[] bytExp = new byte[]{1, 2, 3, 4}; - assertTrue(Arrays.equals(byt.asBytes(), bytExp)); - - Value bigInt = new Value(BigInteger.valueOf(10)); - BigInteger bigExp = BigInteger.valueOf(10); - assertEquals(bigInt.asBigInt(), bigExp); - } - - - @Test - public void longListRLPBug_1() { - - String testRlp = "f7808080d387206f72726563748a626574656c676575736580d387207870726573738a70726564696361626c658080808080808080808080"; - - Value val = Value.fromRlpEncoded(Hex.decode(testRlp)); - - assertEquals(testRlp, Hex.toHexString(val.encode())); - } - - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/vm/DataWordTest.java b/ethereumj-core/src/test/java/test/ethereum/vm/DataWordTest.java deleted file mode 100644 index 9b3f23ae..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/vm/DataWordTest.java +++ /dev/null @@ -1,324 +0,0 @@ -package test.ethereum.vm; - -import org.ethereum.vm.DataWord; - -import org.junit.Test; - -import org.spongycastle.util.encoders.Hex; - -import java.math.BigInteger; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -public class DataWordTest { - - @Test - public void testAddPerformance() { - boolean enabled = false; - - if (enabled) { - byte[] one = new byte[]{0x01, 0x31, 0x54, 0x41, 0x01, 0x31, 0x54, - 0x41, 0x01, 0x31, 0x54, 0x41, 0x01, 0x31, 0x54, 0x41, 0x01, - 0x31, 0x54, 0x41, 0x01, 0x31, 0x54, 0x41, 0x01, 0x31, 0x54, - 0x41, 0x01, 0x31, 0x54, 0x41}; // Random value - - int ITERATIONS = 10000000; - - long now1 = System.currentTimeMillis(); - for (int i = 0; i < ITERATIONS; i++) { - DataWord x = new DataWord(one); - x.add(x); - } - System.out.println("Add1: " + (System.currentTimeMillis() - now1) + "ms"); - - long now2 = System.currentTimeMillis(); - for (int i = 0; i < ITERATIONS; i++) { - DataWord x = new DataWord(one); - x.add2(x); - } - System.out.println("Add2: " + (System.currentTimeMillis() - now2) + "ms"); - } else { - System.out.println("ADD performance test is disabled."); - } - } - - @Test - public void testAdd2() { - byte[] two = new byte[32]; - two[31] = (byte) 0xff; // 0x000000000000000000000000000000000000000000000000000000000000ff - - DataWord x = new DataWord(two); - x.add(new DataWord(two)); - System.out.println(Hex.toHexString(x.getData())); - - DataWord y = new DataWord(two); - y.add2(new DataWord(two)); - System.out.println(Hex.toHexString(y.getData())); - } - - @Test - public void testAdd3() { - byte[] three = new byte[32]; - for (int i = 0; i < three.length; i++) { - three[i] = (byte) 0xff; - } - - DataWord x = new DataWord(three); - x.add(new DataWord(three)); - assertEquals(32, x.getData().length); - System.out.println(Hex.toHexString(x.getData())); - - // FAIL -// DataWord y = new DataWord(three); -// y.add2(new DataWord(three)); -// System.out.println(Hex.toHexString(y.getData())); - } - - @Test - public void testMod() { - String expected = "000000000000000000000000000000000000000000000000000000000000001a"; - - byte[] one = new byte[32]; - one[31] = 0x1e; // 0x000000000000000000000000000000000000000000000000000000000000001e - - byte[] two = new byte[32]; - for (int i = 0; i < two.length; i++) { - two[i] = (byte) 0xff; - } - two[31] = 0x56; // 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff56 - - DataWord x = new DataWord(one);// System.out.println(x.value()); - DataWord y = new DataWord(two);// System.out.println(y.value()); - y.mod(x); - assertEquals(32, y.getData().length); - assertEquals(expected, Hex.toHexString(y.getData())); - } - - @Test - public void testMul() { - byte[] one = new byte[32]; - one[31] = 0x1; // 0x0000000000000000000000000000000000000000000000000000000000000001 - - byte[] two = new byte[32]; - two[11] = 0x1; // 0x0000000000000000000000010000000000000000000000000000000000000000 - - DataWord x = new DataWord(one);// System.out.println(x.value()); - DataWord y = new DataWord(two);// System.out.println(y.value()); - x.mul(y); - assertEquals(32, y.getData().length); - assertEquals("0000000000000000000000010000000000000000000000000000000000000000", Hex.toHexString(y.getData())); - } - - @Test - public void testMulOverflow() { - - byte[] one = new byte[32]; - one[30] = 0x1; // 0x0000000000000000000000000000000000000000000000000000000000000100 - - byte[] two = new byte[32]; - two[0] = 0x1; // 0x1000000000000000000000000000000000000000000000000000000000000000 - - DataWord x = new DataWord(one);// System.out.println(x.value()); - DataWord y = new DataWord(two);// System.out.println(y.value()); - x.mul(y); - assertEquals(32, y.getData().length); - assertEquals("0100000000000000000000000000000000000000000000000000000000000000", Hex.toHexString(y.getData())); - } - - @Test - public void testDiv() { - byte[] one = new byte[32]; - one[30] = 0x01; - one[31] = 0x2c; // 0x000000000000000000000000000000000000000000000000000000000000012c - - byte[] two = new byte[32]; - two[31] = 0x0f; // 0x000000000000000000000000000000000000000000000000000000000000000f - - DataWord x = new DataWord(one); - DataWord y = new DataWord(two); - x.div(y); - - assertEquals(32, x.getData().length); - assertEquals("0000000000000000000000000000000000000000000000000000000000000014", Hex.toHexString(x.getData())); - } - - @Test - public void testDivZero() { - byte[] one = new byte[32]; - one[30] = 0x05; // 0x0000000000000000000000000000000000000000000000000000000000000500 - - byte[] two = new byte[32]; - - DataWord x = new DataWord(one); - DataWord y = new DataWord(two); - x.div(y); - - assertEquals(32, x.getData().length); - assertTrue(x.isZero()); - } - - @Test - public void testSDivNegative() { - - // one is -300 as 256-bit signed integer: - byte[] one = Hex.decode("fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed4"); - - byte[] two = new byte[32]; - two[31] = 0x0f; - - DataWord x = new DataWord(one); - DataWord y = new DataWord(two); - x.sDiv(y); - - assertEquals(32, x.getData().length); - assertEquals("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec", x.toString()); - } - - @Test - public void testPow() { - - BigInteger x = BigInteger.valueOf(Integer.MAX_VALUE); - BigInteger y = BigInteger.valueOf(1000); - - BigInteger result1 = x.modPow(x, y); - BigInteger result2 = pow(x, y); - System.out.println(result1); - System.out.println(result2); - } - - @Test - public void testSignExtend1() { - - DataWord x = new DataWord(Hex.decode("f2")); - byte k = 0; - String expected = "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2"; - - x.signExtend(k); - System.out.println(x.toString()); - assertEquals(expected, x.toString()); - } - - @Test - public void testSignExtend2() { - DataWord x = new DataWord(Hex.decode("f2")); - byte k = 1; - String expected = "00000000000000000000000000000000000000000000000000000000000000f2"; - - x.signExtend(k); - System.out.println(x.toString()); - assertEquals(expected, x.toString()); - } - - @Test - public void testSignExtend3() { - - byte k = 1; - DataWord x = new DataWord(Hex.decode("0f00ab")); - String expected = "00000000000000000000000000000000000000000000000000000000000000ab"; - - x.signExtend(k); - System.out.println(x.toString()); - assertEquals(expected, x.toString()); - } - - @Test - public void testSignExtend4() { - - byte k = 1; - DataWord x = new DataWord(Hex.decode("ffff")); - String expected = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; - - x.signExtend(k); - System.out.println(x.toString()); - assertEquals(expected, x.toString()); - } - - @Test - public void testSignExtend5() { - - byte k = 3; - DataWord x = new DataWord(Hex.decode("ffffffff")); - String expected = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; - - x.signExtend(k); - System.out.println(x.toString()); - assertEquals(expected, x.toString()); - } - - @Test - public void testSignExtend6() { - - byte k = 3; - DataWord x = new DataWord(Hex.decode("ab02345678")); - String expected = "0000000000000000000000000000000000000000000000000000000002345678"; - - x.signExtend(k); - System.out.println(x.toString()); - assertEquals(expected, x.toString()); - } - - @Test - public void testSignExtend7() { - - byte k = 3; - DataWord x = new DataWord(Hex.decode("ab82345678")); - String expected = "ffffffffffffffffffffffffffffffffffffffffffffffffffffffff82345678"; - - x.signExtend(k); - System.out.println(x.toString()); - assertEquals(expected, x.toString()); - } - - @Test - public void testSignExtend8() { - - byte k = 30; - DataWord x = new DataWord(Hex.decode("ff34567882345678823456788234567882345678823456788234567882345678")); - String expected = "0034567882345678823456788234567882345678823456788234567882345678"; - - x.signExtend(k); - System.out.println(x.toString()); - assertEquals(expected, x.toString()); - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testSignExtendException1() { - - byte k = -1; - DataWord x = new DataWord(); - - x.signExtend(k); // should throw an exception - } - - @Test(expected = IndexOutOfBoundsException.class) - public void testSignExtendException2() { - - byte k = 32; - DataWord x = new DataWord(); - - x.signExtend(k); // should throw an exception - } - - public static BigInteger pow(BigInteger x, BigInteger y) { - if (y.compareTo(BigInteger.ZERO) < 0) - throw new IllegalArgumentException(); - BigInteger z = x; // z will successively become x^2, x^4, x^8, x^16, - // x^32... - BigInteger result = BigInteger.ONE; - byte[] bytes = y.toByteArray(); - for (int i = bytes.length - 1; i >= 0; i--) { - byte bits = bytes[i]; - for (int j = 0; j < 8; j++) { - if ((bits & 1) != 0) - result = result.multiply(z); - // short cut out if there are no more bits to handle: - if ((bits >>= 1) == 0 && i == 0) - return result; - z = z.multiply(z); - } - } - return result; - } - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/vm/PrecompiledContractTest.java b/ethereumj-core/src/test/java/test/ethereum/vm/PrecompiledContractTest.java deleted file mode 100644 index e1adce52..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/vm/PrecompiledContractTest.java +++ /dev/null @@ -1,102 +0,0 @@ -package test.ethereum.vm; - -import org.ethereum.util.ByteUtil; -import org.ethereum.vm.DataWord; -import org.ethereum.vm.PrecompiledContracts; -import org.ethereum.vm.PrecompiledContracts.PrecompiledContract; - -import org.junit.Test; - -import org.spongycastle.util.encoders.Hex; - -import static org.junit.Assert.*; - -/** - * @author Roman Mandeleil - */ -public class PrecompiledContractTest { - - - @Test - public void identityTest1() { - - DataWord addr = new DataWord("0000000000000000000000000000000000000000000000000000000000000004"); - PrecompiledContract contract = PrecompiledContracts.getContractForAddress(addr); - byte[] data = Hex.decode("112233445566"); - byte[] expected = Hex.decode("112233445566"); - - byte[] result = contract.execute(data); - - assertArrayEquals(expected, result); - } - - - @Test - public void sha256Test1() { - - DataWord addr = new DataWord("0000000000000000000000000000000000000000000000000000000000000002"); - PrecompiledContract contract = PrecompiledContracts.getContractForAddress(addr); - byte[] data = null; - String expected = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; - - byte[] result = contract.execute(data); - - assertEquals(expected, Hex.toHexString(result)); - } - - @Test - public void sha256Test2() { - - DataWord addr = new DataWord("0000000000000000000000000000000000000000000000000000000000000002"); - PrecompiledContract contract = PrecompiledContracts.getContractForAddress(addr); - byte[] data = ByteUtil.EMPTY_BYTE_ARRAY; - String expected = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"; - - byte[] result = contract.execute(data); - - assertEquals(expected, Hex.toHexString(result)); - } - - @Test - public void sha256Test3() { - - DataWord addr = new DataWord("0000000000000000000000000000000000000000000000000000000000000002"); - PrecompiledContract contract = PrecompiledContracts.getContractForAddress(addr); - byte[] data = Hex.decode("112233"); - String expected = "49ee2bf93aac3b1fb4117e59095e07abe555c3383b38d608da37680a406096e8"; - - byte[] result = contract.execute(data); - - assertEquals(expected, Hex.toHexString(result)); - } - - - @Test - public void Ripempd160Test1() { - - DataWord addr = new DataWord("0000000000000000000000000000000000000000000000000000000000000003"); - PrecompiledContract contract = PrecompiledContracts.getContractForAddress(addr); - byte[] data = Hex.decode("0000000000000000000000000000000000000000000000000000000000000001"); - String expected = "000000000000000000000000ae387fcfeb723c3f5964509af111cf5a67f30661"; - - byte[] result = contract.execute(data); - - assertEquals(expected, Hex.toHexString(result)); - } - - @Test - public void ecRecoverTest1() { - - byte[] data = Hex.decode("18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c000000000000000000000000000000000000000000000000000000000000001c73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75feeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549"); - DataWord addr = new DataWord("0000000000000000000000000000000000000000000000000000000000000001"); - PrecompiledContract contract = PrecompiledContracts.getContractForAddress(addr); - String expected = "000000000000000000000000ae387fcfeb723c3f5964509af111cf5a67f30661"; - - byte[] result = contract.execute(data); - - System.out.println(Hex.toHexString(result)); - - - } - -} diff --git a/ethereumj-core/src/test/java/test/ethereum/vm/ProgramMemoryTest.java b/ethereumj-core/src/test/java/test/ethereum/vm/ProgramMemoryTest.java deleted file mode 100644 index 062cd783..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/vm/ProgramMemoryTest.java +++ /dev/null @@ -1,338 +0,0 @@ -package test.ethereum.vm; - -import org.ethereum.util.ByteUtil; -import org.ethereum.vm.Program; -import org.ethereum.vm.ProgramInvokeMockImpl; - -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; - -import java.nio.ByteBuffer; - -import static org.junit.Assert.*; - -public class ProgramMemoryTest { - - ProgramInvokeMockImpl pi = null; - Program program; - ByteBuffer memory; - - @Before - public void createProgram() { - program = new Program(ByteUtil.EMPTY_BYTE_ARRAY, pi); - } - - @Test - public void testGetMemSize() { - ByteBuffer memory = ByteBuffer.allocate(64); - program.initMem(memory); - assertEquals(64, program.getMemSize()); - } - - @Test - @Ignore - public void testMemorySave() { - fail("Not yet implemented"); - } - - @Test - @Ignore - public void testMemoryLoad() { - fail("Not yet implemented"); - } - - @Test - public void testMemoryChunk1() { - program.initMem(ByteBuffer.allocate(64)); - int offset = 128; - int size = 32; - program.memoryChunk(offset, size); - assertEquals(160, program.getMemSize()); - } - - @Test // size 0 doesn't increate memory - public void testMemoryChunk2() { - program.initMem(ByteBuffer.allocate(64)); - int offset = 96; - int size = 0; - program.memoryChunk(offset, size); - assertEquals(64, program.getMemSize()); - } - - @Test - public void testAllocateMemory1() { - - program.initMem(ByteBuffer.allocate(64)); - int offset = 32; - int size = 32; - program.allocateMemory(offset, size); - assertEquals(64, program.getMemSize()); - } - - @Test - public void testAllocateMemory2() { - - // memory.limit() > offset, == size - // memory.limit() < offset + size - program.initMem(ByteBuffer.allocate(64)); - int offset = 32; - int size = 64; - program.allocateMemory(offset, size); - assertEquals(96, program.getMemSize()); - } - - @Test - public void testAllocateMemory3() { - - // memory.limit() > offset, > size - program.initMem(ByteBuffer.allocate(64)); - int offset = 0; - int size = 32; - program.allocateMemory(offset, size); - assertEquals(64, program.getMemSize()); - } - - @Test - public void testAllocateMemory4() { - - program.initMem(ByteBuffer.allocate(64)); - int offset = 0; - int size = 64; - program.allocateMemory(offset, size); - assertEquals(64, program.getMemSize()); - } - - @Test - public void testAllocateMemory5() { - - program.initMem(ByteBuffer.allocate(64)); - int offset = 0; - int size = 0; - program.allocateMemory(offset, size); - assertEquals(64, program.getMemSize()); - } - - @Test - public void testAllocateMemory6() { - - // memory.limit() == offset, > size - program.initMem(ByteBuffer.allocate(64)); - int offset = 64; - int size = 32; - program.allocateMemory(offset, size); - assertEquals(96, program.getMemSize()); - } - - @Test - public void testAllocateMemory7() { - - // memory.limit() == offset - size - program.initMem(ByteBuffer.allocate(64)); - int offset = 96; - int size = 32; - program.allocateMemory(offset, size); - assertEquals(128, program.getMemSize()); - } - - @Test - public void testAllocateMemory8() { - - program.initMem(ByteBuffer.allocate(64)); - int offset = 0; - int size = 96; - program.allocateMemory(offset, size); - assertEquals(96, program.getMemSize()); - } - - @Test - public void testAllocateMemory9() { - - // memory.limit() < offset, > size - // memory.limit() < offset - size - program.initMem(ByteBuffer.allocate(64)); - int offset = 96; - int size = 0; - program.allocateMemory(offset, size); - assertEquals(64, program.getMemSize()); - } - - /************************************************/ - - - @Test - public void testAllocateMemory10() { - - // memory = null, offset > size - int offset = 32; - int size = 0; - program.allocateMemory(offset, size); - assertEquals(0, program.getMemSize()); - } - - @Test - public void testAllocateMemory11() { - - // memory = null, offset < size - int offset = 0; - int size = 32; - program.allocateMemory(offset, size); - assertEquals(32, program.getMemSize()); - } - - @Test - public void testAllocateMemory12() { - - // memory.limit() < offset, < size - program.initMem(ByteBuffer.allocate(64)); - int offset = 64; - int size = 96; - program.allocateMemory(offset, size); - assertEquals(160, program.getMemSize()); - } - - @Test - public void testAllocateMemory13() { - - // memory.limit() > offset, < size - program.initMem(ByteBuffer.allocate(64)); - int offset = 32; - int size = 128; - program.allocateMemory(offset, size); - assertEquals(160, program.getMemSize()); - } - - @Test - public void testAllocateMemory14() { - - // memory.limit() < offset, == size - program.initMem(ByteBuffer.allocate(64)); - int offset = 96; - int size = 64; - program.allocateMemory(offset, size); - assertEquals(160, program.getMemSize()); - } - - @Test - public void testAllocateMemory15() { - - // memory.limit() == offset, < size - program.initMem(ByteBuffer.allocate(64)); - int offset = 64; - int size = 96; - program.allocateMemory(offset, size); - assertEquals(160, program.getMemSize()); - } - - @Test - public void testAllocateMemory16() { - - // memory.limit() == offset, == size - // memory.limit() > offset - size - program.initMem(ByteBuffer.allocate(64)); - int offset = 64; - int size = 64; - program.allocateMemory(offset, size); - assertEquals(128, program.getMemSize()); - } - - @Test - public void testAllocateMemory17() { - - // memory.limit() > offset + size - program.initMem(ByteBuffer.allocate(96)); - int offset = 32; - int size = 32; - program.allocateMemory(offset, size); - assertEquals(96, program.getMemSize()); - } - - @Test - public void testAllocateMemoryUnrounded1() { - - // memory unrounded - program.initMem(ByteBuffer.allocate(64)); - int offset = 64; - int size = 32; - program.allocateMemory(offset, size); - assertEquals(96, program.getMemSize()); - } - - @Test - public void testAllocateMemoryUnrounded2() { - - // offset unrounded - program.initMem(ByteBuffer.allocate(64)); - int offset = 16; - int size = 32; - program.allocateMemory(offset, size); - assertEquals(64, program.getMemSize()); - } - - @Test - public void testAllocateMemoryUnrounded3() { - - // size unrounded - program.initMem(ByteBuffer.allocate(64)); - int offset = 64; - int size = 16; - program.allocateMemory(offset, size); - assertEquals(96, program.getMemSize()); - } - - @Test - public void testAllocateMemoryUnrounded4() { - - // memory + offset unrounded - program.initMem(ByteBuffer.allocate(64)); - int offset = 16; - int size = 32; - program.allocateMemory(offset, size); - assertEquals(64, program.getMemSize()); - } - - @Test - public void testAllocateMemoryUnrounded5() { - - // memory + size unrounded - program.initMem(ByteBuffer.allocate(64)); - int offset = 32; - int size = 16; - program.allocateMemory(offset, size); - assertEquals(64, program.getMemSize()); - } - - @Test - public void testAllocateMemoryUnrounded6() { - - // offset + size unrounded - program.initMem(ByteBuffer.allocate(32)); - int offset = 16; - int size = 16; - program.allocateMemory(offset, size); - assertEquals(32, program.getMemSize()); - } - - @Test - public void testAllocateMemoryUnrounded7() { - - // memory + offset + size unrounded - program.initMem(ByteBuffer.allocate(32)); - int offset = 16; - int size = 16; - program.allocateMemory(offset, size); - assertEquals(32, program.getMemSize()); - } - - @Ignore - @Test - public void testInitialInsert() { - - - // todo: fix the array out of bound here - int offset = 32; - int size = 00; - program.memorySave(32, 0, new byte[0]); - assertEquals(32, program.getMemSize()); - } -} \ No newline at end of file diff --git a/ethereumj-core/src/test/java/test/ethereum/vm/VMComplexTest.java b/ethereumj-core/src/test/java/test/ethereum/vm/VMComplexTest.java deleted file mode 100644 index 0eddda79..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/vm/VMComplexTest.java +++ /dev/null @@ -1,659 +0,0 @@ -package test.ethereum.vm; - -import org.ethereum.core.AccountState; -import org.ethereum.crypto.HashUtil; -import org.ethereum.facade.Repository; -import org.ethereum.vm.DataWord; -import org.ethereum.vm.Program; -import org.ethereum.vm.ProgramInvokeMockImpl; -import org.ethereum.vm.VM; - -import org.junit.FixMethodOrder; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runners.MethodSorters; - -import org.spongycastle.util.encoders.Hex; - -import java.math.BigInteger; - -import static org.junit.Assert.assertEquals; - -/** - * @author Roman Mandeleil - * @since 16.06.2014 - */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class VMComplexTest { - - @Test // contract call recursive - public void test1() { - - /** - * #The code will run - * ------------------ - - a = contract.storage[999] - if a > 0: - contract.storage[999] = a - 1 - - # call to contract: 77045e71a7a2c50903d88e564cd72fab11e82051 - send((tx.gas / 10 * 8), 0x77045e71a7a2c50903d88e564cd72fab11e82051, 0) - else: - stop - */ - - int expectedGas = 436; - - DataWord key1 = new DataWord(999); - DataWord value1 = new DataWord(3); - - // Set contract into Database - String callerAddr = "cd2a3d9f938e13cd947ec05abc7fe734df8dd826"; - String contractAddr = "77045e71a7a2c50903d88e564cd72fab11e82051"; - String code = - "6103e75460005260006000511115630000004c576001600051036103e755600060006000600060007377045e71a7a2c50903d88e564cd72fab11e820516008600a5a0402f1630000004c00565b00"; - - byte[] contractAddrB = Hex.decode(contractAddr); - byte[] callerAddrB = Hex.decode(callerAddr); - byte[] codeB = Hex.decode(code); - - byte[] codeKey = HashUtil.sha3(codeB); - AccountState accountState = new AccountState(); - accountState.setCodeHash(codeKey); - - ProgramInvokeMockImpl pi = new ProgramInvokeMockImpl(); - pi.setOwnerAddress(contractAddrB); - Repository repository = pi.getRepository(); - - repository.createAccount(callerAddrB); - repository.addBalance(callerAddrB, new BigInteger("100000000000000000000")); - - repository.createAccount(contractAddrB); - repository.saveCode(contractAddrB, codeB); - repository.addStorageRow(contractAddrB, key1, value1); - - // Play the program - VM vm = new VM(); - Program program = new Program(codeB, pi); - - try { - while (!program.isStopped()) - vm.step(program); - } catch (RuntimeException e) { - program.setRuntimeFailure(e); - } - - System.out.println(); - System.out.println("============ Results ============"); - - BigInteger balance = repository.getBalance(callerAddrB); - - System.out.println("*** Used gas: " + program.getResult().getGasUsed()); - System.out.println("*** Contract Balance: " + balance); - - // todo: assert caller balance after contract exec - - repository.close(); - assertEquals(expectedGas, program.getResult().getGasUsed()); - } - - @Test // contractB call contractA with data to storage - public void test2() { - - /** - * #The code will run - * ------------------ - - contract A: 77045e71a7a2c50903d88e564cd72fab11e82051 - --------------- - a = msg.data[0] - b = msg.data[1] - - contract.storage[a] - contract.storage[b] - - - contract B: 83c5541a6c8d2dbad642f385d8d06ca9b6c731ee - ----------- - a = msg((tx.gas / 10 * 8), 0x77045e71a7a2c50903d88e564cd72fab11e82051, 0, [11, 22, 33], 3, 6) - - */ - - long expectedVal_1 = 11; - long expectedVal_2 = 22; - - // Set contract into Database - String callerAddr = "cd2a3d9f938e13cd947ec05abc7fe734df8dd826"; - - String contractA_addr = "77045e71a7a2c50903d88e564cd72fab11e82051"; - String contractB_addr = "83c5541a6c8d2dbad642f385d8d06ca9b6c731ee"; - - String code_a = "60006020023560005260016020023560205260005160005560205160015500"; - String code_b = "6000601f5360e05960e05952600060c05901536060596020015980602001600b9052806040016016905280606001602190526080905260007377045e71a7a2c50903d88e564cd72fab11e820516103e8f1602060000260a00160200151600052"; - - byte[] caller_addr_bytes = Hex.decode(callerAddr); - - byte[] contractA_addr_bytes = Hex.decode(contractA_addr); - byte[] codeA = Hex.decode(code_a); - - byte[] contractB_addr_bytes = Hex.decode(contractB_addr); - byte[] codeB = Hex.decode(code_b); - - ProgramInvokeMockImpl pi = new ProgramInvokeMockImpl(); - pi.setOwnerAddress(contractB_addr_bytes); - Repository repository = pi.getRepository(); - - repository.createAccount(contractA_addr_bytes); - repository.saveCode(contractA_addr_bytes, codeA); - - repository.createAccount(contractB_addr_bytes); - repository.saveCode(contractB_addr_bytes, codeB); - - repository.createAccount(caller_addr_bytes); - repository.addBalance(caller_addr_bytes, new BigInteger("100000000000000000000")); - - - // ****************** // - // Play the program // - // ****************** // - VM vm = new VM(); - Program program = new Program(codeB, pi); - - try { - while (!program.isStopped()) - vm.step(program); - } catch (RuntimeException e) { - program.setRuntimeFailure(e); - } - - - System.out.println(); - System.out.println("============ Results ============"); - - - System.out.println("*** Used gas: " + program.getResult().getGasUsed()); - - - DataWord value_1 = repository.getStorageValue(contractA_addr_bytes, new DataWord(00)); - DataWord value_2 = repository.getStorageValue(contractA_addr_bytes, new DataWord(01)); - - - repository.close(); - assertEquals(expectedVal_1, value_1.longValue()); - assertEquals(expectedVal_2, value_2.longValue()); - - // TODO: check that the value pushed after exec is 1 - } - - @Ignore - @Test // contractB call contractA with return expectation - public void test3() { - - /** - * #The code will run - * ------------------ - - contract A: 77045e71a7a2c50903d88e564cd72fab11e82051 - --------------- - - a = 11 - b = 22 - c = 33 - d = 44 - e = 55 - f = 66 - - [asm 192 0 RETURN asm] - - - - contract B: 83c5541a6c8d2dbad642f385d8d06ca9b6c731ee - ----------- - a = msg((tx.gas / 10 * 8), 0x77045e71a7a2c50903d88e564cd72fab11e82051, 0, [11, 22, 33], 3, 6) - - */ - - long expectedVal_1 = 11; - long expectedVal_2 = 22; - long expectedVal_3 = 33; - long expectedVal_4 = 44; - long expectedVal_5 = 55; - long expectedVal_6 = 66; - - // Set contract into Database - byte[] caller_addr_bytes = Hex.decode("cd2a3d9f938e13cd947ec05abc7fe734df8dd826"); - - byte[] contractA_addr_bytes = Hex.decode("77045e71a7a2c50903d88e564cd72fab11e82051"); - byte[] contractB_addr_bytes = Hex.decode("83c5541a6c8d2dbad642f385d8d06ca9b6c731ee"); - - byte[] codeA = Hex.decode("600b60005260166020526021604052602c6060526037608052604260a05260c06000f2"); - byte[] codeB = Hex.decode("6000601f5360e05960e05952600060c05901536060596020015980602001600b9052806040016016905280606001602190526080905260007377045e71a7a2c50903d88e564cd72fab11e820516103e8f1602060000260a00160200151600052"); - - ProgramInvokeMockImpl pi = new ProgramInvokeMockImpl(); - pi.setOwnerAddress(contractB_addr_bytes); - Repository repository = pi.getRepository(); - repository.createAccount(contractA_addr_bytes); - repository.saveCode(contractA_addr_bytes, codeA); - - repository.createAccount(contractB_addr_bytes); - repository.saveCode(contractB_addr_bytes, codeB); - - repository.createAccount(caller_addr_bytes); - repository.addBalance(caller_addr_bytes, new BigInteger("100000000000000000000")); - - // ****************** // - // Play the program // - // ****************** // - VM vm = new VM(); - Program program = new Program(codeB, pi); - - try { - while (!program.isStopped()) - vm.step(program); - } catch (RuntimeException e) { - program.setRuntimeFailure(e); - } - - System.out.println(); - System.out.println("============ Results ============"); - System.out.println("*** Used gas: " + program.getResult().getGasUsed()); - - DataWord value1 = program.memoryLoad(new DataWord(32)); - DataWord value2 = program.memoryLoad(new DataWord(64)); - DataWord value3 = program.memoryLoad(new DataWord(96)); - DataWord value4 = program.memoryLoad(new DataWord(128)); - DataWord value5 = program.memoryLoad(new DataWord(160)); - DataWord value6 = program.memoryLoad(new DataWord(192)); - - repository.close(); - - assertEquals(expectedVal_1, value1.longValue()); - assertEquals(expectedVal_2, value2.longValue()); - assertEquals(expectedVal_3, value3.longValue()); - assertEquals(expectedVal_4, value4.longValue()); - assertEquals(expectedVal_5, value5.longValue()); - assertEquals(expectedVal_6, value6.longValue()); - - // TODO: check that the value pushed after exec is 1 - } - - @Test // CREATE magic - public void test4() { - - /** - * #The code will run - * ------------------ - - contract A: 77045e71a7a2c50903d88e564cd72fab11e82051 - ----------- - - a = 0x7f60c860005461012c6020540000000000000000000000000000000000000000 - b = 0x0060005460206000f20000000000000000000000000000000000000000000000 - create(100, 0 41) - - - contract B: (the contract to be created the addr will be defined to: 8e45367623a2865132d9bf875d5cfa31b9a0cd94) - ----------- - a = 200 - b = 300 - - */ - - // Set contract into Database - byte[] caller_addr_bytes = Hex.decode("cd2a3d9f938e13cd947ec05abc7fe734df8dd826"); - - byte[] contractA_addr_bytes = Hex.decode("77045e71a7a2c50903d88e564cd72fab11e82051"); - - byte[] codeA = Hex.decode("7f7f60c860005461012c602054000000000000" + - "00000000000000000000000000006000547e60" + - "005460206000f2000000000000000000000000" + - "0000000000000000000000602054602960006064f0"); - - ProgramInvokeMockImpl pi = new ProgramInvokeMockImpl(); - pi.setOwnerAddress(contractA_addr_bytes); - - Repository repository = pi.getRepository(); - - repository.createAccount(contractA_addr_bytes); - repository.saveCode(contractA_addr_bytes, codeA); - - repository.createAccount(caller_addr_bytes); - - // ****************** // - // Play the program // - // ****************** // - VM vm = new VM(); - Program program = new Program(codeA, pi); - - try { - while (!program.isStopped()) - vm.step(program); - } catch (RuntimeException e) { - program.setRuntimeFailure(e); - } - - System.out.println(); - System.out.println("============ Results ============"); - - System.out.println("*** Used gas: " + program.getResult().getGasUsed()); - // TODO: check that the value pushed after exec is the new address - repository.close(); - } - - @Test // CALL contract with too much gas - @Ignore - public void test5() { - // TODO CALL contract with gas > gasRemaining && gas > Long.MAX_VALUE - } - - @Ignore - @Test // contractB call itself with code from contractA - public void test6() { - /** - * #The code will run - * ------------------ - - contract A: 945304eb96065b2a98b57a48a06ae28d285a71b5 - --------------- - - PUSH1 0 CALLDATALOAD SLOAD NOT PUSH1 9 JUMPI STOP - PUSH1 32 CALLDATALOAD PUSH1 0 CALLDATALOAD SSTORE - - contract B: 0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6 - ----------- - { (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) - (MSTORE 32 0xaaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa) - [[ 0 ]] (CALLSTATELESS 1000000 0x945304eb96065b2a98b57a48a06ae28d285a71b5 23 0 64 64 0) - } - */ - - // Set contract into Database - byte[] caller_addr_bytes = Hex.decode("cd1722f3947def4cf144679da39c4c32bdc35681"); - - byte[] contractA_addr_bytes = Hex.decode("945304eb96065b2a98b57a48a06ae28d285a71b5"); - byte[] contractB_addr_bytes = Hex.decode("0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6"); - - byte[] codeA = Hex.decode("60003554156009570060203560003555"); - byte[] codeB = Hex.decode("7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000527faaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa6020526000604060406000601773945304eb96065b2a98b57a48a06ae28d285a71b5620f4240f3600055"); - - ProgramInvokeMockImpl pi = new ProgramInvokeMockImpl(); - pi.setOwnerAddress(contractB_addr_bytes); - pi.setGasLimit(10000000000000l); - - Repository repository = pi.getRepository(); - repository.createAccount(contractA_addr_bytes); - repository.saveCode(contractA_addr_bytes, codeA); - repository.addBalance(contractA_addr_bytes, BigInteger.valueOf(23)); - - repository.createAccount(contractB_addr_bytes); - repository.saveCode(contractB_addr_bytes, codeB); - repository.addBalance(contractB_addr_bytes, new BigInteger("1000000000000000000")); - - repository.createAccount(caller_addr_bytes); - repository.addBalance(caller_addr_bytes, new BigInteger("100000000000000000000")); - - // ****************** // - // Play the program // - // ****************** // - VM vm = new VM(); - Program program = new Program(codeB, pi); - - try { - while (!program.isStopped()) - vm.step(program); - } catch (RuntimeException e) { - program.setRuntimeFailure(e); - } - - System.out.println(); - System.out.println("============ Results ============"); - System.out.println("*** Used gas: " + program.getResult().getGasUsed()); - - DataWord memValue1 = program.memoryLoad(new DataWord(0)); - DataWord memValue2 = program.memoryLoad(new DataWord(32)); - - DataWord storeValue1 = repository.getStorageValue(contractB_addr_bytes, new DataWord(00)); - - repository.close(); - - assertEquals("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", memValue1.toString()); - assertEquals("aaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffaa", memValue2.toString()); - - assertEquals("0x1", storeValue1.shortHex()); - - // TODO: check that the value pushed after exec is 1 - } - - //sha3_memSizeQuadraticCost33 - @Test // contract call quadratic memory use - public void test7() { - - int expectedGas = 357; - - DataWord key1 = new DataWord(999); - DataWord value1 = new DataWord(3); - - // Set contract into Database - String callerAddr = "cd1722f3947def4cf144679da39c4c32bdc35681"; - String contractAddr = "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6"; - String code = "600161040020600055"; - - byte[] contractAddrB = Hex.decode(contractAddr); - byte[] callerAddrB = Hex.decode(callerAddr); - byte[] codeB = Hex.decode(code); - - byte[] codeKey = HashUtil.sha3(codeB); - AccountState accountState = new AccountState(); - accountState.setCodeHash(codeKey); - - ProgramInvokeMockImpl pi = new ProgramInvokeMockImpl(); - pi.setOwnerAddress(contractAddrB); - Repository repository = pi.getRepository(); - - repository.createAccount(callerAddrB); - repository.addBalance(callerAddrB, new BigInteger("115792089237316195423570985008687907853269984665640564039457584007913129639935")); - - repository.createAccount(contractAddrB); - repository.saveCode(contractAddrB, codeB); - repository.addStorageRow(contractAddrB, key1, value1); - - // Play the program - VM vm = new VM(); - Program program = new Program(codeB, pi); - - try { - while (!program.isStopped()) - vm.step(program); - } catch (RuntimeException e) { - program.setRuntimeFailure(e); - } - - System.out.println(); - System.out.println("============ Results ============"); - - BigInteger balance = repository.getBalance(callerAddrB); - - System.out.println("*** Used gas: " + program.getResult().getGasUsed()); - System.out.println("*** Contract Balance: " + balance); - - // todo: assert caller balance after contract exec - - repository.close(); - assertEquals(expectedGas, program.getResult().getGasUsed()); - } - - //sha3_memSizeQuadraticCost31 - @Test // contract call quadratic memory use - public void test8() { - - int expectedGas = 354; - - DataWord key1 = new DataWord(999); - DataWord value1 = new DataWord(3); - - // Set contract into Database - String callerAddr = "cd1722f3947def4cf144679da39c4c32bdc35681"; - String contractAddr = "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6"; - String code = "60016103c020600055"; - - byte[] contractAddrB = Hex.decode(contractAddr); - byte[] callerAddrB = Hex.decode(callerAddr); - byte[] codeB = Hex.decode(code); - - byte[] codeKey = HashUtil.sha3(codeB); - AccountState accountState = new AccountState(); - accountState.setCodeHash(codeKey); - - ProgramInvokeMockImpl pi = new ProgramInvokeMockImpl(); - pi.setOwnerAddress(contractAddrB); - Repository repository = pi.getRepository(); - - repository.createAccount(callerAddrB); - repository.addBalance(callerAddrB, new BigInteger("115792089237316195423570985008687907853269984665640564039457584007913129639935")); - - repository.createAccount(contractAddrB); - repository.saveCode(contractAddrB, codeB); - repository.addStorageRow(contractAddrB, key1, value1); - - // Play the program - VM vm = new VM(); - Program program = new Program(codeB, pi); - - try { - while (!program.isStopped()) - vm.step(program); - } catch (RuntimeException e) { - program.setRuntimeFailure(e); - } - - System.out.println(); - System.out.println("============ Results ============"); - - BigInteger balance = repository.getBalance(callerAddrB); - - System.out.println("*** Used gas: " + program.getResult().getGasUsed()); - System.out.println("*** Contract Balance: " + balance); - - // todo: assert caller balance after contract exec - - repository.close(); - assertEquals(expectedGas, program.getResult().getGasUsed()); - } - - //sha3_memSizeQuadraticCost32 - @Test // contract call quadratic memory use - public void test9() { - - int expectedGas = 356; - - DataWord key1 = new DataWord(9999); - DataWord value1 = new DataWord(3); - - // Set contract into Database - String callerAddr = "cd1722f3947def4cf144679da39c4c32bdc35681"; - String contractAddr = "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6"; - String code = "60016103e020600055"; - - byte[] contractAddrB = Hex.decode(contractAddr); - byte[] callerAddrB = Hex.decode(callerAddr); - byte[] codeB = Hex.decode(code); - - byte[] codeKey = HashUtil.sha3(codeB); - AccountState accountState = new AccountState(); - accountState.setCodeHash(codeKey); - - ProgramInvokeMockImpl pi = new ProgramInvokeMockImpl(); - pi.setOwnerAddress(contractAddrB); - Repository repository = pi.getRepository(); - - repository.createAccount(callerAddrB); - repository.addBalance(callerAddrB, new BigInteger("115792089237316195423570985008687907853269984665640564039457584007913129639935")); - - repository.createAccount(contractAddrB); - repository.saveCode(contractAddrB, codeB); - repository.addStorageRow(contractAddrB, key1, value1); - - // Play the program - VM vm = new VM(); - Program program = new Program(codeB, pi); - - try { - while (!program.isStopped()) - vm.step(program); - } catch (RuntimeException e) { - program.setRuntimeFailure(e); - } - - System.out.println(); - System.out.println("============ Results ============"); - - BigInteger balance = repository.getBalance(callerAddrB); - - System.out.println("*** Used gas: " + program.getResult().getGasUsed()); - System.out.println("*** Contract Balance: " + balance); - - // todo: assert caller balance after contract exec - - repository.close(); - assertEquals(expectedGas, program.getResult().getGasUsed()); - } - - //sha3_memSizeQuadraticCost32_zeroSize - @Test // contract call quadratic memory use - public void test10() { - - int expectedGas = 313; - - DataWord key1 = new DataWord(999); - DataWord value1 = new DataWord(3); - - // Set contract into Database - String callerAddr = "cd1722f3947def4cf144679da39c4c32bdc35681"; - String contractAddr = "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6"; - String code = "600061040020600055"; - - byte[] contractAddrB = Hex.decode(contractAddr); - byte[] callerAddrB = Hex.decode(callerAddr); - byte[] codeB = Hex.decode(code); - - byte[] codeKey = HashUtil.sha3(codeB); - AccountState accountState = new AccountState(); - accountState.setCodeHash(codeKey); - - ProgramInvokeMockImpl pi = new ProgramInvokeMockImpl(); - pi.setOwnerAddress(contractAddrB); - Repository repository = pi.getRepository(); - - repository.createAccount(callerAddrB); - repository.addBalance(callerAddrB, new BigInteger("115792089237316195423570985008687907853269984665640564039457584007913129639935")); - - repository.createAccount(contractAddrB); - repository.saveCode(contractAddrB, codeB); - repository.addStorageRow(contractAddrB, key1, value1); - - // Play the program - VM vm = new VM(); - Program program = new Program(codeB, pi); - - try { - while (!program.isStopped()) - vm.step(program); - } catch (RuntimeException e) { - program.setRuntimeFailure(e); - } - - System.out.println(); - System.out.println("============ Results ============"); - - BigInteger balance = repository.getBalance(callerAddrB); - - System.out.println("*** Used gas: " + program.getResult().getGasUsed()); - System.out.println("*** Contract Balance: " + balance); - - // todo: assert caller balance after contract exec - - repository.close(); - assertEquals(expectedGas, program.getResult().getGasUsed()); - } -} diff --git a/ethereumj-core/src/test/java/test/ethereum/vm/VMCustomTest.java b/ethereumj-core/src/test/java/test/ethereum/vm/VMCustomTest.java deleted file mode 100644 index c1b29c97..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/vm/VMCustomTest.java +++ /dev/null @@ -1,566 +0,0 @@ -package test.ethereum.vm; - -import org.ethereum.vm.DataWord; -import org.ethereum.vm.Program; -import org.ethereum.vm.Program.OutOfGasException; -import org.ethereum.vm.Program.StackTooSmallException; -import org.ethereum.vm.ProgramInvokeMockImpl; -import org.ethereum.vm.VM; - -import org.junit.After; -import org.junit.Before; -import org.junit.FixMethodOrder; -import org.junit.Test; -import org.junit.runners.MethodSorters; - -import org.spongycastle.util.encoders.Hex; - -import java.math.BigInteger; - -import static org.junit.Assert.*; - -/** - * @author Roman Mandeleil - * @since 01.06.2014 - */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class VMCustomTest { - - private ProgramInvokeMockImpl invoke; - private Program program; - - @Before - public void setup() { - byte[] ownerAddress = Hex.decode("77045E71A7A2C50903D88E564CD72FAB11E82051"); - byte[] msgData = Hex.decode("00000000000000000000000000000000000000000000000000000000000000A1" + - "00000000000000000000000000000000000000000000000000000000000000B1"); - - invoke = new ProgramInvokeMockImpl(msgData); - invoke.setOwnerAddress(ownerAddress); - - invoke.getRepository().createAccount(ownerAddress); - invoke.getRepository().addBalance(ownerAddress, BigInteger.valueOf(1000L)); - } - - @After - public void tearDown() { - invoke.getRepository().close(); - } - - @Test // CALLDATASIZE OP - public void testCALLDATASIZE_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("36"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000040"; - - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - - @Test // CALLDATALOAD OP - public void testCALLDATALOAD_1() { - - VM vm = new VM(); - program = - new Program(Hex.decode("600035"), invoke); - String s_expected_1 = "00000000000000000000000000000000000000000000000000000000000000A1"; - - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // CALLDATALOAD OP - public void testCALLDATALOAD_2() { - - VM vm = new VM(); - program = - new Program(Hex.decode("600235"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000A10000"; - - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - - @Test // CALLDATALOAD OP - public void testCALLDATALOAD_3() { - - VM vm = new VM(); - program = - new Program(Hex.decode("602035"), invoke); - String s_expected_1 = "00000000000000000000000000000000000000000000000000000000000000B1"; - - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - - @Test // CALLDATALOAD OP - public void testCALLDATALOAD_4() { - - VM vm = new VM(); - program = - new Program(Hex.decode("602335"), invoke); - String s_expected_1 = "00000000000000000000000000000000000000000000000000000000B1000000"; - - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // CALLDATALOAD OP - public void testCALLDATALOAD_5() { - - VM vm = new VM(); - program = - new Program(Hex.decode("603F35"), invoke); - String s_expected_1 = "B100000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test(expected = RuntimeException.class) // CALLDATALOAD OP mal - public void testCALLDATALOAD_6() { - - VM vm = new VM(); - program = - new Program(Hex.decode("35"), invoke); - try { - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // CALLDATACOPY OP - public void testCALLDATACOPY_1() { - - VM vm = new VM(); - program = - new Program(Hex.decode("60206000600037"), invoke); - String m_expected = "00000000000000000000000000000000000000000000000000000000000000A1"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(m_expected, Hex.toHexString(program.getMemory().array()).toUpperCase()); - } - - @Test // CALLDATACOPY OP - public void testCALLDATACOPY_2() { - - VM vm = new VM(); - program = - new Program(Hex.decode("60406000600037"), invoke); - String m_expected = "00000000000000000000000000000000000000000000000000000000000000A1" + - "00000000000000000000000000000000000000000000000000000000000000B1"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(m_expected, Hex.toHexString(program.getMemory().array()).toUpperCase()); - } - - - @Test // CALLDATACOPY OP - public void testCALLDATACOPY_3() { - - VM vm = new VM(); - program = - new Program(Hex.decode("60406004600037"), invoke); - String m_expected = "000000000000000000000000000000000000000000000000000000A100000000" + - "000000000000000000000000000000000000000000000000000000B100000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(m_expected, Hex.toHexString(program.getMemory().array()).toUpperCase()); - } - - - @Test // CALLDATACOPY OP - public void testCALLDATACOPY_4() { - - VM vm = new VM(); - program = - new Program(Hex.decode("60406000600437"), invoke); - String m_expected = "0000000000000000000000000000000000000000000000000000000000000000" + - "000000A100000000000000000000000000000000000000000000000000000000" + - "000000B100000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(m_expected, Hex.toHexString(program.getMemory().array()).toUpperCase()); - } - - @Test // CALLDATACOPY OP - public void testCALLDATACOPY_5() { - - VM vm = new VM(); - program = - new Program(Hex.decode("60406000600437"), invoke); - String m_expected = "0000000000000000000000000000000000000000000000000000000000000000" + - "000000A100000000000000000000000000000000000000000000000000000000" + - "000000B100000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(m_expected, Hex.toHexString(program.getMemory().array()).toUpperCase()); - } - - - @Test(expected = StackTooSmallException.class) // CALLDATACOPY OP mal - public void testCALLDATACOPY_6() { - - VM vm = new VM(); - program = - new Program(Hex.decode("6040600037"), invoke); - - try { - vm.step(program); - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test(expected = OutOfGasException.class) // CALLDATACOPY OP mal - public void testCALLDATACOPY_7() { - - VM vm = new VM(); - program = - new Program(Hex.decode("6020600073CC0929EB16730E7C14FEFC63006AC2D794C5795637"), invoke); - - try { - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // ADDRESS OP - public void testADDRESS_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("30"), invoke); - String s_expected_1 = "00000000000000000000000077045E71A7A2C50903D88E564CD72FAB11E82051"; - - vm.step(program); - - DataWord item1 = program.stackPop(); - program.getResult().getRepository().close(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // BALANCE OP - public void testBALANCE_1() { - - VM vm = new VM(); - program = - new Program(Hex.decode("3031"), invoke); - String s_expected_1 = "00000000000000000000000000000000000000000000000000000000000003E8"; - - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // ORIGIN OP - public void testORIGIN_1() { - - VM vm = new VM(); - program = - new Program(Hex.decode("32"), invoke); - String s_expected_1 = "00000000000000000000000013978AEE95F38490E9769C39B2773ED763D9CD5F"; - - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // CALLER OP - public void testCALLER_1() { - - VM vm = new VM(); - program = - new Program(Hex.decode("33"), invoke); - String s_expected_1 = "000000000000000000000000885F93EED577F2FC341EBB9A5C9B2CE4465D96C4"; - - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // CALLVALUE OP - public void testCALLVALUE_1() { - - VM vm = new VM(); - program = - new Program(Hex.decode("34"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000DE0B6B3A7640000"; - - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // SHA3 OP - public void testSHA3_1() { - - VM vm = new VM(); - program = - new Program(Hex.decode("60016000536001600020"), invoke); - String s_expected_1 = "5FE7F977E71DBA2EA1A68E21057BEEBB9BE2AC30C6410AA38D4F3FBE41DCFFD2"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // SHA3 OP - public void testSHA3_2() { - - VM vm = new VM(); - program = - new Program(Hex.decode("6102016000526002601E20"), invoke); - String s_expected_1 = "114A3FE82A0219FCC31ABD15617966A125F12B0FD3409105FC83B487A9D82DE4"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // SHA3 OP mal - public void testSHA3_3() { - - VM vm = new VM(); - program = - new Program(Hex.decode("610201600052600220"), invoke); - try { - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // BLOCKHASH OP - public void testBLOCKHASH_1() { - - VM vm = new VM(); - program = - new Program(Hex.decode("600140"), invoke); - String s_expected_1 = "C89EFDAA54C0F20C7ADF612882DF0950F5A951637E0307CDCB4C672F298B8BC6"; - - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // COINBASE OP - public void testCOINBASE_1() { - - VM vm = new VM(); - program = - new Program(Hex.decode("41"), invoke); - String s_expected_1 = "000000000000000000000000E559DE5527492BCB42EC68D07DF0742A98EC3F1E"; - - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // TIMESTAMP OP - public void testTIMESTAMP_1() { - - VM vm = new VM(); - program = - new Program(Hex.decode("42"), invoke); - String s_expected_1 = "000000000000000000000000000000000000000000000000000000005387FE24"; - - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // NUMBER OP - public void testNUMBER_1() { - - VM vm = new VM(); - program = - new Program(Hex.decode("43"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000021"; - - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // DIFFICULTY OP - public void testDIFFICULTY_1() { - - VM vm = new VM(); - program = - new Program(Hex.decode("44"), invoke); - String s_expected_1 = "00000000000000000000000000000000000000000000000000000000003ED290"; - - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // GASPRICE OP - public void testGASPRICE_1() { - - VM vm = new VM(); - program = - new Program(Hex.decode("3A"), invoke); - String s_expected_1 = "000000000000000000000000000000000000000000000000000009184E72A000"; - - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // GAS OP - public void testGAS_1() { - - VM vm = new VM(); - program = - new Program(Hex.decode("5A"), invoke); - String s_expected_1 = "00000000000000000000000000000000000000000000000000000000000F423F"; - - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // GASLIMIT OP - public void testGASLIMIT_1() { - - VM vm = new VM(); - program = - new Program(Hex.decode("45"), invoke); - String s_expected_1 = "00000000000000000000000000000000000000000000000000000000000F4240"; - - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test(expected = Program.IllegalOperationException.class) // INVALID OP - public void testINVALID_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("60012F6002"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000001"; - - try { - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - } - - /* TEST CASE LIST END */ - -} - -// TODO: add gas expeted and calculated to all test cases -// TODO: considering: G_TXDATA + G_TRANSACTION - -/** - * TODO: - * - * 22) CREATE: - * 23) CALL: - * - * - **/ - -/** - - contract creation (gas usage) - ----------------------------- - G_TRANSACTION = (500) - 60016000546006601160003960066000f261778e600054 (115) - PUSH1 6001 (1) - PUSH1 6000 (1) - MSTORE 54 (1 + 1) - PUSH1 6006 (1) - PUSH1 6011 (1) - PUSH1 6000 (1) - CODECOPY 39 (1) - PUSH1 6006 (1) - PUSH1 6000 (1) - RETURN f2 (1) - 61778e600054 - - */ diff --git a/ethereumj-core/src/test/java/test/ethereum/vm/VMTest.java b/ethereumj-core/src/test/java/test/ethereum/vm/VMTest.java deleted file mode 100644 index 82f9de54..00000000 --- a/ethereumj-core/src/test/java/test/ethereum/vm/VMTest.java +++ /dev/null @@ -1,2899 +0,0 @@ -package test.ethereum.vm; - -import org.ethereum.facade.Repository; -import org.ethereum.util.ByteUtil; -import org.ethereum.vm.DataWord; -import org.ethereum.vm.LogInfo; -import org.ethereum.vm.OpCode; -import org.ethereum.vm.Program; -import org.ethereum.vm.Program.BadJumpDestinationException; -import org.ethereum.vm.Program.StackTooSmallException; -import org.ethereum.vm.ProgramInvokeMockImpl; -import org.ethereum.vm.VM; - -import org.junit.After; -import org.junit.Before; -import org.junit.FixMethodOrder; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runners.MethodSorters; - -import org.spongycastle.util.encoders.Hex; - -import java.util.List; - -import static org.junit.Assert.*; - -/** - * @author Roman Mandeleil - * @since 01.06.2014 - */ -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class VMTest { - - private ProgramInvokeMockImpl invoke; - private Program program; - - @Before - public void setup() { - invoke = new ProgramInvokeMockImpl(); - } - - @After - public void tearDown() { - invoke.getRepository().close(); - } - - @Test // PUSH1 OP - public void testPUSH1() { - - VM vm = new VM(); - program = new Program(Hex.decode("60A0"), invoke); - String expected = "00000000000000000000000000000000000000000000000000000000000000A0"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH2 OP - public void testPUSH2() { - - VM vm = new VM(); - program = new Program(Hex.decode("61A0B0"), invoke); - String expected = "000000000000000000000000000000000000000000000000000000000000A0B0"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH3 OP - public void testPUSH3() { - - VM vm = new VM(); - program = new Program(Hex.decode("62A0B0C0"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000A0B0C0"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH4 OP - public void testPUSH4() { - - VM vm = new VM(); - program = new Program(Hex.decode("63A0B0C0D0"), invoke); - String expected = "00000000000000000000000000000000000000000000000000000000A0B0C0D0"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH5 OP - public void testPUSH5() { - - VM vm = new VM(); - program = new Program(Hex.decode("64A0B0C0D0E0"), invoke); - String expected = "000000000000000000000000000000000000000000000000000000A0B0C0D0E0"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH6 OP - public void testPUSH6() { - - VM vm = new VM(); - program = new Program(Hex.decode("65A0B0C0D0E0F0"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000A0B0C0D0E0F0"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH7 OP - public void testPUSH7() { - - VM vm = new VM(); - program = new Program(Hex.decode("66A0B0C0D0E0F0A1"), invoke); - String expected = "00000000000000000000000000000000000000000000000000A0B0C0D0E0F0A1"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH8 OP - public void testPUSH8() { - - VM vm = new VM(); - program = new Program(Hex.decode("67A0B0C0D0E0F0A1B1"), invoke); - String expected = "000000000000000000000000000000000000000000000000A0B0C0D0E0F0A1B1"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH9 OP - public void testPUSH9() { - - VM vm = new VM(); - program = new Program(Hex.decode("68A0B0C0D0E0F0A1B1C1"), invoke); - String expected = "0000000000000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - - @Test // PUSH10 OP - public void testPUSH10() { - - VM vm = new VM(); - program = new Program(Hex.decode("69A0B0C0D0E0F0A1B1C1D1"), invoke); - String expected = "00000000000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH11 OP - public void testPUSH11() { - - VM vm = new VM(); - program = new Program(Hex.decode("6AA0B0C0D0E0F0A1B1C1D1E1"), invoke); - String expected = "000000000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH12 OP - public void testPUSH12() { - - VM vm = new VM(); - program = new Program(Hex.decode("6BA0B0C0D0E0F0A1B1C1D1E1F1"), invoke); - String expected = "0000000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH13 OP - public void testPUSH13() { - - VM vm = new VM(); - program = new Program(Hex.decode("6CA0B0C0D0E0F0A1B1C1D1E1F1A2"), invoke); - String expected = "00000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH14 OP - public void testPUSH14() { - - VM vm = new VM(); - program = new Program(Hex.decode("6DA0B0C0D0E0F0A1B1C1D1E1F1A2B2"), invoke); - String expected = "000000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH15 OP - public void testPUSH15() { - - VM vm = new VM(); - program = new Program(Hex.decode("6EA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2"), invoke); - String expected = "0000000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH16 OP - public void testPUSH16() { - - VM vm = new VM(); - program = new Program(Hex.decode("6FA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2"), invoke); - String expected = "00000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH17 OP - public void testPUSH17() { - - VM vm = new VM(); - program = new Program(Hex.decode("70A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2"), invoke); - String expected = "000000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH18 OP - public void testPUSH18() { - - VM vm = new VM(); - program = new Program(Hex.decode("71A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2"), invoke); - String expected = "0000000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH19 OP - public void testPUSH19() { - - VM vm = new VM(); - program = new Program(Hex.decode("72A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3"), invoke); - String expected = "00000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH20 OP - public void testPUSH20() { - - VM vm = new VM(); - program = new Program(Hex.decode("73A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3"), invoke); - String expected = "000000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH21 OP - public void testPUSH21() { - - VM vm = new VM(); - program = new Program(Hex.decode("74A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3"), invoke); - String expected = "0000000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH22 OP - public void testPUSH22() { - - VM vm = new VM(); - program = new Program(Hex.decode("75A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3"), invoke); - String expected = "00000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH23 OP - public void testPUSH23() { - - VM vm = new VM(); - program = new Program(Hex.decode("76A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3"), invoke); - String expected = "000000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH24 OP - public void testPUSH24() { - - VM vm = new VM(); - program = new Program(Hex.decode("77A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3"), invoke); - String expected = "0000000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH25 OP - public void testPUSH25() { - - VM vm = new VM(); - program = new Program(Hex.decode("78A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4"), invoke); - String expected = "00000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH26 OP - public void testPUSH26() { - - VM vm = new VM(); - program = new Program(Hex.decode("79A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4"), invoke); - String expected = "000000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH27 OP - public void testPUSH27() { - - VM vm = new VM(); - program = new Program(Hex.decode("7AA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4"), invoke); - String expected = "0000000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH28 OP - public void testPUSH28() { - - VM vm = new VM(); - program = new Program(Hex.decode("7BA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4"), invoke); - String expected = "00000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH29 OP - public void testPUSH29() { - - VM vm = new VM(); - program = new Program(Hex.decode("7CA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4"), invoke); - String expected = "000000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH30 OP - public void testPUSH30() { - - VM vm = new VM(); - program = new Program(Hex.decode("7DA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4"), invoke); - String expected = "0000A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH31 OP - public void testPUSH31() { - - VM vm = new VM(); - program = new Program(Hex.decode("7EA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1"), invoke); - String expected = "00A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSH32 OP - public void testPUSH32() { - - VM vm = new VM(); - program = new Program(Hex.decode("7FA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B1"), invoke); - String expected = "A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B1"; - - program.fullTrace(); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSHN OP not enough data - public void testPUSHN_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("61AA"), invoke); - String expected = "000000000000000000000000000000000000000000000000000000000000AA00"; - - program.fullTrace(); - vm.step(program); - - assertTrue(program.isStopped()); - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // PUSHN OP not enough data - public void testPUSHN_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("7fAABB"), invoke); - String expected = "AABB000000000000000000000000000000000000000000000000000000000000"; - - program.fullTrace(); - vm.step(program); - - assertTrue(program.isStopped()); - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // AND OP - public void testAND_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("600A600A16"), invoke); - String expected = "000000000000000000000000000000000000000000000000000000000000000A"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // AND OP - public void testAND_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("60C0600A16"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test(expected = RuntimeException.class) // AND OP mal data - public void testAND_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("60C016"), invoke); - try { - vm.step(program); - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // OR OP - public void testOR_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("60F0600F17"), invoke); - String expected = "00000000000000000000000000000000000000000000000000000000000000FF"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // OR OP - public void testOR_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("60C3603C17"), invoke); - String expected = "00000000000000000000000000000000000000000000000000000000000000FF"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test(expected = RuntimeException.class) // OR OP mal data - public void testOR_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("60C017"), invoke); - try { - vm.step(program); - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // XOR OP - public void testXOR_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("60FF60FF18"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // XOR OP - public void testXOR_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("600F60F018"), invoke); - String expected = "00000000000000000000000000000000000000000000000000000000000000FF"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - - @Test(expected = RuntimeException.class) // XOR OP mal data - public void testXOR_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("60C018"), invoke); - try { - vm.step(program); - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // BYTE OP - public void testBYTE_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("65AABBCCDDEEFF601E1A"), invoke); - String expected = "00000000000000000000000000000000000000000000000000000000000000EE"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // BYTE OP - public void testBYTE_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("65AABBCCDDEEFF60201A"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // BYTE OP - public void testBYTE_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("65AABBCCDDEE3A601F1A"), invoke); - String expected = "000000000000000000000000000000000000000000000000000000000000003A"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - - @Test(expected = StackTooSmallException.class) // BYTE OP mal data - public void testBYTE_4() { - - VM vm = new VM(); - program = new Program(Hex.decode("65AABBCCDDEE3A1A"), invoke); - try { - vm.step(program); - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // ISZERO OP - public void testISZERO_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("600015"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000000001"; - - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // ISZERO OP - public void testISZERO_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("602A15"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // ISZERO OP mal data - public void testISZERO_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("15"), invoke); - try { - vm.step(program); - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // EQ OP - public void testEQ_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("602A602A14"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000000001"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // EQ OP - public void testEQ_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("622A3B4C622A3B4C14"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000000001"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // EQ OP - public void testEQ_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("622A3B5C622A3B4C14"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // EQ OP mal data - public void testEQ_4() { - - VM vm = new VM(); - program = new Program(Hex.decode("622A3B4C14"), invoke); - try { - vm.step(program); - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // GT OP - public void testGT_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("6001600211"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000000001"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // GT OP - public void testGT_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("6001610F0011"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000000001"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // GT OP - public void testGT_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("6301020304610F0011"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // GT OP mal data - public void testGT_4() { - - VM vm = new VM(); - program = new Program(Hex.decode("622A3B4C11"), invoke); - try { - vm.step(program); - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // SGT OP - public void testSGT_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("6001600213"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000000001"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // SGT OP - public void testSGT_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("7F000000000000000000000000000000000000000000000000000000000000001E" + // 30 - "7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" + // -170 - "13"), invoke); - - String expected = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // SGT OP - public void testSGT_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" + // -170 - "7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57" + // -169 - "13"), invoke); - - String expected = "0000000000000000000000000000000000000000000000000000000000000001"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // SGT OP mal - public void testSGT_4() { - - VM vm = new VM(); - program = new Program(Hex.decode("7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" + // -170 - "13"), invoke); - try { - vm.step(program); - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // LT OP - public void testLT_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("6001600210"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // LT OP - public void testLT_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("6001610F0010"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // LT OP - public void testLT_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("6301020304610F0010"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000000001"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // LT OP mal data - public void testLT_4() { - - VM vm = new VM(); - program = new Program(Hex.decode("622A3B4C10"), invoke); - try { - vm.step(program); - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // SLT OP - public void testSLT_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("6001600212"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // SLT OP - public void testSLT_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("7F000000000000000000000000000000000000000000000000000000000000001E" + // 30 - "7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" + // -170 - "12"), invoke); - - String expected = "0000000000000000000000000000000000000000000000000000000000000001"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // SLT OP - public void testSLT_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" + // -170 - "7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF57" + // -169 - "12"), invoke); - - String expected = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // SLT OP mal - public void testSLT_4() { - - VM vm = new VM(); - program = new Program(Hex.decode("7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" + // -170 - "12"), invoke); - try { - vm.step(program); - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // NOT OP - public void testNOT_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("600119"), invoke); - String expected = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE"; - - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // NOT OP - public void testNOT_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("61A00319"), invoke); - String expected = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5FFC"; - - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // NOT OP - public void testNOT_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("61000019"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // BNOT OP - public void testBNOT_4() { - - VM vm = new VM(); - program = new Program(Hex.decode("1a"), invoke); - try { - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // POP OP - public void testPOP_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("61000060016200000250"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000000001"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // POP OP - public void testPOP_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("6100006001620000025050"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // POP OP mal data - public void testPOP_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("61000060016200000250505050"), invoke); - try { - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // DUP1...DUP16 OP - public void testDUPS() { - for (int i = 1; i < 17; i++) { - testDUPN_1(i); - } - } - - /** - * Generic test function for DUP1-16 - * - * @param n in DUPn - */ - private void testDUPN_1(int n) { - - VM vm = new VM(); - byte operation = (byte) (OpCode.DUP1.val() + n - 1); - String programCode = ""; - for (int i = 0; i < n; i++) { - programCode += "60" + (12 + i); - } - program = new Program(ByteUtil.appendByte(Hex.decode(programCode.getBytes()), operation), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000000012"; - int expectedLen = n + 1; - - for (int i = 0; i < expectedLen; i++) { - vm.step(program); - } - - assertEquals(expectedLen, program.getStack().toArray().length); - assertEquals(expected, Hex.toHexString(program.stackPop().getData()).toUpperCase()); - for (int i = 0; i < expectedLen - 2; i++) { - assertNotEquals(expected, Hex.toHexString(program.stackPop().getData()).toUpperCase()); - } - assertEquals(expected, Hex.toHexString(program.stackPop().getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // DUPN OP mal data - public void testDUPN_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("80"), invoke); - try { - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // SWAP1...SWAP16 OP - public void testSWAPS() { - for (int i = 1; i < 17; i++) { - testSWAPN_1(i); - } - } - - /** - * Generic test function for SWAP1-16 - * - * @param n in SWAPn - */ - private void testSWAPN_1(int n) { - - VM vm = new VM(); - byte operation = (byte) (OpCode.SWAP1.val() + n - 1); - String[] expected = new String[n + 1]; - String programCode = ""; - for (int i = 0; i < expected.length; i++) { - programCode += "60" + (11 + i); - expected[i] = "00000000000000000000000000000000000000000000000000000000000000" + (11 + i); - } - program = new Program(ByteUtil.appendByte(Hex.decode(programCode), operation), invoke); - - for (int i = 0; i <= expected.length; i++) { - vm.step(program); - } - - assertEquals(expected.length, program.getStack().toArray().length); - assertEquals(expected[0], Hex.toHexString(program.stackPop().getData()).toUpperCase()); - for (int i = expected.length - 2; i > 0; i--) { - assertEquals(expected[i], Hex.toHexString(program.stackPop().getData()).toUpperCase()); - } - assertEquals(expected[expected.length - 1], Hex.toHexString(program.stackPop().getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // SWAPN OP mal data - public void testSWAPN_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("90"), invoke); - - try { - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // MSTORE OP - public void testMSTORE_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("611234600052"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000001234"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getMemory().array())); - } - - - @Test // LOG0 OP - public void tesLog0() { - - VM vm = new VM(); - program = new Program(Hex.decode("61123460005260206000A0"), invoke); - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - List logInfoList = program.getResult().getLogInfoList(); - LogInfo logInfo = logInfoList.get(0); - - assertEquals("cd2a3d9f938e13cd947ec05abc7fe734df8dd826", Hex.toHexString(logInfo.getAddress())); - assertEquals(0, logInfo.getTopics().size()); - assertEquals("0000000000000000000000000000000000000000000000000000000000001234", Hex.toHexString(logInfo - .getData())); - } - - @Test // LOG1 OP - public void tesLog1() { - - VM vm = new VM(); - program = new Program(Hex.decode("61123460005261999960206000A1"), invoke); - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - List logInfoList = program.getResult().getLogInfoList(); - LogInfo logInfo = logInfoList.get(0); - - assertEquals("cd2a3d9f938e13cd947ec05abc7fe734df8dd826", Hex.toHexString(logInfo.getAddress())); - assertEquals(1, logInfo.getTopics().size()); - assertEquals("0000000000000000000000000000000000000000000000000000000000001234", Hex.toHexString(logInfo - .getData())); - } - - @Test // LOG2 OP - public void tesLog2() { - - VM vm = new VM(); - program = new Program(Hex.decode("61123460005261999961666660206000A2"), invoke); - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - List logInfoList = program.getResult().getLogInfoList(); - LogInfo logInfo = logInfoList.get(0); - - assertEquals("cd2a3d9f938e13cd947ec05abc7fe734df8dd826", Hex.toHexString(logInfo.getAddress())); - assertEquals(2, logInfo.getTopics().size()); - assertEquals("0000000000000000000000000000000000000000000000000000000000001234", Hex.toHexString(logInfo - .getData())); - } - - @Test // LOG3 OP - public void tesLog3() { - - VM vm = new VM(); - program = new Program(Hex.decode("61123460005261999961666661333360206000A3"), invoke); - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - List logInfoList = program.getResult().getLogInfoList(); - LogInfo logInfo = logInfoList.get(0); - - assertEquals("cd2a3d9f938e13cd947ec05abc7fe734df8dd826", Hex.toHexString(logInfo.getAddress())); - assertEquals(3, logInfo.getTopics().size()); - assertEquals("0000000000000000000000000000000000000000000000000000000000001234", Hex.toHexString(logInfo - .getData())); - } - - - @Test // LOG4 OP - public void tesLog4() { - - VM vm = new VM(); - program = new Program(Hex.decode("61123460005261999961666661333361555560206000A4"), invoke); - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - List logInfoList = program.getResult().getLogInfoList(); - LogInfo logInfo = logInfoList.get(0); - - assertEquals("cd2a3d9f938e13cd947ec05abc7fe734df8dd826", Hex.toHexString(logInfo.getAddress())); - assertEquals(4, logInfo.getTopics().size()); - assertEquals("0000000000000000000000000000000000000000000000000000000000001234", Hex.toHexString(logInfo - .getData())); - } - - - @Test // MSTORE OP - public void testMSTORE_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("611234600052615566602052"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000001234" + - "0000000000000000000000000000000000000000000000000000000000005566"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getMemory().array())); - } - - @Test // MSTORE OP - public void testMSTORE_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("611234600052615566602052618888600052"), invoke); - String expected = "0000000000000000000000000000000000000000000000000000000000008888" + - "0000000000000000000000000000000000000000000000000000000000005566"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getMemory().array())); - } - - @Test // MSTORE OP - public void testMSTORE_4() { - - VM vm = new VM(); - program = new Program(Hex.decode("61123460A052"), invoke); - String expected = "" + - "0000000000000000000000000000000000000000000000000000000000000000" + - "0000000000000000000000000000000000000000000000000000000000000000" + - "0000000000000000000000000000000000000000000000000000000000000000" + - "0000000000000000000000000000000000000000000000000000000000000000" + - "0000000000000000000000000000000000000000000000000000000000000000" + - "0000000000000000000000000000000000000000000000000000000000001234"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(expected, Hex.toHexString(program.getMemory().array())); - } - - @Test(expected = StackTooSmallException.class) // MSTORE OP - public void testMSTORE_5() { - - VM vm = new VM(); - program = new Program(Hex.decode("61123452"), invoke); - try { - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // MLOAD OP - public void testMLOAD_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("600051"), invoke); - String m_expected = "0000000000000000000000000000000000000000000000000000000000000000"; - String s_expected = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - - assertEquals(m_expected, Hex.toHexString(program.getMemory().array())); - assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // MLOAD OP - public void testMLOAD_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("602251"), invoke); - String m_expected = "0000000000000000000000000000000000000000000000000000000000000000" + - "0000000000000000000000000000000000000000000000000000000000000000" + - "0000000000000000000000000000000000000000000000000000000000000000"; - String s_expected = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - - assertEquals(m_expected, Hex.toHexString(program.getMemory().array()).toUpperCase()); - assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - - @Test // MLOAD OP - public void testMLOAD_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("602051"), invoke); - String m_expected = "0000000000000000000000000000000000000000000000000000000000000000" + - "0000000000000000000000000000000000000000000000000000000000000000"; - String s_expected = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - - assertEquals(m_expected, Hex.toHexString(program.getMemory().array())); - assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // MLOAD OP - public void testMLOAD_4() { - - VM vm = new VM(); - program = new Program(Hex.decode("611234602052602051"), invoke); - String m_expected = "0000000000000000000000000000000000000000000000000000000000000000" + - "0000000000000000000000000000000000000000000000000000000000001234"; - String s_expected = "0000000000000000000000000000000000000000000000000000000000001234"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(m_expected, Hex.toHexString(program.getMemory().array())); - assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // MLOAD OP - public void testMLOAD_5() { - - VM vm = new VM(); - program = new Program(Hex.decode("611234602052601F51"), invoke); - String m_expected = "0000000000000000000000000000000000000000000000000000000000000000" + - "0000000000000000000000000000000000000000000000000000000000001234"; - String s_expected = "0000000000000000000000000000000000000000000000000000000000000012"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(m_expected, Hex.toHexString(program.getMemory().array())); - assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // MLOAD OP mal data - public void testMLOAD_6() { - - VM vm = new VM(); - program = new Program(Hex.decode("51"), invoke); - try { - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // MSTORE8 OP - public void testMSTORE8_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("6011600053"), invoke); - String m_expected = "1100000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(m_expected, Hex.toHexString(program.getMemory().array())); - } - - - @Test // MSTORE8 OP - public void testMSTORE8_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("6022600153"), invoke); - String m_expected = "0022000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(m_expected, Hex.toHexString(program.getMemory().array())); - } - - @Test // MSTORE8 OP - public void testMSTORE8_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("6022602153"), invoke); - String m_expected = "0000000000000000000000000000000000000000000000000000000000000000" + - "0022000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(m_expected, Hex.toHexString(program.getMemory().array())); - } - - @Test(expected = StackTooSmallException.class) // MSTORE8 OP mal - public void testMSTORE8_4() { - - VM vm = new VM(); - program = new Program(Hex.decode("602253"), invoke); - try { - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // SSTORE OP - public void testSSTORE_1() { - - VM vm = new VM(); - - program = new Program(Hex.decode("602260AA55"), invoke); - String s_expected_key = "00000000000000000000000000000000000000000000000000000000000000AA"; - String s_expected_val = "0000000000000000000000000000000000000000000000000000000000000022"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord key = new DataWord(Hex.decode(s_expected_key)); - DataWord val = program.getResult().getRepository().getStorageValue(invoke.getOwnerAddress() - .getNoLeadZeroesData(), key); - - assertEquals(s_expected_val, Hex.toHexString(val.getData()).toUpperCase()); - } - - @Test // SSTORE OP - public void testSSTORE_2() { - - VM vm = new VM(); - - program = new Program(Hex.decode("602260AA55602260BB55"), invoke); - String s_expected_key = "00000000000000000000000000000000000000000000000000000000000000BB"; - String s_expected_val = "0000000000000000000000000000000000000000000000000000000000000022"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - Repository repository = program.getResult().getRepository(); - DataWord key = new DataWord(Hex.decode(s_expected_key)); - DataWord val = repository.getStorageValue(invoke.getOwnerAddress().getNoLeadZeroesData(), key); - - assertEquals(s_expected_val, Hex.toHexString(val.getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // SSTORE OP - public void testSSTORE_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("602255"), invoke); - try { - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // SLOAD OP - public void testSLOAD_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("60AA54"), invoke); - String s_expected = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - - assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // SLOAD OP - public void testSLOAD_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("602260AA5560AA54"), invoke); - String s_expected = "0000000000000000000000000000000000000000000000000000000000000022"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test // SLOAD OP - public void testSLOAD_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("602260AA55603360CC5560CC54"), invoke); - String s_expected = "0000000000000000000000000000000000000000000000000000000000000033"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // SLOAD OP - public void testSLOAD_4() { - - VM vm = new VM(); - program = new Program(Hex.decode("56"), invoke); - try { - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // PC OP - public void testPC_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("58"), invoke); - String s_expected = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - - assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - - @Test // PC OP - public void testPC_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("602260AA5260AA5458"), invoke); - String s_expected = "0000000000000000000000000000000000000000000000000000000000000008"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test(expected = BadJumpDestinationException.class) // JUMP OP mal data - public void testJUMP_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("60AA60BB600E5660CC60DD60EE5B60FF"), invoke); - String s_expected = "00000000000000000000000000000000000000000000000000000000000000FF"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - @Test(expected = BadJumpDestinationException.class) // JUMP OP mal data - public void testJUMP_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("600C600C905660CC60DD60EE60FF"), invoke); - try { - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // JUMPI OP - public void testJUMPI_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("60016005575B60CC"), invoke); - String s_expected = "00000000000000000000000000000000000000000000000000000000000000CC"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(s_expected, Hex.toHexString(program.getStack().peek().getData()).toUpperCase()); - } - - - @Test // JUMPI OP - public void testJUMPI_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("630000000060445760CC60DD"), invoke); - String s_expected_1 = "00000000000000000000000000000000000000000000000000000000000000DD"; - String s_expected_2 = "00000000000000000000000000000000000000000000000000000000000000CC"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - DataWord item2 = program.stackPop(); - - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - assertEquals(s_expected_2, Hex.toHexString(item2.getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // JUMPI OP mal - public void testJUMPI_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("600157"), invoke); - try { - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test(expected = BadJumpDestinationException.class) // JUMPI OP mal - public void testJUMPI_4() { - - VM vm = new VM(); - program = new Program(Hex.decode("60016022909057"), invoke); - try { - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test(expected = BadJumpDestinationException.class) // JUMP OP mal data - public void testJUMPDEST_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("602360085660015b600255"), invoke); - - String s_expected_key = "0000000000000000000000000000000000000000000000000000000000000002"; - String s_expected_val = "0000000000000000000000000000000000000000000000000000000000000023"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord key = new DataWord(Hex.decode(s_expected_key)); - DataWord val = program.getResult().getRepository().getStorageValue(invoke.getOwnerAddress() - .getNoLeadZeroesData(), key); - - assertTrue(program.isStopped()); - assertEquals(s_expected_val, Hex.toHexString(val.getData()).toUpperCase()); - } - - @Test // JUMPDEST OP for JUMPI - public void testJUMPDEST_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("6023600160095760015b600255"), invoke); - - String s_expected_key = "0000000000000000000000000000000000000000000000000000000000000002"; - String s_expected_val = "0000000000000000000000000000000000000000000000000000000000000023"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord key = new DataWord(Hex.decode(s_expected_key)); - DataWord val = program.getResult().getRepository().getStorageValue(invoke.getOwnerAddress() - .getNoLeadZeroesData(), key); - - assertTrue(program.isStopped()); - assertEquals(s_expected_val, Hex.toHexString(val.getData()).toUpperCase()); - } - - @Test // ADD OP mal - public void testADD_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("6002600201"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000004"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // ADD OP - public void testADD_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("611002600201"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000001004"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // ADD OP - public void testADD_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("6110026512345678900901"), invoke); - String s_expected_1 = "000000000000000000000000000000000000000000000000000012345678A00B"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // ADD OP mal - public void testADD_4() { - - VM vm = new VM(); - program = new Program(Hex.decode("61123401"), invoke); - try { - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // ADDMOD OP mal - public void testADDMOD_1() { - VM vm = new VM(); - program = new Program(Hex.decode("60026002600308"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000001"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertTrue(program.isStopped()); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // ADDMOD OP - public void testADDMOD_2() { - VM vm = new VM(); - program = new Program(Hex.decode("6110006002611002086000"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000004"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertFalse(program.isStopped()); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // ADDMOD OP - public void testADDMOD_3() { - VM vm = new VM(); - program = new Program(Hex.decode("61100265123456789009600208"), invoke); - String s_expected_1 = "000000000000000000000000000000000000000000000000000000000000093B"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertTrue(program.isStopped()); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // ADDMOD OP mal - public void testADDMOD_4() { - VM vm = new VM(); - program = new Program(Hex.decode("61123408"), invoke); - try { - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // MUL OP - public void testMUL_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("6003600202"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000006"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // MUL OP - public void testMUL_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("62222222600302"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000666666"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // MUL OP - public void testMUL_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("622222226233333302"), invoke); - String s_expected_1 = "000000000000000000000000000000000000000000000000000006D3A05F92C6"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // MUL OP mal - public void testMUL_4() { - - VM vm = new VM(); - program = new Program(Hex.decode("600102"), invoke); - try { - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // MULMOD OP - public void testMULMOD_1() { - VM vm = new VM(); - program = new Program(Hex.decode("60036002600409"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000002"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // MULMOD OP - public void testMULMOD_2() { - VM vm = new VM(); - program = new Program(Hex.decode("622222226003600409"), invoke); - String s_expected_1 = "000000000000000000000000000000000000000000000000000000000000000C"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // MULMOD OP - public void testMULMOD_3() { - VM vm = new VM(); - program = new Program(Hex.decode("62222222623333336244444409"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // MULMOD OP mal - public void testMULMOD_4() { - VM vm = new VM(); - program = new Program(Hex.decode("600109"), invoke); - try { - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // DIV OP - public void testDIV_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("6002600404"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000002"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // DIV OP - public void testDIV_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("6033609904"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000003"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - - @Test // DIV OP - public void testDIV_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("6022609904"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000004"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // DIV OP - public void testDIV_4() { - - VM vm = new VM(); - program = new Program(Hex.decode("6015609904"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000007"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - - @Test // DIV OP - public void testDIV_5() { - - VM vm = new VM(); - program = new Program(Hex.decode("6004600704"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000001"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // DIV OP - public void testDIV_6() { - - VM vm = new VM(); - program = new Program(Hex.decode("600704"), invoke); - try { - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // SDIV OP - public void testSDIV_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("6103E87FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1805" + - ""), invoke); - String s_expected_1 = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // SDIV OP - public void testSDIV_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("60FF60FF05"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000001"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // SDIV OP - public void testSDIV_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("600060FF05"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // SDIV OP mal - public void testSDIV_4() { - - VM vm = new VM(); - program = new Program(Hex.decode("60FF05"), invoke); - - try { - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // SUB OP - public void testSUB_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("6004600603"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000002"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // SUB OP - public void testSUB_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("61444461666603"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000002222"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // SUB OP - public void testSUB_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("614444639999666603"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000099992222"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // SUB OP mal - public void testSUB_4() { - - VM vm = new VM(); - program = new Program(Hex.decode("639999666603"), invoke); - try { - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // MSIZE OP - public void testMSIZE_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("59"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // MSIZE OP - public void testMSIZE_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("602060305259"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000060"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - - @Test // STOP OP - public void testSTOP_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("60206030601060306011602300"), invoke); - int expectedSteps = 7; - - int i = 0; - while (!program.isStopped()) { - - vm.step(program); - ++i; - } - assertEquals(expectedSteps, i); - } - - - @Test // EXP OP - public void testEXP_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("600360020a"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000008"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - long gas = program.getResult().getGasUsed(); - - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - assertEquals(4, gas); - } - - @Test // EXP OP - public void testEXP_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("6000621234560a"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000001"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - long gas = program.getResult().getGasUsed(); - - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - assertEquals(3, gas); - } - - @Test // EXP OP - public void testEXP_3() { - - VM vm = new VM(); - program = new Program(Hex.decode("61112260010a"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000001"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - long gas = program.getResult().getGasUsed(); - - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - assertEquals(5, gas); - } - - - @Test(expected = StackTooSmallException.class) // EXP OP mal - public void testEXP_4() { - - VM vm = new VM(); - program = new Program(Hex.decode("621234560a"), invoke); - try { - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // RETURN OP - public void testRETURN_1() { - - VM vm = new VM(); - program = new Program(Hex.decode("61123460005260206000F3"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000001234"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(s_expected_1, Hex.toHexString(program.getResult().getHReturn().array()).toUpperCase()); - assertTrue(program.isStopped()); - } - - - @Test // RETURN OP - public void testRETURN_2() { - - VM vm = new VM(); - program = new Program(Hex.decode("6112346000526020601FF3"), invoke); - String s_expected_1 = "3400000000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(s_expected_1, Hex.toHexString(program.getResult().getHReturn().array()).toUpperCase()); - assertTrue(program.isStopped()); - } - - @Test // RETURN OP - public void testRETURN_3() { - - VM vm = new VM(); - program = - new Program(Hex.decode - ("7FA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B160005260206000F3"), - invoke); - String s_expected_1 = "A0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B1"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(s_expected_1, Hex.toHexString(program.getResult().getHReturn().array()).toUpperCase()); - assertTrue(program.isStopped()); - } - - - @Test // RETURN OP - public void testRETURN_4() { - - VM vm = new VM(); - program = - new Program(Hex.decode - ("7FA0B0C0D0E0F0A1B1C1D1E1F1A2B2C2D2E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B160005260206010F3"), - invoke); - String s_expected_1 = "E2F2A3B3C3D3E3F3A4B4C4D4E4F4A1B100000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(s_expected_1, Hex.toHexString(program.getResult().getHReturn().array()).toUpperCase()); - assertTrue(program.isStopped()); - } - - - @Test // CODECOPY OP - public void testCODECOPY_1() { - - VM vm = new VM(); - program = - new Program(Hex.decode("60036007600039123456"), invoke); - String m_expected_1 = "1234560000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - long gas = program.getResult().getGasUsed(); - assertEquals(m_expected_1, Hex.toHexString(program.getMemory().array()).toUpperCase()); - assertEquals(6, gas); - } - - @Test // CODECOPY OP - public void testCODECOPY_2() { - - VM vm = new VM(); - program = - new Program(Hex.decode - ("605E60076000396000605f556014600054601e60205463abcddcba6040545b51602001600a5254516040016014525451606001601e5254516080016028525460a052546016604860003960166000f26000603f556103e75660005460005360200235602054"), - invoke); - String m_expected_1 = - "6000605F556014600054601E60205463ABCDDCBA6040545B51602001600A5254516040016014525451606001601E5254516080016028525460A052546016604860003960166000F26000603F556103E756600054600053602002356020540000"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - long gas = program.getResult().getGasUsed(); - assertEquals(m_expected_1, Hex.toHexString(program.getMemory().array()).toUpperCase()); - assertEquals(10, gas); - } - - @Test // CODECOPY OP - public void testCODECOPY_3() { - - // cost for that: - // 94 - data copied - // 95 - new bytes allocated - - VM vm = new VM(); - program = - new Program(Hex.decode - ("605E60076000396000605f556014600054601e60205463abcddcba6040545b51602001600a5254516040016014525451606001601e5254516080016028525460a052546016604860003960166000f26000603f556103e75660005460005360200235"), - invoke); - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(10, program.getResult().getGasUsed()); - } - - @Test // CODECOPY OP - public void testCODECOPY_4() { - - VM vm = new VM(); - program = - new Program(Hex.decode - ("605E60076000396000605f556014600054601e60205463abcddcba6040545b51602001600a5254516040016014525451606001601e5254516080016028525460a052546016604860003960166000f26000603f556103e756600054600053602002351234"), - invoke); - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(10, program.getResult().getGasUsed()); - } - - - @Test // CODECOPY OP - public void testCODECOPY_5() { - - VM vm = new VM(); - program = - new Program(Hex.decode - ("611234600054615566602054607060006020396000605f556014600054601e60205463abcddcba6040545b51602001600a5254516040016014525451606001601e5254516080016028525460a052546016604860003960166000f26000603f556103e756600054600053602002351234"), - invoke); - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertFalse(program.isStopped()); - } - - - @Test(expected = StackTooSmallException.class) // CODECOPY OP mal - public void testCODECOPY_6() { - - VM vm = new VM(); - program = - new Program(Hex.decode - ("605E6007396000605f556014600054601e60205463abcddcba6040545b51602001600a5254516040016014525451606001601e5254516080016028525460a052546016604860003960166000f26000603f556103e756600054600053602002351234"), - invoke); - try { - vm.step(program); - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // EXTCODECOPY OP - public void testEXTCODECOPY_1() { - - VM vm = new VM(); - program = - new Program(Hex.decode("60036007600073471FD3AD3E9EEADEEC4608B92D16CE6B500704CC3C123456"), invoke); - String m_expected_1 = "6000600000000000000000000000000000000000000000000000000000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(m_expected_1, Hex.toHexString(program.getMemory().array()).toUpperCase()); - } - - @Test // EXTCODECOPY OP - public void testEXTCODECOPY_2() { - - VM vm = new VM(); - program = - new Program(Hex.decode - ("603E6007600073471FD3AD3E9EEADEEC4608B92D16CE6B500704CC3C6000605f556014600054601e60205463abcddcba6040545b51602001600a5254516040016014525451606001601e5254516080016028525460a052546016604860003960166000f26000603f556103e75660005460005360200235602054"), - invoke); - String m_expected_1 = - "6000605F556014600054601E60205463ABCDDCBA6040545B51602001600A5254516040016014525451606001601E5254516080016028525460A0525460160000"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(m_expected_1, Hex.toHexString(program.getMemory().array()).toUpperCase()); - } - - @Test // EXTCODECOPY OP - public void testEXTCODECOPY_3() { - VM vm = new VM(); - program = - new Program(Hex.decode - ("605E6007600073471FD3AD3E9EEADEEC4608B92D16CE6B500704CC3C6000605f556014600054601e60205463abcddcba6040545b51602001600a5254516040016014525451606001601e5254516080016028525460a052546016604860003960166000f26000603f556103e75660005460005360200235"), - invoke); - - String m_expected_1 = - "6000605F556014600054601E60205463ABCDDCBA6040545B51602001600A5254516040016014525451606001601E5254516080016028525460A052546016604860003960166000F26000603F556103E756600054600053602002350000000000"; - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertEquals(m_expected_1, Hex.toHexString(program.getMemory().array()).toUpperCase()); - } - - @Test // EXTCODECOPY OP - public void testEXTCODECOPY_4() { - VM vm = new VM(); - program = - new Program(Hex.decode - ("611234600054615566602054603E6000602073471FD3AD3E9EEADEEC4608B92D16CE6B500704CC3C6000605f556014600054601e60205463abcddcba6040545b51602001600a5254516040016014525451606001601e5254516080016028525460a052546016604860003960166000f26000603f556103e756600054600053602002351234"), - invoke); - - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - - assertFalse(program.isStopped()); - } - - - @Test(expected = StackTooSmallException.class) // EXTCODECOPY OP mal - public void testEXTCODECOPY_5() { - VM vm = new VM(); - program = - new Program(Hex.decode("605E600773471FD3AD3E9EEADEEC4608B92D16CE6B500704CC3C"), - invoke); - try { - vm.step(program); - vm.step(program); - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - - @Test // CODESIZE OP - public void testCODESIZE_1() { - - VM vm = new VM(); - program = - new Program(Hex.decode - ("385E60076000396000605f556014600054601e60205463abcddcba6040545b51602001600a5254516040016014525451606001601e5254516080016028525460a052546016604860003960166000f26000603f556103e75660005460005360200235"), - invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000062"; - - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Ignore // todo: test is not testing EXTCODESIZE - @Test // EXTCODESIZE OP - public void testEXTCODESIZE_1() { - VM vm = new VM(); - program = - new Program(Hex.decode - ("73471FD3AD3E9EEADEEC4608B92D16CE6B500704CC395E60076000396000605f556014600054601e60205463abcddcba6040545b51602001600a5254516040016014525451606001601e5254516080016028525460a052546016604860003960166000f26000603f556103e75660005460005360200235"), - invoke); // Push address on the stack and perform EXTCODECOPY - String s_expected_1 = "000000000000000000000000471FD3AD3E9EEADEEC4608B92D16CE6B500704CC"; - - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // MOD OP - public void testMOD_1() { - VM vm = new VM(); - program = new Program(Hex.decode("6003600406"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000001"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // MOD OP - public void testMOD_2() { - VM vm = new VM(); - program = new Program(Hex.decode("61012C6101F406"), invoke); - String s_expected_1 = "00000000000000000000000000000000000000000000000000000000000000C8"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // MOD OP - public void testMOD_3() { - VM vm = new VM(); - program = new Program(Hex.decode("6004600206"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000002"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // MOD OP mal - public void testMOD_4() { - - VM vm = new VM(); - program = new Program(Hex.decode("600406"), invoke); - - try { - vm.step(program); - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } - - @Test // SMOD OP - public void testSMOD_1() { - VM vm = new VM(); - program = new Program(Hex.decode("6003600407"), invoke); - String s_expected_1 = "0000000000000000000000000000000000000000000000000000000000000001"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // SMOD OP - public void testSMOD_2() { - VM vm = new VM(); - program = new Program(Hex.decode("7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2" + // -30 - "7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" + // -170 - "07"), invoke); - String s_expected_1 = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test // SMOD OP - public void testSMOD_3() { - VM vm = new VM(); - program = new Program(Hex.decode("7F000000000000000000000000000000000000000000000000000000000000001E" + // 30 - "7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF56" + // -170 - "07"), invoke); - String s_expected_1 = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC"; - - vm.step(program); - vm.step(program); - vm.step(program); - - DataWord item1 = program.stackPop(); - assertEquals(s_expected_1, Hex.toHexString(item1.getData()).toUpperCase()); - } - - @Test(expected = StackTooSmallException.class) // SMOD OP mal - public void testSMOD_4() { - VM vm = new VM(); - program = new Program(Hex.decode("7F000000000000000000000000000000000000000000000000000000000000001E" + // 30 - "07"), invoke); - try { - vm.step(program); - vm.step(program); - } finally { - assertTrue(program.isStopped()); - } - } -} - -// TODO: add gas expeted and calculated to all test cases -// TODO: considering: G_TXDATA + G_TRANSACTION - -/** - * TODO: - * - * 22) CREATE: - * 23) CALL: - * - * - **/ - -/** - - contract creation (gas usage) - ----------------------------- - G_TRANSACTION = (500) - 60016000546006601160003960066000f261778e600054 (115) - PUSH1 6001 (1) - PUSH1 6000 (1) - MSTORE 54 (1 + 1) - PUSH1 6006 (1) - PUSH1 6011 (1) - PUSH1 6000 (1) - CODECOPY 39 (1) - PUSH1 6006 (1) - PUSH1 6000 (1) - RETURN f2 (1) - 61778e600054 - - */ diff --git a/ethereumj-core/src/test/resources/fork/scenario1.dmp b/ethereumj-core/src/test/resources/fork/scenario1.dmp deleted file mode 100644 index e6e3a908..00000000 --- a/ethereumj-core/src/test/resources/fork/scenario1.dmp +++ /dev/null @@ -1,32 +0,0 @@ -f8f3f8efa0955f36d073ccb026b78ab3424c15cf966a7563aa270413859f78702b9e8e22cba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000180830f42408086014999e9d97480a0000000000000000000000000000000000000000000000000000000000000123dc0c0 -f8f3f8efa0c1ffb0686aa17fcb5eef4137d0ae94a6db2a4fb44d4442896e5b1ac0127d52b0a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000280830f42408086014999e9dc7580a00000000000000000000000000000000000000000000000000000000000010d23c0c0 -f8f3f8efa0585afbf84ec4cae31c877036b7faaacf8f5382d58e62f7acf4e5fb4b4443a62ca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000380830f42408086014999e9eb0680a0000000000000000000000000000000000000000000000000000000000000866cc0c0 -f8f3f8efa059df515807c95e850ff827173f5a15f25268428a3bb059a284003b018a199651a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000480830f42408086014999e9f34380a000000000000000000000000000000000000000000000000000000000000087eac0c0 -f8f3f8efa0e649b61c1f19780dc5d92b32f12d2dfbabe115171d5e16e66b8e59bb386066b8a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000580830f42408086014999e9fb9380a00000000000000000000000000000000000000000000000000000000000034334c0c0 -f8f3f8efa003cdbb1f1b57448cec20b10e10d0b388351e92c0905643e3b5b7151faa9901b4a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000680830f42408086014999ea24a280a000000000000000000000000000000000000000000000000000000000000031a1c0c0 -f8f3f8efa03054b6cf6680d90dd88a5f73f2a15aa6ca44cbbaf8d884f3bc76846819afbd29a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000780830f42408086014999ea28e980a0000000000000000000000000000000000000000000000000000000000001c02ec0c0 -f8f3f8efa03054b6cf6680d90dd88a5f73f2a15aa6ca44cbbaf8d884f3bc76846819afbd29a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000780830f42408086014999ea28ef80a0000000000000000000000000000000000000000000000000000000000001cef4c0c0 -f8f3f8efa042410afa693dd995244aec75ba66cb5696327c1081ce3deba1786833d4ef7cb6a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000880830f42408086014999ea3fca80a00000000000000000000000000000000000000000000000000000000000003925c0c0 -f901e5f8efa02e75ea5ffd484e286ec364e8a4241d7ced28d87ae032ec049606e756cf1a3f2ba09f17fc4194346b7510c2ce86dc7530bb25696a1f500b9b8f8e712fccba716c6e94f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000980830f42408086014999ea446d80a00000000000000000000000000000000000000000000000000000000000008cd1c0f8f1f8efa03054b6cf6680d90dd88a5f73f2a15aa6ca44cbbaf8d884f3bc76846819afbd29a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000780830f42408086014999ea28ef80a0000000000000000000000000000000000000000000000000000000000001cef4 -f8f3f8efa047908cfc665cad1c70fc5d829ab96649c0519588020152c3f217cbe18ac3ab8ba09f17fc4194346b7510c2ce86dc7530bb25696a1f500b9b8f8e712fccba716c6e94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000a80830f42408086014999ea4cee80a0000000000000000000000000000000000000000000000000000000000000a9fbc0c0 -f8f3f8efa0613cdcce701b646c35f2fd23df535363df98a610036a3e4fec5809a444adc47da09f17fc4194346b7510c2ce86dc7530bb25696a1f500b9b8f8e712fccba716c6e94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000b80830f42408086014999ea56d080a0000000000000000000000000000000000000000000000000000000000000533fc0c0 -f901e5f8efa0809b9f2368ab54f8a656ad43a1d11579cd908ef64dcb1756cb44251a2bd8b878a0d7987a94b8e13555797d283bcf98805d1173908b25c7e0f43e7dd20387dc1ac5942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000880830f42408086014999ea408780a0000000000000000000000000000000000000000000000000000000000002c1b5c0f8f1f8efa03054b6cf6680d90dd88a5f73f2a15aa6ca44cbbaf8d884f3bc76846819afbd29a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000780830f42408086014999ea28e980a0000000000000000000000000000000000000000000000000000000000001c02e -f8f3f8efa064b6b7ba2f2f2e14b72152fc80774b686d4e08638d85aa4c55ebd8679c81fa0aa0d7987a94b8e13555797d283bcf98805d1173908b25c7e0f43e7dd20387dc1ac5942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000980830f42408086014999ea635780a00000000000000000000000000000000000000000000000000000000000032023c0c0 -f8f3f8efa00ae67dc8275cbae12d9168ed886e8175583d915953fb16f83ae4aea0df4f8f5fa0d7987a94b8e13555797d283bcf98805d1173908b25c7e0f43e7dd20387dc1ac5942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000a80830f42408086014999ea8ab180a0000000000000000000000000000000000000000000000000000000000000b4ccc0c0 -f8f3f8efa06cf2e0657188fa80869d998d97079fe435a176576a312efab6cc5731d8e8cc34a09f17fc4194346b7510c2ce86dc7530bb25696a1f500b9b8f8e712fccba716c6e94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000c80830f42408086014999ea5cab80a0000000000000000000000000000000000000000000000000000000000005448ac0c0 -f8f3f8efa0a3b0d1d3d330f427a51aeb734d038dc4b099425b4b580c70cc32ccad48a5b813a0d7987a94b8e13555797d283bcf98805d1173908b25c7e0f43e7dd20387dc1ac5942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000b80830f42408086014999ea951080a00000000000000000000000000000000000000000000000000000000000027a21c0c0 -f8f3f8efa04ac8224ab83845571ae84f2e45966798a56013d7d880f9e6bd7fd93cc565ab54a0d7987a94b8e13555797d283bcf98805d1173908b25c7e0f43e7dd20387dc1ac5942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000c80830f42408086014999eab48780a00000000000000000000000000000000000000000000000000000000000000e45c0c0 -f8f3f8efa02df9a3b43b2c2adea2dd4dac12fcf26b2121c784a1511f155b26aad7456e7014a09f17fc4194346b7510c2ce86dc7530bb25696a1f500b9b8f8e712fccba716c6e94f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000d80830f42408086014999ea9da280a0000000000000000000000000000000000000000000000000000000000002608ac0c0 -f8f3f8efa055155c72460fe0128ca834acc122aec3363143f629876a832268c9885c8ef03fa09f17fc4194346b7510c2ce86dc7530bb25696a1f500b9b8f8e712fccba716c6e94f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000e80830f42408086014999eabbee80a000000000000000000000000000000000000000000000000000000000000049f6c0c0 -f8f3f8efa0d64cc441d61c26f2c701ff70fa26eb16aa1f48885ea50a6f020282ae0924657da09f17fc4194346b7510c2ce86dc7530bb25696a1f500b9b8f8e712fccba716c6e94f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000f80830f42408086014999eac15780a000000000000000000000000000000000000000000000000000000000000095c8c0c0 -f8f3f8efa00e1f706d15e634e980d072ae00679e635827bafad2afec5ac882901105e62e4da09f17fc4194346b7510c2ce86dc7530bb25696a1f500b9b8f8e712fccba716c6e94f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001080830f42408086014999eaca4080a00000000000000000000000000000000000000000000000000000000000009219c0c0 -f8f3f8efa072bc570d5ed554c86c9ac2ac9ffb0ab5b23c234cabdb97f0fb868fb3290e2802a09f17fc4194346b7510c2ce86dc7530bb25696a1f500b9b8f8e712fccba716c6e94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001180830f42408086014999ead30480a0000000000000000000000000000000000000000000000000000000000000641dc0c0 -f8f3f8efa0fb70904fbcf51a937977b97b0bc2d3a642397f3b5c734a13411e6d6c0d88acd4a09f17fc4194346b7510c2ce86dc7530bb25696a1f500b9b8f8e712fccba716c6e94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001280830f42408086014999ead9a680a00000000000000000000000000000000000000000000000000000000000002e6cc0c0 -f8f3f8efa099d310c72ef9da40d6789bf5ce5d3622a45b648a71f552558f72d4dda9176ac9a09f17fc4194346b7510c2ce86dc7530bb25696a1f500b9b8f8e712fccba716c6e94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001380830f42408086014999eaddbf80a000000000000000000000000000000000000000000000000000000000000033d7c0c0 -f8f3f8efa0d0b7ccbeebb92b0c65c05d3343c8b9311e3f592260b6e7a694fd615e29256c67a0d7987a94b8e13555797d283bcf98805d1173908b25c7e0f43e7dd20387dc1ac5942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000d80830f42408086014999eab72680a0000000000000000000000000000000000000000000000000000000000006567dc0c0 -f8f3f8efa0e8353ae9a7e93a4f82e89d4753db5df26e700d2c1bbfe88e32cdf3e96e006a78a0d7987a94b8e13555797d283bcf98805d1173908b25c7e0f43e7dd20387dc1ac5942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000e80830f42408086014999eb04b680a0000000000000000000000000000000000000000000000000000000000000fd60c0c0 -f8f3f8efa07a78a9fbfcad4a3c9b6a8d01dcccf134d79e3a2a1e1e3b09e9206b3f5eaa99e6a0d7987a94b8e13555797d283bcf98805d1173908b25c7e0f43e7dd20387dc1ac5942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000f80830f42408086014999eb126c80a00000000000000000000000000000000000000000000000000000000000016c8dc0c0 -f8f3f8efa01f4d21e107c4ea7b2e6bfdcc93204d683f1eb64902b632e123a3870173a52620a0d7987a94b8e13555797d283bcf98805d1173908b25c7e0f43e7dd20387dc1ac5942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001080830f42408086014999eb255580a0000000000000000000000000000000000000000000000000000000000000a16fc0c0 -f8f3f8efa0e6c6de2e8980766f5f905644d53ff8fd0fe035eb7ed6d0c448af3a1728ea0041a0d7987a94b8e13555797d283bcf98805d1173908b25c7e0f43e7dd20387dc1ac5942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001180830f42408086014999eb2ec580a0000000000000000000000000000000000000000000000000000000000000c875c0c0 -f8f3f8efa0c9387dc32fc8c5ee627d919f0eb22cf5b09ca8efc453343354f1fd70c1695d68a0d7987a94b8e13555797d283bcf98805d1173908b25c7e0f43e7dd20387dc1ac5942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001280830f42408086014999eb3a0480a00000000000000000000000000000000000000000000000000000000000059e2cc0c0 -f8f3f8efa0edf6ea2a3e43a59f7751f4339dc8b1beb918edb93cc7f911dc6ccddf857b1443a0d7987a94b8e13555797d283bcf98805d1173908b25c7e0f43e7dd20387dc1ac5942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001380830f42408086014999eb7eb580a0000000000000000000000000000000000000000000000000000000000003d0e2c0c0 diff --git a/ethereumj-core/src/test/resources/fork/scenario2.dmp b/ethereumj-core/src/test/resources/fork/scenario2.dmp deleted file mode 100644 index 783b4262..00000000 --- a/ethereumj-core/src/test/resources/fork/scenario2.dmp +++ /dev/null @@ -1,277 +0,0 @@ -f8f3f8efa0955f36d073ccb026b78ab3424c15cf966a7563aa270413859f78702b9e8e22cba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000180830f4240808601499be910b280a0000000000000000000000000000000000000000000000000000000000000e68ac0c0 -f8f3f8efa094036a1ec5e8dcea7a65d3dfa3dce9c25e3dc0b5ff539b750271c95a51c5732ca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000280830f4240808601499be91db080a00000000000000000000000000000000000000000000000000000000000005975c0c0 -f8f3f8efa074f0ef6330f7f51766b5e3d45acbbeeadab5dcc17d6bd75f7dc4b1d58ccbdfe9a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000380830f4240808601499be923da80a0000000000000000000000000000000000000000000000000000000000000d17fc0c0 -f8f3f8efa035e613fdc4913b908486569959e9d4c7bc4d1cb98d39e6c03556fd92878209c4a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000480830f4240808601499be92fb680a0000000000000000000000000000000000000000000000000000000000000052ec0c0 -f8f3f8efa04f3295a098c51bfe95ec017d4ee6206728eb230d90a3ee00e5328ceec8018a11a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000580830f4240808601499be931eb80a000000000000000000000000000000000000000000000000000000000000051ddc0c0 -f8f3f8efa01ef1019ed8ffca1d46b5a30b60ac1d890173725e8f3a08f1f2b2436fe5ed67aea01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000680830f4240808601499be937a880a0000000000000000000000000000000000000000000000000000000000000fbbfc0c0 -f8f3f8efa0ae9448de848b702908d937f87a458f2ce60ef83b99c9612b085182d2b3251289a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000780830f4240808601499be9458980a00000000000000000000000000000000000000000000000000000000000003a1ac0c0 -f8f3f8efa0ae9448de848b702908d937f87a458f2ce60ef83b99c9612b085182d2b3251289a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000780830f4240808601499be9458880a00000000000000000000000000000000000000000000000000000000000003e31c0c0 -f8f3f8efa01927c55d9d947312c0c00b0996f2f3fe43b741f1161d41c647efdea4673df519a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000880830f4240808601499be94a3880a00000000000000000000000000000000000000000000000000000000000003439c0c0 -f901e5f8efa0bfce59e8b4532069312a5cfdc065b8af5692050864369252f313d3b7cb3095e5a074ed95e8bb8159b03a7adbf00b9281daa40e5865a893925ef0840534a7e172b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000980830f4240808601499be94e9d80a0000000000000000000000000000000000000000000000000000000000000503ec0f8f1f8efa0ae9448de848b702908d937f87a458f2ce60ef83b99c9612b085182d2b3251289a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000780830f4240808601499be9458880a00000000000000000000000000000000000000000000000000000000000003e31 -f8f3f8efa0f4aee41be5fd2fc9bda4983cc1f8ad9a007a924f42a241d5841cbce81da4584aa074ed95e8bb8159b03a7adbf00b9281daa40e5865a893925ef0840534a7e172b594407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000a80830f4240808601499be9546580a0000000000000000000000000000000000000000000000000000000000000968ec0c0 -f901e5f8efa0a52ac2737ecead3a7aaf570c752850702828508592f956676f9bed4eac58b025a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000880830f4240808601499be94a6280a0000000000000000000000000000000000000000000000000000000000002c356c0f8f1f8efa0ae9448de848b702908d937f87a458f2ce60ef83b99c9612b085182d2b3251289a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d4934794f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000780830f4240808601499be9458980a00000000000000000000000000000000000000000000000000000000000003a1a -f8f3f8efa0b9cd1ba4dea2190b8cb486560b758009f2d067aa3379d86c8b32e4cbc3125e4da074ed95e8bb8159b03a7adbf00b9281daa40e5865a893925ef0840534a7e172b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000b80830f4240808601499be95d7780a000000000000000000000000000000000000000000000000000000000000180cfc0c0 -f8f3f8efa0e457aab10cb22c52104da50d17ea5a8a97e49176bf77e1daaa583474e39be7aba074ed95e8bb8159b03a7adbf00b9281daa40e5865a893925ef0840534a7e172b594407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000c80830f4240808601499be9717e80a0000000000000000000000000000000000000000000000000000000000001331ec0c0 -f8f3f8efa01c412e68e15d35ed0d4fc269058fce34bb6109ed8c5da4f5e46d63ba5c9e1ba9a074ed95e8bb8159b03a7adbf00b9281daa40e5865a893925ef0840534a7e172b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000d80830f4240808601499be981fe80a00000000000000000000000000000000000000000000000000000000000006cfac0c0 -f8f3f8efa01ea661d8a9b3b6d5ca19347dd3d15adb2e794ba4a2a739b668a61644139e1feba074ed95e8bb8159b03a7adbf00b9281daa40e5865a893925ef0840534a7e172b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000e80830f4240808601499be9890980a00000000000000000000000000000000000000000000000000000000000001629c0c0 -f8f3f8efa00841919fc04907545d31d9cdfdf3f5d005cf966026827b9314c707fef121026aa074ed95e8bb8159b03a7adbf00b9281daa40e5865a893925ef0840534a7e172b594407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000f80830f4240808601499be98c0d80a00000000000000000000000000000000000000000000000000000000000013da3c0c0 -f8f3f8efa00841919fc04907545d31d9cdfdf3f5d005cf966026827b9314c707fef121026aa074ed95e8bb8159b03a7adbf00b9281daa40e5865a893925ef0840534a7e172b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000f80830f4240808601499be98c0780a0000000000000000000000000000000000000000000000000000000000001587bc0c0 -f901e5f8efa034d8b5ee2ca883faf16e3caeb2a8235b922e4a502ee968ef3fc9065bf96c4664a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001080830f4240808601499be99e3980a00000000000000000000000000000000000000000000000000000000000004cbec0f8f1f8efa00841919fc04907545d31d9cdfdf3f5d005cf966026827b9314c707fef121026aa074ed95e8bb8159b03a7adbf00b9281daa40e5865a893925ef0840534a7e172b594407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000f80830f4240808601499be98c0d80a00000000000000000000000000000000000000000000000000000000000013da3 -f8f3f8efa046a4f3c9cce7dffc620a2b5b61db7d65cd6ebeb265610f9c3b63a84b1c89d1dca0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001180830f4240808601499be9a3c680a00000000000000000000000000000000000000000000000000000000000009410c0c0 -f8f3f8efa0a2d3f0276f151d9e1480243546a5a38bfe2ce72a4da091b80412a711b2d03921a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000980830f4240808601499be96d9c80a0000000000000000000000000000000000000000000000000000000000005133dc0c0 -f8f3f8efa07e95e08472e83c1803afcc84d8bd943d0285ec8640263a3c1455bcd0fbfd7094a074ed95e8bb8159b03a7adbf00b9281daa40e5865a893925ef0840534a7e172b594407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001080830f4240808601499be99ced80a00000000000000000000000000000000000000000000000000000000000021b33c0c0 -f8f3f8efa0acb571e2155a186fb55706f52b19d72ab0344e634fd6f9d0f771c8ba4a40ef29a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001280830f4240808601499be9acab80a0000000000000000000000000000000000000000000000000000000000000d07ac0c0 -f8f3f8efa0313f1d1ccb05ec001dc39bc002099530876d1592c7b0e9ff48fd25a0c6bb385fa0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000a80830f4240808601499be9acd680a00000000000000000000000000000000000000000000000000000000000011884c0c0 -f8f3f8efa0548f48b9d42c438ef5c90aea01401b26acc6f94d217756121409878e60aa60b2a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000b80830f4240808601499be9bc0c80a0000000000000000000000000000000000000000000000000000000000000ad2bc0c0 -f901e5f8efa0545f5c31f5adec2b3ab663faa849d281bd21815cc95abf1f8d2d37605d75b264a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001180830f4240808601499be9b83d80a00000000000000000000000000000000000000000000000000000000000037146c0f8f1f8efa00841919fc04907545d31d9cdfdf3f5d005cf966026827b9314c707fef121026aa074ed95e8bb8159b03a7adbf00b9281daa40e5865a893925ef0840534a7e172b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000f80830f4240808601499be98c0780a0000000000000000000000000000000000000000000000000000000000001587b -f8f3f8efa027dc912f644898db30296acb70ba8952f86b2e9c123f08d576ae4f3dda42a1daa0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000c80830f4240808601499be9c64080a0000000000000000000000000000000000000000000000000000000000002aa74c0c0 -f8f3f8efa09a3a43febbb9c9ba6598efc08c4c256d0f0fd640cd49bfa80499accd42bf70a0a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001280830f4240808601499be9e3f480a0000000000000000000000000000000000000000000000000000000000000658dc0c0 -f8f3f8efa09b13386094d588494fa7b28b8b6758f93439c5c44f3592b25c3fe5c6d48063c0a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000d80830f4240808601499be9e87b80a00000000000000000000000000000000000000000000000000000000000003338c0c0 -f8f3f8efa06d307e1c3ee8509a88ce3a12ecc01b59fe68f628b2f33d74e9e0039daf9415eba0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001380830f4240808601499be9b87480a00000000000000000000000000000000000000000000000000000000000042d00c0c0 -f8f3f8efa0af321b01a29cce8109082baded6f9de05bf7b5e6d07f6cb0b860c5344be9c805a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000e80830f4240808601499be9ecd680a0000000000000000000000000000000000000000000000000000000000000093cc0c0 -f8f3f8efa04a4a61e86bf6f960f205adea65d072b73f853d6e395b2df84ed16b11df19de2da0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001480830f4240808601499be9ed1780a00000000000000000000000000000000000000000000000000000000000005a81c0c0 -f8f3f8efa0e8d35b4d57bfa7a22b82a473c4bb326401b6e375e6a1349af7154eb13d002324a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001580830f4240808601499be9f35280a0000000000000000000000000000000000000000000000000000000000000efddc0c0 -f8f3f8efa04388a9dd534af696e90987c5d0d1c12fb7448e9f64c5a827eabe87cb70de766da0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001680830f4240808601499bea009580a000000000000000000000000000000000000000000000000000000000000011ebc0c0 -f8f3f8efa0d0a8672b9bc15a76c9a9ae8a294bf476fed00838c8e539fba4e62966b36ab963a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001780830f4240808601499bea035880a000000000000000000000000000000000000000000000000000000000000052cfc0c0 -f8f3f8efa0a96119b8e7db36958a4efc1a49704c19aca4e918c12f8dafa352642ee0ab1400a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001380830f4240808601499be9eaa880a00000000000000000000000000000000000000000000000000000000000036aadc0c0 -f8f3f8efa0d7f146ae1a13a631ae9a85c99a42a309b44a05a0bd9fb49b41227e345de73433a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200000f80830f4240808601499be9ef3680a000000000000000000000000000000000000000000000000000000000000339e2c0c0 -f8f3f8efa08d337e750b504087a343cac87b74c48cb84000924d472c5ce1641bea60e8db3ba0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001480830f4240808601499bea15d680a00000000000000000000000000000000000000000000000000000000000020b04c0c0 -f8f3f8efa004504dd71b55eacce99311e252f819526014e633f28c8f8801d42e22ddbb3573a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001880830f4240808601499bea093280a00000000000000000000000000000000000000000000000000000000000033881c0c0 -f8f3f8efa026d396e921287ce73745d3dedcb1e7ec6c03703840dbac50a069ab3fcb4b0a31a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001080830f4240808601499bea181d80a000000000000000000000000000000000000000000000000000000000000420a2c0c0 -f8f3f8efa0e6a600fa105c021b08adee5eca16ee7d84817c04282fef99723fb9e6a34ab452a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001180830f4240808601499bea4bc580a000000000000000000000000000000000000000000000000000000000000020ecc0c0 -f8f3f8efa02c46ec302e05f80f5cab870b529a0ecc1350ee7476af193bc9e4169d053c26d3a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001980830f4240808601499bea31eb80a000000000000000000000000000000000000000000000000000000000000363e4c0c0 -f8f3f8efa00f4ed696f49312b82b7882be9c259c317381687b7c438e56b9a3d37ba226e448a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001280830f4240808601499bea4f4180a00000000000000000000000000000000000000000000000000000000000012917c0c0 -f8f3f8efa04fab8024dd87b0ef7fe1e651bb815f3d8d0f2dc28c3f00803dde7417c74134c0a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001580830f4240808601499bea305e80a00000000000000000000000000000000000000000000000000000000000046636c0c0 -f8f3f8efa0f0211669b8ca33d94abd3b35d72a3aba0894cc2f0059271c94f795d84063caa6a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001a80830f4240808601499bea5d2b80a0000000000000000000000000000000000000000000000000000000000001f2b3c0c0 -f8f3f8efa0c0917c350347d1fd7f3fc816f3373e57d0213335a6f4ab64ec9686f520af6ed5a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001680830f4240808601499bea684580a00000000000000000000000000000000000000000000000000000000000015292c0c0 -f8f3f8efa03980d1c7f3e0c6f8b84372aa0bab2fad96134571d164c8c61a674420fda962a7a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001780830f4240808601499bea7a4580a0000000000000000000000000000000000000000000000000000000000000b3b2c0c0 -f8f3f8efa02676cd8101ba440aa0b7f4a9f10fc90ff0f6ab641895b30d233cb363818e337aa0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001b80830f4240808601499bea768f80a0000000000000000000000000000000000000000000000000000000000001efd6c0c0 -f8f3f8efa075993bc4a752ffb1b264740394ea54c47bd1479b480a071653dd853428483a7aa0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001380830f4240808601499bea600080a00000000000000000000000000000000000000000000000000000000000049bb0c0c0 -f8f3f8efa0cd3207112054717afec238f55ff2fb1b4757bd83f2c49f9645340bddf16256c9a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001880830f4240808601499bea84b480a0000000000000000000000000000000000000000000000000000000000001ccfac0c0 -f8f3f8efa054bd2c83929709ac6fa25835cbe5482240e8ab3281cca533072aeff55ab39813a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001980830f4240808601499bea9c6b80a00000000000000000000000000000000000000000000000000000000000009e36c0c0 -f8f3f8efa095d0c4859de4d5f26c92ba8459fa50b1527492975234f03a055c72ec664d75ada0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001480830f4240808601499bea999f80a0000000000000000000000000000000000000000000000000000000000001b8a6c0c0 -f8f3f8efa01b41e9102521d7c0c315b1f065fcd0675ac5ddaa2ddd3f525d499853c00da58aa0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001a80830f4240808601499beaa5d680a0000000000000000000000000000000000000000000000000000000000000d4e7c0c0 -f8f3f8efa0bade645073a42c3d1d0d624fd73717f65a73d3be798613ed9b61827e41111d2ea0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001580830f4240808601499beab04a80a0000000000000000000000000000000000000000000000000000000000000706bc0c0 -f8f3f8efa0e6589e6635e4ad25ae7818aca2b780ff58f2d82bf64ec47d1d3614fcbe526a27a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001680830f4240808601499beab78880a0000000000000000000000000000000000000000000000000000000000000a064c0c0 -f8f3f8efa02c178fa60aea1272de0011a96573986005018f651927f532d72f0a74beb079f9a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001b80830f4240808601499beab1c680a00000000000000000000000000000000000000000000000000000000000020fa8c0c0 -f8f3f8efa073c8ac00303234de607407ba9398f3ab36897785c50e52230d45c75da82f445da0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001780830f4240808601499beac10f80a00000000000000000000000000000000000000000000000000000000000020f62c0c0 -f8f3f8efa022a32fd6bf4a9eb7adaa3f77a3958109c44f49ba1e91617a04b4dba944a4b7d4a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001880830f4240808601499beadbe780a00000000000000000000000000000000000000000000000000000000000010305c0c0 -f8f3f8efa00b10594db7ecb7621e5525b0b6ec5abfd2cbd33aa4f546c5070a7ff5f0821684a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001c80830f4240808601499bea8fde80a00000000000000000000000000000000000000000000000000000000000089f05c0c0 -f8f3f8efa0691b8a7120256ee2b4b49023f48a0b1cfa8f3612853c2387356001ab63cded96a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001d80830f4240808601499beafa1880a0000000000000000000000000000000000000000000000000000000000000ab6ec0c0 -f8f3f8efa0328af83bfd5efaa4769e37d0122549de2cb5707b019a99dc4a89e0fdc6716aada0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001980830f4240808601499beaea1a80a00000000000000000000000000000000000000000000000000000000000023be2c0c0 -f8f3f8efa0c0510a51466c204caf187a776e3e86e61a13d58e4ca58de75360206a5316a9ada0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001c80830f4240808601499beacc9a80a000000000000000000000000000000000000000000000000000000000000634fec0c0 -f8f3f8efa0a4863211fd85e271c82c43b04bf55b1ef17301d539f54695db4eca604de848fea0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001a80830f4240808601499beb070c80a0000000000000000000000000000000000000000000000000000000000002cc9bc0c0 -f8f3f8efa0a8a14019955ff6ebb94f0ed86496d05ac802f4fe9db5f5804136695f49cdf84ca0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001b80830f4240808601499beb2ab080a00000000000000000000000000000000000000000000000000000000000004a5dc0c0 -f8f3f8efa048f347b9d9b6ea416c729db61a1892c6b2c9a3194ba890f59a6de677cc27fb0fa0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001d80830f4240808601499beb196680a0000000000000000000000000000000000000000000000000000000000002f245c0c0 -f8f3f8efa07c0a67e646434a32abc3de3f03a142c847ce6c51672e7bbd42cbdd66151b7ddfa0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001e80830f4240808601499beb042d80a0000000000000000000000000000000000000000000000000000000000004dab0c0c0 -f8f3f8efa0f9068922b9064435ddff0f0d48db7f4bb67f35adfa6e11c7b50d2d21c4c3b393a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001e80830f4240808601499beb3ee280a0000000000000000000000000000000000000000000000000000000000001ae46c0c0 -f8f3f8efa092d78e2a2cae49fb4ad34c733409e192c76c72b706a4bec4ce3442f843695ea2a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001c80830f4240808601499beb302880a0000000000000000000000000000000000000000000000000000000000003355ac0c0 -f8f3f8efa024eb76f9df4cd1947965ab2eaa3900eea96fb8ec556b83d90f9cc85e83f38276a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001f80830f4240808601499beb551b80a0000000000000000000000000000000000000000000000000000000000000fb9ec0c0 -f8f3f8efa0f03337d44374386e3fcdae26a42bc669eda32579346c967f801f6353cc7af8e7a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002080830f4240808601499beb62f680a0000000000000000000000000000000000000000000000000000000000002a9a3c0c0 -f8f3f8efa03c75383ab74fb9f80c4a6f55a186cc08001ee9842f335a65902f7a2db9a1bc56a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002180830f4240808601499beb852980a000000000000000000000000000000000000000000000000000000000000152fec0c0 -f8f3f8efa0ed6e5cad16c98f77353950408594a3c72594b71337c84dc12548e884570a7083a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001d80830f4240808601499beb58b480a0000000000000000000000000000000000000000000000000000000000005d64fc0c0 -f8f3f8efa0767c5a6025b3fe3d91b7f5c344f3a9e690f605ecb392062cbb9c5faeed34a071a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001e80830f4240808601499beba14b80a00000000000000000000000000000000000000000000000000000000000007480c0c0 -f8f3f8efa0f540dde2f457214a1c00fae6f75ba466016956592c37f0bf5e042d569f11d0e5a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001f80830f4240808601499beba8b080a00000000000000000000000000000000000000000000000000000000000000ac0c0c0 -f8f3f8efa07ae78cbcc719621397c5a7e0891834862df53dcdd563c75724dab7752ffc0b45a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200001f80830f4240808601499beb40a280a0000000000000000000000000000000000000000000000000000000000008f5e2c0c0 -f8f3f8efa02c2c199e3c917c001609def65a86ee32308e91c2395b0ac7c3ddef61308987b8a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002280830f4240808601499beb971d80a000000000000000000000000000000000000000000000000000000000000232ffc0c0 -f8f3f8efa0db146baa751ed32aa84462ef53b65eddaee46850ce7077690f037a6ea9e46e6ba0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002380830f4240808601499bebb36580a0000000000000000000000000000000000000000000000000000000000001ce61c0c0 -f8f3f8efa001f2aa57f616b296c5bd3b312cc1673a608ee0f847b152ec0448a8462360cc78a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002080830f4240808601499bebaeb980a000000000000000000000000000000000000000000000000000000000000286c0c0c0 -f8f3f8efa08cf3ed95e951111b29c93fa69aaf367ca0706cb7501bfd0bc09f77f62896d575a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002080830f4240808601499bebab1f80a0000000000000000000000000000000000000000000000000000000000003c1f5c0c0 -f8f3f8efa0804ffa27ee089c237fc6a26421bcfdd6def1b78c060ff9d851b8fe109be77316a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002180830f4240808601499bebcef880a0000000000000000000000000000000000000000000000000000000000001308dc0c0 -f8f3f8efa068b5f29fa39440eb903739a33588d5412324b2ec415728dc3a24de66c2f7781ea0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002480830f4240808601499bebcb0580a0000000000000000000000000000000000000000000000000000000000001b13ec0c0 -f8f3f8efa03863993d6869f1ea102a2e39d43bbd4cba9ab6c15c40f08882e54117f436e1cba0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002580830f4240808601499bebe17780a00000000000000000000000000000000000000000000000000000000000013ed3c0c0 -f8f3f8efa00b81ffefd7c14325237726f4261d8a5234ade02569b1ed22d29eb754a35c7b97a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002180830f4240808601499bebda5380a0000000000000000000000000000000000000000000000000000000000001da18c0c0 -f8f3f8efa05ed4bffe533d4bf104d020cad3dc20c9abe9dd66ca77d85d078150cb0355a9bfa0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002280830f4240808601499bebdf4a80a0000000000000000000000000000000000000000000000000000000000001cafcc0c0 -f8f3f8efa0b1b8f51be1e9837b0d933259e373b5f452745aa7fcac5705633214ee922358e7a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002680830f4240808601499bebf26d80a0000000000000000000000000000000000000000000000000000000000000daa5c0c0 -f8f3f8efa041151e2bbee318c196822d638be9b937438e0006d56436090f4ec7dd32293d7ca0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002780830f4240808601499bebfea680a0000000000000000000000000000000000000000000000000000000000001b85ec0c0 -f8f3f8efa0532f7a3031cbee6378cdd41d4ac1cccac1fb4cb6a16c3efc60a41f4fd12c03cba0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002280830f4240808601499bebf2a780a00000000000000000000000000000000000000000000000000000000000033aafc0c0 -f8f3f8efa0916c7bd36ca217f9ba80ef3b156ca95cefde1d96a8e76a609e60393e11eae364a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002380830f4240808601499bebf6de80a000000000000000000000000000000000000000000000000000000000000561ebc0c0 -f8f3f8efa0a97e7c11bb73076a076c8c0e58e9b0bb7c2c31001ec774a0147d30480a4a6ea6a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002380830f4240808601499bec1b7d80a0000000000000000000000000000000000000000000000000000000000002fa24c0c0 -f8f3f8efa0ae7186fb08ede840f9e216d0595d9909d9221db96eedd65a2292528aee07dbdaa0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002480830f4240808601499bec39d280a0000000000000000000000000000000000000000000000000000000000000cc8fc0c0 -f8f3f8efa055bdf8020faaf99a67ecfee3134d146015b9bcac5921bb5e433ab0f2f9a07cdba0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002580830f4240808601499bec456480a000000000000000000000000000000000000000000000000000000000000032e5c0c0 -f8f3f8efa0424161518705e296c430cc3705a3e4397ab61d29ee68fca5f2f3a65b5211a4eca0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002680830f4240808601499bec49ad80a000000000000000000000000000000000000000000000000000000000000035f8c0c0 -f8f3f8efa07caad155a0c98d102068ab959076b69449d74632805e173976690e6c5c3aab4da0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002780830f4240808601499bec4e2180a00000000000000000000000000000000000000000000000000000000000001d39c0c0 -f8f3f8efa08a033322e2fa721687e07ea654fd51ec3f5c5ee4656a1f97f8dc3c89096f9566a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002480830f4240808601499bec415a80a0000000000000000000000000000000000000000000000000000000000001695cc0c0 -f8f3f8efa0f834b5b07c213c36b9f5051e514ad5e778e92dcb6e376484c7ceaa28726f1296a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002580830f4240808601499bec544980a00000000000000000000000000000000000000000000000000000000000001d79c0c0 -f8f3f8efa06d4d43b1a2543c689ebb2d098cd953d7c774be1760bea0c8d2d2f8dbda164c14a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002880830f4240808601499bec516f80a0000000000000000000000000000000000000000000000000000000000000f268c0c0 -f8f3f8efa0d0a8023e5335685e04686ad5b15852bdf7184ff651a0961ceb774e19a05e35afa0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002980830f4240808601499bec5eb680a00000000000000000000000000000000000000000000000000000000000009be4c0c0 -f8f3f8efa023fadf819a3863e4a93c41434b5cab8dca00810bfacb68299f8484b8bef06569a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002680830f4240808601499bec579d80a000000000000000000000000000000000000000000000000000000000000137dcc0c0 -f8f3f8efa07bc0eddb475c5bfabc009af858c9c4f71a149d47d812a681c725476f61addfdfa0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002a80830f4240808601499bec680380a0000000000000000000000000000000000000000000000000000000000000c18bc0c0 -f8f3f8efa051520b9ab6c93891ccffe5ef86b863e26a5e0e5321564e09fb6ed28efd5f3d29a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002780830f4240808601499bec683880a0000000000000000000000000000000000000000000000000000000000000dba7c0c0 -f8f3f8efa0a1eba7354ed89790e55807a98909ae4d1432c09c5fda4a596ff3c18fd688dd36a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002880830f4240808601499bec156280a000000000000000000000000000000000000000000000000000000000000920ebc0c0 -f8f3f8efa01a9916fd59a2b50fb0f5632e5292e2e2ae7cc396802c9eaf958e2633f4c2a82fa0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002b80830f4240808601499bec730b80a0000000000000000000000000000000000000000000000000000000000001def1c0c0 -f8f3f8efa080d5015387cf132799ab8fbbc47728a42ed3d575488a9fbe8a0419ccd3e62b78a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002880830f4240808601499bec747380a0000000000000000000000000000000000000000000000000000000000001ee61c0c0 -f8f3f8efa0c4eedb3d830c255878443a401f2a604926a87e89dae5b29f4f29881f13760b00a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002980830f4240808601499bec853d80a000000000000000000000000000000000000000000000000000000000000097f4c0c0 -f8f3f8efa061b0d9bf97c5ee334a50d6a06222085c75a06c550692812e06d86e20426ddaeba0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002c80830f4240808601499bec8b9080a00000000000000000000000000000000000000000000000000000000000002f86c0c0 -f8f3f8efa020c829d6f3529b81fe5b0f91b488b9eb32cdf0f5c0ece6594e29844e8afc53a5a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002980830f4240808601499bec8da080a00000000000000000000000000000000000000000000000000000000000001706c0c0 -f8f3f8efa0bcfac95ad81d1c161fbcbbec9bc4c9ab3f0f2b6178a60cf6a823dfd6ebeb32e5a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002d80830f4240808601499bec8fbb80a0000000000000000000000000000000000000000000000000000000000000f6c7c0c0 -f8f3f8efa0f1607f93d23e2c2612bd920da27ab9cba770ca07bd2cf2a4feab2f72928f4b92a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002a80830f4240808601499bec8e5380a00000000000000000000000000000000000000000000000000000000000025c78c0c0 -f8f3f8efa0b5f79b2c6d3859452fd03381c505b207f6973886e769ed503f57314145ae201ea0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002e80830f4240808601499bec9d4a80a00000000000000000000000000000000000000000000000000000000000020deac0c0 -f8f3f8efa070277a11509194d7356edfa20e069b4b3c200004fda8a6afb349d2f7fb880ab8a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002f80830f4240808601499becb80680a00000000000000000000000000000000000000000000000000000000000014d2cc0c0 -f8f3f8efa004d0a117563ef59133cf4822792572f36142f88376e02f6df9115bf5d3795bb1a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003080830f4240808601499becc9c080a00000000000000000000000000000000000000000000000000000000000000d2ec0c0 -f8f3f8efa011ca4595454fe47edd693e409dc9acc3e2c509252eccb798f0b57ef953db1414a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002a80830f4240808601499bec90ae80a00000000000000000000000000000000000000000000000000000000000050078c0c0 -f8f3f8efa0f072bf517f364c5e0520608596f87e65ffbab12cabe312e188506c0ff80d44d2a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002b80830f4240808601499beccf2880a0000000000000000000000000000000000000000000000000000000000001431ec0c0 -f8f3f8efa035c8b6c28b93d7e0b92c4a35611f8072b8369776b739b99c9498c772f8f1e6f6a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002b80830f4240808601499becacef80a00000000000000000000000000000000000000000000000000000000000044f71c0c0 -f8f3f8efa0b1e6074d836d71c5cdd4f65ccfdb4f6af010b905071d3496ac74942c3d3b909aa0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003180830f4240808601499beccc5780a0000000000000000000000000000000000000000000000000000000000001e09cc0c0 -f8f3f8efa07c28dfafc08d1d261c8c622014d48bb4072260f4bb5a6ba277c2fa45b6bf3e2aa0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003280830f4240808601499bece4de80a0000000000000000000000000000000000000000000000000000000000001883cc0c0 -f8f3f8efa0a9510a4e7a809e2818d7bf2629cb96a220575681994e9169c1f4ea396bf26202a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002c80830f4240808601499bece04580a0000000000000000000000000000000000000000000000000000000000001f284c0c0 -f8f3f8efa0795522ad0583a8e396f0aba045a8f50fc274d6d06cb0a71fc21f2447d9738e91a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002c80830f4240808601499bece2ba80a0000000000000000000000000000000000000000000000000000000000002b536c0c0 -f8f3f8efa06441d3b630bb8a062de40696a9c0ceacc2d94152c52841a87c073eca2bd38425a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002d80830f4240808601499becf9c880a0000000000000000000000000000000000000000000000000000000000001392fc0c0 -f8f3f8efa055744c1090a7ccf2d2cb9209e3ae1b2a772520e6d54c10fd8155df76f167f652a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002e80830f4240808601499bed0a8380a000000000000000000000000000000000000000000000000000000000000003c3c0c0 -f8f3f8efa04422e5903c71d04479ffcf25f5ba424317ace033be9de311a5e2a00c11da44e6a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002d80830f4240808601499bed057280a0000000000000000000000000000000000000000000000000000000000001493fc0c0 -f8f3f8efa0a81f3b2b47a93793bec3fb0b310ba092ccff4e50fb2d04a7a4b77b2ccd1fd53aa0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002e80830f4240808601499bed16e280a0000000000000000000000000000000000000000000000000000000000001b077c0c0 -f8f3f8efa061694dc7758c69f30739731337939c3d4bf4309c478d2682371011f6f91fe6d2a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003380830f4240808601499becf96980a0000000000000000000000000000000000000000000000000000000000005278bc0c0 -f8f3f8efa09738b9a63ee59cea4f1ffc2de6c225e78c5f7ffb3dbc3f3ce1513066b019993da0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002f80830f4240808601499bed2d4880a0000000000000000000000000000000000000000000000000000000000001f074c0c0 -f8f3f8efa080b3f511bb253b034cc6735dc48edf2bc0fd9840a8a26460b572614eb533ed9fa0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200002f80830f4240808601499bed0c9c80a0000000000000000000000000000000000000000000000000000000000004f4c4c0c0 -f8f3f8efa0012617d9177440c99b49235a8bb621ca637cf2a372ca93ff348c88c38915e7a7a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003080830f4240808601499bed469c80a0000000000000000000000000000000000000000000000000000000000000d567c0c0 -f8f3f8efa037bd61fd37261810aa1c59f4ec16690e0b8c7063791e17bb541e59282415b36da0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003080830f4240808601499bed4a5e80a00000000000000000000000000000000000000000000000000000000000018099c0c0 -f8f3f8efa0b59c036aea9e59aa17e09eb83cf031b9272e849e6705d4cd563cc322e1cfe09aa0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003180830f4240808601499bed52ab80a0000000000000000000000000000000000000000000000000000000000001001bc0c0 -f8f3f8efa06ab85f875c38896c1af5b4a6ef68e2d4cc6dbee5de58d23e6b3c861464da058ca0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003480830f4240808601499bed399980a00000000000000000000000000000000000000000000000000000000000036effc0c0 -f8f3f8efa012117ab327bc88ecd205a6e8ae2e96bedc0692ef7cb80d3ccb8a9430ecaf43c4a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003280830f4240808601499bed60a880a00000000000000000000000000000000000000000000000000000000000009c2dc0c0 -f8f3f8efa05c7b948fd788f5b091d7b1202a6f09258012bbfe0ccbbabfe081f0cd57e91b97a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003380830f4240808601499bed69f180a00000000000000000000000000000000000000000000000000000000000017ce3c0c0 -f8f3f8efa0fc09664116fcb24b8cd48caaeb327061ef1740fd86d3ef3a922820c72ac11fd1a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003180830f4240808601499bed5e6880a00000000000000000000000000000000000000000000000000000000000030d17c0c0 -f8f3f8efa0811f48e3a921c8885e1b2ff1fa2e430903ecc0ab57a127fd14d55601b18b4ec0a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003480830f4240808601499bed7dc880a0000000000000000000000000000000000000000000000000000000000000a090c0c0 -f8f3f8efa0651da925ed9b627b4f9cbf50112569c0d929f1285b269ceccad4be1e6ffabaa4a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003280830f4240808601499bed851280a0000000000000000000000000000000000000000000000000000000000000109ac0c0 -f8f3f8efa0fa9aa2000ce93d1d118623f8d0d1489e5ca54394b76a38fa6ff4c5de16268e17a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003380830f4240808601499bed87ce80a00000000000000000000000000000000000000000000000000000000000001754c0c0 -f8f3f8efa0a258a7ed82a9e58e5a88760823ec30b1f65d642f8e617fe823e0391ac814b880a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003580830f4240808601499bed873b80a0000000000000000000000000000000000000000000000000000000000000ef4cc0c0 -f8f3f8efa0430bd5a794ae2b992a4a4a84197e2195afd5df810599235c97a59524f00b09e8a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003680830f4240808601499bed947080a00000000000000000000000000000000000000000000000000000000000004bacc0c0 -f8f3f8efa0b9e067495bd0ef882e09688fb74858eb5d93ec23a3751cc2ee1cfbe6e93c230ba0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003580830f4240808601499bed64dd80a0000000000000000000000000000000000000000000000000000000000004c1e9c0c0 -f8f3f8efa0eb59a124406190b20ebbe41e08ec3a1e489b0d7dd69f20850736a0ab0680a93fa0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003680830f4240808601499beda00a80a00000000000000000000000000000000000000000000000000000000000003180c0c0 -f8f3f8efa06188441a4f49412732009d4f85da86847f19caafd2e281251578ca70be13d9dfa0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003780830f4240808601499bed99fa80a000000000000000000000000000000000000000000000000000000000000113fac0c0 -f8f3f8efa0d55b21fb2ecc56f76307146bce565c42c06aed77955fc060d0fd70a63313afdaa0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003880830f4240808601499beda8f580a0000000000000000000000000000000000000000000000000000000000000208fc0c0 -f8f3f8efa09e72551bd9d3a1151547d1397c6dbe1f91a7665645de4c53adfda98cda5ef51aa0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003780830f4240808601499beda44980a0000000000000000000000000000000000000000000000000000000000000c178c0c0 -f8f3f8efa0f499087ebf34a29fbcc647bd5f07660c3047c2deb9566bd31340f56abf18aa90a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003480830f4240808601499bed8ade80a000000000000000000000000000000000000000000000000000000000000351bcc0c0 -f8f3f8efa0805ee8a2853d2531ea217ffbe9a0dc97bbba5fdef7f132dcb1f121a93b28c764a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003980830f4240808601499bedac6980a0000000000000000000000000000000000000000000000000000000000000bef0c0c0 -f8f3f8efa069b12249b0f33b15c00859b3bff2f035be824ac778c7c062b1b8d41829a16d12a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003880830f4240808601499bedaf5c80a00000000000000000000000000000000000000000000000000000000000014835c0c0 -f8f3f8efa0830ce46de6647d7febebd34ea072e893930b2895eab3f23d85778f593f7af19fa0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003580830f4240808601499bedb4e180a00000000000000000000000000000000000000000000000000000000000014743c0c0 -f8f3f8efa0237e620d7071a0095b223fbea86bc62c7a54237e0bc8b50944e355f84bcd889fa0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003980830f4240808601499bedc0a480a00000000000000000000000000000000000000000000000000000000000004ec0c0c0 -f8f3f8efa0f297d66dd0aac9c550938e27178ecdde20433ab7038c0bd17a61a7f8ab2af000a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003680830f4240808601499bedc62e80a0000000000000000000000000000000000000000000000000000000000000bb7dc0c0 -f8f3f8efa01cc480617c8bedd2d4b85265f75acc43a9a07cc338d8247d933cb882b248bad5a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003a80830f4240808601499bedc64580a00000000000000000000000000000000000000000000000000000000000015ff0c0c0 -f8f3f8efa0c4d7dd58dc26c6ae30dd0c29d23bbc2ded0de7e9a3f4f7a7a55873c8a1bfe3e8a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003780830f4240808601499bedd0e980a0000000000000000000000000000000000000000000000000000000000000aa4cc0c0 -f8f3f8efa003aeedfc2fea4ec2ae29448f513a1ad157febb78cf33eae00f6013e9ad77d286a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003880830f4240808601499beddadc80a00000000000000000000000000000000000000000000000000000000000004ad6c0c0 -f8f3f8efa0a1db256d3a3d29032d4b3e982e5dae0b7bae7027ef0460130ddea3d3410f8694a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003b80830f4240808601499bedd8b580a0000000000000000000000000000000000000000000000000000000000000c0cbc0c0 -f8f3f8efa0d6b019c70bbd3c88d564ace5f6e7bef45c52eac897ad187c5c57b553674e25e2a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003980830f4240808601499bede05a80a00000000000000000000000000000000000000000000000000000000000002996c0c0 -f8f3f8efa007e65cd8f8975ced72065264b9afd72e2be1e54ffb7e94616fc6d4a351e7832ea0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003c80830f4240808601499bede3b680a00000000000000000000000000000000000000000000000000000000000006db9c0c0 -f8f3f8efa00ca7cbc392d1c651ef65599952ea4e5523bb3bdd98793b18a60320628787f825a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003d80830f4240808601499bedead280a0000000000000000000000000000000000000000000000000000000000002e20cc0c0 -f8f3f8efa0d938404b8c338292703267ef2c63fa499dd0f379475731760c1c7e49c33080fba0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003a80830f4240808601499bede43b80a000000000000000000000000000000000000000000000000000000000000382c3c0c0 -f8f3f8efa0f2bedc126aeaa73c0dfbb4d1c606ea66ff51f4169b399c4b24a70cc41d14b252a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003b80830f4240808601499bee109b80a0000000000000000000000000000000000000000000000000000000000000ff6ac0c0 -f8f3f8efa099c316cdf21cbce79023525b73133ee1badc37052d1156a9ce138bd2946b4239a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003c80830f4240808601499bee1e9380a0000000000000000000000000000000000000000000000000000000000001f44fc0c0 -f8f3f8efa0cc7b6c3bcedbfabf850398cf0b0c71cf2ae15bc19cfc18e11c0124ff3c99691aa0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003a80830f4240808601499bedb74a80a000000000000000000000000000000000000000000000000000000000000a9396c0c0 -f8f3f8efa08560084806935f9d3bd64ba30fc8ef2f1502d7e88330aaecb1ec6e6406c7c638a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003b80830f4240808601499bee38bb80a000000000000000000000000000000000000000000000000000000000000121eec0c0 -f8f3f8efa09c74db263eb2b97fe0f19c9713d90a62a25357cf2599048d87ec0cd04b18f897a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003c80830f4240808601499bee485480a00000000000000000000000000000000000000000000000000000000000048bdec0c0 -f8f3f8efa095f25ee4d780575a9624a09ca1f5e6e34988e9257dc6c4f860e22c3761ce7b3ba0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003e80830f4240808601499bee0f9980a00000000000000000000000000000000000000000000000000000000000093cfec0c0 -f8f3f8efa0da1e3f70d47f6683ca61d93590d40fa0818d6e79f2ea9080908fa4cdbaebab63a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003f80830f4240808601499bee811780a0000000000000000000000000000000000000000000000000000000000000237cc0c0 -f8f3f8efa0f1b2681c4030aa7189a9fc5fe5e2c3b6874d514b4c078aaa3da2d6c512a3daf1a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004080830f4240808601499bee84ae80a000000000000000000000000000000000000000000000000000000000000113a9c0c0 -f8f3f8efa035bb8b320d08e2d9df20c95eed56b06d36d4350ea25133d33902dc3ac61bf392a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003d80830f4240808601499bee382780a0000000000000000000000000000000000000000000000000000000000007a2a3c0c0 -f8f3f8efa0521d78bc90416828bfd61eb79340d2672fb86aeb05e1ef6c71e047e09115a347a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004180830f4240808601499bee93ab80a0000000000000000000000000000000000000000000000000000000000000a72cc0c0 -f8f3f8efa01fe90fa5c68b8252a6d89409f6c1c2566bb8e71c33e9b209fd6b6876b5d26fe9a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004280830f4240808601499bee9d9a80a000000000000000000000000000000000000000000000000000000000000015e3c0c0 -f8f3f8efa09fbf2ef8bfb7439109bb55dd496798463fc9f3b964b6693c689766c189e49a61a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004380830f4240808601499beea08b80a000000000000000000000000000000000000000000000000000000000000025c1c0c0 -f8f3f8efa0e7aa1311869eb992225b95bc1c40e8b0aa0c712afad0fafe9d3f033de9bc91c6a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003d80830f4240808601499bee811080a000000000000000000000000000000000000000000000000000000000000319b8c0c0 -f8f3f8efa02e7b8ba9ac5842cc398bb3ffa3179a756309da3888a628814d68140e4e02c8c3a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004480830f4240808601499beea44180a0000000000000000000000000000000000000000000000000000000000001203ac0c0 -f8f3f8efa00c0df08b2b8ddf8fba16e115ab10cd7067ec36efe583759c9e98e6b5f62133d4a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004580830f4240808601499beeb3be80a000000000000000000000000000000000000000000000000000000000000050fdc0c0 -f8f3f8efa03670df0485426950c27fbb84ee4f9649f5bd76497e5c940763019093d7c1f3f5a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003e80830f4240808601499bee964080a000000000000000000000000000000000000000000000000000000000000413c9c0c0 -f8f3f8efa0ca108c90efe794b1ebbcaf0bf6be77d6a7bc7060ba4d4f5775ad1920858f4589a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003f80830f4240808601499beec96a80a00000000000000000000000000000000000000000000000000000000000005772c0c0 -f8f3f8efa0410551ad72d37069056013c641b456b98326c3fc068c256442051d0b64377125a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003e80830f4240808601499beea87b80a00000000000000000000000000000000000000000000000000000000000043adac0c0 -f8f3f8efa0f474b6e779592d33da1096476a0bafc36f8225567448b06ebbb73afebae757e0a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200003f80830f4240808601499beedd7f80a00000000000000000000000000000000000000000000000000000000000024363c0c0 -f8f3f8efa0a4e90789bf4385b23224a2429ca11a4755158b98184638a0719375a142ac7b02a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004080830f4240808601499beefac280a00000000000000000000000000000000000000000000000000000000000001ad3c0c0 -f8f3f8efa038b2eacb14dc5fd665b943d57fef6a28c59ce685cee14120f8cf0eab933e7013a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004680830f4240808601499beeb97280a00000000000000000000000000000000000000000000000000000000000060410c0c0 -f8f3f8efa07437a7886a9b349f9f93253b135df82e3daa77c8b1caec779ec0a6123b9a7a85a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004080830f4240808601499beecf8180a0000000000000000000000000000000000000000000000000000000000004d9b2c0c0 -f8f3f8efa0c7b07c5cc4ba15e6196da9f39bfc4537aef78b94ab194e2c7ffd127084806158a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004180830f4240808601499beefdf580a0000000000000000000000000000000000000000000000000000000000001427ac0c0 -f8f3f8efa0745e232333b39d260432d1403b12c8329d3170b2a36a30580bd153c9bf715d5ca0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004780830f4240808601499bef043f80a000000000000000000000000000000000000000000000000000000000000115cec0c0 -f8f3f8efa0e6f861c9fe1a8c108a9a349b2950a4863e15c1f22c6173ff3cf3a959d0e87e98a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004280830f4240808601499bef0f2d80a00000000000000000000000000000000000000000000000000000000000016f5ec0c0 -f8f3f8efa0feeb9638a9a8f3ccbb68a5af81f56d23f17b170a188ce3e14f9fa9af130caa1ea0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004880830f4240808601499bef134b80a0000000000000000000000000000000000000000000000000000000000002284fc0c0 -f8f3f8efa0479ddd48d688aae0be664994183127821a0da9d544906085158895ddc384dddea0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004380830f4240808601499bef227380a000000000000000000000000000000000000000000000000000000000000190c3c0c0 -f8f3f8efa061d96e7713765e91c69ad802a6e3b85090fcba718d13eeedacb1e09795029caca0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004980830f4240808601499bef2f3280a0000000000000000000000000000000000000000000000000000000000000e77bc0c0 -f8f3f8efa0172ed2b8c0443753559675c3dea73e6d12bf3595c2cd1371aa8cecdc0247d8eaa0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004180830f4240808601499bef0c1680a0000000000000000000000000000000000000000000000000000000000004f07fc0c0 -f8f3f8efa06e3952e1a78e07e32eea0fefbde418c671178d84c10f49ace5d4a084b7f1c643a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004280830f4240808601499bef499f80a0000000000000000000000000000000000000000000000000000000000003455bc0c0 -f8f3f8efa04658cef57f898636088a4d66d5d65e3ded9150d7725f11947f87a7060645178da0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004480830f4240808601499bef373a80a0000000000000000000000000000000000000000000000000000000000004ce8ec0c0 -f8f3f8efa088ee460806f1a40b6afbaa84fb1a885b19b6c9f60ac9b60c588e9175cdea89e8a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004a80830f4240808601499bef3c0b80a0000000000000000000000000000000000000000000000000000000000004acafc0c0 -f8f3f8efa0a2872231c4fc9c0321c76f7b6a73600e84874215cfc8a2527259aa83534cee65a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004b80830f4240808601499bef768080a00000000000000000000000000000000000000000000000000000000000003aa8c0c0 -f8f3f8efa0c2414dacde20271f21bfb99020835a9289d0510c14b2defdce1812b0d50672b3a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004c80830f4240808601499bef7b2b80a00000000000000000000000000000000000000000000000000000000000017297c0c0 -f8f3f8efa0e5d195187a7d9469949032f9ad4410435e93ccf20c1b6a91acffbbd01c97e442a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004580830f4240808601499bef735680a0000000000000000000000000000000000000000000000000000000000002a141c0c0 -f8f3f8efa08b7dc009330f5f99f265858516fac3c39a4883e793f75e13636bdd5d26967028a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004380830f4240808601499bef732980a000000000000000000000000000000000000000000000000000000000000308ddc0c0 -f8f3f8efa096bef9076325938dab985c050d5df25b18c177bb320f4098ddb9a3b5390eee0ea0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004d80830f4240808601499bef8ea080a0000000000000000000000000000000000000000000000000000000000000c80fc0c0 -f8f3f8efa009ca8a0f1afed8775299996d6a358191f9d0e3c3f491fbe0f528802d77abd676a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004680830f4240808601499bef950780a0000000000000000000000000000000000000000000000000000000000000ae2ac0c0 -f8f3f8efa0e66672480ec3813526386cbd17647ff6cf43ef0b07987147d8acf60efa42029fa0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004780830f4240808601499bef9f3c80a00000000000000000000000000000000000000000000000000000000000002091c0c0 -f8f3f8efa08f6c5e2836e15674d897e19252088573a955ed705fcf32102867ac3d6a4c2ebca0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004480830f4240808601499bef99b380a00000000000000000000000000000000000000000000000000000000000015a93c0c0 -f8f3f8efa0482e1f8f4afe08096f8abd8ef620672e38d37726ce365eb657ba49cac8ef26f2a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004e80830f4240808601499bef9a0880a000000000000000000000000000000000000000000000000000000000000167f8c0c0 -f8f3f8efa0fd6f1f552c8c1a148849b3a1b40b6557417bdb81320b206f6fb56f29c893a3e8a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004880830f4240808601499befa2bd80a0000000000000000000000000000000000000000000000000000000000001da91c0c0 -f8f3f8efa09fd569dbdeeb3c0038de5762207e0930d0c90a706945dfa6eb5c8e9e2241252aa0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004f80830f4240808601499befacdf80a0000000000000000000000000000000000000000000000000000000000001055dc0c0 -f8f3f8efa0bfc6500926248644223a1634c64516d229f6ac34bcd2a49a66f48ee8388758a6a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005080830f4240808601499befbb4280a0000000000000000000000000000000000000000000000000000000000000a03dc0c0 -f8f3f8efa0ba54847751cbeab3b48d6c19d3aa877c93067486e3986da9d184947d7ea8c47ba0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004980830f4240808601499befbb0f80a000000000000000000000000000000000000000000000000000000000000133aec0c0 -f8f3f8efa0c607469488234c11aab16f9549015ef3f06dff241322ca2d3038d1fcdf99df17a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004580830f4240808601499befac0080a00000000000000000000000000000000000000000000000000000000000030c7dc0c0 -f8f3f8efa0487cb7a768549f98d3a649d7c9592277ca70cc006e6fafaa043aca8f924eb4b6a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004a80830f4240808601499befcb8380a0000000000000000000000000000000000000000000000000000000000000b047c0c0 -f8f3f8efa0de75d7c165d8cce778d126efde16bebdbe6ea6606837201c4d12985c98c04059a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005180830f4240808601499befc4d380a0000000000000000000000000000000000000000000000000000000000001dd8dc0c0 -f8f3f8efa0b59695851e14238cbe6867ab9c35cda3a0c291e1abc66157fd1339da1bfcdee4a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004b80830f4240808601499befd5c180a0000000000000000000000000000000000000000000000000000000000000b08fc0c0 -f8f3f8efa0fe02a467a339c034e081662eb24d1443142eae2eab6610b9f3a7842f65b38335a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004680830f4240808601499befd2c380a000000000000000000000000000000000000000000000000000000000000100cfc0c0 -f8f3f8efa0982f2e375872ffb275806a3db14e7b5d2d756ad4528c1cee699c7e4831b1ddf6a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005280830f4240808601499befdd2b80a00000000000000000000000000000000000000000000000000000000000004712c0c0 -f8f3f8efa0aa4348f8d5c0823ebfc2d0f1003bd40f024f8ab2bcd369584f241e6ed7f72d27a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005380830f4240808601499befe27c80a00000000000000000000000000000000000000000000000000000000000005fa8c0c0 -f8f3f8efa03d0570bcfc9e39dd14f444529f5eebc901461628899b6e074383b50ae760dbb0a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005480830f4240808601499befe8f180a00000000000000000000000000000000000000000000000000000000000001029c0c0 -f8f3f8efa0bbb4727e64e6e771b9451d29036513665f55e8f32e13668e8c7454437fd2e010a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004780830f4240808601499befe0b580a0000000000000000000000000000000000000000000000000000000000000c0ecc0c0 -f8f3f8efa023f817379c33dd41adc4a5851193b6a7bd8d746359e937768b28740b4c0daceba0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004880830f4240808601499befebba80a0000000000000000000000000000000000000000000000000000000000000bb6bc0c0 -f8f3f8efa0ffbb4ea4e002a41ef6decb98b7654bc1578ce9b29f4105a6c52631961187112da0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004c80830f4240808601499befdff480a0000000000000000000000000000000000000000000000000000000000002459ac0c0 -f8f3f8efa0f2adff36367452574dff60622db915ea79d024b2add13daacb573699a6509c52a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004980830f4240808601499beff67d80a0000000000000000000000000000000000000000000000000000000000002dfadc0c0 -f8f3f8efa050025e0cf32a9a1f8473ba3ec1afffeb4c8a5e63fafcf64cf5b5ef658a940e11a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004a80830f4240808601499bf01b1c80a000000000000000000000000000000000000000000000000000000000000064e8c0c0 -f8f3f8efa08f531281b23f2391d4f29ee3ede6e11f510c7836b232e9af1ec616c03460ae9ba0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005580830f4240808601499befeba880a00000000000000000000000000000000000000000000000000000000000049240c0c0 -f8f3f8efa0763d7da06f43bd920bd046ff218212878a7ca029edcc00909bf264f9ceae50e5a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004d80830f4240808601499beffd3f80a00000000000000000000000000000000000000000000000000000000000056cd7c0c0 -f8f3f8efa05600cf0293dbf0443f1b985241943382d13ca2f2e84e0e1182392c62845a4eefa0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004e80830f4240808601499bf040b480a00000000000000000000000000000000000000000000000000000000000001681c0c0 -f8f3f8efa09149deb0057c9d8b4979b1fdbba50adec0c75a977b4998d53aaf206e78de5777a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005680830f4240808601499bf024c480a0000000000000000000000000000000000000000000000000000000000002a355c0c0 -f8f3f8efa00dca13774b2d519b567798dd4098e231cac2e12d87fd02e463601830073bea53a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004b80830f4240808601499bf021ca80a00000000000000000000000000000000000000000000000000000000000033a29c0c0 -f8f3f8efa033831d99532c818ed7a860f91137790f12d8648c43f712ce8f71448d2ca11ee8a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004f80830f4240808601499bf043b580a00000000000000000000000000000000000000000000000000000000000025a3ec0c0 -f8f3f8efa02f45254807c5ba59f9b439dd616e911cf875609d561ae9d129d55b94b96b135aa0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005780830f4240808601499bf0468680a0000000000000000000000000000000000000000000000000000000000003f49ec0c0 -f8f3f8efa09ac7e902fbd0299c5ab19e04a9d3bcf14c194a87be61e7c140bea0f7f604c0f6a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005880830f4240808601499bf0784280a0000000000000000000000000000000000000000000000000000000000000341ec0c0 -f8f3f8efa05a466092be341b2cdd660d765d0fbb8324eb726a1b12c6cc579ca65ce274ebeaa0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005080830f4240808601499bf0620b80a0000000000000000000000000000000000000000000000000000000000003355ec0c0 -f8f3f8efa0d9e7d199814c22173dbe5d6b5b431a0a974197a1e7923a16ba2fddd99b2cfe7fa0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005980830f4240808601499bf07cae80a00000000000000000000000000000000000000000000000000000000000013aecc0c0 -f8f3f8efa0784e6098b4ae7cb3ec959eb6bb74e36d639c4181bcf4287724a055b02029fb78a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005a80830f4240808601499bf08d7c80a0000000000000000000000000000000000000000000000000000000000000726ec0c0 -f8f3f8efa0466d335b48ab7ce62c2559712b8c46a69a3a04d429a389286484a69df3405e8ea0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005180830f4240808601499bf08ad080a0000000000000000000000000000000000000000000000000000000000001fb36c0c0 -f8f3f8efa06af93f1713a3f10c0d61cbeb4564f6d1e16e209535dd10bdbb5af1c45729f0d7a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005b80830f4240808601499bf094de80a0000000000000000000000000000000000000000000000000000000000001abf0c0c0 -f8f3f8efa08d59eeae7d2fd06d81795770619efdc357ed15e01b649ae1181ac7603a59cd2ca0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004c80830f4240808601499bf04ab780a0000000000000000000000000000000000000000000000000000000000007ce1ac0c0 -f8f3f8efa004ead6ca31328d0e24d08697237b47bbf85e61214473d55cfb84e9e68b89a361a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004d80830f4240808601499bf0ab1280a000000000000000000000000000000000000000000000000000000000000115a4c0c0 -f8f3f8efa00f5af75c450db186d4c606f10e4db8e85af93c022346a10bf4adbc64d96c9b97a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005c80830f4240808601499bf0ab0380a000000000000000000000000000000000000000000000000000000000000159e7c0c0 -f8f3f8efa03f5f38b78ea4dffc3969e1a34402a328ad4ca4485bc0a1ee3f3b893b239c395ca0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005d80830f4240808601499bf0bd3980a0000000000000000000000000000000000000000000000000000000000000df17c0c0 -f8f3f8efa01f8e1bd3d93acf2fec96582b235c39c368c0a2b399edb501bb6c6dbd31b5b77ba0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005e80830f4240808601499bf0c9b980a00000000000000000000000000000000000000000000000000000000000005033c0c0 -f8f3f8efa030338eca06f9d467ab4899c88bbbb8c94d166530ce7d8422c12c63e0a4939cb5a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004e80830f4240808601499bf0ba1180a000000000000000000000000000000000000000000000000000000000000282cdc0c0 -f8f3f8efa03f9c06fa0414e19133c956c294cc66ce45f6b59edda1a59fcc41d8199dce6f47a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005f80830f4240808601499bf0cf7c80a00000000000000000000000000000000000000000000000000000000000011b7fc0c0 -f8f3f8efa0bd085991e1a5ee0691eacb54a1132f491d725be29d694f779761b6224e9a28a8a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005280830f4240808601499bf0a4be80a00000000000000000000000000000000000000000000000000000000000059ed8c0c0 -f8f3f8efa0d4c284c8fe955ba92ce44e43e2be966356087d3dd6a0dd0ba525ffd35db0f0c9a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200004f80830f4240808601499bf0da5980a0000000000000000000000000000000000000000000000000000000000002334dc0c0 -f8f3f8efa0913f5cba9f1a9edc5cf2e808aeecd0f3bf8025aa937bc9a56f584182ad992252a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005380830f4240808601499bf0ea9380a0000000000000000000000000000000000000000000000000000000000001c0c9c0c0 -f8f3f8efa081f3de4cb58782e3172a72a413f0ca3bd609b64f4715bc7f43eef79453ac5e26a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200006080830f4240808601499bf0deb780a0000000000000000000000000000000000000000000000000000000000002fbfec0c0 -f8f3f8efa066f033fa14f5d84e1f082dc9a5b469c9087f7331146ac2e39b9abb49d0714085a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005080830f4240808601499bf0f6f380a00000000000000000000000000000000000000000000000000000000000015969c0c0 -f8f3f8efa0b9101450d7f307ae07c4a04a051346812a48df675ecb7ba5338fe1db8f0280b6a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005180830f4240808601499bf1093980a0000000000000000000000000000000000000000000000000000000000000439fc0c0 -f8f3f8efa0678388d1976ff9c7f2f355067db02d9b08e9d3576c35035982212fc69f888732a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200006180830f4240808601499bf104b680a00000000000000000000000000000000000000000000000000000000000018809c0c0 -f8f3f8efa092cc30e4b476c33d6cdd4d0dee16285610f142e92d8174ce0511dfce5631ddb0a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005480830f4240808601499bf101b380a0000000000000000000000000000000000000000000000000000000000002598ac0c0 -f8f3f8efa0524c17616bccac99cc87d445b1b3a31e51c75b28845731adaf244e328212c9d7a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200006280830f4240808601499bf1194380a0000000000000000000000000000000000000000000000000000000000000bfb4c0c0 -f8f3f8efa079dc2e3b4d4dd658765cde6cd33c6c362f27471588b1e42d68b56bd519ab1b32a0b30af3020ffa3efbcc1a583ac590baa6d114f776954456e13454eab35f5aa6b594f92c0f3e4825f09490ca264dc0cdacffeb566f06a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200006380830f4240808601499bf1242c80a00000000000000000000000000000000000000000000000000000000000001951c0c0 -f8f3f8efa0f3cde3285a1f48cd05e674dadf99d58da66b1824ba300a82b7031851f4517715a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005580830f4240808601499bf1201480a00000000000000000000000000000000000000000000000000000000000014fd5c0c0 -f8f3f8efa0f31b49b8a2a450a6145405a24f21075e44396e534c38feddbc9055b1e1e47163a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005680830f4240808601499bf131d580a0000000000000000000000000000000000000000000000000000000000000328bc0c0 -f8f3f8efa0bcc9f97c38c9a4db928b2c622d89d098e3a777b9cfeb3e9ea196b08e736d17a6a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005780830f4240808601499bf1362a80a0000000000000000000000000000000000000000000000000000000000001ac7ac0c0 -f8f3f8efa0acb5dbc9a0a0e41ed5b05e49a29af7aad28a6380f3ecc2c319d482f376debfa2a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005880830f4240808601499bf14c4780a00000000000000000000000000000000000000000000000000000000000010f1bc0c0 -f8f3f8efa0ae7f00f41343e577f48c1fc2a03682610213d74e6cdc809531e37f6e0726702fa0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005280830f4240808601499bf10e5580a00000000000000000000000000000000000000000000000000000000000066097c0c0 -f8f3f8efa04479ee926beb4f39152b06ba350572131d4dcaa54f4a26cc474345baeda09092a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005980830f4240808601499bf15b1a80a00000000000000000000000000000000000000000000000000000000000001e58c0c0 -f8f3f8efa0391a99724f47651fc499feb1b9587dba63c57d95882614e222ee1d7fc3527c3ba0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005a80830f4240808601499bf15e7a80a00000000000000000000000000000000000000000000000000000000000007da3c0c0 -f8f3f8efa032e03e397743a78a27bee4e076eec6d06008513930331a019d4a6723fb0594afa0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005380830f4240808601499bf15d5f80a0000000000000000000000000000000000000000000000000000000000000d352c0c0 -f8f3f8efa0ec7c104bbd27ae66085fda9c57a94bc8b186fd3f905a913bc76ed5f230d5c278a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005b80830f4240808601499bf1665980a000000000000000000000000000000000000000000000000000000000000079d6c0c0 -f8f3f8efa084de245ed1ee1cca7ce1cc77ae085e4c4f530533d3a958a31e6fade047e9b78fa0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005c80830f4240808601499bf16df880a00000000000000000000000000000000000000000000000000000000000008afcc0c0 -f8f3f8efa0e745c25ccdeead4ee0592ee76594b90c6d9475646af579b401abdf75ee1ff0f4a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005480830f4240808601499bf1693f80a0000000000000000000000000000000000000000000000000000000000001621cc0c0 -f8f3f8efa0130e3c542d66191260b3d2acba8aa6035015610b55a05746ce78f467e4ec807da0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005580830f4240808601499bf17bc980a0000000000000000000000000000000000000000000000000000000000000b4d2c0c0 -f8f3f8efa062d6fa6a35dd3e319cda90132a8c5b0eab1632afe356fd60712ac6998d1a9b04a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005d80830f4240808601499bf1767180a00000000000000000000000000000000000000000000000000000000000025886c0c0 -f8f3f8efa05dcaee9d4dd3d151609da0932190f5b5b925eee25e56adfeb8b1fe7806964150a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005680830f4240808601499bf1864080a00000000000000000000000000000000000000000000000000000000000014789c0c0 -f8f3f8efa07a2aabe9a921f8b3bd6d924948a15a93a0f7c7db01bfcad9ca60b8a41150fc7ba0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005780830f4240808601499bf197a180a00000000000000000000000000000000000000000000000000000000000013139c0c0 -f8f3f8efa0846b4d9c631d3bf54c84235faf69b5443cba97d991eb90d4e5302e440f2b1b84a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005880830f4240808601499bf1a7e580a0000000000000000000000000000000000000000000000000000000000001e536c0c0 -f8f3f8efa0ac83d682ea467a7597cab3032c4c257d63f289ed95df83309e19698e74b7a694a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005980830f4240808601499bf1c0b280a00000000000000000000000000000000000000000000000000000000000023893c0c0 -f8f3f8efa067bd350cddad24e478a229762c8b3889ef0c3856fc286ec7ab9555f556d10859a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005a80830f4240808601499bf1dd4f80a0000000000000000000000000000000000000000000000000000000000001e536c0c0 -f8f3f8efa091b2f8986f02d39668a1db4fd0e1b4718d928ad55b75e6dbc2da700ee05c7104a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005b80830f4240808601499bf1f62b80a0000000000000000000000000000000000000000000000000000000000000bfc3c0c0 -f8f3f8efa08c42420772fb4f397dd5d6fa2c28f40c2ee8176572480ce92cbffe7305da8377a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005c80830f4240808601499bf2012680a0000000000000000000000000000000000000000000000000000000000000432bc0c0 -f8f3f8efa01a79835e698e0c7c5fe229f1f9f03a9e7af25270909dce87e77f8c656658fcf4a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005e80830f4240808601499bf194b480a0000000000000000000000000000000000000000000000000000000000009c016c0c0 -f8f3f8efa01c1d1a073d0467757d10b993d311a6dc7ce7d41c3cfe9a4fced0964510756a65a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005f80830f4240808601499bf20c0980a0000000000000000000000000000000000000000000000000000000000001d197c0c0 -f8f3f8efa0eaebb4e62293faf0419be514cf6be99febff1a68f99188dab974bbb8c2abd875a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005d80830f4240808601499bf2064980a0000000000000000000000000000000000000000000000000000000000002ebf9c0c0 -f8f3f8efa002edc077444bb8f95dc223f5ae3046619c2dc7224ec86a3a4005536440357bd0a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200006080830f4240808601499bf223ee80a0000000000000000000000000000000000000000000000000000000000001b494c0c0 -f8f3f8efa0093038619e720856eeecd37951d42a71a52bf71e6a5bf7a12ed4ec99fa83ab46a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200006180830f4240808601499bf23a6380a0000000000000000000000000000000000000000000000000000000000000b9bbc0c0 -f8f3f8efa0ca38491cb196ce3292df83c038f4cafc4ca4281d720ee0301e5041e8c04f1cb9a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200006280830f4240808601499bf2450480a00000000000000000000000000000000000000000000000000000000000022c4cc0c0 -f8f3f8efa0860b5e1b6320a5fa6d4d806053261a7fbe3b00521ae540ee044c16c59b3a43f5a0745bb6db3262859df599122d9a505e44c7d0d82587c3683478edfc77a8bc7d7f94407d73d8a49eeb85d32cf465507dd71d507100c1a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200006380830f4240808601499bf2614280a00000000000000000000000000000000000000000000000000000000000015b17c0c0 -f8f3f8efa08fc3ca35a78aea9a3e457e83c7eedb197c061067ee200a6aa55283a71e495eeca0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005e80830f4240808601499bf22b6580a0000000000000000000000000000000000000000000000000000000000005db97c0c0 -f8f3f8efa0111e672b998df74c2e8339562eb6a830ae24d935cf0513d75802ddbcb0ebb08fa0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200005f80830f4240808601499bf2740780a00000000000000000000000000000000000000000000000000000000000016892c0c0 -f8f3f8efa05630d315d51ae6490c974bb76ec1892d33df5aacec9be31a72d78150b4936590a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200006080830f4240808601499bf286db80a0000000000000000000000000000000000000000000000000000000000000222bc0c0 -f8f3f8efa05763307f1ad89730be5daa431b8a187a8c6267739ba3211d063340bad800eee4a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200006180830f4240808601499bf28a7080a000000000000000000000000000000000000000000000000000000000000225e5c0c0 -f8f3f8efa0a1b6a9be62a5c305fa75b31f592ef0ffcf8435ff249a6d64f099b0ff5d2e2de9a0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200006280830f4240808601499bf2a63f80a0000000000000000000000000000000000000000000000000000000000000e81dc0c0 -f8f3f8efa019e55e02c15ba8729543d3e84bd8960f4ea57ece14c508fcf715b97d73fc597da0cffc202279e137e898551b22024b42ec0970c3c8d9cfbc21cdbb67bfdd90a72f942bd26d8f796719923ff13d295644f9b45db1f730a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b42180830200006380830f4240808601499bf2b31b80a000000000000000000000000000000000000000000000000000000000000187ffc0c0 diff --git a/ethereumj-core/src/test/resources/log4j.properties b/ethereumj-core/src/test/resources/log4j.properties index 5855c171..fa7fa5cd 100644 --- a/ethereumj-core/src/test/resources/log4j.properties +++ b/ethereumj-core/src/test/resources/log4j.properties @@ -1,11 +1,12 @@ # Root logger option -log4j.rootLogger=DEBUG, stdout +log4j.rootLogger=ERROR, stdout # Direct log messages to stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern= %d{HH:mm:ss.SSS} [%c{1}] %m%n +log4j.appender.stdout.Threshold=ERROR # filter noisy classes log4j.logger.block = ERROR @@ -19,7 +20,7 @@ log4j.logger.peermonitor = ERROR log4j.logger.java.nio = ERROR log4j.logger.io.netty = ERROR log4j.logger.wire = ERROR -log4j.logger.VM = TRACE +log4j.logger.VM = ERROR log4j.logger.main = ERROR log4j.logger.trie = ERROR log4j.logger.state = INFO @@ -28,6 +29,7 @@ log4j.logger.blockchain = TRACE log4j.logger.txs = ERROR log4j.logger.ui = ERROR log4j.logger.gas = ERROR +log4j.logger.TCK-Test = INFO log4j.logger.org.springframework = ERROR diff --git a/ethereumj-core/src/test/resources/system.properties b/ethereumj-core/src/test/resources/system.properties index 4d8b83c8..c53da947 100644 --- a/ethereumj-core/src/test/resources/system.properties +++ b/ethereumj-core/src/test/resources/system.properties @@ -142,4 +142,14 @@ root.hash.start = -1 GitHubTests.VMTest.loadLocal = false # Key value data source values: [leveldb/redis] -keyvalue.datasource = leveldb \ No newline at end of file +keyvalue.datasource = leveldb + +# structured trace +# is the trace being +# collected in the +# form of objects and +# exposed to the user +# in json or any other +# convenient form. +vm.structured.trace = false +vm.structured.dir = vmtrace