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 }