From 1af46fbe133c80bb5c1d4b6527929a8ecb3e77a1 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 2 Nov 2012 17:05:19 -0700 Subject: [PATCH] Track fields not serialized for signing hashes in a more sensible way. --- src/FieldNames.cpp | 3 +++ src/FieldNames.h | 11 +++++++++-- src/SerializedObject.cpp | 7 +------ 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/FieldNames.cpp b/src/FieldNames.cpp index 9b76ffe08e..2789f33aba 100644 --- a/src/FieldNames.cpp +++ b/src/FieldNames.cpp @@ -28,6 +28,9 @@ SField sfIndex(STI_HASH256, 258, "index"); static int initFields() { + sfTxnSignature.notSigningField(); sfTxnSignatures.notSigningField(); + sfSignature.notSigningField(); + sfHighQualityIn.setMeta(SFM_CHANGE); sfHighQualityOut.setMeta(SFM_CHANGE); sfLowQualityIn.setMeta(SFM_CHANGE); sfLowQualityOut.setMeta(SFM_CHANGE); diff --git a/src/FieldNames.h b/src/FieldNames.h index cdb11ad6b7..3a0ae9a3a1 100644 --- a/src/FieldNames.h +++ b/src/FieldNames.h @@ -60,16 +60,18 @@ public: const int fieldValue; // Code number for protocol std::string fieldName; SF_Meta fieldMeta; + bool signingField; SField(int fc, SerializedTypeID tid, int fv, const char* fn) : - fieldCode(fc), fieldType(tid), fieldValue(fv), fieldName(fn), fieldMeta(SFM_NEVER) + fieldCode(fc), fieldType(tid), fieldValue(fv), fieldName(fn), fieldMeta(SFM_NEVER), signingField(true) { boost::mutex::scoped_lock sl(mapMutex); codeToField[fieldCode] = this; } SField(SerializedTypeID tid, int fv, const char *fn) : - fieldCode(FIELD_CODE(tid, fv)), fieldType(tid), fieldValue(fv), fieldName(fn), fieldMeta(SFM_NEVER) + fieldCode(FIELD_CODE(tid, fv)), fieldType(tid), fieldValue(fv), fieldName(fn), + fieldMeta(SFM_NEVER), signingField(true) { boost::mutex::scoped_lock sl(mapMutex); codeToField[fieldCode] = this; @@ -97,6 +99,11 @@ public: bool shouldMetaDel() const { return (fieldMeta == SFM_DELETE) || (fieldMeta == SFM_ALWAYS); } bool shouldMetaMod() const { return (fieldMeta == SFM_CHANGE) || (fieldMeta == SFM_ALWAYS); } void setMeta(SF_Meta m) { fieldMeta = m; } + bool isSigningField() const { return signingField; } + void notSigningField() { signingField = false; } + + bool shouldInclude(bool withSigningField) const + { return (fieldValue < 256) && (withSigningField || signingField); } bool operator==(const SField& f) const { return fieldCode == f.fieldCode; } bool operator!=(const SField& f) const { return fieldCode != f.fieldCode; } diff --git a/src/SerializedObject.cpp b/src/SerializedObject.cpp index 2f90c75cba..2ef6a84f8e 100644 --- a/src/SerializedObject.cpp +++ b/src/SerializedObject.cpp @@ -283,13 +283,8 @@ void STObject::add(Serializer& s, bool withSigningFields) const BOOST_FOREACH(const SerializedType& it, mData) { // pick out the fields and sort them - if ((it.getSType() != STI_NOTPRESENT) && it.getFName().isBinary()) - { - SField::ref fName = it.getFName(); - if (withSigningFields || - ((fName != sfTxnSignature) && (fName != sfTxnSignatures) && (fName != sfSignature))) + if ((it.getSType() != STI_NOTPRESENT) && it.getFName().shouldInclude(withSigningFields)) fields.insert(std::make_pair(it.getFName().fieldCode, &it)); - } }