From 2494992d5d8c0e4e726eb709b8938ea2a2f433a6 Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Thu, 26 Apr 2012 15:39:16 -0700 Subject: [PATCH 1/4] Simplify hashing of CBase58Data. --- src/base58.h | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/base58.h b/src/base58.h index 53d13d704..e10aeb5a9 100644 --- a/src/base58.h +++ b/src/base58.h @@ -18,7 +18,6 @@ #include #include #include -#include #include #include "bignum.h" @@ -244,18 +243,14 @@ public: bool operator< (const CBase58Data& b58) const { return CompareTo(b58) < 0; } bool operator> (const CBase58Data& b58) const { return CompareTo(b58) > 0; } - friend std::size_t hash_value(CBase58Data const& b58); + friend std::size_t hash_value(const CBase58Data& b58); }; -inline std::size_t hash_value(CBase58Data const& b58) +inline std::size_t hash_value(const CBase58Data& b58) { - std::size_t seed = 0; + std::size_t seed = boost::hash_value(b58.nVersion); - boost::hash_combine(seed, b58.nVersion); - BOOST_FOREACH(const unsigned char& x, b58.vchData) - { - boost::hash_combine(seed, x); - } + boost::hash_combine(seed, b58.vchData); return seed; } From fe66dcfdc2d9d2a1c25086551ba1368f8be1675d Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Fri, 27 Apr 2012 14:00:25 -0700 Subject: [PATCH 2/4] Fully clear NewcoinAddress. --- src/NewcoinAddress.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/NewcoinAddress.cpp b/src/NewcoinAddress.cpp index cbdea8105..366baf852 100644 --- a/src/NewcoinAddress.cpp +++ b/src/NewcoinAddress.cpp @@ -25,6 +25,7 @@ bool NewcoinAddress::isValid() const void NewcoinAddress::clear() { nVersion = VER_NONE; + vchData.clear(); } #if 0 From b49b0d59a5a2e023846bd060e6728b264f85807d Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Fri, 27 Apr 2012 14:09:13 -0700 Subject: [PATCH 3/4] Transmit node public and don't talk to self or redundant nodes. --- src/ConnectionPool.cpp | 28 ++- src/ConnectionPool.h | 6 +- src/Peer.cpp | 387 +++++++++++++++++++++++------------------ src/Peer.h | 4 +- src/Wallet.h | 2 + src/newcoin.proto | 2 +- 6 files changed, 251 insertions(+), 178 deletions(-) diff --git a/src/ConnectionPool.cpp b/src/ConnectionPool.cpp index 4fae2ac89..a39b5738a 100644 --- a/src/ConnectionPool.cpp +++ b/src/ConnectionPool.cpp @@ -34,7 +34,7 @@ void ConnectionPool::relayMessage(Peer* fromPeer, PackedMessage::pointer msg) // Inbound connection, false=reject // Reject addresses we already have in our table. // XXX Reject, if we have too many connections. -bool ConnectionPool::peerAccepted(Peer::pointer peer, const std::string& strIp, int iPort) +bool ConnectionPool::peerRegister(Peer::pointer peer, const std::string& strIp, int iPort) { bool bAccept; ipPort ip = make_pair(strIp, iPort); @@ -49,7 +49,7 @@ bool ConnectionPool::peerAccepted(Peer::pointer peer, const std::string& strIp, { // Did not find it. Not already connecting or connected. - std::cerr << "ConnectionPool::peerAccepted: " << ip.first << " " << ip.second << std::endl; + std::cerr << "ConnectionPool::peerRegister: " << ip.first << " " << ip.second << std::endl; // Mark as connecting. mIpMap[ip] = peer; bAccept = true; @@ -77,6 +77,8 @@ bool ConnectionPool::connectTo(const std::string& strIp, int iPort) if (it == mIpMap.end()) { // Did not find it. Not already connecting or connected. + std::cerr << "ConnectionPool::connectTo: Connectting: " + << strIp << " " << iPort << std::endl; Peer::pointer peer(Peer::create(theApp->getIOService())); @@ -108,9 +110,24 @@ Json::Value ConnectionPool::getPeersJson() return ret; } -void ConnectionPool::peerConnected(Peer::pointer peer) +// Now know peer's node public key. Determine if we want to stay connected. +bool ConnectionPool::peerConnected(Peer::pointer peer, const NewcoinAddress& na) { - std::cerr << "ConnectionPool::peerConnected" << std::endl; + bool bSuccess; + + std::cerr << "ConnectionPool::peerConnected: " << na.humanNodePublic() << std::endl; + + if (na == theApp->getWallet().getNodePublic()) + { + std::cerr << "ConnectionPool::peerConnected: To self." << std::endl; + bSuccess = false; + } + else + { + bSuccess = true; + } + + return bSuccess; } void ConnectionPool::peerDisconnected(Peer::pointer peer) @@ -147,7 +164,8 @@ void ConnectionPool::peerDisconnected(Peer::pointer peer) if (itIp == mIpMap.end()) { // Did not find it. Not already connecting or connected. - std::cerr << "Internal Error: peer wasn't connected." << std::endl; + std::cerr << "Internal Error: peer wasn't connected: " + << peer->mIpPort.first << " " << peer->mIpPort.second << std::endl; // XXX Bad error. } else diff --git a/src/ConnectionPool.h b/src/ConnectionPool.h index b19c27af8..135ab3b25 100644 --- a/src/ConnectionPool.h +++ b/src/ConnectionPool.h @@ -45,10 +45,10 @@ public: // // Inbound connection, false=reject - bool peerAccepted(Peer::pointer peer, const std::string& strIp, int iPort); + bool peerRegister(Peer::pointer peer, const std::string& strIp, int iPort); - // We know peers node public key. - void peerConnected(Peer::pointer peer); + // We know peers node public key. false=reject + bool peerConnected(Peer::pointer peer, const NewcoinAddress& na); // No longer connected. void peerDisconnected(Peer::pointer peer); diff --git a/src/Peer.cpp b/src/Peer.cpp index bf49ae0e3..33f11a719 100644 --- a/src/Peer.cpp +++ b/src/Peer.cpp @@ -14,6 +14,7 @@ #include "Application.h" #include "Conversion.h" #include "SerializedTransaction.h" +#include "utils.h" Peer::Peer(boost::asio::io_service& io_service) : mSocket(io_service), @@ -26,7 +27,7 @@ void Peer::handle_write(const boost::system::error_code& error, size_t bytes_tra { #ifdef DEBUG if(error) - std::cout << "Peer::handle_write Error: " << error << " bytes: "<< bytes_transferred << std::endl; + std::cout << "Peer::handle_write Error: " << error << " bytes: " << bytes_transferred << std::endl; else std::cout << "Peer::handle_write bytes: "<< bytes_transferred << std::endl; #endif @@ -55,7 +56,10 @@ void Peer::detach() mSendQ.clear(); mSocket.close(); - theApp->getConnectionPool().peerDisconnected(shared_from_this()); + if (!mIpPort.first.empty()) { + theApp->getConnectionPool().peerDisconnected(shared_from_this()); + mIpPort.first.clear(); + } } // Begin trying to connect. We are not connected till we know and accept peer's public key. @@ -64,6 +68,9 @@ void Peer::connect(const std::string strIp, int iPort) { int iPortAct = iPort < 0 ? SYSTEM_PEER_PORT : iPort; + std::cout << "Peer::connect: " << strIp << " " << iPort << std::endl; + mIpPort = make_pair(strIp, iPort); + boost::asio::ip::tcp::resolver::query query(strIp, boost::lexical_cast(iPortAct), boost::asio::ip::resolver_query_base::numeric_host|boost::asio::ip::resolver_query_base::numeric_service); boost::asio::ip::tcp::resolver resolver(theApp->getIOService()); @@ -72,12 +79,13 @@ void Peer::connect(const std::string strIp, int iPort) if (err || itrEndpoint == boost::asio::ip::tcp::resolver::iterator()) { + std::cerr << "Peer::connect: Bad IP" << std::endl; // Failed to resolve ip. detach(); } else { - mIpPort = make_pair(strIp, iPort); + std::cerr << "Peer::connect: Connectting: " << mIpPort.first << " " << mIpPort.second << std::endl; #if 1 boost::asio::async_connect( mSocket, @@ -112,9 +120,9 @@ void Peer::handleConnect(const boost::system::error_code& error, boost::asio::ip else { std::cout << "Socket Connected." << std::endl; - // XXX Exchange public keys. - sendHello(); + start_read_header(); + sendHello(); } } @@ -135,7 +143,7 @@ void Peer::connected(const boost::system::error_code& error) std::cout << "Remote peer: accept error: " << error << std::endl; detach(); } - else if (!theApp->getConnectionPool().peerAccepted(shared_from_this(), strIp, iPort)) + else if (!theApp->getConnectionPool().peerRegister(shared_from_this(), strIp, iPort)) { std::cout << "Remote peer: rejecting." << std::endl; // XXX Reject with a rejection message: already connected @@ -143,13 +151,15 @@ void Peer::connected(const boost::system::error_code& error) } else { + // Not redundant, add to connection list. + std::cout << "Remote peer: accepted." << std::endl; //BOOST_LOG_TRIVIAL(info) << "Connected to Peer."; - // Not redundant, add to connection list. - // XXX Exchange public keys. - sendHello(); + mIpPort = make_pair(strIp, iPort); + start_read_header(); + sendHello(); } } @@ -240,175 +250,214 @@ void Peer::processReadBuffer() #ifdef DEBUG std::cerr << "PRB(" << type << "), len=" << (mReadbuf.size()-HEADER_SIZE) << std::endl; #endif - switch(type) + + if (mIpPort.first.empty() == (type == newcoin::mtHELLO)) { - case newcoin::mtHELLO: + // If not connectted, only accept mtHELLO. Otherwise, don't accept mtHELLO. + std::cerr << "Wrong message type: " << type << std::endl; + detach(); + } + else + { + switch(type) { - newcoin::TMHello msg; - if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recvHello(msg); - else std::cout << "parse error: " << type << std::endl; //else BOOST_LOG_TRIVIAL(info) << "Error: " << error; + case newcoin::mtHELLO: + { + newcoin::TMHello msg; + if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) + recvHello(msg); + else std::cout << "parse error: " << type << std::endl; //else BOOST_LOG_TRIVIAL(info) << "Error: " << error; + } + break; + + case newcoin::mtERROR_MSG: + { + newcoin::TMErrorMsg msg; + if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) + recvErrorMessage(msg); + else std::cout << "pars error: " << type << std::endl; + } + break; + + case newcoin::mtPING: + { + newcoin::TMPing msg; + if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) + recvPing(msg); + else std::cout << "pars error: " << type << std::endl; + } + break; + + case newcoin::mtGET_CONTACTS: + { + newcoin::TMGetContacts msg; + if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) + recvGetContacts(msg); + else std::cout << "pars error: " << type << std::endl; + } + break; + + case newcoin::mtCONTACT: + { + newcoin::TMContact msg; + if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) + recvContact(msg); + else std::cout << "pars error: " << type << std::endl; + } + break; + + case newcoin::mtSEARCH_TRANSACTION: + { + newcoin::TMSearchTransaction msg; + if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) + recvSearchTransaction(msg); + else std::cout << "pars error: " << type << std::endl; + } + break; + + case newcoin::mtGET_ACCOUNT: + { + newcoin::TMGetAccount msg; + if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) + recvGetAccount(msg); + else std::cout << "pars error: " << type << std::endl; + } + break; + + case newcoin::mtACCOUNT: + { + newcoin::TMAccount msg; + if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) + recvAccount(msg); + else std::cout << "pars error: " << type << std::endl; + } + break; + + case newcoin::mtTRANSACTION: + { + newcoin::TMTransaction msg; + if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) + recvTransaction(msg); + else std::cout << "pars error: " << type << std::endl; + } + break; + + case newcoin::mtGET_LEDGER: + { + newcoin::TMGetLedger msg; + if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) + recvGetLedger(msg); + else std::cout << "pars error: " << type << std::endl; + } + break; + + case newcoin::mtLEDGER: + { + newcoin::TMLedgerData msg; + if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) + recvLedger(msg); + else std::cout << "pars error: " << type << std::endl; + } + break; + + #if 0 + case newcoin::mtPROPOSE_LEDGER: + { + newcoin::TM msg; + if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) + recv(msg); + else std::cout << "pars error: " << type << std::endl; + } + break; + + case newcoin::mtCLOSE_LEDGER: + { + newcoin::TM msg; + if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) + recv(msg); + else std::cout << "pars error: " << type << std::endl; + } + break; + + case newcoin::mtGET_VALIDATION: + { + newcoin::TM msg; + if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) + recv(msg); + else std::cout << "pars error: " << type << std::endl; + } + break; + + case newcoin::mtVALIDATION: + { + newcoin::TM msg; + if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) + recv(msg); + else std::cout << "pars error: " << type << std::endl; + } + break; + + #endif + + case newcoin::mtGET_OBJECT: + { + newcoin::TMGetObjectByHash msg; + if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) + recvGetObjectByHash(msg); + else std::cout << "pars error: " << type << std::endl; + } + break; + + case newcoin::mtOBJECT: + { + newcoin::TMObjectByHash msg; + if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) + recvObjectByHash(msg); + else std::cout << "pars error: " << type << std::endl; + } + break; + + default: + std::cout << "Unknown Msg: " << type << std::endl; //else BOOST_LOG_TRIVIAL(info) << "Error: " << error; } - break; - - case newcoin::mtERROR_MSG: - { - newcoin::TMErrorMsg msg; - if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recvErrorMessage(msg); - else std::cout << "pars error: " << type << std::endl; - } - break; - - case newcoin::mtPING: - { - newcoin::TMPing msg; - if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recvPing(msg); - else std::cout << "pars error: " << type << std::endl; - } - break; - - case newcoin::mtGET_CONTACTS: - { - newcoin::TMGetContacts msg; - if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recvGetContacts(msg); - else std::cout << "pars error: " << type << std::endl; - } - break; - - case newcoin::mtCONTACT: - { - newcoin::TMContact msg; - if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recvContact(msg); - else std::cout << "pars error: " << type << std::endl; - } - break; - - case newcoin::mtSEARCH_TRANSACTION: - { - newcoin::TMSearchTransaction msg; - if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recvSearchTransaction(msg); - else std::cout << "pars error: " << type << std::endl; - } - break; - - case newcoin::mtGET_ACCOUNT: - { - newcoin::TMGetAccount msg; - if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recvGetAccount(msg); - else std::cout << "pars error: " << type << std::endl; - } - break; - - case newcoin::mtACCOUNT: - { - newcoin::TMAccount msg; - if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recvAccount(msg); - else std::cout << "pars error: " << type << std::endl; - } - break; - - case newcoin::mtTRANSACTION: - { - newcoin::TMTransaction msg; - if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recvTransaction(msg); - else std::cout << "pars error: " << type << std::endl; - } - break; - - case newcoin::mtGET_LEDGER: - { - newcoin::TMGetLedger msg; - if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recvGetLedger(msg); - else std::cout << "pars error: " << type << std::endl; - } - break; - - case newcoin::mtLEDGER: - { - newcoin::TMLedgerData msg; - if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recvLedger(msg); - else std::cout << "pars error: " << type << std::endl; - } - break; - -#if 0 - case newcoin::mtPROPOSE_LEDGER: - { - newcoin::TM msg; - if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recv(msg); - else std::cout << "pars error: " << type << std::endl; - } - break; - - case newcoin::mtCLOSE_LEDGER: - { - newcoin::TM msg; - if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recv(msg); - else std::cout << "pars error: " << type << std::endl; - } - break; - - case newcoin::mtGET_VALIDATION: - { - newcoin::TM msg; - if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recv(msg); - else std::cout << "pars error: " << type << std::endl; - } - break; - - case newcoin::mtVALIDATION: - { - newcoin::TM msg; - if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recv(msg); - else std::cout << "pars error: " << type << std::endl; - } - break; - -#endif - - case newcoin::mtGET_OBJECT: - { - newcoin::TMGetObjectByHash msg; - if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recvGetObjectByHash(msg); - else std::cout << "pars error: " << type << std::endl; - } - break; - - case newcoin::mtOBJECT: - { - newcoin::TMObjectByHash msg; - if(msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE)) - recvObjectByHash(msg); - else std::cout << "pars error: " << type << std::endl; - } - break; - - default: - std::cout << "Unknown Msg: " << type << std::endl; //else BOOST_LOG_TRIVIAL(info) << "Error: " << error; } } - void Peer::recvHello(newcoin::TMHello& packet) { #ifdef DEBUG - std::cerr << "Recv(Hello) v=" << packet.version() << ", index=" << packet.ledgerindex() << std::endl; + std::cerr << "Recv(Hello) v=" << packet.version() + << ", index=" << packet.ledgerindex() + << std::endl; #endif + bool bDetach = true; + + if (mPublicKey.isValid()) + { + std::cerr << "Recv(Hello): Disconnect: Extraneous node public key." << std::endl; + } + else if (!mPublicKey.setNodePublic(packet.nodepublic())) + { + std::cerr << "Recv(Hello): Disconnect: Bad node public key." << std::endl; + } + else if (!theApp->getConnectionPool().peerConnected(shared_from_this(), mPublicKey)) + { + // Already connected, self, or some other reason. + std::cerr << "Recv(Hello): Disconnect: Extraneous connection." << std::endl; + } + else + { + // Successful connection. + // XXX Kill hello timer. + // XXX Set timer: connection is in grace period to be useful. + bDetach = false; + } + + if (bDetach) + { + mPublicKey.clear(); + detach(); + } } void Peer::recvTransaction(newcoin::TMTransaction& packet) @@ -605,11 +654,13 @@ void Peer::recvLedger(newcoin::TMLedgerData& packet) void Peer::sendHello() { + // XXX Start timer for hello required by. newcoin::TMHello* h=new newcoin::TMHello(); // set up parameters h->set_version(theConfig.VERSION); h->set_ledgerindex(theApp->getOPs().getCurrentLedgerID()); h->set_nettime(theApp->getOPs().getNetworkTime()); + h->set_nodepublic(theApp->getWallet().getNodePublic().humanNodePublic()); h->set_ipv4port(theConfig.PEER_PORT); Ledger::pointer closingLedger=theApp->getMasterLedger().getClosingLedger(); diff --git a/src/Peer.h b/src/Peer.h index 911755cce..f86937688 100644 --- a/src/Peer.h +++ b/src/Peer.h @@ -28,12 +28,14 @@ public: static const int psbGotHello=0, psbSentHello=1, psbInMap=2, psbTrusted=3; static const int psbNoLedgers=4, psbNoTransactions=5, psbDownLevel=6; - NewcoinAddress mPublicKey; // Public key of peer. + NewcoinAddress mPublicKey; // Node public key of peer. ipPort mIpPort; void handleConnect(const boost::system::error_code& error, boost::asio::ip::tcp::resolver::iterator it); private: + bool bRegistered; + boost::asio::ip::tcp::socket mSocket; boost::asio::ssl::context mCtx; boost::asio::ssl::stream mSocketSsl; diff --git a/src/Wallet.h b/src/Wallet.h index 9588e6566..5e22547ea 100644 --- a/src/Wallet.h +++ b/src/Wallet.h @@ -50,6 +50,8 @@ public: // - Maintain peer connectivity through validation and peer management. void start(); + NewcoinAddress& getNodePublic() { return mNodePublicKey; } + NewcoinAddress addFamily(const std::string& passPhrase, bool lock); NewcoinAddress addFamily(const NewcoinAddress& familySeed, bool lock); NewcoinAddress addFamily(const NewcoinAddress& familyGenerator); diff --git a/src/newcoin.proto b/src/newcoin.proto index cb4eecbe0..538f0f98f 100644 --- a/src/newcoin.proto +++ b/src/newcoin.proto @@ -38,7 +38,7 @@ message TMHello { required uint32 version = 1; optional uint32 ledgerIndex = 2; optional uint64 netTime = 3; - optional bytes nodeID = 4; // node may opt to remain anonymous + optional bytes nodePublic = 4; // node may opt to remain anonymous optional uint32 ipv4Port = 5; optional bytes closedLedger = 6; } From 1509553cfc17c7683cc9b7ba4a5bdfa4ee8e7465 Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Fri, 27 Apr 2012 14:34:07 -0700 Subject: [PATCH 4/4] Fix peer reporting. --- src/ConnectionPool.cpp | 3 ++- src/Peer.cpp | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ConnectionPool.cpp b/src/ConnectionPool.cpp index a39b5738a..685ad2f41 100644 --- a/src/ConnectionPool.cpp +++ b/src/ConnectionPool.cpp @@ -124,7 +124,8 @@ bool ConnectionPool::peerConnected(Peer::pointer peer, const NewcoinAddress& na) } else { - bSuccess = true; + mConnectedMap[na] = peer; + bSuccess = true; } return bSuccess; diff --git a/src/Peer.cpp b/src/Peer.cpp index 33f11a719..4192d070b 100644 --- a/src/Peer.cpp +++ b/src/Peer.cpp @@ -683,8 +683,8 @@ void Peer::punishPeer(PeerPunish) Json::Value Peer::getJson() { Json::Value ret(Json::objectValue); - ret["ip"] = mSocket.remote_endpoint().address().to_string(); - ret["port"] = mSocket.remote_endpoint().port(); + ret["ip"] = mIpPort.first; + ret["port"] = mIpPort.second; ret["public_key"] = mPublicKey.ToString(); return ret;