diff --git a/src/ripple/overlay/impl/PeerImp.cpp b/src/ripple/overlay/impl/PeerImp.cpp index a6d7b91bce..6fa5c0ba4a 100644 --- a/src/ripple/overlay/impl/PeerImp.cpp +++ b/src/ripple/overlay/impl/PeerImp.cpp @@ -1043,22 +1043,15 @@ PeerImp::onMessage (std::shared_ptr const& m) p_journal_.trace << "Proposal: " << (isTrusted ? "trusted" : "UNTRUSTED"); - uint256 consensusLCL; - - { - Application::ScopedLockType lock (getApp ().getMasterLock ()); - consensusLCL = getApp().getOPs ().getConsensusLCL (); - } - LedgerProposal::pointer proposal = std::make_shared ( - prevLedger.isNonZero () ? prevLedger : consensusLCL, + prevLedger.isNonZero () ? prevLedger : uint256(), set.proposeseq (), proposeHash, set.closetime (), signerPublic, suppression); getApp().getJobQueue ().addJob (isTrusted ? jtPROPOSAL_t : jtPROPOSAL_ut, "recvPropose->checkPropose", std::bind(beast::weak_fn( &PeerImp::checkPropose, shared_from_this()), std::placeholders::_1, - m, proposal, consensusLCL)); + m, proposal)); } void @@ -1470,7 +1463,7 @@ PeerImp::checkTransaction (Job&, int flags, void PeerImp::checkPropose (Job& job, std::shared_ptr const& packet, - LedgerProposal::pointer proposal, uint256 consensusLCL) + LedgerProposal::pointer proposal) { bool sigGood = false; bool isTrusted = (job.getType () == jtPROPOSAL_t); @@ -1481,14 +1474,22 @@ PeerImp::checkPropose (Job& job, assert (packet); protocol::TMProposeSet& set = *packet; - uint256 prevLedger; + uint256 consensusLCL; + if (! set.has_previousledger() || ! isTrusted) + { + Application::ScopedLockType lock (getApp ().getMasterLock ()); + consensusLCL = getApp().getOPs ().getConsensusLCL (); + } + + uint256 prevLedger; if (set.has_previousledger ()) { // proposal includes a previous ledger p_journal_.trace << "proposal with previous ledger"; memcpy (prevLedger.begin (), set.previousledger ().data (), 256 / 8); + proposal->setPrevLedger (prevLedger); if (! cluster() && !proposal->checkSign (set.signature ())) { @@ -1502,6 +1503,7 @@ PeerImp::checkPropose (Job& job, } else { + proposal->setPrevLedger (consensusLCL); if (consensusLCL.isNonZero () && proposal->checkSign (set.signature ())) { prevLedger = consensusLCL; diff --git a/src/ripple/overlay/impl/PeerImp.h b/src/ripple/overlay/impl/PeerImp.h index 317fcfbc81..9193e0d527 100644 --- a/src/ripple/overlay/impl/PeerImp.h +++ b/src/ripple/overlay/impl/PeerImp.h @@ -405,7 +405,7 @@ private: void checkPropose (Job& job, std::shared_ptr const& packet, - LedgerProposal::pointer proposal, uint256 consensusLCL); + LedgerProposal::pointer proposal); void checkValidation (Job&, STValidation::pointer val,