From 19efa3bf9b34d05466bf2d1053a8dd8ecd32ee51 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 19 Oct 2012 11:51:44 -0700 Subject: [PATCH] Make sure we properly handle receiving our own proposals and validations. --- src/LedgerConsensus.cpp | 5 ++++- src/LedgerConsensus.h | 4 +++- src/NetworkOPs.cpp | 6 ++++++ src/Peer.cpp | 10 ++++------ src/SerializedValidation.cpp | 5 +++-- src/SerializedValidation.h | 3 ++- 6 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/LedgerConsensus.cpp b/src/LedgerConsensus.cpp index f241934ed..09b91aee7 100644 --- a/src/LedgerConsensus.cpp +++ b/src/LedgerConsensus.cpp @@ -239,6 +239,7 @@ LedgerConsensus::LedgerConsensus(const uint256& prevLCLHash, Ledger::ref previou cLog(lsINFO) << "Entering consensus process, validating"; mValidating = true; mProposing = theApp->getOPs().getOperatingMode() == NetworkOPs::omFULL; + mValPublic = NewcoinAddress::createNodePublic(mValSeed); } else { @@ -1139,9 +1140,11 @@ void LedgerConsensus::accept(SHAMap::ref set) statusChange(ripple::neACCEPTED_LEDGER, *newLCL); if (mValidating) { + uint256 signingHash; SerializedValidation::pointer v = boost::make_shared - (newLCLHash, theApp->getOPs().getValidationTimeNC(), mValSeed, mProposing); + (newLCLHash, theApp->getOPs().getValidationTimeNC(), mValSeed, mProposing, boost::ref(signingHash)); v->setTrusted(); + theApp->isNew(signingHash); // suppress it if we receive it theApp->getValidations().addValidation(v); std::vector validation = v->getSigned(); ripple::TMValidation val; diff --git a/src/LedgerConsensus.h b/src/LedgerConsensus.h index a88aee079..4ab27866b 100644 --- a/src/LedgerConsensus.h +++ b/src/LedgerConsensus.h @@ -87,7 +87,7 @@ protected: Ledger::pointer mPreviousLedger; LedgerAcquire::pointer mAcquiringLedger; LedgerProposal::pointer mOurPosition; - NewcoinAddress mValSeed; + NewcoinAddress mValSeed, mValPublic; bool mProposing, mValidating, mHaveCorrectLCL; int mCurrentMSeconds, mClosePercent, mCloseResolution; @@ -183,6 +183,8 @@ public: bool peerGaveNodes(Peer::ref peer, const uint256& setHash, const std::list& nodeIDs, const std::list< std::vector >& nodeData); + bool isOurPubKey(const NewcoinAddress &k) { return k == mValPublic; } + // test/debug void simulate(); }; diff --git a/src/NetworkOPs.cpp b/src/NetworkOPs.cpp index c5059ee6a..bdf97d4d9 100644 --- a/src/NetworkOPs.cpp +++ b/src/NetworkOPs.cpp @@ -712,6 +712,12 @@ bool NetworkOPs::recvPropose(uint32 proposeSeq, const uint256& proposeHash, cons return mMode != omFULL; } + if (mConsensus->isOurPubKey(naPeerPublic)) + { + cLog(lsTRACE) << "Received our own validation"; + return false; + } + // Is this node on our UNL? if (!theApp->getUNL().nodeInUNL(naPeerPublic)) { diff --git a/src/Peer.cpp b/src/Peer.cpp index 99558dd84..506aad80a 100644 --- a/src/Peer.cpp +++ b/src/Peer.cpp @@ -758,11 +758,9 @@ void Peer::recvValidation(ripple::TMValidation& packet) return; } -// The four #ifndef/#endif's are commented out temporarily to avoid -// an update hassle. They can be removed once all nodes are running this code -//#ifndef TRUST_NETWORK +#ifndef TRUST_NETWORK try -//#endif +#endif { Serializer s(packet.validation()); SerializerIterator sit(s); @@ -788,13 +786,13 @@ void Peer::recvValidation(ripple::TMValidation& packet) theApp->getConnectionPool().relayMessage(this, message); } } -//#ifndef TRUST_NETWORK +#ifndef TRUST_NETWORK catch (...) { cLog(lsWARNING) << "Exception processing validation"; punishPeer(PP_UNKNOWN_REQUEST); } -//#endif +#endif } void Peer::recvGetValidation(ripple::TMGetValidations& packet) diff --git a/src/SerializedValidation.cpp b/src/SerializedValidation.cpp index f95866a51..85f4048d0 100644 --- a/src/SerializedValidation.cpp +++ b/src/SerializedValidation.cpp @@ -37,7 +37,7 @@ SerializedValidation::SerializedValidation(SerializerIterator& sit, bool checkSi } SerializedValidation::SerializedValidation(const uint256& ledgerHash, uint32 signTime, - const NewcoinAddress& naSeed, bool isFull) + const NewcoinAddress& naSeed, bool isFull, uint256& signingHash) : STObject(sValidationFormat, sfValidation), mTrusted(false) { setFieldH256(sfLedgerHash, ledgerHash); @@ -52,8 +52,9 @@ SerializedValidation::SerializedValidation(const uint256& ledgerHash, uint32 sig if (!isFull) setFlag(sFullFlag); + signingHash = getSigningHash(); std::vector signature; - NewcoinAddress::createNodePrivate(naSeed).signNodePrivate(getSigningHash(), signature); + NewcoinAddress::createNodePrivate(naSeed).signNodePrivate(signingHash, signature); setFieldVL(sfSignature, signature); // XXX Check if this can fail. // if (!NewcoinAddress::createNodePrivate(naSeed).signNodePrivate(getSigningHash(), mSignature.peekValue())) diff --git a/src/SerializedValidation.h b/src/SerializedValidation.h index 9ce8fb6a2..139850edf 100644 --- a/src/SerializedValidation.h +++ b/src/SerializedValidation.h @@ -21,7 +21,8 @@ public: // These throw if the object is not valid SerializedValidation(SerializerIterator& sit, bool checkSignature = true); - SerializedValidation(const uint256& ledgerHash, uint32 signTime, const NewcoinAddress& naSeed, bool isFull); + SerializedValidation(const uint256& ledgerHash, uint32 signTime, const NewcoinAddress& naSeed, bool isFull, + uint256& signingHash); uint256 getLedgerHash() const; uint32 getSignTime() const;