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;