Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions src/main/java/org/tron/application/Module.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -49,4 +50,11 @@ public LevelDbDataSourceImpl buildBlockDb() {
db.initDB();
return db;
}

@Provides
@Singleton
public Blockchain buildBlockchain(@Named("block") LevelDbDataSourceImpl blockDB) {
return new Blockchain(blockDB);
}

}
6 changes: 3 additions & 3 deletions src/main/java/org/tron/core/Blockchain.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.*;
Expand All @@ -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);

Expand Down
17 changes: 6 additions & 11 deletions src/main/java/org/tron/core/UTXOSet.java
Original file line number Diff line number Diff line change
Expand Up @@ -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");

Expand All @@ -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());
}
}
Expand Down
40 changes: 9 additions & 31 deletions src/main/java/org/tron/peer/PeerBuilder.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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() {
Expand All @@ -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;
}
}
4 changes: 1 addition & 3 deletions src/test/java/org/tron/core/BlockchainTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
);
}

Expand Down
41 changes: 41 additions & 0 deletions src/test/java/org/tron/core/UTXOSetTest.java
Original file line number Diff line number Diff line change
@@ -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<String, TronTXOutputs.TXOutputs> 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()));
}
}