Be less promiscuous relaying proposals

This commit is contained in:
JoelKatz
2014-03-11 20:29:38 -07:00
committed by Nik Bougalis
parent 2e8df429df
commit 879c0d6b78
4 changed files with 54 additions and 25 deletions

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -1505,11 +1505,13 @@ void NetworkOPsImp::processTrustedProposal (LedgerProposal::pointer proposal,
if (relay)
{
std::set<Peer::ShortId> peers;
getApp().getHashRouter ().swapSet (
proposal->getHashRouter (), peers, SF_RELAYED);
getApp ().getPeers ().foreach (send_if_not (
boost::make_shared<PackedMessage> (*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<PackedMessage> (*set, protocol::mtPROPOSE_LEDGER),
peer_in_set(peers)));
}
}
else
{

View File

@@ -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<Peer::ShortId> peers;
getApp().getHashRouter ().swapSet (
proposal->getHashRouter (), peers, SF_RELAYED);
pPeers->foreach (send_if_not (
boost::make_shared<PackedMessage> (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<PackedMessage> (set, protocol::mtPROPOSE_LEDGER),
peer_in_set(peers)));
}
}
else
{