diff --git a/rskj-core/src/main/java/co/rsk/DoPrune.java b/rskj-core/src/main/java/co/rsk/DoPrune.java index f4eb94d83ea..9ef4c791988 100644 --- a/rskj-core/src/main/java/co/rsk/DoPrune.java +++ b/rskj-core/src/main/java/co/rsk/DoPrune.java @@ -85,9 +85,9 @@ private void doPrune() { logger.info("Datasource Name {}", dataSourceName); logger.info("Blockchain height {}", height); - TrieImpl source = new TrieImpl(new TrieStoreImpl(levelDbByName(this.rskSystemProperties, dataSourceName)), true); + TrieImpl source = new TrieImpl(new TrieStoreImpl(levelDbByName(dataSourceName, this.rskSystemProperties.databaseDir())), true); String targetDataSourceName = dataSourceName + "B"; - KeyValueDataSource targetDataSource = levelDbByName(this.rskSystemProperties, targetDataSourceName); + KeyValueDataSource targetDataSource = levelDbByName(targetDataSourceName, this.rskSystemProperties.databaseDir()); TrieStore targetStore = new TrieStoreImpl(targetDataSource); this.processBlocks(height - blocksToProcess, source, contractAddress, targetStore); diff --git a/rskj-core/src/main/java/co/rsk/core/ReversibleTransactionExecutor.java b/rskj-core/src/main/java/co/rsk/core/ReversibleTransactionExecutor.java index 89b60b1635a..2e1ee039b37 100644 --- a/rskj-core/src/main/java/co/rsk/core/ReversibleTransactionExecutor.java +++ b/rskj-core/src/main/java/co/rsk/core/ReversibleTransactionExecutor.java @@ -26,6 +26,8 @@ import org.ethereum.core.TransactionExecutor; import org.ethereum.db.BlockStore; import org.ethereum.db.ReceiptStore; +import org.ethereum.listener.EthereumListenerAdapter; +import org.ethereum.vm.PrecompiledContracts; import org.ethereum.vm.program.ProgramResult; import org.ethereum.vm.program.invoke.ProgramInvokeFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -81,15 +83,10 @@ public ProgramResult executeTransaction( ); TransactionExecutor executor = new TransactionExecutor( - config, - tx, - 0, - coinbase, - repository, - blockStore, - receiptStore, - programInvokeFactory, - executionBlock + tx, 0, coinbase, repository, blockStore, receiptStore, + programInvokeFactory, executionBlock, new EthereumListenerAdapter(), 0, config.getVmConfig(), + config.getBlockchainConfig(), config.playVM(), config.isRemascEnabled(), config.vmTrace(), new PrecompiledContracts(config), + config.databaseDir(), config.vmTraceDir(), config.vmTraceCompressed() ).setLocalCall(true); executor.init(); diff --git a/rskj-core/src/main/java/co/rsk/core/RskFactory.java b/rskj-core/src/main/java/co/rsk/core/RskFactory.java index fd61f2cf8fc..279eae2c917 100644 --- a/rskj-core/src/main/java/co/rsk/core/RskFactory.java +++ b/rskj-core/src/main/java/co/rsk/core/RskFactory.java @@ -308,7 +308,7 @@ public Wallet getWallet(RskSystemProperties config) { } logger.info("Local wallet enabled"); - KeyValueDataSource ds = new LevelDbDataSource(config, "wallet"); + KeyValueDataSource ds = new LevelDbDataSource("wallet", config.databaseDir()); ds.init(); return new Wallet(ds); } diff --git a/rskj-core/src/main/java/co/rsk/core/bc/BlockChainImpl.java b/rskj-core/src/main/java/co/rsk/core/bc/BlockChainImpl.java index 3669a49b1e4..909a3448cdc 100644 --- a/rskj-core/src/main/java/co/rsk/core/bc/BlockChainImpl.java +++ b/rskj-core/src/main/java/co/rsk/core/bc/BlockChainImpl.java @@ -19,7 +19,6 @@ package co.rsk.core.bc; import co.rsk.blocks.BlockRecorder; -import co.rsk.config.RskSystemProperties; import co.rsk.core.BlockDifficulty; import co.rsk.net.Metrics; import co.rsk.panic.PanicProcessor; @@ -34,7 +33,6 @@ import org.ethereum.db.ReceiptStore; import org.ethereum.db.TransactionInfo; import org.ethereum.listener.EthereumListener; -import org.ethereum.manager.AdminInfo; import org.ethereum.util.RLP; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -80,13 +78,11 @@ public class BlockChainImpl implements Blockchain { private static final Logger logger = LoggerFactory.getLogger("blockchain"); private static final PanicProcessor panicProcessor = new PanicProcessor(); - private final RskSystemProperties config; private final Repository repository; private final BlockStore blockStore; private final ReceiptStore receiptStore; private final TransactionPool transactionPool; private EthereumListener listener; - private final AdminInfo adminInfo; private BlockValidator blockValidator; private volatile BlockChainStatus status = new BlockChainStatus(null, BlockDifficulty.ZERO); @@ -95,26 +91,29 @@ public class BlockChainImpl implements Blockchain { private final Object accessLock = new Object(); private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + private final boolean flushEnabled; + private final int flushNumberOfBlocks; private final BlockExecutor blockExecutor; private BlockRecorder blockRecorder; private boolean noValidation; - public BlockChainImpl(RskSystemProperties config, - Repository repository, + public BlockChainImpl(Repository repository, BlockStore blockStore, ReceiptStore receiptStore, TransactionPool transactionPool, EthereumListener listener, - AdminInfo adminInfo, - BlockValidator blockValidator) { - this.config = config; + BlockValidator blockValidator, + boolean flushEnabled, + int flushNumberOfBlocks, + BlockExecutor blockExecutor) { this.repository = repository; this.blockStore = blockStore; this.receiptStore = receiptStore; this.listener = listener; - this.adminInfo = adminInfo; this.blockValidator = blockValidator; - this.blockExecutor = new BlockExecutor(config, repository, receiptStore, blockStore, listener); + this.flushEnabled = flushEnabled; + this.flushNumberOfBlocks = flushNumberOfBlocks; + this.blockExecutor = blockExecutor; this.transactionPool = transactionPool; } @@ -132,8 +131,6 @@ public Repository getRepository() { public BlockValidator getBlockValidator() { return blockValidator; } - public AdminInfo getAdminInfo() { return adminInfo; } - @VisibleForTesting public void setBlockValidator(BlockValidator validator) { this.blockValidator = validator; @@ -281,11 +278,6 @@ private ImportResult internalTryToConnect(Block block) { } long totalTime = System.nanoTime() - saveTime; - - if (adminInfo != null) { - adminInfo.addBlockExecTime(totalTime); - } - logger.trace("block: num: [{}] hash: [{}], executed after: [{}]nano", block.getNumber(), block.getShortHash(), totalTime); } @@ -568,7 +560,7 @@ private boolean isValid(Block block) { private int nFlush = 0; private void flushData() { - if (config.isFlushEnabled() && nFlush == 0) { + if (flushEnabled && nFlush == 0) { long saveTime = System.nanoTime(); repository.flush(); long totalTime = System.nanoTime() - saveTime; @@ -579,7 +571,7 @@ private void flushData() { logger.trace("blockstore flush: [{}]nano", totalTime); } nFlush++; - nFlush = nFlush % config.flushNumberOfBlocks(); + nFlush = nFlush % flushNumberOfBlocks; } public static byte[] calcTxTrie(List transactions) { diff --git a/rskj-core/src/main/java/co/rsk/core/bc/BlockExecutor.java b/rskj-core/src/main/java/co/rsk/core/bc/BlockExecutor.java index ce7c074463f..fbf8b25ccd1 100644 --- a/rskj-core/src/main/java/co/rsk/core/bc/BlockExecutor.java +++ b/rskj-core/src/main/java/co/rsk/core/bc/BlockExecutor.java @@ -18,14 +18,9 @@ package co.rsk.core.bc; -import co.rsk.config.RskSystemProperties; import co.rsk.core.Coin; +import co.rsk.core.RskAddress; import org.ethereum.core.*; -import org.ethereum.db.BlockStore; -import org.ethereum.db.ReceiptStore; -import org.ethereum.listener.EthereumListener; -import org.ethereum.vm.program.invoke.ProgramInvokeFactory; -import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.bouncycastle.util.encoders.Hex; @@ -45,26 +40,12 @@ public class BlockExecutor { private static final Logger logger = LoggerFactory.getLogger("blockexecutor"); - private final RskSystemProperties config; private final Repository repository; - private final ReceiptStore receiptStore; - private final BlockStore blockStore; - private final EthereumListener listener; + private final TransactionExecutorFactory transactionExecutorFactory; - private final ProgramInvokeFactory programInvokeFactory = new ProgramInvokeFactoryImpl(); - - public BlockExecutor( - RskSystemProperties config, - Repository repository, - ReceiptStore receiptStore, - BlockStore blockStore, - EthereumListener listener) { - - this.config = config; + public BlockExecutor(Repository repository, TransactionExecutorFactory transactionExecutorFactory) { this.repository = repository; - this.receiptStore = receiptStore; - this.blockStore = blockStore; - this.listener = listener; + this.transactionExecutorFactory = transactionExecutorFactory; } /** @@ -209,8 +190,14 @@ private BlockResult execute(Block block, byte[] stateRoot, boolean discardInvali for (Transaction tx : block.getTransactionsList()) { logger.trace("apply block: [{}] tx: [{}] ", block.getNumber(), i); - TransactionExecutor txExecutor = new TransactionExecutor(config, tx, txindex++, block.getCoinbase(), track, blockStore, receiptStore, programInvokeFactory, block, listener, totalGasUsed); - + TransactionExecutor txExecutor = transactionExecutorFactory.newInstance( + tx, + txindex++, + block.getCoinbase(), + track, + block, + totalGasUsed + ); boolean readyToExecute = txExecutor.init(); if (!ignoreReadyToExecute && !readyToExecute) { if (discardInvalidTxs) { @@ -265,4 +252,8 @@ private BlockResult execute(Block block, byte[] stateRoot, boolean discardInvali return new BlockResult(executedTransactions, receipts, lastStateRootHash, totalGasUsed, totalPaidFees); } + + public interface TransactionExecutorFactory { + TransactionExecutor newInstance(Transaction tx, int txindex, RskAddress coinbase, Repository track, Block block, long totalGasUsed); + } } diff --git a/rskj-core/src/main/java/co/rsk/core/bc/TransactionPoolImpl.java b/rskj-core/src/main/java/co/rsk/core/bc/TransactionPoolImpl.java index 2ebf3564333..bbc79045fe7 100644 --- a/rskj-core/src/main/java/co/rsk/core/bc/TransactionPoolImpl.java +++ b/rskj-core/src/main/java/co/rsk/core/bc/TransactionPoolImpl.java @@ -20,7 +20,6 @@ import co.rsk.config.RskSystemProperties; import co.rsk.core.Coin; -import co.rsk.core.RskAddress; import co.rsk.crypto.Keccak256; import co.rsk.net.handler.TxPendingValidator; import co.rsk.trie.Trie; @@ -31,8 +30,10 @@ import org.ethereum.db.BlockStore; import org.ethereum.db.ReceiptStore; import org.ethereum.listener.EthereumListener; +import org.ethereum.listener.EthereumListenerAdapter; import org.ethereum.util.ByteUtil; import org.ethereum.util.RLP; +import org.ethereum.vm.PrecompiledContracts; import org.ethereum.vm.program.invoke.ProgramInvokeFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -158,8 +159,26 @@ public PendingState getPendingState() { new TransactionSet(pendingTransactions), (repository, tx) -> new TransactionExecutor( - config, tx, 0, bestBlock.getCoinbase(), repository, - blockStore, receiptStore, programInvokeFactory, createFakePendingBlock(bestBlock)) + tx, + 0, + bestBlock.getCoinbase(), + repository, + blockStore, + receiptStore, + programInvokeFactory, + createFakePendingBlock(bestBlock), + new EthereumListenerAdapter(), + 0, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + ) ); } @@ -447,7 +466,7 @@ private boolean senderCanPayPendingTransactionsAndNewTx(Transaction newTx) { private Coin getTxBaseCost(Transaction tx) { Coin gasCost = tx.getValue(); - if (bestBlock == null || tx.transactionCost(config, bestBlock) > 0) { + if (bestBlock == null || tx.transactionCost(bestBlock, config.getBlockchainConfig()) > 0) { BigInteger gasLimit = new BigInteger(1, tx.getGasLimit()); gasCost = gasCost.add(tx.getGasPrice().multiply(gasLimit)); } diff --git a/rskj-core/src/main/java/co/rsk/db/ContractDetailsImpl.java b/rskj-core/src/main/java/co/rsk/db/ContractDetailsImpl.java index e0e3a09f241..349861fe6a7 100644 --- a/rskj-core/src/main/java/co/rsk/db/ContractDetailsImpl.java +++ b/rskj-core/src/main/java/co/rsk/db/ContractDetailsImpl.java @@ -18,12 +18,10 @@ package co.rsk.db; -import co.rsk.config.RskSystemProperties; import co.rsk.crypto.Keccak256; import co.rsk.panic.PanicProcessor; import co.rsk.trie.*; import org.ethereum.datasource.DataSourcePool; -import org.ethereum.datasource.HashMapDB; import org.ethereum.datasource.KeyValueDataSource; import org.ethereum.db.ByteArrayWrapper; import org.ethereum.db.ContractDetails; @@ -52,7 +50,8 @@ public class ContractDetailsImpl implements ContractDetails { private static final PanicProcessor panicProcessor = new PanicProcessor(); private static final Logger logger = LoggerFactory.getLogger("contractdetails"); - private final RskSystemProperties config; + private final String databaseDir; + private final int memoryStorageLimit; private Trie trie; private byte[] code; @@ -64,20 +63,18 @@ public class ContractDetailsImpl implements ContractDetails { private boolean closed; private Set keys = new HashSet<>(); - public ContractDetailsImpl(RskSystemProperties config, byte[] encoded) { - this.config = config; + public ContractDetailsImpl(byte[] encoded, int memoryStorageLimit, String databaseDir) { + this.memoryStorageLimit = memoryStorageLimit; + this.databaseDir = databaseDir; decode(encoded); } - public ContractDetailsImpl(RskSystemProperties config) { - this(config, null, new TrieImpl(new TrieStoreImpl(new HashMapDB()), true), null); - } - - public ContractDetailsImpl(RskSystemProperties config, byte[] address, Trie trie, byte[] code) { - this.config = config; + public ContractDetailsImpl(byte[] address, Trie trie, byte[] code, int memoryStorageLimit, String databaseDir) { this.address = ByteUtils.clone(address); this.trie = trie; this.code = ByteUtils.clone(code); + this.memoryStorageLimit = memoryStorageLimit; + this.databaseDir = databaseDir; } @Override @@ -193,7 +190,7 @@ public final void decode(byte[] rlpBytes) { if (this.externalStorage) { Keccak256 snapshotHash = new Keccak256(rlpStorage.getRLPData()); - this.trie = new TrieImpl(new TrieStoreImpl(levelDbByName(config, getDataSourceName())), true).getSnapshotTo(snapshotHash); + this.trie = new TrieImpl(new TrieStoreImpl(levelDbByName(getDataSourceName(), databaseDir)), true).getSnapshotTo(snapshotHash); } else { this.trie = TrieImpl.deserialize(rlpStorage.getRLPData()); } @@ -333,7 +330,7 @@ public synchronized void syncStorage() { // switching to data source logger.trace("switching to data source, hash {}, address {}", hashString, addressString); - KeyValueDataSource ds = levelDbByName(config, this.getDataSourceName()); + KeyValueDataSource ds = levelDbByName(this.getDataSourceName(), databaseDir); TrieStoreImpl newStore = new TrieStoreImpl(ds); TrieStoreImpl originalStore = (TrieStoreImpl)((TrieImpl) this.trie).getStore(); newStore.copyFrom(originalStore); @@ -367,14 +364,14 @@ public synchronized ContractDetails getSnapshotTo(byte[] hash) { this.trie.save(); - ContractDetailsImpl details = new ContractDetailsImpl(this.config, this.address, this.trie.getSnapshotTo(new Keccak256(hash)), this.code); + ContractDetailsImpl details = new ContractDetailsImpl(this.address, this.trie.getSnapshotTo(new Keccak256(hash)), this.code, this.memoryStorageLimit, this.databaseDir); details.keys = new HashSet<>(); details.keys.addAll(this.keys); details.externalStorage = this.externalStorage; details.originalExternalStorage = this.originalExternalStorage; if (this.externalStorage) { - levelDbByName(config, getDataSourceName()); + levelDbByName(getDataSourceName(), databaseDir); } logger.trace("getting contract details snapshot hash {}, address {}, storage size {}, has external storage {}", details.getStorageHashAsString(), details.getAddressAsString(), details.getStorageSize(), details.hasExternalStorage()); @@ -404,7 +401,7 @@ private void removeKey(byte[] key) { } private void checkExternalStorage() { - this.externalStorage = (keys.size() > config.detailsInMemoryStorageLimit()) || this.externalStorage; + this.externalStorage = (keys.size() > memoryStorageLimit) || this.externalStorage; } private String getDataSourceName() { @@ -431,7 +428,7 @@ private void checkDataSourceIsOpened() { } logger.trace("reopening contract details data source"); - KeyValueDataSource ds = levelDbByName(config, this.getDataSourceName()); + KeyValueDataSource ds = levelDbByName(this.getDataSourceName(), databaseDir); TrieStoreImpl newStore = new TrieStoreImpl(ds); Trie newTrie = newStore.retrieve(this.trie.getHash().getBytes()); this.trie = newTrie; diff --git a/rskj-core/src/main/java/co/rsk/db/PruneService.java b/rskj-core/src/main/java/co/rsk/db/PruneService.java index 499d69bebea..af86a6e1db2 100644 --- a/rskj-core/src/main/java/co/rsk/db/PruneService.java +++ b/rskj-core/src/main/java/co/rsk/db/PruneService.java @@ -96,8 +96,8 @@ public void process() { long to = this.blockchain.getBestBlock().getNumber() - this.pruneConfiguration.getNoBlocksToAvoidForks(); String dataSourceName = getDataSourceName(contractAddress); - KeyValueDataSource sourceDataSource = levelDbByName(this.rskConfiguration, dataSourceName); - KeyValueDataSource targetDataSource = levelDbByName(this.rskConfiguration, dataSourceName + "B"); + KeyValueDataSource sourceDataSource = levelDbByName(dataSourceName, this.rskConfiguration.databaseDir()); + KeyValueDataSource targetDataSource = levelDbByName(dataSourceName + "B", this.rskConfiguration.databaseDir()); TrieStore targetStore = new TrieStoreImpl(targetDataSource); TrieCopier.trieContractStateCopy(targetStore, blockchain, from, to, blockchain.getRepository(), this.contractAddress); diff --git a/rskj-core/src/main/java/co/rsk/db/RepositoryImpl.java b/rskj-core/src/main/java/co/rsk/db/RepositoryImpl.java index 9e522a5bd48..aa77abe206a 100644 --- a/rskj-core/src/main/java/co/rsk/db/RepositoryImpl.java +++ b/rskj-core/src/main/java/co/rsk/db/RepositoryImpl.java @@ -18,13 +18,13 @@ package co.rsk.db; -import co.rsk.config.RskSystemProperties; import co.rsk.core.Coin; import co.rsk.core.RskAddress; import co.rsk.crypto.Keccak256; import co.rsk.trie.Trie; import co.rsk.trie.TrieImpl; import co.rsk.trie.TrieStore; +import co.rsk.trie.TrieStoreImpl; import org.ethereum.core.AccountState; import org.ethereum.core.Block; import org.ethereum.core.Repository; @@ -56,36 +56,40 @@ public class RepositoryImpl implements Repository { private static final Logger logger = LoggerFactory.getLogger("repository"); - private final RskSystemProperties config; + private final int memoryStorageLimit; + private final String databaseDir; private TrieStore store; private Trie trie; private DetailsDataStore detailsDataStore; private boolean closed; - public RepositoryImpl(RskSystemProperties config) { - this(config, null); + public RepositoryImpl(TrieStore store, int memoryStorageLimit, String databaseDir) { + this(store, new HashMapDB(), memoryStorageLimit, databaseDir); } - public RepositoryImpl(RskSystemProperties config, TrieStore store) { - this(config, store, new HashMapDB()); + public RepositoryImpl(TrieStore store, KeyValueDataSource detailsDS, int memoryStorageLimit, String databaseDir) { + this(store, new DetailsDataStore(new DatabaseImpl(detailsDS)), memoryStorageLimit, databaseDir); } - public RepositoryImpl(RskSystemProperties config, TrieStore store, KeyValueDataSource detailsDS) { - this(config, store, new DetailsDataStore(config, new DatabaseImpl(detailsDS))); - } - - private RepositoryImpl(RskSystemProperties config, TrieStore store, DetailsDataStore detailsDataStore) { - this.config = config; + private RepositoryImpl(TrieStore store, DetailsDataStore detailsDataStore, int memoryStorageLimit, String databaseDir) { this.store = store; this.trie = new TrieImpl(store, true); this.detailsDataStore = detailsDataStore; + this.memoryStorageLimit = memoryStorageLimit; + this.databaseDir = databaseDir; } @Override public synchronized AccountState createAccount(RskAddress addr) { AccountState accountState = new AccountState(); updateAccountState(addr, accountState); - updateContractDetails(addr, new ContractDetailsImpl(config)); + updateContractDetails(addr, new ContractDetailsImpl( + null, + new TrieImpl(new TrieStoreImpl(new HashMapDB()), true), + null, + memoryStorageLimit, + databaseDir + )); return accountState; } @@ -148,7 +152,7 @@ public synchronized ContractDetails getContractDetails(RskAddress addr) { storageRoot = getAccountState(addr).getStateRoot(); } - ContractDetails details = detailsDataStore.get(addr); + ContractDetails details = detailsDataStore.get(addr, memoryStorageLimit, databaseDir); if (details != null) { details = details.getSnapshotTo(storageRoot); } @@ -270,7 +274,7 @@ public synchronized void dumpState(Block block, long gasUsed, int txNumber, byte @Override public synchronized Repository startTracking() { - return new RepositoryTrack(config, this); + return new RepositoryTrack(this); } @Override @@ -341,7 +345,13 @@ public synchronized void updateBatch(Map stateCache, ContractDetailsCacheImpl contractDetailsCache = (ContractDetailsCacheImpl) contractDetails; if (contractDetailsCache.getOriginalContractDetails() == null) { - ContractDetails originalContractDetails = new ContractDetailsImpl(config); + ContractDetails originalContractDetails = new ContractDetailsImpl( + null, + new TrieImpl(new TrieStoreImpl(new HashMapDB()), true), + null, + memoryStorageLimit, + databaseDir + ); originalContractDetails.setAddress(addr.getBytes()); contractDetailsCache.setOriginalContractDetails(originalContractDetails); contractDetailsCache.commit(); @@ -394,7 +404,7 @@ public synchronized void loadAccount(RskAddress addr, @Override public synchronized Repository getSnapshotTo(byte[] root) { - RepositoryImpl snapshotRepository = new RepositoryImpl(this.config, this.store, this.detailsDataStore); + RepositoryImpl snapshotRepository = new RepositoryImpl(this.store, this.detailsDataStore, memoryStorageLimit, databaseDir); snapshotRepository.syncToRoot(root); return snapshotRepository; } diff --git a/rskj-core/src/main/java/co/rsk/db/RepositoryTrackWithBenchmarking.java b/rskj-core/src/main/java/co/rsk/db/RepositoryTrackWithBenchmarking.java index d1b1139a384..94a91ca70f6 100644 --- a/rskj-core/src/main/java/co/rsk/db/RepositoryTrackWithBenchmarking.java +++ b/rskj-core/src/main/java/co/rsk/db/RepositoryTrackWithBenchmarking.java @@ -19,7 +19,6 @@ package co.rsk.db; -import co.rsk.config.RskSystemProperties; import co.rsk.core.RskAddress; import org.ethereum.core.Repository; import org.ethereum.db.RepositoryTrack; @@ -63,8 +62,8 @@ public int getSlotsCleared() { private final Statistics statistics; - public RepositoryTrackWithBenchmarking(RskSystemProperties config, Repository repository) { - super(config, repository); + public RepositoryTrackWithBenchmarking(Repository repository) { + super(repository); statistics = new Statistics(); } diff --git a/rskj-core/src/main/java/co/rsk/mine/BlockToMineBuilder.java b/rskj-core/src/main/java/co/rsk/mine/BlockToMineBuilder.java index 4831d791da0..d8a08a33999 100644 --- a/rskj-core/src/main/java/co/rsk/mine/BlockToMineBuilder.java +++ b/rskj-core/src/main/java/co/rsk/mine/BlockToMineBuilder.java @@ -32,6 +32,8 @@ import org.ethereum.crypto.HashUtil; import org.ethereum.db.BlockStore; import org.ethereum.db.ReceiptStore; +import org.ethereum.vm.PrecompiledContracts; +import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -91,7 +93,28 @@ public BlockToMineBuilder( this.clock = Clock.systemUTC(); this.minimumGasPriceCalculator = new MinimumGasPriceCalculator(); this.minerUtils = new MinerUtils(); - this.executor = new BlockExecutor(config, repository, receiptStore, blockStore, null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + this.executor = new BlockExecutor(repository, (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + blockStore, + receiptStore, + programInvokeFactory, + block1, + null, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); this.minerMinGasPriceTarget = Coin.valueOf(miningConfig.getMinGasPriceTarget()); } diff --git a/rskj-core/src/main/java/co/rsk/net/handler/TxPendingValidator.java b/rskj-core/src/main/java/co/rsk/net/handler/TxPendingValidator.java index 5231727cb99..09423cce26c 100644 --- a/rskj-core/src/main/java/co/rsk/net/handler/TxPendingValidator.java +++ b/rskj-core/src/main/java/co/rsk/net/handler/TxPendingValidator.java @@ -60,7 +60,7 @@ public boolean isValid(Transaction tx, Block executionBlock, @Nullable AccountSt BigInteger blockGasLimit = BigIntegers.fromUnsignedByteArray(executionBlock.getGasLimit()); Coin minimumGasPrice = executionBlock.getMinimumGasPrice(); long bestBlockNumber = executionBlock.getNumber(); - long basicTxCost = tx.transactionCost(config, executionBlock); + long basicTxCost = tx.transactionCost(executionBlock, config.getBlockchainConfig()); if (state == null && basicTxCost != 0) { logger.trace("[tx={}, sender={}] account doesn't exist", tx.getHash(), tx.getSender()); diff --git a/rskj-core/src/main/java/co/rsk/net/handler/txvalidator/TxValidatorIntrinsicGasLimitValidator.java b/rskj-core/src/main/java/co/rsk/net/handler/txvalidator/TxValidatorIntrinsicGasLimitValidator.java index ae8a4a1f02e..9ad43126142 100644 --- a/rskj-core/src/main/java/co/rsk/net/handler/txvalidator/TxValidatorIntrinsicGasLimitValidator.java +++ b/rskj-core/src/main/java/co/rsk/net/handler/txvalidator/TxValidatorIntrinsicGasLimitValidator.java @@ -56,6 +56,6 @@ public boolean validate(Transaction tx, @Nullable AccountState state, BigInteger 0 ); Block block = new Block(blockHeader); - return BigInteger.valueOf(tx.transactionCost(config, block)).compareTo(tx.getGasLimitAsInteger()) <= 0; + return BigInteger.valueOf(tx.transactionCost(block, config.getBlockchainConfig())).compareTo(tx.getGasLimitAsInteger()) <= 0; } } diff --git a/rskj-core/src/main/java/co/rsk/peg/Bridge.java b/rskj-core/src/main/java/co/rsk/peg/Bridge.java index cebf9f93907..044aabac8a0 100644 --- a/rskj-core/src/main/java/co/rsk/peg/Bridge.java +++ b/rskj-core/src/main/java/co/rsk/peg/Bridge.java @@ -206,7 +206,7 @@ public long getGasForData(byte[] data) { throw new NullPointerException(); } - if (BridgeUtils.isFreeBridgeTx(config, rskTx, rskExecutionBlock.getNumber())) { + if (BridgeUtils.isFreeBridgeTx(rskTx, rskExecutionBlock.getNumber(), config.getBlockchainConfig())) { return 0; } diff --git a/rskj-core/src/main/java/co/rsk/peg/BridgeUtils.java b/rskj-core/src/main/java/co/rsk/peg/BridgeUtils.java index 46c8857117f..41ce3f37d6f 100644 --- a/rskj-core/src/main/java/co/rsk/peg/BridgeUtils.java +++ b/rskj-core/src/main/java/co/rsk/peg/BridgeUtils.java @@ -27,7 +27,6 @@ import co.rsk.peg.bitcoin.RskAllowUnconfirmedCoinSelector; import co.rsk.util.MaxSizeHashMap; import org.ethereum.config.BlockchainNetConfig; -import org.ethereum.config.SystemProperties; import org.ethereum.core.Transaction; import org.ethereum.vm.PrecompiledContracts; import org.slf4j.Logger; @@ -218,21 +217,20 @@ public static Address recoverBtcAddressFromEthTransaction(org.ethereum.core.Tran return BtcECKey.fromPublicOnly(pubKey).toAddress(networkParameters); } - public static boolean isFreeBridgeTx(SystemProperties config, Transaction rskTx, long blockNumber) { - BlockchainNetConfig blockchainConfig = config.getBlockchainConfig(); + public static boolean isFreeBridgeTx(Transaction rskTx, long blockNumber, BlockchainNetConfig netConfig) { RskAddress receiveAddress = rskTx.getReceiveAddress(); if (receiveAddress.equals(RskAddress.nullAddress())) { return false; } - BridgeConstants bridgeConstants = blockchainConfig.getCommonConstants().getBridgeConstants(); + BridgeConstants bridgeConstants = netConfig.getCommonConstants().getBridgeConstants(); // Temporary assumption: if areBridgeTxsFree() is true then the current federation // must be the genesis federation. // Once the original federation changes, txs are always paid. return PrecompiledContracts.BRIDGE_ADDR.equals(receiveAddress) && - blockchainConfig.getConfigForBlock(blockNumber).areBridgeTxsFree() && - rskTx.acceptTransactionSignature(config.getBlockchainConfig().getCommonConstants().getChainId()) && + netConfig.getConfigForBlock(blockNumber).areBridgeTxsFree() && + rskTx.acceptTransactionSignature(netConfig.getCommonConstants().getChainId()) && ( isFromFederateMember(rskTx, bridgeConstants.getGenesisFederation()) || isFromFederationChangeAuthorizedSender(rskTx, bridgeConstants) || diff --git a/rskj-core/src/main/java/co/rsk/remasc/RemascTransaction.java b/rskj-core/src/main/java/co/rsk/remasc/RemascTransaction.java index aa02bd87d03..cd80eea4550 100644 --- a/rskj-core/src/main/java/co/rsk/remasc/RemascTransaction.java +++ b/rskj-core/src/main/java/co/rsk/remasc/RemascTransaction.java @@ -18,8 +18,8 @@ package co.rsk.remasc; -import co.rsk.config.RskSystemProperties; import co.rsk.core.RskAddress; +import org.ethereum.config.BlockchainNetConfig; import org.ethereum.core.Block; import org.ethereum.core.Transaction; import org.ethereum.util.ByteUtil; @@ -60,7 +60,7 @@ public RemascTransaction(long blockNumber) { } @Override - public long transactionCost(RskSystemProperties config, Block block) { + public long transactionCost(Block block, BlockchainNetConfig netConfig) { // RemascTransaction does not pay any fees return 0; } diff --git a/rskj-core/src/main/java/org/ethereum/config/CommonConfig.java b/rskj-core/src/main/java/org/ethereum/config/CommonConfig.java index 1eaf00fdc18..48d9b854aab 100644 --- a/rskj-core/src/main/java/org/ethereum/config/CommonConfig.java +++ b/rskj-core/src/main/java/org/ethereum/config/CommonConfig.java @@ -60,11 +60,11 @@ public Repository repository(RskSystemProperties config) { KeyValueDataSource ds = makeDataSource(config, "state"); KeyValueDataSource detailsDS = makeDataSource(config, "details"); - return new RepositoryImpl(config, new TrieStoreImpl(ds), detailsDS); + return new RepositoryImpl(new TrieStoreImpl(ds), detailsDS, config.detailsInMemoryStorageLimit(), config.databaseDir()); } private KeyValueDataSource makeDataSource(RskSystemProperties config, String name) { - KeyValueDataSource ds = new LevelDbDataSource(config, name); + KeyValueDataSource ds = new LevelDbDataSource(name, config.databaseDir()); ds.init(); return ds; } diff --git a/rskj-core/src/main/java/org/ethereum/config/DefaultConfig.java b/rskj-core/src/main/java/org/ethereum/config/DefaultConfig.java index 5f48770ccfb..565ccbd7600 100644 --- a/rskj-core/src/main/java/org/ethereum/config/DefaultConfig.java +++ b/rskj-core/src/main/java/org/ethereum/config/DefaultConfig.java @@ -89,7 +89,7 @@ public BlockStore blockStore(RskSystemProperties config) { .counterEnable() .makeOrGet(); - KeyValueDataSource blocksDB = new LevelDbDataSource(config, "blocks"); + KeyValueDataSource blocksDB = new LevelDbDataSource("blocks", database); blocksDB.init(); IndexedBlockStore indexedBlockStore = new IndexedBlockStore(indexMap, blocksDB, indexDB); @@ -99,7 +99,7 @@ public BlockStore blockStore(RskSystemProperties config) { @Bean public ReceiptStore receiptStore(RskSystemProperties config) { - KeyValueDataSource ds = new LevelDbDataSource(config, "receipts"); + KeyValueDataSource ds = new LevelDbDataSource("receipts", config.databaseDir()); ds.init(); return new ReceiptStoreImpl(ds); } diff --git a/rskj-core/src/main/java/org/ethereum/core/Transaction.java b/rskj-core/src/main/java/org/ethereum/core/Transaction.java index 7fcd8c9ae6b..5c55a5c4356 100644 --- a/rskj-core/src/main/java/org/ethereum/core/Transaction.java +++ b/rskj-core/src/main/java/org/ethereum/core/Transaction.java @@ -29,6 +29,7 @@ import org.bouncycastle.pqc.math.linearalgebra.ByteUtils; import org.bouncycastle.util.BigIntegers; import org.bouncycastle.util.encoders.Hex; +import org.ethereum.config.BlockchainNetConfig; import org.ethereum.config.Constants; import org.ethereum.crypto.ECKey; import org.ethereum.crypto.ECKey.ECDSASignature; @@ -190,13 +191,13 @@ private byte getRealV(byte v) { // There was a method called NEW_getTransactionCost that implemented this alternative solution: // "return (this.isContractCreation() ? GasCost.TRANSACTION_CREATE_CONTRACT : GasCost.TRANSACTION) // + zeroVals * GasCost.TX_ZERO_DATA + nonZeroes * GasCost.TX_NO_ZERO_DATA;" - public long transactionCost(RskSystemProperties config, Block block){ + public long transactionCost(Block block, BlockchainNetConfig netConfig){ if (!parsed) { rlpParse(); } // Federators txs to the bridge are free during system setup - if (BridgeUtils.isFreeBridgeTx(config, this, block.getNumber())) { + if (BridgeUtils.isFreeBridgeTx(this, block.getNumber(), netConfig)) { return 0; } diff --git a/rskj-core/src/main/java/org/ethereum/core/TransactionExecutor.java b/rskj-core/src/main/java/org/ethereum/core/TransactionExecutor.java index 94db2bf5524..1a0d2c9c5ca 100644 --- a/rskj-core/src/main/java/org/ethereum/core/TransactionExecutor.java +++ b/rskj-core/src/main/java/org/ethereum/core/TransactionExecutor.java @@ -19,18 +19,17 @@ package org.ethereum.core; -import co.rsk.config.RskSystemProperties; import co.rsk.config.VmConfig; import co.rsk.core.Coin; import co.rsk.core.RskAddress; import co.rsk.panic.PanicProcessor; import org.ethereum.config.BlockchainConfig; +import org.ethereum.config.BlockchainNetConfig; import org.ethereum.config.Constants; import org.ethereum.db.BlockStore; import org.ethereum.db.ContractDetails; import org.ethereum.db.ReceiptStore; import org.ethereum.listener.EthereumListener; -import org.ethereum.listener.EthereumListenerAdapter; import org.ethereum.vm.*; import org.ethereum.vm.program.Program; import org.ethereum.vm.program.ProgramResult; @@ -61,7 +60,6 @@ public class TransactionExecutor { private static final Logger logger = LoggerFactory.getLogger("execute"); private static final PanicProcessor panicProcessor = new PanicProcessor(); - private final RskSystemProperties config; private final Transaction tx; private final int txindex; private final Repository track; @@ -70,6 +68,13 @@ public class TransactionExecutor { private final ReceiptStore receiptStore; private final VmConfig vmConfig; private final PrecompiledContracts precompiledContracts; + private final BlockchainNetConfig netConfig; + private final boolean playVm; + private final boolean enableRemasc; + private final boolean vmTrace; + private final String databaseDir; + private final String vmTraceDir; + private final boolean vmTraceCompressed; private String executionError = ""; private final long gasUsedInTheBlock; private Coin paidFees; @@ -95,15 +100,10 @@ public class TransactionExecutor { private boolean localCall = false; - public TransactionExecutor(RskSystemProperties config, Transaction tx, int txindex, RskAddress coinbase, Repository track, BlockStore blockStore, ReceiptStore receiptStore, - ProgramInvokeFactory programInvokeFactory, Block executionBlock) { - this(config, tx, txindex, coinbase, track, blockStore, receiptStore, programInvokeFactory, executionBlock, new EthereumListenerAdapter(), 0); - } - - public TransactionExecutor(RskSystemProperties config, Transaction tx, int txindex, RskAddress coinbase, Repository track, BlockStore blockStore, ReceiptStore receiptStore, - ProgramInvokeFactory programInvokeFactory, Block executionBlock, - EthereumListener listener, long gasUsedInTheBlock) { - this.config = config; + public TransactionExecutor(Transaction tx, int txindex, RskAddress coinbase, Repository track, BlockStore blockStore, ReceiptStore receiptStore, + ProgramInvokeFactory programInvokeFactory, Block executionBlock, EthereumListener listener, long gasUsedInTheBlock, + VmConfig vmConfig, BlockchainNetConfig blockchainConfig, boolean playVm, boolean remascEnabled, + boolean vmTrace, PrecompiledContracts precompiledContracts, String databaseDir, String vmTraceDir, boolean vmTraceCompressed) { this.tx = tx; this.txindex = txindex; this.coinbase = coinbase; @@ -115,8 +115,15 @@ public TransactionExecutor(RskSystemProperties config, Transaction tx, int txind this.executionBlock = executionBlock; this.listener = listener; this.gasUsedInTheBlock = gasUsedInTheBlock; - this.vmConfig = config.getVmConfig(); - this.precompiledContracts = new PrecompiledContracts(config); + this.vmConfig = vmConfig; + this.precompiledContracts = precompiledContracts; + this.netConfig = blockchainConfig; + this.playVm = playVm; + this.enableRemasc = remascEnabled; + this.vmTrace = vmTrace; + this.databaseDir = databaseDir; + this.vmTraceDir = vmTraceDir; + this.vmTraceCompressed = vmTraceCompressed; } @@ -126,7 +133,7 @@ public TransactionExecutor(RskSystemProperties config, Transaction tx, int txind * set readyToExecute = true */ public boolean init() { - basicTxCost = tx.transactionCost(config, executionBlock); + basicTxCost = tx.transactionCost(executionBlock, netConfig); if (localCall) { readyToExecute = true; @@ -195,7 +202,7 @@ public boolean init() { return false; } - if (!tx.acceptTransactionSignature(config.getBlockchainConfig().getCommonConstants().getChainId())) { + if (!tx.acceptTransactionSignature(netConfig.getCommonConstants().getChainId())) { logger.warn("Transaction {} signature not accepted: {}", tx.getHash(), tx.getSignature()); logger.warn("Transaction Data: {}", tx); logger.warn("Tx Included in the following block: {}", this.executionBlock); @@ -251,7 +258,7 @@ private void call() { // java.lang.RuntimeException: Data word can't exceed 32 bytes: // if targetAddress size is greater than 32 bytes. // But init() will detect this earlier - BlockchainConfig blockchainConfig = config.getBlockchainConfig().getConfigForBlock(executionBlock.getNumber()); + BlockchainConfig blockchainConfig = netConfig.getConfigForBlock(executionBlock.getNumber()); precompiledContract = precompiledContracts.getContractForAddress(blockchainConfig, new DataWord(targetAddress.getBytes())); if (precompiledContract != null) { @@ -290,7 +297,7 @@ private void call() { programInvokeFactory.createProgramInvoke(tx, txindex, executionBlock, cacheTrack, blockStore); this.vm = new VM(vmConfig, precompiledContracts); - BlockchainConfig configForBlock = config.getBlockchainConfig().getConfigForBlock(executionBlock.getNumber()); + BlockchainConfig configForBlock = netConfig.getConfigForBlock(executionBlock.getNumber()); this.program = new Program(vmConfig, precompiledContracts, configForBlock, code, programInvoke, tx); } } @@ -310,7 +317,7 @@ private void create() { ProgramInvoke programInvoke = programInvokeFactory.createProgramInvoke(tx, txindex, executionBlock, cacheTrack, blockStore); this.vm = new VM(vmConfig, precompiledContracts); - BlockchainConfig configForBlock = config.getBlockchainConfig().getConfigForBlock(executionBlock.getNumber()); + BlockchainConfig configForBlock = netConfig.getConfigForBlock(executionBlock.getNumber()); this.program = new Program(vmConfig, precompiledContracts, configForBlock, tx.getData(), programInvoke, tx); // reset storage if the contract with the same address already exists @@ -351,9 +358,9 @@ public void go() { try { // Charge basic cost of the transaction - program.spendGas(tx.transactionCost(config, executionBlock), "TRANSACTION COST"); + program.spendGas(tx.transactionCost(executionBlock, netConfig), "TRANSACTION COST"); - if (config.playVM()) { + if (playVm) { vm.play(program); } @@ -481,7 +488,7 @@ public void finalization() { Coin summaryFee = summary.getFee(); //TODO: REMOVE THIS WHEN THE LocalBLockTests starts working with REMASC - if(config.isRemascEnabled()) { + if(enableRemasc) { logger.trace("Adding fee to remasc contract account"); track.addBalance(PrecompiledContracts.REMASC_ADDR, summaryFee); } else { @@ -503,11 +510,11 @@ public void finalization() { logger.trace("tx listener done"); - if (config.vmTrace() && program != null) { + if (vmTrace && program != null) { ProgramTrace trace = program.getTrace().result(result.getHReturn()).error(result.getException()); String txHash = tx.getHash().toHexString(); try { - saveProgramTraceFile(config, txHash, trace); + saveProgramTraceFile(txHash, trace, databaseDir, vmTraceDir, vmTraceCompressed); if (listener != null) { listener.onVMTraceCreated(txHash, trace); } diff --git a/rskj-core/src/main/java/org/ethereum/core/genesis/BlockChainLoader.java b/rskj-core/src/main/java/org/ethereum/core/genesis/BlockChainLoader.java index 7e6fd0eae3f..8d80e9f99bb 100644 --- a/rskj-core/src/main/java/org/ethereum/core/genesis/BlockChainLoader.java +++ b/rskj-core/src/main/java/org/ethereum/core/genesis/BlockChainLoader.java @@ -23,13 +23,15 @@ import co.rsk.core.BlockDifficulty; import co.rsk.core.RskAddress; import co.rsk.core.bc.BlockChainImpl; +import co.rsk.core.bc.BlockExecutor; import co.rsk.validators.BlockValidator; import org.apache.commons.lang3.StringUtils; import org.ethereum.core.*; import org.ethereum.db.BlockStore; import org.ethereum.db.ReceiptStore; import org.ethereum.listener.EthereumListener; -import org.ethereum.manager.AdminInfo; +import org.ethereum.vm.PrecompiledContracts; +import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.bouncycastle.util.encoders.Hex; @@ -56,7 +58,6 @@ public class BlockChainLoader { private final ReceiptStore receiptStore; private final TransactionPool transactionPool; private final EthereumListener listener; - private final AdminInfo adminInfo; private final BlockValidator blockValidator; @Autowired @@ -67,7 +68,6 @@ public BlockChainLoader( ReceiptStore receiptStore, TransactionPool transactionPool, EthereumListener listener, - AdminInfo adminInfo, BlockValidator blockValidator) { this.config = config; @@ -76,24 +76,45 @@ public BlockChainLoader( this.receiptStore = receiptStore; this.transactionPool = transactionPool; this.listener = listener; - this.adminInfo = adminInfo; this.blockValidator = blockValidator; } public BlockChainImpl loadBlockchain() { + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); BlockChainImpl blockchain = new BlockChainImpl( - config, repository, blockStore, receiptStore, transactionPool, listener, - adminInfo, - blockValidator + blockValidator, + config.isFlushEnabled(), + config.flushNumberOfBlocks(), + new BlockExecutor( + repository, + (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + blockStore, + receiptStore, + programInvokeFactory, + block1, + listener, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + ) + ) ); - if (!config.databaseReset()) { - blockStore.load(); - } Block bestBlock = blockStore.getBestBlock(); if (bestBlock == null) { diff --git a/rskj-core/src/main/java/org/ethereum/core/genesis/ContractDetailsMapper.java b/rskj-core/src/main/java/org/ethereum/core/genesis/ContractDetailsMapper.java index 1c21c75f645..ec5e99ea390 100644 --- a/rskj-core/src/main/java/org/ethereum/core/genesis/ContractDetailsMapper.java +++ b/rskj-core/src/main/java/org/ethereum/core/genesis/ContractDetailsMapper.java @@ -21,6 +21,9 @@ import co.rsk.config.RskSystemProperties; import co.rsk.db.ContractDetailsImpl; +import co.rsk.trie.TrieImpl; +import co.rsk.trie.TrieStoreImpl; +import org.ethereum.datasource.HashMapDB; import org.ethereum.db.ContractDetails; import org.ethereum.vm.DataWord; import org.bouncycastle.util.encoders.Hex; @@ -39,7 +42,13 @@ public ContractDetailsMapper(RskSystemProperties config) { public ContractDetails mapFromContract(Contract contract) { ContractDetails contractDetails; - contractDetails = new ContractDetailsImpl(config); + contractDetails = new ContractDetailsImpl( + null, + new TrieImpl(new TrieStoreImpl(new HashMapDB()), true), + null, + config.detailsInMemoryStorageLimit(), + config.databaseDir() + ); if (contract.getCode()!=null) { contractDetails.setCode(Hex.decode(contract.getCode())); diff --git a/rskj-core/src/main/java/org/ethereum/datasource/DataSource.java b/rskj-core/src/main/java/org/ethereum/datasource/DataSource.java index d0afe6d1bac..80069f28b7a 100644 --- a/rskj-core/src/main/java/org/ethereum/datasource/DataSource.java +++ b/rskj-core/src/main/java/org/ethereum/datasource/DataSource.java @@ -25,8 +25,6 @@ */ public interface DataSource { - void setName(String name); - String getName(); void init(); diff --git a/rskj-core/src/main/java/org/ethereum/datasource/DataSourcePool.java b/rskj-core/src/main/java/org/ethereum/datasource/DataSourcePool.java index 34d58ad9484..6061dcdf68a 100644 --- a/rskj-core/src/main/java/org/ethereum/datasource/DataSourcePool.java +++ b/rskj-core/src/main/java/org/ethereum/datasource/DataSourcePool.java @@ -19,7 +19,6 @@ package org.ethereum.datasource; -import co.rsk.config.RskSystemProperties; import org.slf4j.Logger; import java.util.concurrent.ConcurrentHashMap; @@ -32,8 +31,8 @@ public class DataSourcePool { private static final Logger logger = getLogger("db"); private static ConcurrentMap pool = new ConcurrentHashMap<>(); - public static KeyValueDataSource levelDbByName(RskSystemProperties config, String name) { - DataSource dataSource = new LevelDbDataSource(config, name); + public static KeyValueDataSource levelDbByName(String name, String databaseDir) { + DataSource dataSource = new LevelDbDataSource(name, databaseDir); DataSourceEx dataSourceEx = new DataSourceEx(dataSource); DataSourceEx result = pool.putIfAbsent(name, dataSourceEx); if (result == null) { diff --git a/rskj-core/src/main/java/org/ethereum/datasource/HashMapDB.java b/rskj-core/src/main/java/org/ethereum/datasource/HashMapDB.java index eb9eff5c36b..1776e54508b 100644 --- a/rskj-core/src/main/java/org/ethereum/datasource/HashMapDB.java +++ b/rskj-core/src/main/java/org/ethereum/datasource/HashMapDB.java @@ -60,11 +60,6 @@ public boolean isAlive() { return true; } - @Override - public void setName(String name) { - - } - @Override public String getName() { return "in-memory"; diff --git a/rskj-core/src/main/java/org/ethereum/datasource/LevelDbDataSource.java b/rskj-core/src/main/java/org/ethereum/datasource/LevelDbDataSource.java index 3330f02e607..3860d011ada 100644 --- a/rskj-core/src/main/java/org/ethereum/datasource/LevelDbDataSource.java +++ b/rskj-core/src/main/java/org/ethereum/datasource/LevelDbDataSource.java @@ -19,7 +19,6 @@ package org.ethereum.datasource; -import co.rsk.config.RskSystemProperties; import co.rsk.panic.PanicProcessor; import org.iq80.leveldb.*; import org.slf4j.Logger; @@ -49,8 +48,8 @@ public class LevelDbDataSource implements KeyValueDataSource { private static final Logger logger = LoggerFactory.getLogger("db"); private static final PanicProcessor panicProcessor = new PanicProcessor(); - private final RskSystemProperties config; - private String name; + private final String databaseDir; + private final String name; private DB db; private boolean alive; @@ -62,8 +61,8 @@ public class LevelDbDataSource implements KeyValueDataSource { // however blocks them on init/close/delete operations private ReadWriteLock resetDbLock = new ReentrantReadWriteLock(); - public LevelDbDataSource(RskSystemProperties config, String name) { - this.config = config; + public LevelDbDataSource(String name, String databaseDir) { + this.databaseDir = databaseDir; this.name = name; logger.debug("New LevelDbDataSource: {}", name); } @@ -95,10 +94,10 @@ public void init() { logger.debug("Opening database"); Path dbPath; - if (Paths.get(config.databaseDir()).isAbsolute()) { - dbPath = Paths.get(config.databaseDir(), name); + if (Paths.get(databaseDir).isAbsolute()) { + dbPath = Paths.get(databaseDir, name); } else { - dbPath = Paths.get(getProperty("user.dir"), config.databaseDir(), name); + dbPath = Paths.get(getProperty("user.dir"), databaseDir, name); } Files.createDirectories(dbPath.getParent()); @@ -144,11 +143,6 @@ public void destroyDB(File fileLocation) { } } - @Override - public void setName(String name) { - this.name = name; - } - @Override public String getName() { return name; diff --git a/rskj-core/src/main/java/org/ethereum/db/BlockStore.java b/rskj-core/src/main/java/org/ethereum/db/BlockStore.java index a69ae8e31e2..e81dcb56055 100644 --- a/rskj-core/src/main/java/org/ethereum/db/BlockStore.java +++ b/rskj-core/src/main/java/org/ethereum/db/BlockStore.java @@ -73,7 +73,5 @@ public interface BlockStore extends RemascCache { void reBranch(Block forkBlock); - void load(); - List getBlocksInformationByNumber(long number); } diff --git a/rskj-core/src/main/java/org/ethereum/db/DatabaseImpl.java b/rskj-core/src/main/java/org/ethereum/db/DatabaseImpl.java index 312251d3dff..ded65145720 100644 --- a/rskj-core/src/main/java/org/ethereum/db/DatabaseImpl.java +++ b/rskj-core/src/main/java/org/ethereum/db/DatabaseImpl.java @@ -47,14 +47,6 @@ public DatabaseImpl(KeyValueDataSource keyValueDataSource) { this.keyValueDataSource = keyValueDataSource; } - - public DatabaseImpl(String name) { - - keyValueDataSource.setName(name); - keyValueDataSource.init(); - } - - @Override public byte[] get(byte[] key) { return keyValueDataSource.get(key); diff --git a/rskj-core/src/main/java/org/ethereum/db/DetailsDataStore.java b/rskj-core/src/main/java/org/ethereum/db/DetailsDataStore.java index 835f07ef9d3..31a898b8ba9 100644 --- a/rskj-core/src/main/java/org/ethereum/db/DetailsDataStore.java +++ b/rskj-core/src/main/java/org/ethereum/db/DetailsDataStore.java @@ -19,7 +19,6 @@ package org.ethereum.db; -import co.rsk.config.RskSystemProperties; import co.rsk.core.RskAddress; import co.rsk.db.ContractDetailsImpl; import org.slf4j.Logger; @@ -43,15 +42,13 @@ public class DetailsDataStore { private final Map cache = new ConcurrentHashMap<>(); private final Set removes = new HashSet<>(); - private final RskSystemProperties config; private final DatabaseImpl db; - public DetailsDataStore(RskSystemProperties config, DatabaseImpl db) { - this.config = config; + public DetailsDataStore(DatabaseImpl db) { this.db = db; } - public synchronized ContractDetails get(RskAddress addr) { + public synchronized ContractDetails get(RskAddress addr, int memoryStorageLimit, String databaseDir) { ContractDetails details = cache.get(addr); if (details == null) { @@ -64,7 +61,7 @@ public synchronized ContractDetails get(RskAddress addr) { return null; } - details = createContractDetails(data); + details = createContractDetails(data, memoryStorageLimit, databaseDir); cache.put(addr, details); float out = ((float) data.length) / 1048576; @@ -77,8 +74,8 @@ public synchronized ContractDetails get(RskAddress addr) { return details; } - protected ContractDetails createContractDetails(byte[] data) { - return new ContractDetailsImpl(config, data); + protected ContractDetails createContractDetails(byte[] data, int memoryStorageLimit, String databaseDir) { + return new ContractDetailsImpl(data, memoryStorageLimit, databaseDir); } public synchronized void update(RskAddress addr, ContractDetails contractDetails) { diff --git a/rskj-core/src/main/java/org/ethereum/db/IndexedBlockStore.java b/rskj-core/src/main/java/org/ethereum/db/IndexedBlockStore.java index 28f191c88d8..99b6d1cce24 100644 --- a/rskj-core/src/main/java/org/ethereum/db/IndexedBlockStore.java +++ b/rskj-core/src/main/java/org/ethereum/db/IndexedBlockStore.java @@ -519,10 +519,6 @@ private static BlockInfo getBlockInfoForHash(List blocks, byte[] hash return null; } - @Override - public void load() { - } - @Override public synchronized List getChainBlocksByNumber(long number){ List result = new ArrayList<>(); diff --git a/rskj-core/src/main/java/org/ethereum/db/RepositoryTrack.java b/rskj-core/src/main/java/org/ethereum/db/RepositoryTrack.java index 6b90fcd0ca1..6601f901a0d 100644 --- a/rskj-core/src/main/java/org/ethereum/db/RepositoryTrack.java +++ b/rskj-core/src/main/java/org/ethereum/db/RepositoryTrack.java @@ -19,7 +19,6 @@ package org.ethereum.db; -import co.rsk.config.RskSystemProperties; import co.rsk.core.Coin; import co.rsk.core.RskAddress; import co.rsk.db.ContractDetailsImpl; @@ -54,15 +53,12 @@ public class RepositoryTrack implements Repository { private final Map cacheAccounts = new HashMap<>(); private final Map cacheDetails = new HashMap<>(); - private final RskSystemProperties config; private final DetailsDataStore dds; + private final Repository repository; - Repository repository; - - public RepositoryTrack(RskSystemProperties config, Repository repository) { - this.config = config; + public RepositoryTrack(Repository repository) { this.repository = repository; - dds = new DetailsDataStore(this.config, new DatabaseImpl(new HashMapDB())); + this.dds = new DetailsDataStore(new DatabaseImpl(new HashMapDB())); } @Override @@ -327,7 +323,7 @@ public void dumpState(Block block, long gasUsed, int txNumber, byte[] txHash) { public Repository startTracking() { logger.debug("start tracking"); - return new RepositoryTrack(config, this); + return new RepositoryTrack(this); } diff --git a/rskj-core/src/main/java/org/ethereum/manager/AdminInfo.java b/rskj-core/src/main/java/org/ethereum/manager/AdminInfo.java deleted file mode 100644 index f0958282a3f..00000000000 --- a/rskj-core/src/main/java/org/ethereum/manager/AdminInfo.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * This file is part of RskJ - * Copyright (C) 2017 RSK Labs Ltd. - * (derived from ethereumJ library, Copyright (c) 2016 ) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program. If not, see . - */ - -package org.ethereum.manager; - -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import java.util.LinkedList; -import java.util.List; - -/** - * @author Roman Mandeleil - * @since 11.12.2014 - */ -@Component -public class AdminInfo { - - - private long startupTimeStamp; - private boolean consensus = true; - private List blockExecTime = new LinkedList<>(); - - - @PostConstruct - public void init() { - startupTimeStamp = System.currentTimeMillis(); - } - - public long getStartupTimeStamp() { - return startupTimeStamp; - } - - public boolean isConsensus() { - return consensus; - } - - public void lostConsensus() { - consensus = false; - } - - public void addBlockExecTime(long time){ - blockExecTime.add(time); - } - - public Long getExecAvg(){ - - if (blockExecTime.size() == 0) { - return 0L; - } - - long sum = 0; - for (int i = 0; i < blockExecTime.size(); ++i){ - sum += blockExecTime.get(i); - } - - return sum / blockExecTime.size(); - } - - public List getBlockExecTime(){ - return blockExecTime; - } -} diff --git a/rskj-core/src/main/java/org/ethereum/vm/VMUtils.java b/rskj-core/src/main/java/org/ethereum/vm/VMUtils.java index 931b283c17f..0a871292e72 100644 --- a/rskj-core/src/main/java/org/ethereum/vm/VMUtils.java +++ b/rskj-core/src/main/java/org/ethereum/vm/VMUtils.java @@ -19,7 +19,6 @@ package org.ethereum.vm; -import co.rsk.config.RskSystemProperties; import org.ethereum.vm.trace.ProgramTrace; import org.ethereum.vm.trace.Serializers; @@ -53,12 +52,12 @@ public static void saveProgramTraceFile(Path basePath, String txHash, boolean co } } - public static void saveProgramTraceFile(RskSystemProperties config, String txHash, ProgramTrace trace) throws IOException { - Path tracePath = Paths.get(config.databaseDir(), config.vmTraceDir()); + public static void saveProgramTraceFile(String txHash, ProgramTrace trace, String databaseDir, String vmTraceDir, boolean vmTraceCompressed) throws IOException { + Path tracePath = Paths.get(databaseDir, vmTraceDir); File traceDir = tracePath.toFile(); if (!traceDir.exists()) { traceDir.mkdirs(); } - saveProgramTraceFile(tracePath, txHash, config.vmTraceCompressed(), trace); + saveProgramTraceFile(tracePath, txHash, vmTraceCompressed, trace); } } diff --git a/rskj-core/src/test/java/co/rsk/TestHelpers/Tx.java b/rskj-core/src/test/java/co/rsk/TestHelpers/Tx.java index 4e2d6c445b2..a1aa63b9d90 100644 --- a/rskj-core/src/test/java/co/rsk/TestHelpers/Tx.java +++ b/rskj-core/src/test/java/co/rsk/TestHelpers/Tx.java @@ -85,7 +85,7 @@ public static Transaction create( b[i] = bytes.get(i); } Mockito.when(transaction.getData()).thenReturn(b); - Mockito.when(transaction.transactionCost(eq(config), any(Block.class))).thenReturn(amount); + Mockito.when(transaction.transactionCost(any(Block.class), eq(config.getBlockchainConfig()))).thenReturn(amount); return transaction; } diff --git a/rskj-core/src/test/java/co/rsk/core/CallContractTest.java b/rskj-core/src/test/java/co/rsk/core/CallContractTest.java index 02313c65817..56d2521c056 100644 --- a/rskj-core/src/test/java/co/rsk/core/CallContractTest.java +++ b/rskj-core/src/test/java/co/rsk/core/CallContractTest.java @@ -22,6 +22,8 @@ import co.rsk.test.World; import co.rsk.test.builders.AccountBuilder; import org.ethereum.core.*; +import org.ethereum.listener.EthereumListenerAdapter; +import org.ethereum.vm.PrecompiledContracts; import org.ethereum.vm.program.ProgramResult; import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; import org.junit.Assert; @@ -63,10 +65,27 @@ private static ProgramResult callContract(World world, RskAddress receiveAddress Repository repository = world.getRepository().startTracking(); try { - org.ethereum.core.TransactionExecutor executor = new org.ethereum.core.TransactionExecutor - (config, tx, 0, bestBlock.getCoinbase(), repository, null, null, - new ProgramInvokeFactoryImpl(), bestBlock) - .setLocalCall(true); + org.ethereum.core.TransactionExecutor executor = new TransactionExecutor( + tx, + 0, + bestBlock.getCoinbase(), + repository, + null, + null, + new ProgramInvokeFactoryImpl(), + bestBlock, + new EthereumListenerAdapter(), + 0, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed()) + .setLocalCall(true); executor.init(); executor.execute(); diff --git a/rskj-core/src/test/java/co/rsk/core/CodeReplaceTest.java b/rskj-core/src/test/java/co/rsk/core/CodeReplaceTest.java index 65222ff6235..ea397c5b873 100644 --- a/rskj-core/src/test/java/co/rsk/core/CodeReplaceTest.java +++ b/rskj-core/src/test/java/co/rsk/core/CodeReplaceTest.java @@ -26,13 +26,14 @@ import org.ethereum.core.TransactionExecutor; import org.ethereum.core.genesis.GenesisLoader; import org.ethereum.crypto.ECKey; +import org.ethereum.listener.EthereumListenerAdapter; import org.ethereum.util.ByteUtil; +import org.ethereum.vm.PrecompiledContracts; import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; import org.junit.Assert; import org.junit.Test; import org.bouncycastle.util.encoders.Hex; -import java.io.IOException; import java.math.BigInteger; import java.util.Arrays; @@ -200,8 +201,27 @@ protected Transaction createTx(BlockChainImpl blockchain, ECKey sender, byte[] r public TransactionExecutor executeTransaction(BlockChainImpl blockchain, Transaction tx) { Repository track = blockchain.getRepository().startTracking(); - TransactionExecutor executor = new TransactionExecutor(config, tx, 0, RskAddress.nullAddress(), blockchain.getRepository(), - blockchain.getBlockStore(), null, new ProgramInvokeFactoryImpl(), blockchain.getBestBlock()); + TransactionExecutor executor = new TransactionExecutor( + tx, + 0, + RskAddress.nullAddress(), + blockchain.getRepository(), + blockchain.getBlockStore(), + null, + new ProgramInvokeFactoryImpl(), + blockchain.getBestBlock(), + new EthereumListenerAdapter(), + 0, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + ); executor.init(); executor.execute(); diff --git a/rskj-core/src/test/java/co/rsk/core/NetworkStateExporterTest.java b/rskj-core/src/test/java/co/rsk/core/NetworkStateExporterTest.java index 58e46b0329c..4085d0cc07d 100644 --- a/rskj-core/src/test/java/co/rsk/core/NetworkStateExporterTest.java +++ b/rskj-core/src/test/java/co/rsk/core/NetworkStateExporterTest.java @@ -20,6 +20,7 @@ import co.rsk.config.TestSystemProperties; import co.rsk.db.RepositoryImpl; +import co.rsk.trie.TrieImpl; import co.rsk.trie.TrieStoreImpl; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; @@ -64,7 +65,7 @@ public static void cleanup(){ @Test public void testEmptyRepo() throws Exception { - Repository repository = new RepositoryImpl(config, new TrieStoreImpl(new HashMapDB())); + Repository repository = new RepositoryImpl(new TrieStoreImpl(new HashMapDB()), config.detailsInMemoryStorageLimit(), config.databaseDir()); Map result = writeAndReadJson(repository); @@ -73,7 +74,7 @@ public void testEmptyRepo() throws Exception { @Test public void testNoContracts() throws Exception { - Repository repository = new RepositoryImpl(config, new TrieStoreImpl(new HashMapDB())); + Repository repository = new RepositoryImpl(new TrieStoreImpl(new HashMapDB()), config.detailsInMemoryStorageLimit(), config.databaseDir()); String address1String = "1000000000000000000000000000000000000000"; RskAddress addr1 = new RskAddress(address1String); repository.createAccount(addr1); @@ -116,13 +117,19 @@ public void testNoContracts() throws Exception { @Test public void testContracts() throws Exception { - Repository repository = new RepositoryImpl(config, new TrieStoreImpl(new HashMapDB())); + Repository repository = new RepositoryImpl(new TrieStoreImpl(new HashMapDB()), config.detailsInMemoryStorageLimit(), config.databaseDir()); String address1String = "1000000000000000000000000000000000000000"; RskAddress addr1 = new RskAddress(address1String); repository.createAccount(addr1); repository.addBalance(addr1, Coin.valueOf(1L)); repository.increaseNonce(addr1); - ContractDetails contractDetails = new co.rsk.db.ContractDetailsImpl(config); + ContractDetails contractDetails = new co.rsk.db.ContractDetailsImpl( + null, + new TrieImpl(new TrieStoreImpl(new HashMapDB()), true), + null, + config.detailsInMemoryStorageLimit(), + config.databaseDir() + ); contractDetails.setCode(new byte[] {1, 2, 3, 4}); contractDetails.put(DataWord.ZERO, DataWord.ONE); contractDetails.putBytes(DataWord.ONE, new byte[] {5, 6, 7, 8}); diff --git a/rskj-core/src/test/java/co/rsk/core/TransactionTest.java b/rskj-core/src/test/java/co/rsk/core/TransactionTest.java index a783136ff84..5a8fff9da15 100644 --- a/rskj-core/src/test/java/co/rsk/core/TransactionTest.java +++ b/rskj-core/src/test/java/co/rsk/core/TransactionTest.java @@ -26,6 +26,7 @@ import org.ethereum.db.BlockStoreDummy; import org.ethereum.jsontestsuite.StateTestSuite; import org.ethereum.jsontestsuite.runners.StateTestRunner; +import org.ethereum.listener.EthereumListenerAdapter; import org.ethereum.vm.PrecompiledContracts; import org.ethereum.vm.program.ProgramResult; import org.junit.Assert; @@ -238,10 +239,27 @@ protected ProgramResult executeTransaction(Transaction tx) { Block bestBlock = block; - TransactionExecutor executor = new TransactionExecutor - (config, txConst, 0, bestBlock.getCoinbase(), track, new BlockStoreDummy(), null, - invokeFactory, bestBlock) - .setLocalCall(true); + TransactionExecutor executor = new TransactionExecutor( + txConst, + 0, + bestBlock.getCoinbase(), + track, + new BlockStoreDummy(), + null, + invokeFactory, + bestBlock, + new EthereumListenerAdapter(), + 0, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed()) + .setLocalCall(true); executor.init(); executor.execute(); diff --git a/rskj-core/src/test/java/co/rsk/core/WalletFactory.java b/rskj-core/src/test/java/co/rsk/core/WalletFactory.java index 6997d971616..9ce4f7640da 100644 --- a/rskj-core/src/test/java/co/rsk/core/WalletFactory.java +++ b/rskj-core/src/test/java/co/rsk/core/WalletFactory.java @@ -26,7 +26,8 @@ public class WalletFactory { public static Wallet createPersistentWallet(String storeName) { - KeyValueDataSource ds = new LevelDbDataSource(new TestSystemProperties(), storeName); + final TestSystemProperties config = new TestSystemProperties(); + KeyValueDataSource ds = new LevelDbDataSource(storeName, config.databaseDir()); ds.init(); return new Wallet(ds); } diff --git a/rskj-core/src/test/java/co/rsk/core/bc/BlockChainImplTest.java b/rskj-core/src/test/java/co/rsk/core/bc/BlockChainImplTest.java index ff2d2e2531a..b170b701c84 100644 --- a/rskj-core/src/test/java/co/rsk/core/bc/BlockChainImplTest.java +++ b/rskj-core/src/test/java/co/rsk/core/bc/BlockChainImplTest.java @@ -38,9 +38,9 @@ import org.ethereum.db.ReceiptStore; import org.ethereum.db.ReceiptStoreImpl; import org.ethereum.listener.CompositeEthereumListener; -import org.ethereum.manager.AdminInfo; import org.ethereum.util.FastByteComparisons; import org.ethereum.vm.PrecompiledContracts; +import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; import org.junit.Assert; import org.junit.Test; import org.mapdb.DB; @@ -197,10 +197,6 @@ public void addBlockOne() { Block genesis = getGenesisBlock(blockChain); Block block1 = new BlockGenerator().createChildBlock(genesis); - SimpleAdminInfo adminInfo = (SimpleAdminInfo)blockChain.getAdminInfo(); - Assert.assertEquals(0, adminInfo.getCount()); - Assert.assertEquals(0, adminInfo.getTime()); - Assert.assertEquals(ImportResult.IMPORTED_BEST, blockChain.tryToConnect(genesis)); Assert.assertEquals(ImportResult.IMPORTED_BEST, blockChain.tryToConnect(block1)); @@ -208,9 +204,6 @@ public void addBlockOne() { Assert.assertTrue(blockChain.isBlockExist(genesis.getHash().getBytes())); Assert.assertTrue(blockChain.isBlockExist(block1.getHash().getBytes())); - Assert.assertEquals(1, adminInfo.getCount()); - Assert.assertTrue(adminInfo.getTime() >= 0); - BlockChainStatus status = blockChain.getStatus(); Assert.assertNotNull(status); @@ -813,7 +806,28 @@ public void listenOnBlockWhenAddingBlock() { @Test public void createWithoutArgumentsAndUnusedMethods() { - BlockChainImpl blockChain = new BlockChainImpl(config, null, null, null, null, null, null, new DummyBlockValidator()); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockChainImpl blockChain = new BlockChainImpl(null, null, null, null, null, new DummyBlockValidator(), false, 1, new BlockExecutor(null, (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + null, + null, + programInvokeFactory, + block1, + null, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + ))); blockChain.setExitOn(0); blockChain.close(); } @@ -833,7 +847,7 @@ public void useBlockRecorder() { @Test public void addInvalidMGPBlock() { - Repository repository = new RepositoryImpl(config, new TrieStoreImpl(new HashMapDB())); + Repository repository = new RepositoryImpl(new TrieStoreImpl(new HashMapDB()), config.detailsInMemoryStorageLimit(), config.databaseDir()); IndexedBlockStore blockStore = new IndexedBlockStore(new HashMap<>(), new HashMapDB(), null); @@ -864,7 +878,7 @@ public void addInvalidMGPBlock() { @Test public void addValidMGPBlock() { - Repository repository = new RepositoryImpl(config, new TrieStoreImpl(new HashMapDB())); + Repository repository = new RepositoryImpl(new TrieStoreImpl(new HashMapDB()), config.detailsInMemoryStorageLimit(), config.databaseDir()); IndexedBlockStore blockStore = new IndexedBlockStore(new HashMap<>(), new HashMapDB(), (DB) null); @@ -892,7 +906,28 @@ public void addValidMGPBlock() { Block block = new BlockBuilder().minGasPrice(BigInteger.ZERO).transactions(txs) .parent(genesis).build(); - BlockExecutor executor = new BlockExecutor(config, repository, null, null, null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor executor = new BlockExecutor(repository, (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + null, + null, + programInvokeFactory, + block1, + null, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); executor.executeAndFill(block, genesis); Assert.assertEquals(ImportResult.IMPORTED_BEST, blockChain.tryToConnect(genesis)); @@ -900,7 +935,7 @@ public void addValidMGPBlock() { } public static BlockChainImpl createBlockChain() { - return new BlockChainBuilder().setAdminInfo(new SimpleAdminInfo()).build(); + return new BlockChainBuilder().build(); } public static BlockChainImpl createBlockChain(Repository repository) { @@ -920,12 +955,31 @@ private static BlockChainImpl createBlockChain(Repository repository, IndexedBlo ds.init(); ReceiptStore receiptStore = new ReceiptStoreImpl(ds); - AdminInfo adminInfo = new SimpleAdminInfo(); - CompositeEthereumListener listener = new BlockExecutorTest.SimpleEthereumListener(); TransactionPoolImpl transactionPool = new TransactionPoolImpl(config, repository, blockStore, receiptStore, null, listener, 10, 100); - return new BlockChainImpl(config, repository, blockStore, receiptStore, transactionPool, listener, adminInfo, blockValidator); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + return new BlockChainImpl(repository, blockStore, receiptStore, transactionPool, listener, blockValidator, false, 1, new BlockExecutor(repository, (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + blockStore, + receiptStore, + programInvokeFactory, + block1, + listener, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + ))); } public static Block getGenesisBlock(BlockChainImpl blockChain) { @@ -945,7 +999,28 @@ public static Block getGenesisBlock(BlockChainImpl blockChain) { } private static BlockExecutor createExecutor(BlockChainImpl blockChain) { - return new BlockExecutor(config, blockChain.getRepository(), null, blockChain.getBlockStore(), blockChain.getListener()); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + return new BlockExecutor(blockChain.getRepository(), (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + blockChain.getBlockStore(), + null, + programInvokeFactory, + block1, + blockChain.getListener(), + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); } private static void alterBytes(byte[] bytes) { @@ -962,25 +1037,6 @@ private static byte[] cloneAlterBytes(byte[] bytes) { return cloned; } - public static class SimpleAdminInfo extends AdminInfo { - private long time; - private int count; - - @Override - public void addBlockExecTime(long time){ - this.time += time; - count++; - } - - public long getTime() { - return time; - } - - public int getCount() { - return count; - } - } - public static class RejectValidator implements BlockValidator { @Override public boolean isValid(Block block) { diff --git a/rskj-core/src/test/java/co/rsk/core/bc/BlockExecutorTest.java b/rskj-core/src/test/java/co/rsk/core/bc/BlockExecutorTest.java index 520dc913a51..99abe36fcc4 100644 --- a/rskj-core/src/test/java/co/rsk/core/bc/BlockExecutorTest.java +++ b/rskj-core/src/test/java/co/rsk/core/bc/BlockExecutorTest.java @@ -37,6 +37,8 @@ import org.ethereum.net.rlpx.Node; import org.ethereum.net.server.Channel; import org.ethereum.util.RLP; +import org.ethereum.vm.PrecompiledContracts; +import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; import org.ethereum.vm.trace.ProgramTrace; import org.junit.Assert; import org.junit.Test; @@ -62,7 +64,7 @@ public void executeBlockWithoutTransaction() { BlockGenerator blockGenerator = new BlockGenerator(); Block block = blockGenerator.createChildBlock(blockGenerator.getGenesisBlock()); - Repository repository = new RepositoryImpl(config, new TrieStoreImpl(new HashMapDB())); + Repository repository = new RepositoryImpl(new TrieStoreImpl(new HashMapDB()), config.detailsInMemoryStorageLimit(), config.databaseDir()); Repository track = repository.startTracking(); @@ -72,7 +74,28 @@ public void executeBlockWithoutTransaction() { Assert.assertFalse(Arrays.equals(EMPTY_TRIE_HASH, repository.getRoot())); - BlockExecutor executor = new BlockExecutor(config, repository, null, null, null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor executor = new BlockExecutor(repository, (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + null, + null, + programInvokeFactory, + block1, + null, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); BlockResult result = executor.execute(block, repository.getRoot(), false); @@ -93,7 +116,28 @@ public void executeBlockWithOneTransaction() { SimpleEthereumListener listener = new SimpleEthereumListener(); TestObjects objects = generateBlockWithOneTransaction(); Block block = objects.getBlock(); - BlockExecutor executor = new BlockExecutor(config, objects.getRepository(), null, null, listener); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor executor = new BlockExecutor(objects.getRepository(), (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + null, + null, + programInvokeFactory, + block1, + listener, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); Repository repository = objects.getRepository(); Transaction tx = objects.getTransaction(); Account account = objects.getAccount(); @@ -143,7 +187,7 @@ public void executeBlockWithOneTransaction() { @Test public void executeBlockWithTwoTransactions() { - Repository repository = new RepositoryImpl(config, new TrieStoreImpl(new HashMapDB())); + Repository repository = new RepositoryImpl(new TrieStoreImpl(new HashMapDB()), config.detailsInMemoryStorageLimit(), config.databaseDir()); Repository track = repository.startTracking(); @@ -154,7 +198,28 @@ public void executeBlockWithTwoTransactions() { Assert.assertFalse(Arrays.equals(EMPTY_TRIE_HASH, repository.getRoot())); - BlockExecutor executor = new BlockExecutor(config, repository, null, null, null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor executor = new BlockExecutor(repository, (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + null, + null, + programInvokeFactory, + block1, + null, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); Transaction tx1 = createTransaction(account, account2, BigInteger.TEN, repository.getNonce(account.getAddress())); Transaction tx2 = createTransaction(account, account2, BigInteger.TEN, repository.getNonce(account.getAddress()).add(BigInteger.ONE)); @@ -217,7 +282,28 @@ public void executeAndFillBlockWithOneTransaction() { TestObjects objects = generateBlockWithOneTransaction(); Block parent = objects.getParent(); Block block = objects.getBlock(); - BlockExecutor executor = new BlockExecutor(config, objects.getRepository(), null, null, null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor executor = new BlockExecutor(objects.getRepository(), (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + null, + null, + programInvokeFactory, + block1, + null, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); BlockResult result = executor.execute(block, parent.getStateRoot(), false); executor.executeAndFill(block, parent); @@ -233,7 +319,7 @@ public void executeAndFillBlockWithOneTransaction() { @Test public void executeAndFillBlockWithTxToExcludeBecauseSenderHasNoBalance() { - Repository repository = new RepositoryImpl(config, new TrieStoreImpl(new HashMapDB())); + Repository repository = new RepositoryImpl(new TrieStoreImpl(new HashMapDB()), config.detailsInMemoryStorageLimit(), config.databaseDir()); Repository track = repository.startTracking(); @@ -245,7 +331,28 @@ public void executeAndFillBlockWithTxToExcludeBecauseSenderHasNoBalance() { Assert.assertFalse(Arrays.equals(EMPTY_TRIE_HASH, repository.getRoot())); - BlockExecutor executor = new BlockExecutor(config, repository, null, null, null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor executor = new BlockExecutor(repository, (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + null, + null, + programInvokeFactory, + block1, + null, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); Transaction tx = createTransaction(account, account2, BigInteger.TEN, repository.getNonce(account.getAddress())); Transaction tx2 = createTransaction(account3, account2, BigInteger.TEN, repository.getNonce(account3.getAddress())); @@ -272,7 +379,7 @@ public void executeAndFillBlockWithTxToExcludeBecauseSenderHasNoBalance() { @Test public void executeBlockWithTxThatMakesBlockInvalidSenderHasNoBalance() { - Repository repository = new RepositoryImpl(config, new TrieStoreImpl(new HashMapDB())); + Repository repository = new RepositoryImpl(new TrieStoreImpl(new HashMapDB()), config.detailsInMemoryStorageLimit(), config.databaseDir()); Repository track = repository.startTracking(); @@ -284,7 +391,28 @@ public void executeBlockWithTxThatMakesBlockInvalidSenderHasNoBalance() { Assert.assertFalse(Arrays.equals(EMPTY_TRIE_HASH, repository.getRoot())); - BlockExecutor executor = new BlockExecutor(config, repository, null, null, null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor executor = new BlockExecutor(repository, (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + null, + null, + programInvokeFactory, + block1, + null, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); Transaction tx = createTransaction(account, account2, BigInteger.TEN, repository.getNonce(account.getAddress())); Transaction tx2 = createTransaction(account3, account2, BigInteger.TEN, repository.getNonce(account3.getAddress())); @@ -309,7 +437,28 @@ public void validateBlock() { TestObjects objects = generateBlockWithOneTransaction(); Block parent = objects.getParent(); Block block = objects.getBlock(); - BlockExecutor executor = new BlockExecutor(config, objects.getRepository(), null, null, null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor executor = new BlockExecutor(objects.getRepository(), (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + null, + null, + programInvokeFactory, + block1, + null, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); Assert.assertTrue(executor.executeAndValidate(block, parent)); } @@ -319,7 +468,28 @@ public void invalidBlockBadStateRoot() { TestObjects objects = generateBlockWithOneTransaction(); Block parent = objects.getParent(); Block block = objects.getBlock(); - BlockExecutor executor = new BlockExecutor(config, objects.getRepository(), null, null, null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor executor = new BlockExecutor(objects.getRepository(), (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + null, + null, + programInvokeFactory, + block1, + null, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); byte[] stateRoot = block.getStateRoot(); stateRoot[0] = (byte)((stateRoot[0] + 1) % 256); @@ -332,7 +502,28 @@ public void invalidBlockBadReceiptsRoot() { TestObjects objects = generateBlockWithOneTransaction(); Block parent = objects.getParent(); Block block = objects.getBlock(); - BlockExecutor executor = new BlockExecutor(config, objects.getRepository(), null, null, null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor executor = new BlockExecutor(objects.getRepository(), (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + null, + null, + programInvokeFactory, + block1, + null, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); byte[] receiptsRoot = block.getReceiptsRoot(); receiptsRoot[0] = (byte)((receiptsRoot[0] + 1) % 256); @@ -345,7 +536,28 @@ public void invalidBlockBadGasUsed() { TestObjects objects = generateBlockWithOneTransaction(); Block parent = objects.getParent(); Block block = objects.getBlock(); - BlockExecutor executor = new BlockExecutor(config, objects.getRepository(), null, null, null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor executor = new BlockExecutor(objects.getRepository(), (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + null, + null, + programInvokeFactory, + block1, + null, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); block.getHeader().setGasUsed(0); @@ -357,7 +569,28 @@ public void invalidBlockBadPaidFees() { TestObjects objects = generateBlockWithOneTransaction(); Block parent = objects.getParent(); Block block = objects.getBlock(); - BlockExecutor executor = new BlockExecutor(config, objects.getRepository(), null, null, null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor executor = new BlockExecutor(objects.getRepository(), (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + null, + null, + programInvokeFactory, + block1, + null, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); block.getHeader().setPaidFees(Coin.ZERO); @@ -369,7 +602,28 @@ public void invalidBlockBadLogsBloom() { TestObjects objects = generateBlockWithOneTransaction(); Block parent = objects.getParent(); Block block = objects.getBlock(); - BlockExecutor executor = new BlockExecutor(config, objects.getRepository(), null, null, null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor executor = new BlockExecutor(objects.getRepository(), (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + null, + null, + programInvokeFactory, + block1, + null, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); byte[] logBloom = block.getLogBloom(); logBloom[0] = (byte)((logBloom[0] + 1) % 256); @@ -390,7 +644,28 @@ public static TestObjects generateBlockWithOneTransaction() { Assert.assertFalse(Arrays.equals(EMPTY_TRIE_HASH, repository.getRoot())); - BlockExecutor executor = new BlockExecutor(config, repository, null, null, null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor executor = new BlockExecutor(repository, (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + null, + null, + programInvokeFactory, + block1, + null, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); Transaction tx = createTransaction(account, account2, BigInteger.TEN, repository.getNonce(account.getAddress())); List txs = new ArrayList<>(); @@ -453,7 +728,28 @@ public void executeBlocksWithOneStrangeTransactions3() { public void executeBlockWithOneStrangeTransaction(boolean mustFailValidation, boolean mustFailExecution, TestObjects objects) { SimpleEthereumListener listener = new SimpleEthereumListener(); Block block = objects.getBlock(); - BlockExecutor executor = new BlockExecutor(config, objects.getRepository(), null, null, listener); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor executor = new BlockExecutor(objects.getRepository(), (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + null, + null, + programInvokeFactory, + block1, + listener, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); Repository repository = objects.getRepository(); Transaction tx = objects.getTransaction(); Account account = objects.getAccount(); @@ -528,7 +824,28 @@ public static TestObjects generateBlockWithOneStrangeTransaction(int strangeTran Assert.assertFalse(Arrays.equals(EMPTY_TRIE_HASH, repository.getRoot())); - BlockExecutor executor = new BlockExecutor(config, repository, null, null, null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor executor = new BlockExecutor(repository, (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + null, + null, + programInvokeFactory, + block1, + null, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); List txs = new ArrayList<>(); Transaction tx = createStrangeTransaction(account, account2, BigInteger.TEN, repository.getNonce(account.getAddress()), strangeTransactionType); diff --git a/rskj-core/src/test/java/co/rsk/core/bc/BlockValidatorTest.java b/rskj-core/src/test/java/co/rsk/core/bc/BlockValidatorTest.java index e88f8b1af9e..ca93ac9e5c2 100644 --- a/rskj-core/src/test/java/co/rsk/core/bc/BlockValidatorTest.java +++ b/rskj-core/src/test/java/co/rsk/core/bc/BlockValidatorTest.java @@ -964,11 +964,6 @@ public void reBranch(Block forkBlock) { } - @Override - public void load() { - - } - @Override public void removeBlock(Block block) { throw new UnsupportedOperationException(); diff --git a/rskj-core/src/test/java/co/rsk/datasource/DataSourcePoolTest.java b/rskj-core/src/test/java/co/rsk/datasource/DataSourcePoolTest.java index 1dd39ee8961..77f7c07078b 100644 --- a/rskj-core/src/test/java/co/rsk/datasource/DataSourcePoolTest.java +++ b/rskj-core/src/test/java/co/rsk/datasource/DataSourcePoolTest.java @@ -39,16 +39,16 @@ public void setup(){ @Test public void openAndCloseDataSource() { - KeyValueDataSource dataSource = DataSourcePool.levelDbByName(config, "test1"); + KeyValueDataSource dataSource = DataSourcePool.levelDbByName("test1", config.databaseDir()); dataSource.close(); } @Test public void openUseAndCloseDataSource() { - KeyValueDataSource dataSource = DataSourcePool.levelDbByName(config, "test2"); + KeyValueDataSource dataSource = DataSourcePool.levelDbByName("test2", config.databaseDir()); dataSource.put(new byte[] { 0x01 }, new byte[] { 0x02 }); dataSource.close(); - KeyValueDataSource dataSource2 = DataSourcePool.levelDbByName(config, "test2"); + KeyValueDataSource dataSource2 = DataSourcePool.levelDbByName("test2", config.databaseDir()); byte[] result = dataSource2.get(new byte[] { 0x01 }); Assert.assertNotNull(result); Assert.assertEquals(1, result.length); @@ -58,8 +58,8 @@ public void openUseAndCloseDataSource() { @Test public void openUseAndCloseDataSourceTwice() { - KeyValueDataSource dataSource = DataSourcePool.levelDbByName(config, "test3"); - KeyValueDataSource dataSource2 = DataSourcePool.levelDbByName(config, "test3"); + KeyValueDataSource dataSource = DataSourcePool.levelDbByName("test3", config.databaseDir()); + KeyValueDataSource dataSource2 = DataSourcePool.levelDbByName("test3", config.databaseDir()); Assert.assertSame(dataSource, dataSource2); @@ -77,7 +77,7 @@ public void openUseAndCloseDataSourceTwice() { @Test public void openAndCloseTenTimes() { for (int k = 0; k < 10; k++) { - KeyValueDataSource dataSource = DataSourcePool.levelDbByName(config, "test4"); + KeyValueDataSource dataSource = DataSourcePool.levelDbByName("test4", config.databaseDir()); dataSource.put(new byte[] { (byte) k }, new byte[] { (byte) k }); byte[] result = dataSource.get(new byte[] { (byte) k }); diff --git a/rskj-core/src/test/java/co/rsk/db/ContractDetailsImplTest.java b/rskj-core/src/test/java/co/rsk/db/ContractDetailsImplTest.java index 0c101b830d2..a4b9bc461a3 100644 --- a/rskj-core/src/test/java/co/rsk/db/ContractDetailsImplTest.java +++ b/rskj-core/src/test/java/co/rsk/db/ContractDetailsImplTest.java @@ -45,28 +45,28 @@ public class ContractDetailsImplTest { @Test public void getNullFromUnusedAddress() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); Assert.assertEquals(null, details.get(DataWord.ONE)); } @Test public void newContractDetailsIsClean() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); Assert.assertFalse(details.isDirty()); } @Test public void hasNoExternalStorage() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); Assert.assertFalse(details.hasExternalStorage()); } @Test public void hasExternalStorageIfHasEnoughtKeys() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); int nkeys = IN_MEMORY_STORAGE_LIMIT; @@ -78,7 +78,7 @@ public void hasExternalStorageIfHasEnoughtKeys() { @Test public void hasExternalStorageIfHasEnoughtBytesKeys() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); int nkeys = IN_MEMORY_STORAGE_LIMIT; @@ -90,7 +90,7 @@ public void hasExternalStorageIfHasEnoughtBytesKeys() { @Test public void setDirty() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); details.setDirty(true); Assert.assertTrue(details.isDirty()); @@ -98,14 +98,14 @@ public void setDirty() { @Test public void newContractDetailsIsNotDeleted() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); Assert.assertFalse(details.isDeleted()); } @Test public void setDeleted() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); details.setDeleted(true); Assert.assertTrue(details.isDeleted()); @@ -113,7 +113,7 @@ public void setDeleted() { @Test public void putAndGetDataWord() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); details.put(DataWord.ONE, new DataWord(42)); @@ -124,7 +124,7 @@ public void putAndGetDataWord() { @Test public void putDataWordWithoutLeadingZeroes() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); details.put(DataWord.ONE, new DataWord(42)); @@ -140,7 +140,7 @@ public void putDataWordWithoutLeadingZeroes() { @Test public void putDataWordZeroAsDeleteValue() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); details.put(DataWord.ONE, new DataWord(42)); details.put(DataWord.ONE, DataWord.ZERO); @@ -155,7 +155,7 @@ public void putDataWordZeroAsDeleteValue() { @Test public void getNullBytesFromUnusedAddress() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); Assert.assertNull(details.getBytes(DataWord.ONE)); } @@ -164,7 +164,7 @@ public void getNullBytesFromUnusedAddress() { public void putAndGetBytes() { byte[] value = new byte[] { 0x01, 0x02, 0x03 }; - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); details.putBytes(DataWord.ONE, value); @@ -175,7 +175,7 @@ public void putAndGetBytes() { @Test public void putNullValueAsDeleteValue() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); details.putBytes(DataWord.ONE, new byte[] { 0x01, 0x02, 0x03 }); details.putBytes(DataWord.ONE, null); @@ -190,7 +190,7 @@ public void putNullValueAsDeleteValue() { @Test public void getStorageRoot() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); details.put(DataWord.ONE, new DataWord(42)); details.put(DataWord.ZERO, new DataWord(1)); @@ -204,7 +204,7 @@ public void getStorageRoot() { @Test public void getNullCode() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); Assert.assertNull(details.getCode()); } @@ -213,7 +213,7 @@ public void getNullCode() { public void setAndGetCode() { byte[] code = new byte[] { 0x01, 0x02, 0x03 }; - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); details.setCode(code); @@ -222,14 +222,14 @@ public void setAndGetCode() { @Test public void getStorageSizeInEmptyDetails() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); Assert.assertEquals(0, details.getStorageSize()); } @Test public void getStorageSizeInNonEmptyDetails() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); details.put(DataWord.ZERO, DataWord.ONE); details.put(DataWord.ONE, new DataWord(42)); @@ -239,7 +239,7 @@ public void getStorageSizeInNonEmptyDetails() { @Test public void getStorageKeysInNonEmptyDetails() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); details.put(DataWord.ZERO, DataWord.ONE); details.put(DataWord.ONE, new DataWord(42)); @@ -254,7 +254,7 @@ public void getStorageKeysInNonEmptyDetails() { @Test public void getStorageKeysAfterDelete() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); details.put(DataWord.ZERO, DataWord.ONE); details.put(DataWord.ONE, new DataWord(42)); @@ -269,7 +269,7 @@ public void getStorageKeysAfterDelete() { @Test public void getStorageFromEmptyDetails() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); Map map = details.getStorage(); @@ -279,7 +279,7 @@ public void getStorageFromEmptyDetails() { @Test public void getStorageUsingNullFromEmptyDetails() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); Map map = details.getStorage(null); @@ -289,7 +289,7 @@ public void getStorageUsingNullFromEmptyDetails() { @Test public void getStorageFromNonEmptyDetails() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); details.put(DataWord.ZERO, DataWord.ONE); details.put(DataWord.ONE, new DataWord(42)); @@ -308,7 +308,7 @@ public void getStorageFromNonEmptyDetails() { @Test public void getStorageFromNonEmptyDetailsUsingKeys() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); details.put(DataWord.ZERO, DataWord.ONE); details.put(DataWord.ONE, new DataWord(42)); @@ -335,7 +335,7 @@ public void getStorageFromNonEmptyDetailsUsingKeys() { @Test public void getNullAddress() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); Assert.assertNull(details.getAddress()); } @@ -344,7 +344,7 @@ public void getNullAddress() { public void setAndGetAddress() { byte[] address = new byte[] { 0x01, 0x02, 0x03 }; - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); details.setAddress(address); @@ -356,14 +356,14 @@ public void setAndGetAddress() { @Test public void newContractDetailsIsNullObject() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); Assert.assertTrue(details.isNullObject()); } @Test public void newContractDetailsWithEmptyCodeIsNullObject() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); details.setCode(new byte[0]); @@ -372,7 +372,7 @@ public void newContractDetailsWithEmptyCodeIsNullObject() { @Test public void contractDetailsWithNonEmptyCodeIsNotNullObject() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); details.setCode(new byte[] { 0x01, 0x02, 0x03 }); @@ -381,7 +381,7 @@ public void contractDetailsWithNonEmptyCodeIsNotNullObject() { @Test public void contractDetailsWithStorageDataIsNotNullObject() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); details.put(DataWord.ONE, new DataWord(42)); @@ -390,7 +390,7 @@ public void contractDetailsWithStorageDataIsNotNullObject() { @Test public void setStorageUsingKeysAndValues() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); List keys = new ArrayList<>(); @@ -410,7 +410,7 @@ public void setStorageUsingKeysAndValues() { @Test public void setStorageUsingMap() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); Map map = new HashMap<>(); @@ -425,7 +425,7 @@ public void setStorageUsingMap() { @Test public void getSnapshot() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); byte[] initialRoot = details.getStorageHash(); @@ -472,7 +472,7 @@ public void getSnapshot() { @Test public void getEncodedAndCreateClone() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); List keys = new ArrayList<>(); @@ -492,7 +492,7 @@ public void getEncodedAndCreateClone() { Assert.assertNotNull(encoded); - ContractDetailsImpl result = new ContractDetailsImpl(config, encoded); + ContractDetailsImpl result = new ContractDetailsImpl(encoded, config.detailsInMemoryStorageLimit(), config.databaseDir()); Assert.assertEquals(new DataWord(42), result.get(DataWord.ZERO)); Assert.assertEquals(new DataWord(144), result.get(DataWord.ONE)); @@ -502,7 +502,7 @@ public void getEncodedAndCreateClone() { @Test public void syncStorageInEmptyDetails() { - ContractDetailsImpl details = new ContractDetailsImpl(config); + ContractDetailsImpl details = buildContractDetails(); details.syncStorage(); } @@ -512,7 +512,7 @@ public void syncStorageInDetailsWithTrieInMemory() { TrieStore store = new TrieStoreImpl(new HashMapDB()); Trie trie = new TrieImpl(store, false); byte[] accountAddress = randomAddress(); - ContractDetailsImpl details = new ContractDetailsImpl(config, accountAddress, trie, null); + ContractDetailsImpl details = new ContractDetailsImpl(accountAddress, trie, null, config.detailsInMemoryStorageLimit(), config.databaseDir()); details.put(new DataWord(42), DataWord.ONE); @@ -526,7 +526,7 @@ public void usingSameExternalStorage() { TrieStore store = new TrieStoreImpl(new HashMapDB()); Trie trie = new TrieImpl(store, false); byte[] accountAddress = randomAddress(); - ContractDetailsImpl details = new ContractDetailsImpl(config, accountAddress, trie, null); + ContractDetailsImpl details = new ContractDetailsImpl(accountAddress, trie, null, config.detailsInMemoryStorageLimit(), config.databaseDir()); int nkeys = IN_MEMORY_STORAGE_LIMIT; @@ -537,8 +537,8 @@ public void usingSameExternalStorage() { details.syncStorage(); - ContractDetailsImpl details1 = new ContractDetailsImpl(config, details.getEncoded()); - ContractDetailsImpl details2 = new ContractDetailsImpl(config, details.getEncoded()); + ContractDetailsImpl details1 = new ContractDetailsImpl(details.getEncoded(), config.detailsInMemoryStorageLimit(), config.databaseDir()); + ContractDetailsImpl details2 = new ContractDetailsImpl(details.getEncoded(), config.detailsInMemoryStorageLimit(), config.databaseDir()); Assert.assertTrue(details1.hasExternalStorage()); Assert.assertTrue(details2.hasExternalStorage()); @@ -557,7 +557,7 @@ public void syncStorageWithExternalStorage() { TrieStore store = new TrieStoreImpl(new HashMapDB()); Trie trie = new TrieImpl(store, false); byte[] accountAddress = randomAddress(); - ContractDetailsImpl details = new ContractDetailsImpl(config, accountAddress, trie, null); + ContractDetailsImpl details = new ContractDetailsImpl(accountAddress, trie, null, config.detailsInMemoryStorageLimit(), config.databaseDir()); int nkeys = IN_MEMORY_STORAGE_LIMIT; @@ -570,14 +570,14 @@ public void syncStorageWithExternalStorage() { int ssize = details.getStorageSize(); - details = new ContractDetailsImpl(config, details.getEncoded()); + details = new ContractDetailsImpl(details.getEncoded(), config.detailsInMemoryStorageLimit(), config.databaseDir()); Assert.assertEquals(ssize, details.getStorageSize()); for (int k = 1; k <= nkeys + 1; k++) Assert.assertNotNull(details.get(new DataWord(k))); - ContractDetailsImpl clone = new ContractDetailsImpl(config, details.getEncoded()); + ContractDetailsImpl clone = new ContractDetailsImpl(details.getEncoded(), config.detailsInMemoryStorageLimit(), config.databaseDir()); Assert.assertNotNull(clone); Assert.assertTrue(clone.hasExternalStorage()); @@ -602,7 +602,7 @@ public void syncStorageAndGetKeyValues() { TrieStore store = new TrieStoreImpl(new HashMapDB()); Trie trie = new TrieImpl(store, false); byte[] accountAddress = randomAddress(); - ContractDetailsImpl details = new ContractDetailsImpl(config, accountAddress, trie, null); + ContractDetailsImpl details = new ContractDetailsImpl(accountAddress, trie, null, config.detailsInMemoryStorageLimit(), config.databaseDir()); int nkeys = IN_MEMORY_STORAGE_LIMIT; @@ -616,7 +616,7 @@ public void syncStorageAndGetKeyValues() { for (int k = 1; k <= nkeys + 1; k++) Assert.assertNotNull(details.get(new DataWord(k))); - ContractDetailsImpl clone = new ContractDetailsImpl(config, details.getEncoded()); + ContractDetailsImpl clone = new ContractDetailsImpl(details.getEncoded(), config.detailsInMemoryStorageLimit(), config.databaseDir()); Assert.assertNotNull(clone); Assert.assertTrue(clone.hasExternalStorage()); @@ -644,7 +644,7 @@ public void testExternalStorageSerialization() { HashMapDB externalStorage = new HashMapDB(); - ContractDetailsImpl original = new ContractDetailsImpl(config, address, new TrieImpl(new TrieStoreImpl(externalStorage), true), code); + ContractDetailsImpl original = new ContractDetailsImpl(address, new TrieImpl(new TrieStoreImpl(externalStorage), true), code, config.detailsInMemoryStorageLimit(), config.databaseDir()); for (int i = 0; i < IN_MEMORY_STORAGE_LIMIT + 10; i++) { DataWord key = randomDataWord(); @@ -658,7 +658,7 @@ public void testExternalStorageSerialization() { byte[] rlp = original.getEncoded(); - ContractDetailsImpl deserialized = new ContractDetailsImpl(config, rlp); + ContractDetailsImpl deserialized = new ContractDetailsImpl(rlp, config.detailsInMemoryStorageLimit(), config.databaseDir()); Assert.assertEquals(toHexString(address), toHexString(deserialized.getAddress())); Assert.assertEquals(toHexString(code), toHexString(deserialized.getCode())); @@ -683,7 +683,7 @@ public void externalStorageTransition() { HashMapDB externalStorage = new HashMapDB(); - ContractDetailsImpl original = new ContractDetailsImpl(config, address, new TrieImpl(new TrieStoreImpl(externalStorage), true), code); + ContractDetailsImpl original = new ContractDetailsImpl(address, new TrieImpl(new TrieStoreImpl(externalStorage), true), code, config.detailsInMemoryStorageLimit(), config.databaseDir()); for (int i = 0; i < IN_MEMORY_STORAGE_LIMIT - 1; i++) { DataWord key = randomDataWord(); @@ -695,7 +695,7 @@ public void externalStorageTransition() { original.syncStorage(); - ContractDetails deserialized = new ContractDetailsImpl(config, original.getEncoded()); + ContractDetails deserialized = new ContractDetailsImpl(original.getEncoded(), config.detailsInMemoryStorageLimit(), config.databaseDir()); // adds keys for in-memory storage limit overflow for (int i = 0; i < 10; i++) { @@ -708,7 +708,7 @@ public void externalStorageTransition() { deserialized.syncStorage(); - deserialized = new ContractDetailsImpl(config, deserialized.getEncoded()); + deserialized = new ContractDetailsImpl(deserialized.getEncoded(), config.detailsInMemoryStorageLimit(), config.databaseDir()); Map storage = deserialized.getStorage(); Assert.assertEquals(elements.size(), storage.size()); @@ -728,14 +728,14 @@ public void test_1(){ byte[] key_2 = Hex.decode("222222"); byte[] val_2 = Hex.decode("bbbbbb"); - ContractDetailsImpl contractDetails = new ContractDetailsImpl(config); + ContractDetailsImpl contractDetails = buildContractDetails(); contractDetails.setCode(code); contractDetails.put(new DataWord(key_1), new DataWord(val_1)); contractDetails.put(new DataWord(key_2), new DataWord(val_2)); byte[] data = contractDetails.getEncoded(); - ContractDetailsImpl contractDetails_ = new ContractDetailsImpl(config, data); + ContractDetailsImpl contractDetails_ = new ContractDetailsImpl(data, config.detailsInMemoryStorageLimit(), config.databaseDir()); Assert.assertEquals(Hex.toHexString(code), Hex.toHexString(contractDetails_.getCode())); @@ -796,7 +796,7 @@ public void test_2(){ byte[] val_13 = Hex.decode("0000000000000000000000000c6686f3d6ee27e285f2de7b68e8db25cf1b1063"); - ContractDetailsImpl contractDetails = new ContractDetailsImpl(config); + ContractDetailsImpl contractDetails = buildContractDetails(); contractDetails.setCode(code); contractDetails.setAddress(address); contractDetails.put(new DataWord(key_0), new DataWord(val_0)); @@ -816,7 +816,7 @@ public void test_2(){ byte[] data = contractDetails.getEncoded(); - ContractDetailsImpl contractDetails_ = new ContractDetailsImpl(config, data); + ContractDetailsImpl contractDetails_ = new ContractDetailsImpl(data, config.detailsInMemoryStorageLimit(), config.databaseDir()); Assert.assertEquals(Hex.toHexString(code), Hex.toHexString(contractDetails_.getCode())); @@ -879,4 +879,14 @@ private static byte[] randomAddress() { return bytes; } + + private ContractDetailsImpl buildContractDetails() { + return new ContractDetailsImpl( + null, + new TrieImpl(new TrieStoreImpl(new HashMapDB()), true), + null, + config.detailsInMemoryStorageLimit(), + config.databaseDir() + ); + } } diff --git a/rskj-core/src/test/java/co/rsk/db/RepositoryImplForTesting.java b/rskj-core/src/test/java/co/rsk/db/RepositoryImplForTesting.java index 08c44c18c30..5be958f09de 100644 --- a/rskj-core/src/test/java/co/rsk/db/RepositoryImplForTesting.java +++ b/rskj-core/src/test/java/co/rsk/db/RepositoryImplForTesting.java @@ -18,8 +18,10 @@ package co.rsk.db; +import co.rsk.config.RskSystemProperties; import co.rsk.config.TestSystemProperties; import co.rsk.core.RskAddress; +import co.rsk.trie.TrieStore; import org.ethereum.core.AccountState; import org.ethereum.db.ContractDetails; import org.ethereum.vm.DataWord; @@ -28,15 +30,18 @@ * Created by ajlopez on 08/04/2017. */ public class RepositoryImplForTesting extends RepositoryImpl { + + private static RskSystemProperties config = new TestSystemProperties(); + public RepositoryImplForTesting() { - super(new TestSystemProperties()); + super(null, config.detailsInMemoryStorageLimit(), config.databaseDir()); } @Override public synchronized void addStorageRow(RskAddress addr, DataWord key, DataWord value) { super.addStorageRow(addr, key, value); AccountState accountState = getAccountState(addr); - ContractDetails details = getDetailsDataStore().get(addr); + ContractDetails details = getDetailsDataStore().get(addr, config.detailsInMemoryStorageLimit(), config.databaseDir()); accountState.setStateRoot(details.getStorageHash()); updateAccountState(addr, accountState); } @@ -45,7 +50,7 @@ public synchronized void addStorageRow(RskAddress addr, DataWord key, DataWord v public synchronized void addStorageBytes(RskAddress addr, DataWord key, byte[] value) { super.addStorageBytes(addr, key, value); AccountState accountState = getAccountState(addr); - ContractDetails details = getDetailsDataStore().get(addr); + ContractDetails details = getDetailsDataStore().get(addr, config.detailsInMemoryStorageLimit(), config.databaseDir()); accountState.setStateRoot(details.getStorageHash()); updateAccountState(addr, accountState); } diff --git a/rskj-core/src/test/java/co/rsk/db/RepositoryImplOriginalTest.java b/rskj-core/src/test/java/co/rsk/db/RepositoryImplOriginalTest.java index 89aba193e44..d07527d50b2 100644 --- a/rskj-core/src/test/java/co/rsk/db/RepositoryImplOriginalTest.java +++ b/rskj-core/src/test/java/co/rsk/db/RepositoryImplOriginalTest.java @@ -19,6 +19,7 @@ package co.rsk.db; +import co.rsk.config.RskSystemProperties; import co.rsk.config.TestSystemProperties; import co.rsk.core.Coin; import co.rsk.core.RskAddress; @@ -57,7 +58,7 @@ public class RepositoryImplOriginalTest { @Test public void test1() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); repository.increaseNonce(COW); repository.increaseNonce(HORSE); @@ -71,7 +72,7 @@ public void test1() { @Test public void test2() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); repository.addBalance(COW, Coin.valueOf(10L)); repository.addBalance(HORSE, Coin.valueOf(1L)); @@ -84,7 +85,7 @@ public void test2() { @Test public void test3() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); byte[] cowCode = Hex.decode("A1A2A3"); byte[] horseCode = Hex.decode("B1B2B3"); @@ -100,7 +101,7 @@ public void test3() { @Test public void test4() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); byte[] cowKey = Hex.decode("A1A2A3"); @@ -121,7 +122,7 @@ public void test4() { @Test public void test5() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); @@ -148,7 +149,7 @@ public void test5() { @Test public void test6() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); track.increaseNonce(COW); @@ -177,7 +178,7 @@ public void test6() { @Test public void test7() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); track.addBalance(COW, Coin.valueOf(10L)); @@ -196,7 +197,7 @@ public void test7() { @Test public void test8() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); track.addBalance(COW, Coin.valueOf(10L)); @@ -215,7 +216,7 @@ public void test8() { @Test public void test7_1() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track1 = repository.startTracking(); track1.addBalance(COW, Coin.valueOf(10L)); @@ -245,7 +246,7 @@ public void test7_1() { @Test public void test7_2() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track1 = repository.startTracking(); track1.addBalance(COW, Coin.valueOf(10L)); @@ -275,7 +276,7 @@ public void test7_2() { @Test public void test9() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); DataWord cowKey = new DataWord(Hex.decode("A1A2A3")); @@ -300,7 +301,7 @@ public void test9() { @Test public void test10() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); DataWord cowKey = new DataWord(Hex.decode("A1A2A3")); @@ -326,7 +327,7 @@ public void test10() { @Test public void test11() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); byte[] cowCode = Hex.decode("A1A2A3"); @@ -348,7 +349,7 @@ public void test11() { @Test public void test12() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); byte[] cowCode = Hex.decode("A1A2A3"); @@ -370,7 +371,7 @@ public void test12() { @Test // Let's upload genesis pre-mine just like in the real world public void test13() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Genesis genesis = (Genesis)Genesis.getInstance(config); @@ -389,7 +390,7 @@ public void test13() { @Test public void test14() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); final BigInteger ELEVEN = BigInteger.TEN.add(BigInteger.ONE); @@ -422,7 +423,7 @@ public void test14() { @Test public void test15() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); final BigInteger ELEVEN = BigInteger.TEN.add(BigInteger.ONE); @@ -454,7 +455,7 @@ public void test15() { @Test public void test16() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); byte[] cowKey1 = "key-c-1".getBytes(); byte[] cowValue1 = "val-c-1".getBytes(); @@ -510,7 +511,7 @@ public void test16() { @Test public void test16_2() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); byte[] cowKey1 = "key-c-1".getBytes(); byte[] cowValue1 = "val-c-1".getBytes(); @@ -561,7 +562,7 @@ public void test16_2() { @Test public void test16_3() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); byte[] cowKey1 = "key-c-1".getBytes(); byte[] cowValue1 = "val-c-1".getBytes(); @@ -612,7 +613,7 @@ public void test16_3() { @Test public void test16_4() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); byte[] cowKey1 = "key-c-1".getBytes(); byte[] cowValue1 = "val-c-1".getBytes(); @@ -653,7 +654,7 @@ public void test16_4() { @Test public void test16_5() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); byte[] cowKey1 = "key-c-1".getBytes(); byte[] cowValue1 = "val-c-1".getBytes(); @@ -690,7 +691,7 @@ public void test16_5() { @Test public void test17() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); byte[] cowKey1 = "key-c-1".getBytes(); byte[] cowValue1 = "val-c-1".getBytes(); @@ -714,7 +715,7 @@ public void test17() { @Test public void test18() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository repoTrack2 = repository.startTracking(); //track RskAddress pig = new RskAddress("F0B8C9D84DD2B877E0B952130B73E218106FEC04"); @@ -736,7 +737,7 @@ public void test18() { @Test public void test19() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); DataWord cowKey1 = new DataWord("c1"); @@ -778,7 +779,7 @@ public void test19() { @Test // testing for snapshot public void test20() { TrieStore store = new TrieStoreImpl(new HashMapDB()); - Repository repository = new RepositoryImpl(config, store); + Repository repository = new RepositoryImpl(store, config.detailsInMemoryStorageLimit(), config.databaseDir()); byte[] root = repository.getRoot(); DataWord cowKey1 = new DataWord("c1"); @@ -835,7 +836,7 @@ public void test20() { @Test // testing for snapshot public void testMultiThread() throws InterruptedException { TrieStore store = new TrieStoreImpl(new HashMapDB()); - final Repository repository = new RepositoryImpl(config, store); + final Repository repository = new RepositoryImpl(store, config.detailsInMemoryStorageLimit(), config.databaseDir()); final DataWord cowKey1 = new DataWord("c1"); final DataWord cowKey2 = new DataWord("c2"); @@ -901,4 +902,8 @@ public void testMultiThread() throws InterruptedException { throw new RuntimeException("Test failed."); } } + + public static RepositoryImpl createRepositoryImpl(RskSystemProperties config) { + return new RepositoryImpl(null, config.detailsInMemoryStorageLimit(), config.databaseDir()); + } } diff --git a/rskj-core/src/test/java/co/rsk/db/RepositoryImplTest.java b/rskj-core/src/test/java/co/rsk/db/RepositoryImplTest.java index 04ad86c0bfa..3703828771e 100644 --- a/rskj-core/src/test/java/co/rsk/db/RepositoryImplTest.java +++ b/rskj-core/src/test/java/co/rsk/db/RepositoryImplTest.java @@ -18,6 +18,7 @@ package co.rsk.db; +import co.rsk.config.RskSystemProperties; import co.rsk.config.TestSystemProperties; import co.rsk.core.Coin; import co.rsk.core.RskAddress; @@ -46,7 +47,7 @@ public class RepositoryImplTest { @Test public void getNonceUnknownAccount() { - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); BigInteger nonce = repository.getNonce(randomAccountAddress()); Assert.assertEquals(BigInteger.ZERO, nonce); @@ -54,21 +55,21 @@ public void getNonceUnknownAccount() { @Test public void isNotClosedWhenCreated() { - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); Assert.assertFalse(repository.isClosed()); } @Test public void hasEmptyHashAsRootWhenCreated() { - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); Assert.assertArrayEquals(emptyHash.getBytes(), repository.getRoot()); } @Test public void createAccount() { - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); AccountState accState = repository.createAccount(randomAccountAddress()); @@ -82,7 +83,7 @@ public void createAccount() { @Test public void syncToRootAfterCreatingAnAccount() { TrieStore store = new TrieStoreImpl(new HashMapDB()); - RepositoryImpl repository = new RepositoryImpl(config, store); + RepositoryImpl repository = new RepositoryImpl(store, config.detailsInMemoryStorageLimit(), config.databaseDir()); repository.flush(); @@ -109,7 +110,7 @@ public void syncToRootAfterCreatingAnAccount() { public void updateAccountState() { RskAddress accAddress = randomAccountAddress(); - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); AccountState accState = repository.createAccount(accAddress); @@ -128,7 +129,7 @@ public void updateAccountState() { public void incrementAccountNonceForNewAccount() { RskAddress accAddress = randomAccountAddress(); - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); repository.increaseNonce(accAddress); @@ -139,7 +140,7 @@ public void incrementAccountNonceForNewAccount() { public void incrementAccountNonceForAlreadyCreatedAccount() { RskAddress accAddress = randomAccountAddress(); - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); repository.createAccount(accAddress); repository.increaseNonce(accAddress); @@ -151,7 +152,7 @@ public void incrementAccountNonceForAlreadyCreatedAccount() { public void incrementAccountNonceTwiceForAlreadyCreatedAccount() { RskAddress accAddress = randomAccountAddress(); - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); repository.createAccount(accAddress); repository.increaseNonce(accAddress); @@ -164,7 +165,7 @@ public void incrementAccountNonceTwiceForAlreadyCreatedAccount() { public void incrementAccountBalanceForNewAccount() { RskAddress accAddress = randomAccountAddress(); - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); Assert.assertEquals(BigInteger.ONE, repository.addBalance(accAddress, Coin.valueOf(1L)).asBigInteger()); @@ -175,7 +176,7 @@ public void incrementAccountBalanceForNewAccount() { public void incrementAccountBalanceForAlreadyCreatedAccount() { RskAddress accAddress = randomAccountAddress(); - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); repository.createAccount(accAddress); Assert.assertEquals(BigInteger.ONE, repository.addBalance(accAddress, Coin.valueOf(1L)).asBigInteger()); @@ -187,7 +188,7 @@ public void incrementAccountBalanceForAlreadyCreatedAccount() { public void incrementAccountBalanceTwiceForAlreadyCreatedAccount() { RskAddress accAddress = randomAccountAddress(); - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); repository.createAccount(accAddress); Assert.assertEquals(BigInteger.ONE, repository.addBalance(accAddress, Coin.valueOf(1L)).asBigInteger()); @@ -198,7 +199,7 @@ public void incrementAccountBalanceTwiceForAlreadyCreatedAccount() { @Test public void isExistReturnsFalseForUnknownAccount() { - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); Assert.assertFalse(repository.isExist(randomAccountAddress())); } @@ -207,7 +208,7 @@ public void isExistReturnsFalseForUnknownAccount() { public void isExistReturnsTrueForCreatedAccount() { RskAddress accAddress = randomAccountAddress(); - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); repository.createAccount(accAddress); @@ -216,7 +217,7 @@ public void isExistReturnsTrueForCreatedAccount() { @Test public void getCodeFromUnknownAccount() { - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); byte[] code = repository.getCode(randomAccountAddress()); @@ -228,7 +229,7 @@ public void getCodeFromUnknownAccount() { public void getCodeFromAccountWithoutCode() { RskAddress accAddress = randomAccountAddress(); - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); repository.createAccount(accAddress); @@ -243,7 +244,7 @@ public void saveAndGetCodeFromAccount() { RskAddress accAddress = randomAccountAddress(); byte[] accCode = new byte[] { 0x01, 0x02, 0x03 }; - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); repository.createAccount(accAddress); @@ -259,7 +260,7 @@ public void saveAndGetCodeFromAccount() { public void hibernateAccount() { RskAddress accAddress = randomAccountAddress(); - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); repository.createAccount(accAddress); repository.hibernate(accAddress); @@ -275,7 +276,7 @@ public void getCodeFromHibernatedAccount() { RskAddress accAddress = randomAccountAddress(); byte[] accCode = new byte[] { 0x01, 0x02, 0x03 }; - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); repository.createAccount(accAddress); @@ -290,7 +291,7 @@ public void getCodeFromHibernatedAccount() { @Test public void startTracking() { - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); Repository track = repository.startTracking(); @@ -300,7 +301,7 @@ public void startTracking() { @Test public void createAccountInTrackAndCommit() { RskAddress accAddress = randomAccountAddress(); - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); Repository track = repository.startTracking(); @@ -314,7 +315,7 @@ public void createAccountInTrackAndCommit() { @Test public void createAccountInTrackAndRollback() { RskAddress accAddress = randomAccountAddress(); - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); Repository track = repository.startTracking(); @@ -329,7 +330,7 @@ public void createAccountInTrackAndRollback() { public void getEmptyStorageValue() { RskAddress accAddress = randomAccountAddress(); - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); repository.createAccount(accAddress); DataWord value = repository.getStorageValue(accAddress, DataWord.ONE); @@ -341,7 +342,7 @@ public void getEmptyStorageValue() { public void setAndGetStorageValue() { RskAddress accAddress = randomAccountAddress(); - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); repository.addStorageRow(accAddress, DataWord.ONE, DataWord.ONE); @@ -369,7 +370,7 @@ public void setAndGetStorageValueUsingNewRepositoryForTest() { public void setAndGetStorageValueUsingTrack() { RskAddress accAddress = randomAccountAddress(); - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); Repository track = repository.startTracking(); @@ -386,7 +387,7 @@ public void setAndGetStorageValueUsingTrack() { public void getEmptyStorageBytes() { RskAddress accAddress = randomAccountAddress(); - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); byte[] bytes = repository.getStorageBytes(accAddress, DataWord.ONE); @@ -398,7 +399,7 @@ public void setAndGetStorageBytesUsingTrack() { RskAddress accAddress = randomAccountAddress(); byte[] bytes = new byte[] { 0x01, 0x02, 0x03 }; - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); Repository track = repository.startTracking(); track.addStorageBytes(accAddress, DataWord.ONE, bytes); @@ -413,7 +414,7 @@ public void setAndGetStorageBytesUsingTrack() { @Test public void emptyAccountsKeysOnNonExistentAccount() { - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); Set keys = repository.getAccountsKeys(); @@ -427,7 +428,7 @@ public void getAccountsKeys() RskAddress accAddress1 = randomAccountAddress(); RskAddress accAddress2 = randomAccountAddress(); - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); repository.createAccount(accAddress1); repository.createAccount(accAddress2); @@ -446,7 +447,7 @@ public void getAccountsKeysOnSnapshot() RskAddress accAddress2 = randomAccountAddress(); TrieStore store = new TrieStoreImpl(new HashMapDB()); - RepositoryImpl repository = new RepositoryImpl(config, store); + RepositoryImpl repository = new RepositoryImpl(store, config.detailsInMemoryStorageLimit(), config.databaseDir()); repository.createAccount(accAddress1); repository.flush(); @@ -466,7 +467,7 @@ public void getAccountsKeysOnSnapshot() @Test public void getDetailsDataStore() { - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); Assert.assertNotNull(repository.getDetailsDataStore()); } @@ -474,7 +475,7 @@ public void getDetailsDataStore() { @Test public void flushNoReconnect() { TrieStore store = new TrieStoreImpl(new HashMapDB()); - RepositoryImpl repository = new RepositoryImpl(config, store); + RepositoryImpl repository = new RepositoryImpl(store, config.detailsInMemoryStorageLimit(), config.databaseDir()); RskAddress accAddress = randomAccountAddress(); byte[] initialRoot = repository.getRoot(); @@ -492,4 +493,8 @@ private static RskAddress randomAccountAddress() { return new RskAddress(bytes); } + + public static RepositoryImpl createRepositoryImpl(RskSystemProperties config) { + return new RepositoryImpl(null, config.detailsInMemoryStorageLimit(), config.databaseDir()); + } } diff --git a/rskj-core/src/test/java/co/rsk/db/RepositoryTest.java b/rskj-core/src/test/java/co/rsk/db/RepositoryTest.java index b6af5711e2a..bc465a9321e 100644 --- a/rskj-core/src/test/java/co/rsk/db/RepositoryTest.java +++ b/rskj-core/src/test/java/co/rsk/db/RepositoryTest.java @@ -18,6 +18,7 @@ package co.rsk.db; +import co.rsk.config.RskSystemProperties; import co.rsk.config.TestSystemProperties; import co.rsk.core.RskAddress; import co.rsk.trie.TrieStore; @@ -53,7 +54,7 @@ public class RepositoryTest { @Test public void test4() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); byte[] cowKey = Hex.decode("A1A2A3"); @@ -75,7 +76,7 @@ public void test4() { @Test public void test9() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); @@ -104,7 +105,7 @@ public void test9() { @Test public void test10() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); @@ -132,7 +133,7 @@ public void test10() { @Test public void test16() { - Repository repository = new RepositoryImpl(config, new TrieStoreImpl(new HashMapDB())); + Repository repository = new RepositoryImpl(new TrieStoreImpl(new HashMapDB()), config.detailsInMemoryStorageLimit(), config.databaseDir()); byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); byte[] horse = Hex.decode("13978AEE95F38490E9769C39B2773ED763D9CD5F"); @@ -191,7 +192,7 @@ public void test16() { @Test public void test16_2() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); byte[] horse = Hex.decode("13978AEE95F38490E9769C39B2773ED763D9CD5F"); @@ -256,7 +257,7 @@ public void test16_2() { @Test public void test16_3() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); byte[] horse = Hex.decode("13978AEE95F38490E9769C39B2773ED763D9CD5F"); @@ -310,7 +311,7 @@ public void test16_3() { @Test public void test16_4() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); byte[] horse = Hex.decode("13978AEE95F38490E9769C39B2773ED763D9CD5F"); @@ -352,7 +353,7 @@ public void test16_4() { @Test public void test16_5() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); byte[] horse = Hex.decode("13978AEE95F38490E9769C39B2773ED763D9CD5F"); @@ -392,7 +393,7 @@ public void test16_5() { @Test public void test17() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); @@ -418,7 +419,7 @@ public void test17() { @Test public void test19() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); @@ -462,7 +463,7 @@ public void test19() { @Test public void test19b() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); @@ -507,7 +508,7 @@ public void test19b() { @Test // testing for snapshot public void testMultiThread() throws InterruptedException { TrieStore store = new TrieStoreImpl(new HashMapDB()); - final Repository repository = new RepositoryImpl(config, store); + final Repository repository = new RepositoryImpl(store, config.detailsInMemoryStorageLimit(), config.databaseDir()); final byte[] cow = Hex.decode("CD2A3D9F938E13CD947EC05ABC7FE734DF8DD826"); @@ -572,4 +573,8 @@ public void testMultiThread() throws InterruptedException { throw new RuntimeException("Test failed."); } } + + public static RepositoryImpl createRepositoryImpl(RskSystemProperties config) { + return new RepositoryImpl(null, config.detailsInMemoryStorageLimit(), config.databaseDir()); + } } diff --git a/rskj-core/src/test/java/co/rsk/net/SyncProcessorTest.java b/rskj-core/src/test/java/co/rsk/net/SyncProcessorTest.java index 67f8227d949..5f35947c27f 100644 --- a/rskj-core/src/test/java/co/rsk/net/SyncProcessorTest.java +++ b/rskj-core/src/test/java/co/rsk/net/SyncProcessorTest.java @@ -23,6 +23,8 @@ import org.ethereum.net.server.ChannelManager; import org.ethereum.rpc.Simples.SimpleChannelManager; import org.ethereum.util.RskMockFactory; +import org.ethereum.vm.PrecompiledContracts; +import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; import org.junit.Assert; import org.junit.Test; import org.mockito.invocation.InvocationOnMock; @@ -661,7 +663,28 @@ public void processBodyResponseWithTransactionAddsToBlockchain() { Block block = new BlockGenerator().createChildBlock(genesis, txs, blockchain.getRepository().getRoot()); - BlockExecutor blockExecutor = new BlockExecutor(config, blockchain.getRepository(), null, blockchain.getBlockStore(), null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor blockExecutor = new BlockExecutor(blockchain.getRepository(), (tx1, txindex, coinbase, repository, block1, totalGasUsed) -> new TransactionExecutor( + tx1, + txindex, + block1.getCoinbase(), + repository, + blockchain.getBlockStore(), + null, + programInvokeFactory, + block1, + null, + totalGasUsed, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); Assert.assertEquals(1, block.getTransactionsList().size()); blockExecutor.executeAndFillAll(block, genesis); Assert.assertEquals(21000, block.getFeesPaidToMiner().asBigInteger().intValueExact()); diff --git a/rskj-core/src/test/java/co/rsk/peg/BridgeStateTest.java b/rskj-core/src/test/java/co/rsk/peg/BridgeStateTest.java index 7875d21c4e0..b51e3ea48a5 100644 --- a/rskj-core/src/test/java/co/rsk/peg/BridgeStateTest.java +++ b/rskj-core/src/test/java/co/rsk/peg/BridgeStateTest.java @@ -37,7 +37,7 @@ public class BridgeStateTest { @Test public void recreateFromEmptyStorageProvider() throws IOException { TestSystemProperties config = new TestSystemProperties(); - Repository repository = new RepositoryImpl(config, new TrieStoreImpl(new HashMapDB())); + Repository repository = new RepositoryImpl(new TrieStoreImpl(new HashMapDB()), config.detailsInMemoryStorageLimit(), config.databaseDir()); BridgeConstants bridgeConstants = config.getBlockchainConfig().getCommonConstants().getBridgeConstants(); BridgeStorageConfiguration bridgeStorageConfigurationAtThisHeight = BridgeStorageConfiguration.fromBlockchainConfig(config.getBlockchainConfig().getConfigForBlock(0)); BridgeStorageProvider provider = new BridgeStorageProvider(repository, PrecompiledContracts.BRIDGE_ADDR, bridgeConstants, bridgeStorageConfigurationAtThisHeight); diff --git a/rskj-core/src/test/java/co/rsk/peg/BridgeStorageProviderTest.java b/rskj-core/src/test/java/co/rsk/peg/BridgeStorageProviderTest.java index 0d478771dad..cf984788147 100644 --- a/rskj-core/src/test/java/co/rsk/peg/BridgeStorageProviderTest.java +++ b/rskj-core/src/test/java/co/rsk/peg/BridgeStorageProviderTest.java @@ -22,6 +22,7 @@ import co.rsk.bitcoinj.crypto.TransactionSignature; import co.rsk.bitcoinj.script.ScriptBuilder; import co.rsk.config.BridgeConstants; +import co.rsk.config.RskSystemProperties; import co.rsk.config.TestSystemProperties; import co.rsk.core.RskAddress; import co.rsk.crypto.Keccak256; @@ -74,7 +75,7 @@ public class BridgeStorageProviderTest { @Test public void createInstance() throws IOException { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); BridgeStorageProvider provider = new BridgeStorageProvider(repository, PrecompiledContracts.BRIDGE_ADDR, config.getBlockchainConfig().getCommonConstants().getBridgeConstants(), bridgeStorageConfigurationAtHeightZero); Map processed = provider.getBtcTxHashesAlreadyProcessed(); @@ -105,7 +106,7 @@ public void createInstance() throws IOException { @Test public void createSaveAndRecreateInstance() throws IOException { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeStorageProvider provider0 = new BridgeStorageProvider(track, PrecompiledContracts.BRIDGE_ADDR, config.getBlockchainConfig().getCommonConstants().getBridgeConstants(), bridgeStorageConfigurationAtHeightZero); @@ -168,7 +169,7 @@ public void createSaveAndRecreateInstanceWithProcessedHashes() throws IOExceptio Sha256Hash hash1 = PegTestUtils.createHash(); Sha256Hash hash2 = PegTestUtils.createHash(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeStorageProvider provider0 = new BridgeStorageProvider(track, PrecompiledContracts.BRIDGE_ADDR, config.getBlockchainConfig().getCommonConstants().getBridgeConstants(), bridgeStorageConfigurationAtHeightZero); @@ -197,7 +198,7 @@ public void createSaveAndRecreateInstanceWithTxsWaitingForSignatures() throws IO Keccak256 hash2 = PegTestUtils.createHash3(); Keccak256 hash3 = PegTestUtils.createHash3(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeStorageProvider provider0 = new BridgeStorageProvider(track, PrecompiledContracts.BRIDGE_ADDR, config.getBlockchainConfig().getCommonConstants().getBridgeConstants(), bridgeStorageConfigurationAtHeightZero); @@ -230,7 +231,7 @@ public void createSaveAndRecreateInstanceWithUTXOS() throws IOException { Sha256Hash hash1 = PegTestUtils.createHash(); Sha256Hash hash2 = PegTestUtils.createHash(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeConstants bridgeConstants = config.getBlockchainConfig().getCommonConstants().getBridgeConstants(); @@ -730,7 +731,7 @@ public void getReleaseTransactionSet() throws IOException { @Test public void setFeePerKb_savedAndRecreated() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeStorageProvider provider0 = new BridgeStorageProvider(track, PrecompiledContracts.BRIDGE_ADDR, config.getBlockchainConfig().getCommonConstants().getBridgeConstants(), bridgeStorageConfigurationAtHeightZero); @@ -810,4 +811,7 @@ private Address getBtcAddress(String addr) { return new Address(config.getBlockchainConfig().getCommonConstants().getBridgeConstants().getBtcParams(), Hex.decode(addr)); } + public static RepositoryImpl createRepositoryImpl(RskSystemProperties config) { + return new RepositoryImpl(null, config.detailsInMemoryStorageLimit(), config.databaseDir()); + } } diff --git a/rskj-core/src/test/java/co/rsk/peg/BridgeSupportTest.java b/rskj-core/src/test/java/co/rsk/peg/BridgeSupportTest.java index 86438858972..d81d1d17a2a 100644 --- a/rskj-core/src/test/java/co/rsk/peg/BridgeSupportTest.java +++ b/rskj-core/src/test/java/co/rsk/peg/BridgeSupportTest.java @@ -30,6 +30,7 @@ import co.rsk.blockchain.utils.BlockGenerator; import co.rsk.config.BridgeConstants; import co.rsk.config.BridgeRegTestConstants; +import co.rsk.config.RskSystemProperties; import co.rsk.config.TestSystemProperties; import co.rsk.core.BlockDifficulty; import co.rsk.core.RskAddress; @@ -140,7 +141,7 @@ public void setUpOnEachTest(){ @Test public void testInitialChainHeadWithoutBtcCheckpoints() throws Exception { NetworkParameters _networkParameters = btcParams; - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeStorageProvider provider = new BridgeStorageProvider(track, PrecompiledContracts.BRIDGE_ADDR, bridgeConstants, bridgeStorageConfigurationAtHeightZero); @@ -161,7 +162,7 @@ public void testInitialChainHeadWithBtcCheckpoints() throws Exception { bridgeConstants = config.getBlockchainConfig().getCommonConstants().getBridgeConstants(); btcParams = bridgeConstants.getBtcParams(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeStorageProvider provider = new BridgeStorageProvider(track, PrecompiledContracts.BRIDGE_ADDR, config.getBlockchainConfig().getCommonConstants().getBridgeConstants(), bridgeStorageConfigurationAtHeightZero); @@ -175,7 +176,7 @@ public void testInitialChainHeadWithBtcCheckpoints() throws Exception { @Test public void feePerKbFromStorageProvider() throws Exception { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeStorageProvider provider = new BridgeStorageProvider(track, PrecompiledContracts.BRIDGE_ADDR, config.getBlockchainConfig().getCommonConstants().getBridgeConstants(), bridgeStorageConfigurationAtHeightZero); @@ -193,7 +194,7 @@ public void feePerKbFromStorageProvider() throws Exception { public void testGetBtcBlockchainBlockLocatorWithoutBtcCheckpoints() throws Exception { NetworkParameters _networkParameters = btcParams; - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeStorageProvider provider = new BridgeStorageProvider(track, PrecompiledContracts.BRIDGE_ADDR, config.getBlockchainConfig().getCommonConstants().getBridgeConstants(), bridgeStorageConfigurationAtHeightZero); @@ -226,7 +227,7 @@ public void testGetBtcBlockchainBlockLocatorWithoutBtcCheckpoints() throws Excep public void testGetBtcBlockchainBlockLocatorWithBtcCheckpoints() throws Exception { NetworkParameters _networkParameters = btcParams; - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeStorageProvider provider = new BridgeStorageProvider(track, PrecompiledContracts.BRIDGE_ADDR, config.getBlockchainConfig().getCommonConstants().getBridgeConstants(), bridgeStorageConfigurationAtHeightZero); @@ -307,7 +308,7 @@ private InputStream getCheckpoints(NetworkParameters _networkParameters, List blocks = blockGenerator.getSimpleBlockChain(blockGenerator.getGenesisBlock(), 10); @@ -342,7 +343,7 @@ public void callUpdateCollectionsFundsEnoughForJustTheSmallerTx() throws IOExcep // Federation is the genesis federation ATM Federation federation = bridgeConstants.getGenesisFederation(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeStorageProvider provider0 = new BridgeStorageProvider(track, PrecompiledContracts.BRIDGE_ADDR, config.getBlockchainConfig().getCommonConstants().getBridgeConstants(), bridgeStorageConfigurationAtHeightZero); @@ -399,7 +400,7 @@ public void callUpdateCollectionsThrowsCouldNotAdjustDownwards() throws IOExcept // Federation is the genesis federation ATM Federation federation = bridgeConstants.getGenesisFederation(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeStorageProvider provider0 = new BridgeStorageProvider(track, PrecompiledContracts.BRIDGE_ADDR, config.getBlockchainConfig().getCommonConstants().getBridgeConstants(), bridgeStorageConfigurationAtHeightZero); @@ -458,7 +459,7 @@ public void callUpdateCollectionsThrowsExceededMaxTransactionSize() throws IOExc // Federation is the genesis federation ATM Federation federation = bridgeConstants.getGenesisFederation(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeStorageProvider provider0 = new BridgeStorageProvider(track, PrecompiledContracts.BRIDGE_ADDR, config.getBlockchainConfig().getCommonConstants().getBridgeConstants(), bridgeStorageConfigurationAtHeightZero); @@ -542,7 +543,7 @@ public void minimumProcessFundsMigrationValue() throws IOException, BlockStoreEx org.ethereum.core.Block rskCurrentBlock = blockGenerator.createBlock(35, 1); Transaction tx = Transaction.create(config, TO_ADDRESS, DUST_AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeSupport bridgeSupport = new BridgeSupport(config, track, mock(BridgeEventLogger.class), provider, rskCurrentBlock); @@ -655,7 +656,7 @@ public void callUpdateCollectionsWithTransactionsWaitingForConfirmationWithEnoug PowerMockito.mockStatic(BridgeUtils.class); PowerMockito.when(BridgeUtils.getFederationSpendWallet(any(Context.class), any(Federation.class), any(List.class))).thenReturn(new SimpleWallet(context)); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeStorageProvider provider0 = new BridgeStorageProvider(track, PrecompiledContracts.BRIDGE_ADDR, config.getBlockchainConfig().getCommonConstants().getBridgeConstants(), bridgeStorageConfigurationAtHeightZero); @@ -715,7 +716,7 @@ public void callUpdateCollectionsWithTransactionsWaitingForConfirmationWithEnoug @Test public void sendOrphanBlockHeader() throws IOException, BlockStoreException { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeConstants bridgeConstants = config.getBlockchainConfig().getCommonConstants().getBridgeConstants(); @@ -742,7 +743,7 @@ public void sendOrphanBlockHeader() throws IOException, BlockStoreException { @Test public void addBlockHeaderToBlockchain() throws IOException, BlockStoreException { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeConstants bridgeConstants = config.getBlockchainConfig().getCommonConstants().getBridgeConstants(); @@ -770,7 +771,7 @@ public void addBlockHeaderToBlockchain() throws IOException, BlockStoreException public void addSignatureToMissingTransaction() throws Exception { // Federation is the genesis federation ATM Federation federation = bridgeConstants.getGenesisFederation(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeSupport bridgeSupport = new BridgeSupport(config, track, mock(BridgeEventLogger.class), PrecompiledContracts.BRIDGE_ADDR, mock(Block.class)); @@ -787,7 +788,7 @@ public void addSignatureToMissingTransaction() throws Exception { @Test public void addSignatureFromInvalidFederator() throws Exception { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeSupport bridgeSupport = new BridgeSupport(config, track, mock(BridgeEventLogger.class), PrecompiledContracts.BRIDGE_ADDR, mock(Block.class)); @@ -829,7 +830,7 @@ public void addSignatureNonCanonicalSignature() throws Exception { public void addSignatureCreateEventLog() throws Exception { // Setup Federation federation = bridgeConstants.getGenesisFederation(); - Repository track = new RepositoryImpl(config).startTracking(); + Repository track = createRepositoryImpl(config).startTracking(); BridgeStorageProvider provider = new BridgeStorageProvider(track, PrecompiledContracts.BRIDGE_ADDR, bridgeConstants, bridgeStorageConfigurationAtHeightZero); // Build prev btc tx @@ -912,7 +913,7 @@ public void addSignatureTwoSignatures() throws Exception { public void addSignatureMultipleInputsPartiallyValid() throws Exception { // Federation is the genesis federation ATM Federation federation = bridgeConstants.getGenesisFederation(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); final Keccak256 keccak256 = PegTestUtils.createHash3(); @@ -1024,7 +1025,7 @@ public void addSignatureMultipleInputsPartiallyValid() throws Exception { private void addSignatureFromValidFederator(List privateKeysToSignWith, int numberOfInputsToSign, boolean signatureCanonical, boolean signTwice, String expectedResult) throws Exception { // Federation is the genesis federation ATM Federation federation = bridgeConstants.getGenesisFederation(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); final Keccak256 keccak256 = PegTestUtils.createHash3(); @@ -1125,7 +1126,7 @@ private BtcECKey findPublicKeySignedBy(List pubs, BtcECKey pk) { @Test public void releaseBtcWithDustOutput() throws BlockStoreException, AddressFormatException, IOException { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); org.ethereum.core.Transaction tx = org.ethereum.core.Transaction.create(config, TO_ADDRESS, DUST_AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA);; @@ -1149,7 +1150,7 @@ public void releaseBtcWithDustOutput() throws BlockStoreException, AddressFormat @Test public void releaseBtc() throws BlockStoreException, AddressFormatException, IOException { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); org.ethereum.core.Transaction tx = org.ethereum.core.Transaction.create(config, TO_ADDRESS, AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA);; @@ -1173,7 +1174,7 @@ public void releaseBtc() throws BlockStoreException, AddressFormatException, IOE @Test public void releaseBtcFromContract() throws BlockStoreException, AddressFormatException, IOException { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); org.ethereum.core.Transaction tx = new InternalTransaction( @@ -1201,7 +1202,7 @@ public void releaseBtcFromContract() throws BlockStoreException, AddressFormatEx @Test public void registerBtcTransactionOfAlreadyProcessedTransaction() throws BlockStoreException, AddressFormatException, IOException { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BtcTransaction tx = createTransaction(); @@ -1227,7 +1228,7 @@ public void registerBtcTransactionOfAlreadyProcessedTransaction() throws BlockSt @Test public void registerBtcTransactionOfTransactionNotInMerkleTree() throws BlockStoreException, AddressFormatException, IOException { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BtcTransaction tx = createTransaction(); @@ -1258,7 +1259,7 @@ public void registerBtcTransactionOfTransactionNotInMerkleTree() throws BlockSto @Test public void registerBtcTransactionOfTransactionInMerkleTreeWithNegativeHeight() throws BlockStoreException, AddressFormatException, IOException { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BtcTransaction tx = createTransaction(); @@ -1291,7 +1292,7 @@ public void registerBtcTransactionOfTransactionInMerkleTreeWithNegativeHeight() public void registerBtcTransactionOfTransactionInMerkleTreeWithNotEnoughtHeight() throws BlockStoreException, AddressFormatException, IOException { NetworkParameters _networkParameters = btcParams; - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BtcTransaction tx = createTransaction(); @@ -1356,7 +1357,7 @@ public void registerBtcTransactionWithoutInputs() throws IOException, BlockStore @Test public void registerBtcTransactionTxNotLockNorReleaseTx() throws BlockStoreException, AddressFormatException, IOException { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeConstants bridgeConstants = config.getBlockchainConfig().getCommonConstants().getBridgeConstants(); @@ -1407,7 +1408,7 @@ public void registerBtcTransactionTxNotLockNorReleaseTx() throws BlockStoreExcep public void registerBtcTransactionReleaseTx() throws BlockStoreException, AddressFormatException, IOException { // Federation is the genesis federation ATM Federation federation = bridgeConstants.getGenesisFederation(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); repository.addBalance(PrecompiledContracts.BRIDGE_ADDR, LIMIT_MONETARY_BASE); Repository track = repository.startTracking(); Block executionBlock = Mockito.mock(Block.class); @@ -1501,7 +1502,7 @@ public void registerBtcTransactionMigrationTx() throws BlockStoreException, Addr ).sorted(BtcECKey.PUBKEY_COMPARATOR).collect(Collectors.toList()); Federation retiringFederation = new Federation(retiringFederationKeys, Instant.ofEpochMilli(1000L), 1L, parameters); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); repository.addBalance(PrecompiledContracts.BRIDGE_ADDR, LIMIT_MONETARY_BASE); Block executionBlock = Mockito.mock(Block.class); Mockito.when(executionBlock.getNumber()).thenReturn(15L); @@ -1672,7 +1673,7 @@ public void registerBtcTransactionLockTxWhitelisted() throws Exception { federation2Keys.sort(BtcECKey.PUBKEY_COMPARATOR); Federation federation2 = new Federation(federation2Keys, Instant.ofEpochMilli(2000L), 0L, parameters); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); repository.addBalance(PrecompiledContracts.BRIDGE_ADDR, LIMIT_MONETARY_BASE); Block executionBlock = Mockito.mock(Block.class); Mockito.when(executionBlock.getNumber()).thenReturn(10L); @@ -1792,7 +1793,7 @@ public void registerBtcTransactionLockTxNotWhitelisted() throws BlockStoreExcept federation2Keys.sort(BtcECKey.PUBKEY_COMPARATOR); Federation federation2 = new Federation(federation2Keys, Instant.ofEpochMilli(2000L), 0L, parameters); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); repository.addBalance(PrecompiledContracts.BRIDGE_ADDR, LIMIT_MONETARY_BASE); Block executionBlock = Mockito.mock(Block.class); Mockito.when(executionBlock.getNumber()).thenReturn(10L); @@ -3104,7 +3105,7 @@ public void getBtcBlockchainBlockHashAtDepth() throws Exception { config.setBlockchainConfig(new RegTestOrchidConfig()); NetworkParameters networkParameters = config.getBlockchainConfig().getCommonConstants().getBridgeConstants().getBtcParams(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Context btcContext = new Context(bridgeConstants.getBtcParams()); @@ -3317,4 +3318,8 @@ private void mockChainOfStoredBlocks(BtcBlockstoreWithCache btcBlockStore, BtcBl // Last one should be the block we need when(btcBlockStore.getFromCache(prevHash)).thenReturn(new StoredBlock(targetHeader, BigInteger.ONE, targetHeight)); } + + public static RepositoryImpl createRepositoryImpl(RskSystemProperties config) { + return new RepositoryImpl(null, config.detailsInMemoryStorageLimit(), config.databaseDir()); + } } diff --git a/rskj-core/src/test/java/co/rsk/peg/BridgeTest.java b/rskj-core/src/test/java/co/rsk/peg/BridgeTest.java index 9898d868ba4..3347c1d0fad 100644 --- a/rskj-core/src/test/java/co/rsk/peg/BridgeTest.java +++ b/rskj-core/src/test/java/co/rsk/peg/BridgeTest.java @@ -26,6 +26,7 @@ import co.rsk.blockchain.utils.BlockGenerator; import co.rsk.config.BridgeConstants; import co.rsk.config.BridgeRegTestConstants; +import co.rsk.config.RskSystemProperties; import co.rsk.config.TestSystemProperties; import co.rsk.core.BlockDifficulty; import co.rsk.core.RskAddress; @@ -113,7 +114,7 @@ public void resetConfigToRegTest() { public void callUpdateCollectionsWithSignatureNotFromFederation() throws IOException { BtcTransaction tx1 = createTransaction(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeStorageConfiguration bridgeStorageConfigurationAtThisHeight = BridgeStorageConfiguration.fromBlockchainConfig(config.getBlockchainConfig().getConfigForBlock(0)); @@ -145,7 +146,7 @@ public void callUpdateCollectionsWithTransactionsWaitingForConfirmation() throws BtcTransaction tx2 = createTransaction(); BtcTransaction tx3 = createTransaction(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeStorageConfiguration bridgeStorageConfigurationAtThisHeight = BridgeStorageConfiguration.fromBlockchainConfig(config.getBlockchainConfig().getConfigForBlock(0)); @@ -184,7 +185,7 @@ public void callUpdateCollectionsWithTransactionsWaitingForConfirmationWithEnoug BtcTransaction tx2 = createTransaction(); BtcTransaction tx3 = createTransaction(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeStorageConfiguration bridgeStorageConfigurationAtThisHeight = BridgeStorageConfiguration.fromBlockchainConfig(config.getBlockchainConfig().getConfigForBlock(0)); @@ -225,7 +226,7 @@ public void callUpdateCollectionsWithTransactionsWaitingForConfirmationWithEnoug @Test public void sendNoRskTx() throws IOException { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Bridge bridge = new Bridge(config, PrecompiledContracts.BRIDGE_ADDR); @@ -242,7 +243,7 @@ public void sendNoRskTx() throws IOException { @Test public void sendNoBlockHeader() throws IOException { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction rskTx = Transaction.create(config, PrecompiledContracts.BRIDGE_ADDR_STR, AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA); @@ -258,7 +259,7 @@ public void sendNoBlockHeader() throws IOException { @Test public void sendOrphanBlockHeader() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction rskTx = Transaction.create(config, PrecompiledContracts.BRIDGE_ADDR_STR, AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA); @@ -297,7 +298,7 @@ public void executeWithFunctionSignatureLengthTooShortAfterRskip88() { when(mockedConfig.isRskip88()).thenReturn(true); config.setBlockchainConfig(mockedConfig); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Bridge bridge = new Bridge(config, PrecompiledContracts.BRIDGE_ADDR); @@ -327,7 +328,7 @@ public void executeWithInexistentFunctionAfterRskip88() { when(mockedConfig.isRskip88()).thenReturn(true); config.setBlockchainConfig(mockedConfig); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Bridge bridge = new Bridge(config, PrecompiledContracts.BRIDGE_ADDR); @@ -344,7 +345,7 @@ public void executeWithInexistentFunctionAfterRskip88() { @Test public void receiveHeadersNotFromTheFederation() throws IOException { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction rskTx = Transaction.create(config, PrecompiledContracts.BRIDGE_ADDR_STR, AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA); @@ -364,7 +365,7 @@ public void receiveHeadersNotFromTheFederation() throws IOException { @Test public void receiveHeadersWithNonParseableHeader() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction rskTx = Transaction.create(config, PrecompiledContracts.BRIDGE_ADDR_STR, AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA); @@ -384,7 +385,7 @@ public void receiveHeadersWithNonParseableHeader() { @Test public void receiveHeadersWithCorrectSizeHeaders() throws Exception { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction rskTx = Transaction.create(config, PrecompiledContracts.BRIDGE_ADDR_STR, AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA); @@ -436,7 +437,7 @@ public void receiveHeadersWithCorrectSizeHeaders() throws Exception { @Test public void receiveHeadersWithIncorrectSizeHeaders() throws Exception { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction rskTx = Transaction.create(config, PrecompiledContracts.BRIDGE_ADDR_STR, AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA); @@ -508,7 +509,7 @@ public void receiveHeadersWithIncorrectSizeHeaders() throws Exception { } public void registerBtcTransactionNotFromFederation() throws Exception{ - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction rskTx = Transaction.create(config, PrecompiledContracts.BRIDGE_ADDR_STR, AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA); @@ -530,7 +531,7 @@ public void registerBtcTransactionNotFromFederation() throws Exception{ @Test public void receiveHeadersWithHugeDeclaredTransactionsSize() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction rskTx = Transaction.create(config, PrecompiledContracts.BRIDGE_ADDR_STR, AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA); @@ -576,7 +577,7 @@ public byte[] bitcoinSerialize() { @Test public void registerBtcTransactionWithNonParseableTx() { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction rskTx = Transaction.create(config, PrecompiledContracts.BRIDGE_ADDR_STR, AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA); @@ -620,7 +621,7 @@ public void registerBtcTransactionWithHugeDeclaredWitnessPushSize() { } private void registerBtcTransactionWithHugeDeclaredSize(BtcTransaction tx) { - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction rskTx = Transaction.create(config, PrecompiledContracts.BRIDGE_ADDR_STR, AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA); @@ -695,7 +696,7 @@ protected void bitcoinSerializeToStream(OutputStream stream, boolean serializeWi @Test public void registerBtcTransactionWithNonParseableMerkleeProof1() throws Exception{ - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction rskTx = Transaction.create(config, PrecompiledContracts.BRIDGE_ADDR_STR, AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA); @@ -716,7 +717,7 @@ public void registerBtcTransactionWithNonParseableMerkleeProof1() throws Excepti @Test public void registerBtcTransactionWithNonParseableMerkleeProof2() throws Exception{ - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction rskTx = Transaction.create(config, PrecompiledContracts.BRIDGE_ADDR_STR, AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA); @@ -737,7 +738,7 @@ public void registerBtcTransactionWithNonParseableMerkleeProof2() throws Excepti @Test public void registerBtcTransactionWithHugeDeclaredSizeMerkleeProof() throws Exception{ - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction rskTx = Transaction.create(config, PrecompiledContracts.BRIDGE_ADDR_STR, AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA); @@ -783,7 +784,7 @@ public void bitcoinSerializeToStream(OutputStream stream) throws IOException { public void getFederationAddress() throws Exception { // Case with genesis federation Federation federation = bridgeConstants.getGenesisFederation(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Bridge bridge = new Bridge(config, PrecompiledContracts.BRIDGE_ADDR); @@ -798,7 +799,7 @@ public void getFederationAddress() throws Exception { @Test public void getMinimumLockTxValue() throws Exception{ - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); @@ -814,7 +815,7 @@ public void getMinimumLockTxValue() throws Exception{ @Test public void addSignatureNotFromFederation() throws Exception{ - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction rskTx = Transaction.create(config, PrecompiledContracts.BRIDGE_ADDR_STR, AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA); @@ -838,7 +839,7 @@ public void addSignatureNotFromFederation() throws Exception{ @Test public void addSignatureWithNonParseablePublicKey() throws Exception{ - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction rskTx = Transaction.create(config, PrecompiledContracts.BRIDGE_ADDR_STR, AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA); @@ -857,7 +858,7 @@ public void addSignatureWithNonParseablePublicKey() throws Exception{ @Test public void addSignatureWithEmptySignatureArray() throws Exception{ - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction rskTx = Transaction.create(config, PrecompiledContracts.BRIDGE_ADDR_STR, AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA); @@ -876,7 +877,7 @@ public void addSignatureWithEmptySignatureArray() throws Exception{ @Test public void addSignatureWithNonParseableSignature() throws Exception{ - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction rskTx = Transaction.create(config, PrecompiledContracts.BRIDGE_ADDR_STR, AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA); @@ -895,7 +896,7 @@ public void addSignatureWithNonParseableSignature() throws Exception{ @Test public void addSignatureWithNonParseableRskTx() throws Exception{ - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction rskTx = Transaction.create(config, PrecompiledContracts.BRIDGE_ADDR_STR, AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA); @@ -995,7 +996,7 @@ public void getBtcBlockchainBlockLocatorBeforeRskip89Fork() throws Exception { GenesisConfig mockedConfig = spy(new GenesisConfig()); config.setBlockchainConfig(mockedConfig); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); String hashedString = "0000000000000000000000000000000000000000000000000000000000000001"; @@ -1025,7 +1026,7 @@ public void getBtcBlockchainBlockLocatorAfterRskip88And89Fork() { when(mockedConfig.isRskip89()).thenReturn(true); config.setBlockchainConfig(mockedConfig); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Bridge bridge = new Bridge(config, PrecompiledContracts.BRIDGE_ADDR); @@ -1496,7 +1497,7 @@ public void getLockWhitelistEntryByAddressBeforeRskip87And88Fork() throws IOExce Address address = new BtcECKey().toAddress(networkParameters); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction mockedTransaction = mock(Transaction.class); @@ -1515,7 +1516,7 @@ public void getLockWhitelistEntryByAddressAfterRskip87Fork() throws IOException, when(mockedConfig.isRskip87()).thenReturn(true); config.setBlockchainConfig(mockedConfig); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Address mockedAddressForUnlimited = new BtcECKey().toAddress(networkParameters); @@ -1559,7 +1560,7 @@ public void addLockWhitelistAddressBeforeRskip87Fork() throws IOException { when(mockedConfig.isRskip87()).thenReturn(false); config.setBlockchainConfig(mockedConfig); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction mockedTransaction = mock(Transaction.class); @@ -1587,7 +1588,7 @@ public void addLockWhitelistAddressAfterRskip87And88Fork() throws IOException { when(mockedConfig.isRskip88()).thenReturn(true); config.setBlockchainConfig(mockedConfig); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction mockedTransaction = mock(Transaction.class); @@ -1611,7 +1612,7 @@ public void addOneOffLockWhitelistAddressBeforeRskip87And88Fork() throws IOExcep when(mockedConfig.isRskip88()).thenReturn(false); config.setBlockchainConfig(mockedConfig); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction mockedTransaction = mock(Transaction.class); @@ -1627,7 +1628,7 @@ public void addOneOffLockWhitelistAddressAfterRskip87Fork() throws IOException { when(mockedConfig.isRskip87()).thenReturn(true); config.setBlockchainConfig(mockedConfig); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction mockedTransaction = mock(Transaction.class); @@ -1655,7 +1656,7 @@ public void addUnlimitedLockWhitelistAddressBeforeRskip87And88Fork() { when(mockedConfig.isRskip88()).thenReturn(false); config.setBlockchainConfig(mockedConfig); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction mockedTransaction = mock(Transaction.class); @@ -1671,7 +1672,7 @@ public void addUnlimitedLockWhitelistAddressAfterRskip87Fork() { when(mockedConfig.isRskip87()).thenReturn(true); config.setBlockchainConfig(mockedConfig); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction mockedTransaction = mock(Transaction.class); @@ -1758,7 +1759,7 @@ public void testBlock457BridgeCall() throws Exception { // block 457 was the first federate call. byte[] data = Files.readAllBytes(Paths.get(this.getClass().getResource("/bridge/block457.bin").toURI())); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); Transaction rskTx = Transaction.create(config, PrecompiledContracts.BRIDGE_ADDR_STR, AMOUNT, NONCE, GAS_PRICE, GAS_LIMIT, DATA); @@ -2047,4 +2048,8 @@ public void mineableMethodsDefinition() { Assert.assertFalse(m.onlyAllowsLocalCalls()); }); } + + public static RepositoryImpl createRepositoryImpl(RskSystemProperties config) { + return new RepositoryImpl(null, config.detailsInMemoryStorageLimit(), config.databaseDir()); + } } diff --git a/rskj-core/src/test/java/co/rsk/peg/BridgeUtilsTest.java b/rskj-core/src/test/java/co/rsk/peg/BridgeUtilsTest.java index d1077f85084..77d2d5ed6f7 100644 --- a/rskj-core/src/test/java/co/rsk/peg/BridgeUtilsTest.java +++ b/rskj-core/src/test/java/co/rsk/peg/BridgeUtilsTest.java @@ -493,6 +493,6 @@ private void isFreeBridgeTx(boolean expected, RskAddress destinationAddress, byt Block rskExecutionBlock = new BlockGenerator().createChildBlock(Genesis.getInstance(config)); bridge.init(rskTx, rskExecutionBlock, null, null, null, null); - Assert.assertEquals(expected, BridgeUtils.isFreeBridgeTx(config, rskTx, rskExecutionBlock.getNumber())); + Assert.assertEquals(expected, BridgeUtils.isFreeBridgeTx(rskTx, rskExecutionBlock.getNumber(), config.getBlockchainConfig())); } } diff --git a/rskj-core/src/test/java/co/rsk/peg/RskForksBridgeTest.java b/rskj-core/src/test/java/co/rsk/peg/RskForksBridgeTest.java index e7ebdeeb032..f2e239e361e 100644 --- a/rskj-core/src/test/java/co/rsk/peg/RskForksBridgeTest.java +++ b/rskj-core/src/test/java/co/rsk/peg/RskForksBridgeTest.java @@ -33,6 +33,7 @@ import org.ethereum.config.blockchain.regtest.RegTestGenesisConfig; import org.ethereum.core.*; import org.ethereum.crypto.ECKey; +import org.ethereum.listener.EthereumListenerAdapter; import org.ethereum.vm.PrecompiledContracts; import org.ethereum.vm.program.ProgramResult; import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; @@ -349,9 +350,27 @@ private BridgeState callGetStateForDebuggingTx() throws IOException, ClassNotFou Bridge.GET_STATE_FOR_DEBUGGING.encode(new Object[]{})); rskTx.sign(new byte[32]); - TransactionExecutor executor = new TransactionExecutor(beforeBambooProperties, rskTx, 0, blockChain.getBestBlock().getCoinbase(), repository, - blockChain.getBlockStore(), null, new ProgramInvokeFactoryImpl(), blockChain.getBestBlock()) - .setLocalCall(true); + TransactionExecutor executor = new TransactionExecutor( + rskTx, + 0, + blockChain.getBestBlock().getCoinbase(), + repository, + blockChain.getBlockStore(), + null, + new ProgramInvokeFactoryImpl(), + blockChain.getBestBlock(), + new EthereumListenerAdapter(), + 0, + beforeBambooProperties.getVmConfig(), + beforeBambooProperties.getBlockchainConfig(), + beforeBambooProperties.playVM(), + beforeBambooProperties.isRemascEnabled(), + beforeBambooProperties.vmTrace(), + new PrecompiledContracts(beforeBambooProperties), + beforeBambooProperties.databaseDir(), + beforeBambooProperties.vmTraceDir(), + beforeBambooProperties.vmTraceCompressed()) + .setLocalCall(true); executor.init(); executor.execute(); diff --git a/rskj-core/src/test/java/co/rsk/peg/SamplePrecompiledContractTest.java b/rskj-core/src/test/java/co/rsk/peg/SamplePrecompiledContractTest.java index 40ec21562e8..df95c728747 100644 --- a/rskj-core/src/test/java/co/rsk/peg/SamplePrecompiledContractTest.java +++ b/rskj-core/src/test/java/co/rsk/peg/SamplePrecompiledContractTest.java @@ -18,6 +18,7 @@ package co.rsk.peg; +import co.rsk.config.RskSystemProperties; import co.rsk.config.TestSystemProperties; import co.rsk.db.RepositoryImpl; import org.apache.commons.lang3.StringUtils; @@ -75,7 +76,7 @@ public void samplePrecompiledContractMethod1Ok() byte[] bytes = new byte[]{(byte) 0xab, (byte) 0xcd, (byte) 0xef}; byte[] data = function.encode(111, bytes, 222); - contract.init(null, null, new RepositoryImpl(config), null, null, new ArrayList()); + contract.init(null, null, createRepositoryImpl(config), null, null, new ArrayList()); byte[] result = contract.execute(data); Object[] results = function.decodeResult(result); @@ -104,7 +105,7 @@ public void samplePrecompiledContractMethod1WrongData() byte[] data = new byte[]{(byte) 0xab, (byte) 0xcd, (byte) 0xef}; - contract.init(null, null, new RepositoryImpl(config), null, null, new ArrayList()); + contract.init(null, null, createRepositoryImpl(config), null, null, new ArrayList()); byte[] result = contract.execute(data); assertNull(result); @@ -133,7 +134,7 @@ public void samplePrecompiledContractMethodDoesNotExist() byte[] bytes = new byte[]{(byte) 0xab, (byte) 0xcd, (byte) 0xef}; byte[] data = function.encode(111, bytes, 222); - contract.init(null, null, new RepositoryImpl(config), null, null, new ArrayList()); + contract.init(null, null, createRepositoryImpl(config), null, null, new ArrayList()); byte[] result = contract.execute(data); assertNull(result); @@ -160,7 +161,7 @@ public void samplePrecompiledContractMethod1LargeData() byte[] data = function.encode(111, StringUtils.leftPad("foobar", 1000000, '*')); - contract.init(null, null, new RepositoryImpl(config), null, null, new ArrayList()); + contract.init(null, null, createRepositoryImpl(config), null, null, new ArrayList()); byte[] result = contract.execute(data); Object[] results = function.decodeResult(result); @@ -187,7 +188,7 @@ public void samplePrecompiledContractAddBalanceOk() byte[] data = function.encode(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); contract.init(null, null, repository, null, null, new ArrayList()); contract.execute(data); @@ -198,7 +199,7 @@ public void samplePrecompiledContractAddBalanceOk() @Test public void samplePrecompiledContractGetBalanceInitialBalance() { - int balance = this.GetBalance(new RepositoryImpl(config)); + int balance = this.GetBalance(createRepositoryImpl(config)); assertEquals(0, balance); } @@ -222,7 +223,7 @@ public void samplePrecompiledContractIncrementResultOk() byte[] data = function.encode(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); Repository track = repository.startTracking(); contract.init(null, null, track, null, null, new ArrayList()); contract.execute(data); @@ -235,7 +236,7 @@ public void samplePrecompiledContractIncrementResultOk() @Test public void samplePrecompiledContractGetResultInitialValue() { - int result = this.GetResult(new RepositoryImpl(config)); + int result = this.GetResult(createRepositoryImpl(config)); assertEquals(0, result); } @@ -301,4 +302,8 @@ public void samplePrecompiledContractPostRskIp93DoesntExist() Assert.assertNull(contract); } + + public static RepositoryImpl createRepositoryImpl(RskSystemProperties config) { + return new RepositoryImpl(null, config.detailsInMemoryStorageLimit(), config.databaseDir()); + } } diff --git a/rskj-core/src/test/java/co/rsk/peg/performance/BridgePerformanceTestCase.java b/rskj-core/src/test/java/co/rsk/peg/performance/BridgePerformanceTestCase.java index 9f164f144ab..f5b337b30ee 100644 --- a/rskj-core/src/test/java/co/rsk/peg/performance/BridgePerformanceTestCase.java +++ b/rskj-core/src/test/java/co/rsk/peg/performance/BridgePerformanceTestCase.java @@ -20,6 +20,7 @@ import co.rsk.bitcoinj.core.*; import co.rsk.config.BridgeConstants; +import co.rsk.config.RskSystemProperties; import co.rsk.config.TestSystemProperties; import co.rsk.db.RepositoryImpl; import co.rsk.db.RepositoryTrackWithBenchmarking; @@ -248,7 +249,7 @@ private ExecutionTracker execute( ExecutionTracker executionInfo = new ExecutionTracker(thread); - RepositoryImpl repository = new RepositoryImpl(config); + RepositoryImpl repository = createRepositoryImpl(config); Repository track = repository.startTracking(); BridgeStorageConfiguration bridgeStorageConfigurationAtThisHeight = BridgeStorageConfiguration.fromBlockchainConfig(config.getBlockchainConfig().getConfigForBlock(executionIndex)); BridgeStorageProvider storageProvider = new BridgeStorageProvider(track, PrecompiledContracts.BRIDGE_ADDR, bridgeConstants,bridgeStorageConfigurationAtThisHeight); @@ -266,7 +267,7 @@ private ExecutionTracker execute( List logs = new ArrayList<>(); - RepositoryTrackWithBenchmarking benchmarkerTrack = new RepositoryTrackWithBenchmarking(config, repository); + RepositoryTrackWithBenchmarking benchmarkerTrack = new RepositoryTrackWithBenchmarking(repository); Bridge bridge = new Bridge(config, PrecompiledContracts.BRIDGE_ADDR); Blockchain blockchain = BlockChainBuilder.ofSizeWithNoTransactionPoolCleaner(heightProvider.getHeight(executionIndex)); @@ -320,4 +321,8 @@ protected ExecutionStats executeAndAverage(String name, return stats; } + + public static RepositoryImpl createRepositoryImpl(RskSystemProperties config) { + return new RepositoryImpl(null, config.detailsInMemoryStorageLimit(), config.databaseDir()); + } } diff --git a/rskj-core/src/test/java/co/rsk/remasc/RemascProcessMinerFeesTest.java b/rskj-core/src/test/java/co/rsk/remasc/RemascProcessMinerFeesTest.java index 67d3df850ab..b1db22659a4 100644 --- a/rskj-core/src/test/java/co/rsk/remasc/RemascProcessMinerFeesTest.java +++ b/rskj-core/src/test/java/co/rsk/remasc/RemascProcessMinerFeesTest.java @@ -37,6 +37,7 @@ import org.ethereum.crypto.ECKey; import org.ethereum.crypto.Keccak256Helper; import org.ethereum.vm.PrecompiledContracts; +import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; import org.junit.BeforeClass; import org.junit.Test; import org.bouncycastle.util.encoders.Hex; @@ -110,7 +111,28 @@ public void processMinersFeesWithoutMinimumSyntheticSpan() { blocks.add(blockWithOneTx); blocks.addAll(createSimpleBlocks(blockWithOneTx, 9)); - BlockExecutor blockExecutor = new BlockExecutor(config, blockchain.getRepository(), null, blockchain.getBlockStore(), null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor blockExecutor = new BlockExecutor(blockchain.getRepository(), (tx, txindex, coinbase, track, block, totalGasUsed) -> new TransactionExecutor( + tx, + txindex, + block.getCoinbase(), + track, + blockchain.getBlockStore(), + null, + programInvokeFactory, + block, + null, + totalGasUsed, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); for (Block b : blocks) { blockExecutor.executeAndFillAll(b, blockchain.getBestBlock()); @@ -153,7 +175,28 @@ public void processMinersFeesWithNoSiblings() { blocks.add(blockWithOneTx); blocks.addAll(createSimpleBlocks(blockWithOneTx, 9)); - BlockExecutor blockExecutor = new BlockExecutor(config, blockchain.getRepository(), null, blockchain.getBlockStore(), null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor blockExecutor = new BlockExecutor(blockchain.getRepository(), (tx, txindex, coinbase, track, block, totalGasUsed) -> new TransactionExecutor( + tx, + txindex, + block.getCoinbase(), + track, + blockchain.getBlockStore(), + null, + programInvokeFactory, + block, + null, + totalGasUsed, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); for (Block b : blocks) { blockExecutor.executeAndFillAll(b, blockchain.getBestBlock()); @@ -211,7 +254,28 @@ public void processMinersFeesWithOneSibling() { blocks.add(blockThatIncludesUncle); blocks.addAll(createSimpleBlocks(blockThatIncludesUncle, 8)); - BlockExecutor blockExecutor = new BlockExecutor(config, blockchain.getRepository(), null, blockchain.getBlockStore(), null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor blockExecutor = new BlockExecutor(blockchain.getRepository(), (tx, txindex, coinbase, track, block, totalGasUsed) -> new TransactionExecutor( + tx, + txindex, + block.getCoinbase(), + track, + blockchain.getBlockStore(), + null, + programInvokeFactory, + block, + null, + totalGasUsed, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); for (Block b : blocks) { blockExecutor.executeAndFillAll(b, blockchain.getBestBlock()); @@ -311,8 +375,28 @@ public void siblingThatBreaksSelectionRuleGetsPunished() { blocks.add(blockThatIncludesUnclesE); blocks.addAll(createSimpleBlocks(blockThatIncludesUnclesE, 7)); - BlockExecutor blockExecutor = new BlockExecutor(config, blockchain.getRepository(), null, - blockchain.getBlockStore(), null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor blockExecutor = new BlockExecutor(blockchain.getRepository(), (tx, txindex, coinbase, track, block, totalGasUsed) -> new TransactionExecutor( + tx, + txindex, + block.getCoinbase(), + track, + blockchain.getBlockStore(), + null, + programInvokeFactory, + block, + null, + totalGasUsed, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); for (Block b : blocks) { blockExecutor.executeAndFillAll(b, blockchain.getBestBlock()); @@ -427,7 +511,28 @@ public void noPublisherFeeIsPaidWhenThePublisherHasNoSiblings() { blocks.add(blockThatIncludesUncleC); blocks.addAll(createSimpleBlocks(blockThatIncludesUncleC, 7)); - BlockExecutor blockExecutor = new BlockExecutor(config, blockchain.getRepository(), null, blockchain.getBlockStore(), null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor blockExecutor = new BlockExecutor(blockchain.getRepository(), (tx, txindex, coinbase, track, block, totalGasUsed) -> new TransactionExecutor( + tx, + txindex, + block.getCoinbase(), + track, + blockchain.getBlockStore(), + null, + programInvokeFactory, + block, + null, + totalGasUsed, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); for (Block b : blocks) { blockExecutor.executeAndFillAll(b, blockchain.getBestBlock()); @@ -502,8 +607,28 @@ private void processMinersFeesWithOneSiblingBrokenSelectionRule(String reasonFor blocks.add(blockWithOneTxD); blocks.addAll(createSimpleBlocks(blockWithOneTxD, 7)); - BlockExecutor blockExecutor = new BlockExecutor(config, blockchain.getRepository(), - null, blockchain.getBlockStore(), null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor blockExecutor = new BlockExecutor(blockchain.getRepository(), (tx, txindex, coinbase, track, block, totalGasUsed) -> new TransactionExecutor( + tx, + txindex, + block.getCoinbase(), + track, + blockchain.getBlockStore(), + null, + programInvokeFactory, + block, + null, + totalGasUsed, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); for (Block b : blocks) { blockExecutor.executeAndFillAll(b, blockchain.getBestBlock()); @@ -586,7 +711,28 @@ public void processMinersFeesFromTxThatIsNotTheLatestTx() { blocks.add(blockWithOneTx); blocks.addAll(createSimpleBlocks(blockWithOneTx, 9)); - BlockExecutor blockExecutor = new BlockExecutor(config, blockchain.getRepository(), null, blockchain.getBlockStore(), null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor blockExecutor = new BlockExecutor(blockchain.getRepository(), (tx, txindex, coinbase, track, block, totalGasUsed) -> new TransactionExecutor( + tx, + txindex, + block.getCoinbase(), + track, + blockchain.getBlockStore(), + null, + programInvokeFactory, + block, + null, + totalGasUsed, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); for (Block b : blocks) { blockExecutor.executeAndFillAll(b, blockchain.getBestBlock()); @@ -650,7 +796,28 @@ public void processMinersFeesFromTxInvokedByAnotherContract() { blocks.add(blockWithOneTx); blocks.addAll(createSimpleBlocks(blockWithOneTx, 9)); - BlockExecutor blockExecutor = new BlockExecutor(config, blockchain.getRepository(), null, blockchain.getBlockStore(), null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor blockExecutor = new BlockExecutor(blockchain.getRepository(), (tx, txindex, coinbase, track, block, totalGasUsed) -> new TransactionExecutor( + tx, + txindex, + block.getCoinbase(), + track, + blockchain.getBlockStore(), + null, + programInvokeFactory, + block, + null, + totalGasUsed, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); for (Block b : blocks) { blockExecutor.executeAndFillAll(b, blockchain.getBestBlock()); diff --git a/rskj-core/src/test/java/co/rsk/remasc/RemascStorageProviderTest.java b/rskj-core/src/test/java/co/rsk/remasc/RemascStorageProviderTest.java index 2bb43897d1a..e82d3201794 100644 --- a/rskj-core/src/test/java/co/rsk/remasc/RemascStorageProviderTest.java +++ b/rskj-core/src/test/java/co/rsk/remasc/RemascStorageProviderTest.java @@ -43,6 +43,7 @@ import org.ethereum.crypto.Keccak256Helper; import org.ethereum.db.BlockStore; import org.ethereum.vm.PrecompiledContracts; +import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; import org.junit.Assert; import org.junit.Test; @@ -50,7 +51,6 @@ import java.math.BigInteger; import java.util.*; -import static org.ethereum.TestUtils.randomAddress; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.anyLong; import static org.mockito.Mockito.spy; @@ -103,7 +103,7 @@ private RskAddress randomAddress() { @Test public void getDefautRewardBalance() { RskAddress accountAddress = randomAddress(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); RemascStorageProvider provider = new RemascStorageProvider(repository, accountAddress); @@ -113,7 +113,7 @@ public void getDefautRewardBalance() { @Test public void setAndGetRewardBalance() { RskAddress accountAddress = randomAddress(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); RemascStorageProvider provider = new RemascStorageProvider(repository, accountAddress); @@ -141,7 +141,7 @@ public void setSaveRetrieveAndGetRewardBalance() throws IOException { @Test public void getDefautBurnedBalance() { RskAddress accountAddress = randomAddress(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); RemascStorageProvider provider = new RemascStorageProvider(repository, accountAddress); @@ -151,7 +151,7 @@ public void getDefautBurnedBalance() { @Test public void setAndGetBurnedBalance() { RskAddress accountAddress = randomAddress(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); RemascStorageProvider provider = new RemascStorageProvider(repository, accountAddress); @@ -179,7 +179,7 @@ public void setSaveRetrieveAndGetBurnedBalance() throws IOException { @Test public void getDefaultBrokenSelectionRule() { RskAddress accountAddress = randomAddress(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); RemascStorageProvider provider = new RemascStorageProvider(repository, accountAddress); @@ -189,7 +189,7 @@ public void getDefaultBrokenSelectionRule() { @Test public void setAndGetBrokenSelectionRule() { RskAddress accountAddress = randomAddress(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); RemascStorageProvider provider = new RemascStorageProvider(repository, accountAddress); @@ -217,7 +217,7 @@ public void setSaveRetrieveAndGetBrokenSelectionRule() throws IOException { @Test public void getDefaultSiblings() { RskAddress accountAddress = randomAddress(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); RemascStorageProvider provider = new RemascStorageProvider(repository, accountAddress); @@ -230,7 +230,7 @@ public void getDefaultSiblings() { @Test public void setAndGetSiblings() { RskAddress accountAddress = randomAddress(); - Repository repository = new RepositoryImpl(config); + Repository repository = createRepositoryImpl(config); RemascStorageProvider provider = new RemascStorageProvider(repository, accountAddress); @@ -654,7 +654,28 @@ public void paysOnlyBlocksWithEnoughBalanceAccumulatedAfterRFS() throws IOExcept Repository repository = blockchain.getRepository(); BlockStore blockStore = blockchain.getBlockStore(); - BlockExecutor blockExecutor = new BlockExecutor(config, repository, null, blockStore, null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor blockExecutor = new BlockExecutor(repository, (tx, txindex, coinbase1, track, block, totalGasUsed) -> new TransactionExecutor( + tx, + txindex, + block.getCoinbase(), + track, + blockStore, + null, + programInvokeFactory, + block, + null, + totalGasUsed, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); for (Block b : blocks) { blockExecutor.executeAndFillAll(b, blockchain.getBestBlock()); @@ -671,4 +692,7 @@ public void paysOnlyBlocksWithEnoughBalanceAccumulatedAfterRFS() throws IOExcept } } + public static RepositoryImpl createRepositoryImpl(RskSystemProperties config) { + return new RepositoryImpl(null, config.detailsInMemoryStorageLimit(), config.databaseDir()); + } } diff --git a/rskj-core/src/test/java/co/rsk/remasc/RemascTestRunner.java b/rskj-core/src/test/java/co/rsk/remasc/RemascTestRunner.java index 103e3acc725..ee6c07ba43e 100644 --- a/rskj-core/src/test/java/co/rsk/remasc/RemascTestRunner.java +++ b/rskj-core/src/test/java/co/rsk/remasc/RemascTestRunner.java @@ -21,7 +21,6 @@ import co.rsk.config.TestSystemProperties; import co.rsk.core.BlockDifficulty; import co.rsk.core.Coin; -import co.rsk.core.Rsk; import co.rsk.core.RskAddress; import co.rsk.core.bc.BlockChainImpl; import co.rsk.core.bc.BlockExecutor; @@ -33,6 +32,8 @@ import org.ethereum.crypto.ECKey; import org.ethereum.crypto.HashUtil; import org.ethereum.util.RLP; +import org.ethereum.vm.PrecompiledContracts; +import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; import java.math.BigInteger; import java.util.ArrayList; @@ -119,8 +120,29 @@ public void start() { List mainChainBlocks = new ArrayList<>(); this.blockchain.tryToConnect(this.genesis); - BlockExecutor blockExecutor = new BlockExecutor(builder.getConfig(), blockchain.getRepository(), - null, blockchain.getBlockStore(), null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockExecutor blockExecutor = new BlockExecutor(blockchain.getRepository(), + (tx, txindex, coinbase, track, block, totalGasUsed) -> new TransactionExecutor( + tx, + txindex, + block.getCoinbase(), + track, + blockchain.getBlockStore(), + null, + programInvokeFactory, + block, + null, + totalGasUsed, + builder.getConfig().getVmConfig(), + builder.getConfig().getBlockchainConfig(), + builder.getConfig().playVM(), + builder.getConfig().isRemascEnabled(), + builder.getConfig().vmTrace(), + new PrecompiledContracts(builder.getConfig()), + builder.getConfig().databaseDir(), + builder.getConfig().vmTraceDir(), + builder.getConfig().vmTraceCompressed()) + ); for(int i = 0; i <= this.initialHeight; i++) { int finalI = i; diff --git a/rskj-core/src/test/java/co/rsk/test/World.java b/rskj-core/src/test/java/co/rsk/test/World.java index 552bd0009a5..9f6ca2eb6a6 100644 --- a/rskj-core/src/test/java/co/rsk/test/World.java +++ b/rskj-core/src/test/java/co/rsk/test/World.java @@ -30,6 +30,8 @@ import co.rsk.test.builders.BlockChainBuilder; import org.ethereum.core.*; import org.ethereum.db.ReceiptStore; +import org.ethereum.vm.PrecompiledContracts; +import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; import java.util.HashMap; import java.util.Map; @@ -82,8 +84,30 @@ public World(BlockChainImpl blockChain, Genesis genesis) { public NodeBlockProcessor getBlockProcessor() { return this.blockProcessor; } public BlockExecutor getBlockExecutor() { + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + final TestSystemProperties config = new TestSystemProperties(); if (this.blockExecutor == null) - this.blockExecutor = new BlockExecutor(new TestSystemProperties(), this.getRepository(), null, this.getBlockChain().getBlockStore(), null); + this.blockExecutor = new BlockExecutor(this.getRepository(), (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + this.getBlockChain().getBlockStore(), + null, + programInvokeFactory, + block1, + null, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); return this.blockExecutor; } diff --git a/rskj-core/src/test/java/co/rsk/test/builders/BlockBuilder.java b/rskj-core/src/test/java/co/rsk/test/builders/BlockBuilder.java index 466fcc79f18..abec8ee7c42 100644 --- a/rskj-core/src/test/java/co/rsk/test/builders/BlockBuilder.java +++ b/rskj-core/src/test/java/co/rsk/test/builders/BlockBuilder.java @@ -27,6 +27,9 @@ import org.ethereum.core.BlockHeader; import org.ethereum.core.Transaction; import org.bouncycastle.util.BigIntegers; +import org.ethereum.core.TransactionExecutor; +import org.ethereum.vm.PrecompiledContracts; +import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; import java.math.BigInteger; import java.util.List; @@ -101,7 +104,29 @@ public Block build() { Block block = blockGenerator.createChildBlock(parent, txs, uncles, difficulty, this.minGasPrice, gasLimit); if (blockChain != null) { - BlockExecutor executor = new BlockExecutor(new TestSystemProperties(), blockChain.getRepository(), null, blockChain.getBlockStore(), blockChain.getListener()); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + final TestSystemProperties config = new TestSystemProperties(); + BlockExecutor executor = new BlockExecutor(blockChain.getRepository(), (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + blockChain.getBlockStore(), + null, + programInvokeFactory, + block1, + blockChain.getListener(), + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); executor.executeAndFill(block, parent); } diff --git a/rskj-core/src/test/java/co/rsk/test/builders/BlockChainBuilder.java b/rskj-core/src/test/java/co/rsk/test/builders/BlockChainBuilder.java index d43798a1be6..5231672d6af 100644 --- a/rskj-core/src/test/java/co/rsk/test/builders/BlockChainBuilder.java +++ b/rskj-core/src/test/java/co/rsk/test/builders/BlockChainBuilder.java @@ -35,7 +35,6 @@ import org.ethereum.db.*; import org.ethereum.listener.EthereumListener; import org.ethereum.listener.TestCompositeEthereumListener; -import org.ethereum.manager.AdminInfo; import org.ethereum.vm.PrecompiledContracts; import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; import org.junit.Assert; @@ -51,18 +50,12 @@ public class BlockChainBuilder { private List blocks; private List txinfos; - private AdminInfo adminInfo; private Repository repository; private BlockStore blockStore; private Genesis genesis; private ReceiptStore receiptStore; private RskSystemProperties config; - public BlockChainBuilder setAdminInfo(AdminInfo adminInfo) { - this.adminInfo = adminInfo; - return this; - } - public BlockChainBuilder setTesting(boolean value) { this.testing = value; return this; @@ -117,7 +110,7 @@ public BlockChainImpl build(boolean withoutCleaner) { } if (repository == null) - repository = new RepositoryImpl(config, new TrieStoreImpl(new HashMapDB().setClearOnClose(false))); + repository = new RepositoryImpl(new TrieStoreImpl(new HashMapDB().setClearOnClose(false)), config.detailsInMemoryStorageLimit(), config.databaseDir()); if (blockStore == null) { blockStore = new IndexedBlockStore(new HashMap<>(), new HashMapDB(), null); @@ -142,10 +135,6 @@ public BlockChainImpl build(boolean withoutCleaner) { BlockValidator blockValidator = validatorBuilder.build(); - if (this.adminInfo == null) - this.adminInfo = new AdminInfo(); - - TransactionPoolImpl transactionPool; if (withoutCleaner) { transactionPool = new TransactionPoolImplNoCleaner(config, this.repository, this.blockStore, receiptStore, new ProgramInvokeFactoryImpl(), new TestCompositeEthereumListener(), 10, 100); @@ -153,7 +142,28 @@ public BlockChainImpl build(boolean withoutCleaner) { transactionPool = new TransactionPoolImpl(config, this.repository, this.blockStore, receiptStore, new ProgramInvokeFactoryImpl(), new TestCompositeEthereumListener(), 10, 100); } - BlockChainImpl blockChain = new BlockChainImpl(config, this.repository, this.blockStore, receiptStore, transactionPool, listener, this.adminInfo, blockValidator); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockChainImpl blockChain = new BlockChainImpl(this.repository, this.blockStore, receiptStore, transactionPool, listener, blockValidator, false, 1, new BlockExecutor(this.repository, (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + this.blockStore, + receiptStore, + programInvokeFactory, + block1, + listener, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + ))); if (this.testing) { blockChain.setBlockValidator(new DummyBlockValidator()); @@ -178,7 +188,28 @@ public BlockChainImpl build(boolean withoutCleaner) { } if (this.blocks != null) { - BlockExecutor blockExecutor = new BlockExecutor(config, repository, receiptStore, blockStore, listener); + final ProgramInvokeFactoryImpl programInvokeFactory1 = new ProgramInvokeFactoryImpl(); + BlockExecutor blockExecutor = new BlockExecutor(repository, (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + blockStore, + receiptStore, + programInvokeFactory1, + block1, + listener, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); for (Block b : this.blocks) { blockExecutor.executeAndFillAll(b, blockChain.getBestBlock()); diff --git a/rskj-core/src/test/java/co/rsk/test/dsl/WorldDslProcessor.java b/rskj-core/src/test/java/co/rsk/test/dsl/WorldDslProcessor.java index f2a2ce75acd..8afe09ee92f 100644 --- a/rskj-core/src/test/java/co/rsk/test/dsl/WorldDslProcessor.java +++ b/rskj-core/src/test/java/co/rsk/test/dsl/WorldDslProcessor.java @@ -27,10 +27,9 @@ import co.rsk.test.World; import co.rsk.test.builders.AccountBuilder; import co.rsk.test.builders.BlockBuilder; -import org.ethereum.core.Account; -import org.ethereum.core.Block; -import org.ethereum.core.ImportResult; -import org.ethereum.core.Transaction; +import org.ethereum.core.*; +import org.ethereum.vm.PrecompiledContracts; +import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -224,8 +223,30 @@ private void processBlockChainCommand(DslCommand cmd) { difficulty = difficultyTokenizer.hasMoreTokens()?parseDifficulty(difficultyTokenizer.nextToken(),k):k; } Block block = blockBuilder.difficulty(difficulty).parent(parent).build(); - BlockExecutor executor = new BlockExecutor(new TestSystemProperties(), world.getRepository(), - null, world.getBlockChain().getBlockStore(), null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + final TestSystemProperties config = new TestSystemProperties(); + BlockExecutor executor = new BlockExecutor(world.getRepository(), + (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + world.getBlockChain().getBlockStore(), + null, + programInvokeFactory, + block1, + null, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )); executor.executeAndFill(block, parent); world.saveBlock(name, block); parent = block; diff --git a/rskj-core/src/test/java/co/rsk/trie/TrieCopierTest.java b/rskj-core/src/test/java/co/rsk/trie/TrieCopierTest.java index 8a8b828d3ca..3ab7f292c89 100644 --- a/rskj-core/src/test/java/co/rsk/trie/TrieCopierTest.java +++ b/rskj-core/src/test/java/co/rsk/trie/TrieCopierTest.java @@ -19,7 +19,6 @@ package co.rsk.trie; import co.rsk.blockchain.utils.BlockGenerator; -import co.rsk.config.ConfigLoader; import co.rsk.config.RskSystemProperties; import co.rsk.config.TestSystemProperties; import co.rsk.core.Coin; @@ -35,7 +34,6 @@ import org.ethereum.vm.PrecompiledContracts; import org.junit.Assert; import org.junit.Test; -import org.bouncycastle.pqc.math.linearalgebra.ByteUtils; import java.math.BigInteger; import java.util.ArrayList; @@ -135,7 +133,7 @@ public void copyThreeTries() { public void copyBlockchainHeightTwoStates() { TrieStore store = new TrieStoreImpl(new HashMapDB().setClearOnClose(false)); TrieStore store2 = new TrieStoreImpl(new HashMapDB().setClearOnClose(false)); - Repository repository = new RepositoryImpl(config, store); + Repository repository = new RepositoryImpl(store, config.detailsInMemoryStorageLimit(), config.databaseDir()); World world = new World(repository); Blockchain blockchain = createBlockchain(world); @@ -148,7 +146,7 @@ public void copyBlockchainHeightTwoStates() { TrieCopier.trieStateCopy(store, store2, blockchain, 9); Repository repository91 = repository.getSnapshotTo(state9); - Repository repository92 = new RepositoryImpl(config, store2).getSnapshotTo(state9); + Repository repository92 = new RepositoryImpl(store2, config.detailsInMemoryStorageLimit(), config.databaseDir()).getSnapshotTo(state9); Assert.assertNotNull(repository91); Assert.assertNotNull(repository92); @@ -166,7 +164,7 @@ public void copyBlockchainHeightTwoStates() { public void copyBlockchainHeightTwoContractStates() { TrieStore store = new TrieStoreImpl(new HashMapDB().setClearOnClose(false)); TrieStore store2 = new TrieStoreImpl(new HashMapDB().setClearOnClose(false)); - Repository repository = new RepositoryImpl(config, store); + Repository repository = new RepositoryImpl(store, config.detailsInMemoryStorageLimit(), config.databaseDir()); World world = new World(repository); Blockchain blockchain = createBlockchain(world); diff --git a/rskj-core/src/test/java/co/rsk/vm/MinerHelper.java b/rskj-core/src/test/java/co/rsk/vm/MinerHelper.java index 0674e32ccc1..3808d6ff2f6 100644 --- a/rskj-core/src/test/java/co/rsk/vm/MinerHelper.java +++ b/rskj-core/src/test/java/co/rsk/vm/MinerHelper.java @@ -25,6 +25,7 @@ import co.rsk.panic.PanicProcessor; import org.ethereum.core.*; import org.ethereum.listener.EthereumListenerAdapter; +import org.ethereum.vm.PrecompiledContracts; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.bouncycastle.util.encoders.Hex; @@ -86,9 +87,27 @@ public void processBlock( Block block, Block parent) { for (Transaction tx : block.getTransactionsList()) { - TransactionExecutor executor = new TransactionExecutor(config, tx, txindex++, block.getCoinbase(), - track, null, null, - null, block, new EthereumListenerAdapter(), totalGasUsed); + TransactionExecutor executor = new TransactionExecutor( + tx, + txindex++, + block.getCoinbase(), + track, + null, + null, + + null, + block, + new EthereumListenerAdapter(), + totalGasUsed, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed()); executor.init(); executor.execute(); diff --git a/rskj-core/src/test/java/org/ethereum/core/ImportLightTest.java b/rskj-core/src/test/java/org/ethereum/core/ImportLightTest.java index d433f4db572..ac4bfc1c813 100644 --- a/rskj-core/src/test/java/org/ethereum/core/ImportLightTest.java +++ b/rskj-core/src/test/java/org/ethereum/core/ImportLightTest.java @@ -23,6 +23,7 @@ import co.rsk.core.BlockDifficulty; import co.rsk.core.RskAddress; import co.rsk.core.bc.BlockChainImpl; +import co.rsk.core.bc.BlockExecutor; import co.rsk.core.bc.TransactionPoolImpl; import co.rsk.db.RepositoryImpl; import co.rsk.trie.TrieStoreImpl; @@ -35,7 +36,8 @@ import org.ethereum.db.ReceiptStoreImpl; import org.ethereum.listener.CompositeEthereumListener; import org.ethereum.listener.TestCompositeEthereumListener; -import org.ethereum.manager.AdminInfo; +import org.ethereum.vm.PrecompiledContracts; +import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; import java.math.BigInteger; import java.util.HashMap; @@ -55,7 +57,7 @@ public BlockDifficulty getMinimumDifficulty() { })); IndexedBlockStore blockStore = new IndexedBlockStore(new HashMap<>(), new HashMapDB(), null); - Repository repository = new RepositoryImpl(config, new TrieStoreImpl(new HashMapDB())); + Repository repository = new RepositoryImpl(new TrieStoreImpl(new HashMapDB()), config.detailsInMemoryStorageLimit(), config.databaseDir()); CompositeEthereumListener listener = new TestCompositeEthereumListener(); @@ -65,14 +67,37 @@ public BlockDifficulty getMinimumDifficulty() { TransactionPoolImpl transactionPool = new TransactionPoolImpl(config, repository, null, receiptStore, null, listener, 10, 100); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); BlockChainImpl blockchain = new BlockChainImpl( - config, repository, + repository, blockStore, receiptStore, transactionPool, listener, - new AdminInfo(), - new DummyBlockValidator() + new DummyBlockValidator(), + false, + 1, + new BlockExecutor(repository, (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + blockStore, + receiptStore, + programInvokeFactory, + block1, + listener, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )) ); blockchain.setNoValidation(true); diff --git a/rskj-core/src/test/java/org/ethereum/core/TransactionTest.java b/rskj-core/src/test/java/org/ethereum/core/TransactionTest.java index 0907a791582..7dc951b44cd 100644 --- a/rskj-core/src/test/java/org/ethereum/core/TransactionTest.java +++ b/rskj-core/src/test/java/org/ethereum/core/TransactionTest.java @@ -31,8 +31,10 @@ import org.ethereum.db.BlockStoreDummy; import org.ethereum.jsontestsuite.StateTestSuite; import org.ethereum.jsontestsuite.runners.StateTestRunner; +import org.ethereum.listener.EthereumListenerAdapter; import org.ethereum.util.ByteUtil; import org.ethereum.vm.LogInfo; +import org.ethereum.vm.PrecompiledContracts; import org.ethereum.vm.program.ProgramResult; import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; import org.junit.Assert; @@ -438,10 +440,27 @@ protected ProgramResult executeTransaction(Transaction tx) { Block bestBlock = block; - TransactionExecutor executor = new TransactionExecutor - (config, txConst, 0, bestBlock.getCoinbase(), track, new BlockStoreDummy(), null, - invokeFactory, bestBlock) - .setLocalCall(true); + TransactionExecutor executor = new TransactionExecutor( + txConst, + 0, + bestBlock.getCoinbase(), + track, + new BlockStoreDummy(), + null, + invokeFactory, + bestBlock, + new EthereumListenerAdapter(), + 0, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed()) + .setLocalCall(true); executor.init(); executor.execute(); @@ -695,8 +714,27 @@ private Transaction createTx(Blockchain blockchain, ECKey sender, byte[] receive private TransactionExecutor executeTransaction(Blockchain blockchain, Transaction tx) { Repository track = blockchain.getRepository().startTracking(); - TransactionExecutor executor = new TransactionExecutor(config, tx, 0, RskAddress.nullAddress(), blockchain.getRepository(), - blockchain.getBlockStore(), null, new ProgramInvokeFactoryImpl(), blockchain.getBestBlock()); + TransactionExecutor executor = new TransactionExecutor( + tx, + 0, + RskAddress.nullAddress(), + blockchain.getRepository(), + blockchain.getBlockStore(), + null, + new ProgramInvokeFactoryImpl(), + blockchain.getBestBlock(), + new EthereumListenerAdapter(), + 0, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + ); executor.init(); executor.execute(); diff --git a/rskj-core/src/test/java/org/ethereum/core/genesis/BlockchainLoaderTest.java b/rskj-core/src/test/java/org/ethereum/core/genesis/BlockchainLoaderTest.java index 431ef515816..293496698cb 100644 --- a/rskj-core/src/test/java/org/ethereum/core/genesis/BlockchainLoaderTest.java +++ b/rskj-core/src/test/java/org/ethereum/core/genesis/BlockchainLoaderTest.java @@ -61,9 +61,9 @@ public void testLoadBlockchainEmptyBlockchain() throws IOException { EthereumListener ethereumListener = Mockito.mock(EthereumListener.class); - Repository repository = new RepositoryImpl(systemProperties, new TrieStoreImpl(new HashMapDB().setClearOnClose(false)));; + Repository repository = new RepositoryImpl(new TrieStoreImpl(new HashMapDB().setClearOnClose(false)), systemProperties.detailsInMemoryStorageLimit(), systemProperties.databaseDir());; - BlockChainLoader blockChainLoader = new BlockChainLoader(systemProperties, repository, blockStore, null, null, ethereumListener, null, null); + BlockChainLoader blockChainLoader = new BlockChainLoader(systemProperties, repository, blockStore, null, null, ethereumListener, null); blockChainLoader.loadBlockchain(); diff --git a/rskj-core/src/test/java/org/ethereum/datasource/LevelDbDataSourceTest.java b/rskj-core/src/test/java/org/ethereum/datasource/LevelDbDataSourceTest.java index 7405047e421..ac80b64c1c0 100644 --- a/rskj-core/src/test/java/org/ethereum/datasource/LevelDbDataSourceTest.java +++ b/rskj-core/src/test/java/org/ethereum/datasource/LevelDbDataSourceTest.java @@ -43,7 +43,7 @@ public void setup(){ @Test public void testBatchUpdating() { - LevelDbDataSource dataSource = new LevelDbDataSource(config, "test"); + LevelDbDataSource dataSource = new LevelDbDataSource("test", config.databaseDir()); dataSource.init(); final int batchSize = 100; @@ -58,7 +58,7 @@ public void testBatchUpdating() { @Test public void testPutting() { - LevelDbDataSource dataSource = new LevelDbDataSource(config, "test"); + LevelDbDataSource dataSource = new LevelDbDataSource("test", config.databaseDir()); dataSource.init(); byte[] key = randomBytes(32); diff --git a/rskj-core/src/test/java/org/ethereum/db/BlockStoreDummy.java b/rskj-core/src/test/java/org/ethereum/db/BlockStoreDummy.java index 889651212cc..32aa1c14cbd 100644 --- a/rskj-core/src/test/java/org/ethereum/db/BlockStoreDummy.java +++ b/rskj-core/src/test/java/org/ethereum/db/BlockStoreDummy.java @@ -103,10 +103,6 @@ public Block getBestBlock() { public void flush() { } - @Override - public void load() { - } - @Override public long getMaxNumber() { return 0; diff --git a/rskj-core/src/test/java/org/ethereum/db/DetailsDataStoreTest.java b/rskj-core/src/test/java/org/ethereum/db/DetailsDataStoreTest.java index e0149ee34cf..da133402352 100644 --- a/rskj-core/src/test/java/org/ethereum/db/DetailsDataStoreTest.java +++ b/rskj-core/src/test/java/org/ethereum/db/DetailsDataStoreTest.java @@ -22,6 +22,8 @@ import co.rsk.config.TestSystemProperties; import co.rsk.core.RskAddress; import co.rsk.db.ContractDetailsImpl; +import co.rsk.trie.TrieImpl; +import co.rsk.trie.TrieStoreImpl; import org.ethereum.datasource.HashMapDB; import org.ethereum.vm.DataWord; import org.junit.Test; @@ -38,21 +40,27 @@ public class DetailsDataStoreTest { @Test public void test1(){ DatabaseImpl db = new DatabaseImpl(new HashMapDB()); - DetailsDataStore dds = new DetailsDataStore(config, db); + DetailsDataStore dds = new DetailsDataStore(db); RskAddress c_key = new RskAddress("0000000000000000000000000000000000001a2b"); byte[] code = Hex.decode("60606060"); byte[] key = Hex.decode("11"); byte[] value = Hex.decode("aa"); - ContractDetails contractDetails = new ContractDetailsImpl(config); + ContractDetails contractDetails = new ContractDetailsImpl( + null, + new TrieImpl(new TrieStoreImpl(new HashMapDB()), true), + null, + config.detailsInMemoryStorageLimit(), + config.databaseDir() + ); contractDetails.setAddress(randomAddress().getBytes()); contractDetails.setCode(code); contractDetails.put(new DataWord(key), new DataWord(value)); dds.update(c_key, contractDetails); - ContractDetails contractDetails_ = dds.get(c_key); + ContractDetails contractDetails_ = dds.get(c_key, config.detailsInMemoryStorageLimit(), config.databaseDir()); String encoded1 = Hex.toHexString(contractDetails.getEncoded()); String encoded2 = Hex.toHexString(contractDetails_.getEncoded()); @@ -61,7 +69,7 @@ public void test1(){ dds.flush(); - contractDetails_ = dds.get(c_key); + contractDetails_ = dds.get(c_key, config.detailsInMemoryStorageLimit(), config.databaseDir()); encoded2 = Hex.toHexString(contractDetails_.getEncoded()); assertEquals(encoded1, encoded2); } @@ -70,21 +78,27 @@ public void test1(){ public void test2(){ DatabaseImpl db = new DatabaseImpl(new HashMapDB()); - DetailsDataStore dds = new DetailsDataStore(config, db); + DetailsDataStore dds = new DetailsDataStore(db); RskAddress c_key = new RskAddress("0000000000000000000000000000000000001a2b"); byte[] code = Hex.decode("60606060"); byte[] key = Hex.decode("11"); byte[] value = Hex.decode("aa"); - ContractDetails contractDetails = new ContractDetailsImpl(config); + ContractDetails contractDetails = new ContractDetailsImpl( + null, + new TrieImpl(new TrieStoreImpl(new HashMapDB()), true), + null, + config.detailsInMemoryStorageLimit(), + config.databaseDir() + ); contractDetails.setCode(code); contractDetails.setAddress(randomAddress().getBytes()); contractDetails.put(new DataWord(key), new DataWord(value)); dds.update(c_key, contractDetails); - ContractDetails contractDetails_ = dds.get(c_key); + ContractDetails contractDetails_ = dds.get(c_key, config.detailsInMemoryStorageLimit(), config.databaseDir()); String encoded1 = Hex.toHexString(contractDetails.getEncoded()); String encoded2 = Hex.toHexString(contractDetails_.getEncoded()); @@ -93,12 +107,12 @@ public void test2(){ dds.remove(c_key); - contractDetails_ = dds.get(c_key); + contractDetails_ = dds.get(c_key, config.detailsInMemoryStorageLimit(), config.databaseDir()); assertNull(contractDetails_); dds.flush(); - contractDetails_ = dds.get(c_key); + contractDetails_ = dds.get(c_key, config.detailsInMemoryStorageLimit(), config.databaseDir()); assertNull(contractDetails_); } @@ -106,20 +120,26 @@ public void test2(){ public void test3(){ DatabaseImpl db = new DatabaseImpl(new HashMapDB()); - DetailsDataStore dds = new DetailsDataStore(config, db); + DetailsDataStore dds = new DetailsDataStore(db); RskAddress c_key = new RskAddress("0000000000000000000000000000000000001a2b"); byte[] code = Hex.decode("60606060"); byte[] key = Hex.decode("11"); byte[] value = Hex.decode("aa"); - ContractDetails contractDetails = new ContractDetailsImpl(config); + ContractDetails contractDetails = new ContractDetailsImpl( + null, + new TrieImpl(new TrieStoreImpl(new HashMapDB()), true), + null, + config.detailsInMemoryStorageLimit(), + config.databaseDir() + ); contractDetails.setCode(code); contractDetails.put(new DataWord(key), new DataWord(value)); dds.update(c_key, contractDetails); - ContractDetails contractDetails_ = dds.get(c_key); + ContractDetails contractDetails_ = dds.get(c_key, config.detailsInMemoryStorageLimit(), config.databaseDir()); String encoded1 = Hex.toHexString(contractDetails.getEncoded()); String encoded2 = Hex.toHexString(contractDetails_.getEncoded()); @@ -129,13 +149,13 @@ public void test3(){ dds.remove(c_key); dds.update(c_key, contractDetails); - contractDetails_ = dds.get(c_key); + contractDetails_ = dds.get(c_key, config.detailsInMemoryStorageLimit(), config.databaseDir()); encoded2 = Hex.toHexString(contractDetails_.getEncoded()); assertEquals(encoded1, encoded2); dds.flush(); - contractDetails_ = dds.get(c_key); + contractDetails_ = dds.get(c_key, config.detailsInMemoryStorageLimit(), config.databaseDir()); encoded2 = Hex.toHexString(contractDetails_.getEncoded()); assertEquals(encoded1, encoded2); } @@ -144,11 +164,11 @@ public void test3(){ public void test4() { DatabaseImpl db = new DatabaseImpl(new HashMapDB()); - DetailsDataStore dds = new DetailsDataStore(config, db); + DetailsDataStore dds = new DetailsDataStore(db); RskAddress c_key = new RskAddress("0000000000000000000000000000000000001a2b"); - ContractDetails contractDetails = dds.get(c_key); + ContractDetails contractDetails = dds.get(c_key, config.detailsInMemoryStorageLimit(), config.databaseDir()); assertNull(contractDetails); } } diff --git a/rskj-core/src/test/java/org/ethereum/db/IndexedBlockStoreTest.java b/rskj-core/src/test/java/org/ethereum/db/IndexedBlockStoreTest.java index bc9b23f5e6b..cc731346972 100644 --- a/rskj-core/src/test/java/org/ethereum/db/IndexedBlockStoreTest.java +++ b/rskj-core/src/test/java/org/ethereum/db/IndexedBlockStoreTest.java @@ -424,7 +424,7 @@ public void test4() throws IOException { DB indexDB = createMapDB(testDir); Map> indexMap = createIndexMap(indexDB); - KeyValueDataSource blocksDB = new LevelDbDataSource(config, "blocks"); + KeyValueDataSource blocksDB = new LevelDbDataSource("blocks", config.databaseDir()); blocksDB.init(); IndexedBlockStore indexedBlockStore = new IndexedBlockStore(indexMap, blocksDB, indexDB); @@ -539,7 +539,7 @@ public void test4() throws IOException { indexDB = createMapDB(testDir); indexMap = createIndexMap(indexDB); - blocksDB = new LevelDbDataSource(config, "blocks"); + blocksDB = new LevelDbDataSource("blocks", config.databaseDir()); blocksDB.init(); indexedBlockStore = new IndexedBlockStore(indexMap, blocksDB, indexDB); @@ -570,7 +570,7 @@ public void test5() throws IOException { DB indexDB = createMapDB(testDir); Map> indexMap = createIndexMap(indexDB); - KeyValueDataSource blocksDB = new LevelDbDataSource(config, "blocks"); + KeyValueDataSource blocksDB = new LevelDbDataSource("blocks", config.databaseDir()); blocksDB.init(); try { @@ -698,7 +698,7 @@ public void test5() throws IOException { indexDB = createMapDB(testDir); indexMap = createIndexMap(indexDB); - blocksDB = new LevelDbDataSource(config, "blocks"); + blocksDB = new LevelDbDataSource("blocks", config.databaseDir()); blocksDB.init(); indexedBlockStore = new IndexedBlockStore(indexMap, blocksDB, indexDB); @@ -731,7 +731,7 @@ public void test6() throws IOException { DB indexDB = createMapDB(testDir); Map> indexMap = createIndexMap(indexDB); - KeyValueDataSource blocksDB = new LevelDbDataSource(config, "blocks"); + KeyValueDataSource blocksDB = new LevelDbDataSource("blocks", config.databaseDir()); blocksDB.init(); try { @@ -835,7 +835,7 @@ public void test7() throws IOException { DB indexDB = createMapDB(testDir); Map> indexMap = createIndexMap(indexDB); - KeyValueDataSource blocksDB = new LevelDbDataSource(config, "blocks"); + KeyValueDataSource blocksDB = new LevelDbDataSource("blocks", config.databaseDir()); blocksDB.init(); try { @@ -889,7 +889,7 @@ public void test8() throws IOException { DB indexDB = createMapDB(testDir); Map> indexMap = createIndexMap(indexDB); - KeyValueDataSource blocksDB = new LevelDbDataSource(config, "blocks"); + KeyValueDataSource blocksDB = new LevelDbDataSource("blocks", config.databaseDir()); blocksDB.init(); try { diff --git a/rskj-core/src/test/java/org/ethereum/jsontestsuite/TestRunner.java b/rskj-core/src/test/java/org/ethereum/jsontestsuite/TestRunner.java index 9d04453b95c..8b4d972a1e5 100644 --- a/rskj-core/src/test/java/org/ethereum/jsontestsuite/TestRunner.java +++ b/rskj-core/src/test/java/org/ethereum/jsontestsuite/TestRunner.java @@ -19,11 +19,13 @@ package org.ethereum.jsontestsuite; +import co.rsk.config.RskSystemProperties; import co.rsk.config.TestSystemProperties; import co.rsk.config.VmConfig; import co.rsk.core.Coin; import co.rsk.core.RskAddress; import co.rsk.core.bc.BlockChainImpl; +import co.rsk.core.bc.BlockExecutor; import co.rsk.core.bc.TransactionPoolImpl; import co.rsk.db.RepositoryImpl; import co.rsk.validators.DummyBlockValidator; @@ -31,6 +33,7 @@ import org.ethereum.core.Block; import org.ethereum.core.ImportResult; import org.ethereum.core.Repository; +import org.ethereum.core.TransactionExecutor; import org.ethereum.datasource.HashMapDB; import org.ethereum.datasource.KeyValueDataSource; import org.ethereum.db.*; @@ -48,6 +51,7 @@ import org.ethereum.vm.VM; import org.ethereum.vm.program.Program; import org.ethereum.vm.program.invoke.ProgramInvoke; +import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; import org.ethereum.vm.program.invoke.ProgramInvokeImpl; import org.ethereum.vm.trace.ProgramTrace; import org.slf4j.Logger; @@ -114,7 +118,28 @@ public List runTestCase(BlockTestCase testCase) { TransactionPoolImpl transactionPool = new TransactionPoolImpl(config, repository, null, receiptStore, null, listener, 10, 100); - BlockChainImpl blockchain = new BlockChainImpl(config, repository, blockStore, receiptStore, transactionPool, null, null, new DummyBlockValidator()); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + BlockChainImpl blockchain = new BlockChainImpl(repository, blockStore, receiptStore, transactionPool, null, new DummyBlockValidator(), false, 1, new BlockExecutor(repository, (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + blockStore, + receiptStore, + programInvokeFactory, + block1, + null, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + ))); blockchain.setNoValidation(true); @@ -193,7 +218,7 @@ public List runTestCase(TestCase testCase) { logger.info("--------- PRE ---------"); - Repository repository = loadRepository(new RepositoryImpl(config).startTracking(), testCase.getPre()); + Repository repository = loadRepository(createRepositoryImpl(config).startTracking(), testCase.getPre()); try { @@ -256,7 +281,7 @@ public List runTestCase(TestCase testCase) { } try { - saveProgramTraceFile(config, testCase.getName(), program.getTrace()); + saveProgramTraceFile(testCase.getName(), program.getTrace(), config.databaseDir(), config.vmTraceDir(), config.vmTraceCompressed()); } catch (IOException ioe) { vmDidThrowAnEception = true; e = ioe; @@ -607,4 +632,8 @@ public Repository loadRepository(Repository track, Map public ProgramTrace getTrace() { return trace; } + + public static RepositoryImpl createRepositoryImpl(RskSystemProperties config) { + return new RepositoryImpl(null, config.detailsInMemoryStorageLimit(), config.databaseDir()); + } } diff --git a/rskj-core/src/test/java/org/ethereum/jsontestsuite/builder/AccountBuilder.java b/rskj-core/src/test/java/org/ethereum/jsontestsuite/builder/AccountBuilder.java index d3df91d0015..fd2ce95dbf8 100644 --- a/rskj-core/src/test/java/org/ethereum/jsontestsuite/builder/AccountBuilder.java +++ b/rskj-core/src/test/java/org/ethereum/jsontestsuite/builder/AccountBuilder.java @@ -22,8 +22,11 @@ import co.rsk.config.TestSystemProperties; import co.rsk.core.Coin; import co.rsk.db.ContractDetailsImpl; +import co.rsk.trie.TrieImpl; +import co.rsk.trie.TrieStoreImpl; import org.ethereum.core.AccountState; import org.ethereum.crypto.HashUtil; +import org.ethereum.datasource.HashMapDB; import org.ethereum.jsontestsuite.model.AccountTck; import org.ethereum.vm.DataWord; @@ -38,7 +41,8 @@ public class AccountBuilder { public static StateWrap build(AccountTck account) { - ContractDetailsImpl details = new ContractDetailsImpl(new TestSystemProperties()); + TestSystemProperties config = new TestSystemProperties(); + ContractDetailsImpl details = new ContractDetailsImpl(null, new TrieImpl(new TrieStoreImpl(new HashMapDB()), true), null, config.detailsInMemoryStorageLimit(), config.databaseDir()); details.setCode(parseData(account.getCode())); details.setStorage(convertStorage(account.getStorage())); diff --git a/rskj-core/src/test/java/org/ethereum/jsontestsuite/builder/RepositoryBuilder.java b/rskj-core/src/test/java/org/ethereum/jsontestsuite/builder/RepositoryBuilder.java index 6a7868b96de..fbf71c5389a 100644 --- a/rskj-core/src/test/java/org/ethereum/jsontestsuite/builder/RepositoryBuilder.java +++ b/rskj-core/src/test/java/org/ethereum/jsontestsuite/builder/RepositoryBuilder.java @@ -56,7 +56,8 @@ public static Repository build(Map accounts){ detailsBatch.put(addr, detailsCache); } - RepositoryImpl repositoryDummy = new RepositoryImpl(new TestSystemProperties(), new TrieStoreImpl(new HashMapDB())); + final TestSystemProperties testSystemProperties = new TestSystemProperties(); + RepositoryImpl repositoryDummy = new RepositoryImpl(new TrieStoreImpl(new HashMapDB()), testSystemProperties.detailsInMemoryStorageLimit(), testSystemProperties.databaseDir()); Repository track = repositoryDummy.startTracking(); track.updateBatch(stateBatch, detailsBatch); track.commit(); diff --git a/rskj-core/src/test/java/org/ethereum/jsontestsuite/runners/StateTestRunner.java b/rskj-core/src/test/java/org/ethereum/jsontestsuite/runners/StateTestRunner.java index 312dcf2afda..e1a7a24f14a 100644 --- a/rskj-core/src/test/java/org/ethereum/jsontestsuite/runners/StateTestRunner.java +++ b/rskj-core/src/test/java/org/ethereum/jsontestsuite/runners/StateTestRunner.java @@ -22,6 +22,7 @@ import co.rsk.config.TestSystemProperties; import co.rsk.core.RskAddress; import co.rsk.core.bc.BlockChainImpl; +import co.rsk.core.bc.BlockExecutor; import org.ethereum.core.Block; import org.ethereum.core.Repository; import org.ethereum.core.Transaction; @@ -37,9 +38,12 @@ import org.ethereum.jsontestsuite.validators.LogsValidator; import org.ethereum.jsontestsuite.validators.OutputValidator; import org.ethereum.jsontestsuite.validators.RepositoryValidator; +import org.ethereum.listener.EthereumListenerAdapter; import org.ethereum.vm.LogInfo; +import org.ethereum.vm.PrecompiledContracts; import org.ethereum.vm.program.ProgramResult; import org.ethereum.vm.program.invoke.ProgramInvokeFactory; +import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.bouncycastle.util.encoders.Hex; @@ -72,10 +76,27 @@ public StateTestRunner(StateTestCase stateTestCase) { protected ProgramResult executeTransaction(Transaction tx) { Repository track = repository.startTracking(); - TransactionExecutor executor = - new TransactionExecutor(config, transaction, 0, new RskAddress(env.getCurrentCoinbase()), track, new BlockStoreDummy(), null, - invokeFactory, blockchain.getBestBlock()); - + TransactionExecutor executor = new TransactionExecutor( + transaction, + 0, + new RskAddress(env.getCurrentCoinbase()), + track, + new BlockStoreDummy(), + null, + invokeFactory, + blockchain.getBestBlock(), + new EthereumListenerAdapter(), + 0, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + ); try{ executor.init(); executor.execute(); @@ -100,7 +121,28 @@ public List runImpl() { logger.info("transaction: {}", transaction.toString()); BlockStore blockStore = new IndexedBlockStore(new HashMap<>(), new HashMapDB(), null); - blockchain = new BlockChainImpl(config, repository, blockStore, null, null, null, null, null); + final ProgramInvokeFactoryImpl programInvokeFactory = new ProgramInvokeFactoryImpl(); + blockchain = new BlockChainImpl(repository, blockStore, null, null, null, null, false, 1, new BlockExecutor(repository, (tx1, txindex1, coinbase, track1, block1, totalGasUsed1) -> new TransactionExecutor( + tx1, + txindex1, + block1.getCoinbase(), + track1, + blockStore, + null, + programInvokeFactory, + block1, + null, + totalGasUsed1, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + ))); env = EnvBuilder.build(stateTestCase.getEnv()); invokeFactory = new TestProgramInvokeFactory(env); diff --git a/rskj-core/src/test/java/org/ethereum/util/ContractRunner.java b/rskj-core/src/test/java/org/ethereum/util/ContractRunner.java index ad14e115322..9ef93283b27 100644 --- a/rskj-core/src/test/java/org/ethereum/util/ContractRunner.java +++ b/rskj-core/src/test/java/org/ethereum/util/ContractRunner.java @@ -1,6 +1,7 @@ package org.ethereum.util; import co.rsk.blockchain.utils.BlockGenerator; +import co.rsk.config.RskSystemProperties; import co.rsk.config.TestSystemProperties; import co.rsk.core.Coin; import co.rsk.core.RskAddress; @@ -12,7 +13,9 @@ import org.ethereum.db.BlockStore; import org.ethereum.db.ContractDetails; import org.ethereum.db.ReceiptStore; +import org.ethereum.listener.EthereumListenerAdapter; import org.ethereum.rpc.TypeConverter; +import org.ethereum.vm.PrecompiledContracts; import org.ethereum.vm.program.ProgramResult; import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; @@ -107,9 +110,27 @@ private ProgramResult runContract(byte[] contractAddress, byte[] encodedCall, Bi private TransactionExecutor executeTransaction(Transaction transaction) { Repository track = repository.startTracking(); - TransactionExecutor executor = new TransactionExecutor(new TestSystemProperties(), transaction, 0, RskAddress.nullAddress(), - repository, blockStore, receiptStore, - new ProgramInvokeFactoryImpl(), blockchain.getBestBlock()); + RskSystemProperties config = new TestSystemProperties(); + TransactionExecutor executor = new TransactionExecutor( + transaction, + 0, + RskAddress.nullAddress(), + repository, + blockStore, + receiptStore, + new ProgramInvokeFactoryImpl(), + blockchain.getBestBlock(), + new EthereumListenerAdapter(), + 0, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed()); executor.init(); executor.execute(); executor.go(); diff --git a/rskj-core/src/test/java/org/ethereum/util/RskTestFactory.java b/rskj-core/src/test/java/org/ethereum/util/RskTestFactory.java index c7d6e1f8d92..95b6eea50a6 100644 --- a/rskj-core/src/test/java/org/ethereum/util/RskTestFactory.java +++ b/rskj-core/src/test/java/org/ethereum/util/RskTestFactory.java @@ -7,6 +7,7 @@ import co.rsk.core.RskAddress; import co.rsk.core.RskImpl; import co.rsk.core.bc.BlockChainImpl; +import co.rsk.core.bc.BlockExecutor; import co.rsk.core.bc.TransactionPoolImpl; import co.rsk.db.RepositoryImpl; import co.rsk.net.BlockNodeInformation; @@ -21,8 +22,10 @@ import org.ethereum.datasource.HashMapDB; import org.ethereum.db.*; import org.ethereum.listener.CompositeEthereumListener; +import org.ethereum.listener.EthereumListenerAdapter; import org.ethereum.listener.TestCompositeEthereumListener; import org.ethereum.rpc.TypeConverter; +import org.ethereum.vm.PrecompiledContracts; import org.ethereum.vm.program.ProgramResult; import org.ethereum.vm.program.invoke.ProgramInvokeFactoryImpl; @@ -102,9 +105,27 @@ public ProgramResult executeRawContract(byte[] bytecode, byte[] encodedCall, Big private TransactionExecutor executeTransaction(Transaction transaction) { Repository track = getRepository().startTracking(); - TransactionExecutor executor = new TransactionExecutor(config, transaction, 0, RskAddress.nullAddress(), - getRepository(), getBlockStore(), getReceiptStore(), - getProgramInvokeFactory(), getBlockchain().getBestBlock()); + TransactionExecutor executor = new TransactionExecutor( + transaction, + 0, + RskAddress.nullAddress(), + getRepository(), + getBlockStore(), + getReceiptStore(), + getProgramInvokeFactory(), + getBlockchain().getBestBlock(), + new EthereumListenerAdapter(), + 0, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + ); executor.init(); executor.execute(); executor.go(); @@ -123,14 +144,37 @@ private ProgramInvokeFactoryImpl getProgramInvokeFactory() { public BlockChainImpl getBlockchain() { if (blockchain == null) { + final ProgramInvokeFactoryImpl programInvokeFactory1 = new ProgramInvokeFactoryImpl(); blockchain = new BlockChainImpl( - config, getRepository(), + getRepository(), getBlockStore(), getReceiptStore(), getTransactionPool(), getCompositeEthereumListener(), - null, - new DummyBlockValidator() + new DummyBlockValidator(), + false, + 1, + new BlockExecutor(getRepository(), (tx, txindex, coinbase, repository, block, totalGasUsed) -> new TransactionExecutor( + tx, + txindex, + block.getCoinbase(), + repository, + getBlockStore(), + getReceiptStore(), + programInvokeFactory1, + block, + getCompositeEthereumListener(), + totalGasUsed, + config.getVmConfig(), + config.getBlockchainConfig(), + config.playVM(), + config.isRemascEnabled(), + config.vmTrace(), + new PrecompiledContracts(config), + config.databaseDir(), + config.vmTraceDir(), + config.vmTraceCompressed() + )) ); } @@ -184,7 +228,7 @@ public TransactionPool getTransactionPool() { public Repository getRepository() { if (repository == null) { HashMapDB stateStore = new HashMapDB(); - repository = new RepositoryImpl(config, new TrieStoreImpl(stateStore)); + repository = new RepositoryImpl(new TrieStoreImpl(stateStore), config.detailsInMemoryStorageLimit(), config.databaseDir()); } return repository;