@@ -262,14 +262,87 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
262262 State (pfrom->GetId ())->nLastBlockProcess = GetTimeMicros ();
263263 }
264264
265+ if (strCommand == " version" ) {
266+ if (!MsgVersion (pfrom, vRecv, nTimeReceived))
267+ return false ;
265268
269+ } else if (pfrom->nVersion == 0 ) {
270+ // Must have a version message before anything else
271+ Misbehaving (pfrom->GetId (), 1 );
272+ return false ;
266273
267- if (strCommand == " version" )
274+ } else if (strCommand == " verack" ) {
275+ if (!MsgVerack (pfrom, vRecv, nTimeReceived))
276+ return false ;
277+ } else if (strCommand == " addr" ) {
278+ if (!MsgAddr (pfrom, vRecv, nTimeReceived))
279+ return false ;
280+ } else if (strCommand == " inv" ) {
281+ if (!MsgInv (pfrom, vRecv, nTimeReceived))
282+ return false ;
283+ } else if (strCommand == " getdata" ) {
284+ if (!MsgGetData (pfrom, vRecv, nTimeReceived))
285+ return false ;
286+ } else if (strCommand == " getblocks" ) {
287+ if (!MsgGetBlocks (pfrom, vRecv, nTimeReceived))
288+ return false ;
289+ } else if (strCommand == " getheaders" ) {
290+ if (!MsgGetHeaders (pfrom, vRecv, nTimeReceived))
291+ return false ;
292+ } else if (strCommand == " tx" ) {
293+ if (!MsgTx (pfrom, vRecv, nTimeReceived))
294+ return false ;
295+ } else if (strCommand == " block" && !fImporting && !fReindex ) { // Ignore blocks received while importing
296+ if (!MsgBlock (pfrom, vRecv, nTimeReceived))
297+ return false ;
298+ } else if (strCommand == " getaddr" ) {
299+ if (!MsgGetAddr (pfrom, vRecv, nTimeReceived))
300+ return false ;
301+ } else if (strCommand == " mempool" ) {
302+ if (!MsgMempool (pfrom, vRecv, nTimeReceived))
303+ return false ;
304+ } else if (strCommand == " ping" ) {
305+ if (!MsgPing (pfrom, vRecv, nTimeReceived))
306+ return false ;
307+ } else if (strCommand == " pong" ) {
308+ if (!MsgPong (pfrom, vRecv, nTimeReceived))
309+ return false ;
310+ } else if (strCommand == " alert" ) {
311+ if (!MsgAlert (pfrom, vRecv, nTimeReceived))
312+ return false ;
313+ } else if (strCommand == " filterload" ) {
314+ if (!MsgFilterLoad (pfrom, vRecv, nTimeReceived))
315+ return false ;
316+ } else if (strCommand == " filteradd" ) {
317+ if (!MsgFilterAdd (pfrom, vRecv, nTimeReceived))
318+ return false ;
319+ } else if (strCommand == " filterclear" ) {
320+ if (!MsgFilterClear (pfrom, vRecv, nTimeReceived))
321+ return false ;
322+ } else if (strCommand == " reject" ) {
323+ if (!MsgReject (pfrom, vRecv, nTimeReceived))
324+ return false ;
325+ } else {
326+ // Ignore unknown commands for extensibility
327+ LogPrint (" net" , " Unknown command \" %s\" from peer=%d\n " , SanitizeString (strCommand), pfrom->id );
328+ }
329+
330+ // Update the last seen time for this node's address
331+ if (pfrom->fNetworkNode )
332+ if (strCommand == " version" || strCommand == " addr" || strCommand == " inv" || strCommand == " getdata" || strCommand == " ping" )
333+ AddressCurrentlyConnected (pfrom->addr );
334+
335+ return true ;
336+ }
337+
338+
339+
340+ bool MessageEngine::MsgVersion (CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
268341 {
269342 // Each connection can only send one version message
270343 if (pfrom->nVersion != 0 )
271344 {
272- pfrom->PushMessage (" reject" , strCommand , REJECT_DUPLICATE, string (" Duplicate version message" ));
345+ pfrom->PushMessage (" reject" , (string) " version " , REJECT_DUPLICATE, string (" Duplicate version message" ));
273346 Misbehaving (pfrom->GetId (), 1 );
274347 return false ;
275348 }
@@ -283,7 +356,7 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
283356 {
284357 // disconnect from peers older than this proto version
285358 LogPrintf (" peer=%d using obsolete version %i; disconnecting\n " , pfrom->id , pfrom->nVersion );
286- pfrom->PushMessage (" reject" , strCommand , REJECT_OBSOLETE,
359+ pfrom->PushMessage (" reject" , (string) " version " , REJECT_OBSOLETE,
287360 strprintf (" Version must be %d or greater" , MIN_PEER_PROTO_VERSION));
288361 pfrom->fDisconnect = true ;
289362 return false ;
@@ -373,24 +446,17 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
373446 remoteAddr);
374447
375448 AddTimeData (pfrom->addr , nTime);
449+ return true ;
376450 }
377451
378-
379- else if (pfrom->nVersion == 0 )
380- {
381- // Must have a version message before anything else
382- Misbehaving (pfrom->GetId (), 1 );
383- return false ;
384- }
385-
386-
387- else if (strCommand == " verack" )
452+ bool MessageEngine::MsgVerack (CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
388453 {
389454 pfrom->SetRecvVersion (min (pfrom->nVersion , PROTOCOL_VERSION));
455+ return true ;
390456 }
391457
392458
393- else if (strCommand == " addr " )
459+ bool MessageEngine::MsgAddr (CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived )
394460 {
395461 vector<CAddress> vAddr;
396462 vRecv >> vAddr;
@@ -454,10 +520,11 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
454520 pfrom->fGetAddr = false ;
455521 if (pfrom->fOneShot )
456522 pfrom->fDisconnect = true ;
523+ return true ;
457524 }
458525
459526
460- else if (strCommand == " inv " )
527+ bool MessageEngine::MsgInv (CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived )
461528 {
462529 vector<CInv> vInv;
463530 vRecv >> vInv;
@@ -496,10 +563,12 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
496563 // Track requests for our stuff
497564 g_signals.Inventory (inv.hash );
498565 }
566+
567+ return true ;
499568 }
500569
501570
502- else if (strCommand == " getdata " )
571+ bool MessageEngine::MsgGetData (CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived )
503572 {
504573 vector<CInv> vInv;
505574 vRecv >> vInv;
@@ -517,10 +586,11 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
517586
518587 pfrom->vRecvGetData .insert (pfrom->vRecvGetData .end (), vInv.begin (), vInv.end ());
519588 ProcessGetData (pfrom);
589+ return true ;
520590 }
521591
522592
523- else if (strCommand == " getblocks " )
593+ bool MessageEngine::MsgGetBlocks (CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived )
524594 {
525595 CBlockLocator locator;
526596 uint256 hashStop;
@@ -553,10 +623,11 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
553623 break ;
554624 }
555625 }
626+ return true ;
556627 }
557628
558629
559- else if (strCommand == " getheaders " )
630+ bool MessageEngine::MsgGetHeaders (CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived )
560631 {
561632 CBlockLocator locator;
562633 uint256 hashStop;
@@ -592,10 +663,11 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
592663 break ;
593664 }
594665 pfrom->PushMessage (" headers" , vHeaders);
666+ return true ;
595667 }
596668
597669
598- else if (strCommand == " tx " )
670+ bool MessageEngine::MsgTx (CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived )
599671 {
600672 vector<uint256> vWorkQueue;
601673 vector<uint256> vEraseQueue;
@@ -680,15 +752,16 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
680752 LogPrint (" mempool" , " %s from peer=%d %s was not accepted into the memory pool: %s\n " , tx.GetHash ().ToString (),
681753 pfrom->id , pfrom->cleanSubVer ,
682754 state.GetRejectReason ());
683- pfrom->PushMessage (" reject" , strCommand , state.GetRejectCode (),
755+ pfrom->PushMessage (" reject" , (string) " tx " , state.GetRejectCode (),
684756 state.GetRejectReason (), inv.hash );
685757 if (nDoS > 0 )
686758 Misbehaving (pfrom->GetId (), nDoS);
687759 }
760+ return true ;
688761 }
689762
690763
691- else if (strCommand == " block " && ! fImporting && ! fReindex ) // Ignore blocks received while importing
764+ bool MessageEngine::MsgBlock (CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived)
692765 {
693766 CBlock block;
694767 vRecv >> block;
@@ -710,27 +783,29 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
710783 ProcessBlock (state, pfrom, &block);
711784 int nDoS;
712785 if (state.IsInvalid (nDoS)) {
713- pfrom->PushMessage (" reject" , strCommand , state.GetRejectCode (),
786+ pfrom->PushMessage (" reject" , (string) " block " , state.GetRejectCode (),
714787 state.GetRejectReason (), inv.hash );
715788 if (nDoS > 0 ) {
716789 LOCK (cs_main);
717790 Misbehaving (pfrom->GetId (), nDoS);
718791 }
719792 }
720793
794+ return true ;
721795 }
722796
723797
724- else if (strCommand == " getaddr " )
798+ bool MessageEngine::MsgGetAddr (CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived )
725799 {
726800 pfrom->vAddrToSend .clear ();
727801 vector<CAddress> vAddr = addrman.GetAddr ();
728802 BOOST_FOREACH (const CAddress &addr, vAddr)
729803 pfrom->PushAddress (addr);
804+ return true ;
730805 }
731806
732807
733- else if (strCommand == " mempool " )
808+ bool MessageEngine::MsgMempool (CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived )
734809 {
735810 LOCK2 (cs_main, pfrom->cs_filter );
736811
@@ -752,10 +827,11 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
752827 }
753828 if (vInv.size () > 0 )
754829 pfrom->PushMessage (" inv" , vInv);
830+ return true ;
755831 }
756832
757833
758- else if (strCommand == " ping " )
834+ bool MessageEngine::MsgPing (CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived )
759835 {
760836 if (pfrom->nVersion > BIP0031_VERSION)
761837 {
@@ -774,10 +850,11 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
774850 // return very quickly.
775851 pfrom->PushMessage (" pong" , nonce);
776852 }
853+ return true ;
777854 }
778855
779856
780- else if (strCommand == " pong " )
857+ bool MessageEngine::MsgPong (CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived )
781858 {
782859 int64_t pingUsecEnd = nTimeReceived;
783860 uint64_t nonce = 0 ;
@@ -831,10 +908,11 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
831908 if (bPingFinished) {
832909 pfrom->nPingNonceSent = 0 ;
833910 }
911+ return true ;
834912 }
835913
836914
837- else if (strCommand == " alert " )
915+ bool MessageEngine::MsgAlert (CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived )
838916 {
839917 CAlert alert;
840918 vRecv >> alert;
@@ -862,10 +940,11 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
862940 Misbehaving (pfrom->GetId (), 10 );
863941 }
864942 }
943+ return true ;
865944 }
866945
867946
868- else if (strCommand == " filterload " )
947+ bool MessageEngine::MsgFilterLoad (CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived )
869948 {
870949 CBloomFilter filter;
871950 vRecv >> filter;
@@ -881,10 +960,11 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
881960 pfrom->pfilter ->UpdateEmptyFull ();
882961 }
883962 pfrom->fRelayTxes = true ;
963+ return true ;
884964 }
885965
886966
887- else if (strCommand == " filteradd " )
967+ bool MessageEngine::MsgFilterAdd (CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived )
888968 {
889969 vector<unsigned char > vData;
890970 vRecv >> vData;
@@ -901,19 +981,21 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
901981 else
902982 Misbehaving (pfrom->GetId (), 100 );
903983 }
984+ return true ;
904985 }
905986
906987
907- else if (strCommand == " filterclear " )
988+ bool MessageEngine::MsgFilterClear (CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived )
908989 {
909990 LOCK (pfrom->cs_filter );
910991 delete pfrom->pfilter ;
911992 pfrom->pfilter = new CBloomFilter ();
912993 pfrom->fRelayTxes = true ;
994+ return true ;
913995 }
914996
915997
916- else if (strCommand == " reject " )
998+ bool MessageEngine::MsgReject (CNode* pfrom, CDataStream& vRecv, int64_t nTimeReceived )
917999 {
9181000 if (fDebug )
9191001 {
@@ -934,24 +1016,9 @@ bool MessageEngine::ProcessMessage(CNode* pfrom, string strCommand, CDataStream&
9341016 if (s.size () > 111 ) s.erase (111 , string::npos);
9351017 LogPrint (" net" , " Reject %s\n " , SanitizeString (s));
9361018 }
1019+ return true ;
9371020 }
9381021
939- else
940- {
941- // Ignore unknown commands for extensibility
942- LogPrint (" net" , " Unknown command \" %s\" from peer=%d\n " , SanitizeString (strCommand), pfrom->id );
943- }
944-
945-
946- // Update the last seen time for this node's address
947- if (pfrom->fNetworkNode )
948- if (strCommand == " version" || strCommand == " addr" || strCommand == " inv" || strCommand == " getdata" || strCommand == " ping" )
949- AddressCurrentlyConnected (pfrom->addr );
950-
951-
952- return true ;
953- }
954-
9551022// requires LOCK(cs_vRecvMsg)
9561023bool MessageEngine::ProcessMessages (CNode* pfrom)
9571024{
0 commit comments