mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-19 18:45:52 +00:00
Be less promiscuous relaying proposals
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user