diff --git a/src/bloom.cpp b/src/bloom.cpp index 5fac1d06..73b04aa3 100644 --- a/src/bloom.cpp +++ b/src/bloom.cpp @@ -88,11 +88,11 @@ bool CBloomFilter::IsWithinSizeConstraints() const return vData.size() <= MAX_BLOOM_FILTER_SIZE && nHashFuncs <= MAX_HASH_FUNCS; } -bool CBloomFilter::IsTransactionRelevantToFilter(const CTransaction& tx) const +bool CBloomFilter::IsTransactionRelevantToFilter(const CTransaction& tx, const uint256& hash) const { // Match if the filter contains the hash of tx // for finding tx when they appear in a block - if (contains(tx.GetHash())) + if (contains(hash)) return true; BOOST_FOREACH(const CTxOut& txout, tx.vout) diff --git a/src/bloom.h b/src/bloom.h index ce84e665..335bb5e0 100644 --- a/src/bloom.h +++ b/src/bloom.h @@ -64,7 +64,7 @@ public: // (catch a filter which was just deserialized which was too big) bool IsWithinSizeConstraints() const; - bool IsTransactionRelevantToFilter(const CTransaction& tx) const; + bool IsTransactionRelevantToFilter(const CTransaction& tx, const uint256& hash) const; }; #endif /* BITCOIN_BLOOM_H */ diff --git a/src/main.cpp b/src/main.cpp index 9a498ff2..93079693 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3184,7 +3184,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) if (tx.AcceptToMemoryPool(true, &fMissingInputs)) { SyncWithWallets(inv.hash, tx, NULL, true); - RelayMessage(inv, vMsg); + RelayTransaction(tx, inv.hash, vMsg); mapAlreadyAskedFor.erase(inv); vWorkQueue.push_back(inv.hash); vEraseQueue.push_back(inv.hash); @@ -3207,7 +3207,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv) { printf(" accepted orphan tx %s\n", inv.hash.ToString().substr(0,10).c_str()); SyncWithWallets(inv.hash, tx, NULL, true); - RelayMessage(inv, vMsg); + RelayTransaction(tx, inv.hash, vMsg); mapAlreadyAskedFor.erase(inv); vWorkQueue.push_back(inv.hash); vEraseQueue.push_back(inv.hash); diff --git a/src/net.cpp b/src/net.cpp index 7867c85b..aafc7206 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -9,6 +9,7 @@ #include "init.h" #include "addrman.h" #include "ui_interface.h" +#include "script.h" #ifdef WIN32 #include @@ -1996,3 +1997,46 @@ public: } } instance_of_cnetcleanup; + + + + + + + +void RelayTransaction(const CTransaction& tx, const uint256& hash) +{ + CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); + ss.reserve(10000); + ss << tx; + RelayTransaction(tx, hash, ss); +} + +void RelayTransaction(const CTransaction& tx, const uint256& hash, const CDataStream& ss) +{ + CInv inv(MSG_TX, hash); + { + LOCK(cs_mapRelay); + // Expire old relay messages + while (!vRelayExpiration.empty() && vRelayExpiration.front().first < GetTime()) + { + mapRelay.erase(vRelayExpiration.front().second); + vRelayExpiration.pop_front(); + } + + // Save original serialized message so newer versions are preserved + mapRelay.insert(std::make_pair(inv, ss)); + vRelayExpiration.push_back(std::make_pair(GetTime() + 15 * 60, inv)); + } + LOCK(cs_vNodes); + BOOST_FOREACH(CNode* pnode, vNodes) + { + LOCK(pnode->cs_filter); + if (pnode->pfilter) + { + if (pnode->pfilter->IsTransactionRelevantToFilter(tx, hash)) + pnode->PushInventory(inv); + } else + pnode->PushInventory(inv); + } +} diff --git a/src/net.h b/src/net.h index 1ce92eae..81fe3120 100644 --- a/src/net.h +++ b/src/net.h @@ -562,51 +562,8 @@ public: - - - - - - - -inline void RelayInventory(const CInv& inv) -{ - // Put on lists to offer to the other nodes - { - LOCK(cs_vNodes); - BOOST_FOREACH(CNode* pnode, vNodes) - pnode->PushInventory(inv); - } -} - -template -void RelayMessage(const CInv& inv, const T& a) -{ - CDataStream ss(SER_NETWORK, PROTOCOL_VERSION); - ss.reserve(10000); - ss << a; - RelayMessage(inv, ss); -} - -template<> -inline void RelayMessage<>(const CInv& inv, const CDataStream& ss) -{ - { - LOCK(cs_mapRelay); - // Expire old relay messages - while (!vRelayExpiration.empty() && vRelayExpiration.front().first < GetTime()) - { - mapRelay.erase(vRelayExpiration.front().second); - vRelayExpiration.pop_front(); - } - - // Save original serialized message so newer versions are preserved - mapRelay.insert(std::make_pair(inv, ss)); - vRelayExpiration.push_back(std::make_pair(GetTime() + 15 * 60, inv)); - } - - RelayInventory(inv); -} - +class CTransaction; +void RelayTransaction(const CTransaction& tx, const uint256& hash); +void RelayTransaction(const CTransaction& tx, const uint256& hash, const CDataStream& ss); #endif diff --git a/src/rpcrawtransaction.cpp b/src/rpcrawtransaction.cpp index 9531b126..09fbaa30 100644 --- a/src/rpcrawtransaction.cpp +++ b/src/rpcrawtransaction.cpp @@ -558,7 +558,7 @@ Value sendrawtransaction(const Array& params, bool fHelp) } else { SyncWithWallets(hashTx, tx, NULL, true); } - RelayMessage(CInv(MSG_TX, hashTx), tx); + RelayTransaction(tx, hashTx); return hashTx.GetHex(); } diff --git a/src/wallet.cpp b/src/wallet.cpp index 37b86c35..f49bfb5f 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -826,17 +826,16 @@ void CWalletTx::RelayWalletTransaction() { BOOST_FOREACH(const CMerkleTx& tx, vtxPrev) { - if (!tx.IsCoinBase()) { + if (!tx.IsCoinBase()) if (tx.GetDepthInMainChain() == 0) - RelayMessage(CInv(MSG_TX, tx.GetHash()), (CTransaction)tx); - } + RelayTransaction((CTransaction)tx, tx.GetHash()); } if (!IsCoinBase()) { if (GetDepthInMainChain() == 0) { uint256 hash = GetHash(); printf("Relaying wtx %s\n", hash.ToString().substr(0,10).c_str()); - RelayMessage(CInv(MSG_TX, hash), (CTransaction)*this); + RelayTransaction((CTransaction)*this, hash); } } }