Skip to content

Commit f1c6d17

Browse files
committed
refactor: remove dependency of chainlocks on PeerManager
1 parent 5383421 commit f1c6d17

File tree

6 files changed

+32
-47
lines changed

6 files changed

+32
-47
lines changed

src/llmq/chainlocks.cpp

Lines changed: 10 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
#include <chainparams.h>
1212
#include <consensus/validation.h>
1313
#include <masternode/sync.h>
14-
#include <net_processing.h>
1514
#include <node/blockstorage.h>
1615
#include <node/ui_interface.h>
1716
#include <scheduler.h>
@@ -34,19 +33,18 @@ std::unique_ptr<CChainLocksHandler> chainLocksHandler;
3433

3534
CChainLocksHandler::CChainLocksHandler(CChainState& chainstate, CQuorumManager& _qman, CSigningManager& _sigman,
3635
CSigSharesManager& _shareman, CSporkManager& sporkman, CTxMemPool& _mempool,
37-
const CMasternodeSync& mn_sync, const std::unique_ptr<PeerManager>& peerman,
38-
bool is_masternode) :
36+
const CMasternodeSync& mn_sync, bool is_masternode) :
3937
m_chainstate(chainstate),
4038
qman(_qman),
4139
sigman(_sigman),
4240
shareman(_shareman),
4341
spork_manager(sporkman),
4442
mempool(_mempool),
4543
m_mn_sync(mn_sync),
46-
m_peerman(peerman),
4744
m_is_masternode{is_masternode},
4845
scheduler(std::make_unique<CScheduler>()),
49-
scheduler_thread(std::make_unique<std::thread>(std::thread(util::TraceThread, "cl-schdlr", [&] { scheduler->serviceQueue(); })))
46+
scheduler_thread(
47+
std::make_unique<std::thread>(std::thread(util::TraceThread, "cl-schdlr", [&] { scheduler->serviceQueue(); })))
5048
{
5149
}
5250

@@ -98,31 +96,11 @@ CChainLockSig CChainLocksHandler::GetBestChainLock() const
9896
return bestChainLock;
9997
}
10098

101-
PeerMsgRet CChainLocksHandler::ProcessMessage(const CNode& pfrom, const std::string& msg_type, CDataStream& vRecv)
102-
{
103-
if (!AreChainLocksEnabled(spork_manager)) {
104-
return {};
105-
}
106-
107-
if (msg_type == NetMsgType::CLSIG) {
108-
CChainLockSig clsig;
109-
vRecv >> clsig;
110-
111-
return ProcessNewChainLock(pfrom.GetId(), clsig, ::SerializeHash(clsig));
112-
}
113-
return {};
114-
}
115-
116-
PeerMsgRet CChainLocksHandler::ProcessNewChainLock(const NodeId from, const llmq::CChainLockSig& clsig, const uint256& hash)
99+
MessageProcessingResult CChainLocksHandler::ProcessNewChainLock(const NodeId from, const llmq::CChainLockSig& clsig,
100+
const uint256& hash)
117101
{
118102
CheckActiveState();
119103

120-
CInv clsigInv(MSG_CLSIG, hash);
121-
122-
if (from != -1) {
123-
WITH_LOCK(::cs_main, Assert(m_peerman)->EraseObjectRequest(from, clsigInv));
124-
}
125-
126104
{
127105
LOCK(cs);
128106
if (!seenChainLocks.emplace(hash, GetTimeMillis()).second) {
@@ -138,7 +116,7 @@ PeerMsgRet CChainLocksHandler::ProcessNewChainLock(const NodeId from, const llmq
138116
if (const auto ret = VerifyChainLock(clsig); ret != VerifyRecSigStatus::Valid) {
139117
LogPrint(BCLog::CHAINLOCKS, "CChainLocksHandler::%s -- invalid CLSIG (%s), status=%d peer=%d\n", __func__, clsig.ToString(), ToUnderlying(ret), from);
140118
if (from != -1) {
141-
return tl::unexpected{10};
119+
return MisbehavingError{10};
142120
}
143121
return {};
144122
}
@@ -167,14 +145,12 @@ PeerMsgRet CChainLocksHandler::ProcessNewChainLock(const NodeId from, const llmq
167145
// Note: make sure to still relay clsig further.
168146
}
169147

170-
// Note: do not hold cs while calling RelayInv
171-
AssertLockNotHeld(cs);
172-
Assert(m_peerman)->RelayInv(clsigInv);
148+
CInv clsigInv(MSG_CLSIG, hash);
173149

174150
if (pindex == nullptr) {
175151
// we don't know the block/header for this CLSIG yet, so bail out for now
176152
// when the block or the header later comes in, we will enforce the correct chain
177-
return {};
153+
return clsigInv;
178154
}
179155

180156
scheduler->scheduleFromNow([&]() {
@@ -184,7 +160,7 @@ PeerMsgRet CChainLocksHandler::ProcessNewChainLock(const NodeId from, const llmq
184160

185161
LogPrint(BCLog::CHAINLOCKS, "CChainLocksHandler::%s -- processed new CLSIG (%s), peer=%d\n",
186162
__func__, clsig.ToString(), from);
187-
return {};
163+
return clsigInv;
188164
}
189165

190166
void CChainLocksHandler::AcceptedBlockHeader(gsl::not_null<const CBlockIndex*> pindexNew)
@@ -547,8 +523,7 @@ MessageProcessingResult CChainLocksHandler::HandleNewRecoveredSig(const llmq::CR
547523

548524
clsig = CChainLockSig(lastSignedHeight, lastSignedMsgHash, recoveredSig.sig.Get());
549525
}
550-
ProcessNewChainLock(-1, clsig, ::SerializeHash(clsig));
551-
return {};
526+
return ProcessNewChainLock(-1, clsig, ::SerializeHash(clsig));
552527
}
553528

554529
bool CChainLocksHandler::HasChainLock(int nHeight, const uint256& blockHash) const

src/llmq/chainlocks.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ class CMasternodeSync;
2929
class CScheduler;
3030
class CSporkManager;
3131
class CTxMemPool;
32-
class PeerManager;
3332

3433
namespace llmq
3534
{
@@ -53,7 +52,6 @@ class CChainLocksHandler : public CRecoveredSigsListener
5352
CSporkManager& spork_manager;
5453
CTxMemPool& mempool;
5554
const CMasternodeSync& m_mn_sync;
56-
const std::unique_ptr<PeerManager>& m_peerman;
5755

5856
const bool m_is_masternode;
5957
std::unique_ptr<CScheduler> scheduler;
@@ -89,8 +87,7 @@ class CChainLocksHandler : public CRecoveredSigsListener
8987
public:
9088
explicit CChainLocksHandler(CChainState& chainstate, CQuorumManager& _qman, CSigningManager& _sigman,
9189
CSigSharesManager& _shareman, CSporkManager& sporkman, CTxMemPool& _mempool,
92-
const CMasternodeSync& mn_sync, const std::unique_ptr<PeerManager>& peerman,
93-
bool is_masternode);
90+
const CMasternodeSync& mn_sync, bool is_masternode);
9491
~CChainLocksHandler();
9592

9693
void Start();
@@ -100,8 +97,8 @@ class CChainLocksHandler : public CRecoveredSigsListener
10097
bool GetChainLockByHash(const uint256& hash, CChainLockSig& ret) const EXCLUSIVE_LOCKS_REQUIRED(!cs);
10198
CChainLockSig GetBestChainLock() const EXCLUSIVE_LOCKS_REQUIRED(!cs);
10299

103-
PeerMsgRet ProcessMessage(const CNode& pfrom, const std::string& msg_type, CDataStream& vRecv) EXCLUSIVE_LOCKS_REQUIRED(!cs);
104-
PeerMsgRet ProcessNewChainLock(NodeId from, const CChainLockSig& clsig, const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(!cs);
100+
[[nodiscard]] MessageProcessingResult ProcessNewChainLock(NodeId from, const CChainLockSig& clsig,
101+
const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(!cs);
105102

106103
void AcceptedBlockHeader(gsl::not_null<const CBlockIndex*> pindexNew) EXCLUSIVE_LOCKS_REQUIRED(!cs);
107104
void UpdatedBlockTip();
@@ -111,7 +108,8 @@ class CChainLocksHandler : public CRecoveredSigsListener
111108
void CheckActiveState() EXCLUSIVE_LOCKS_REQUIRED(!cs);
112109
void TrySignChainTip() EXCLUSIVE_LOCKS_REQUIRED(!cs);
113110
void EnforceBestChainLock() EXCLUSIVE_LOCKS_REQUIRED(!cs);
114-
[[nodiscard]] MessageProcessingResult HandleNewRecoveredSig(const CRecoveredSig& recoveredSig) override EXCLUSIVE_LOCKS_REQUIRED(!cs);
111+
[[nodiscard]] MessageProcessingResult HandleNewRecoveredSig(const CRecoveredSig& recoveredSig) override
112+
EXCLUSIVE_LOCKS_REQUIRED(!cs);
115113

116114
bool HasChainLock(int nHeight, const uint256& blockHash) const EXCLUSIVE_LOCKS_REQUIRED(!cs);
117115
bool HasConflictingChainLock(int nHeight, const uint256& blockHash) const EXCLUSIVE_LOCKS_REQUIRED(!cs);

src/llmq/context.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ LLMQContext::LLMQContext(CChainState& chainstate, CConnman& connman, CDeterminis
3636
shareman{std::make_unique<llmq::CSigSharesManager>(connman, *sigman, mn_activeman, *qman, sporkman, peerman)},
3737
clhandler{[&]() -> llmq::CChainLocksHandler* const {
3838
assert(llmq::chainLocksHandler == nullptr);
39-
llmq::chainLocksHandler = std::make_unique<llmq::CChainLocksHandler>(chainstate, *qman, *sigman, *shareman, sporkman, mempool, mn_sync, peerman, is_masternode);
39+
llmq::chainLocksHandler = std::make_unique<llmq::CChainLocksHandler>(chainstate, *qman, *sigman, *shareman, sporkman, mempool, mn_sync, is_masternode);
4040
return llmq::chainLocksHandler.get();
4141
}()},
4242
isman{[&]() -> llmq::CInstantSendManager* const {

src/net_processing.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4999,7 +4999,18 @@ void PeerManagerImpl::ProcessMessage(
49994999
ProcessPeerMsgRet(m_llmq_ctx->qman->ProcessMessage(pfrom, msg_type, vRecv), pfrom);
50005000
m_llmq_ctx->shareman->ProcessMessage(pfrom, m_sporkman, msg_type, vRecv);
50015001
ProcessPeerMsgRet(m_llmq_ctx->sigman->ProcessMessage(pfrom, msg_type, vRecv), pfrom);
5002-
ProcessPeerMsgRet(m_llmq_ctx->clhandler->ProcessMessage(pfrom, msg_type, vRecv), pfrom);
5002+
5003+
if (msg_type == NetMsgType::CLSIG) {
5004+
if (llmq::AreChainLocksEnabled(m_sporkman)) {
5005+
llmq::CChainLockSig clsig;
5006+
vRecv >> clsig;
5007+
const uint256& hash = ::SerializeHash(clsig);
5008+
WITH_LOCK(::cs_main, EraseObjectRequest(pfrom.GetId(), CInv{MSG_CLSIG, hash}));
5009+
PostProcessMessage(m_llmq_ctx->clhandler->ProcessNewChainLock(pfrom.GetId(), clsig, hash), pfrom.GetId());
5010+
}
5011+
return; // CLSIG
5012+
}
5013+
50035014
ProcessPeerMsgRet(m_llmq_ctx->isman->ProcessMessage(pfrom, msg_type, vRecv), pfrom);
50045015
return;
50055016
}

src/rpc/quorums.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <chainparams.h>
66
#include <deploymentstatus.h>
77
#include <index/txindex.h>
8+
#include <net_processing.h>
89
#include <node/context.h>
910
#include <rpc/blockchain.h>
1011
#include <rpc/server.h>
@@ -1121,7 +1122,8 @@ static RPCHelpMan submitchainlock()
11211122
throw JSONRPCError(RPC_INVALID_PARAMETER, "invalid signature");
11221123
}
11231124

1124-
llmq_ctx.clhandler->ProcessNewChainLock(-1, clsig, ::SerializeHash(clsig));
1125+
PeerManager& peerman = EnsurePeerman(node);
1126+
peerman.PostProcessMessage(llmq_ctx.clhandler->ProcessNewChainLock(-1, clsig, ::SerializeHash(clsig)));
11251127
return llmq_ctx.clhandler->GetBestChainLock().getHeight();
11261128
},
11271129
};

test/lint/lint-circular-dependencies.sh

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,12 @@ EXPECTED_CIRCULAR_DEPENDENCIES=(
9090
"coinjoin/server -> net_processing -> coinjoin/server"
9191
"llmq/context -> llmq/ehf_signals -> net_processing -> llmq/context"
9292
"llmq/blockprocessor -> net_processing -> llmq/blockprocessor"
93-
"llmq/chainlocks -> net_processing -> llmq/chainlocks"
93+
"llmq/chainlocks -> llmq/instantsend -> net_processing -> llmq/chainlocks"
9494
"net_processing -> spork -> net_processing"
9595
"evo/simplifiedmns -> llmq/blockprocessor -> net_processing -> evo/simplifiedmns"
9696
"governance/governance -> net_processing -> governance/governance"
9797
"llmq/blockprocessor -> net_processing -> llmq/context -> llmq/blockprocessor"
9898
"llmq/blockprocessor -> net_processing -> llmq/quorums -> llmq/blockprocessor"
99-
"llmq/chainlocks -> net_processing -> llmq/context -> llmq/chainlocks"
10099
"rpc/blockchain -> rpc/server -> rpc/blockchain"
101100
)
102101

0 commit comments

Comments
 (0)