From 5735e8c55e446740f7b359f8b2e678d612449007 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 15 Sep 2014 21:49:52 +0200 Subject: [PATCH] Remove old Client network code & API. Move over JsonRpcServer to WebThree. --- CMakeLists.txt | 4 +- alethzero/MainWin.cpp | 4 +- eth/EthStubServer.cpp | 34 ++++--- eth/EthStubServer.h | 7 +- eth/main.cpp | 19 ++-- libethereum/Client.cpp | 170 +++++------------------------------ libethereum/Client.h | 34 +------ libqethereum/QmlEthereum.cpp | 4 +- libqethereum/QmlEthereum.h | 8 +- test/TestHelper.cpp | 2 + third/MainWin.cpp | 10 +-- 11 files changed, 73 insertions(+), 223 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 46cc0753f..6c6ec18cc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -353,7 +353,7 @@ if (NOT LANGUAGES) add_subdirectory(exp) endif () if(NOT ("${TARGET_PLATFORM}" STREQUAL "w64")) - add_subdirectory(neth) + #add_subdirectory(neth) // resurect once moved over to WebThree API. endif () if(QTQML) add_definitions(-DETH_QTQML) @@ -369,7 +369,7 @@ if (NOT LANGUAGES) add_subdirectory(third) if(QTQML) #add_subdirectory(iethxi) - add_subdirectory(walleth) + #add_subdirectory(walleth) // resurect once we want to submit ourselves to QML. endif() endif() endif() diff --git a/alethzero/MainWin.cpp b/alethzero/MainWin.cpp index 734854c2a..37c33de02 100644 --- a/alethzero/MainWin.cpp +++ b/alethzero/MainWin.cpp @@ -506,7 +506,7 @@ void Main::writeSettings() s.setValue("privateChain", m_privateChain); s.setValue("verbosity", ui->verbosity->value()); - bytes d = ethereum()->savePeers(); + bytes d = m_webThree->savePeers(); if (d.size()) m_peers = QByteArray((char*)d.data(), (int)d.size()); s.setValue("peers", m_peers); @@ -1250,7 +1250,7 @@ void Main::on_contracts_currentItemChanged() void Main::on_idealPeers_valueChanged() { - ethereum()->setIdealPeerCount(ui->idealPeers->value()); + m_webThree->setIdealPeerCount(ui->idealPeers->value()); } void Main::on_ourAccounts_doubleClicked() diff --git a/eth/EthStubServer.cpp b/eth/EthStubServer.cpp index 86bb1ba58..a3f21bf42 100644 --- a/eth/EthStubServer.cpp +++ b/eth/EthStubServer.cpp @@ -25,14 +25,15 @@ #include #include #include +#include #include "CommonJS.h" using namespace std; using namespace dev; using namespace dev::eth; -EthStubServer::EthStubServer(jsonrpc::AbstractServerConnector* _conn, Client& _client): +EthStubServer::EthStubServer(jsonrpc::AbstractServerConnector* _conn, WebThreeDirect& _web3): AbstractEthStubServer(_conn), - m_client(_client) + m_web3(_web3) { } @@ -59,20 +60,25 @@ Json::Value EthStubServer::procedures() return ret; } +dev::eth::Client& EthStubServer::ethereum() const +{ + return *m_web3.ethereum(); +} + std::string EthStubServer::coinbase() { - return toJS(m_client.address()); + return toJS(ethereum().address()); } std::string EthStubServer::balanceAt(std::string const& _a) { - return toJS(m_client.balanceAt(jsToAddress(_a), 0)); + return toJS(ethereum().balanceAt(jsToAddress(_a), 0)); } Json::Value EthStubServer::check(Json::Value const& _as) { // TODO -// if (m_client.changed()) +// if (ethereum().changed()) return _as; /* else { @@ -84,7 +90,7 @@ Json::Value EthStubServer::check(Json::Value const& _as) std::string EthStubServer::create(const std::string& _bCode, const std::string& _sec, const std::string& _xEndowment, const std::string& _xGas, const std::string& _xGasPrice) { - Address ret = m_client.transact(jsToSecret(_sec), jsToU256(_xEndowment), jsToBytes(_bCode), jsToU256(_xGas), jsToU256(_xGasPrice)); + Address ret = ethereum().transact(jsToSecret(_sec), jsToU256(_xEndowment), jsToBytes(_bCode), jsToU256(_xGas), jsToU256(_xGasPrice)); return toJS(ret); } @@ -100,17 +106,17 @@ std::string EthStubServer::gasPrice() bool EthStubServer::isContractAt(const std::string& _a) { - return m_client.codeAt(jsToAddress(_a), 0).size(); + return ethereum().codeAt(jsToAddress(_a), 0).size(); } bool EthStubServer::isListening() { - return m_client.haveNetwork(); + return m_web3.haveNetwork(); } bool EthStubServer::isMining() { - return m_client.isMining(); + return ethereum().isMining(); } std::string EthStubServer::key() @@ -130,23 +136,23 @@ Json::Value EthStubServer::keys() int EthStubServer::peerCount() { - return m_client.peerCount(); + return m_web3.peerCount(); } std::string EthStubServer::storageAt(const std::string& _a, const std::string& x) { - return toJS(m_client.stateAt(jsToAddress(_a), jsToU256(x), 0)); + return toJS(ethereum().stateAt(jsToAddress(_a), jsToU256(x), 0)); } Json::Value EthStubServer::transact(const std::string& _aDest, const std::string& _bData, const std::string& _sec, const std::string& _xGas, const std::string& _xGasPrice, const std::string& _xValue) { - m_client.transact(jsToSecret(_sec), jsToU256(_xValue), jsToAddress(_aDest), jsToBytes(_bData), jsToU256(_xGas), jsToU256(_xGasPrice)); + ethereum().transact(jsToSecret(_sec), jsToU256(_xValue), jsToAddress(_aDest), jsToBytes(_bData), jsToU256(_xGas), jsToU256(_xGasPrice)); return Json::Value(); } std::string EthStubServer::txCountAt(const std::string& _a) { - return toJS(m_client.countAt(jsToAddress(_a), 0)); + return toJS(ethereum().countAt(jsToAddress(_a), 0)); } std::string EthStubServer::secretToAddress(const std::string& _a) @@ -167,7 +173,7 @@ Json::Value EthStubServer::block(const std::string& _hash) Json::Value EthStubServer::blockJson(const std::string& _hash) { Json::Value res; - auto const& bc = m_client.blockChain(); + auto const& bc = ethereum().blockChain(); auto b = _hash.length() ? bc.block(h256(_hash)) : bc.block(); diff --git a/eth/EthStubServer.h b/eth/EthStubServer.h index 28af916a2..49b595bb3 100644 --- a/eth/EthStubServer.h +++ b/eth/EthStubServer.h @@ -29,12 +29,12 @@ #include "abstractethstubserver.h" #pragma GCC diagnostic pop -namespace dev { namespace eth { class Client; } class KeyPair; } +namespace dev { class WebThreeDirect; namespace eth { class Client; } class KeyPair; } class EthStubServer: public AbstractEthStubServer { public: - EthStubServer(jsonrpc::AbstractServerConnector* _conn, dev::eth::Client& _client); + EthStubServer(jsonrpc::AbstractServerConnector* _conn, dev::WebThreeDirect& _web3); virtual Json::Value procedures(); virtual std::string balanceAt(std::string const& _a); @@ -57,7 +57,8 @@ public: virtual Json::Value block(const std::string&); void setKeys(std::vector _keys) { m_keys = _keys; } private: - dev::eth::Client& m_client; + dev::eth::Client& ethereum() const; + dev::WebThreeDirect& m_web3; std::vector m_keys; Json::Value jsontypeToValue(int); Json::Value blockJson(const std::string&); diff --git a/eth/main.cpp b/eth/main.cpp index ee09d666d..69a555904 100644 --- a/eth/main.cpp +++ b/eth/main.cpp @@ -300,7 +300,8 @@ int main(int argc, char** argv) cout << credits(); - dev::WebThreeDirect web3("Ethereum(++)/" + clientName + "v" + dev::Version + "/" DEV_QUOTED(ETH_BUILD_TYPE) "/" DEV_QUOTED(ETH_BUILD_PLATFORM), dbPath, false, mode == NodeMode::Full ? set{"eth", "shh"} : set{}, NetworkPreferences(listenPort, publicIP, upnp, false)); + NetworkPreferences netPrefs(listenPort, publicIP, upnp, false); + dev::WebThreeDirect web3("Ethereum(++)/" + clientName + "v" + dev::Version + "/" DEV_QUOTED(ETH_BUILD_TYPE) "/" DEV_QUOTED(ETH_BUILD_PLATFORM), dbPath, false, mode == NodeMode::Full ? set{"eth", "shh"} : set{}, netPrefs); web3.setIdealPeerCount(peers); eth::Client& c = *web3.ethereum(); @@ -315,7 +316,7 @@ int main(int argc, char** argv) auto_ptr jsonrpcServer; if (jsonrpc > -1) { - jsonrpcServer = auto_ptr(new EthStubServer(new jsonrpc::HttpServer(jsonrpc), c)); + jsonrpcServer = auto_ptr(new EthStubServer(new jsonrpc::HttpServer(jsonrpc), web3)); jsonrpcServer->setKeys({us}); jsonrpcServer->StartListening(); } @@ -353,20 +354,20 @@ int main(int argc, char** argv) iss >> cmd; if (cmd == "netstart") { - unsigned port; - iss >> port; - c.startNetwork((short)port); + iss >> netPrefs.listenPort; + web3.setNetworkPreferences(netPrefs); + web3.startNetwork(); } else if (cmd == "connect") { string addr; unsigned port; iss >> addr >> port; - c.connect(addr, (short)port); + web3.connect(addr, (short)port); } else if (cmd == "netstop") { - c.stopNetwork(); + web3.stopNetwork(); } else if (cmd == "minestart") { @@ -399,7 +400,7 @@ int main(int argc, char** argv) { if (jsonrpc < 0) jsonrpc = 8080; - jsonrpcServer = auto_ptr(new EthStubServer(new jsonrpc::HttpServer(jsonrpc), c)); + jsonrpcServer = auto_ptr(new EthStubServer(new jsonrpc::HttpServer(jsonrpc), web3)); jsonrpcServer->setKeys({us}); jsonrpcServer->StartListening(); } @@ -426,7 +427,7 @@ int main(int argc, char** argv) } else if (cmd == "peers") { - for (auto it: c.peers()) + for (auto it: web3.peers()) cout << it.host << ":" << it.port << ", " << it.clientVersion << ", " << std::chrono::duration_cast(it.lastPing).count() << "ms" << endl; diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index 2cf96731d..9779acfbe 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -53,21 +53,6 @@ void VersionChecker::setOk() } } -Client::Client(std::string const& _clientVersion, Address _us, std::string const& _dbPath, bool _forceClean): - m_clientVersion(_clientVersion), - m_vc(_dbPath), - m_bc(_dbPath, !m_vc.ok() || _forceClean), - m_stateDB(State::openDB(_dbPath, !m_vc.ok() || _forceClean)), - m_preMine(_us, m_stateDB), - m_postMine(_us, m_stateDB) -{ - setMiningThreads(); - if (_dbPath.size()) - Defaults::setDBPath(_dbPath); - m_vc.setOk(); - work(); -} - Client::Client(p2p::Host* _extNet, std::string const& _dbPath, bool _forceClean, u256 _networkId): m_vc(_dbPath), m_bc(_dbPath, !m_vc.ok() || _forceClean), @@ -107,7 +92,15 @@ Client::~Client() m_work->join(); m_work.reset(nullptr); } - stopNetwork(); + if (m_workNet) + { + if (m_workNetState.load(std::memory_order_acquire) == Active) + m_workNetState.store(Deleting, std::memory_order_release); + while (m_workNetState.load(std::memory_order_acquire) != Deleted) + this_thread::sleep_for(chrono::milliseconds(10)); + m_workNet->join(); + m_workNet.reset(nullptr); + } } void Client::ensureWorking() @@ -143,21 +136,23 @@ void Client::killChain() void Client::clearPending() { - WriteGuard l(x_stateDB); - if (!m_postMine.pending().size()) - return; h256Set changeds; - for (unsigned i = 0; i < m_postMine.pending().size(); ++i) - appendFromNewPending(m_postMine.bloom(i), changeds); - changeds.insert(PendingChangedFilter); - m_postMine = m_preMine; + { + WriteGuard l(x_stateDB); + if (!m_postMine.pending().size()) + return; + for (unsigned i = 0; i < m_postMine.pending().size(); ++i) + appendFromNewPending(m_postMine.bloom(i), changeds); + changeds.insert(PendingChangedFilter); + m_postMine = m_preMine; + } - if (!m_extHost.lock()) { ReadGuard l(x_miners); for (auto& m: m_miners) m.noteStateChange(); } + noteChanged(changeds); } @@ -228,117 +223,14 @@ void Client::appendFromNewBlock(h256 _block, h256Set& o_changed) const o_changed.insert(i.first); } -void Client::startNetwork(unsigned short _listenPort, std::string const& _seedHost, unsigned short _port, NodeMode _mode, unsigned _peers, string const& _publicIP, bool _upnp, u256 _networkId) -{ - static const char* c_threadName = "net"; - - { - UpgradableGuard l(x_net); - if (m_net.get()) - return; - { - UpgradeGuard ul(l); - - if (!m_workNet) - m_workNet.reset(new thread([&]() - { - setThreadName(c_threadName); - m_workNetState.store(Active, std::memory_order_release); - while (m_workNetState.load(std::memory_order_acquire) != Deleting) - workNet(); - m_workNetState.store(Deleted, std::memory_order_release); - })); - - if (!m_extHost.lock()) - { - m_net.reset(new Host(m_clientVersion, NetworkPreferences(_listenPort, _publicIP, _upnp, false))); - if (_mode == NodeMode::Full) - m_net->registerCapability(new EthereumHost(m_bc, _networkId)); - } - } - m_net->setIdealPeerCount(_peers); - } - - if (!m_extHost.lock()) - if (_seedHost.size()) - connect(_seedHost, _port); - - ensureWorking(); -} - -void Client::stopNetwork() -{ - UpgradableGuard l(x_net); - - if (m_workNet) - { - if (m_workNetState.load(std::memory_order_acquire) == Active) - m_workNetState.store(Deleting, std::memory_order_release); - while (m_workNetState.load(std::memory_order_acquire) != Deleted) - this_thread::sleep_for(chrono::milliseconds(10)); - m_workNet->join(); - } - if (m_net) - { - UpgradeGuard ul(l); - m_net.reset(nullptr); - m_workNet.reset(nullptr); - } -} - void Client::setNetworkId(u256 _n) { if (auto h = m_extHost.lock()) h->setNetworkId(_n); } -std::vector Client::peers() -{ - ReadGuard l(x_net); - return m_net ? m_net->peers() : std::vector(); -} - -size_t Client::peerCount() const -{ - ReadGuard l(x_net); - return m_net ? m_net->peerCount() : 0; -} - -void Client::setIdealPeerCount(size_t _n) const -{ - ReadGuard l(x_net); - if (m_net) - return m_net->setIdealPeerCount(_n); -} - -bytes Client::savePeers() -{ - ReadGuard l(x_net); - if (m_net) - return m_net->savePeers(); - return bytes(); -} - -void Client::restorePeers(bytesConstRef _saved) -{ - ReadGuard l(x_net); - if (m_net) - return m_net->restorePeers(_saved); -} - -void Client::connect(std::string const& _seedHost, unsigned short _port) -{ - ReadGuard l(x_net); - if (!m_net.get()) - return; - m_net->connect(_seedHost, _port); -} - void Client::setMiningThreads(unsigned _threads) { - if (m_extHost.lock()) - return; - stopMining(); auto t = _threads ? _threads : thread::hardware_concurrency(); @@ -353,8 +245,6 @@ void Client::setMiningThreads(unsigned _threads) MineProgress Client::miningProgress() const { MineProgress ret; - if (m_extHost.lock()) - return ret; ReadGuard l(x_miners); for (auto& m: m_miners) ret.combine(m.miningProgress()); @@ -364,8 +254,6 @@ MineProgress Client::miningProgress() const std::list Client::miningHistory() { std::list ret; - if (m_extHost.lock()) - return ret; ReadGuard l(x_miners); if (m_miners.empty()) @@ -479,23 +367,6 @@ void Client::workNet() // Process network events. // Synchronise block chain with network. // Will broadcast any of our (new) transactions and blocks, and collect & add any of their (new) transactions and blocks. - { - ReadGuard l(x_net); - if (m_net) - { - cwork << "NETWORK"; - m_net->process(); // must be in guard for now since it uses the blockchain. - - // returns h256Set as block hashes, once for each block that has come in/gone out. - if (m_net->cap()) - { - cwork << "NET <==> TQ ; CHAIN ==> NET ==> BQ"; - m_net->cap()->sync(m_tq, m_bq); - cwork << "TQ:" << m_tq.items() << "; BQ:" << m_bq.items(); - } - } - } - if (auto h = m_extHost.lock()) h->sync(m_tq, m_bq); @@ -509,7 +380,6 @@ void Client::work() cworkin << "WORK"; h256Set changeds; - if (!m_extHost.lock()) { ReadGuard l(x_miners); for (auto& m: m_miners) @@ -580,7 +450,7 @@ void Client::work() rsm = true; } } - if (!m_extHost.lock() && rsm) + if (rsm) { ReadGuard l(x_miners); for (auto& m: m_miners) diff --git a/libethereum/Client.h b/libethereum/Client.h index c11b1322b..9d0b16767 100644 --- a/libethereum/Client.h +++ b/libethereum/Client.h @@ -113,9 +113,6 @@ class Client: public MinerHost, public Interface friend class Miner; public: - /// Original Constructor. - explicit Client(std::string const& _clientVersion, Address _us = Address(), std::string const& _dbPath = std::string(), bool _forceClean = false); - /// New-style Constructor. explicit Client(p2p::Host* _host, std::string const& _dbPath = std::string(), bool _forceClean = false, u256 _networkId = 0); @@ -195,32 +192,6 @@ public: /// Get the object representing the current canonical blockchain. BlockChain const& blockChain() const { return m_bc; } - // Misc stuff: - - void setClientVersion(std::string const& _name) { m_clientVersion = _name; } - - // Network stuff: - - /// Get information on the current peer set. - std::vector peers(); - /// Same as peers().size(), but more efficient. - size_t peerCount() const; - /// Same as peers().size(), but more efficient. - void setIdealPeerCount(size_t _n) const; - - /// Start the network subsystem. - void startNetwork(unsigned short _listenPort = 30303, std::string const& _remoteHost = std::string(), unsigned short _remotePort = 30303, NodeMode _mode = NodeMode::Full, unsigned _peers = 5, std::string const& _publicIP = std::string(), bool _upnp = true, u256 _networkId = 0); - /// Connect to a particular peer. - void connect(std::string const& _seedHost, unsigned short _port = 30303); - /// Stop the network subsystem. - void stopNetwork(); - /// Is the network subsystem up? - bool haveNetwork() { ReadGuard l(x_net); return !!m_net; } - /// Save peers - bytes savePeers(); - /// Restore peers - void restorePeers(bytesConstRef _saved); - // Mining stuff: /// Check block validity prior to mining. @@ -274,7 +245,7 @@ private: /// @param _justQueue If true will only processing the transaction queues. void work(); - /// Do some work on the network. + /// Syncs the queues with the network. void workNet(); /// Overrides for being a mining host. @@ -300,7 +271,6 @@ private: State asOf(int _h) const; State asOf(unsigned _h) const; - std::string m_clientVersion; ///< Our end-application client's name/version. VersionChecker m_vc; ///< Dummy object to check & update the protocol version. BlockChain m_bc; ///< Maintains block database. TransactionQueue m_tq; ///< Maintains a list of incoming transactions not yet in a block on the blockchain. @@ -313,8 +283,6 @@ private: std::unique_ptr m_workNet; ///< The network thread. std::atomic m_workNetState; - mutable boost::shared_mutex x_net; ///< Lock for the network existance. - std::unique_ptr m_net; ///< Should run in background and send us events when blocks found and allow us to send blocks as required. std::weak_ptr m_extHost; ///< Our Ethereum Host. Don't do anything if we can't lock. diff --git a/libqethereum/QmlEthereum.cpp b/libqethereum/QmlEthereum.cpp index 350427f3e..89578a29a 100644 --- a/libqethereum/QmlEthereum.cpp +++ b/libqethereum/QmlEthereum.cpp @@ -50,7 +50,7 @@ using dev::g_logVerbosity; // Can get rid of this once we've sorted out ITC for signalling & multiplexed querying. dev::eth::Client* g_qmlClient; QObject* g_qmlMain; - +#if 0 QmlAccount::QmlAccount(QObject*) { } @@ -177,6 +177,8 @@ void QmlEthereum::transact(Secret _secret, Address _dest, u256 _amount, u256 _ga client()->transact(_secret, _amount, _dest, bytes(_data.data(), _data.data() + _data.size()), _gas, _gasPrice); } +#endif + // extra bits needed to link on VS #ifdef _MSC_VER diff --git a/libqethereum/QmlEthereum.h b/libqethereum/QmlEthereum.h index dcb636301..d242540a1 100644 --- a/libqethereum/QmlEthereum.h +++ b/libqethereum/QmlEthereum.h @@ -23,8 +23,8 @@ Q_DECLARE_METATYPE(dev::u256) Q_DECLARE_METATYPE(dev::Address) Q_DECLARE_METATYPE(dev::Secret) Q_DECLARE_METATYPE(dev::KeyPair) -Q_DECLARE_METATYPE(QmlAccount*) -Q_DECLARE_METATYPE(QmlEthereum*) +//Q_DECLARE_METATYPE(QmlAccount*) +//Q_DECLARE_METATYPE(QmlEthereum*) class QmlU256Helper: public QObject { @@ -75,7 +75,7 @@ public: Q_INVOKABLE QString stringOf(dev::Address _a) const { return QString::fromStdString(dev::toHex(_a.asArray())); } Q_INVOKABLE QString toAbridged(dev::Address _a) const { return QString::fromStdString(_a.abridged()); } }; - +#if 0 class QmlAccount: public QObject { Q_OBJECT @@ -155,7 +155,7 @@ private: Q_PROPERTY(bool listening READ isListening WRITE setListening) Q_PROPERTY(bool mining READ isMining WRITE setMining) }; - +#endif #if 0 template T to(QVariant const& _s) { if (_s.type() != QVariant::String) return T(); auto s = _s.toString().toLatin1(); assert(s.size() == sizeof(T)); return *(T*)s.data(); } template QVariant toQJS(T const& _s) { QLatin1String ret((char*)&_s, sizeof(T)); assert(QVariant(QString(ret)).toString().toLatin1().size() == sizeof(T)); assert(*(T*)(QVariant(QString(ret)).toString().toLatin1().data()) == _s); return QVariant(QString(ret)); } diff --git a/test/TestHelper.cpp b/test/TestHelper.cpp index 02a883dbc..3b3be3fec 100644 --- a/test/TestHelper.cpp +++ b/test/TestHelper.cpp @@ -42,11 +42,13 @@ void mine(Client& c, int numBlocks) void connectClients(Client& c1, Client& c2) { +#if 0 short c1Port = 20000; short c2Port = 21000; c1.startNetwork(c1Port); c2.startNetwork(c2Port); c2.connect("127.0.0.1", c1Port); +#endif } } diff --git a/third/MainWin.cpp b/third/MainWin.cpp index 11db6376f..5e147bbda 100644 --- a/third/MainWin.cpp +++ b/third/MainWin.cpp @@ -356,7 +356,7 @@ void Main::writeSettings() s.setValue("address", b); s.setValue("url", ui->urlEdit->text()); - bytes d = ethereum()->savePeers(); + bytes d = m_web3->savePeers(); if (d.size()) m_peers = QByteArray((char*)d.data(), (int)d.size()); s.setValue("peers", m_peers); @@ -471,7 +471,7 @@ void Main::refreshBalances() void Main::refreshNetwork() { - auto ps = ethereum()->peers(); + auto ps = m_web3->peers(); ui->peerCount->setText(QString::fromStdString(toString(ps.size())) + " peer(s)"); } @@ -560,10 +560,10 @@ void Main::ensureNetwork() web3()->connect(defPeer); } else - if (!ethereum()->peerCount()) - ethereum()->connect(defPeer); + if (!m_web3->peerCount()) + m_web3->connect(defPeer); if (m_peers.size()) - ethereum()->restorePeers(bytesConstRef((byte*)m_peers.data(), m_peers.size())); + m_web3->restorePeers(bytesConstRef((byte*)m_peers.data(), m_peers.size())); } void Main::on_connect_triggered()