From a4070de73eddb1c54414b5e1d38d4b828b7bb7c1 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 24 Sep 2012 13:04:24 -0700 Subject: [PATCH 1/8] Some work on the new binary formats that doesn't break current code. --- src/FieldNames.cpp | 98 ++++++++++++++++++++++++++++++++++++++ src/FieldNames.h | 15 ++++++ src/LedgerEntrySet.cpp | 3 ++ src/SerializedObject.h | 13 ++++- src/SerializedTypes.h | 37 +++++++------- src/Transaction.cpp | 6 +-- src/TransactionAction.cpp | 4 +- src/TransactionFormats.cpp | 6 +-- 8 files changed, 156 insertions(+), 26 deletions(-) create mode 100644 src/FieldNames.cpp create mode 100644 src/FieldNames.h diff --git a/src/FieldNames.cpp b/src/FieldNames.cpp new file mode 100644 index 0000000000..5f1ff6130c --- /dev/null +++ b/src/FieldNames.cpp @@ -0,0 +1,98 @@ + +#include "FieldNames.h" + +#define S_FIELD(x) sf##x, #x + +FieldName FieldNames[]= +{ + + // 8-bit integers + { S_FIELD(CloseResolution), STI_UINT8, 1 }, + + // 32-bit integers (common) + { S_FIELD(Flags), STI_UINT32, 1 }, + { S_FIELD(SourceTag), STI_UINT32, 2 }, + { S_FIELD(Sequence), STI_UINT32, 3 }, + { S_FIELD(LastTxnSeq), STI_UINT32, 4 }, + { S_FIELD(LedgerSequence), STI_UINT32, 5 }, + { S_FIELD(CloseTime), STI_UINT32, 6 }, + { S_FIELD(ParentCloseTime), STI_UINT32, 7 }, + { S_FIELD(SigningTime), STI_UINT32, 8 }, + { S_FIELD(Expiration), STI_UINT32, 9 }, + { S_FIELD(TransferRate), STI_UINT32, 10 }, + { S_FIELD(PublishSize), STI_UINT32, 11 }, + + // 32-bit integers (rare) + { S_FIELD(HighQualityIn), STI_UINT32, 16 }, + { S_FIELD(HighQualityOut), STI_UINT32, 17 }, + { S_FIELD(LowQualityIn), STI_UINT32, 18 }, + { S_FIELD(LowQualityOut), STI_UINT32, 19 }, + { S_FIELD(QualityIn), STI_UINT32, 20 }, + { S_FIELD(QualityOut), STI_UINT32, 21 }, + { S_FIELD(StampEscrow), STI_UINT32, 22 }, + { S_FIELD(BondAmount), STI_UINT32, 23 }, + { S_FIELD(LoadFee), STI_UINT32, 24 }, + + // 64-bit integers + { S_FIELD(IndexNext), STI_UINT64, 1 }, + { S_FIELD(IndexPrevious), STI_UINT64, 2 }, + { S_FIELD(BookNode), STI_UINT64, 3 }, + { S_FIELD(OwnerNode), STI_UINT64, 4 }, + { S_FIELD(BaseFee), STI_UINT64, 5 }, + + // 128-bit + { S_FIELD(PublishSize), STI_HASH128, 1 }, + { S_FIELD(EmailHash), STI_HASH128, 2 }, + + // 256-bit + { S_FIELD(LedgerHash), STI_HASH256, 1 }, + { S_FIELD(ParentHash), STI_HASH256, 2 }, + { S_FIELD(TransactionHash), STI_HASH256, 3 }, + { S_FIELD(AccountHash), STI_HASH256, 4 }, + { S_FIELD(LastTxnID), STI_HASH256, 5 }, + { S_FIELD(WalletLocator), STI_HASH256, 6 }, + { S_FIELD(PublishHash), STI_HASH256, 7 }, + { S_FIELD(Nickname), STI_HASH256, 8 }, + + // currency amount + { S_FIELD(Amount), STI_AMOUNT, 1 }, + { S_FIELD(Balance), STI_AMOUNT, 2 }, + { S_FIELD(LimitAmount), STI_AMOUNT, 3 }, + { S_FIELD(TakerPays), STI_AMOUNT, 4 }, + { S_FIELD(TakerGets), STI_AMOUNT, 5 }, + { S_FIELD(LowLimit), STI_AMOUNT, 6 }, + { S_FIELD(HighLimit), STI_AMOUNT, 7 }, + { S_FIELD(MinimumOffer), STI_AMOUNT, 8 }, + + // variable length + { S_FIELD(PublicKey), STI_VL, 1 }, + { S_FIELD(MessageKey), STI_VL, 2 }, + { S_FIELD(SigningKey), STI_VL, 3 }, + { S_FIELD(Signature), STI_VL, 4 }, + { S_FIELD(Generator), STI_VL, 5 }, + { S_FIELD(Domain), STI_VL, 6 }, + + // account + { S_FIELD(Account), STI_ACCOUNT, 1 }, + { S_FIELD(Owner), STI_ACCOUNT, 2 }, + { S_FIELD(Destination), STI_ACCOUNT, 3 }, + { S_FIELD(Issuer), STI_ACCOUNT, 4 }, + { S_FIELD(HighID), STI_ACCOUNT, 5 }, + { S_FIELD(LowID), STI_ACCOUNT, 6 }, + { S_FIELD(Target), STI_ACCOUNT, 7 }, + + // path set + { S_FIELD(Paths), STI_PATHSET, 1 }, + + // vector of 256-bit + { S_FIELD(Indexes), STI_VECTOR256, 1 }, + + // inner object + { S_FIELD(MiddleTransaction), STI_OBJECT, 1 }, + { S_FIELD(InnerTransaction), STI_OBJECT, 2 }, + // OBJECT/15 is reserved for end of object + + // array of objects + { S_FIELD(SigningAccounts), STI_ARRAY, 1 }, + // ARRAY/15 is reserved for end of array +}; diff --git a/src/FieldNames.h b/src/FieldNames.h new file mode 100644 index 0000000000..5d4979a302 --- /dev/null +++ b/src/FieldNames.h @@ -0,0 +1,15 @@ +#ifndef __FIELDNAMES__ +#define __FIELDNAMES__ + +#include "SerializedTypes.h" +#include "SerializedObject.h" + +struct FieldName +{ + SOE_Field field; + const char *fieldName; + SerializedTypeID fieldType; + int fieldValue; +}; + +#endif diff --git a/src/LedgerEntrySet.cpp b/src/LedgerEntrySet.cpp index 5408a4dca8..59bc7359a2 100644 --- a/src/LedgerEntrySet.cpp +++ b/src/LedgerEntrySet.cpp @@ -349,14 +349,17 @@ void LedgerEntrySet::calcRawMeta(Serializer& s) switch (it->second.mAction) { case taaMODIFY: + Log(lsTRACE) << "Modified Node " << it->first; nType = TMNModifiedNode; break; case taaDELETE: + Log(lsTRACE) << "Deleted Node " << it->first; nType = TMNDeletedNode; break; case taaCREATE: + Log(lsTRACE) << "Created Node " << it->first; nType = TMNCreatedNode; break; diff --git a/src/SerializedObject.h b/src/SerializedObject.h index 08377304c1..e46bf479aa 100644 --- a/src/SerializedObject.h +++ b/src/SerializedObject.h @@ -30,9 +30,11 @@ enum SOE_Field sfAcceptRate, sfAcceptStart, sfAccount, + sfAccountHash, sfAmount, sfAuthorizedKey, sfBalance, + sfBaseFee, sfBondAmount, sfBookDirectory, sfBookNode, @@ -42,6 +44,7 @@ enum SOE_Field sfBorrower, sfCreateCode, sfCloseTime, + sfCloseResolution, sfCurrency, sfCurrencyIn, sfCurrencyOut, @@ -65,18 +68,22 @@ enum SOE_Field sfIndexes, sfIndexNext, sfIndexPrevious, + sfInnerTransaction, sfInvoiceID, sfIssuer, sfLastNode, sfLastTxnID, sfLastTxnSeq, sfLedgerHash, + sfLedgerSequence, sfLimitAmount, + sfLoadFee, sfLowID, sfLowLimit, sfLowQualityIn, sfLowQualityOut, sfMessageKey, + sfMiddleTransaction, sfMinimumOffer, sfNextAcceptExpire, sfNextAcceptRate, @@ -88,8 +95,10 @@ enum SOE_Field sfOfferSequence, sfOwner, sfOwnerNode, + sfParentCloseTime, + sfParentHash, sfPaths, - sfPubKey, + sfPublicKey, sfPublishHash, sfPublishSize, sfQualityIn, @@ -99,6 +108,7 @@ enum SOE_Field sfSendMax, sfSequence, sfSignature, + sfSigningAccounts, sfSigningKey, sfSigningTime, sfSourceTag, @@ -107,6 +117,7 @@ enum SOE_Field sfTakerPays, sfTarget, sfTransferRate, + sfTransactionHash, sfVersion, sfWalletLocator, diff --git a/src/SerializedTypes.h b/src/SerializedTypes.h index 3a6417986e..e7735bfc8e 100644 --- a/src/SerializedTypes.h +++ b/src/SerializedTypes.h @@ -15,25 +15,28 @@ enum SerializedTypeID STI_DONE = -1, STI_NOTPRESENT = 0, - // standard types - STI_OBJECT = 1, - STI_UINT8 = 2, - STI_UINT16 = 3, - STI_UINT32 = 4, - STI_UINT64 = 5, - STI_HASH128 = 6, - STI_HASH160 = 7, - STI_HASH256 = 8, - STI_VL = 9, - STI_TL = 10, - STI_AMOUNT = 11, - STI_PATHSET = 12, - STI_VECTOR256 = 13, + // common types + STI_UINT32 = 1, + STI_UINT64 = 2, + STI_HASH128 = 3, + STI_HASH256 = 4, + STI_TL = 5, + STI_AMOUNT = 6, + STI_VL = 7, + STI_ACCOUNT = 8, + STI_OBJECT = 14, + STI_ARRAY = 15, + + // uncommon types + STI_UINT8 = 16, + STI_UINT16 = 17, + STI_HASH160 = 18, + STI_PATHSET = 19, + STI_VECTOR256 = 20, // high level types - STI_ACCOUNT = 100, - STI_TRANSACTION = 101, - STI_LEDGERENTRY = 102 + STI_TRANSACTION = 100001, + STI_LEDGERENTRY = 100002 }; enum PathFlags diff --git a/src/Transaction.cpp b/src/Transaction.cpp index 00988712d9..526f433bf1 100644 --- a/src/Transaction.cpp +++ b/src/Transaction.cpp @@ -194,7 +194,7 @@ Transaction::pointer Transaction::setClaim( const std::vector& vucSignature) { mTransaction->setITFieldVL(sfGenerator, vucGenerator); - mTransaction->setITFieldVL(sfPubKey, vucPubKey); + mTransaction->setITFieldVL(sfPublicKey, vucPubKey); mTransaction->setITFieldVL(sfSignature, vucSignature); sign(naPrivateKey); @@ -455,7 +455,7 @@ Transaction::pointer Transaction::setPasswordSet( { mTransaction->setITFieldAccount(sfAuthorizedKey, naAuthKeyID); mTransaction->setITFieldVL(sfGenerator, vucGenerator); - mTransaction->setITFieldVL(sfPubKey, vucPubKey); + mTransaction->setITFieldVL(sfPublicKey, vucPubKey); mTransaction->setITFieldVL(sfSignature, vucSignature); sign(naPrivateKey); @@ -542,7 +542,7 @@ Transaction::pointer Transaction::setWalletAdd( { mTransaction->setITFieldAmount(sfAmount, saAmount); mTransaction->setITFieldAccount(sfAuthorizedKey, naAuthKeyID); - mTransaction->setITFieldVL(sfPubKey, naNewPubKey.getAccountPublic()); + mTransaction->setITFieldVL(sfPublicKey, naNewPubKey.getAccountPublic()); mTransaction->setITFieldVL(sfSignature, vucSignature); sign(naPrivateKey); diff --git a/src/TransactionAction.cpp b/src/TransactionAction.cpp index f60ae0af57..19db581da2 100644 --- a/src/TransactionAction.cpp +++ b/src/TransactionAction.cpp @@ -30,7 +30,7 @@ TER TransactionEngine::setAuthorized(const SerializedTransaction& txn, bool bMus // std::vector vucCipher = txn.getITFieldVL(sfGenerator); - std::vector vucPubKey = txn.getITFieldVL(sfPubKey); + std::vector vucPubKey = txn.getITFieldVL(sfPublicKey); std::vector vucSignature = txn.getITFieldVL(sfSignature); NewcoinAddress naAccountPublic = NewcoinAddress::createAccountPublic(vucPubKey); @@ -620,7 +620,7 @@ TER TransactionEngine::doWalletAdd(const SerializedTransaction& txn) { std::cerr << "WalletAdd>" << std::endl; - const std::vector vucPubKey = txn.getITFieldVL(sfPubKey); + const std::vector vucPubKey = txn.getITFieldVL(sfPublicKey); const std::vector vucSignature = txn.getITFieldVL(sfSignature); const uint160 uAuthKeyID = txn.getITFieldAccount(sfAuthorizedKey); const NewcoinAddress naMasterPubKey = NewcoinAddress::createAccountPublic(vucPubKey); diff --git a/src/TransactionFormats.cpp b/src/TransactionFormats.cpp index de18524c7c..542e2683c5 100644 --- a/src/TransactionFormats.cpp +++ b/src/TransactionFormats.cpp @@ -21,7 +21,7 @@ TransactionFormat InnerTxnFormats[]= { "Claim", ttCLAIM, { { S_FIELD(Flags), STI_UINT32, SOE_FLAGS, 0 }, { S_FIELD(Generator), STI_VL, SOE_REQUIRED, 0 }, - { S_FIELD(PubKey), STI_VL, SOE_REQUIRED, 0 }, + { S_FIELD(PublicKey), STI_VL, SOE_REQUIRED, 0 }, { S_FIELD(Signature), STI_VL, SOE_REQUIRED, 0 }, { S_FIELD(SourceTag), STI_UINT32, SOE_IFFLAG, 1 }, { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x02000000 }, @@ -85,7 +85,7 @@ TransactionFormat InnerTxnFormats[]= { S_FIELD(Flags), STI_UINT32, SOE_FLAGS, 0 }, { S_FIELD(AuthorizedKey), STI_ACCOUNT, SOE_REQUIRED, 0 }, { S_FIELD(Generator), STI_VL, SOE_REQUIRED, 0 }, - { S_FIELD(PubKey), STI_VL, SOE_REQUIRED, 0 }, + { S_FIELD(PublicKey), STI_VL, SOE_REQUIRED, 0 }, { S_FIELD(Signature), STI_VL, SOE_REQUIRED, 0 }, { S_FIELD(SourceTag), STI_UINT32, SOE_IFFLAG, 1 }, { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x02000000 }, @@ -106,7 +106,7 @@ TransactionFormat InnerTxnFormats[]= { S_FIELD(Flags), STI_UINT32, SOE_FLAGS, 0 }, { S_FIELD(Amount), STI_AMOUNT, SOE_REQUIRED, 0 }, { S_FIELD(AuthorizedKey), STI_ACCOUNT, SOE_REQUIRED, 0 }, - { S_FIELD(PubKey), STI_VL, SOE_REQUIRED, 0 }, + { S_FIELD(PublicKey), STI_VL, SOE_REQUIRED, 0 }, { S_FIELD(Signature), STI_VL, SOE_REQUIRED, 0 }, { S_FIELD(SourceTag), STI_UINT32, SOE_IFFLAG, 1 }, { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x02000000 }, From 8f88575b8e2fec3321d1b309ad68330b2142fa2e Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 24 Sep 2012 13:19:28 -0700 Subject: [PATCH 2/8] Low-level serializer functions for new type/name field. --- src/Serializer.cpp | 62 ++++++++++++++++++++++++++++++++++++++++++++++ src/Serializer.h | 5 ++++ 2 files changed, 67 insertions(+) diff --git a/src/Serializer.cpp b/src/Serializer.cpp index 51fd734668..cd7e0d6a8e 100644 --- a/src/Serializer.cpp +++ b/src/Serializer.cpp @@ -154,6 +154,57 @@ uint256 Serializer::get256(int offset) const return ret; } +int Serializer::addFieldID(int type, int name) +{ + int ret = mData.size(); + assert((type > 0) && (type < 256) && (name > 0) && (name < 256)); + if (type < 16) + { + if (name < 16) // common type, common name + mData.push_back(static_cast((type << 4) | name)); + else + { // common type, uncommon name + mData.push_back(static_cast(type << 4)); + mData.push_back(static_cast(name)); + } + } + else if (name < 16) + { // uncommon type, common name + mData.push_back(static_cast(name)); + mData.push_back(static_cast(type)); + } + else + { // uncommon type, uncommon name + mData.push_back(static_cast(0)); + mData.push_back(static_cast(type)); + mData.push_back(static_cast(name)); + } + return ret; +} + +bool Serializer::getFieldID(int& type, int & name, int offset) const +{ + if (!get8(type, offset)) + return false; + name = type & 15; + type >>= 4; + if (type == 0) + { // uncommon type + if (!get8(type, ++offset)) + return false; + if ((type == 0) || (type < 16)) + return false; + } + if (name == 0) + { // uncommon name + if (!get8(name, ++offset)) + return false; + if ((name == 0) || (name < 16)) + return false; + } + return true; +} + int Serializer::add8(unsigned char byte) { int ret = mData.size(); @@ -535,6 +586,17 @@ int SerializerIterator::getBytesLeft() return mSerializer.size() - mPos; } +void SerializerIterator::getFieldID(int& type, int& field) +{ + if (!mSerializer.getFieldID(type, field, mPos)) + throw std::runtime_error("invalid serializer getFieldID"); + ++mPos; + if (type >= 16) + ++mPos; + if (field >= 16) + ++mPos; +} + unsigned char SerializerIterator::get8() { int val; diff --git a/src/Serializer.h b/src/Serializer.h index 5c687e2984..e1c251508c 100644 --- a/src/Serializer.h +++ b/src/Serializer.h @@ -67,6 +67,9 @@ public: bool getTaggedList(std::list&, int offset, int& length) const; bool getTaggedList(std::vector&, int offset, int& length) const; + bool getFieldID(int& type, int& name, int offset) const; + int addFieldID(int type, int name); + // normal hash functions uint160 getRIPEMD160(int size=-1) const; uint256 getSHA256(int size=-1) const; @@ -156,6 +159,8 @@ public: uint160 get160(); uint256 get256(); + void getFieldID(int& type, int& field); + std::vector getRaw(int iLength); std::vector getVL(); From 3c5ea7020f995696a3231c52165060148ac73777 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 24 Sep 2012 14:30:24 -0700 Subject: [PATCH 3/8] Start of STAmount issuer fixes. --- src/Amount.cpp | 24 ++++++++++++++++++------ src/SerializedTypes.h | 12 +++++++----- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/Amount.cpp b/src/Amount.cpp index 4c35c46a06..9fc46089e3 100644 --- a/src/Amount.cpp +++ b/src/Amount.cpp @@ -359,19 +359,16 @@ STAmount* STAmount::construct(SerializerIterator& sit, const char *name) if ((value < cMinValue) || (value > cMaxValue) || (offset < cMinOffset) || (offset > cMaxOffset)) throw std::runtime_error("invalid currency value"); - sapResult = new STAmount(name, uCurrencyID, value, offset, isNegative); + sapResult = new STAmount(name, uCurrencyID, uIssuerID, value, offset, isNegative); } else { if (offset != 512) throw std::runtime_error("invalid currency value"); - sapResult = new STAmount(name, uCurrencyID); + sapResult = new STAmount(name, uCurrencyID, uIssuerID); } - if (sapResult) - sapResult->setIssuer(uIssuerID); - return sapResult; } @@ -522,7 +519,22 @@ STAmount& STAmount::operator-=(const STAmount& a) STAmount STAmount::operator-(void) const { if (mValue == 0) return *this; - return STAmount(name, mCurrency, mValue, mOffset, mIsNative, !mIsNegative); + return STAmount(name, mCurrency, mIssuer, mValue, mOffset, mIsNative, !mIsNegative); +} + +STAmount& STAmount::operator=(const STAmount &a) +{ + if (name == NULL) + name = a.name; + + mCurrency = a.mCurrency; + mIssuer = a.mIssuer; + mValue = a.mValue; + mOffset = a.mOffset; + mIsNative = a.mIsNative; + mIsNegative = a.mIsNegative; + + return *this; } STAmount& STAmount::operator=(uint64 v) diff --git a/src/SerializedTypes.h b/src/SerializedTypes.h index e7735bfc8e..fef6664123 100644 --- a/src/SerializedTypes.h +++ b/src/SerializedTypes.h @@ -250,9 +250,9 @@ protected: STAmount(const char *name, uint64 value, bool isNegative) : SerializedType(name), mValue(value), mOffset(0), mIsNative(true), mIsNegative(isNegative) { ; } - STAmount(const char *n, const uint160& cur, uint64 val, int off, bool isNative, bool isNegative) - : SerializedType(n), mCurrency(cur), mValue(val), mOffset(off), mIsNative(isNative), mIsNegative(isNegative) - { ; } + STAmount(const char *n, const uint160& cur, const uint160& iss, uint64 val, int off, bool isNat, bool isNeg) + : SerializedType(n), mCurrency(cur), mIssuer(iss), mValue(val), mOffset(off), + mIsNative(isNat), mIsNegative(isNeg) { ; } uint64 toUInt64() const; static uint64 muldiv(uint64, uint64, uint64); @@ -272,8 +272,9 @@ public: { canonicalize(); } // YYY This should probably require issuer too. - STAmount(const char* n, const uint160& currency, uint64 v = 0, int off = 0, bool isNeg = false) : - SerializedType(n), mCurrency(currency), mValue(v), mOffset(off), mIsNegative(isNeg) + STAmount(const char* n, const uint160& currency, const uint160& issuer, + uint64 v = 0, int off = 0, bool isNeg = false) : + SerializedType(n), mCurrency(currency), mIssuer(issuer), mValue(v), mOffset(off), mIsNegative(isNeg) { canonicalize(); } STAmount(const char* n, int64 v); @@ -347,6 +348,7 @@ public: STAmount operator-(uint64) const; STAmount operator-(void) const; + STAmount& operator=(const STAmount&); STAmount& operator+=(const STAmount&); STAmount& operator-=(const STAmount&); STAmount& operator+=(uint64); From 7ef8001505eec94bcef5c7843e1e71675f8e1a7c Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 24 Sep 2012 14:36:48 -0700 Subject: [PATCH 4/8] Audit all construction cases, fix broken ones. --- src/Amount.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Amount.cpp b/src/Amount.cpp index 9fc46089e3..ebd2597a99 100644 --- a/src/Amount.cpp +++ b/src/Amount.cpp @@ -632,9 +632,9 @@ STAmount operator+(const STAmount& v1, const STAmount& v2) int64 fv = vv1 + vv2; if (fv >= 0) - return STAmount(v1.name, v1.mCurrency, fv, ov1, false); + return STAmount(v1.name, v1.mCurrency, v1.mIssuer, fv, ov1, false); else - return STAmount(v1.name, v1.mCurrency, -fv, ov1, true); + return STAmount(v1.name, v1.mCurrency, v1.mIssuer, -fv, ov1, true); } STAmount operator-(const STAmount& v1, const STAmount& v2) @@ -664,9 +664,9 @@ STAmount operator-(const STAmount& v1, const STAmount& v2) int64 fv = vv1 - vv2; if (fv >= 0) - return STAmount(v1.name, v1.mCurrency, fv, ov1, false); + return STAmount(v1.name, v1.mCurrency, v1.mIssuer, fv, ov1, false); else - return STAmount(v1.name, v1.mCurrency, -fv, ov1, true); + return STAmount(v1.name, v1.mCurrency, v1.mIssuer, -fv, ov1, true); } STAmount STAmount::divide(const STAmount& num, const STAmount& den, const uint160& uCurrencyID, const uint160& uIssuerID) From 9432d35f14a862dca021672569a1b1b49d2d824f Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 24 Sep 2012 14:45:44 -0700 Subject: [PATCH 5/8] You don't need to customize operator=(const&) since the base class does it for you. --- src/Amount.cpp | 15 --------------- src/SerializedTypes.h | 1 - 2 files changed, 16 deletions(-) diff --git a/src/Amount.cpp b/src/Amount.cpp index ebd2597a99..f0692f2af7 100644 --- a/src/Amount.cpp +++ b/src/Amount.cpp @@ -522,21 +522,6 @@ STAmount STAmount::operator-(void) const return STAmount(name, mCurrency, mIssuer, mValue, mOffset, mIsNative, !mIsNegative); } -STAmount& STAmount::operator=(const STAmount &a) -{ - if (name == NULL) - name = a.name; - - mCurrency = a.mCurrency; - mIssuer = a.mIssuer; - mValue = a.mValue; - mOffset = a.mOffset; - mIsNative = a.mIsNative; - mIsNegative = a.mIsNegative; - - return *this; -} - STAmount& STAmount::operator=(uint64 v) { // does not copy name, does not change currency type mOffset = 0; diff --git a/src/SerializedTypes.h b/src/SerializedTypes.h index fef6664123..6c9099df50 100644 --- a/src/SerializedTypes.h +++ b/src/SerializedTypes.h @@ -348,7 +348,6 @@ public: STAmount operator-(uint64) const; STAmount operator-(void) const; - STAmount& operator=(const STAmount&); STAmount& operator+=(const STAmount&); STAmount& operator-=(const STAmount&); STAmount& operator+=(uint64); From 173b6ce5581e5c7e78dc5d7137fb58ebc48f0834 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 24 Sep 2012 16:21:40 -0700 Subject: [PATCH 6/8] More changes to the new serialization format that don't break compatibility. --- src/FieldNames.cpp | 97 ++-------------------------- src/FieldNames.h | 1 + src/LedgerFormats.cpp | 7 --- src/SerializeProto.h | 125 +++++++++++++++++++++++++++++++++++++ src/SerializedObject.h | 100 ++--------------------------- src/TransactionFormats.cpp | 13 ---- 6 files changed, 137 insertions(+), 206 deletions(-) create mode 100644 src/SerializeProto.h diff --git a/src/FieldNames.cpp b/src/FieldNames.cpp index 5f1ff6130c..3053c2c960 100644 --- a/src/FieldNames.cpp +++ b/src/FieldNames.cpp @@ -1,98 +1,13 @@ #include "FieldNames.h" -#define S_FIELD(x) sf##x, #x +#define FIELD(name, type, index) { sf##name, #name, STI_##type, index }, +#define TYPE(type, index) FieldName FieldNames[]= { - - // 8-bit integers - { S_FIELD(CloseResolution), STI_UINT8, 1 }, - - // 32-bit integers (common) - { S_FIELD(Flags), STI_UINT32, 1 }, - { S_FIELD(SourceTag), STI_UINT32, 2 }, - { S_FIELD(Sequence), STI_UINT32, 3 }, - { S_FIELD(LastTxnSeq), STI_UINT32, 4 }, - { S_FIELD(LedgerSequence), STI_UINT32, 5 }, - { S_FIELD(CloseTime), STI_UINT32, 6 }, - { S_FIELD(ParentCloseTime), STI_UINT32, 7 }, - { S_FIELD(SigningTime), STI_UINT32, 8 }, - { S_FIELD(Expiration), STI_UINT32, 9 }, - { S_FIELD(TransferRate), STI_UINT32, 10 }, - { S_FIELD(PublishSize), STI_UINT32, 11 }, - - // 32-bit integers (rare) - { S_FIELD(HighQualityIn), STI_UINT32, 16 }, - { S_FIELD(HighQualityOut), STI_UINT32, 17 }, - { S_FIELD(LowQualityIn), STI_UINT32, 18 }, - { S_FIELD(LowQualityOut), STI_UINT32, 19 }, - { S_FIELD(QualityIn), STI_UINT32, 20 }, - { S_FIELD(QualityOut), STI_UINT32, 21 }, - { S_FIELD(StampEscrow), STI_UINT32, 22 }, - { S_FIELD(BondAmount), STI_UINT32, 23 }, - { S_FIELD(LoadFee), STI_UINT32, 24 }, - - // 64-bit integers - { S_FIELD(IndexNext), STI_UINT64, 1 }, - { S_FIELD(IndexPrevious), STI_UINT64, 2 }, - { S_FIELD(BookNode), STI_UINT64, 3 }, - { S_FIELD(OwnerNode), STI_UINT64, 4 }, - { S_FIELD(BaseFee), STI_UINT64, 5 }, - - // 128-bit - { S_FIELD(PublishSize), STI_HASH128, 1 }, - { S_FIELD(EmailHash), STI_HASH128, 2 }, - - // 256-bit - { S_FIELD(LedgerHash), STI_HASH256, 1 }, - { S_FIELD(ParentHash), STI_HASH256, 2 }, - { S_FIELD(TransactionHash), STI_HASH256, 3 }, - { S_FIELD(AccountHash), STI_HASH256, 4 }, - { S_FIELD(LastTxnID), STI_HASH256, 5 }, - { S_FIELD(WalletLocator), STI_HASH256, 6 }, - { S_FIELD(PublishHash), STI_HASH256, 7 }, - { S_FIELD(Nickname), STI_HASH256, 8 }, - - // currency amount - { S_FIELD(Amount), STI_AMOUNT, 1 }, - { S_FIELD(Balance), STI_AMOUNT, 2 }, - { S_FIELD(LimitAmount), STI_AMOUNT, 3 }, - { S_FIELD(TakerPays), STI_AMOUNT, 4 }, - { S_FIELD(TakerGets), STI_AMOUNT, 5 }, - { S_FIELD(LowLimit), STI_AMOUNT, 6 }, - { S_FIELD(HighLimit), STI_AMOUNT, 7 }, - { S_FIELD(MinimumOffer), STI_AMOUNT, 8 }, - - // variable length - { S_FIELD(PublicKey), STI_VL, 1 }, - { S_FIELD(MessageKey), STI_VL, 2 }, - { S_FIELD(SigningKey), STI_VL, 3 }, - { S_FIELD(Signature), STI_VL, 4 }, - { S_FIELD(Generator), STI_VL, 5 }, - { S_FIELD(Domain), STI_VL, 6 }, - - // account - { S_FIELD(Account), STI_ACCOUNT, 1 }, - { S_FIELD(Owner), STI_ACCOUNT, 2 }, - { S_FIELD(Destination), STI_ACCOUNT, 3 }, - { S_FIELD(Issuer), STI_ACCOUNT, 4 }, - { S_FIELD(HighID), STI_ACCOUNT, 5 }, - { S_FIELD(LowID), STI_ACCOUNT, 6 }, - { S_FIELD(Target), STI_ACCOUNT, 7 }, - - // path set - { S_FIELD(Paths), STI_PATHSET, 1 }, - - // vector of 256-bit - { S_FIELD(Indexes), STI_VECTOR256, 1 }, - - // inner object - { S_FIELD(MiddleTransaction), STI_OBJECT, 1 }, - { S_FIELD(InnerTransaction), STI_OBJECT, 2 }, - // OBJECT/15 is reserved for end of object - - // array of objects - { S_FIELD(SigningAccounts), STI_ARRAY, 1 }, - // ARRAY/15 is reserved for end of array +#include "SerializeProto.h" }; + +#undef FIELD +#undef TYPE diff --git a/src/FieldNames.h b/src/FieldNames.h index 5d4979a302..af760127f6 100644 --- a/src/FieldNames.h +++ b/src/FieldNames.h @@ -10,6 +10,7 @@ struct FieldName const char *fieldName; SerializedTypeID fieldType; int fieldValue; + int fieldID; }; #endif diff --git a/src/LedgerFormats.cpp b/src/LedgerFormats.cpp index ef991c9f62..1db310a4c1 100644 --- a/src/LedgerFormats.cpp +++ b/src/LedgerFormats.cpp @@ -20,7 +20,6 @@ LedgerEntryFormat LedgerFormats[]= { S_FIELD(Domain), STI_VL, SOE_IFFLAG, 32 }, { S_FIELD(PublishHash), STI_HASH256, SOE_IFFLAG, 64 }, { S_FIELD(PublishSize), STI_UINT32, SOE_IFFLAG, 128 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x01000000 }, { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, { "Contract", ltCONTRACT, { @@ -37,7 +36,6 @@ LedgerEntryFormat LedgerFormats[]= { S_FIELD(FundCode), STI_VL, SOE_REQUIRED, 0 }, { S_FIELD(RemoveCode), STI_VL, SOE_REQUIRED, 0 }, { S_FIELD(ExpireCode), STI_VL, SOE_REQUIRED, 0 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x01000000 }, { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, { "DirectoryNode", ltDIR_NODE, { @@ -45,20 +43,17 @@ LedgerEntryFormat LedgerFormats[]= { S_FIELD(Indexes), STI_VECTOR256, SOE_REQUIRED, 0 }, { S_FIELD(IndexNext), STI_UINT64, SOE_IFFLAG, 1 }, { S_FIELD(IndexPrevious), STI_UINT64, SOE_IFFLAG, 2 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x01000000 }, { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, { "GeneratorMap", ltGENERATOR_MAP, { { S_FIELD(Flags), STI_UINT32, SOE_FLAGS, 0 }, { S_FIELD(Generator), STI_VL, SOE_REQUIRED, 0 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x01000000 }, { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, { "Nickname", ltNICKNAME, { { S_FIELD(Flags), STI_UINT32, SOE_FLAGS, 0 }, { S_FIELD(Account), STI_ACCOUNT, SOE_REQUIRED, 0 }, { S_FIELD(MinimumOffer), STI_AMOUNT, SOE_IFFLAG, 1 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x01000000 }, { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, { "Offer", ltOFFER, { @@ -73,7 +68,6 @@ LedgerEntryFormat LedgerFormats[]= { S_FIELD(LastTxnID), STI_HASH256, SOE_REQUIRED, 0 }, { S_FIELD(LastTxnSeq), STI_UINT32, SOE_REQUIRED, 0 }, { S_FIELD(Expiration), STI_UINT32, SOE_IFFLAG, 1 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x01000000 }, { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, { "RippleState", ltRIPPLE_STATE, { @@ -89,7 +83,6 @@ LedgerEntryFormat LedgerFormats[]= { S_FIELD(LowQualityOut), STI_UINT32, SOE_IFFLAG, 2 }, { S_FIELD(HighQualityIn), STI_UINT32, SOE_IFFLAG, 4 }, { S_FIELD(HighQualityOut), STI_UINT32, SOE_IFFLAG, 8 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x01000000 }, { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, { NULL, ltINVALID } diff --git a/src/SerializeProto.h b/src/SerializeProto.h new file mode 100644 index 0000000000..fc02af1d12 --- /dev/null +++ b/src/SerializeProto.h @@ -0,0 +1,125 @@ +// This is not really a header file, but it can be used as one with +// appropriate #define statements. + + // types (common) + TYPE(UINT32, 1) + TYPE(UINT64, 2) + TYPE(HASH128, 3) + TYPE(HASH256, 4) + // 5 is reserved + TYPE(AMOUNT, 6) + TYPE(VL, 7) + TYPE(ACCOUNT, 8) + // 9-13 are reserved + TYPE(OBJECT, 14) + TYPE(ARRAY, 15) + + // types (uncommon) + TYPE(UINT8, 16) + TYPE(UINT16, 17) + TYPE(HASH160, 18) + TYPE(PATHSET, 19) + TYPE(VECTOR256, 20) + + // 8-bit integers + FIELD(CloseResolution, UINT8, 1) + + // 32-bit integers (common) + FIELD(Flags, UINT32, 1) + FIELD(SourceTag, UINT32, 2) + FIELD(Sequence, UINT32, 3) + FIELD(LastTxnSeq, UINT32, 4) + FIELD(LedgerSequence, UINT32, 5) + FIELD(CloseTime, UINT32, 6) + FIELD(ParentCloseTime, UINT32, 7) + FIELD(SigningTime, UINT32, 8) + FIELD(Expiration, UINT32, 9) + FIELD(TransferRate, UINT32, 10) + FIELD(PublishSize, UINT32, 11) + + // 32-bit integers (uncommon) + FIELD(HighQualityIn, UINT32, 16) + FIELD(HighQualityOut, UINT32, 17) + FIELD(LowQualityIn, UINT32, 18) + FIELD(LowQualityOut, UINT32, 19) + FIELD(QualityIn, UINT32, 20) + FIELD(QualityOut, UINT32, 21) + FIELD(StampEscrow, UINT32, 22) + FIELD(BondAmount, UINT32, 23) + FIELD(LoadFee, UINT32, 24) + FIELD(OfferSequence, UINT32, 25) + + // 64-bit integers + FIELD(IndexNext, UINT64, 1) + FIELD(IndexPrevious, UINT64, 2) + FIELD(BookNode, UINT64, 3) + FIELD(OwnerNode, UINT64, 4) + FIELD(BaseFee, UINT64, 5) + + // 128-bit + FIELD(EmailHash, HASH128, 2) + + // 256-bit (common) + FIELD(LedgerHash, HASH256, 1) + FIELD(ParentHash, HASH256, 2) + FIELD(TransactionHash, HASH256, 3) + FIELD(AccountHash, HASH256, 4) + FIELD(LastTxnID, HASH256, 5) + FIELD(WalletLocator, HASH256, 6) + FIELD(PublishHash, HASH256, 7) + + // 256-bit (uncommon) + FIELD(BookDirectory, HASH256, 16) + FIELD(InvoiceID, HASH256, 17) + FIELD(Nickname, HASH256, 18) + + // currency amount (common) + FIELD(Amount, AMOUNT, 1) + FIELD(Balance, AMOUNT, 2) + FIELD(LimitAmount, AMOUNT, 3) + FIELD(TakerPays, AMOUNT, 4) + FIELD(TakerGets, AMOUNT, 5) + FIELD(LowLimit, AMOUNT, 6) + FIELD(HighLimit, AMOUNT, 7) + FIELD(SendMax, AMOUNT, 9) + + // current amount (uncommon) + FIELD(MinimumOffer, AMOUNT, 16) + FIELD(RippleEscrow, AMOUNT, 17) + + // variable length + FIELD(PublicKey, VL, 1) + FIELD(MessageKey, VL, 2) + FIELD(SigningKey, VL, 3) + FIELD(Signature, VL, 4) + FIELD(Generator, VL, 5) + FIELD(Domain, VL, 6) + FIELD(FundCode, VL, 7) + FIELD(RemoveCode, VL, 8) + FIELD(ExpireCode, VL, 9) + FIELD(CreateCode, VL, 10) + + // account + FIELD(Account, ACCOUNT, 1) + FIELD(Owner, ACCOUNT, 2) + FIELD(Destination, ACCOUNT, 3) + FIELD(Issuer, ACCOUNT, 4) + FIELD(HighID, ACCOUNT, 5) + FIELD(LowID, ACCOUNT, 6) + FIELD(Target, ACCOUNT, 7) + FIELD(AuthorizedKey, ACCOUNT, 8) + + // path set + FIELD(Paths, PATHSET, 1) + + // vector of 256-bit + FIELD(Indexes, VECTOR256, 1) + + // inner object + // OBJECT/1 is reserved for end of object + FIELD(MiddleTransaction, OBJECT, 2) + FIELD(InnerTransaction, OBJECT, 3) + + // array of objects + // ARRAY/1 is reserved for end of array + FIELD(SigningAccounts, ARRAY, 2) diff --git a/src/SerializedObject.h b/src/SerializedObject.h index e46bf479aa..b0e0b5e4b4 100644 --- a/src/SerializedObject.h +++ b/src/SerializedObject.h @@ -25,101 +25,11 @@ enum SOE_Field sfInvalid = -1, sfGeneric = 0, - // common fields - sfAcceptExpire, - sfAcceptRate, - sfAcceptStart, - sfAccount, - sfAccountHash, - sfAmount, - sfAuthorizedKey, - sfBalance, - sfBaseFee, - sfBondAmount, - sfBookDirectory, - sfBookNode, - sfBorrowExpire, - sfBorrowRate, - sfBorrowStart, - sfBorrower, - sfCreateCode, - sfCloseTime, - sfCloseResolution, - sfCurrency, - sfCurrencyIn, - sfCurrencyOut, - sfDestination, - sfDomain, - sfEmailHash, - sfExpiration, - sfExpireCode, - sfExtensions, - sfFirstNode, - sfFlags, - sfFundCode, - sfGenerator, - sfGeneratorID, - sfHash, - sfHighID, - sfHighLimit, - sfHighQualityIn, - sfHighQualityOut, - sfIdentifier, - sfIndexes, - sfIndexNext, - sfIndexPrevious, - sfInnerTransaction, - sfInvoiceID, - sfIssuer, - sfLastNode, - sfLastTxnID, - sfLastTxnSeq, - sfLedgerHash, - sfLedgerSequence, - sfLimitAmount, - sfLoadFee, - sfLowID, - sfLowLimit, - sfLowQualityIn, - sfLowQualityOut, - sfMessageKey, - sfMiddleTransaction, - sfMinimumOffer, - sfNextAcceptExpire, - sfNextAcceptRate, - sfNextAcceptStart, - sfNextTransitExpire, - sfNextTransitRate, - sfNextTransitStart, - sfNickname, - sfOfferSequence, - sfOwner, - sfOwnerNode, - sfParentCloseTime, - sfParentHash, - sfPaths, - sfPublicKey, - sfPublishHash, - sfPublishSize, - sfQualityIn, - sfQualityOut, - sfRemoveCode, - sfRippleEscrow, - sfSendMax, - sfSequence, - sfSignature, - sfSigningAccounts, - sfSigningKey, - sfSigningTime, - sfSourceTag, - sfStampEscrow, - sfTakerGets, - sfTakerPays, - sfTarget, - sfTransferRate, - sfTransactionHash, - sfVersion, - sfWalletLocator, +#define FIELD(name, type, index) sf##name, +#define TYPE(name, index) +#include "SerializeProto.h" +#undef FIELD +#undef TYPE // test fields sfTest1, sfTest2, sfTest3, sfTest4 diff --git a/src/TransactionFormats.cpp b/src/TransactionFormats.cpp index 542e2683c5..3ab00f7dea 100644 --- a/src/TransactionFormats.cpp +++ b/src/TransactionFormats.cpp @@ -15,7 +15,6 @@ TransactionFormat InnerTxnFormats[]= { S_FIELD(TransferRate), STI_UINT32, SOE_IFFLAG, 32 }, { S_FIELD(PublishHash), STI_HASH256, SOE_IFFLAG, 64 }, { S_FIELD(PublishSize), STI_UINT32, SOE_IFFLAG, 128 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x02000000 }, { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, { "Claim", ttCLAIM, { @@ -24,7 +23,6 @@ TransactionFormat InnerTxnFormats[]= { S_FIELD(PublicKey), STI_VL, SOE_REQUIRED, 0 }, { S_FIELD(Signature), STI_VL, SOE_REQUIRED, 0 }, { S_FIELD(SourceTag), STI_UINT32, SOE_IFFLAG, 1 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x02000000 }, { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, { "CreditSet", ttCREDIT_SET, { @@ -34,7 +32,6 @@ TransactionFormat InnerTxnFormats[]= { S_FIELD(LimitAmount), STI_AMOUNT, SOE_IFFLAG, 2 }, { S_FIELD(QualityIn), STI_UINT32, SOE_IFFLAG, 4 }, { S_FIELD(QualityOut), STI_UINT32, SOE_IFFLAG, 8 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x02000000 }, { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, /* @@ -45,7 +42,6 @@ TransactionFormat InnerTxnFormats[]= { S_FIELD(SourceTag), STI_UINT32, SOE_IFFLAG, 1 }, { S_FIELD(Destination), STI_ACCOUNT, SOE_IFFLAG, 2 }, { S_FIELD(Identifier), STI_VL, SOE_IFFLAG, 4 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x02000000 }, { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, */ @@ -55,7 +51,6 @@ TransactionFormat InnerTxnFormats[]= { S_FIELD(MinimumOffer), STI_AMOUNT, SOE_IFFLAG, 1 }, { S_FIELD(Signature), STI_VL, SOE_IFFLAG, 2 }, { S_FIELD(SourceTag), STI_UINT32, SOE_IFFLAG, 4 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x02000000 }, { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, { "OfferCreate", ttOFFER_CREATE, { @@ -64,21 +59,18 @@ TransactionFormat InnerTxnFormats[]= { S_FIELD(TakerGets), STI_AMOUNT, SOE_REQUIRED, 0 }, { S_FIELD(SourceTag), STI_UINT32, SOE_IFFLAG, 1 }, { S_FIELD(Expiration), STI_UINT32, SOE_IFFLAG, 2 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x02000000 }, { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, { "OfferCancel", ttOFFER_CANCEL, { { S_FIELD(Flags), STI_UINT32, SOE_FLAGS, 0 }, { S_FIELD(OfferSequence), STI_UINT32, SOE_REQUIRED, 0 }, { S_FIELD(SourceTag), STI_UINT32, SOE_IFFLAG, 1 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x02000000 }, { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, { "PasswordFund", ttPASSWORD_FUND, { { S_FIELD(Flags), STI_UINT32, SOE_FLAGS, 0 }, { S_FIELD(Destination), STI_ACCOUNT, SOE_REQUIRED, 0 }, { S_FIELD(SourceTag), STI_UINT32, SOE_IFFLAG, 1 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x02000000 }, { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, { "PasswordSet", ttPASSWORD_SET, { @@ -88,7 +80,6 @@ TransactionFormat InnerTxnFormats[]= { S_FIELD(PublicKey), STI_VL, SOE_REQUIRED, 0 }, { S_FIELD(Signature), STI_VL, SOE_REQUIRED, 0 }, { S_FIELD(SourceTag), STI_UINT32, SOE_IFFLAG, 1 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x02000000 }, { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, { "Payment", ttPAYMENT, { @@ -99,7 +90,6 @@ TransactionFormat InnerTxnFormats[]= { S_FIELD(Paths), STI_PATHSET, SOE_IFFLAG, 2 }, { S_FIELD(SourceTag), STI_UINT32, SOE_IFFLAG, 4 }, { S_FIELD(InvoiceID), STI_HASH256, SOE_IFFLAG, 8 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x02000000 }, { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, { "WalletAdd", ttWALLET_ADD, { @@ -109,7 +99,6 @@ TransactionFormat InnerTxnFormats[]= { S_FIELD(PublicKey), STI_VL, SOE_REQUIRED, 0 }, { S_FIELD(Signature), STI_VL, SOE_REQUIRED, 0 }, { S_FIELD(SourceTag), STI_UINT32, SOE_IFFLAG, 1 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x02000000 }, { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, { "Contract", ttCONTRACT, { @@ -122,13 +111,11 @@ TransactionFormat InnerTxnFormats[]= { S_FIELD(FundCode), STI_VL, SOE_REQUIRED, 0 }, { S_FIELD(RemoveCode), STI_VL, SOE_REQUIRED, 0 }, { S_FIELD(ExpireCode), STI_VL, SOE_REQUIRED, 0 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x02000000 }, { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, { "Contract", ttCONTRACT_REMOVE, { { S_FIELD(Flags), STI_UINT32, SOE_FLAGS, 0 }, { S_FIELD(Target), STI_ACCOUNT, SOE_REQUIRED, 0 }, - { S_FIELD(Extensions), STI_TL, SOE_IFFLAG, 0x02000000 }, { sfInvalid, NULL, STI_DONE, SOE_NEVER, -1 } } }, { NULL, ttINVALID } From 8d633bf065f85f542dc0ef97bf8daaec2a62aa37 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 24 Sep 2012 16:23:09 -0700 Subject: [PATCH 7/8] Remove a FIXME since it's fixed. --- src/SerializedObject.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/SerializedObject.h b/src/SerializedObject.h index b0e0b5e4b4..89732a063d 100644 --- a/src/SerializedObject.h +++ b/src/SerializedObject.h @@ -18,8 +18,6 @@ enum SOE_Type SOE_IFNFLAG = 3 // present if flag not set }; -// JED: seems like there would be a better way to do this -// maybe something that inherits from SerializedTransaction enum SOE_Field { sfInvalid = -1, From 19ee517d9f2a0f64d6874a6dfccbbc1b07b6e56b Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 24 Sep 2012 16:28:08 -0700 Subject: [PATCH 8/8] Neaten this up a bit. --- src/FieldNames.cpp | 2 +- src/SerializeProto.h | 30 ++++++++++++++++-------------- src/SerializedObject.h | 2 +- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/FieldNames.cpp b/src/FieldNames.cpp index 3053c2c960..a65ce1bc93 100644 --- a/src/FieldNames.cpp +++ b/src/FieldNames.cpp @@ -2,7 +2,7 @@ #include "FieldNames.h" #define FIELD(name, type, index) { sf##name, #name, STI_##type, index }, -#define TYPE(type, index) +#define TYPE(name, type, index) FieldName FieldNames[]= { diff --git a/src/SerializeProto.h b/src/SerializeProto.h index fc02af1d12..d2336e8971 100644 --- a/src/SerializeProto.h +++ b/src/SerializeProto.h @@ -2,24 +2,26 @@ // appropriate #define statements. // types (common) - TYPE(UINT32, 1) - TYPE(UINT64, 2) - TYPE(HASH128, 3) - TYPE(HASH256, 4) + TYPE("Int32", UINT32, 1) + TYPE("Int64", UINT64, 2) + TYPE("Hash128", HASH128, 3) + TYPE("Hash256", HASH256, 4) // 5 is reserved - TYPE(AMOUNT, 6) - TYPE(VL, 7) - TYPE(ACCOUNT, 8) + TYPE("Amount", AMOUNT, 6) + TYPE("VariableLength", VL, 7) + TYPE("Account", ACCOUNT, 8) // 9-13 are reserved - TYPE(OBJECT, 14) - TYPE(ARRAY, 15) + TYPE("Object", OBJECT, 14) + TYPE("Array", ARRAY, 15) // types (uncommon) - TYPE(UINT8, 16) - TYPE(UINT16, 17) - TYPE(HASH160, 18) - TYPE(PATHSET, 19) - TYPE(VECTOR256, 20) + TYPE("Int8", UINT8, 16) + TYPE("Int16", UINT16, 17) + TYPE("Hash160", HASH160, 18) + TYPE("PathSet", PATHSET, 19) + TYPE("Vector256", VECTOR256, 20) + + // 8-bit integers FIELD(CloseResolution, UINT8, 1) diff --git a/src/SerializedObject.h b/src/SerializedObject.h index 89732a063d..3ff352a793 100644 --- a/src/SerializedObject.h +++ b/src/SerializedObject.h @@ -24,7 +24,7 @@ enum SOE_Field sfGeneric = 0, #define FIELD(name, type, index) sf##name, -#define TYPE(name, index) +#define TYPE(name, type, index) #include "SerializeProto.h" #undef FIELD #undef TYPE