diff --git a/src/main/java/org/tron/application/Module.java b/src/main/java/org/tron/application/Module.java index ac37c7cd0f9..0359b1a8d6d 100644 --- a/src/main/java/org/tron/application/Module.java +++ b/src/main/java/org/tron/application/Module.java @@ -5,6 +5,7 @@ import com.google.inject.Singleton; import org.tron.consensus.client.Client; import org.tron.consensus.server.Server; +import org.tron.core.Blockchain; import org.tron.core.Constant; import org.tron.storage.leveldb.LevelDbDataSourceImpl; @@ -49,4 +50,11 @@ public LevelDbDataSourceImpl buildBlockDb() { db.initDB(); return db; } + + @Provides + @Singleton + public Blockchain buildBlockchain(@Named("block") LevelDbDataSourceImpl blockDB) { + return new Blockchain(blockDB); + } + } diff --git a/src/main/java/org/tron/core/Blockchain.java b/src/main/java/org/tron/core/Blockchain.java index 335339a62a5..e73e9e90de6 100644 --- a/src/main/java/org/tron/core/Blockchain.java +++ b/src/main/java/org/tron/core/Blockchain.java @@ -32,6 +32,8 @@ import org.tron.storage.leveldb.LevelDbDataSourceImpl; import org.tron.utils.ByteArray; +import javax.inject.Inject; +import javax.inject.Named; import java.io.IOException; import java.io.InputStream; import java.util.*; @@ -56,10 +58,8 @@ public class Blockchain { * create new blockchain * * @param blockDB block database - * @param address wallet address - * @param type peer type */ - public Blockchain(LevelDbDataSourceImpl blockDB, String address, String type) { + public Blockchain(@Named("block") LevelDbDataSourceImpl blockDB) { this.blockDB = blockDB; this.lastHash = blockDB.getData(LAST_HASH); diff --git a/src/main/java/org/tron/core/UTXOSet.java b/src/main/java/org/tron/core/UTXOSet.java index 69ad56126b4..4a5af7496a6 100644 --- a/src/main/java/org/tron/core/UTXOSet.java +++ b/src/main/java/org/tron/core/UTXOSet.java @@ -18,37 +18,32 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.tron.crypto.ECKey; -import org.tron.storage.leveldb.LevelDbDataSourceImpl; import org.tron.protos.core.TronTXOutput; import org.tron.protos.core.TronTXOutputs; import org.tron.protos.core.TronTXOutputs.TXOutputs; +import org.tron.storage.leveldb.LevelDbDataSourceImpl; import org.tron.utils.ByteArray; import javax.inject.Inject; import javax.inject.Named; import java.util.*; -import static org.tron.core.Constant.TRANSACTION_DB_NAME; - public class UTXOSet { private static final Logger logger = LoggerFactory.getLogger("UTXOSet"); private Blockchain blockchain; - private LevelDbDataSourceImpl txDB = null; + private LevelDbDataSourceImpl txDB; @Inject - public UTXOSet(@Named("transaction") LevelDbDataSourceImpl txDb) { - txDB = txDb; + public UTXOSet(@Named("transaction") LevelDbDataSourceImpl txDb, Blockchain blockchain) { + this.txDB = txDb; + this.blockchain = blockchain; } public Blockchain getBlockchain() { return blockchain; } - public void setBlockchain(Blockchain blockchain) { - this.blockchain = blockchain; - } - public void reindex() { logger.info("reindex"); @@ -62,7 +57,7 @@ public void reindex() { String key = entry.getKey(); TXOutputs value = entry.getValue(); - for (TronTXOutput.TXOutput txOutput : value.getOutputsList()) { + for (TronTXOutput.TXOutput ignored : value.getOutputsList()) { txDB.putData(ByteArray.fromHexString(key), value.toByteArray()); } } diff --git a/src/main/java/org/tron/peer/PeerBuilder.java b/src/main/java/org/tron/peer/PeerBuilder.java index 61cbbaa062e..697c75efbbe 100644 --- a/src/main/java/org/tron/peer/PeerBuilder.java +++ b/src/main/java/org/tron/peer/PeerBuilder.java @@ -1,15 +1,10 @@ package org.tron.peer; -import com.google.inject.Injector; -import com.google.inject.Key; -import com.google.inject.name.Names; import org.tron.consensus.client.BlockchainClientListener; import org.tron.consensus.client.Client; import org.tron.core.Blockchain; import org.tron.core.UTXOSet; import org.tron.crypto.ECKey; -import org.tron.storage.leveldb.LevelDbDataSourceImpl; -import org.tron.utils.ByteArray; import org.tron.wallet.Wallet; import javax.inject.Inject; @@ -26,30 +21,13 @@ public class PeerBuilder { private Wallet wallet; private ECKey key; private String type; - private Injector injector; + private Client client; @Inject - public PeerBuilder(Injector injector) { - this.injector = injector; - } - - private void buildBlockchain() { - if (wallet == null) throw new IllegalStateException("Wallet must be set before building the blockchain"); - if (type == null) throw new IllegalStateException("Type must be set before building the blockchain"); - - blockchain = new Blockchain( - injector.getInstance(Key.get(LevelDbDataSourceImpl.class, Names.named("block"))), - ByteArray.toHexString(wallet.getAddress()), - this.type - ); - } - - private void buildUTXOSet() { - if (blockchain == null) throw new IllegalStateException("Blockchain must be set before building the UTXOSet"); - - utxoSet = injector.getInstance(UTXOSet.class); - utxoSet.setBlockchain(blockchain); - utxoSet.reindex(); + public PeerBuilder(Blockchain blockchain, UTXOSet utxoSet, Client client) { + this.blockchain = blockchain; + this.utxoSet = utxoSet; + this.client = client; } private void buildWallet() { @@ -70,11 +48,11 @@ public PeerBuilder setKey(ECKey key) { public Peer build() { buildWallet(); - buildBlockchain(); - buildUTXOSet(); + utxoSet.reindex(); + Peer peer = new Peer(type, blockchain, utxoSet, wallet, key); - peer.setClient(injector.getInstance(Client.class)); - blockchain.addListener(new BlockchainClientListener(injector.getInstance(Client.class), peer)); + peer.setClient(client); + blockchain.addListener(new BlockchainClientListener(client, peer)); return peer; } } diff --git a/src/test/java/org/tron/core/BlockchainTest.java b/src/test/java/org/tron/core/BlockchainTest.java index 1aa628e50c1..73f291e0748 100644 --- a/src/test/java/org/tron/core/BlockchainTest.java +++ b/src/test/java/org/tron/core/BlockchainTest.java @@ -49,9 +49,7 @@ public void setup() throws IOException { Mockito.when(mockBlockDB.getData(eq(LAST_HASH))).thenReturn(null); Mockito.when(mockBlockDB.getData(any())).thenReturn(ByteArray.fromString("")); blockchain = new Blockchain( - mockBlockDB, - "0304f784e4e7bae517bcab94c3e0c9214fb4ac7ff9d7d5a937d1f40031f87b85", - "normal" + mockBlockDB ); } diff --git a/src/test/java/org/tron/core/UTXOSetTest.java b/src/test/java/org/tron/core/UTXOSetTest.java new file mode 100644 index 00000000000..28a50c5a662 --- /dev/null +++ b/src/test/java/org/tron/core/UTXOSetTest.java @@ -0,0 +1,41 @@ +package org.tron.core; + +import org.junit.Test; +import org.mockito.Mockito; +import org.tron.protos.core.TronTXOutput; +import org.tron.protos.core.TronTXOutputs; +import org.tron.storage.leveldb.LevelDbDataSourceImpl; +import org.tron.utils.ByteArray; + +import java.util.HashMap; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.when; + +public class UTXOSetTest { + @Test + public void testReindex() { + String key = "15f3988aa8d56eab3bfca45144bad77fc60acce50437a0a9d794a03a83c15c5e"; + TronTXOutput.TXOutput testOutput = TronTXOutput.TXOutput.newBuilder().build(); + TronTXOutputs.TXOutputs testOutputs = TronTXOutputs.TXOutputs.newBuilder() + .addOutputs(testOutput) + .build(); + + HashMap testUTXO = new HashMap<>(); + testUTXO.put(key, testOutputs); + + Blockchain mockBlockchain = Mockito.mock(Blockchain.class); + when(mockBlockchain.findUTXO()).thenReturn(testUTXO); + + LevelDbDataSourceImpl mockTransactionDb = Mockito.mock(LevelDbDataSourceImpl.class); + + UTXOSet utxoSet = new UTXOSet(mockTransactionDb, mockBlockchain); + + utxoSet.reindex(); + Mockito.verify(mockTransactionDb, times(1)).resetDB(); + Mockito.verify(mockTransactionDb, times(1)) + .putData(eq(ByteArray.fromHexString(key)), eq(testOutputs.toByteArray())); + } +}