@@ -180,151 +180,50 @@ void CGovernanceManager::AddPostponedObjectInternal(const CGovernanceObject& gov
180180 mapPostponedObjects.emplace (govobj.GetHash (), std::make_shared<CGovernanceObject>(govobj));
181181}
182182
183- MessageProcessingResult CGovernanceManager::ProcessMessage (CNode& peer, CConnman& connman, std::string_view msg_type,
184- CDataStream& vRecv)
183+ bool CGovernanceManager::ProcessObject (const CNode& peer, const uint256& nHash, CGovernanceObject& govobj)
185184{
186- AssertLockNotHeld (cs_store);
187- AssertLockNotHeld (cs_relay);
188- if (!IsValid ()) return {};
189- if (!m_mn_sync.IsBlockchainSynced ()) return {};
185+ std::string strHash = nHash.ToString ();
190186
191- const auto tip_mn_list = Assert (m_dmnman)->GetListAtChainTip ();
192- // ANOTHER USER IS ASKING US TO HELP THEM SYNC GOVERNANCE OBJECT DATA
193- if (msg_type == NetMsgType::MNGOVERNANCESYNC) {
194- // Ignore such requests until we are fully synced.
195- // We could start processing this after masternode list is synced
196- // but this is a heavy one so it's better to finish sync first.
197- if (!m_mn_sync.IsSynced ()) return {};
198-
199- uint256 nProp;
200- CBloomFilter filter;
201- vRecv >> nProp;
202- vRecv >> filter;
203-
204- LogPrint (BCLog::GOBJECT, " MNGOVERNANCESYNC -- syncing governance objects to our peer %s\n " , peer.GetLogString ());
205- LOCK (cs_store);
206- if (nProp == uint256 ()) {
207- return SyncObjects (peer, connman);
208- } else {
209- return SyncSingleObjVotes (peer, nProp, filter, connman);
210- }
187+ LOCK (cs_store);
211188
212- return {};
189+ if (mapObjects.count (nHash) || mapPostponedObjects.count (nHash) || mapErasedGovernanceObjects.count (nHash)) {
190+ // TODO - print error code? what if it's GOVOBJ_ERROR_IMMATURE?
191+ LogPrint (BCLog::GOBJECT, " MNGOVERNANCEOBJECT -- Received already seen object: %s\n " , strHash);
192+ return true ;
213193 }
214194
215- // A NEW GOVERNANCE OBJECT HAS ARRIVED
216- else if (msg_type == NetMsgType::MNGOVERNANCEOBJECT) {
217- // MAKE SURE WE HAVE A VALID REFERENCE TO THE TIP BEFORE CONTINUING
218-
219- CGovernanceObject govobj;
220- vRecv >> govobj;
221-
222- uint256 nHash = govobj.GetHash ();
223-
224- MessageProcessingResult ret{};
225- ret.m_to_erase = CInv{MSG_GOVERNANCE_OBJECT, nHash};
226-
227- if (!m_mn_sync.IsBlockchainSynced ()) {
228- LogPrint (BCLog::GOBJECT, " MNGOVERNANCEOBJECT -- masternode list not synced\n " );
229- return ret;
230- }
231-
232- std::string strHash = nHash.ToString ();
233-
234- LogPrint (BCLog::GOBJECT, " MNGOVERNANCEOBJECT -- Received object: %s\n " , strHash);
235-
236- if (!AcceptMessage (nHash)) {
237- LogPrint (BCLog::GOBJECT, " MNGOVERNANCEOBJECT -- Received unrequested object: %s\n " , strHash);
238- return ret;
239- }
240-
241- LOCK2 (::cs_main, cs_store);
242-
243- if (mapObjects.count (nHash) || mapPostponedObjects.count (nHash) || mapErasedGovernanceObjects.count (nHash)) {
244- // TODO - print error code? what if it's GOVOBJ_ERROR_IMMATURE?
245- LogPrint (BCLog::GOBJECT, " MNGOVERNANCEOBJECT -- Received already seen object: %s\n " , strHash);
246- return ret;
247- }
248-
249- bool fRateCheckBypassed = false ;
250- if (!MasternodeRateCheck (govobj, true , false , fRateCheckBypassed )) {
251- LogPrint (BCLog::GOBJECT, " MNGOVERNANCEOBJECT -- masternode rate check failed - %s - (current block height %d) \n " , strHash, nCachedBlockHeight);
252- return ret;
253- }
254-
255- std::string strError;
256- // CHECK OBJECT AGAINST LOCAL BLOCKCHAIN
257-
258- bool fMissingConfirmations = false ;
259- bool fIsValid = govobj.IsValidLocally (tip_mn_list, m_chainman, strError, fMissingConfirmations , true );
260-
261- bool unused_rcb;
262- if (fRateCheckBypassed && fIsValid && !MasternodeRateCheck (govobj, true , true , unused_rcb)) {
263- LogPrint (BCLog::GOBJECT, " MNGOVERNANCEOBJECT -- masternode rate check failed (after signature verification) - %s - (current block height %d)\n " , strHash, nCachedBlockHeight);
264- return ret;
265- }
266-
267- if (!fIsValid ) {
268- if (fMissingConfirmations ) {
269- AddPostponedObjectInternal (govobj);
270- LogPrintf (" MNGOVERNANCEOBJECT -- Not enough fee confirmations for: %s, strError = %s\n " , strHash, strError);
271- } else {
272- LogPrint (BCLog::GOBJECT, " MNGOVERNANCEOBJECT -- Governance object is invalid - %s\n " , strError);
273- // apply node's ban score
274- ret.m_error = MisbehavingError{20 };
275- return ret;
276- }
277-
278- return ret;
279- }
280-
281- AddGovernanceObjectInternal (govobj, &peer);
282- return ret;
195+ bool fRateCheckBypassed = false ;
196+ if (!MasternodeRateCheck (govobj, true , false , fRateCheckBypassed )) {
197+ LogPrint (BCLog::GOBJECT, " MNGOVERNANCEOBJECT -- masternode rate check failed - %s - (current block height %d) \n " , strHash, nCachedBlockHeight);
198+ return true ;
283199 }
284200
285- // A NEW GOVERNANCE OBJECT VOTE HAS ARRIVED
286- else if (msg_type == NetMsgType::MNGOVERNANCEOBJECTVOTE) {
287- CGovernanceVote vote;
288- vRecv >> vote;
289-
290- uint256 nHash = vote.GetHash ();
291-
292- MessageProcessingResult ret{};
293- ret.m_to_erase = CInv{MSG_GOVERNANCE_OBJECT_VOTE, nHash};
294-
295- // Ignore such messages until masternode list is synced
296- if (!m_mn_sync.IsBlockchainSynced ()) {
297- LogPrint (BCLog::GOBJECT, " MNGOVERNANCEOBJECTVOTE -- masternode list not synced\n " );
298- return ret;
299- }
300-
301- LogPrint (BCLog::GOBJECT, " MNGOVERNANCEOBJECTVOTE -- Received vote: %s\n " , vote.ToString (tip_mn_list));
201+ std::string strError;
202+ // CHECK OBJECT AGAINST LOCAL BLOCKCHAIN
302203
303- std::string strHash = nHash.ToString ();
204+ const auto tip_mn_list = GetMNManager ().GetListAtChainTip ();
205+ bool fMissingConfirmations = false ;
206+ bool fIsValid = govobj.IsValidLocally (tip_mn_list, m_chainman, strError, fMissingConfirmations , true );
304207
305- if (! AcceptMessage (nHash)) {
306- LogPrint (BCLog::GOBJECT, " MNGOVERNANCEOBJECTVOTE -- Received unrequested vote object: %s, hash: %s, peer = %d \n " ,
307- vote. ToString (tip_mn_list) , strHash, peer. GetId () );
308- return ret ;
309- }
208+ bool unused_rcb;
209+ if ( fRateCheckBypassed && fIsValid && ! MasternodeRateCheck (govobj, true , true , unused_rcb)) {
210+ LogPrint (BCLog::GOBJECT, " MNGOVERNANCEOBJECT -- masternode rate check failed (after signature verification) - %s - (current block height %d) \n " , strHash, nCachedBlockHeight );
211+ return true ;
212+ }
310213
311- CGovernanceException exception;
312- if (ProcessVote (&peer, vote, exception, connman) ) {
313- LogPrint (BCLog::GOBJECT, " MNGOVERNANCEOBJECTVOTE -- %s new \n " , strHash );
314- m_mn_sync. BumpAssetLastTime ( " MNGOVERNANCEOBJECTVOTE " );
315- RelayVote (vote) ;
214+ if (! fIsValid ) {
215+ if (fMissingConfirmations ) {
216+ AddPostponedObjectInternal (govobj );
217+ LogPrintf ( " MNGOVERNANCEOBJECT -- Not enough fee confirmations for: %s, strError = %s \n " , strHash, strError );
218+ return true ;
316219 } else {
317- LogPrint (BCLog::GOBJECT, " MNGOVERNANCEOBJECTVOTE -- Rejected vote, error = %s\n " , exception.what ());
318- if ((exception.GetNodePenalty () != 0 ) && m_mn_sync.IsSynced ()) {
319- ret.m_error = MisbehavingError{exception.GetNodePenalty ()};
320- return ret;
321- }
322- return ret;
220+ LogPrint (BCLog::GOBJECT, " MNGOVERNANCEOBJECT -- Governance object is invalid - %s\n " , strError);
221+ return false ;
323222 }
324- return ret;
325223 }
326224
327- return {};
225+ AddGovernanceObjectInternal (govobj, &peer);
226+ return true ;
328227}
329228
330229void CGovernanceManager::CheckOrphanVotes (CGovernanceObject& govobj)
@@ -693,7 +592,7 @@ bool CGovernanceManager::ConfirmInventoryRequest(const CInv& inv)
693592
694593MessageProcessingResult CGovernanceManager::SyncSingleObjVotes (CNode& peer, const uint256& nProp, const CBloomFilter& filter, CConnman& connman)
695594{
696- AssertLockHeld (cs_store);
595+ LOCK (cs_store);
697596 // do not provide any data until our node is synced
698597 if (!m_mn_sync.IsSynced ()) return {};
699598
@@ -746,7 +645,7 @@ MessageProcessingResult CGovernanceManager::SyncSingleObjVotes(CNode& peer, cons
746645
747646MessageProcessingResult CGovernanceManager::SyncObjects (CNode& peer, CConnman& connman) const
748647{
749- AssertLockHeld (cs_store);
648+ LOCK (cs_store);
750649 assert (m_netfulfilledman.IsValid ());
751650
752651 // do not provide any data until our node is synced
0 commit comments