From 4f460736eb621dca3aec1f8ddc0db50284db2f92 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 18 Jun 2012 20:53:48 -0700 Subject: [PATCH 1/4] to160 was broken, and we don't use it. So remove it. --- src/Conversion.cpp | 7 ------- src/uint256.h | 2 -- 2 files changed, 9 deletions(-) diff --git a/src/Conversion.cpp b/src/Conversion.cpp index a0ac3c1e9..7f9de9029 100644 --- a/src/Conversion.cpp +++ b/src/Conversion.cpp @@ -42,13 +42,6 @@ bool u160ToHuman(uint160& buf, std::string& retStr) #endif -base_uint160 uint256::to160() const -{ - uint160 m; - memcpy(m.begin(), begin(), m.size()); - return m; -} - base_uint256 uint160::to256() const { uint256 m; diff --git a/src/uint256.h b/src/uint256.h index 3e8922207..a13c814dc 100644 --- a/src/uint256.h +++ b/src/uint256.h @@ -511,8 +511,6 @@ public: zero(); } } - - base_uint160 to160() const; }; From 22302319f45056fce1c2a040732c7def0e09ec5e Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 18 Jun 2012 21:00:48 -0700 Subject: [PATCH 2/4] Supression table. --- src/Application.h | 4 ++++ src/Suppression.cpp | 37 +++++++++++++++++++++++++++++++++++++ src/Suppression.h | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 src/Suppression.cpp create mode 100644 src/Suppression.h diff --git a/src/Application.h b/src/Application.h index 7d9ada8ea..ec00b94e8 100644 --- a/src/Application.h +++ b/src/Application.h @@ -14,6 +14,7 @@ #include "NetworkOPs.h" #include "TaggedCache.h" #include "ValidationCollection.h" +#include "Suppression.h" #include "../database/database.h" @@ -46,6 +47,7 @@ class Application NetworkOPs mNetOps; NodeCache mNodeCache; ValidationCollection mValidations; + SuppressionTable mSuppressions; DatabaseCon *mTxnDB, *mLedgerDB, *mWalletDB, *mHashNodeDB, *mNetNodeDB; @@ -77,6 +79,8 @@ public: TransactionMaster& getMasterTransaction() { return mMasterTransaction; } NodeCache& getNodeCache() { return mNodeCache; } ValidationCollection& getValidations() { return mValidations; } + bool suppress(const uint256& s) { return mSuppressions.addSuppression(s); } + bool suppress(const uint160& s) { return mSuppressions.addSuppression(s); } DatabaseCon* getTxnDB() { return mTxnDB; } DatabaseCon* getLedgerDB() { return mLedgerDB; } diff --git a/src/Suppression.cpp b/src/Suppression.cpp new file mode 100644 index 000000000..7ed36b567 --- /dev/null +++ b/src/Suppression.cpp @@ -0,0 +1,37 @@ + +#include "Suppression.h" + +bool SuppressionTable::addSuppression(const uint160& suppression) +{ + boost::mutex::scoped_lock sl(mSuppressionMutex); + + if (mSuppressionMap.find(suppression) != mSuppressionMap.end()) + return false; + + time_t now = time(NULL); + + boost::unordered_map< time_t, std::list >::iterator it = mSuppressionTimes.begin(); + while (it != mSuppressionTimes.end()) + { + if ((it->first + mHoldTime) < now) + { + for (std::list::iterator lit = it->second.begin(), end = it->second.end(); + lit != end; ++lit) + mSuppressionMap.erase(*lit); + mSuppressionTimes.erase(it++); + } + else ++it; + } + + mSuppressionMap[suppression] = now; + mSuppressionTimes[now].push_back(suppression); + + return true; +} + +bool SuppressionTable::addSuppression(const uint256& suppression) +{ + uint160 u; + memcpy(u.begin(), suppression.begin() + (suppression.size() - u.size()), u.size()); + return addSuppression(u); +} diff --git a/src/Suppression.h b/src/Suppression.h new file mode 100644 index 000000000..608a57d73 --- /dev/null +++ b/src/Suppression.h @@ -0,0 +1,34 @@ +#ifndef __SUPPRESSION__ +#define __SUPPRESSION__ + +#include + +#include +#include + +#include "uint256.h" + +extern std::size_t hash_value(const uint160& u); + +class SuppressionTable +{ +protected: + + boost::mutex mSuppressionMutex; + + // Stores all suppressed hashes and their expiration time + boost::unordered_map mSuppressionMap; + + // Stores all expiration times and the hashes indexed for them + boost::unordered_map< time_t, std::list > mSuppressionTimes; + + int mHoldTime; + +public: + SuppressionTable(int holdTime = 120) : mHoldTime(holdTime) { ; } + + bool addSuppression(const uint256& suppression); + bool addSuppression(const uint160& suppression); +}; + +#endif From e5249dd585e5e91a091112991915cbddbc1ef977 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 18 Jun 2012 21:07:49 -0700 Subject: [PATCH 3/4] Relay transactions with supression when not fully validating. --- src/NetworkOPs.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/NetworkOPs.cpp b/src/NetworkOPs.cpp index ffe901c1a..540efeca4 100644 --- a/src/NetworkOPs.cpp +++ b/src/NetworkOPs.cpp @@ -98,6 +98,18 @@ Transaction::pointer NetworkOPs::processTransaction(Transaction::pointer trans, } Log(lsDEBUG) << "Status other than success " << r ; + if ((mMode != omFULL) && (theApp->suppress(trans->getID()))) + { + newcoin::TMTransaction tx; + Serializer s; + trans->getSTransaction()->add(s); + tx.set_rawtransaction(&s.getData().front(), s.getLength()); + tx.set_status(newcoin::tsCURRENT); + tx.set_receivetimestamp(getNetworkTimeNC()); + tx.set_ledgerindexpossible(tgtLedger); + PackedMessage::pointer packet = boost::make_shared(tx, newcoin::mtTRANSACTION); + theApp->getConnectionPool().relayMessage(source, packet); + } trans->setStatus(INVALID); return trans; @@ -472,10 +484,11 @@ bool NetworkOPs::recvPropose(uint32 proposeSeq, const uint256& proposeHash, // XXX Take a vuc for pubkey. NewcoinAddress naPeerPublic = NewcoinAddress::createNodePublic(strCopy(pubKey)); - if (mMode != omFULL) // FIXME: Should we relay? + if (mMode != omFULL) { Log(lsINFO) << "Received proposal when not full: " << mMode; - return false; // FIXME: Need suppression table + Serializer s(signature); + return theApp->suppress(s.getSHA512Half()); } if (!mConsensus) { From ea837ff819a5f87fe64900c85a45316a4629fe39 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 18 Jun 2012 21:12:35 -0700 Subject: [PATCH 4/4] Clean up some logging that was confusing. --- src/LedgerConsensus.cpp | 15 ++++++++------- src/LedgerConsensus.h | 2 +- src/NetworkOPs.cpp | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/LedgerConsensus.cpp b/src/LedgerConsensus.cpp index 7c84b258c..3193dd758 100644 --- a/src/LedgerConsensus.cpp +++ b/src/LedgerConsensus.cpp @@ -217,7 +217,7 @@ void LedgerConsensus::takeInitialPosition(Ledger::pointer initialLedger) mOurPosition = boost::make_shared (theConfig.VALIDATION_SEED, initialLedger->getParentHash(), txSet); - mapComplete(txSet, initialSet); + mapComplete(txSet, initialSet, false); propose(std::vector(), std::vector()); } @@ -241,9 +241,10 @@ void LedgerConsensus::createDisputes(SHAMap::pointer m1, SHAMap::pointer m2) } } -void LedgerConsensus::mapComplete(const uint256& hash, SHAMap::pointer map) +void LedgerConsensus::mapComplete(const uint256& hash, SHAMap::pointer map, bool acquired) { - Log(lsINFO) << "We have acquired TXS " << hash.GetHex(); + if (acquired) + Log(lsINFO) << "We have acquired TXS " << hash.GetHex(); mAcquiring.erase(hash); if (!map) @@ -281,8 +282,8 @@ void LedgerConsensus::mapComplete(const uint256& hash, SHAMap::pointer map) } if (!peers.empty()) adjustCount(map, peers); - else if (!hash) - Log(lsWARNING) << "By the time we got the map, no peers were proposing it"; + else if (acquired) + Log(lsWARNING) << "By the time we got the map " << hash.GetHex() << " no peers were proposing it"; sendHaveTxSet(hash, true); } @@ -448,7 +449,7 @@ bool LedgerConsensus::updateOurPositions(int sinceClose) uint256 newHash = ourPosition->getHash(); mOurPosition->changePosition(newHash); propose(addedTx, removedTx); - mapComplete(newHash, ourPosition); + mapComplete(newHash, ourPosition, false); Log(lsINFO) << "We change our position to " << newHash.GetHex(); } @@ -468,7 +469,7 @@ SHAMap::pointer LedgerConsensus::getTransactionTree(const uint256& hash, bool do if (!hash) { SHAMap::pointer empty = boost::make_shared(); - mapComplete(hash, empty); + mapComplete(hash, empty, false); return empty; } acquiring = boost::make_shared(hash); diff --git a/src/LedgerConsensus.h b/src/LedgerConsensus.h index a02bbce88..60d4c2796 100644 --- a/src/LedgerConsensus.h +++ b/src/LedgerConsensus.h @@ -138,7 +138,7 @@ public: SHAMap::pointer getTransactionTree(const uint256& hash, bool doAcquire); TransactionAcquire::pointer getAcquiring(const uint256& hash); - void mapComplete(const uint256& hash, SHAMap::pointer map); + void mapComplete(const uint256& hash, SHAMap::pointer map, bool acquired); void abort(); int timerEntry(); diff --git a/src/NetworkOPs.cpp b/src/NetworkOPs.cpp index 540efeca4..e38cb2b24 100644 --- a/src/NetworkOPs.cpp +++ b/src/NetworkOPs.cpp @@ -541,7 +541,7 @@ bool NetworkOPs::hasTXSet(boost::shared_ptr peer, const uint256& set, newc void NetworkOPs::mapComplete(const uint256& hash, SHAMap::pointer map) { if (mConsensus) - mConsensus->mapComplete(hash, map); + mConsensus->mapComplete(hash, map, true); } void NetworkOPs::endConsensus()