Cache signature state inside SerializedTransaction.

This commit is contained in:
JoelKatz
2013-05-15 15:54:30 -07:00
parent 1bef09b0ef
commit a690ca658d
2 changed files with 26 additions and 5 deletions

View File

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

View File

@@ -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();