diff --git a/rskj-core/src/main/java/org/ethereum/db/MutableRepository.java b/rskj-core/src/main/java/org/ethereum/db/MutableRepository.java index 15a6d4e7a4..57279db7df 100644 --- a/rskj-core/src/main/java/org/ethereum/db/MutableRepository.java +++ b/rskj-core/src/main/java/org/ethereum/db/MutableRepository.java @@ -25,22 +25,28 @@ import co.rsk.crypto.Keccak256; import co.rsk.db.MutableTrieCache; import co.rsk.db.MutableTrieImpl; -import co.rsk.trie.*; +import co.rsk.trie.IterationElement; +import co.rsk.trie.MutableTrie; +import co.rsk.trie.Trie; +import co.rsk.trie.TrieKeySlice; +import co.rsk.trie.TrieStore; import com.google.common.annotations.VisibleForTesting; import org.ethereum.core.AccountState; import org.ethereum.core.Repository; import org.ethereum.crypto.HashUtil; import org.ethereum.crypto.Keccak256Helper; -import org.ethereum.datasource.HashMapDB; import org.ethereum.vm.DataWord; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.Nonnull; import java.math.BigInteger; -import java.util.*; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Optional; +import java.util.Set; -public class MutableRepository implements Repository, TransientStorageRepository { +public class MutableRepository implements Repository { private static final Logger logger = LoggerFactory.getLogger("repository"); private static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; public static final Keccak256 KECCAK_256_OF_EMPTY_ARRAY = new Keccak256(Keccak256Helper.keccak256(EMPTY_BYTE_ARRAY)); @@ -49,7 +55,6 @@ public class MutableRepository implements Repository, TransientStorageRepository private final TrieKeyMapper trieKeyMapper; private final MutableTrie mutableTrie; private final IReadWrittenKeysTracker tracker; - private Repository transientRepository; public MutableRepository(TrieStore trieStore, Trie trie) { this(new MutableTrieImpl(trieStore, trie)); @@ -408,22 +413,4 @@ private Optional internalGetValueHash(byte[] key) { tracker.addNewReadKey(new ByteArrayWrapper(key)); return mutableTrie.getValueHash(key); } - - @Override - public Repository getTransientRepository() { - if(transientRepository == null) { - transientRepository = getMutableRepository(); - } - - return transientRepository; - } - - @Override - public synchronized void clearTransientRepository() { - transientRepository = getMutableRepository(); - } - - private static MutableRepository getMutableRepository() { - return new MutableRepository(new MutableTrieImpl(new TrieStoreImpl(new HashMapDB()), new Trie())); - } } diff --git a/rskj-core/src/main/java/org/ethereum/db/TransientStorageRepository.java b/rskj-core/src/main/java/org/ethereum/db/TransientStorageRepositoryCreator.java similarity index 67% rename from rskj-core/src/main/java/org/ethereum/db/TransientStorageRepository.java rename to rskj-core/src/main/java/org/ethereum/db/TransientStorageRepositoryCreator.java index 7c480ce9ac..c03541fbe6 100644 --- a/rskj-core/src/main/java/org/ethereum/db/TransientStorageRepository.java +++ b/rskj-core/src/main/java/org/ethereum/db/TransientStorageRepositoryCreator.java @@ -19,16 +19,18 @@ package org.ethereum.db; +import co.rsk.db.MutableTrieImpl; +import co.rsk.trie.Trie; +import co.rsk.trie.TrieStoreImpl; import org.ethereum.core.Repository; +import org.ethereum.datasource.HashMapDB; -public interface TransientStorageRepository { - /** - * Returns the transientRepository initializing a new one if the current one is null - */ - Repository getTransientRepository(); +public class TransientStorageRepositoryCreator { - /** - * Delete all the data for this repository - */ - void clearTransientRepository(); + private TransientStorageRepositoryCreator() { + } + + public static Repository createNewTransientStorage() { + return new MutableRepository(new MutableTrieImpl(new TrieStoreImpl(new HashMapDB()), new Trie())); + } } diff --git a/rskj-core/src/main/java/org/ethereum/vm/program/Program.java b/rskj-core/src/main/java/org/ethereum/vm/program/Program.java index 541b5bcd16..73043c7a64 100644 --- a/rskj-core/src/main/java/org/ethereum/vm/program/Program.java +++ b/rskj-core/src/main/java/org/ethereum/vm/program/Program.java @@ -29,8 +29,6 @@ import co.rsk.rpc.modules.trace.CallType; import co.rsk.rpc.modules.trace.CreationData; import co.rsk.rpc.modules.trace.ProgramSubtrace; -import co.rsk.trie.Trie; -import co.rsk.trie.TrieStoreImpl; import co.rsk.vm.BitSet; import com.google.common.annotations.VisibleForTesting; import org.ethereum.config.Constants; @@ -42,8 +40,7 @@ import org.ethereum.core.SignatureCache; import org.ethereum.core.Transaction; import org.ethereum.crypto.HashUtil; -import org.ethereum.datasource.HashMapDB; -import org.ethereum.db.MutableRepository; +import org.ethereum.db.TransientStorageRepositoryCreator; import org.ethereum.util.ByteUtil; import org.ethereum.util.FastByteComparisons; import org.ethereum.vm.DataWord; @@ -120,7 +117,7 @@ public class Program { private final Stack stack; private final Memory memory; private final Storage storage; - private final Map transientStorages; + private final Map transientStorages; private byte[] returnDataBuffer; private final ProgramResult result = new ProgramResult(); @@ -460,10 +457,10 @@ public Repository getStorage() { return this.storage; } - public MutableRepository getTransientStorage(RskAddress addr) { - MutableRepository current = transientStorages.get(addr); + public Repository getTransientStorage(RskAddress addr) { + Repository current = transientStorages.get(addr); if(current == null) { - current = new MutableRepository(new TrieStoreImpl(new HashMapDB()), new Trie()); + current = TransientStorageRepositoryCreator.createNewTransientStorage(); transientStorages.put(addr, current); } return current; @@ -1004,7 +1001,7 @@ private void storageSave(byte[] key, byte[] val) { public void transientStorageSave(DataWord key, DataWord value) { RskAddress addr = getOwnerRskAddress(); - MutableRepository storage = getTransientStorage(addr); + Repository storage = getTransientStorage(addr); storage.addStorageRow(addr, key, value); } @@ -1120,7 +1117,7 @@ public DataWord storageLoad(DataWord key) { public DataWord transientStorageLoad(DataWord key) { RskAddress addr = getOwnerRskAddress(); - MutableRepository currentTransientStorage = getTransientStorage(addr); + Repository currentTransientStorage = getTransientStorage(addr); return currentTransientStorage.getStorageValue(addr, key); }