diff --git a/TODO b/TODO index b852e9e25..de85ee463 100644 --- a/TODO +++ b/TODO @@ -12,47 +12,39 @@ Better handling of corrupt blocks. Network: - Crypto on network. TLS? - Make work with IPv6 -- Consider node addresses CLI client - Implement CLI option "--help". -- UPnP should be disablable. - - Should also attempt random port usage. General: - Better logging. - Colours. - - Time/thread/channel stamp. - Move over to new system. -AlephZero: -- Allow units to be selected for transactions. - -### GAV +### Gav For PoC2: +Network: +- NotInChain will be very bad for new peers - it'll run through until the genesis. + - Check how many it has first. + +BUG: need to discard transactions if nonce too old. + +### Marko + Ubuntu builds - Raring (branch, local, x64 only :-( ) - Quantal (branch) (Launchpad) - Saucy (master) (Launchpad) -Server -- Get PoC-2 running on dev server ready for switchover on release. -- Or just run on release @30300? - -Network: -- NotInChain will be very bad for new peers - it'll run through until the genesis. - - Check how many it has first. - -UI: -- State panel shouldn't show pending (i.e. post-mined) transactions. +### Alex +Mac build -### ERIC +### Eric -Build: -- Windows build. +Windows build. LATER: diff --git a/alethzero/Main.ui b/alethzero/Main.ui index 67dfa163e..674041d9c 100644 --- a/alethzero/Main.ui +++ b/alethzero/Main.ui @@ -153,8 +153,11 @@ QFrame::NoFrame - + + + QLayout::SetFixedSize + diff --git a/alethzero/MainWin.cpp b/alethzero/MainWin.cpp index 273ccd871..af5cf1bc7 100644 --- a/alethzero/MainWin.cpp +++ b/alethzero/MainWin.cpp @@ -80,16 +80,28 @@ void Main::writeSettings() } s.setValue("address", b); - // TODO: save peers - implement it in PeerNetwork though returning RLP bytes - /*for (uint i = 0; !s.value(QString("peer%1").arg(i)).isNull(); ++i) + s.setValue("upnp", ui->upnp->isChecked()); + s.setValue("clientName", ui->clientName->text()); + s.setValue("idealPeers", ui->idealPeers->value()); + s.setValue("port", ui->port->value()); + + if (m_client->peerServer()) { - s.value(QString("peer%1").arg(i)).toString(); - }*/ + bytes d = m_client->peerServer()->savePeers(); + m_peers = QByteArray((char*)d.data(), d.size()); + + } + s.setValue("peers", m_peers); + + s.setValue("geometry", saveGeometry()); } void Main::readSettings() { QSettings s("ethereum", "alethzero"); + + restoreGeometry(s.value("geometry").toByteArray()); + QByteArray b = s.value("address").toByteArray(); if (b.isEmpty()) m_myKeys.append(KeyPair::create()); @@ -103,14 +115,11 @@ void Main::readSettings() } } m_client->setAddress(m_myKeys.back().address()); - - writeSettings(); - - // TODO: restore peers - implement it in PeerNetwork though giving RLP bytes - /*for (uint i = 0; !s.value(QString("peer%1").arg(i)).isNull(); ++i) - { - s.value(QString("peer%1").arg(i)).toString(); - }*/ + m_peers = s.value("peers").toByteArray(); + ui->upnp->setChecked(s.value("upnp", true).toBool()); + ui->clientName->setText(s.value("clientName", "").toString()); + ui->idealPeers->setValue(s.value("idealPeers", ui->idealPeers->value()).toInt()); + ui->port->setValue(s.value("port", ui->port->value()).toInt()); } void Main::refresh() @@ -247,7 +256,11 @@ void Main::on_net_triggered() n += "/" ADD_QUOTES(ETH_BUILD_TYPE) "/" ADD_QUOTES(ETH_BUILD_PLATFORM); m_client->setClientVersion(n); if (ui->net->isChecked()) + { m_client->startNetwork(ui->port->value(), string(), 0, NodeMode::Full, ui->idealPeers->value(), std::string(), ui->upnp->isChecked()); + if (m_peers.size()) + m_client->peerServer()->restorePeers(bytesConstRef((byte*)m_peers.data(), m_peers.size())); + } else m_client->stopNetwork(); } diff --git a/alethzero/MainWin.h b/alethzero/MainWin.h index 7f9cd16cf..0a76c6c75 100644 --- a/alethzero/MainWin.h +++ b/alethzero/MainWin.h @@ -56,6 +56,7 @@ private: eth::Client* m_client; + QByteArray m_peers; QMutex m_guiLock; QTimer* m_refresh; QStringList m_servers; diff --git a/libethereum/PeerNetwork.cpp b/libethereum/PeerNetwork.cpp index 59f855798..e42913d43 100644 --- a/libethereum/PeerNetwork.cpp +++ b/libethereum/PeerNetwork.cpp @@ -197,9 +197,7 @@ bool PeerSession::interpret(RLP const& _r) for (unsigned i = 1; i < _r.itemCount(); ++i) { auto ep = bi::tcp::endpoint(bi::address_v4(_r[i][0].toArray()), _r[i][1].toInt()); - Public id; - if (_r[i].itemCount() > 2) - id = _r[i][2].toHash(); + Public id = _r[i][2].toHash(); clogS(NetAllDetail) << "Checking: " << ep << "(" << asHex(id.ref().cropped(0, 4)) << ")"; @@ -223,8 +221,8 @@ bool PeerSession::interpret(RLP const& _r) for (auto i: m_server->m_incomingPeers) if (i.second == ep) goto CONTINUE; - m_server->m_incomingPeers.insert(make_pair(id, ep)); - clogS(NetMessageDetail) << "New peer: " << ep; + m_server->m_incomingPeers[id] = ep; + clogS(NetMessageDetail) << "New peer: " << ep << "(" << id << ")"; CONTINUE:; } break; @@ -970,3 +968,25 @@ void PeerServer::pingAll() if (auto j = i.second.lock()) j->ping(); } + +bytes PeerServer::savePeers() const +{ + RLPStream ret; + int n = 0; + for (auto& i: m_peers) + if (auto p = i.second.lock()) + if (p->m_socket.is_open() && p->endpoint().port()) + { + ret.appendList(3) << p->endpoint().address().to_v4().to_bytes() << p->endpoint().port() << p->m_id; + n++; + } + return RLPStream(n).appendRaw(ret.out(), n).out(); +} + +void PeerServer::restorePeers(bytesConstRef _b) +{ + for (auto i: RLP(_b)) + { + m_incomingPeers.insert(make_pair((Public)i[2], bi::tcp::endpoint(bi::address_v4(i[0].toArray()), i[1].toInt()))); + } +} diff --git a/libethereum/PeerNetwork.h b/libethereum/PeerNetwork.h index f8a28335a..d6cd7137e 100644 --- a/libethereum/PeerNetwork.h +++ b/libethereum/PeerNetwork.h @@ -111,8 +111,8 @@ private: void sealAndSend(RLPStream& _s); void sendDestroy(bytes& _msg); void send(bytesConstRef _msg); - PeerServer* m_server; + bi::tcp::socket m_socket; std::array m_data; PeerInfo m_info; @@ -182,6 +182,9 @@ public: /// Get the port we're listening on currently. short listenPort() const { return m_public.port(); } + bytes savePeers() const; + void restorePeers(bytesConstRef _b); + private: void seal(bytes& _b); void populateAddresses(); @@ -208,7 +211,7 @@ private: std::vector m_incomingTransactions; std::vector m_incomingBlocks; - std::multimap m_incomingPeers; + std::map m_incomingPeers; h256 m_latestBlockSent; std::set m_transactionsSent;