From 13232d6e048e27aaa25410fdd4dc9969d67111d0 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Fri, 3 Apr 2015 21:10:15 +0200 Subject: [PATCH] Fixes #1509 --- alethzero/MainWin.cpp | 2 +- eth/main.cpp | 9 ++-- libdevcore/Common.h | 16 ++++++ libethcore/BlockInfo.h | 28 +++++----- libethcore/Common.cpp | 1 + libethcore/Common.h | 3 ++ libethereum/BlockChain.cpp | 85 ++++++++++++++++++++++++++----- libethereum/BlockChain.h | 18 +++++-- libethereum/CanonBlockChain.cpp | 2 +- libethereum/CanonBlockChain.h | 4 +- libethereum/Client.cpp | 36 ++++++++----- libethereum/Client.h | 8 +-- libethereum/State.cpp | 4 +- libethereum/State.h | 4 +- libtestutils/BlockChainLoader.cpp | 2 +- libwebthree/WebThree.cpp | 4 +- libwebthree/WebThree.h | 8 +-- mix/MixClient.h | 2 +- neth/main.cpp | 2 +- test/blockchain.cpp | 2 +- 20 files changed, 166 insertions(+), 74 deletions(-) diff --git a/alethzero/MainWin.cpp b/alethzero/MainWin.cpp index e848b4017..b17d47cdf 100644 --- a/alethzero/MainWin.cpp +++ b/alethzero/MainWin.cpp @@ -168,7 +168,7 @@ Main::Main(QWidget *parent) : QSettings s("ethereum", "alethzero"); m_networkConfig = s.value("peers").toByteArray(); bytesConstRef network((byte*)m_networkConfig.data(), m_networkConfig.size()); - m_webThree.reset(new WebThreeDirect(string("AlethZero/v") + dev::Version + "/" DEV_QUOTED(ETH_BUILD_TYPE) "/" DEV_QUOTED(ETH_BUILD_PLATFORM), getDataDir(), false, {"eth", "shh"}, p2p::NetworkPreferences(), network)); + m_webThree.reset(new WebThreeDirect(string("AlethZero/v") + dev::Version + "/" DEV_QUOTED(ETH_BUILD_TYPE) "/" DEV_QUOTED(ETH_BUILD_PLATFORM), getDataDir(), WithExisting::Trust, {"eth", "shh"}, p2p::NetworkPreferences(), network)); m_httpConnector.reset(new jsonrpc::HttpServer(SensibleHttpPort, "", "", dev::SensibleHttpThreads)); m_server.reset(new OurWebThreeStubServer(*m_httpConnector, *web3(), keysAsVector(m_myKeys), this)); diff --git a/eth/main.cpp b/eth/main.cpp index ea536f790..3cdcba472 100644 --- a/eth/main.cpp +++ b/eth/main.cpp @@ -129,6 +129,7 @@ void help() << " -o,--mode Start a full node or a peer node (Default: full)." << endl << " -p,--port Connect to remote port (default: 30303)." << endl << " -P,--priority <0 - 100> Default % priority of a transaction (default: 50)." << endl + << " -R,--rebuild-blockchain First rebuild the blockchain from the existing database." << endl << " -r,--remote Connect to remote host (default: none)." << endl << " -s,--secret Set the secret key for use with send command (default: auto)." << endl << " -t,--miners Number of mining threads to start (Default: " << thread::hardware_concurrency() << ")" << endl @@ -168,7 +169,7 @@ void version() } Address c_config = Address("ccdeac59d35627b7de09332e819d5159e7bb7250"); -string pretty(h160 _a, dev::eth::State _st) +string pretty(h160 _a, dev::eth::State const& _st) { string ns; h256 n; @@ -216,7 +217,7 @@ int main(int argc, char** argv) bool bootstrap = false; bool upnp = true; bool forceMining = false; - bool killChain = false; + WithExisting killChain = WithExisting::Trust; bool jit = false; bool structuredLogging = false; string structuredLoggingFormat = "%Y-%m-%dT%H:%M:%S"; @@ -274,7 +275,9 @@ int main(int argc, char** argv) } } else if (arg == "-K" || arg == "--kill-blockchain") - killChain = true; + killChain = WithExisting::Kill; + else if (arg == "-B" || arg == "--rebuild-blockchain") + killChain = WithExisting::Verify; else if ((arg == "-c" || arg == "--client-name") && i + 1 < argc) clientName = argv[++i]; else if ((arg == "-a" || arg == "--address" || arg == "--coinbase-address") && i + 1 < argc) diff --git a/libdevcore/Common.h b/libdevcore/Common.h index 5e778644d..49491d4cc 100644 --- a/libdevcore/Common.h +++ b/libdevcore/Common.h @@ -134,4 +134,20 @@ private: std::function m_f; }; +enum class WithExisting: int +{ + Trust = 0, + Verify, + Kill +}; + +} + +namespace std { + +inline dev::WithExisting max(dev::WithExisting _a, dev::WithExisting _b) +{ + return static_cast(max(static_cast(_a), static_cast(_b))); +} + } diff --git a/libethcore/BlockInfo.h b/libethcore/BlockInfo.h index 91dcecc6b..d262afca7 100644 --- a/libethcore/BlockInfo.h +++ b/libethcore/BlockInfo.h @@ -100,20 +100,20 @@ public: bool operator==(BlockInfo const& _cmp) const { return parentHash == _cmp.parentHash && - sha3Uncles == _cmp.sha3Uncles && - coinbaseAddress == _cmp.coinbaseAddress && - stateRoot == _cmp.stateRoot && - transactionsRoot == _cmp.transactionsRoot && - receiptsRoot == _cmp.receiptsRoot && - logBloom == _cmp.logBloom && - difficulty == _cmp.difficulty && - number == _cmp.number && - gasLimit == _cmp.gasLimit && - gasUsed == _cmp.gasUsed && - timestamp == _cmp.timestamp && - extraData == _cmp.extraData && - mixHash == _cmp.mixHash && - nonce == _cmp.nonce; + sha3Uncles == _cmp.sha3Uncles && + coinbaseAddress == _cmp.coinbaseAddress && + stateRoot == _cmp.stateRoot && + transactionsRoot == _cmp.transactionsRoot && + receiptsRoot == _cmp.receiptsRoot && + logBloom == _cmp.logBloom && + difficulty == _cmp.difficulty && + number == _cmp.number && + gasLimit == _cmp.gasLimit && + gasUsed == _cmp.gasUsed && + timestamp == _cmp.timestamp && + extraData == _cmp.extraData && + mixHash == _cmp.mixHash && + nonce == _cmp.nonce; } bool operator!=(BlockInfo const& _cmp) const { return !operator==(_cmp); } diff --git a/libethcore/Common.cpp b/libethcore/Common.cpp index ef4da1dd7..02e806905 100644 --- a/libethcore/Common.cpp +++ b/libethcore/Common.cpp @@ -35,6 +35,7 @@ namespace eth const unsigned c_ethashVersion = c_ethashRevision; const unsigned c_protocolVersion = 60; +const unsigned c_minorProtocolVersion = 0; const unsigned c_databaseBaseVersion = 8; #if ETH_FATDB const unsigned c_databaseVersionModifier = 1; diff --git a/libethcore/Common.h b/libethcore/Common.h index 51322dcb2..aabe663cd 100644 --- a/libethcore/Common.h +++ b/libethcore/Common.h @@ -35,6 +35,9 @@ namespace eth /// Current protocol version. extern const unsigned c_protocolVersion; +/// Current minor protocol version. +extern const unsigned c_minorProtocolVersion; + /// Current database version. extern const unsigned c_databaseVersion; diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp index 8c0bd2b8b..59f9c4a2d 100644 --- a/libethereum/BlockChain.cpp +++ b/libethereum/BlockChain.cpp @@ -98,7 +98,7 @@ static const unsigned c_minCacheSize = 1024 * 1024 * 32; #endif -BlockChain::BlockChain(bytes const& _genesisBlock, std::string _path, bool _killExisting) +BlockChain::BlockChain(bytes const& _genesisBlock, std::string _path, WithExisting _we, ProgressCallback const& _p) { // initialise deathrow. m_cacheUsage.resize(c_collectionQueueSize); @@ -108,7 +108,9 @@ BlockChain::BlockChain(bytes const& _genesisBlock, std::string _path, bool _kill m_genesisBlock = _genesisBlock; m_genesisHash = sha3(RLP(m_genesisBlock)[0].data()); - open(_path, _killExisting); + open(_path, _we); + if (_we == WithExisting::Verify) + rebuild(_path, _p); } BlockChain::~BlockChain() @@ -116,24 +118,23 @@ BlockChain::~BlockChain() close(); } -void BlockChain::open(std::string _path, bool _killExisting) +void BlockChain::open(std::string const& _path, WithExisting _we) { - if (_path.empty()) - _path = Defaults::get()->m_dbPath; - boost::filesystem::create_directories(_path); - if (_killExisting) + std::string path = _path.empty() ? Defaults::get()->m_dbPath : _path; + boost::filesystem::create_directories(path); + if (_we == WithExisting::Kill) { - boost::filesystem::remove_all(_path + "/blocks"); - boost::filesystem::remove_all(_path + "/details"); + boost::filesystem::remove_all(path + "/blocks"); + boost::filesystem::remove_all(path + "/details"); } ldb::Options o; o.create_if_missing = true; - ldb::DB::Open(o, _path + "/blocks", &m_blocksDB); - ldb::DB::Open(o, _path + "/details", &m_extrasDB); + ldb::DB::Open(o, path + "/blocks", &m_blocksDB); + ldb::DB::Open(o, path + "/details", &m_extrasDB); if (!m_blocksDB || !m_extrasDB) { - if (boost::filesystem::space(_path + "/blocks").available < 1024) + if (boost::filesystem::space(path + "/blocks").available < 1024) { cwarn << "Not enough available space found on hard drive. Please free some up and then re-run. Bailing."; BOOST_THROW_EXCEPTION(NotEnoughAvailableSpace()); @@ -158,7 +159,6 @@ void BlockChain::open(std::string _path, bool _killExisting) // TODO: Implement ability to rebuild details map from DB. std::string l; m_extrasDB->Get(m_readOptions, ldb::Slice("best"), &l); - m_lastBlockHash = l.empty() ? m_genesisHash : *(h256*)l.data(); cnote << "Opened blockchain DB. Latest: " << currentHash(); @@ -174,6 +174,53 @@ void BlockChain::close() m_blocks.clear(); } +void BlockChain::rebuild(std::string const& _path, std::function const& _progress) +{ + unsigned originalNumber = number(); + + // Keep extras DB around, but under a temp name + delete m_extrasDB; + m_extrasDB = nullptr; + boost::filesystem::rename(_path + "/details", _path + "/details.old"); + ldb::DB* oldExtrasDB; + ldb::Options o; + o.create_if_missing = true; + ldb::DB::Open(o, _path + "/details.old", &oldExtrasDB); + ldb::DB::Open(o, _path + "/details", &m_extrasDB); + + // Open a fresh state DB + OverlayDB db = State::openDB(_path, WithExisting::Kill); + + // Clear all memos ready for replay. + m_details.clear(); + m_logBlooms.clear(); + m_receipts.clear(); + m_transactionAddresses.clear(); + m_blockHashes.clear(); + m_blocksBlooms.clear(); + m_lastLastHashes.clear(); + m_lastBlockHash = genesisHash(); + + for (unsigned d = 0; d < originalNumber; ++d) + { + try + { + import(block(queryExtras(h256(u256(d)), m_blockHashes, x_blockHashes, NullBlockHash, oldExtrasDB).value), db); + } + catch (...) + { + // Failed to import - stop here. + break; + } + + if (_progress) + _progress(d, originalNumber); + } + + delete oldExtrasDB; + boost::filesystem::remove_all(_path + "/details.old"); +} + template bool contains(T const& _t, V const& _v) { @@ -414,12 +461,22 @@ h256s BlockChain::import(bytes const& _block, OverlayDB const& _db) #endif } #if ETH_CATCH - catch (Exception const& _e) + catch (InvalidNonce const& _e) { clog(BlockChainNote) << " Malformed block: " << diagnostic_information(_e); _e << errinfo_comment("Malformed block "); throw; } + catch (Exception const& _e) + { + clog(BlockChainWarn) << " Malformed block: " << diagnostic_information(_e); + _e << errinfo_comment("Malformed block "); + clog(BlockChainWarn) << "Block: " << bi.hash; + clog(BlockChainWarn) << bi; + clog(BlockChainWarn) << "Block parent: " << bi.parentHash; + clog(BlockChainWarn) << BlockInfo(block(bi.parentHash)); + throw; + } #endif StructuredLogger::chainReceivedNewBlock( diff --git a/libethereum/BlockChain.h b/libethereum/BlockChain.h index 03c0fdcfd..7705e0f12 100644 --- a/libethereum/BlockChain.h +++ b/libethereum/BlockChain.h @@ -58,6 +58,7 @@ struct FutureTime: virtual Exception {}; struct BlockChainChat: public LogChannel { static const char* name() { return "-B-"; } static const int verbosity = 7; }; struct BlockChainNote: public LogChannel { static const char* name() { return "=B="; } static const int verbosity = 4; }; +struct BlockChainWarn: public LogChannel { static const char* name() { return "=B="; } static const int verbosity = 1; }; // TODO: Move all this Genesis stuff into Genesis.h/.cpp std::map const& genesisState(); @@ -77,6 +78,8 @@ enum { ExtraBlocksBlooms }; +using ProgressCallback = std::function; + /** * @brief Implements the blockchain database. All data this gives is disk-backed. * @threadsafe @@ -85,10 +88,11 @@ enum { class BlockChain { public: - BlockChain(bytes const& _genesisBlock, std::string _path, bool _killExisting); + BlockChain(bytes const& _genesisBlock, std::string _path, WithExisting _we, ProgressCallback const& _p = ProgressCallback()); ~BlockChain(); - void reopen(std::string _path, bool _killExisting = false) { close(); open(_path, _killExisting); } + /// Attempt a database re-open. + void reopen(std::string const& _path, WithExisting _we = WithExisting::Trust) { close(); open(_path, _we); } /// (Potentially) renders invalid existing bytesConstRef returned by lastBlock. /// To be called from main loop every 100ms or so. @@ -186,6 +190,10 @@ public: /// togther with all their quoted uncles. h256Set allUnclesFrom(h256 const& _parent) const; + /// Run through database and verify all blocks by reevaluating. + /// Will call _progress with the progress in this operation first param done, second total. + void rebuild(std::string const& _path, ProgressCallback const& _progress = std::function()); + /** @returns the hash of all blocks between @a _from and @a _to, all blocks are ordered first by a number of * blocks that are parent-to-child, then two sibling blocks, then a number of blocks that are child-to-parent. * @@ -222,10 +230,10 @@ public: private: static h256 chunkId(unsigned _level, unsigned _index) { return h256(_index * 0xff + _level); } - void open(std::string _path, bool _killExisting = false); + void open(std::string const& _path, WithExisting _we = WithExisting::Trust); void close(); - template T queryExtras(h256 const& _h, std::map& _m, boost::shared_mutex& _x, T const& _n) const + template T queryExtras(h256 const& _h, std::map& _m, boost::shared_mutex& _x, T const& _n, ldb::DB* _extrasDB = nullptr) const { { ReadGuard l(_x); @@ -235,7 +243,7 @@ private: } std::string s; - m_extrasDB->Get(m_readOptions, toSlice(_h, N), &s); + (_extrasDB ? _extrasDB : m_extrasDB)->Get(m_readOptions, toSlice(_h, N), &s); if (s.empty()) { // cout << "Not found in DB: " << _h << endl; diff --git a/libethereum/CanonBlockChain.cpp b/libethereum/CanonBlockChain.cpp index 21b30d8ef..2a7b97525 100644 --- a/libethereum/CanonBlockChain.cpp +++ b/libethereum/CanonBlockChain.cpp @@ -92,6 +92,6 @@ bytes CanonBlockChain::createGenesisBlock() return block.out(); } -CanonBlockChain::CanonBlockChain(std::string _path, bool _killExisting): BlockChain(CanonBlockChain::createGenesisBlock(), _path, _killExisting) +CanonBlockChain::CanonBlockChain(std::string const& _path, WithExisting _we): BlockChain(CanonBlockChain::createGenesisBlock(), _path, _we) { } diff --git a/libethereum/CanonBlockChain.h b/libethereum/CanonBlockChain.h index 7110dbc90..be1c03998 100644 --- a/libethereum/CanonBlockChain.h +++ b/libethereum/CanonBlockChain.h @@ -55,8 +55,8 @@ std::map const& genesisState(); class CanonBlockChain: public BlockChain { public: - CanonBlockChain(bool _killExisting = false): CanonBlockChain(std::string(), _killExisting) {} - CanonBlockChain(std::string _path, bool _killExisting = false); + CanonBlockChain(WithExisting _we = WithExisting::Trust): CanonBlockChain(std::string(), _we) {} + CanonBlockChain(std::string const& _path, WithExisting _we = WithExisting::Trust); ~CanonBlockChain() {} /// @returns the genesis block header. diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index 54f23dc84..185e1a5ca 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -38,14 +38,23 @@ using namespace p2p; VersionChecker::VersionChecker(string const& _dbPath): m_path(_dbPath.size() ? _dbPath : Defaults::dbPath()) { - auto protocolContents = contents(m_path + "/protocol"); - auto databaseContents = contents(m_path + "/database"); - m_ok = RLP(protocolContents).toInt(RLP::LaisezFaire) == eth::c_protocolVersion && RLP(databaseContents).toInt(RLP::LaisezFaire) == c_databaseVersion; + bytes statusBytes = contents(m_path + "/status"); + RLP status(statusBytes); + auto protocolVersion = (unsigned)status[0]; + auto minorProtocolVersion = (unsigned)status[1]; + auto databaseVersion = (unsigned)status[2]; + m_action = + protocolVersion != eth::c_protocolVersion || databaseVersion != c_databaseVersion ? + WithExisting::Kill + : minorProtocolVersion != eth::c_minorProtocolVersion ? + WithExisting::Verify + : + WithExisting::Trust; } void VersionChecker::setOk() { - if (!m_ok) + if (m_action != WithExisting::Trust) { try { @@ -55,8 +64,7 @@ void VersionChecker::setOk() { cwarn << "Unhandled exception! Failed to create directory: " << m_path << "\n" << boost::current_exception_diagnostic_information(); } - writeFile(m_path + "/protocol", rlp(eth::c_protocolVersion)); - writeFile(m_path + "/database", rlp(c_databaseVersion)); + writeFile(m_path + "/status", rlpList(eth::c_protocolVersion, eth::c_minorProtocolVersion, c_databaseVersion)); } } @@ -102,12 +110,12 @@ void BasicGasPricer::update(BlockChain const& _bc) } } -Client::Client(p2p::Host* _extNet, std::string const& _dbPath, bool _forceClean, u256 _networkId, int _miners): +Client::Client(p2p::Host* _extNet, std::string const& _dbPath, WithExisting _forceAction, u256 _networkId, int _miners): Worker("eth"), m_vc(_dbPath), - m_bc(_dbPath, !m_vc.ok() || _forceClean), + m_bc(_dbPath, max(m_vc.action(), _forceAction)), m_gp(new TrivialGasPricer), - m_stateDB(State::openDB(_dbPath, !m_vc.ok() || _forceClean)), + m_stateDB(State::openDB(_dbPath, max(m_vc.action(), _forceAction))), m_preMine(Address(), m_stateDB), m_postMine(Address(), m_stateDB) { @@ -127,12 +135,12 @@ Client::Client(p2p::Host* _extNet, std::string const& _dbPath, bool _forceClean, startWorking(); } -Client::Client(p2p::Host* _extNet, std::shared_ptr _gp, std::string const& _dbPath, bool _forceClean, u256 _networkId, int _miners): +Client::Client(p2p::Host* _extNet, std::shared_ptr _gp, std::string const& _dbPath, WithExisting _forceAction, u256 _networkId, int _miners): Worker("eth"), m_vc(_dbPath), - m_bc(_dbPath, !m_vc.ok() || _forceClean), + m_bc(_dbPath, max(m_vc.action(), _forceAction)), m_gp(_gp), - m_stateDB(State::openDB(_dbPath, !m_vc.ok() || _forceClean)), + m_stateDB(State::openDB(_dbPath, max(m_vc.action(), _forceAction))), m_preMine(Address(), m_stateDB), m_postMine(Address(), m_stateDB) { @@ -202,9 +210,9 @@ void Client::killChain() { WriteGuard l(x_stateDB); m_stateDB = OverlayDB(); - m_stateDB = State::openDB(Defaults::dbPath(), true); + m_stateDB = State::openDB(Defaults::dbPath(), WithExisting::Kill); } - m_bc.reopen(Defaults::dbPath(), true); + m_bc.reopen(Defaults::dbPath(), WithExisting::Kill); m_preMine = State(Address(), m_stateDB); m_postMine = State(Address(), m_stateDB); diff --git a/libethereum/Client.h b/libethereum/Client.h index 1091bba58..f07e4c590 100644 --- a/libethereum/Client.h +++ b/libethereum/Client.h @@ -65,10 +65,10 @@ public: VersionChecker(std::string const& _dbPath); void setOk(); - bool ok() const { return m_ok; } + WithExisting action() const { return m_action; } private: - bool m_ok; + WithExisting m_action; std::string m_path; }; @@ -126,7 +126,7 @@ public: explicit Client( p2p::Host* _host, std::string const& _dbPath = std::string(), - bool _forceClean = false, + WithExisting _forceAction = WithExisting::Trust, u256 _networkId = 0, int _miners = -1 ); @@ -135,7 +135,7 @@ public: p2p::Host* _host, std::shared_ptr _gpForAdoption, // pass it in with new. std::string const& _dbPath = std::string(), - bool _forceClean = false, + WithExisting _forceAction = WithExisting::Trust, u256 _networkId = 0, int _miners = -1 ); diff --git a/libethereum/State.cpp b/libethereum/State.cpp index fa457dc41..cd46805d8 100644 --- a/libethereum/State.cpp +++ b/libethereum/State.cpp @@ -46,13 +46,13 @@ using namespace dev::eth; static const u256 c_blockReward = 1500 * finney; -OverlayDB State::openDB(std::string _path, bool _killExisting) +OverlayDB State::openDB(std::string _path, WithExisting _we) { if (_path.empty()) _path = Defaults::get()->m_dbPath; boost::filesystem::create_directory(_path); - if (_killExisting) + if (_we == WithExisting::Kill) boost::filesystem::remove_all(_path + "/state"); ldb::Options o; diff --git a/libethereum/State.h b/libethereum/State.h index 5ed76cc27..e64a6f0e3 100644 --- a/libethereum/State.h +++ b/libethereum/State.h @@ -123,8 +123,8 @@ public: Address address() const { return m_ourAddress; } /// Open a DB - useful for passing into the constructor & keeping for other states that are necessary. - static OverlayDB openDB(std::string _path, bool _killExisting = false); - static OverlayDB openDB(bool _killExisting = false) { return openDB(std::string(), _killExisting); } + static OverlayDB openDB(std::string _path, WithExisting _we = WithExisting::Trust); + static OverlayDB openDB(WithExisting _we = WithExisting::Trust) { return openDB(std::string(), _we); } OverlayDB const& db() const { return m_db; } /// @returns the set containing all addresses currently in use in Ethereum. diff --git a/libtestutils/BlockChainLoader.cpp b/libtestutils/BlockChainLoader.cpp index 898812b2a..ba0def59e 100644 --- a/libtestutils/BlockChainLoader.cpp +++ b/libtestutils/BlockChainLoader.cpp @@ -35,7 +35,7 @@ BlockChainLoader::BlockChainLoader(Json::Value const& _json) m_state = sl.state(); // load genesisBlock - m_bc.reset(new BlockChain(fromHex(_json["genesisRLP"].asString()), m_dir.path(), true)); + m_bc.reset(new BlockChain(fromHex(_json["genesisRLP"].asString()), m_dir.path(), WithExisting::Kill)); // load blocks for (auto const& block: _json["blocks"]) diff --git a/libwebthree/WebThree.cpp b/libwebthree/WebThree.cpp index b2c6765b5..a74d7fa55 100644 --- a/libwebthree/WebThree.cpp +++ b/libwebthree/WebThree.cpp @@ -39,7 +39,7 @@ using namespace dev::shh; WebThreeDirect::WebThreeDirect( std::string const& _clientVersion, std::string const& _dbPath, - bool _forceClean, + WithExisting _we, std::set const& _interfaces, NetworkPreferences const& _n, bytesConstRef _network, int _miners @@ -50,7 +50,7 @@ WebThreeDirect::WebThreeDirect( if (_dbPath.size()) Defaults::setDBPath(_dbPath); if (_interfaces.count("eth")) - m_ethereum.reset(new eth::Client(&m_net, _dbPath, _forceClean, 0, _miners)); + m_ethereum.reset(new eth::Client(&m_net, _dbPath, _we, 0, _miners)); if (_interfaces.count("shh")) m_whisper = m_net.registerCapability(new WhisperHost); diff --git a/libwebthree/WebThree.h b/libwebthree/WebThree.h index a0e5cc666..de3cc9dcc 100644 --- a/libwebthree/WebThree.h +++ b/libwebthree/WebThree.h @@ -25,17 +25,13 @@ #include #include #include - -// Make sure boost/asio.hpp is included before windows.h. -#include +#include // Make sure boost/asio.hpp is included before windows.h. #include - #include #include #include #include #include - #include #include @@ -113,7 +109,7 @@ public: WebThreeDirect( std::string const& _clientVersion, std::string const& _dbPath, - bool _forceClean = false, + WithExisting _we = WithExisting::Trust, std::set const& _interfaces = {"eth", "shh"}, p2p::NetworkPreferences const& _n = p2p::NetworkPreferences(), bytesConstRef _network = bytesConstRef(), diff --git a/mix/MixClient.h b/mix/MixClient.h index 179b445ac..abd9445c7 100644 --- a/mix/MixClient.h +++ b/mix/MixClient.h @@ -37,7 +37,7 @@ namespace mix class MixBlockChain: public dev::eth::BlockChain { public: - MixBlockChain(std::string const& _path, h256 _stateRoot): BlockChain(createGenesisBlock(_stateRoot), _path, true) {} + MixBlockChain(std::string const& _path, h256 _stateRoot): BlockChain(createGenesisBlock(_stateRoot), _path, WithExisting::Kill) {} static bytes createGenesisBlock(h256 _stateRoot); }; diff --git a/neth/main.cpp b/neth/main.cpp index e7dde3cc6..7ee4962e9 100644 --- a/neth/main.cpp +++ b/neth/main.cpp @@ -550,7 +550,7 @@ int main(int argc, char** argv) dev::WebThreeDirect web3( clientImplString, dbPath, - killChain, + killChain ? WithExisting::Kill : WithExisting::Trust, mode == NodeMode::Full ? set{"eth", "shh"} : set(), netPrefs, &nodesState, diff --git a/test/blockchain.cpp b/test/blockchain.cpp index 17e6c3588..ffb55da30 100644 --- a/test/blockchain.cpp +++ b/test/blockchain.cpp @@ -78,7 +78,7 @@ void doBlockchainTests(json_spirit::mValue& _v, bool _fillin) // construct blockchain TransientDirectory td; - BlockChain bc(rlpGenesisBlock.out(), td.path(), true); + BlockChain bc(rlpGenesisBlock.out(), td.path(), WithExisting::Kill); if (_fillin) {