Skip to content

Commit b421d0b

Browse files
authored
Merge pull request #4792 from halibobo1205/feat/trx_hash_get_opt
feat(db): improve performance for getting transaction hash
2 parents 5c4e491 + 5758b66 commit b421d0b

1 file changed

Lines changed: 20 additions & 9 deletions

File tree

chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ public class TransactionCapsule implements ProtoCapsule<Transaction> {
106106
@Setter
107107
private long order;
108108
private byte[] ownerAddress;
109+
private Sha256Hash id;
109110

110111
public byte[] getOwnerAddress() {
111112
if (this.ownerAddress == null) {
@@ -488,7 +489,7 @@ public void setReference(long blockNum, byte[] blockHash) {
488489
.setRefBlockHash(ByteString.copyFrom(ByteArray.subArray(blockHash, 8, 16)))
489490
.setRefBlockBytes(ByteString.copyFrom(ByteArray.subArray(refBlockNum, 6, 8)))
490491
.build();
491-
this.transaction = this.transaction.toBuilder().setRawData(rawData).build();
492+
setRawData(rawData);
492493
}
493494

494495
public long getExpiration() {
@@ -501,21 +502,21 @@ public long getExpiration() {
501502
public void setExpiration(long expiration) {
502503
Transaction.raw rawData = this.transaction.getRawData().toBuilder().setExpiration(expiration)
503504
.build();
504-
this.transaction = this.transaction.toBuilder().setRawData(rawData).build();
505+
setRawData(rawData);
505506
}
506507

507508
public void setTimestamp() {
508509
Transaction.raw rawData = this.transaction.getRawData().toBuilder()
509510
.setTimestamp(System.currentTimeMillis())
510511
.build();
511-
this.transaction = this.transaction.toBuilder().setRawData(rawData).build();
512+
setRawData(rawData);
512513
}
513514

514515
public void setTimestamp(long timestamp) {
515516
Transaction.raw rawData = this.transaction.getRawData().toBuilder()
516517
.setTimestamp(timestamp)
517518
.build();
518-
this.transaction = this.transaction.toBuilder().setRawData(rawData).build();
519+
setRawData(rawData);
519520
}
520521

521522
public long getTimestamp() {
@@ -545,7 +546,7 @@ public void sign(byte[] privateKey) {
545546
SignInterface cryptoEngine = SignUtils
546547
.fromPrivate(privateKey, CommonParameter.getInstance().isECKeyCryptoEngine());
547548
ByteString sig = ByteString.copyFrom(cryptoEngine.Base64toBytes(cryptoEngine
548-
.signHash(getRawHash().getBytes())));
549+
.signHash(getTransactionId().getBytes())));
549550
this.transaction = this.transaction.toBuilder().addSignature(sig).build();
550551
}
551552

@@ -568,7 +569,8 @@ public void addSign(byte[] privateKey, AccountStore accountStore)
568569
.fromPrivate(privateKey, CommonParameter.getInstance().isECKeyCryptoEngine());
569570
byte[] address = cryptoEngine.getAddress();
570571
if (this.transaction.getSignatureCount() > 0) {
571-
checkWeight(permission, this.transaction.getSignatureList(), this.getRawHash().getBytes(),
572+
checkWeight(permission, this.transaction.getSignatureList(),
573+
this.getTransactionId().getBytes(),
572574
approveList);
573575
if (approveList.contains(ByteString.copyFrom(address))) {
574576
throw new PermissionException(encode58Check(address) + " had signed!");
@@ -582,7 +584,7 @@ public void addSign(byte[] privateKey, AccountStore accountStore)
582584
+ " but it is not contained of permission.");
583585
}
584586
ByteString sig = ByteString.copyFrom(cryptoEngine.Base64toBytes(cryptoEngine
585-
.signHash(getRawHash().getBytes())));
587+
.signHash(getTransactionId().getBytes())));
586588
this.transaction = this.transaction.toBuilder().addSignature(sig).build();
587589
}
588590

@@ -614,7 +616,7 @@ public boolean validatePubSignature(AccountStore accountStore,
614616
throw new ValidateSignatureException("too many signatures");
615617
}
616618

617-
byte[] hash = this.getRawHash().getBytes();
619+
byte[] hash = getTransactionId().getBytes();
618620

619621
try {
620622
if (!validateSignature(this.transaction, hash, accountStore, dynamicPropertiesStore)) {
@@ -657,7 +659,16 @@ public boolean validateSignature(AccountStore accountStore,
657659
}
658660

659661
public Sha256Hash getTransactionId() {
660-
return getRawHash();
662+
if (this.id == null) {
663+
this.id = getRawHash();
664+
}
665+
return this.id;
666+
}
667+
668+
private void setRawData(Transaction.raw rawData) {
669+
this.transaction = this.transaction.toBuilder().setRawData(rawData).build();
670+
// invalidate trxId
671+
this.id = null;
661672
}
662673

663674
@Override

0 commit comments

Comments
 (0)