From 3bd691300e7adbae89978ecd2d08205cfb4557a7 Mon Sep 17 00:00:00 2001 From: subtly Date: Sun, 5 Apr 2015 17:01:57 +0200 Subject: [PATCH 01/10] fix first whisper test --- libwhisper/WhisperPeer.cpp | 4 +- test/whisperTopic.cpp | 77 ++++++++++++++++++-------------------- 2 files changed, 37 insertions(+), 44 deletions(-) diff --git a/libwhisper/WhisperPeer.cpp b/libwhisper/WhisperPeer.cpp index 53ea91a9e..06957ed04 100644 --- a/libwhisper/WhisperPeer.cpp +++ b/libwhisper/WhisperPeer.cpp @@ -71,10 +71,8 @@ bool WhisperPeer::interpret(unsigned _id, RLP const& _r) } case MessagesPacket: { - unsigned n = 0; for (auto i: _r) - if (n++) - host()->inject(Envelope(i), this); + host()->inject(Envelope(i), this); break; } default: diff --git a/test/whisperTopic.cpp b/test/whisperTopic.cpp index 0ea681b67..f2aa818ee 100644 --- a/test/whisperTopic.cpp +++ b/test/whisperTopic.cpp @@ -32,33 +32,27 @@ using namespace dev::shh; BOOST_AUTO_TEST_SUITE(whisper) -#if ALEX_HASH_FIXED_NETWORKING BOOST_AUTO_TEST_CASE(topic) { cnote << "Testing Whisper..."; auto oldLogVerbosity = g_logVerbosity; - g_logVerbosity = 0; + g_logVerbosity = 11; - Host host1("Test", NetworkPreferences(30303, "127.0.0.1", false, true)); + Host host1("Test", NetworkPreferences("127.0.0.1", 30303, false)); + host1.setIdealPeerCount(1); auto whost1 = host1.registerCapability(new WhisperHost()); host1.start(); - while (!host1.isStarted()) - this_thread::sleep_for(chrono::milliseconds(2)); - - bool started = false; + bool host1Ready = false; unsigned result = 0; std::thread listener([&]() { setThreadName("other"); - started = true; - + /// Only interested in odd packets auto w = whost1->installWatch(BuildTopicMask("odd")); - - started = true; + host1Ready = true; set received; - for (int iterout = 0, last = 0; iterout < 200 && last < 81; ++iterout) { for (auto i: whost1->checkWatch(w)) @@ -76,21 +70,21 @@ BOOST_AUTO_TEST_CASE(topic) }); - Host host2("Test", NetworkPreferences(30300, "127.0.0.1", false, true)); + Host host2("Test", NetworkPreferences("127.0.0.1", 30300, false)); + host1.setIdealPeerCount(1); auto whost2 = host2.registerCapability(new WhisperHost()); host2.start(); - - while (!host2.isStarted()) - this_thread::sleep_for(chrono::milliseconds(2)); - - this_thread::sleep_for(chrono::milliseconds(100)); - host2.addNode(host1.id(), "127.0.0.1", 30303, 30303); - - this_thread::sleep_for(chrono::milliseconds(500)); - - while (!started) - this_thread::sleep_for(chrono::milliseconds(2)); - + + while (!host1.haveNetwork()) + this_thread::sleep_for(chrono::milliseconds(5)); + host2.addNode(host1.id(), bi::address::from_string("127.0.0.1"), 30303, 30303); + + // wait for nodes to connect + this_thread::sleep_for(chrono::milliseconds(1000)); + + while (!host1Ready) + this_thread::sleep_for(chrono::milliseconds(10)); + KeyPair us = KeyPair::create(); for (int i = 0; i < 10; ++i) { @@ -104,6 +98,7 @@ BOOST_AUTO_TEST_CASE(topic) BOOST_REQUIRE_EQUAL(result, 1 + 9 + 25 + 49 + 81); } +#if ALEX_HASH_FIXED_NETWORKING BOOST_AUTO_TEST_CASE(forwarding) { cnote << "Testing Whisper forwarding..."; @@ -111,11 +106,11 @@ BOOST_AUTO_TEST_CASE(forwarding) g_logVerbosity = 0; // Host must be configured not to share peers. - Host host1("Listner", NetworkPreferences(30303, "", false, true)); + Host host1("Listner", NetworkPreferences("127.0.0.1", 30303, false)); host1.setIdealPeerCount(0); auto whost1 = host1.registerCapability(new WhisperHost()); host1.start(); - while (!host1.isStarted()) + while (!host1.haveNetwork()) this_thread::sleep_for(chrono::milliseconds(2)); unsigned result = 0; @@ -146,11 +141,11 @@ BOOST_AUTO_TEST_CASE(forwarding) // Host must be configured not to share peers. - Host host2("Forwarder", NetworkPreferences(30305, "", false, true)); + Host host2("Forwarder", NetworkPreferences("127.0.0.1", 30305, false)); host2.setIdealPeerCount(1); auto whost2 = host2.registerCapability(new WhisperHost()); host2.start(); - while (!host2.isStarted()) + while (!host2.haveNetwork()) this_thread::sleep_for(chrono::milliseconds(2)); Public fwderid; @@ -163,7 +158,7 @@ BOOST_AUTO_TEST_CASE(forwarding) this_thread::sleep_for(chrono::milliseconds(50)); this_thread::sleep_for(chrono::milliseconds(500)); - host2.addNode(host1.id(), "127.0.0.1", 30303, 30303); + host2.addNode(host1.id(), bi::address::from_string("127.0.0.1"), 30303, 30303); startedForwarder = true; @@ -184,12 +179,12 @@ BOOST_AUTO_TEST_CASE(forwarding) while (!startedForwarder) this_thread::sleep_for(chrono::milliseconds(50)); - Host ph("Sender", NetworkPreferences(30300, "", false, true)); + Host ph("Sender", NetworkPreferences("127.0.0.1", 30300, false)); ph.setIdealPeerCount(1); shared_ptr wh = ph.registerCapability(new WhisperHost()); ph.start(); - ph.addNode(host2.id(), "127.0.0.1", 30305, 30305); - while (!ph.isStarted()) + ph.addNode(host2.id(), bi::address::from_string("127.0.0.1"), 30305, 30305); + while (!ph.haveNetwork()) this_thread::sleep_for(chrono::milliseconds(10)); KeyPair us = KeyPair::create(); @@ -214,11 +209,11 @@ BOOST_AUTO_TEST_CASE(asyncforwarding) bool done = false; // Host must be configured not to share peers. - Host host1("Forwarder", NetworkPreferences(30305, "", false, true)); + Host host1("Forwarder", NetworkPreferences("127.0.0.1", 30305, false)); host1.setIdealPeerCount(1); auto whost1 = host1.registerCapability(new WhisperHost()); host1.start(); - while (!host1.isStarted()) + while (!host1.haveNetwork()) this_thread::sleep_for(chrono::milliseconds(2)); bool startedForwarder = false; @@ -249,13 +244,13 @@ BOOST_AUTO_TEST_CASE(asyncforwarding) this_thread::sleep_for(chrono::milliseconds(2)); { - Host host2("Sender", NetworkPreferences(30300, "", false, true)); + Host host2("Sender", NetworkPreferences("127.0.0.1", 30300, false)); host2.setIdealPeerCount(1); shared_ptr whost2 = host2.registerCapability(new WhisperHost()); host2.start(); - while (!host2.isStarted()) + while (!host2.haveNetwork()) this_thread::sleep_for(chrono::milliseconds(2)); - host2.addNode(host1.id(), "127.0.0.1", 30305, 30305); + host2.addNode(host1.id(), bi::address::from_string("127.0.0.1"), 30305, 30305); while (!host2.peerCount()) this_thread::sleep_for(chrono::milliseconds(5)); @@ -266,13 +261,13 @@ BOOST_AUTO_TEST_CASE(asyncforwarding) } { - Host ph("Listener", NetworkPreferences(30300, "", false, true)); + Host ph("Listener", NetworkPreferences("127.0.0.1", 30300, false)); ph.setIdealPeerCount(1); shared_ptr wh = ph.registerCapability(new WhisperHost()); ph.start(); - while (!ph.isStarted()) + while (!ph.haveNetwork()) this_thread::sleep_for(chrono::milliseconds(2)); - ph.addNode(host1.id(), "127.0.0.1", 30305, 30305); + ph.addNode(host1.id(), bi::address::from_string("127.0.0.1"), 30305, 30305); /// Only interested in odd packets auto w = wh->installWatch(BuildTopicMask("test")); From ce1f7798e3936af0d701497527e48e304eb9f9ee Mon Sep 17 00:00:00 2001 From: subtly Date: Sun, 5 Apr 2015 17:10:29 +0200 Subject: [PATCH 02/10] reenable whisper tests --- test/whisperTopic.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/whisperTopic.cpp b/test/whisperTopic.cpp index f2aa818ee..b43ba708e 100644 --- a/test/whisperTopic.cpp +++ b/test/whisperTopic.cpp @@ -36,7 +36,7 @@ BOOST_AUTO_TEST_CASE(topic) { cnote << "Testing Whisper..."; auto oldLogVerbosity = g_logVerbosity; - g_logVerbosity = 11; + g_logVerbosity = 0; Host host1("Test", NetworkPreferences("127.0.0.1", 30303, false)); host1.setIdealPeerCount(1); @@ -98,7 +98,6 @@ BOOST_AUTO_TEST_CASE(topic) BOOST_REQUIRE_EQUAL(result, 1 + 9 + 25 + 49 + 81); } -#if ALEX_HASH_FIXED_NETWORKING BOOST_AUTO_TEST_CASE(forwarding) { cnote << "Testing Whisper forwarding..."; @@ -291,6 +290,5 @@ BOOST_AUTO_TEST_CASE(asyncforwarding) BOOST_REQUIRE_EQUAL(result, 1); } -#endif BOOST_AUTO_TEST_SUITE_END() From 0f50be0cc8a6d2cc06527ab890d8ef2f55dc2040 Mon Sep 17 00:00:00 2001 From: subtly Date: Fri, 8 May 2015 18:19:31 +0200 Subject: [PATCH 03/10] update whisper test to use fixture for new network code, to allow private addresses and encapsulate host/port information in NodeIPEndpoint. --- test/libwhisper/whisperTopic.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/test/libwhisper/whisperTopic.cpp b/test/libwhisper/whisperTopic.cpp index c49debf61..291b62c17 100644 --- a/test/libwhisper/whisperTopic.cpp +++ b/test/libwhisper/whisperTopic.cpp @@ -30,7 +30,13 @@ using namespace dev; using namespace dev::p2p; using namespace dev::shh; -BOOST_AUTO_TEST_SUITE(whisper) +struct P2PFixture +{ + P2PFixture() { dev::p2p::NodeIPEndpoint::test_allowLocal = true; } + ~P2PFixture() { dev::p2p::NodeIPEndpoint::test_allowLocal = false; } +}; + +BOOST_FIXTURE_TEST_SUITE(whisper, P2PFixture) BOOST_AUTO_TEST_CASE(topic) { @@ -77,7 +83,7 @@ BOOST_AUTO_TEST_CASE(topic) while (!host1.haveNetwork()) this_thread::sleep_for(chrono::milliseconds(5)); - host2.addNode(host1.id(), bi::address::from_string("127.0.0.1"), 30303, 30303); + host2.addNode(host1.id(), NodeIPEndpoint(bi::address::from_string("127.0.0.1"), 30303, 30303)); // wait for nodes to connect this_thread::sleep_for(chrono::milliseconds(1000)); @@ -157,7 +163,7 @@ BOOST_AUTO_TEST_CASE(forwarding) this_thread::sleep_for(chrono::milliseconds(50)); this_thread::sleep_for(chrono::milliseconds(500)); - host2.addNode(host1.id(), bi::address::from_string("127.0.0.1"), 30303, 30303); + host2.addNode(host1.id(), NodeIPEndpoint(bi::address::from_string("127.0.0.1"), 30303, 30303)); startedForwarder = true; @@ -182,7 +188,7 @@ BOOST_AUTO_TEST_CASE(forwarding) ph.setIdealPeerCount(1); shared_ptr wh = ph.registerCapability(new WhisperHost()); ph.start(); - ph.addNode(host2.id(), bi::address::from_string("127.0.0.1"), 30305, 30305); + ph.addNode(host2.id(), NodeIPEndpoint(bi::address::from_string("127.0.0.1"), 30305, 30305)); while (!ph.haveNetwork()) this_thread::sleep_for(chrono::milliseconds(10)); @@ -221,7 +227,6 @@ BOOST_AUTO_TEST_CASE(asyncforwarding) setThreadName("forwarder"); this_thread::sleep_for(chrono::milliseconds(500)); -// ph.addNode("127.0.0.1", 30303, 30303); startedForwarder = true; @@ -249,7 +254,7 @@ BOOST_AUTO_TEST_CASE(asyncforwarding) host2.start(); while (!host2.haveNetwork()) this_thread::sleep_for(chrono::milliseconds(2)); - host2.addNode(host1.id(), bi::address::from_string("127.0.0.1"), 30305, 30305); + host2.addNode(host1.id(), NodeIPEndpoint(bi::address::from_string("127.0.0.1"), 30305, 30305)); while (!host2.peerCount()) this_thread::sleep_for(chrono::milliseconds(5)); @@ -266,7 +271,7 @@ BOOST_AUTO_TEST_CASE(asyncforwarding) ph.start(); while (!ph.haveNetwork()) this_thread::sleep_for(chrono::milliseconds(2)); - ph.addNode(host1.id(), bi::address::from_string("127.0.0.1"), 30305, 30305); + ph.addNode(host1.id(), NodeIPEndpoint(bi::address::from_string("127.0.0.1"), 30305, 30305)); /// Only interested in odd packets auto w = wh->installWatch(BuildTopicMask("test")); From 2c0d9e99689332d39b6329a4f23726db2e5b493f Mon Sep 17 00:00:00 2001 From: Liana Husikyan Date: Wed, 3 Jun 2015 18:06:49 +0200 Subject: [PATCH 04/10] corrected the calculation of gas for send --- libsolidity/Compiler.cpp | 2 +- libsolidity/ExpressionCompiler.cpp | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/libsolidity/Compiler.cpp b/libsolidity/Compiler.cpp index 6425367dd..50fb8e3db 100644 --- a/libsolidity/Compiler.cpp +++ b/libsolidity/Compiler.cpp @@ -42,7 +42,7 @@ class StackHeightChecker public: StackHeightChecker(CompilerContext const& _context): m_context(_context), stackHeight(m_context.getStackHeight()) {} - void check() { solAssert(m_context.getStackHeight() == stackHeight, "I sense a disturbance in the stack."); } + void check() {/* solAssert(m_context.getStackHeight() == stackHeight, "I sense a disturbance in the stack."); */} private: CompilerContext const& m_context; unsigned stackHeight; diff --git a/libsolidity/ExpressionCompiler.cpp b/libsolidity/ExpressionCompiler.cpp index bb3260770..51bdfbc43 100644 --- a/libsolidity/ExpressionCompiler.cpp +++ b/libsolidity/ExpressionCompiler.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -497,6 +498,7 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall) { // stack layout: contract_address function_id [gas] [value] _functionCall.getExpression().accept(*this); + arguments.front()->accept(*this); appendTypeConversion(*arguments.front()->getType(), IntegerType(256), true); // Note that function is not the original function, but the ".gas" function. @@ -519,7 +521,6 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall) break; case Location::Send: _functionCall.getExpression().accept(*this); - m_context << u256(0); // 0 gas, we do not want to execute code arguments.front()->accept(*this); appendTypeConversion(*arguments.front()->getType(), *function.getParameterTypes().front(), true); @@ -531,7 +532,7 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall) strings(), Location::Bare, false, - true, + false, true ), {} @@ -1098,7 +1099,10 @@ void ExpressionCompiler::appendExternalFunctionCall( else // send all gas except the amount needed to execute "SUB" and "CALL" // @todo this retains too much gas for now, needs to be fine-tuned. - m_context << u256(50 + (_functionType.valueSet() ? 9000 : 0) + 25000) << eth::Instruction::GAS << eth::Instruction::SUB; + m_context << + u256(eth::c_callGas + 10 + (_functionType.valueSet() ? eth::c_callValueTransferGas : 0) + eth::c_callNewAccountGas) << + eth::Instruction::GAS << + eth::Instruction::SUB; if ( _functionType.getLocation() == FunctionType::Location::CallCode || _functionType.getLocation() == FunctionType::Location::BareCallCode From 4f925169c1144615b10037e1f23085e7f5c7314d Mon Sep 17 00:00:00 2001 From: Liana Husikyan Date: Thu, 4 Jun 2015 11:46:10 +0200 Subject: [PATCH 05/10] fixed assertion --- libsolidity/Compiler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libsolidity/Compiler.cpp b/libsolidity/Compiler.cpp index 50fb8e3db..6425367dd 100644 --- a/libsolidity/Compiler.cpp +++ b/libsolidity/Compiler.cpp @@ -42,7 +42,7 @@ class StackHeightChecker public: StackHeightChecker(CompilerContext const& _context): m_context(_context), stackHeight(m_context.getStackHeight()) {} - void check() {/* solAssert(m_context.getStackHeight() == stackHeight, "I sense a disturbance in the stack."); */} + void check() { solAssert(m_context.getStackHeight() == stackHeight, "I sense a disturbance in the stack."); } private: CompilerContext const& m_context; unsigned stackHeight; From 8593be1b6a114e7cd64ad0db800d88fa2f4a6c9a Mon Sep 17 00:00:00 2001 From: subtly Date: Thu, 4 Jun 2015 14:53:27 +0200 Subject: [PATCH 06/10] Log warning and disconnect when remote passes bad rlp during handshake. --- libp2p/RLPxHandshake.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/libp2p/RLPxHandshake.cpp b/libp2p/RLPxHandshake.cpp index 65116cd58..d7c2e5e3b 100644 --- a/libp2p/RLPxHandshake.cpp +++ b/libp2p/RLPxHandshake.cpp @@ -265,8 +265,17 @@ void RLPXHandshake::transition(boost::system::error_code _ech) } clog(NetTriviaSummary) << (m_originated ? "p2p.connect.egress" : "p2p.connect.ingress") << "hello frame: success. starting session."; - RLP rlp(frame.cropped(1), RLP::ThrowOnFail | RLP::FailIfTooSmall); - m_host->startPeerSession(m_remote, rlp, m_io, m_socket->remoteEndpoint()); + try + { + RLP rlp(frame.cropped(1), RLP::ThrowOnFail | RLP::FailIfTooSmall); + m_host->startPeerSession(m_remote, rlp, m_io, m_socket->remoteEndpoint()); + } + catch (std::exception const& _e) + { + clog(NetWarn) << "Handshake causing an exception:" << _e.what(); + m_nextState = Error; + transition(); + } } }); } From f26bbb21e491e0d1492570d87027c1edb05307e9 Mon Sep 17 00:00:00 2001 From: subtly Date: Thu, 4 Jun 2015 16:10:25 +0200 Subject: [PATCH 07/10] Drop socket and log when peer disconnect occurs mid-read. --- libp2p/Session.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libp2p/Session.cpp b/libp2p/Session.cpp index 2a16007ca..462fea7b1 100644 --- a/libp2p/Session.cpp +++ b/libp2p/Session.cpp @@ -447,8 +447,12 @@ void Session::doRead() clog(NetWarn) << "Error reading: " << ec.message(); drop(TCPError); } - else if (ec && length == 0) + else if (ec && length < tlen) + { + clog(NetWarn) << "Error reading - Abrupt peer disconnect: " << ec.message(); + drop(TCPError); return; + } else { if (!m_io->authAndDecryptFrame(bytesRef(m_data.data(), tlen))) From ce367d3da09c673dae759720cd4f9a942eb28cd1 Mon Sep 17 00:00:00 2001 From: subtly Date: Thu, 4 Jun 2015 17:27:35 +0200 Subject: [PATCH 08/10] update whisper tests --- test/libwhisper/whisperTopic.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/test/libwhisper/whisperTopic.cpp b/test/libwhisper/whisperTopic.cpp index 291b62c17..ba487a92e 100644 --- a/test/libwhisper/whisperTopic.cpp +++ b/test/libwhisper/whisperTopic.cpp @@ -63,7 +63,7 @@ BOOST_AUTO_TEST_CASE(topic) { for (auto i: whost1->checkWatch(w)) { - Message msg = whost1->envelope(i).open(whost1->fullTopic(w)); + Message msg = whost1->envelope(i).open(whost1->fullTopics(w)); last = RLP(msg.payload()).toInt(); if (received.count(last)) continue; @@ -112,7 +112,7 @@ BOOST_AUTO_TEST_CASE(forwarding) // Host must be configured not to share peers. Host host1("Listner", NetworkPreferences("127.0.0.1", 30303, false)); - host1.setIdealPeerCount(0); + host1.setIdealPeerCount(1); auto whost1 = host1.registerCapability(new WhisperHost()); host1.start(); while (!host1.haveNetwork()) @@ -135,7 +135,7 @@ BOOST_AUTO_TEST_CASE(forwarding) { for (auto i: whost1->checkWatch(w)) { - Message msg = whost1->envelope(i).open(whost1->fullTopic(w)); + Message msg = whost1->envelope(i).open(whost1->fullTopics(w)); unsigned last = RLP(msg.payload()).toInt(); cnote << "New message from:" << msg.from() << RLP(msg.payload()).toInt(); result = last; @@ -174,7 +174,7 @@ BOOST_AUTO_TEST_CASE(forwarding) { for (auto i: whost2->checkWatch(w)) { - Message msg = whost2->envelope(i).open(whost2->fullTopic(w)); + Message msg = whost2->envelope(i).open(whost2->fullTopics(w)); cnote << "New message from:" << msg.from() << RLP(msg.payload()).toInt(); } this_thread::sleep_for(chrono::milliseconds(50)); @@ -192,6 +192,9 @@ BOOST_AUTO_TEST_CASE(forwarding) while (!ph.haveNetwork()) this_thread::sleep_for(chrono::milliseconds(10)); + while (!ph.peerCount()) + this_thread::sleep_for(chrono::milliseconds(10)); + KeyPair us = KeyPair::create(); wh->post(us.sec(), RLPStream().append(1).out(), BuildTopic("test")); this_thread::sleep_for(chrono::milliseconds(250)); @@ -237,7 +240,7 @@ BOOST_AUTO_TEST_CASE(asyncforwarding) { for (auto i: whost1->checkWatch(w)) { - Message msg = whost1->envelope(i).open(whost1->fullTopic(w)); + Message msg = whost1->envelope(i).open(whost1->fullTopics(w)); cnote << "New message from:" << msg.from() << RLP(msg.payload()).toInt(); } this_thread::sleep_for(chrono::milliseconds(50)); @@ -280,7 +283,7 @@ BOOST_AUTO_TEST_CASE(asyncforwarding) { for (auto i: wh->checkWatch(w)) { - Message msg = wh->envelope(i).open(wh->fullTopic(w)); + Message msg = wh->envelope(i).open(wh->fullTopics(w)); unsigned last = RLP(msg.payload()).toInt(); cnote << "New message from:" << msg.from() << RLP(msg.payload()).toInt(); result = last; From 3a5e67eaabf531a8b2ea36369a25e98d6a20da6b Mon Sep 17 00:00:00 2001 From: subtly Date: Thu, 4 Jun 2015 17:59:41 +0200 Subject: [PATCH 09/10] Fix network tests: delete host pointers after use. --- test/libp2p/peer.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/libp2p/peer.cpp b/test/libp2p/peer.cpp index 192dacd7b..a5a4a64dc 100644 --- a/test/libp2p/peer.cpp +++ b/test/libp2p/peer.cpp @@ -116,6 +116,9 @@ BOOST_AUTO_TEST_CASE(saveNodes) BOOST_REQUIRE(i.itemCount() == 4 || i.itemCount() == 11); BOOST_REQUIRE(i[0].size() == 4 || i[0].size() == 16); } + + for (auto host: hosts) + delete host; } BOOST_AUTO_TEST_SUITE_END() From c008fe856faeb81393cd2bf8e9663c604e19c9b5 Mon Sep 17 00:00:00 2001 From: arkpar Date: Thu, 4 Jun 2015 19:59:31 +0200 Subject: [PATCH 10/10] fixed iterating over random peers --- libethereum/EthereumHost.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libethereum/EthereumHost.cpp b/libethereum/EthereumHost.cpp index 68619d627..3965a214e 100644 --- a/libethereum/EthereumHost.cpp +++ b/libethereum/EthereumHost.cpp @@ -120,7 +120,8 @@ void EthereumHost::maintainTransactions() for (auto const& i: ts) { bool unsent = !m_transactionsSent.count(i.first); - for (auto const& p: get<1>(randomSelection(0, [&](EthereumPeer* p) { return p->m_requireTransactions || (unsent && !p->m_knownTransactions.count(i.first)); }))) + auto peers = get<1>(randomSelection(0, [&](EthereumPeer* p) { return p->m_requireTransactions || (unsent && !p->m_knownTransactions.count(i.first)); })); + for (auto const& p: peers) peerTransactions[p].push_back(i.first); } for (auto const& t: ts)