From 2c52d18e8aa1af7ba82c8c47a7ded1f69185130f Mon Sep 17 00:00:00 2001 From: Sean Robbins Date: Fri, 12 Jan 2018 19:02:40 +0000 Subject: [PATCH 1/6] Add basic unit test suite for UTXOSet --- src/test/java/org/tron/core/UTXOSetTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/test/java/org/tron/core/UTXOSetTest.java 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..36f0ae52bed --- /dev/null +++ b/src/test/java/org/tron/core/UTXOSetTest.java @@ -0,0 +1,17 @@ +package org.tron.core; + +import org.junit.Test; +import org.mockito.Mockito; +import org.tron.storage.leveldb.LevelDbDataSourceImpl; + +public class UTXOSetTest { + @Test + public void testReindex() { + Blockchain mockBlockchain = Mockito.mock(Blockchain.class); + LevelDbDataSourceImpl mockTransactionDb = Mockito.mock(LevelDbDataSourceImpl.class); + UTXOSet utxoSet = new UTXOSet(mockTransactionDb); + utxoSet.setBlockchain(mockBlockchain); + + utxoSet.reindex(); + } +} From 22e58cbe91df583ca00fff3fa2238ca0327c58f6 Mon Sep 17 00:00:00 2001 From: Sean Robbins Date: Sat, 13 Jan 2018 14:06:13 +0000 Subject: [PATCH 2/6] Rename txOutput to ignore as not used by the for loop --- src/main/java/org/tron/core/UTXOSet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/tron/core/UTXOSet.java b/src/main/java/org/tron/core/UTXOSet.java index 69ad56126b4..f37b9e620c2 100644 --- a/src/main/java/org/tron/core/UTXOSet.java +++ b/src/main/java/org/tron/core/UTXOSet.java @@ -62,7 +62,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()); } } From 38d619235da981126f5ffe3415bf51de65401063 Mon Sep 17 00:00:00 2001 From: Sean Robbins Date: Sat, 13 Jan 2018 15:12:30 +0000 Subject: [PATCH 3/6] Basic unit test for UTXOSet.reindex --- src/test/java/org/tron/core/UTXOSetTest.java | 26 ++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/test/java/org/tron/core/UTXOSetTest.java b/src/test/java/org/tron/core/UTXOSetTest.java index 36f0ae52bed..2a1b8b888f8 100644 --- a/src/test/java/org/tron/core/UTXOSetTest.java +++ b/src/test/java/org/tron/core/UTXOSetTest.java @@ -2,16 +2,42 @@ 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 java.util.UUID; + +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); utxoSet.setBlockchain(mockBlockchain); utxoSet.reindex(); + Mockito.verify(mockTransactionDb, times(1)).resetDB(); + Mockito.verify(mockTransactionDb, times(1)) + .putData(eq(ByteArray.fromHexString(key)), eq(testOutputs.toByteArray())); } } From 1b66d41cf336532562c866ccf798159d6ca3c245 Mon Sep 17 00:00:00 2001 From: Sean Robbins Date: Sat, 13 Jan 2018 16:56:50 +0000 Subject: [PATCH 4/6] Optimize imports --- src/main/java/org/tron/core/UTXOSet.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/org/tron/core/UTXOSet.java b/src/main/java/org/tron/core/UTXOSet.java index f37b9e620c2..572b1a898ae 100644 --- a/src/main/java/org/tron/core/UTXOSet.java +++ b/src/main/java/org/tron/core/UTXOSet.java @@ -18,18 +18,16 @@ 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"); From 75230c9e64ed5b5c4e8fc4b1533a53991f52fe72 Mon Sep 17 00:00:00 2001 From: Sean Robbins Date: Sat, 13 Jan 2018 16:57:46 +0000 Subject: [PATCH 5/6] Remove unecessary null declration --- src/main/java/org/tron/core/UTXOSet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/tron/core/UTXOSet.java b/src/main/java/org/tron/core/UTXOSet.java index 572b1a898ae..057a8d732c4 100644 --- a/src/main/java/org/tron/core/UTXOSet.java +++ b/src/main/java/org/tron/core/UTXOSet.java @@ -32,7 +32,7 @@ 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) { From 25385dd554e618713e887f43f8cff34323959e30 Mon Sep 17 00:00:00 2001 From: Sean Robbins Date: Sat, 13 Jan 2018 21:27:52 +0000 Subject: [PATCH 6/6] Refactor so Blockchain Singleton by Guice and provided as a constructor dependency to PeerBuilder and UTXOSet --- .../java/org/tron/application/Module.java | 8 ++++ src/main/java/org/tron/core/Blockchain.java | 6 +-- src/main/java/org/tron/core/UTXOSet.java | 9 ++--- src/main/java/org/tron/peer/PeerBuilder.java | 40 +++++-------------- .../java/org/tron/core/BlockchainTest.java | 4 +- src/test/java/org/tron/core/UTXOSetTest.java | 4 +- 6 files changed, 25 insertions(+), 46 deletions(-) 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 057a8d732c4..4a5af7496a6 100644 --- a/src/main/java/org/tron/core/UTXOSet.java +++ b/src/main/java/org/tron/core/UTXOSet.java @@ -35,18 +35,15 @@ public class UTXOSet { 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"); 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 index 2a1b8b888f8..28a50c5a662 100644 --- a/src/test/java/org/tron/core/UTXOSetTest.java +++ b/src/test/java/org/tron/core/UTXOSetTest.java @@ -8,7 +8,6 @@ import org.tron.utils.ByteArray; import java.util.HashMap; -import java.util.UUID; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; @@ -32,8 +31,7 @@ public void testReindex() { LevelDbDataSourceImpl mockTransactionDb = Mockito.mock(LevelDbDataSourceImpl.class); - UTXOSet utxoSet = new UTXOSet(mockTransactionDb); - utxoSet.setBlockchain(mockBlockchain); + UTXOSet utxoSet = new UTXOSet(mockTransactionDb, mockBlockchain); utxoSet.reindex(); Mockito.verify(mockTransactionDb, times(1)).resetDB();