From ca59a885ca9fce4b46b43276f81c2d65c00757ed Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Sun, 25 Nov 2012 10:31:33 -0800 Subject: [PATCH] Suppress metadata for unmodified nodes. Add a transaction application sequence number to txn metadat. --- src/cpp/ripple/LedgerEntrySet.cpp | 8 ++++++-- src/cpp/ripple/LedgerEntrySet.h | 2 +- src/cpp/ripple/SerializeProto.h | 1 + src/cpp/ripple/TransactionEngine.cpp | 2 +- src/cpp/ripple/TransactionEngine.h | 5 +++-- src/cpp/ripple/TransactionMeta.cpp | 5 ++++- src/cpp/ripple/TransactionMeta.h | 9 ++++++--- 7 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/cpp/ripple/LedgerEntrySet.cpp b/src/cpp/ripple/LedgerEntrySet.cpp index 034bb696a6..6c5482d400 100644 --- a/src/cpp/ripple/LedgerEntrySet.cpp +++ b/src/cpp/ripple/LedgerEntrySet.cpp @@ -359,7 +359,7 @@ bool LedgerEntrySet::threadOwners(SLE::ref node, Ledger::ref ledger, return false; } -void LedgerEntrySet::calcRawMeta(Serializer& s, TER result) +void LedgerEntrySet::calcRawMeta(Serializer& s, TER result, uint32 index) { // calculate the raw meta data and return it. This must be called before the set is committed // Entries modified only as a result of building the transaction metadata @@ -402,6 +402,10 @@ void LedgerEntrySet::calcRawMeta(Serializer& s, TER result) SLE::pointer origNode = mLedger->getSLE(it.first); SLE::pointer curNode = it.second.mEntry; + + if ((type == &sfCreatedNode) && (*curNode == *origNode)) + continue; + uint16 nodeType = curNode ? curNode->getFieldU16(sfLedgerEntryType) : origNode->getFieldU16(sfLedgerEntryType); mSet.setAffectedNode(it.first, *type, nodeType); @@ -478,7 +482,7 @@ void LedgerEntrySet::calcRawMeta(Serializer& s, TER result) BOOST_FOREACH(u256_sle_pair& it, newMod) entryModify(it.second); - mSet.addRaw(s, result); + mSet.addRaw(s, result, index); cLog(lsTRACE) << "Metadata:" << mSet.getJson(0); } diff --git a/src/cpp/ripple/LedgerEntrySet.h b/src/cpp/ripple/LedgerEntrySet.h index ac09488b30..754b31a586 100644 --- a/src/cpp/ripple/LedgerEntrySet.h +++ b/src/cpp/ripple/LedgerEntrySet.h @@ -124,7 +124,7 @@ public: STAmount accountFunds(const uint160& uAccountID, const STAmount& saDefault); Json::Value getJson(int) const; - void calcRawMeta(Serializer&, TER result); + void calcRawMeta(Serializer&, TER result, uint32 index); // iterator functions typedef std::map::iterator iterator; diff --git a/src/cpp/ripple/SerializeProto.h b/src/cpp/ripple/SerializeProto.h index 92da4ecf2a..006abd0282 100644 --- a/src/cpp/ripple/SerializeProto.h +++ b/src/cpp/ripple/SerializeProto.h @@ -57,6 +57,7 @@ FIELD(OfferSequence, UINT32, 25) FIELD(FirstLedgerSequence, UINT32, 26) FIELD(LastLedgerSequence, UINT32, 27) + FIELD(TransactionIndex, UINT32, 28) // 64-bit integers FIELD(IndexNext, UINT64, 1) diff --git a/src/cpp/ripple/TransactionEngine.cpp b/src/cpp/ripple/TransactionEngine.cpp index 58547a03b5..a506c8d49d 100644 --- a/src/cpp/ripple/TransactionEngine.cpp +++ b/src/cpp/ripple/TransactionEngine.cpp @@ -119,7 +119,7 @@ TER TransactionEngine::applyTransaction(const SerializedTransaction& txn, Transa { // Transaction succeeded fully or (retries are not allowed and the transaction succeeded partially). Serializer m; - mNodes.calcRawMeta(m, terResult); + mNodes.calcRawMeta(m, terResult, mTxnSeq++); txnWrite(); diff --git a/src/cpp/ripple/TransactionEngine.h b/src/cpp/ripple/TransactionEngine.h index 1ddbb6dfef..0139c42918 100644 --- a/src/cpp/ripple/TransactionEngine.h +++ b/src/cpp/ripple/TransactionEngine.h @@ -56,6 +56,7 @@ private: protected: Ledger::pointer mLedger; + int mTxnSeq; uint160 mTxnAccountID; SLE::pointer mTxnAccount; @@ -65,8 +66,8 @@ protected: public: typedef boost::shared_ptr pointer; - TransactionEngine() { ; } - TransactionEngine(Ledger::ref ledger) : mLedger(ledger) { assert(mLedger); } + TransactionEngine() : mTxnSeq(0) { ; } + TransactionEngine(Ledger::ref ledger) : mLedger(ledger), mTxnSeq(0) { assert(mLedger); } LedgerEntrySet& getNodes() { return mNodes; } Ledger::pointer getLedger() { return mLedger; } diff --git a/src/cpp/ripple/TransactionMeta.cpp b/src/cpp/ripple/TransactionMeta.cpp index 3f606e1467..d3c7f06a12 100644 --- a/src/cpp/ripple/TransactionMeta.cpp +++ b/src/cpp/ripple/TransactionMeta.cpp @@ -20,6 +20,7 @@ TransactionMetaSet::TransactionMetaSet(const uint256& txid, uint32 ledger, const throw std::runtime_error("bad metadata"); mResult = obj->getFieldU8(sfTransactionResult); + mIndex = obj->getFieldU32(sfTransactionIndex); mNodes = * dynamic_cast(&obj->getField(sfAffectedNodes)); } @@ -155,13 +156,15 @@ STObject TransactionMetaSet::getAsObject() const STObject metaData(sfTransactionMetaData); assert(mResult != 255); metaData.setFieldU8(sfTransactionResult, mResult); + metaData.setFieldU32(sfTransactionIndex, mIndex); metaData.addObject(mNodes); return metaData; } -void TransactionMetaSet::addRaw(Serializer& s, TER result) +void TransactionMetaSet::addRaw(Serializer& s, TER result, uint32 index) { mResult = static_cast(result); + mIndex = index; assert((mResult == 0) || ((mResult > 100) && (mResult <= 255))); mNodes.sort(compare); diff --git a/src/cpp/ripple/TransactionMeta.h b/src/cpp/ripple/TransactionMeta.h index 8ec2c12c8c..3b8ae25e3f 100644 --- a/src/cpp/ripple/TransactionMeta.h +++ b/src/cpp/ripple/TransactionMeta.h @@ -23,13 +23,15 @@ public: protected: uint256 mTransactionID; uint32 mLedger; + uint32 mIndex; int mResult; STArray mNodes; public: - TransactionMetaSet() : mLedger(0), mResult(255) { ; } - TransactionMetaSet(const uint256& txID, uint32 ledger) : mTransactionID(txID), mLedger(ledger), mResult(255) { ; } + TransactionMetaSet() : mLedger(0), mIndex(static_cast(-1)), mResult(255) { ; } + TransactionMetaSet(const uint256& txID, uint32 ledger, uint32 index) : + mTransactionID(txID), mLedger(ledger), mIndex(static_cast(-1)), mResult(255) { ; } TransactionMetaSet(const uint256& txID, uint32 ledger, const std::vector&); void init(const uint256& transactionID, uint32 ledger); @@ -40,6 +42,7 @@ public: uint32 getLgrSeq() { return mLedger; } int getResult() const { return mResult; } TER getResultTER() const { return static_cast(mResult); } + uint32 getIndex() const { return mIndex; } bool isNodeAffected(const uint256&) const; void setAffectedNode(const uint256&, SField::ref type, uint16 nodeType); @@ -50,7 +53,7 @@ public: Json::Value getJson(int p) const { return getAsObject().getJson(p); } - void addRaw(Serializer&, TER); + void addRaw(Serializer&, TER, uint32 index); STObject getAsObject() const;