X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=src%2Fmain.cpp;h=682eae7a5acf264467bb2c9cdd0a4e52e4db792d;hb=22f4288ff023d68e40acc466875fad511dcdeae0;hp=88fd4dd22342ef3eb80774bb4280da8035163251;hpb=99a9cc8988dfea35ff6caee2ab2846a47169e8c4;p=novacoin.git diff --git a/src/main.cpp b/src/main.cpp index 88fd4dd..682eae7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,23 +3,24 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#include "main.h" #include "alert.h" #include "checkpoints.h" #include "db.h" -#include "txdb.h" +#include "txdb-leveldb.h" #include "init.h" -#include "ui_interface.h" +#include "interface.h" #include "checkqueue.h" #include "kernel.h" -#include +#include "random.h" +#include "wallet.h" + #include #include -#include "main.h" +#include using namespace std; -using namespace boost; - CCriticalSection cs_setpwalletRegistered; @@ -110,7 +111,7 @@ void UnregisterWallet(CWallet* pwalletIn) // check whether the passed transaction is from us bool static IsFromMe(CTransaction& tx) { - BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered) + for (CWallet* pwallet : setpwalletRegistered) if (pwallet->IsFromMe(tx)) return true; return false; @@ -119,7 +120,7 @@ bool static IsFromMe(CTransaction& tx) // erases transaction with the given hash from all wallets void static EraseFromWallets(uint256 hash) { - BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered) + for (CWallet* pwallet : setpwalletRegistered) pwallet->EraseFromWallet(hash); } @@ -131,49 +132,49 @@ void SyncWithWallets(const CTransaction& tx, const CBlock* pblock, bool fUpdate, // wallets need to refund inputs when disconnecting coinstake if (tx.IsCoinStake()) { - BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered) + for (CWallet* pwallet : setpwalletRegistered) if (pwallet->IsFromMe(tx)) pwallet->DisableTransaction(tx); } return; } - BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered) + for (CWallet* pwallet : setpwalletRegistered) pwallet->AddToWalletIfInvolvingMe(tx, pblock, fUpdate); } // notify wallets about a new best chain void static SetBestChain(const CBlockLocator& loc) { - BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered) + for (CWallet* pwallet : setpwalletRegistered) pwallet->SetBestChain(loc); } // notify wallets about an updated transaction void static UpdatedTransaction(const uint256& hashTx) { - BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered) + for (CWallet* pwallet : setpwalletRegistered) pwallet->UpdatedTransaction(hashTx); } // dump all wallets void static PrintWallets(const CBlock& block) { - BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered) + for (CWallet* pwallet : setpwalletRegistered) pwallet->PrintWallet(block); } // notify wallets about an incoming inventory (for request counts) void static Inventory(const uint256& hash) { - BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered) + for (CWallet* pwallet : setpwalletRegistered) pwallet->Inventory(hash); } // ask wallets to resend their transactions void ResendWalletTransactions(bool fForceResend) { - BOOST_FOREACH(CWallet* pwallet, setpwalletRegistered) + for (CWallet* pwallet : setpwalletRegistered) pwallet->ResendWalletTransactions(fForceResend); } @@ -211,7 +212,7 @@ bool AddOrphanTx(const CTransaction& tx) } mapOrphanTransactions[hash] = tx; - BOOST_FOREACH(const CTxIn& txin, tx.vin) + for (const CTxIn& txin : tx.vin) mapOrphanTransactionsByPrev[txin.prevout.hash].insert(hash); printf("stored orphan tx %s (mapsz %" PRIszu ")\n", hash.ToString().substr(0,10).c_str(), @@ -224,7 +225,7 @@ void static EraseOrphanTx(uint256 hash) if (!mapOrphanTransactions.count(hash)) return; const CTransaction& tx = mapOrphanTransactions[hash]; - BOOST_FOREACH(const CTxIn& txin, tx.vin) + for (const CTxIn& txin : tx.vin) { mapOrphanTransactionsByPrev[txin.prevout.hash].erase(hash); if (mapOrphanTransactionsByPrev[txin.prevout.hash].empty()) @@ -298,7 +299,7 @@ bool CTransaction::IsStandard(string& strReason) const unsigned int nDataOut = 0; txnouttype whichType; - BOOST_FOREACH(const CTxIn& txin, vin) + for (const CTxIn& txin : vin) { // Biggest 'standard' txin is a 15-of-15 P2SH multisig with compressed // keys. (remember the 520 byte limit on redeemScript size) That works @@ -322,7 +323,7 @@ bool CTransaction::IsStandard(string& strReason) const return false; } } - BOOST_FOREACH(const CTxOut& txout, vout) { + for (const CTxOut& txout : vout) { if (!::IsStandard(txout.scriptPubKey, whichType)) { strReason = "scriptpubkey"; return false; @@ -423,12 +424,12 @@ CTransaction::GetLegacySigOpCount() const { // Coinbase scriptsigs are never executed, so there is // no sense in calculation of sigops. - BOOST_FOREACH(const CTxIn& txin, vin) + for (const CTxIn& txin : vin) { nSigOps += txin.scriptSig.GetSigOpCount(false); } } - BOOST_FOREACH(const CTxOut& txout, vout) + for (const CTxOut& txout : vout) { nSigOps += txout.scriptPubKey.GetSigOpCount(false); } @@ -517,7 +518,7 @@ bool CTransaction::CheckTransaction() const // Check for duplicate inputs set vInOutPoints; - BOOST_FOREACH(const CTxIn& txin, vin) + for (const CTxIn& txin : vin) { if (vInOutPoints.count(txin.prevout)) return false; @@ -531,7 +532,7 @@ bool CTransaction::CheckTransaction() const } else { - BOOST_FOREACH(const CTxIn& txin, vin) + for (const CTxIn& txin : vin) if (txin.prevout.IsNull()) return DoS(10, error("CTransaction::CheckTransaction() : prevout is null")); } @@ -577,7 +578,7 @@ int64_t CTransaction::GetMinFee(unsigned int nBlockSize, bool fAllowFree, enum G // // It's safe to ignore empty outputs here, because these inputs are allowed // only for coinbase and coinstake transactions. - BOOST_FOREACH(const CTxOut& txout, vout) + for (const CTxOut& txout : vout) if (txout.nValue < CENT && !txout.IsEmpty()) nMinFee += nBaseFee; @@ -779,7 +780,7 @@ bool CTxMemPool::remove(CTransaction &tx) uint256 hash = tx.GetHash(); if (mapTx.count(hash)) { - BOOST_FOREACH(const CTxIn& txin, tx.vin) + for (const CTxIn& txin : tx.vin) mapNextTx.erase(txin.prevout); mapTx.erase(hash); nTransactionsUpdated++; @@ -863,34 +864,6 @@ bool CMerkleTx::AcceptToMemoryPool() return AcceptToMemoryPool(txdb); } - - -bool CWalletTx::AcceptWalletTransaction(CTxDB& txdb, bool fCheckInputs) -{ - - { - LOCK(mempool.cs); - // Add previous supporting transactions first - BOOST_FOREACH(CMerkleTx& tx, vtxPrev) - { - if (!(tx.IsCoinBase() || tx.IsCoinStake())) - { - uint256 hash = tx.GetHash(); - if (!mempool.exists(hash) && !txdb.ContainsTx(hash)) - tx.AcceptToMemoryPool(txdb, fCheckInputs); - } - } - return AcceptToMemoryPool(txdb, fCheckInputs); - } - return false; -} - -bool CWalletTx::AcceptWalletTransaction() -{ - CTxDB txdb("r"); - return AcceptWalletTransaction(txdb); -} - int CTxIndex::GetDepthInMainChain() const { // Read block header @@ -1010,7 +983,7 @@ CBigNum inline GetProofOfStakeLimit(int nHeight, unsigned int nTime) } // miner's coin base reward based on nBits -int64_t GetProofOfWorkReward(unsigned int nBits, int64_t nFees) +int64_t GetProofOfWorkReward(unsigned int nBits) { CBigNum bnSubsidyLimit = MAX_MINT_PROOF_OF_WORK; @@ -1045,7 +1018,7 @@ int64_t GetProofOfWorkReward(unsigned int nBits, int64_t nFees) if (fDebug && GetBoolArg("-printcreation")) printf("GetProofOfWorkReward() : create=%s nBits=0x%08x nSubsidy=%" PRId64 "\n", FormatMoney(nSubsidy).c_str(), nBits, nSubsidy); - return min(nSubsidy, MAX_MINT_PROOF_OF_WORK) + nFees; + return min(nSubsidy, MAX_MINT_PROOF_OF_WORK); } // miner's coin stake reward based on nBits and coin age spent (coin-days) @@ -1284,7 +1257,7 @@ bool CTransaction::DisconnectInputs(CTxDB& txdb) // Relinquish previous transactions' spent pointers if (!IsCoinBase()) { - BOOST_FOREACH(const CTxIn& txin, vin) + for (const CTxIn& txin : vin) { COutPoint prevout = txin.prevout; @@ -1642,7 +1615,7 @@ bool CBlock::DisconnectBlock(CTxDB& txdb, CBlockIndex* pindex) } // ppcoin: clean up wallet after disconnecting coinstake - BOOST_FOREACH(CTransaction& tx, vtx) + for (CTransaction& tx : vtx) SyncWithWallets(tx, this, false, false); return true; @@ -1698,14 +1671,14 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck) int64_t nValueIn = 0; int64_t nValueOut = 0; unsigned int nSigOps = 0; - BOOST_FOREACH(CTransaction& tx, vtx) + for (CTransaction& tx : vtx) { uint256 hashTx = tx.GetHash(); if (fEnforceBIP30) { CTxIndex txindexOld; if (txdb.ReadTxIndex(hashTx, txindexOld)) { - BOOST_FOREACH(CDiskTxPos &pos, txindexOld.vSpent) + for (CDiskTxPos &pos : txindexOld.vSpent) if (pos.IsNull()) return false; } @@ -1746,8 +1719,10 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck) if (tx.nTime >= CHECKLOCKTIMEVERIFY_SWITCH_TIME) { nFlags |= SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY; - // OP_CHECKSEQUENCEVERIFY is senseless without BIP68, so we're going disable it for now. - // nFlags |= SCRIPT_VERIFY_CHECKSEQUENCEVERIFY; + } + + if (tx.nTime >= CHECKSEQUENCEVERIFY_SWITCH_TIME) { + nFlags |= SCRIPT_VERIFY_CHECKSEQUENCEVERIFY; } std::vector vChecks; @@ -1764,7 +1739,7 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck) if (IsProofOfWork()) { - int64_t nBlockReward = GetProofOfWorkReward(nBits, nFees); + int64_t nBlockReward = GetProofOfWorkReward(nBits) + nFees; // Check coinbase reward if (vtx[0].GetValueOut() > nBlockReward) @@ -1805,7 +1780,7 @@ bool CBlock::ConnectBlock(CTxDB& txdb, CBlockIndex* pindex, bool fJustCheck) } // Watch for transactions paying to me - BOOST_FOREACH(CTransaction& tx, vtx) + for (CTransaction& tx : vtx) SyncWithWallets(tx, this, true); @@ -1846,7 +1821,7 @@ bool static Reorganize(CTxDB& txdb, CBlockIndex* pindexNew) // Disconnect shorter branch vector vResurrect; - BOOST_FOREACH(CBlockIndex* pindex, vDisconnect) + for (CBlockIndex* pindex : vDisconnect) { CBlock block; if (!block.ReadFromDisk(pindex)) @@ -1855,7 +1830,7 @@ bool static Reorganize(CTxDB& txdb, CBlockIndex* pindexNew) return error("Reorganize() : DisconnectBlock %s failed", pindex->GetBlockHash().ToString().substr(0,20).c_str()); // Queue memory transactions to resurrect - BOOST_FOREACH(const CTransaction& tx, block.vtx) + for (const CTransaction& tx : block.vtx) if (!(tx.IsCoinBase() || tx.IsCoinStake())) vResurrect.push_back(tx); } @@ -1875,7 +1850,7 @@ bool static Reorganize(CTxDB& txdb, CBlockIndex* pindexNew) } // Queue memory transactions to delete - BOOST_FOREACH(const CTransaction& tx, block.vtx) + for (const CTransaction& tx : block.vtx) vDelete.push_back(tx); } if (!txdb.WriteHashBestChain(pindexNew->GetBlockHash())) @@ -1886,21 +1861,21 @@ bool static Reorganize(CTxDB& txdb, CBlockIndex* pindexNew) return error("Reorganize() : TxnCommit failed"); // Disconnect shorter branch - BOOST_FOREACH(CBlockIndex* pindex, vDisconnect) + for (CBlockIndex* pindex : vDisconnect) if (pindex->pprev) pindex->pprev->pnext = NULL; // Connect longer branch - BOOST_FOREACH(CBlockIndex* pindex, vConnect) + for (CBlockIndex* pindex : vConnect) if (pindex->pprev) pindex->pprev->pnext = pindex; // Resurrect memory transactions that were in the disconnected branch - BOOST_FOREACH(CTransaction& tx, vResurrect) + for (CTransaction& tx : vResurrect) tx.AcceptToMemoryPool(txdb, false); // Delete redundant memory transactions that are in the connected branch - BOOST_FOREACH(CTransaction& tx, vDelete) + for (CTransaction& tx : vDelete) mempool.remove(tx); printf("REORGANIZE: done\n"); @@ -1928,7 +1903,7 @@ bool CBlock::SetBestChainInner(CTxDB& txdb, CBlockIndex *pindexNew) pindexNew->pprev->pnext = pindexNew; // Delete redundant memory transactions - BOOST_FOREACH(CTransaction& tx, vtx) + for (CTransaction& tx : vtx) mempool.remove(tx); return true; @@ -2045,10 +2020,8 @@ bool CBlock::SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew) std::string strCmd = GetArg("-blocknotify", ""); if (!fIsInitialDownload && !strCmd.empty()) - { - boost::replace_all(strCmd, "%s", hashBestChain.GetHex()); - boost::thread t(runCommand, strCmd); // thread runs free - } + // thread runs free + boost::thread t(runCommand, regex_replace(strCmd, static_cast("%s"), hashBestChain.GetHex())); return true; } @@ -2068,7 +2041,7 @@ bool CTransaction::GetCoinAge(CTxDB& txdb, uint64_t& nCoinAge) const if (IsCoinBase()) return true; - BOOST_FOREACH(const CTxIn& txin, vin) + for (const CTxIn& txin : vin) { // First try finding the previous transaction in database CTransaction txPrev; @@ -2105,7 +2078,7 @@ bool CBlock::GetCoinAge(uint64_t& nCoinAge) const nCoinAge = 0; CTxDB txdb("r"); - BOOST_FOREACH(const CTransaction& tx, vtx) + for (const CTransaction& tx : vtx) { uint64_t nTxCoinAge; if (tx.GetCoinAge(txdb, nTxCoinAge)) @@ -2344,7 +2317,7 @@ bool CBlock::AcceptBlock() return error("AcceptBlock() : block's timestamp is too far in the future"); // Check that all transactions are finalized - BOOST_FOREACH(const CTransaction& tx, vtx) + for (const CTransaction& tx : vtx) if (!tx.IsFinal(nHeight, GetBlockTime())) return DoS(10, error("AcceptBlock() : contains a non-final transaction")); @@ -2382,7 +2355,7 @@ bool CBlock::AcceptBlock() if (hashBestChain == hash) { LOCK(cs_vNodes); - BOOST_FOREACH(CNode* pnode, vNodes) + for (CNode* pnode : vNodes) if (nBestHeight > (pnode->nStartingHeight != -1 ? pnode->nStartingHeight - 2000 : nBlockEstimate)) pnode->PushInventory(CInv(MSG_BLOCK, hash)); } @@ -2535,19 +2508,6 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock) if (!pblock->CheckBlock(true, true, (pblock->nTime > Checkpoints::GetLastCheckpointTime()))) return error("ProcessBlock() : CheckBlock FAILED"); - // ppcoin: verify hash target and signature of coinstake tx - if (pblock->IsProofOfStake()) - { - uint256 hashProofOfStake = 0, targetProofOfStake = 0; - if (!CheckProofOfStake(pblock->vtx[1], pblock->nBits, hashProofOfStake, targetProofOfStake)) - { - printf("WARNING: ProcessBlock(): check proof-of-stake failed for block %s\n", hash.ToString().c_str()); - return false; // do not error here as we expect this during initial block download - } - if (!mapProofOfStake.count(hash)) // add to mapProofOfStake - mapProofOfStake.insert(make_pair(hash, hashProofOfStake)); - } - CBlockIndex* pcheckpoint = Checkpoints::GetLastSyncCheckpoint(); if (pcheckpoint && pblock->hashPrevBlock != hashBestChain && !Checkpoints::WantedByPendingSyncCheckpoint(hash)) { @@ -2570,6 +2530,7 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock) } } + // ppcoin: ask for pending sync-checkpoint if any if (!IsInitialBlockDownload()) Checkpoints::AskForPendingSyncCheckpoint(pfrom); @@ -2604,11 +2565,31 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock) return true; } + // ppcoin: verify hash target and signature of coinstake tx + if (pblock->IsProofOfStake()) + { + uint256 hashProofOfStake = 0, targetProofOfStake = 0; + if (!CheckProofOfStake(pblock->vtx[1], pblock->nBits, hashProofOfStake, targetProofOfStake)) + { + // Having prev block in index should be enough for validation + if (mapBlockIndex.count(pblock->hashPrevBlock)) + return error("ProcessBlock(): check proof-of-stake (%s, %d) failed for block %s\n", pblock->GetProofOfStake().first.ToString().c_str(), pblock->GetProofOfStake().second, hash.ToString().c_str()); + + // Orphan blocks should be validated later once all parents successfully added to local chain + printf("ProcessBlock(): delaying proof-of-stake validation for orphan block %s\n", hash.ToString().c_str()); + return false; // do not error here as we expect this to happen here + } + + // Needed for AcceptBlock() + if (!mapProofOfStake.count(hash)) + mapProofOfStake.insert(make_pair(hash, hashProofOfStake)); + } + // Store to disk if (!pblock->AcceptBlock()) return error("ProcessBlock() : AcceptBlock FAILED"); - // Recursively process any orphan blocks that depended on this one + // Process any orphan blocks that depended on this one vector vWorkQueue; vWorkQueue.push_back(hash); for (unsigned int i = 0; i < vWorkQueue.size(); i++) @@ -2619,12 +2600,36 @@ bool ProcessBlock(CNode* pfrom, CBlock* pblock) ++mi) { CBlock* pblockOrphan = (*mi).second; - if (pblockOrphan->AcceptBlock()) - vWorkQueue.push_back(pblockOrphan->GetHash()); - mapOrphanBlocks.erase(pblockOrphan->GetHash()); - setStakeSeenOrphan.erase(pblockOrphan->GetProofOfStake()); + uint256 hashOrphanBlock = pblockOrphan->GetHash(); + + if (pblockOrphan->IsProofOfStake()) { + // Check proof-of-stake and do other contextual + // preparations before running AcceptBlock() + uint256 hashOrphanProofOfStake = 0; + uint256 targetOrphanProofOfStake = 0; + + if (CheckProofOfStake(pblockOrphan->vtx[1], pblockOrphan->nBits, hashOrphanProofOfStake, targetOrphanProofOfStake)) + { + // Needed for AcceptBlock() + if (!mapProofOfStake.count(hashOrphanBlock)) + mapProofOfStake.insert(make_pair(hashOrphanBlock, hashOrphanProofOfStake)); + + // Finally, we're ready to run AcceptBlock() + if (pblockOrphan->AcceptBlock()) + vWorkQueue.push_back(hashOrphanBlock); + setStakeSeenOrphan.erase(pblockOrphan->GetProofOfStake()); + } + } else { + // proof-of-work verification + // is notoriously simpler + if (pblockOrphan->AcceptBlock()) + vWorkQueue.push_back(hashOrphanBlock); + } + + mapOrphanBlocks.erase(hashOrphanBlock); delete pblockOrphan; } + mapOrphanBlocksByPrev.erase(hashPrev); } @@ -2858,10 +2863,6 @@ bool LoadBlockIndex(bool fAllowNew) if (!txdb.WriteModifierUpgradeTime(nModifierUpgradeTime)) return error("LoadBlockIndex() : failed to write upgrade info"); } - -#ifndef USE_LEVELDB - txdb.Close(); -#endif } return true; @@ -3045,7 +3046,7 @@ string GetWarnings(string strFor) // Alerts { LOCK(cs_mapAlerts); - BOOST_FOREACH(PAIRTYPE(const uint256, CAlert)& item, mapAlerts) + for (auto& item : mapAlerts) { const CAlert& alert = item.second; if (alert.AppliesToMe() && alert.nPriority > nPriority) @@ -3232,7 +3233,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) // Relay alerts { LOCK(cs_mapAlerts); - BOOST_FOREACH(PAIRTYPE(const uint256, CAlert)& item, mapAlerts) + for (auto& item : mapAlerts) item.second.RelayTo(pfrom); } @@ -3287,7 +3288,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) vector vAddrOk; int64_t nNow = GetAdjustedTime(); int64_t nSince = nNow - 10 * 60; - BOOST_FOREACH(CAddress& addr, vAddr) + for (CAddress& addr : vAddr) { if (fShutdown) return true; @@ -3309,7 +3310,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) uint256 hashRand = hashSalt ^ (hashAddr<<32) ^ ((GetTime()+hashAddr)/nOneDay); hashRand = Hash(BEGIN(hashRand), END(hashRand)); multimap mapMix; - BOOST_FOREACH(CNode* pnode, vNodes) + for (CNode* pnode : vNodes) { if (pnode->nVersion < CADDR_TIME_VERSION) continue; @@ -3398,7 +3399,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) if (fDebugNet || (vInv.size() != 1)) printf("received getdata (%" PRIszu " invsz)\n", vInv.size()); - BOOST_FOREACH(const CInv& inv, vInv) + for (const CInv& inv : vInv) { if (fShutdown) return true; @@ -3504,7 +3505,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) // Relay pfrom->hashCheckpointKnown = checkpoint.hashCheckpoint; LOCK(cs_vNodes); - BOOST_FOREACH(CNode* pnode, vNodes) + for (CNode* pnode : vNodes) checkpoint.RelayTo(pnode); } } @@ -3596,7 +3597,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) } } - BOOST_FOREACH(uint256 hash, vEraseQueue) + for (uint256 hash : vEraseQueue) EraseOrphanTx(hash); } else if (fMissingInputs) @@ -3641,7 +3642,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) int64_t nCutOff = GetTime() - (nNodeLifespan * nOneDay); pfrom->vAddrToSend.clear(); vector vAddr = addrman.GetAddr(); - BOOST_FOREACH(const CAddress &addr, vAddr) + for (const CAddress &addr : vAddr) if(addr.nTime > nCutOff) pfrom->PushAddress(addr); } @@ -3743,7 +3744,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) pfrom->setKnown.insert(alertHash); { LOCK(cs_vNodes); - BOOST_FOREACH(CNode* pnode, vNodes) + for (CNode* pnode : vNodes) alert.RelayTo(pnode); } } @@ -3821,7 +3822,7 @@ bool ProcessMessages(CNode* pfrom) if (!hdr.IsValid()) { printf("\n\nPROCESSMESSAGE: ERRORS IN HEADER %s\n\n\n", hdr.GetCommand().c_str()); - continue; + return false; } string strCommand = hdr.GetCommand(); @@ -3847,7 +3848,7 @@ bool ProcessMessages(CNode* pfrom) { printf("ProcessMessages(%s, %u bytes) : CHECKSUM ERROR nChecksum=%08x hdr.nChecksum=%08x\n", strCommand.c_str(), nMessageSize, nChecksum, hdr.nChecksum); - continue; + return false; } // Copy message to its own buffer @@ -3888,8 +3889,10 @@ bool ProcessMessages(CNode* pfrom) PrintExceptionContinue(NULL, "ProcessMessages()"); } - if (!fRet) + if (!fRet) { printf("ProcessMessage(%s, %u bytes) FAILED\n", strCommand.c_str(), nMessageSize); + return false; + } } vRecv.Compact(); @@ -3937,7 +3940,7 @@ bool SendMessages(CNode* pto) pto->nNextAddrSend = PoissonNextSend(nNow, 30); vector vAddr; vAddr.reserve(pto->vAddrToSend.size()); - BOOST_FOREACH(const CAddress& addr, pto->vAddrToSend) + for (const CAddress& addr : pto->vAddrToSend) { if (pto->setAddrKnown.insert(addr).second) { @@ -3969,7 +3972,7 @@ bool SendMessages(CNode* pto) LOCK(pto->cs_inventory); vInv.reserve(pto->vInventoryToSend.size()); vInvWait.reserve(pto->vInventoryToSend.size()); - BOOST_FOREACH(const CInv& inv, pto->vInventoryToSend) + for (const CInv& inv : pto->vInventoryToSend) { if (pto->setInventoryKnown.count(inv)) continue;