Skip to content

Commit 8e5685b

Browse files
committed
Merge branch 'develop' of https://github.com/tronprotocol/java-tron into develop
2 parents 4957b22 + 0573941 commit 8e5685b

11 files changed

Lines changed: 128 additions & 98 deletions
Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,50 @@
11
package org.tron.common.utils;
22

3+
import java.util.Optional;
34
import org.tron.core.db.AbstractRevokingStore.Dialog;
45

5-
import java.util.Optional;
6+
public final class DialogOptional {
67

7-
public class DialogOptional<T extends Dialog> {
8-
private static final DialogOptional<?> EMPTY = new DialogOptional<>();
8+
private static final DialogOptional INSTANCE = OptionalEnum.INSTANCE.getInstance();
99

10-
private Optional<T> value;
10+
private Optional<Dialog> value;
1111

1212
private DialogOptional() {
1313
this.value = Optional.empty();
1414
}
1515

16-
public static <T extends Dialog> DialogOptional<T> empty() {
17-
@SuppressWarnings("unchecked")
18-
DialogOptional<T> t = (DialogOptional<T>) EMPTY;
19-
return t;
16+
public synchronized DialogOptional setValue(Dialog value) {
17+
if (!this.value.isPresent()) {
18+
this.value = Optional.of(value);
19+
}
20+
return this;
2021
}
2122

22-
private DialogOptional(T value) {
23-
this.value = Optional.of(value);
23+
public synchronized boolean valid() {
24+
return value.isPresent();
2425
}
2526

26-
public static <T extends Dialog> DialogOptional<T> of(T value) {
27-
return new DialogOptional<>(value);
27+
public synchronized void reset() {
28+
value.ifPresent(Dialog::destroy);
29+
value = Optional.empty();
2830
}
2931

30-
public static <T extends Dialog> DialogOptional<T> ofNullable(T value) {
31-
return value == null ? empty() : of(value);
32+
public static DialogOptional instance() {
33+
return INSTANCE;
3234
}
3335

34-
public boolean valid() {
35-
return value.isPresent();
36-
}
36+
private enum OptionalEnum {
37+
INSTANCE;
3738

38-
public void reset() {
39-
value.ifPresent(Dialog::destroy);
40-
value = Optional.empty();
39+
private DialogOptional instance;
40+
41+
OptionalEnum() {
42+
instance = new DialogOptional();
43+
}
44+
45+
private DialogOptional getInstance() {
46+
return instance;
47+
}
4148
}
49+
4250
}

src/main/java/org/tron/core/db/Manager.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public class Manager {
8484
private KhaosDatabase khaosDb;
8585
private RevokingDatabase revokingStore;
8686
@Getter
87-
private DialogOptional<Dialog> dialog = DialogOptional.empty();
87+
private DialogOptional dialog = DialogOptional.instance();
8888

8989
@Getter
9090
@Setter
@@ -350,7 +350,7 @@ public synchronized boolean pushTransactions(final TransactionCapsule trx)
350350
validateFreq(trx);
351351

352352
if (!dialog.valid()) {
353-
dialog = DialogOptional.of(revokingStore.buildDialog());
353+
dialog.setValue(revokingStore.buildDialog());
354354
}
355355

356356
try (
@@ -697,7 +697,7 @@ public synchronized BlockCapsule generateBlock(final WitnessCapsule witnessCapsu
697697
witnessCapsule.getAddress());
698698

699699
dialog.reset();
700-
dialog = DialogOptional.of(revokingStore.buildDialog());
700+
dialog.setValue(revokingStore.buildDialog());
701701

702702
Iterator iterator = pendingTransactions.iterator();
703703
while (iterator.hasNext()) {

src/test/java/org/tron/core/actuator/AssetIssueActuatorTest.java

100644100755
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,5 +149,6 @@ public static void destroy() {
149149
} else {
150150
logger.info("Release resources failure.");
151151
}
152+
dbManager.destory();
152153
}
153154
}

src/test/java/org/tron/core/actuator/CreateAccountActuatorTest.java

100644100755
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,5 +126,6 @@ public static void destroy() {
126126
} else {
127127
logger.info("Release resources failure.");
128128
}
129+
dbManager.destory();
129130
}
130131
}

src/test/java/org/tron/core/actuator/ParticipateAssetIssueActuatorTest.java

100644100755
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ public static void destroy() {
7676
} else {
7777
logger.info("Release resources failure.");
7878
}
79+
dbManager.destory();
7980
}
8081

8182
/**

src/test/java/org/tron/core/actuator/TransferActuatorTest.java

100644100755
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public static void destroy() {
6262
} else {
6363
logger.info("Release resources failure.");
6464
}
65+
dbManager.destory();
6566
}
6667

6768
/**

src/test/java/org/tron/core/actuator/TransferAssetActuatorTest.java

100644100755
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,5 +209,6 @@ public static void destroy() {
209209
} else {
210210
logger.info("Release resources failure.");
211211
}
212+
dbManager.destory();
212213
}
213214
}

src/test/java/org/tron/core/db/AccountStoreTest.java

100644100755
File mode changed.

src/test/java/org/tron/core/db/ManagerTest.java

Lines changed: 84 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package org.tron.core.db;
22

3+
import com.google.common.collect.Maps;
34
import com.google.protobuf.ByteString;
45
import java.io.File;
6+
import java.util.Map;
57
import java.util.stream.Collectors;
68
import java.util.stream.IntStream;
79
import lombok.extern.slf4j.Slf4j;
@@ -13,7 +15,9 @@
1315
import org.tron.common.utils.ByteArray;
1416
import org.tron.common.utils.FileUtil;
1517
import org.tron.common.utils.Sha256Hash;
18+
import org.tron.common.utils.Utils;
1619
import org.tron.core.Constant;
20+
import org.tron.core.capsule.AccountCapsule;
1721
import org.tron.core.capsule.BlockCapsule;
1822
import org.tron.core.capsule.TransactionCapsule;
1923
import org.tron.core.capsule.WitnessCapsule;
@@ -25,7 +29,9 @@
2529
import org.tron.core.exception.UnLinkedBlockException;
2630
import org.tron.core.exception.ValidateScheduleException;
2731
import org.tron.core.exception.ValidateSignatureException;
32+
import org.tron.core.witness.WitnessController;
2833
import org.tron.protos.Contract.TransferContract;
34+
import org.tron.protos.Protocol.Account;
2935
import org.tron.protos.Protocol.Transaction.Contract.ContractType;
3036

3137
@Slf4j
@@ -149,7 +155,7 @@ public void pushBlock() {
149155
}
150156

151157

152-
// @Test
158+
// @Test
153159
public void updateWits() {
154160
int sizePrv = dbManager.getWitnesses().size();
155161
dbManager.getWitnesses().forEach(witnessCapsule -> {
@@ -185,69 +191,85 @@ public void updateWits() {
185191
}
186192

187193
@Test
188-
public void fork() {
194+
public void fork() throws ValidateSignatureException,
195+
ContractValidateException,
196+
ContractExeException,
197+
UnLinkedBlockException,
198+
ValidateScheduleException,
199+
BadItemException,
200+
ItemNotFoundException {
189201
Args.setParam(new String[]{"--witness"}, Constant.TEST_CONF);
190202
long size = dbManager.getBlockStore().dbSource.allKeys().size();
191-
String key = "f31db24bfbd1a2ef19beddca0a0fa37632eded9ac666a05d3bd925f01dde1f62";
192-
byte[] privateKey = ByteArray.fromHexString(key);
193-
final ECKey ecKey = ECKey.fromPrivate(privateKey);
194-
byte[] address = ecKey.getAddress();
195-
WitnessCapsule witnessCapsule = new WitnessCapsule(ByteString.copyFrom(address));
196-
dbManager.addWitness(witnessCapsule);
197-
dbManager.addWitness(witnessCapsule);
198-
dbManager.addWitness(witnessCapsule);
199-
IntStream.range(0, 1).forEach(i -> {
200-
try {
201-
dbManager.generateBlock(witnessCapsule, System.currentTimeMillis(), privateKey);
202-
} catch (Exception e) {
203-
logger.debug(e.getMessage(), e);
204-
}
205-
});
206203

207-
try {
208-
long num = dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber();
209-
BlockCapsule blockCapsule1 = new BlockCapsule(num,
210-
dbManager.getHead().getParentHash().getByteString(),
211-
System.currentTimeMillis(),
212-
witnessCapsule.getAddress());
213-
blockCapsule1.generatedByMyself = true;
214-
215-
BlockCapsule blockCapsule2 = new BlockCapsule(num + 1,
216-
blockCapsule1.getBlockId().getByteString(),
217-
System.currentTimeMillis(),
218-
witnessCapsule.getAddress());
219-
blockCapsule2.generatedByMyself = true;
220-
221-
logger.error("******1*******" + "block1 id:" + blockCapsule1.getBlockId());
222-
logger.error("******2*******" + "block2 id:" + blockCapsule2.getBlockId());
223-
dbManager.pushBlock(blockCapsule1);
224-
dbManager.pushBlock(blockCapsule1);
225-
logger.error("******in blockStore block size:"
226-
+ dbManager.getBlockStore().dbSource.allKeys().size());
227-
logger.error("******in blockStore block:"
228-
+ dbManager.getBlockStore().dbSource.allKeys().stream().map(ByteArray::toHexString)
229-
.collect(Collectors.toList()));
230-
231-
Assert.assertNotNull(dbManager.getBlockStore().get(blockCapsule1.getBlockId().getBytes()));
232-
Assert.assertNotNull(dbManager.getBlockStore().get(blockCapsule2.getBlockId().getBytes()));
233-
234-
Assert.assertEquals(
235-
dbManager.getBlockStore().get(blockCapsule2.getBlockId().getBytes()).getParentHash(),
236-
blockCapsule1.getBlockId());
237-
238-
Assert.assertEquals(dbManager.getBlockStore().dbSource.allKeys().size(), size + 2);
239-
240-
Assert.assertEquals(dbManager.getBlockIdByNum(dbManager.getHead().getNum() - 1),
241-
blockCapsule1.getBlockId());
242-
Assert.assertEquals(dbManager.getBlockIdByNum(dbManager.getHead().getNum() - 2),
243-
blockCapsule1.getParentHash());
244-
245-
Assert.assertEquals(blockCapsule2.getBlockId().getByteString(),
246-
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash());
247-
Assert.assertEquals(dbManager.getHead().getBlockId().getByteString(),
248-
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash());
249-
} catch (Exception e) {
250-
logger.debug(e.getMessage(), e);
251-
}
204+
Map<ByteString, String> addressToProvateKeys = addTestWitnessAndAccount();
205+
206+
long num = dbManager.getDynamicPropertiesStore().getLatestBlockHeaderNumber();
207+
BlockCapsule blockCapsule0 = createTestBlockCapsule(num + 1,
208+
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash().getByteString(),
209+
addressToProvateKeys);
210+
211+
BlockCapsule blockCapsule1 = createTestBlockCapsule(num + 1,
212+
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash().getByteString(),
213+
addressToProvateKeys);
214+
215+
BlockCapsule blockCapsule2 = createTestBlockCapsule(num + 2,
216+
blockCapsule1.getBlockId().getByteString(), addressToProvateKeys);
217+
218+
dbManager.pushBlock(blockCapsule0);
219+
dbManager.pushBlock(blockCapsule1);
220+
dbManager.pushBlock(blockCapsule2);
221+
222+
Assert.assertNotNull(dbManager.getBlockStore().get(blockCapsule1.getBlockId().getBytes()));
223+
Assert.assertNotNull(dbManager.getBlockStore().get(blockCapsule2.getBlockId().getBytes()));
224+
225+
Assert.assertEquals(
226+
dbManager.getBlockStore().get(blockCapsule2.getBlockId().getBytes()).getParentHash(),
227+
blockCapsule1.getBlockId());
228+
229+
Assert.assertEquals(dbManager.getBlockStore().dbSource.allKeys().size(), size + 2);
230+
231+
Assert.assertEquals(dbManager.getBlockIdByNum(dbManager.getHead().getNum() - 1),
232+
blockCapsule1.getBlockId());
233+
Assert.assertEquals(dbManager.getBlockIdByNum(dbManager.getHead().getNum() - 2),
234+
blockCapsule1.getParentHash());
235+
236+
Assert.assertEquals(blockCapsule2.getBlockId(),
237+
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash());
238+
Assert.assertEquals(dbManager.getHead().getBlockId(),
239+
dbManager.getDynamicPropertiesStore().getLatestBlockHeaderHash());
240+
}
241+
242+
private Map<ByteString, String> addTestWitnessAndAccount() {
243+
dbManager.getWitnesses().clear();
244+
return IntStream.range(0, 2).mapToObj(i -> {
245+
ECKey ecKey = new ECKey(Utils.getRandom());
246+
String privateKey = ByteArray.toHexString(ecKey.getPrivKey().toByteArray());
247+
ByteString address = ByteString.copyFrom(ecKey.getAddress());
248+
249+
WitnessCapsule witnessCapsule = new WitnessCapsule(address);
250+
dbManager.getWitnessStore().put(address.toByteArray(), witnessCapsule);
251+
dbManager.getWitnessController().addWitness(witnessCapsule);
252+
253+
AccountCapsule accountCapsule =
254+
new AccountCapsule(Account.newBuilder().setAddress(address).build());
255+
dbManager.getAccountStore().put(address.toByteArray(), accountCapsule);
256+
257+
return Maps.immutableEntry(address, privateKey);
258+
})
259+
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
260+
}
261+
262+
private BlockCapsule createTestBlockCapsule(long number, ByteString hash,
263+
Map<ByteString, String> addressToProvateKeys) {
264+
long time = System.currentTimeMillis();
265+
WitnessController witnessController = dbManager.getWitnessController();
266+
ByteString witnessAddress =
267+
witnessController.getScheduledWitness(witnessController.getSlotAtTime(time));
268+
BlockCapsule blockCapsule = new BlockCapsule(number, hash, time, witnessAddress);
269+
blockCapsule.generatedByMyself = true;
270+
blockCapsule.setMerkleRoot();
271+
blockCapsule.sign(ByteArray.fromHexString(addressToProvateKeys.get(witnessAddress)));
272+
return blockCapsule;
252273
}
274+
253275
}

src/test/java/org/tron/core/db/RevokingStoreTest.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.tron.core.db;
22

33
import java.io.File;
4-
import java.util.stream.IntStream;
54
import lombok.extern.slf4j.Slf4j;
65
import org.junit.After;
76
import org.junit.Assert;
@@ -35,24 +34,22 @@ public void removeDb() {
3534
}
3635

3736
@Test
38-
public synchronized void testUndo() {
37+
public synchronized void testUndo() throws RevokingStoreIllegalStateException {
3938
revokingDatabase.getStack().clear();
4039
TestRevokingTronStore tronDatabase = new TestRevokingTronStore(
4140
"testrevokingtronstore-testUndo", revokingDatabase);
4241
TestProtoCapsule testProtoCapsule = new TestProtoCapsule();
4342

44-
DialogOptional dialog = DialogOptional.of(revokingDatabase.buildDialog());
45-
IntStream.range(0, 10).forEach(i -> {
43+
DialogOptional dialog = DialogOptional.instance().setValue(revokingDatabase.buildDialog());
44+
for (int i = 0; i < 10; i++) {
4645
try (Dialog tmpDialog = revokingDatabase.buildDialog()) {
4746
tronDatabase.put(testProtoCapsule.getData(), testProtoCapsule);
4847
Assert.assertFalse(tronDatabase.getDbSource().allKeys().isEmpty());
4948
Assert.assertEquals(revokingDatabase.getStack().size(), 2);
5049
tmpDialog.merge();
5150
Assert.assertEquals(revokingDatabase.getStack().size(), 1);
52-
} catch (RevokingStoreIllegalStateException e) {
53-
logger.debug(e.getMessage(), e);
5451
}
55-
});
52+
}
5653

5754
Assert.assertEquals(revokingDatabase.getStack().size(), 1);
5855

@@ -65,24 +62,22 @@ public synchronized void testUndo() {
6562
}
6663

6764
@Test
68-
public synchronized void testPop() {
65+
public synchronized void testPop() throws RevokingStoreIllegalStateException {
6966
revokingDatabase.getStack().clear();
7067
TestRevokingTronStore tronDatabase = new TestRevokingTronStore(
7168
"testrevokingtronstore-testPop", revokingDatabase);
7269
TestProtoCapsule testProtoCapsule = new TestProtoCapsule();
7370

74-
IntStream.rangeClosed(1, 10).forEach(i -> {
71+
for (int i = 1; i < 11; i++) {
7572
try (Dialog tmpDialog = revokingDatabase.buildDialog()) {
7673
tronDatabase.put(testProtoCapsule.getData(), testProtoCapsule);
7774
Assert.assertFalse(tronDatabase.getDbSource().allKeys().isEmpty());
7875
Assert.assertEquals(revokingDatabase.getActiveDialog(), 1);
7976
tmpDialog.commit();
8077
Assert.assertEquals(revokingDatabase.getStack().size(), i);
8178
Assert.assertEquals(revokingDatabase.getActiveDialog(), 0);
82-
} catch (RevokingStoreIllegalStateException e) {
83-
logger.debug(e.getMessage(), e);
8479
}
85-
});
80+
}
8681

8782
try {
8883
revokingDatabase.pop();

0 commit comments

Comments
 (0)