From 879c0d6b7822e00eae8ea4e5427b65c53be553f9 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 11 Mar 2014 20:29:38 -0700 Subject: [PATCH] Be less promiscuous relaying proposals --- src/ripple_app/ledger/LedgerProposal.cpp | 28 +++++++++++++++++++++-- src/ripple_app/ledger/LedgerProposal.h | 10 +++++++- src/ripple_app/misc/NetworkOPs.cpp | 12 ++++++---- src/ripple_overlay/impl/PeerImp.h | 29 ++++++++++-------------- 4 files changed, 54 insertions(+), 25 deletions(-) diff --git a/src/ripple_app/ledger/LedgerProposal.cpp b/src/ripple_app/ledger/LedgerProposal.cpp index b89647a47..e80bfc3fb 100644 --- a/src/ripple_app/ledger/LedgerProposal.cpp +++ b/src/ripple_app/ledger/LedgerProposal.cpp @@ -36,8 +36,8 @@ LedgerProposal::LedgerProposal (const RippleAddress& naPub, const RippleAddress& mPreviousLedger (prevLgr), mCurrentHash (position), mCloseTime (closeTime), mProposeSeq (0), mPublicKey (naPub), mPrivateKey (naPriv) { - mPeerID = mPublicKey.getNodeID (); - mTime = boost::posix_time::second_clock::universal_time (); + mPeerID = mPublicKey.getNodeID (); + mTime = boost::posix_time::second_clock::universal_time (); } LedgerProposal::LedgerProposal (uint256 const& prevLgr, uint256 const& position, uint32 closeTime) : @@ -59,6 +59,27 @@ uint256 LedgerProposal::getSigningHash () const return s.getSHA512Half (); } +// Compute a unique identifier for this signed proposal +uint256 LedgerProposal::computeSuppressionID ( + uint256 const& proposeHash, + uint256 const& previousLedger, + uint32 proposeSeq, + uint32 closeTime, + Blob const& pubKey, + Blob const& signature) +{ + + Serializer s (512); + s.add256 (proposeHash); + s.add256 (previousLedger); + s.add32 (proposeSeq); + s.add32 (closeTime); + s.addVL (pubKey); + s.addVL (signature); + + return s.getSHA512Half (); +} + bool LedgerProposal::checkSign (const std::string& signature, uint256 const& signingHash) { return mPublicKey.verifyNodePublic (signingHash, signature, ECDSA::not_strict); @@ -91,6 +112,9 @@ Blob LedgerProposal::sign (void) // if (!mPrivateKey.signNodePrivate(getSigningHash(), ret)) // throw std::runtime_error("unable to sign proposal"); + mSuppression = computeSuppressionID (mCurrentHash, mPreviousLedger, mProposeSeq, + mCloseTime, mPublicKey.getNodePublic (), ret); + return ret; } diff --git a/src/ripple_app/ledger/LedgerProposal.h b/src/ripple_app/ledger/LedgerProposal.h index 816e75b48..55fff43ee 100644 --- a/src/ripple_app/ledger/LedgerProposal.h +++ b/src/ripple_app/ledger/LedgerProposal.h @@ -65,7 +65,7 @@ public: { return mPreviousLedger; } - uint256 const& getHashRouter () const + uint256 const& getSuppressionID () const { return mSuppression; } @@ -121,6 +121,14 @@ public: void bowOut (); Json::Value getJson () const; + static uint256 computeSuppressionID ( + uint256 const& proposeHash, + uint256 const& previousLedger, + uint32 proposeSeq, + uint32 closeTime, + Blob const& pubKey, + Blob const& signature); + private: uint256 mPreviousLedger, mCurrentHash, mSuppression; uint32 mCloseTime, mProposeSeq; diff --git a/src/ripple_app/misc/NetworkOPs.cpp b/src/ripple_app/misc/NetworkOPs.cpp index 1464f5a09..f2222a266 100644 --- a/src/ripple_app/misc/NetworkOPs.cpp +++ b/src/ripple_app/misc/NetworkOPs.cpp @@ -1505,11 +1505,13 @@ void NetworkOPsImp::processTrustedProposal (LedgerProposal::pointer proposal, if (relay) { std::set peers; - getApp().getHashRouter ().swapSet ( - proposal->getHashRouter (), peers, SF_RELAYED); - getApp ().getPeers ().foreach (send_if_not ( - boost::make_shared (*set, protocol::mtPROPOSE_LEDGER), - peer_in_set(peers))); + if (getApp().getHashRouter ().swapSet ( + proposal->getSuppressionID (), peers, SF_RELAYED)) + { + getApp ().getPeers ().foreach (send_if_not ( + boost::make_shared (*set, protocol::mtPROPOSE_LEDGER), + peer_in_set(peers))); + } } else { diff --git a/src/ripple_overlay/impl/PeerImp.h b/src/ripple_overlay/impl/PeerImp.h index af792790b..663e1db58 100644 --- a/src/ripple_overlay/impl/PeerImp.h +++ b/src/ripple_overlay/impl/PeerImp.h @@ -2020,17 +2020,10 @@ private: if (set.has_previousledger ()) memcpy (prevLedger.begin (), set.previousledger ().data (), 32); - Serializer s (512); - s.add256 (proposeHash); - s.add32 (set.proposeseq ()); - s.add32 (set.closetime ()); - s.addVL (set.nodepubkey ()); - s.addVL (set.signature ()); - - if (set.has_previousledger ()) - s.add256 (prevLedger); - - uint256 suppression = s.getSHA512Half (); + uint256 suppression = LedgerProposal::computeSuppressionID (proposeHash, prevLedger, + set.proposeseq(), set.closetime (), + Blob(set.nodepubkey ().begin (), set.nodepubkey ().end ()), + Blob(set.signature ().begin (), set.signature ().end ())); if (! getApp().getHashRouter ().addSuppressionPeer (suppression, m_shortId)) { @@ -2695,12 +2688,14 @@ private: // relay untrusted proposal WriteLog(lsTRACE, Peer) << "relaying UNTRUSTED proposal"; std::set peers; - getApp().getHashRouter ().swapSet ( - proposal->getHashRouter (), peers, SF_RELAYED); - - pPeers->foreach (send_if_not ( - boost::make_shared (set, protocol::mtPROPOSE_LEDGER), - peer_in_set(peers))); + + if (getApp().getHashRouter ().swapSet ( + proposal->getSuppressionID (), peers, SF_RELAYED)) + { + pPeers->foreach (send_if_not ( + boost::make_shared (set, protocol::mtPROPOSE_LEDGER), + peer_in_set(peers))); + } } else {