diff --git a/src/cpp/ripple/SerializedTransaction.cpp b/src/cpp/ripple/SerializedTransaction.cpp index 0d7dd34f2..ccd5f073e 100644 --- a/src/cpp/ripple/SerializedTransaction.cpp +++ b/src/cpp/ripple/SerializedTransaction.cpp @@ -11,7 +11,8 @@ SETUP_LOG(); DECLARE_INSTANCE(SerializedTransaction); -SerializedTransaction::SerializedTransaction(TransactionType type) : STObject(sfTransaction), mType(type) +SerializedTransaction::SerializedTransaction(TransactionType type) : STObject(sfTransaction), mType(type), + mSigGood(false), mSigBad(false) { mFormat = TransactionFormat::getTxnFormat(type); if (mFormat == NULL) @@ -23,7 +24,8 @@ SerializedTransaction::SerializedTransaction(TransactionType type) : STObject(sf setFieldU16(sfTransactionType, mFormat->t_type); } -SerializedTransaction::SerializedTransaction(const STObject& object) : STObject(object) +SerializedTransaction::SerializedTransaction(const STObject& object) : STObject(object), + mSigGood(false), mSigBad(false) { mType = static_cast(getFieldU16(sfTransactionType)); mFormat = TransactionFormat::getTxnFormat(mType); @@ -38,7 +40,8 @@ SerializedTransaction::SerializedTransaction(const STObject& object) : STObject( } } -SerializedTransaction::SerializedTransaction(SerializerIterator& sit) : STObject(sfTransaction) +SerializedTransaction::SerializedTransaction(SerializerIterator& sit) : STObject(sfTransaction), + mSigGood(false), mSigBad(false) { int length = sit.getBytesLeft(); if ((length < TransactionMinLen) || (length > TransactionMaxLen)) @@ -156,16 +159,28 @@ void SerializedTransaction::sign(const RippleAddress& naAccountPrivate) bool SerializedTransaction::checkSign() const { + if (mSigGood) + return true; + + if (mSigBad) + return false; + try { RippleAddress n; n.setAccountPublic(getFieldVL(sfSigningPubKey)); - return checkSign(n); + if (checkSign(n)) + { + mSigGood = true; + return true; + } } catch (...) { - return false; + ; } + mSigBad = true; + return false; } bool SerializedTransaction::checkSign(const RippleAddress& naAccountPublic) const diff --git a/src/cpp/ripple/SerializedTransaction.h b/src/cpp/ripple/SerializedTransaction.h index 5dfc24f27..6b9dde135 100644 --- a/src/cpp/ripple/SerializedTransaction.h +++ b/src/cpp/ripple/SerializedTransaction.h @@ -32,6 +32,8 @@ protected: SerializedTransaction* duplicate() const { return new SerializedTransaction(*this); } + mutable bool mSigGood, mSigBad; + public: SerializedTransaction(SerializerIterator& sit); SerializedTransaction(TransactionType type); @@ -69,6 +71,10 @@ public: void sign(const RippleAddress& naAccountPrivate); bool checkSign(const RippleAddress& naAccountPublic) const; bool checkSign() const; + bool isKnownGood() const { return mSigGood; } + bool isKnownBad() const { return mSigBad; } + void setGood() const { mSigGood = true; } + void setBad() const { mSigBad = true; } // SQL Functions static std::string getSQLValueHeader();