From 66825d0e9da1124b3253006846c8b788953af288 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Sun, 4 Nov 2012 22:49:24 -0800 Subject: [PATCH] Track the suppression in the ledger proposal. --- src/LedgerProposal.h | 5 +++-- src/NetworkOPs.h | 3 +-- src/Peer.cpp | 30 ++++++++++++++++-------------- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/LedgerProposal.h b/src/LedgerProposal.h index a531de214c..b5176c7c90 100644 --- a/src/LedgerProposal.h +++ b/src/LedgerProposal.h @@ -18,7 +18,7 @@ class LedgerProposal : private IS_INSTANCE(LedgerProposal) { protected: - uint256 mPreviousLedger, mCurrentHash; + uint256 mPreviousLedger, mCurrentHash, mSuppression; uint32 mCloseTime, mProposeSeq; uint160 mPeerID; @@ -35,7 +35,7 @@ public: // proposal from peer LedgerProposal(const uint256& prevLgr, uint32 proposeSeq, const uint256& propose, - uint32 closeTime, const RippleAddress& naPeerPublic); + uint32 closeTime, const RippleAddress& naPeerPublic, const uint256& suppress); // our first proposal LedgerProposal(const RippleAddress& pubKey, const RippleAddress& privKey, @@ -52,6 +52,7 @@ public: const uint160& getPeerID() const { return mPeerID; } const uint256& getCurrentHash() const { return mCurrentHash; } const uint256& getPrevLedger() const { return mPreviousLedger; } + const uint256& getSuppression() const { return mSuppression; } uint32 getProposeSeq() const { return mProposeSeq; } uint32 getCloseTime() const { return mCloseTime; } const RippleAddress& peekPublic() const { return mPublicKey; } diff --git a/src/NetworkOPs.h b/src/NetworkOPs.h index 07b9d6cabc..6b5659b66f 100644 --- a/src/NetworkOPs.h +++ b/src/NetworkOPs.h @@ -168,8 +168,7 @@ public: const std::vector& myNode, std::list< std::vector >& newNodes); // ledger proposal/close functions - void processTrustedProposal(uint256 supression, LedgerProposal::pointer proposal, - boost::shared_ptr set, + void processTrustedProposal(LedgerProposal::pointer proposal, boost::shared_ptr set, RippleAddress nodePublic, uint256 checkLedger, bool sigGood); bool gotTXData(const boost::shared_ptr& peer, const uint256& hash, const std::list& nodeIDs, const std::list< std::vector >& nodeData); diff --git a/src/Peer.cpp b/src/Peer.cpp index 545856a0b7..89a196e796 100644 --- a/src/Peer.cpp +++ b/src/Peer.cpp @@ -776,9 +776,8 @@ void Peer::recvTransaction(ripple::TMTransaction& packet) } static void checkPropose(Job& job, boost::shared_ptr packet, - uint256 suppression, LedgerProposal::pointer proposal, uint256 consensusLCL, - RippleAddress nodePublic, boost::weak_ptr peer) -{ // FIXME: Suppress relaying proposals with incorrect LCLs + LedgerProposal::pointer proposal, uint256 consensusLCL, RippleAddress nodePublic, boost::weak_ptr peer) +{ bool sigGood = false; bool isTrusted = (job.getType() == jtPROPOSAL_t); @@ -818,16 +817,18 @@ static void checkPropose(Job& job, boost::shared_ptr packe if (isTrusted) { theApp->getIOService().post(boost::bind(&NetworkOPs::processTrustedProposal, &theApp->getOPs(), - suppression, proposal, packet, nodePublic, prevLedger, sigGood)); + proposal, packet, nodePublic, prevLedger, sigGood)); } - else - { // untrusted proposal, just relay it + else if (sigGood && (prevLedger == consensusLCL)) + { // relay untrusted proposal cLog(lsTRACE) << "relaying untrusted proposal"; - std::set peers; - theApp->getSuppression().swapSet(suppression, peers, SF_RELAYED); + std::set peers; + theApp->getSuppression().swapSet(proposal->getSuppression(), peers, SF_RELAYED); PackedMessage::pointer message = boost::make_shared(set, ripple::mtPROPOSE_LEDGER); theApp->getConnectionPool().relayMessageBut(peers, message); } + else + cLog(lsDEBUG) << "Not relaying untrusted proposal"; } void Peer::recvPropose(const boost::shared_ptr& packet) @@ -839,19 +840,20 @@ void Peer::recvPropose(const boost::shared_ptr& packet) (set.signature().size() < 56) || (set.nodepubkey().size() > 128) || (set.signature().size() > 128)) { cLog(lsWARNING) << "Received proposal is malformed"; + punishPeer(PP_INVALID_REQUEST); return; } if (set.has_previousledger() && (set.previousledger().size() != 32)) { cLog(lsWARNING) << "Received proposal is malformed"; + punishPeer(PP_INVALID_REQUEST); return; } uint256 proposeHash, prevLedger; memcpy(proposeHash.begin(), set.currenttxhash().data(), 32); - - if ((set.has_previousledger()) && (set.previousledger().size() == 32)) + if (set.has_previousledger()) memcpy(prevLedger.begin(), set.previousledger().data(), 32); Serializer s(512); @@ -882,10 +884,10 @@ void Peer::recvPropose(const boost::shared_ptr& packet) uint256 consensusLCL = theApp->getOPs().getConsensusLCL(); LedgerProposal::pointer proposal = boost::make_shared( prevLedger.isNonZero() ? prevLedger : consensusLCL, - set.proposeseq(), proposeHash, set.closetime(), signerPublic); + set.proposeseq(), proposeHash, set.closetime(), signerPublic, suppression); theApp->getJobQueue().addJob(isTrusted ? jtPROPOSAL_t : jtPROPOSAL_ut, - boost::bind(&checkPropose, _1, packet, suppression, proposal, consensusLCL, + boost::bind(&checkPropose, _1, packet, proposal, consensusLCL, mNodePublic, boost::weak_ptr(shared_from_this()))); } @@ -1157,7 +1159,7 @@ void Peer::recvGetLedger(ripple::TMGetLedger& packet) reply.set_requestcookie(packet.requestcookie()); if (packet.itype() == ripple::liTS_CANDIDATE) - { // Request is for a transaction candidate set + { // Request is for a transaction candidate set cLog(lsINFO) << "Received request for TX candidate set data " << getIP(); if ((!packet.has_ledgerhash() || packet.ledgerhash().size() != 32)) { @@ -1488,7 +1490,7 @@ Json::Value Peer::getJson() if (mHello.has_protoversion() && (mHello.protoversion() != MAKE_VERSION_INT(PROTO_VERSION_MAJOR, PROTO_VERSION_MINOR))) - ret["protocol"] = boost::lexical_cast(GET_VERSION_MAJOR(mHello.protoversion())) + "." + + ret["protocol"] = boost::lexical_cast(GET_VERSION_MAJOR(mHello.protoversion())) + "." + boost::lexical_cast(GET_VERSION_MINOR(mHello.protoversion())); if (!!mClosedLedgerHash)