18
18
19
19
void CMNAuth::PushMNAUTH (CNode* pnode, CConnman& connman)
20
20
{
21
+ LOCK (activeMasternodeInfoCs);
21
22
if (!fMasternodeMode || activeMasternodeInfo.proTxHash .IsNull ()) {
22
23
return ;
23
24
}
24
25
25
26
uint256 signHash;
26
- {
27
- LOCK (pnode->cs_mnauth );
28
- if (pnode->receivedMNAuthChallenge .IsNull ()) {
29
- return ;
30
- }
31
- // We include fInbound in signHash to forbid interchanging of challenges by a man in the middle (MITM). This way
32
- // we protect ourselves against MITM in this form:
33
- // node1 <- Eve -> node2
34
- // It does not protect against:
35
- // node1 -> Eve -> node2
36
- // This is ok as we only use MNAUTH as a DoS protection and not for sensitive stuff
37
- int nOurNodeVersion{PROTOCOL_VERSION};
38
- if (Params ().NetworkIDString () != CBaseChainParams::MAIN && gArgs .IsArgSet (" -pushversion" )) {
39
- nOurNodeVersion = gArgs .GetArg (" -pushversion" , PROTOCOL_VERSION);
40
- }
41
- if (pnode->nVersion < MNAUTH_NODE_VER_VERSION || nOurNodeVersion < MNAUTH_NODE_VER_VERSION) {
42
- signHash = ::SerializeHash (std::make_tuple (*activeMasternodeInfo.blsPubKeyOperator , pnode->receivedMNAuthChallenge , pnode->fInbound ));
43
- } else {
44
- signHash = ::SerializeHash (std::make_tuple (*activeMasternodeInfo.blsPubKeyOperator , pnode->receivedMNAuthChallenge , pnode->fInbound , nOurNodeVersion));
45
- }
27
+ auto receivedMNAuthChallenge = pnode->GetReceivedMNAuthChallenge ();
28
+ if (receivedMNAuthChallenge.IsNull ()) {
29
+ return ;
30
+ }
31
+ // We include fInbound in signHash to forbid interchanging of challenges by a man in the middle (MITM). This way
32
+ // we protect ourselves against MITM in this form:
33
+ // node1 <- Eve -> node2
34
+ // It does not protect against:
35
+ // node1 -> Eve -> node2
36
+ // This is ok as we only use MNAUTH as a DoS protection and not for sensitive stuff
37
+ int nOurNodeVersion{PROTOCOL_VERSION};
38
+ if (Params ().NetworkIDString () != CBaseChainParams::MAIN && gArgs .IsArgSet (" -pushversion" )) {
39
+ nOurNodeVersion = gArgs .GetArg (" -pushversion" , PROTOCOL_VERSION);
40
+ }
41
+ if (pnode->nVersion < MNAUTH_NODE_VER_VERSION || nOurNodeVersion < MNAUTH_NODE_VER_VERSION) {
42
+ signHash = ::SerializeHash (std::make_tuple (*activeMasternodeInfo.blsPubKeyOperator , receivedMNAuthChallenge, pnode->fInbound ));
43
+ } else {
44
+ signHash = ::SerializeHash (std::make_tuple (*activeMasternodeInfo.blsPubKeyOperator , receivedMNAuthChallenge, pnode->fInbound , nOurNodeVersion));
46
45
}
47
46
48
47
CMNAuth mnauth;
@@ -66,11 +65,7 @@ void CMNAuth::ProcessMessage(CNode* pnode, const std::string& strCommand, CDataS
66
65
vRecv >> mnauth;
67
66
68
67
// only one MNAUTH allowed
69
- bool fAlreadyHaveMNAUTH = false ;
70
- {
71
- LOCK (pnode->cs_mnauth );
72
- fAlreadyHaveMNAUTH = !pnode->verifiedProRegTxHash .IsNull ();
73
- }
68
+ bool fAlreadyHaveMNAUTH = !pnode->GetVerifiedProRegTxHash ().IsNull ();
74
69
if (fAlreadyHaveMNAUTH ) {
75
70
LOCK (cs_main);
76
71
Misbehaving (pnode->GetId (), 100 , " duplicate mnauth" );
@@ -108,20 +103,17 @@ void CMNAuth::ProcessMessage(CNode* pnode, const std::string& strCommand, CDataS
108
103
}
109
104
110
105
uint256 signHash;
111
- {
112
- LOCK (pnode->cs_mnauth );
113
- int nOurNodeVersion{PROTOCOL_VERSION};
114
- if (Params ().NetworkIDString () != CBaseChainParams::MAIN && gArgs .IsArgSet (" -pushversion" )) {
115
- nOurNodeVersion = gArgs .GetArg (" -pushversion" , PROTOCOL_VERSION);
116
- }
117
- // See comment in PushMNAUTH (fInbound is negated here as we're on the other side of the connection)
118
- if (pnode->nVersion < MNAUTH_NODE_VER_VERSION || nOurNodeVersion < MNAUTH_NODE_VER_VERSION) {
119
- signHash = ::SerializeHash (std::make_tuple (dmn->pdmnState ->pubKeyOperator , pnode->sentMNAuthChallenge , !pnode->fInbound ));
120
- } else {
121
- signHash = ::SerializeHash (std::make_tuple (dmn->pdmnState ->pubKeyOperator , pnode->sentMNAuthChallenge , !pnode->fInbound , pnode->nVersion .load ()));
122
- }
123
- LogPrint (BCLog::NET_NETCONN, " CMNAuth::%s -- constructed signHash for nVersion %d, peer=%d\n " , __func__, pnode->nVersion , pnode->GetId ());
106
+ int nOurNodeVersion{PROTOCOL_VERSION};
107
+ if (Params ().NetworkIDString () != CBaseChainParams::MAIN && gArgs .IsArgSet (" -pushversion" )) {
108
+ nOurNodeVersion = gArgs .GetArg (" -pushversion" , PROTOCOL_VERSION);
124
109
}
110
+ // See comment in PushMNAUTH (fInbound is negated here as we're on the other side of the connection)
111
+ if (pnode->nVersion < MNAUTH_NODE_VER_VERSION || nOurNodeVersion < MNAUTH_NODE_VER_VERSION) {
112
+ signHash = ::SerializeHash (std::make_tuple (dmn->pdmnState ->pubKeyOperator , pnode->GetSentMNAuthChallenge (), !pnode->fInbound ));
113
+ } else {
114
+ signHash = ::SerializeHash (std::make_tuple (dmn->pdmnState ->pubKeyOperator , pnode->GetSentMNAuthChallenge (), !pnode->fInbound , pnode->nVersion .load ()));
115
+ }
116
+ LogPrint (BCLog::NET_NETCONN, " CMNAuth::%s -- constructed signHash for nVersion %d, peer=%d\n " , __func__, pnode->nVersion , pnode->GetId ());
125
117
126
118
if (!mnauth.sig .VerifyInsecure (dmn->pdmnState ->pubKeyOperator .Get (), signHash)) {
127
119
LOCK (cs_main);
@@ -147,12 +139,12 @@ void CMNAuth::ProcessMessage(CNode* pnode, const std::string& strCommand, CDataS
147
139
return ;
148
140
}
149
141
150
- if (pnode2->verifiedProRegTxHash == mnauth.proRegTxHash ) {
142
+ if (pnode2->GetVerifiedProRegTxHash () == mnauth.proRegTxHash ) {
151
143
if (fMasternodeMode ) {
152
- auto deterministicOutbound = llmq::CLLMQUtils::DeterministicOutboundConnection (activeMasternodeInfo.proTxHash , mnauth.proRegTxHash );
144
+ auto deterministicOutbound = WITH_LOCK (activeMasternodeInfoCs, return llmq::CLLMQUtils::DeterministicOutboundConnection (activeMasternodeInfo.proTxHash , mnauth.proRegTxHash ) );
153
145
LogPrint (BCLog::NET_NETCONN, " CMNAuth::ProcessMessage -- Masternode %s has already verified as peer %d, deterministicOutbound=%s. peer=%d\n " ,
154
146
mnauth.proRegTxHash .ToString (), pnode2->GetId (), deterministicOutbound.ToString (), pnode->GetId ());
155
- if (deterministicOutbound == activeMasternodeInfo.proTxHash ) {
147
+ if (WITH_LOCK (activeMasternodeInfoCs, return deterministicOutbound == activeMasternodeInfo.proTxHash ) ) {
156
148
if (pnode2->fInbound ) {
157
149
LogPrint (BCLog::NET_NETCONN, " CMNAuth::ProcessMessage -- dropping old inbound, peer=%d\n " , pnode2->GetId ());
158
150
pnode2->fDisconnect = true ;
@@ -181,13 +173,10 @@ void CMNAuth::ProcessMessage(CNode* pnode, const std::string& strCommand, CDataS
181
173
return ;
182
174
}
183
175
184
- {
185
- LOCK (pnode->cs_mnauth );
186
- pnode->verifiedProRegTxHash = mnauth.proRegTxHash ;
187
- pnode->verifiedPubKeyHash = dmn->pdmnState ->pubKeyOperator .GetHash ();
188
- }
176
+ pnode->SetVerifiedProRegTxHash (mnauth.proRegTxHash );
177
+ pnode->SetVerifiedPubKeyHash (dmn->pdmnState ->pubKeyOperator .GetHash ());
189
178
190
- if (!pnode->m_masternode_iqr_connection && connman.IsMasternodeQuorumRelayMember (pnode->verifiedProRegTxHash )) {
179
+ if (!pnode->m_masternode_iqr_connection && connman.IsMasternodeQuorumRelayMember (pnode->GetVerifiedProRegTxHash () )) {
191
180
// Tell our peer that we're interested in plain LLMQ recovered signatures.
192
181
// Otherwise the peer would only announce/send messages resulting from QRECSIG,
193
182
// e.g. InstantSend locks or ChainLocks. SPV and regular full nodes should not send
@@ -209,11 +198,11 @@ void CMNAuth::NotifyMasternodeListChanged(bool undo, const CDeterministicMNList&
209
198
}
210
199
211
200
g_connman->ForEachNode ([&](CNode* pnode) {
212
- LOCK ( pnode->cs_mnauth );
213
- if (pnode-> verifiedProRegTxHash .IsNull ()) {
201
+ auto verifiedProRegTxHash = pnode->GetVerifiedProRegTxHash ( );
202
+ if (verifiedProRegTxHash.IsNull ()) {
214
203
return ;
215
204
}
216
- auto verifiedDmn = oldMNList.GetMN (pnode-> verifiedProRegTxHash );
205
+ auto verifiedDmn = oldMNList.GetMN (verifiedProRegTxHash);
217
206
if (!verifiedDmn) {
218
207
return ;
219
208
}
@@ -223,15 +212,15 @@ void CMNAuth::NotifyMasternodeListChanged(bool undo, const CDeterministicMNList&
223
212
} else {
224
213
auto it = diff.updatedMNs .find (verifiedDmn->GetInternalId ());
225
214
if (it != diff.updatedMNs .end ()) {
226
- if ((it->second .fields & CDeterministicMNStateDiff::Field_pubKeyOperator) && it->second .state .pubKeyOperator .GetHash () != pnode->verifiedPubKeyHash ) {
215
+ if ((it->second .fields & CDeterministicMNStateDiff::Field_pubKeyOperator) && it->second .state .pubKeyOperator .GetHash () != pnode->GetVerifiedPubKeyHash () ) {
227
216
doRemove = true ;
228
217
}
229
218
}
230
219
}
231
220
232
221
if (doRemove) {
233
222
LogPrint (BCLog::NET_NETCONN, " CMNAuth::NotifyMasternodeListChanged -- Disconnecting MN %s due to key changed/removed, peer=%d\n " ,
234
- pnode->verifiedProRegTxHash .ToString (), pnode->GetId ());
223
+ pnode->GetVerifiedProRegTxHash () .ToString (), pnode->GetId ());
235
224
pnode->fDisconnect = true ;
236
225
}
237
226
});
0 commit comments