Skip to content

Commit 68220a4

Browse files
authored
Merge pull request #6505 from jakamobiii/opt-getVerifyTxs
feat(db): optimize the logic for obtaining transactions that require signature verification
2 parents cdd720a + 09d2199 commit 68220a4

File tree

2 files changed

+55
-3
lines changed

2 files changed

+55
-3
lines changed

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

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.Collections;
2222
import java.util.Comparator;
2323
import java.util.Date;
24+
import java.util.HashMap;
2425
import java.util.HashSet;
2526
import java.util.LinkedList;
2627
import java.util.List;
@@ -1194,14 +1195,36 @@ private void switchFork(BlockCapsule newHead)
11941195

11951196
}
11961197

1198+
private boolean isSameSig(TransactionCapsule tx1, TransactionCapsule tx2) {
1199+
if (tx1 == null || tx2 == null) {
1200+
return false;
1201+
}
1202+
1203+
if (tx1.getInstance().getSignatureCount() != tx2.getInstance().getSignatureCount()) {
1204+
return false;
1205+
}
1206+
1207+
boolean flag = true;
1208+
for (int i = 0; i < tx1.getInstance().getSignatureCount(); i++) {
1209+
ByteString sig1 = tx1.getInstance().getSignature(i);
1210+
ByteString sig2 = tx2.getInstance().getSignature(i);
1211+
if (!sig1.equals(sig2)) {
1212+
flag = false;
1213+
break;
1214+
}
1215+
}
1216+
1217+
return flag;
1218+
}
1219+
11971220
public List<TransactionCapsule> getVerifyTxs(BlockCapsule block) {
11981221

11991222
if (pendingTransactions.size() == 0) {
12001223
return block.getTransactions();
12011224
}
12021225

12031226
List<TransactionCapsule> txs = new ArrayList<>();
1204-
Set<String> txIds = new HashSet<>();
1227+
Map<String, TransactionCapsule> txMap = new HashMap<>();
12051228
Set<String> multiAddresses = new HashSet<>();
12061229

12071230
pendingTransactions.forEach(capsule -> {
@@ -1210,14 +1233,14 @@ public List<TransactionCapsule> getVerifyTxs(BlockCapsule block) {
12101233
String address = Hex.toHexString(capsule.getOwnerAddress());
12111234
multiAddresses.add(address);
12121235
} else {
1213-
txIds.add(txId);
1236+
txMap.put(txId, capsule);
12141237
}
12151238
});
12161239

12171240
block.getTransactions().forEach(capsule -> {
12181241
String address = Hex.toHexString(capsule.getOwnerAddress());
12191242
String txId = Hex.toHexString(capsule.getTransactionId().getBytes());
1220-
if (multiAddresses.contains(address) || !txIds.contains(txId)) {
1243+
if (multiAddresses.contains(address) || !isSameSig(capsule, txMap.get(txId))) {
12211244
txs.add(capsule);
12221245
} else {
12231246
capsule.setVerified(true);

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -862,6 +862,35 @@ public void getVerifyTxsTest() {
862862
dbManager.getPendingTransactions().add(t3);
863863
txs = dbManager.getVerifyTxs(capsule);
864864
Assert.assertEquals(txs.size(), 2);
865+
866+
dbManager.getPendingTransactions().clear();
867+
capsule = new BlockCapsule(0, ByteString.EMPTY, 0, list);
868+
dbManager.getPendingTransactions().add(t1);
869+
dbManager.getPendingTransactions().add(t2);
870+
txs = dbManager.getVerifyTxs(capsule);
871+
Assert.assertEquals(txs.size(), 0);
872+
873+
dbManager.getPendingTransactions().clear();
874+
Transaction t1Bak = t1.getInstance().toBuilder()
875+
.addSignature(ByteString.copyFrom("a".getBytes())).build();
876+
dbManager.getPendingTransactions().add(new TransactionCapsule(t1Bak));
877+
txs = dbManager.getVerifyTxs(capsule);
878+
Assert.assertEquals(t1.getTransactionId(), new TransactionCapsule(t1Bak).getTransactionId());
879+
Assert.assertEquals(txs.size(), 2);
880+
881+
dbManager.getPendingTransactions().clear();
882+
list.clear();
883+
list.add(t1Bak);
884+
capsule = new BlockCapsule(0, ByteString.EMPTY, 0, list);
885+
886+
Transaction t2Bak = t1.getInstance().toBuilder()
887+
.addSignature(ByteString.copyFrom("a".getBytes()))
888+
.addSignature(ByteString.copyFrom("b".getBytes())).build();
889+
Assert.assertEquals(new TransactionCapsule(t1Bak).getTransactionId(),
890+
new TransactionCapsule(t2Bak).getTransactionId());
891+
dbManager.getPendingTransactions().add(new TransactionCapsule(t2Bak));
892+
txs = dbManager.getVerifyTxs(capsule);
893+
Assert.assertEquals(txs.size(), 1);
865894
}
866895

867896
@Test

0 commit comments

Comments
 (0)