@@ -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