Browse Source

Merge remote-tracking branch 'upstream/develop' into addTests

cl-refactor
CJentzsch 10 years ago
parent
commit
7b87d78ea0
  1. 19
      CMakeLists.txt
  2. 6
      abi/main.cpp
  3. 4
      alethzero/MainWin.cpp
  4. 9
      eth/main.cpp
  5. 2
      libdevcore/Common.cpp
  6. 16
      libdevcore/Common.h
  7. 2
      libethcore/BlockInfo.h
  8. 3
      libethcore/Common.cpp
  9. 3
      libethcore/Common.h
  10. 93
      libethereum/BlockChain.cpp
  11. 18
      libethereum/BlockChain.h
  12. 2
      libethereum/CanonBlockChain.cpp
  13. 4
      libethereum/CanonBlockChain.h
  14. 43
      libethereum/Client.cpp
  15. 8
      libethereum/Client.h
  16. 4
      libethereum/Executive.h
  17. 4
      libethereum/State.cpp
  18. 4
      libethereum/State.h
  19. 2
      libevm/VM.h
  20. 2
      libtestutils/BlockChainLoader.cpp
  21. 3
      libtestutils/CMakeLists.txt
  22. 12
      libweb3jsonrpc/WebThreeStubServerBase.cpp
  23. 4
      libwebthree/WebThree.cpp
  24. 8
      libwebthree/WebThree.h
  25. 2
      mix/MixClient.h
  26. 12
      mix/qml/Debugger.qml
  27. 31
      mix/qml/LogsPane.qml
  28. 4
      mix/qml/LogsPaneStyle.qml
  29. 39
      mix/qml/StatesComboBox.qml
  30. 4
      mix/qml/StatusPane.qml
  31. 6
      mix/qml/TransactionLog.qml
  32. BIN
      mix/qml/img/searchicon.png
  33. BIN
      mix/qml/img/stop_button2x.png
  34. 2
      mix/res.qrc
  35. 2
      neth/main.cpp
  36. 2
      test/blockchain.cpp
  37. 114
      test/stMemoryTestFiller.json

19
CMakeLists.txt

@ -30,19 +30,11 @@ endfunction()
# propagates CMake configuration options to the compiler # propagates CMake configuration options to the compiler
function(configureProject) function(configureProject)
if (PARANOIA) if (PARANOIA)
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
add_definitions(-DETH_PARANOIA) add_definitions(-DETH_PARANOIA)
else ()
message(FATAL_ERROR "Paranoia requires debug.")
endif ()
endif () endif ()
if (VMTRACE) if (VMTRACE)
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
add_definitions(-DETH_VMTRACE) add_definitions(-DETH_VMTRACE)
else ()
message(FATAL_ERROR "VM tracing requires debug.")
endif ()
endif () endif ()
if (ETHASHCL) if (ETHASHCL)
@ -123,6 +115,17 @@ endfunction()
set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOMOC ON)
cmake_policy(SET CMP0015 NEW) cmake_policy(SET CMP0015 NEW)
# Clear invalid option
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
if (PARANOIA)
message("Paranoia requires debug - disabling for release build.")
set(PARANOIA OFF)
endif ()
if (VMTRACE)
message("VM Tracing requires debug - disabling for release build.")
set (VMTRACE OFF)
endif ()
endif ()
createDefaultCacheConfig() createDefaultCacheConfig()
configureProject() configureProject()

6
abi/main.cpp

@ -436,7 +436,7 @@ struct ABIMethod
if (_params[pi].second != Format::Open) if (_params[pi].second != Format::Open)
throw ExpectedOpen(); throw ExpectedOpen();
++pi; ++pi;
int l = a.dims[addr.size()]; int l = a.dims[a.dims.size() - 1 - addr.size()];
if (l == -1) if (l == -1)
{ {
// read ahead in params and discover the arity. // read ahead in params and discover the arity.
@ -486,7 +486,7 @@ struct ABIMethod
put(); put();
else else
{ {
int l = a.dims[addr.size()]; int l = a.dims[a.dims.size() - 1 - addr.size()];
if (l == -1) if (l == -1)
{ {
l = fromBigEndian<unsigned>(bytesConstRef(&_data).cropped(di, 32)); l = fromBigEndian<unsigned>(bytesConstRef(&_data).cropped(di, 32));
@ -525,7 +525,7 @@ struct ABIMethod
{ {
out << "["; out << "[";
addr.push_back(0); addr.push_back(0);
int l = a.dims[addr.size() - 1]; int l = a.dims[a.dims.size() - 1 - (addr.size() - 1)];
if (l == -1) if (l == -1)
l = catDims[d++]; l = catDims[d++];
for (addr.back() = 0; addr.back() < l; ++addr.back()) for (addr.back() = 0; addr.back() < l; ++addr.back())

4
alethzero/MainWin.cpp

@ -168,7 +168,7 @@ Main::Main(QWidget *parent) :
QSettings s("ethereum", "alethzero"); QSettings s("ethereum", "alethzero");
m_networkConfig = s.value("peers").toByteArray(); m_networkConfig = s.value("peers").toByteArray();
bytesConstRef network((byte*)m_networkConfig.data(), m_networkConfig.size()); 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_httpConnector.reset(new jsonrpc::HttpServer(SensibleHttpPort, "", "", dev::SensibleHttpThreads));
m_server.reset(new OurWebThreeStubServer(*m_httpConnector, *web3(), keysAsVector(m_myKeys), this)); m_server.reset(new OurWebThreeStubServer(*m_httpConnector, *web3(), keysAsVector(m_myKeys), this));
@ -1582,7 +1582,7 @@ void Main::on_debugCurrent_triggered()
unsigned txi = item->data(Qt::UserRole + 1).toInt(); unsigned txi = item->data(Qt::UserRole + 1).toInt();
bytes t = ethereum()->blockChain().transaction(h, txi); bytes t = ethereum()->blockChain().transaction(h, txi);
State s(ethereum()->state(txi, h)); State s(ethereum()->state(txi, h));
Executive e(s, ethereum()->blockChain(), PendingBlock); Executive e(s, ethereum()->blockChain());
Debugger dw(this, this); Debugger dw(this, this);
dw.populate(e, Transaction(t, CheckSignature::Sender)); dw.populate(e, Transaction(t, CheckSignature::Sender));
dw.exec(); dw.exec();

9
eth/main.cpp

@ -129,6 +129,7 @@ void help()
<< " -o,--mode <full/peer> Start a full node or a peer node (Default: full)." << endl << " -o,--mode <full/peer> Start a full node or a peer node (Default: full)." << endl
<< " -p,--port <port> Connect to remote port (default: 30303)." << endl << " -p,--port <port> Connect to remote port (default: 30303)." << endl
<< " -P,--priority <0 - 100> Default % priority of a transaction (default: 50)." << 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 <host> Connect to remote host (default: none)." << endl << " -r,--remote <host> Connect to remote host (default: none)." << endl
<< " -s,--secret <secretkeyhex> Set the secret key for use with send command (default: auto)." << endl << " -s,--secret <secretkeyhex> Set the secret key for use with send command (default: auto)." << endl
<< " -t,--miners <number> Number of mining threads to start (Default: " << thread::hardware_concurrency() << ")" << endl << " -t,--miners <number> Number of mining threads to start (Default: " << thread::hardware_concurrency() << ")" << endl
@ -168,7 +169,7 @@ void version()
} }
Address c_config = Address("ccdeac59d35627b7de09332e819d5159e7bb7250"); Address c_config = Address("ccdeac59d35627b7de09332e819d5159e7bb7250");
string pretty(h160 _a, dev::eth::State _st) string pretty(h160 _a, dev::eth::State const& _st)
{ {
string ns; string ns;
h256 n; h256 n;
@ -216,7 +217,7 @@ int main(int argc, char** argv)
bool bootstrap = false; bool bootstrap = false;
bool upnp = true; bool upnp = true;
bool forceMining = false; bool forceMining = false;
bool killChain = false; WithExisting killChain = WithExisting::Trust;
bool jit = false; bool jit = false;
bool structuredLogging = false; bool structuredLogging = false;
string structuredLoggingFormat = "%Y-%m-%dT%H:%M:%S"; 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") 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) else if ((arg == "-c" || arg == "--client-name") && i + 1 < argc)
clientName = argv[++i]; clientName = argv[++i];
else if ((arg == "-a" || arg == "--address" || arg == "--coinbase-address") && i + 1 < argc) else if ((arg == "-a" || arg == "--address" || arg == "--coinbase-address") && i + 1 < argc)

2
libdevcore/Common.cpp

@ -27,7 +27,7 @@ using namespace dev;
namespace dev namespace dev
{ {
char const* Version = "0.9.1"; char const* Version = "0.9.2";
} }

16
libdevcore/Common.h

@ -134,4 +134,20 @@ private:
std::function<void(void)> m_f; std::function<void(void)> 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<dev::WithExisting>(max(static_cast<int>(_a), static_cast<int>(_b)));
}
} }

2
libethcore/BlockInfo.h

@ -80,7 +80,7 @@ public:
u256 number; u256 number;
u256 gasLimit; u256 gasLimit;
u256 gasUsed; u256 gasUsed;
u256 timestamp; u256 timestamp = Invalid256;
bytes extraData; bytes extraData;
h256 mixHash; h256 mixHash;
Nonce nonce; Nonce nonce;

3
libethcore/Common.cpp

@ -34,7 +34,8 @@ namespace eth
{ {
const unsigned c_ethashVersion = c_ethashRevision; const unsigned c_ethashVersion = c_ethashRevision;
const unsigned c_protocolVersion = 59; const unsigned c_protocolVersion = 60;
const unsigned c_minorProtocolVersion = 0;
const unsigned c_databaseBaseVersion = 8; const unsigned c_databaseBaseVersion = 8;
#if ETH_FATDB #if ETH_FATDB
const unsigned c_databaseVersionModifier = 1; const unsigned c_databaseVersionModifier = 1;

3
libethcore/Common.h

@ -35,6 +35,9 @@ namespace eth
/// Current protocol version. /// Current protocol version.
extern const unsigned c_protocolVersion; extern const unsigned c_protocolVersion;
/// Current minor protocol version.
extern const unsigned c_minorProtocolVersion;
/// Current database version. /// Current database version.
extern const unsigned c_databaseVersion; extern const unsigned c_databaseVersion;

93
libethereum/BlockChain.cpp

@ -98,7 +98,7 @@ static const unsigned c_minCacheSize = 1024 * 1024 * 32;
#endif #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. // initialise deathrow.
m_cacheUsage.resize(c_collectionQueueSize); m_cacheUsage.resize(c_collectionQueueSize);
@ -108,7 +108,9 @@ BlockChain::BlockChain(bytes const& _genesisBlock, std::string _path, bool _kill
m_genesisBlock = _genesisBlock; m_genesisBlock = _genesisBlock;
m_genesisHash = sha3(RLP(m_genesisBlock)[0].data()); m_genesisHash = sha3(RLP(m_genesisBlock)[0].data());
open(_path, _killExisting); open(_path, _we);
if (_we == WithExisting::Verify)
rebuild(_path, _p);
} }
BlockChain::~BlockChain() BlockChain::~BlockChain()
@ -116,24 +118,23 @@ BlockChain::~BlockChain()
close(); close();
} }
void BlockChain::open(std::string _path, bool _killExisting) void BlockChain::open(std::string const& _path, WithExisting _we)
{ {
if (_path.empty()) std::string path = _path.empty() ? Defaults::get()->m_dbPath : _path;
_path = Defaults::get()->m_dbPath; boost::filesystem::create_directories(path);
boost::filesystem::create_directories(_path); if (_we == WithExisting::Kill)
if (_killExisting)
{ {
boost::filesystem::remove_all(_path + "/blocks"); boost::filesystem::remove_all(path + "/blocks");
boost::filesystem::remove_all(_path + "/details"); boost::filesystem::remove_all(path + "/details");
} }
ldb::Options o; ldb::Options o;
o.create_if_missing = true; o.create_if_missing = true;
ldb::DB::Open(o, _path + "/blocks", &m_blocksDB); ldb::DB::Open(o, path + "/blocks", &m_blocksDB);
ldb::DB::Open(o, _path + "/details", &m_extrasDB); ldb::DB::Open(o, path + "/details", &m_extrasDB);
if (!m_blocksDB || !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."; cwarn << "Not enough available space found on hard drive. Please free some up and then re-run. Bailing.";
BOOST_THROW_EXCEPTION(NotEnoughAvailableSpace()); 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. // TODO: Implement ability to rebuild details map from DB.
std::string l; std::string l;
m_extrasDB->Get(m_readOptions, ldb::Slice("best"), &l); m_extrasDB->Get(m_readOptions, ldb::Slice("best"), &l);
m_lastBlockHash = l.empty() ? m_genesisHash : *(h256*)l.data(); m_lastBlockHash = l.empty() ? m_genesisHash : *(h256*)l.data();
cnote << "Opened blockchain DB. Latest: " << currentHash(); cnote << "Opened blockchain DB. Latest: " << currentHash();
@ -174,6 +174,53 @@ void BlockChain::close()
m_blocks.clear(); m_blocks.clear();
} }
void BlockChain::rebuild(std::string const& _path, std::function<void(unsigned, unsigned)> 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<BlockHash, ExtraBlockHash>(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 <class T, class V> template <class T, class V>
bool contains(T const& _t, V const& _v) bool contains(T const& _t, V const& _v)
{ {
@ -414,12 +461,22 @@ h256s BlockChain::import(bytes const& _block, OverlayDB const& _db)
#endif #endif
} }
#if ETH_CATCH #if ETH_CATCH
catch (Exception const& _e) catch (InvalidNonce const& _e)
{ {
clog(BlockChainNote) << " Malformed block: " << diagnostic_information(_e); clog(BlockChainNote) << " Malformed block: " << diagnostic_information(_e);
_e << errinfo_comment("Malformed block "); _e << errinfo_comment("Malformed block ");
throw; 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 #endif
StructuredLogger::chainReceivedNewBlock( StructuredLogger::chainReceivedNewBlock(
@ -462,14 +519,14 @@ h256s BlockChain::import(bytes const& _block, OverlayDB const& _db)
h256s BlockChain::treeRoute(h256 const& _from, h256 const& _to, h256* o_common, bool _pre, bool _post) const h256s BlockChain::treeRoute(h256 const& _from, h256 const& _to, h256* o_common, bool _pre, bool _post) const
{ {
cdebug << "treeRoute" << _from.abridged() << "..." << _to.abridged(); // cdebug << "treeRoute" << _from.abridged() << "..." << _to.abridged();
if (!_from || !_to) if (!_from || !_to)
return h256s(); return h256s();
h256s ret; h256s ret;
h256s back; h256s back;
unsigned fn = details(_from).number; unsigned fn = details(_from).number;
unsigned tn = details(_to).number; unsigned tn = details(_to).number;
cdebug << "treeRoute" << fn << "..." << tn; // cdebug << "treeRoute" << fn << "..." << tn;
h256 from = _from; h256 from = _from;
while (fn > tn) while (fn > tn)
{ {
@ -477,7 +534,7 @@ h256s BlockChain::treeRoute(h256 const& _from, h256 const& _to, h256* o_common,
ret.push_back(from); ret.push_back(from);
from = details(from).parent; from = details(from).parent;
fn--; fn--;
cdebug << "from:" << fn << _from.abridged(); // cdebug << "from:" << fn << _from.abridged();
} }
h256 to = _to; h256 to = _to;
while (fn < tn) while (fn < tn)
@ -486,7 +543,7 @@ h256s BlockChain::treeRoute(h256 const& _from, h256 const& _to, h256* o_common,
back.push_back(to); back.push_back(to);
to = details(to).parent; to = details(to).parent;
tn--; tn--;
cdebug << "to:" << tn << _to.abridged(); // cdebug << "to:" << tn << _to.abridged();
} }
while (from != to) while (from != to)
{ {

18
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 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 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 // TODO: Move all this Genesis stuff into Genesis.h/.cpp
std::map<Address, Account> const& genesisState(); std::map<Address, Account> const& genesisState();
@ -77,6 +78,8 @@ enum {
ExtraBlocksBlooms ExtraBlocksBlooms
}; };
using ProgressCallback = std::function<void(unsigned, unsigned)>;
/** /**
* @brief Implements the blockchain database. All data this gives is disk-backed. * @brief Implements the blockchain database. All data this gives is disk-backed.
* @threadsafe * @threadsafe
@ -85,10 +88,11 @@ enum {
class BlockChain class BlockChain
{ {
public: public:
BlockChain(bytes const& _genesisBlock, std::string _path, bool _killExisting); BlockChain(bytes const& _genesisBlock, std::string _path, WithExisting _we, ProgressCallback const& _p = ProgressCallback());
~BlockChain(); ~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. /// (Potentially) renders invalid existing bytesConstRef returned by lastBlock.
/// To be called from main loop every 100ms or so. /// To be called from main loop every 100ms or so.
@ -186,6 +190,10 @@ public:
/// togther with all their quoted uncles. /// togther with all their quoted uncles.
h256Set allUnclesFrom(h256 const& _parent) const; 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<void(unsigned, unsigned)>());
/** @returns the hash of all blocks between @a _from and @a _to, all blocks are ordered first by a number of /** @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. * 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: private:
static h256 chunkId(unsigned _level, unsigned _index) { return h256(_index * 0xff + _level); } 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(); void close();
template<class T, unsigned N> T queryExtras(h256 const& _h, std::map<h256, T>& _m, boost::shared_mutex& _x, T const& _n) const template<class T, unsigned N> T queryExtras(h256 const& _h, std::map<h256, T>& _m, boost::shared_mutex& _x, T const& _n, ldb::DB* _extrasDB = nullptr) const
{ {
{ {
ReadGuard l(_x); ReadGuard l(_x);
@ -235,7 +243,7 @@ private:
} }
std::string s; 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()) if (s.empty())
{ {
// cout << "Not found in DB: " << _h << endl; // cout << "Not found in DB: " << _h << endl;

2
libethereum/CanonBlockChain.cpp

@ -92,6 +92,6 @@ bytes CanonBlockChain::createGenesisBlock()
return block.out(); 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)
{ {
} }

4
libethereum/CanonBlockChain.h

@ -55,8 +55,8 @@ std::map<Address, Account> const& genesisState();
class CanonBlockChain: public BlockChain class CanonBlockChain: public BlockChain
{ {
public: public:
CanonBlockChain(bool _killExisting = false): CanonBlockChain(std::string(), _killExisting) {} CanonBlockChain(WithExisting _we = WithExisting::Trust): CanonBlockChain(std::string(), _we) {}
CanonBlockChain(std::string _path, bool _killExisting = false); CanonBlockChain(std::string const& _path, WithExisting _we = WithExisting::Trust);
~CanonBlockChain() {} ~CanonBlockChain() {}
/// @returns the genesis block header. /// @returns the genesis block header.

43
libethereum/Client.cpp

@ -38,14 +38,30 @@ using namespace p2p;
VersionChecker::VersionChecker(string const& _dbPath): VersionChecker::VersionChecker(string const& _dbPath):
m_path(_dbPath.size() ? _dbPath : Defaults::dbPath()) m_path(_dbPath.size() ? _dbPath : Defaults::dbPath())
{ {
auto protocolContents = contents(m_path + "/protocol"); bytes statusBytes = contents(m_path + "/status");
auto databaseContents = contents(m_path + "/database"); RLP status(statusBytes);
m_ok = RLP(protocolContents).toInt<unsigned>(RLP::LaisezFaire) == eth::c_protocolVersion && RLP(databaseContents).toInt<unsigned>(RLP::LaisezFaire) == c_databaseVersion; try
{
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;
}
catch (...)
{
m_action = WithExisting::Kill;
}
} }
void VersionChecker::setOk() void VersionChecker::setOk()
{ {
if (!m_ok) if (m_action != WithExisting::Trust)
{ {
try try
{ {
@ -55,8 +71,7 @@ void VersionChecker::setOk()
{ {
cwarn << "Unhandled exception! Failed to create directory: " << m_path << "\n" << boost::current_exception_diagnostic_information(); 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 + "/status", rlpList(eth::c_protocolVersion, eth::c_minorProtocolVersion, c_databaseVersion));
writeFile(m_path + "/database", rlp(c_databaseVersion));
} }
} }
@ -102,12 +117,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"), Worker("eth"),
m_vc(_dbPath), m_vc(_dbPath),
m_bc(_dbPath, !m_vc.ok() || _forceClean), m_bc(_dbPath, max(m_vc.action(), _forceAction)),
m_gp(new TrivialGasPricer), 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_preMine(Address(), m_stateDB),
m_postMine(Address(), m_stateDB) m_postMine(Address(), m_stateDB)
{ {
@ -127,12 +142,12 @@ Client::Client(p2p::Host* _extNet, std::string const& _dbPath, bool _forceClean,
startWorking(); startWorking();
} }
Client::Client(p2p::Host* _extNet, std::shared_ptr<GasPricer> _gp, std::string const& _dbPath, bool _forceClean, u256 _networkId, int _miners): Client::Client(p2p::Host* _extNet, std::shared_ptr<GasPricer> _gp, std::string const& _dbPath, WithExisting _forceAction, u256 _networkId, int _miners):
Worker("eth"), Worker("eth"),
m_vc(_dbPath), m_vc(_dbPath),
m_bc(_dbPath, !m_vc.ok() || _forceClean), m_bc(_dbPath, max(m_vc.action(), _forceAction)),
m_gp(_gp), 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_preMine(Address(), m_stateDB),
m_postMine(Address(), m_stateDB) m_postMine(Address(), m_stateDB)
{ {
@ -202,9 +217,9 @@ void Client::killChain()
{ {
WriteGuard l(x_stateDB); WriteGuard l(x_stateDB);
m_stateDB = OverlayDB(); 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_preMine = State(Address(), m_stateDB);
m_postMine = State(Address(), m_stateDB); m_postMine = State(Address(), m_stateDB);

8
libethereum/Client.h

@ -65,10 +65,10 @@ public:
VersionChecker(std::string const& _dbPath); VersionChecker(std::string const& _dbPath);
void setOk(); void setOk();
bool ok() const { return m_ok; } WithExisting action() const { return m_action; }
private: private:
bool m_ok; WithExisting m_action;
std::string m_path; std::string m_path;
}; };
@ -126,7 +126,7 @@ public:
explicit Client( explicit Client(
p2p::Host* _host, p2p::Host* _host,
std::string const& _dbPath = std::string(), std::string const& _dbPath = std::string(),
bool _forceClean = false, WithExisting _forceAction = WithExisting::Trust,
u256 _networkId = 0, u256 _networkId = 0,
int _miners = -1 int _miners = -1
); );
@ -135,7 +135,7 @@ public:
p2p::Host* _host, p2p::Host* _host,
std::shared_ptr<GasPricer> _gpForAdoption, // pass it in with new. std::shared_ptr<GasPricer> _gpForAdoption, // pass it in with new.
std::string const& _dbPath = std::string(), std::string const& _dbPath = std::string(),
bool _forceClean = false, WithExisting _forceAction = WithExisting::Trust,
u256 _networkId = 0, u256 _networkId = 0,
int _miners = -1 int _miners = -1
); );

4
libethereum/Executive.h

@ -61,9 +61,9 @@ class Executive
{ {
public: public:
/// Basic constructor. /// Basic constructor.
Executive(State& _s, LastHashes const& _lh, unsigned _level): m_s(_s), m_lastHashes(_lh), m_depth(_level) {} Executive(State& _s, LastHashes const& _lh, unsigned _level = 0): m_s(_s), m_lastHashes(_lh), m_depth(_level) {}
/// Basic constructor. /// Basic constructor.
Executive(State& _s, BlockChain const& _bc, unsigned _level); Executive(State& _s, BlockChain const& _bc, unsigned _level = 0);
/// Basic destructor. /// Basic destructor.
~Executive() = default; ~Executive() = default;

4
libethereum/State.cpp

@ -46,13 +46,13 @@ using namespace dev::eth;
static const u256 c_blockReward = 1500 * finney; 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()) if (_path.empty())
_path = Defaults::get()->m_dbPath; _path = Defaults::get()->m_dbPath;
boost::filesystem::create_directory(_path); boost::filesystem::create_directory(_path);
if (_killExisting) if (_we == WithExisting::Kill)
boost::filesystem::remove_all(_path + "/state"); boost::filesystem::remove_all(_path + "/state");
ldb::Options o; ldb::Options o;

4
libethereum/State.h

@ -123,8 +123,8 @@ public:
Address address() const { return m_ourAddress; } Address address() const { return m_ourAddress; }
/// Open a DB - useful for passing into the constructor & keeping for other states that are necessary. /// 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(std::string _path, WithExisting _we = WithExisting::Trust);
static OverlayDB openDB(bool _killExisting = false) { return openDB(std::string(), _killExisting); } static OverlayDB openDB(WithExisting _we = WithExisting::Trust) { return openDB(std::string(), _we); }
OverlayDB const& db() const { return m_db; } OverlayDB const& db() const { return m_db; }
/// @returns the set containing all addresses currently in use in Ethereum. /// @returns the set containing all addresses currently in use in Ethereum.

2
libevm/VM.h

@ -56,7 +56,7 @@ public:
virtual bytesConstRef go(ExtVMFace& _ext, OnOpFunc const& _onOp = {}, uint64_t _steps = (uint64_t)-1) override final; virtual bytesConstRef go(ExtVMFace& _ext, OnOpFunc const& _onOp = {}, uint64_t _steps = (uint64_t)-1) override final;
void require(u256 _n, u256 _d) { if (m_stack.size() < _n) { if (m_onFail) m_onFail(); BOOST_THROW_EXCEPTION(StackUnderflow() << RequirementError((bigint)_n, (bigint)m_stack.size())); } if (m_stack.size() - _n + _d >= c_stackLimit) { if (m_onFail) m_onFail(); BOOST_THROW_EXCEPTION(OutOfStack() << RequirementError((bigint)(_d - _n), (bigint)m_stack.size())); } } void require(u256 _n, u256 _d) { if (m_stack.size() < _n) { if (m_onFail) m_onFail(); BOOST_THROW_EXCEPTION(StackUnderflow() << RequirementError((bigint)_n, (bigint)m_stack.size())); } if (m_stack.size() - _n + _d > c_stackLimit) { if (m_onFail) m_onFail(); BOOST_THROW_EXCEPTION(OutOfStack() << RequirementError((bigint)(_d - _n), (bigint)m_stack.size())); } }
void requireMem(unsigned _n) { if (m_temp.size() < _n) { m_temp.resize(_n); } } void requireMem(unsigned _n) { if (m_temp.size() < _n) { m_temp.resize(_n); } }
u256 curPC() const { return m_curPC; } u256 curPC() const { return m_curPC; }

2
libtestutils/BlockChainLoader.cpp

@ -35,7 +35,7 @@ BlockChainLoader::BlockChainLoader(Json::Value const& _json)
m_state = sl.state(); m_state = sl.state();
// load genesisBlock // 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 // load blocks
for (auto const& block: _json["blocks"]) for (auto const& block: _json["blocks"])

3
libtestutils/CMakeLists.txt

@ -32,7 +32,10 @@ endif()
target_link_libraries(${EXECUTABLE} ${Boost_FILESYSTEM_LIBRARIES}) target_link_libraries(${EXECUTABLE} ${Boost_FILESYSTEM_LIBRARIES})
target_link_libraries(${EXECUTABLE} ${JSONCPP_LIBRARIES}) target_link_libraries(${EXECUTABLE} ${JSONCPP_LIBRARIES})
target_link_libraries(${EXECUTABLE} ethereum) target_link_libraries(${EXECUTABLE} ethereum)
if (JSONRPC)
target_link_libraries(${EXECUTABLE} web3jsonrpc) target_link_libraries(${EXECUTABLE} web3jsonrpc)
endif()
install( TARGETS ${EXECUTABLE} RUNTIME DESTINATION bin ARCHIVE DESTINATION lib LIBRARY DESTINATION lib ) install( TARGETS ${EXECUTABLE} RUNTIME DESTINATION bin ARCHIVE DESTINATION lib LIBRARY DESTINATION lib )
install( FILES ${HEADERS} DESTINATION include/${EXECUTABLE} ) install( FILES ${HEADERS} DESTINATION include/${EXECUTABLE} )

12
libweb3jsonrpc/WebThreeStubServerBase.cpp

@ -57,6 +57,8 @@ const unsigned dev::SensibleHttpPort = 8080;
static Json::Value toJson(dev::eth::BlockInfo const& _bi) static Json::Value toJson(dev::eth::BlockInfo const& _bi)
{ {
Json::Value res; Json::Value res;
if (_bi)
{
res["hash"] = toJS(_bi.hash); res["hash"] = toJS(_bi.hash);
res["parentHash"] = toJS(_bi.parentHash); res["parentHash"] = toJS(_bi.parentHash);
res["sha3Uncles"] = toJS(_bi.sha3Uncles); res["sha3Uncles"] = toJS(_bi.sha3Uncles);
@ -71,12 +73,15 @@ static Json::Value toJson(dev::eth::BlockInfo const& _bi)
res["extraData"] = toJS(_bi.extraData); res["extraData"] = toJS(_bi.extraData);
res["nonce"] = toJS(_bi.nonce); res["nonce"] = toJS(_bi.nonce);
res["logsBloom"] = toJS(_bi.logBloom); res["logsBloom"] = toJS(_bi.logBloom);
}
return res; return res;
} }
static Json::Value toJson(dev::eth::Transaction const& _t) static Json::Value toJson(dev::eth::Transaction const& _t)
{ {
Json::Value res; Json::Value res;
if (_t)
{
res["hash"] = toJS(_t.sha3()); res["hash"] = toJS(_t.sha3());
res["input"] = toJS(_t.data()); res["input"] = toJS(_t.data());
res["to"] = _t.isCreation() ? Json::Value() : toJS(_t.receiveAddress()); res["to"] = _t.isCreation() ? Json::Value() : toJS(_t.receiveAddress());
@ -85,30 +90,37 @@ static Json::Value toJson(dev::eth::Transaction const& _t)
res["gasPrice"] = toJS(_t.gasPrice()); res["gasPrice"] = toJS(_t.gasPrice());
res["nonce"] = toJS(_t.nonce()); res["nonce"] = toJS(_t.nonce());
res["value"] = toJS(_t.value()); res["value"] = toJS(_t.value());
}
return res; return res;
} }
static Json::Value toJson(dev::eth::BlockInfo const& _bi, UncleHashes const& _us, Transactions const& _ts) static Json::Value toJson(dev::eth::BlockInfo const& _bi, UncleHashes const& _us, Transactions const& _ts)
{ {
Json::Value res = toJson(_bi); Json::Value res = toJson(_bi);
if (_bi)
{
res["uncles"] = Json::Value(Json::arrayValue); res["uncles"] = Json::Value(Json::arrayValue);
for (h256 h: _us) for (h256 h: _us)
res["uncles"].append(toJS(h)); res["uncles"].append(toJS(h));
res["transactions"] = Json::Value(Json::arrayValue); res["transactions"] = Json::Value(Json::arrayValue);
for (Transaction const& t: _ts) for (Transaction const& t: _ts)
res["transactions"].append(toJson(t)); res["transactions"].append(toJson(t));
}
return res; return res;
} }
static Json::Value toJson(dev::eth::BlockInfo const& _bi, UncleHashes const& _us, TransactionHashes const& _ts) static Json::Value toJson(dev::eth::BlockInfo const& _bi, UncleHashes const& _us, TransactionHashes const& _ts)
{ {
Json::Value res = toJson(_bi); Json::Value res = toJson(_bi);
if (_bi)
{
res["uncles"] = Json::Value(Json::arrayValue); res["uncles"] = Json::Value(Json::arrayValue);
for (h256 h: _us) for (h256 h: _us)
res["uncles"].append(toJS(h)); res["uncles"].append(toJS(h));
res["transactions"] = Json::Value(Json::arrayValue); res["transactions"] = Json::Value(Json::arrayValue);
for (h256 const& t: _ts) for (h256 const& t: _ts)
res["transactions"].append(toJS(t)); res["transactions"].append(toJS(t));
}
return res; return res;
} }

4
libwebthree/WebThree.cpp

@ -39,7 +39,7 @@ using namespace dev::shh;
WebThreeDirect::WebThreeDirect( WebThreeDirect::WebThreeDirect(
std::string const& _clientVersion, std::string const& _clientVersion,
std::string const& _dbPath, std::string const& _dbPath,
bool _forceClean, WithExisting _we,
std::set<std::string> const& _interfaces, std::set<std::string> const& _interfaces,
NetworkPreferences const& _n, NetworkPreferences const& _n,
bytesConstRef _network, int _miners bytesConstRef _network, int _miners
@ -50,7 +50,7 @@ WebThreeDirect::WebThreeDirect(
if (_dbPath.size()) if (_dbPath.size())
Defaults::setDBPath(_dbPath); Defaults::setDBPath(_dbPath);
if (_interfaces.count("eth")) 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")) if (_interfaces.count("shh"))
m_whisper = m_net.registerCapability<WhisperHost>(new WhisperHost); m_whisper = m_net.registerCapability<WhisperHost>(new WhisperHost);

8
libwebthree/WebThree.h

@ -25,17 +25,13 @@
#include <mutex> #include <mutex>
#include <list> #include <list>
#include <atomic> #include <atomic>
#include <boost/asio.hpp> // Make sure boost/asio.hpp is included before windows.h.
// Make sure boost/asio.hpp is included before windows.h.
#include <boost/asio.hpp>
#include <boost/utility.hpp> #include <boost/utility.hpp>
#include <libdevcore/Common.h> #include <libdevcore/Common.h>
#include <libdevcore/CommonIO.h> #include <libdevcore/CommonIO.h>
#include <libdevcore/Guards.h> #include <libdevcore/Guards.h>
#include <libdevcore/Exceptions.h> #include <libdevcore/Exceptions.h>
#include <libp2p/Host.h> #include <libp2p/Host.h>
#include <libwhisper/WhisperHost.h> #include <libwhisper/WhisperHost.h>
#include <libethereum/Client.h> #include <libethereum/Client.h>
@ -113,7 +109,7 @@ public:
WebThreeDirect( WebThreeDirect(
std::string const& _clientVersion, std::string const& _clientVersion,
std::string const& _dbPath, std::string const& _dbPath,
bool _forceClean = false, WithExisting _we = WithExisting::Trust,
std::set<std::string> const& _interfaces = {"eth", "shh"}, std::set<std::string> const& _interfaces = {"eth", "shh"},
p2p::NetworkPreferences const& _n = p2p::NetworkPreferences(), p2p::NetworkPreferences const& _n = p2p::NetworkPreferences(),
bytesConstRef _network = bytesConstRef(), bytesConstRef _network = bytesConstRef(),

2
mix/MixClient.h

@ -37,7 +37,7 @@ namespace mix
class MixBlockChain: public dev::eth::BlockChain class MixBlockChain: public dev::eth::BlockChain
{ {
public: 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); static bytes createGenesisBlock(h256 _stateRoot);
}; };

12
mix/qml/Debugger.qml

@ -225,24 +225,24 @@ Rectangle {
id: playAction id: playAction
enabledStateImg: "qrc:/qml/img/play_button.png" enabledStateImg: "qrc:/qml/img/play_button.png"
disableStateImg: "qrc:/qml/img/play_button.png" disableStateImg: "qrc:/qml/img/play_button.png"
onClicked: console.log("play"); onClicked: projectModel.stateListModel.runState(transactionLog.selectedStateIndex)
width: 30 width: 30
height: 30 height: 30
buttonShortcut: "Ctrl+Shift+F8" buttonShortcut: "Ctrl+Shift+F8"
buttonTooltip: qsTr("Play") buttonTooltip: qsTr("Start Debugging")
visible: true visible: true
} }
StepActionImage StepActionImage
{ {
id: pauseAction id: pauseAction
enabledStateImg: "qrc:/qml/img/pause_button.png" enabledStateImg: "qrc:/qml/img/stop_button2x.png"
disableStateImg: "qrc:/qml/img/pause_button.png" disableStateImg: "qrc:/qml/img/stop_button2x.png"
onClicked: console.log("pause"); onClicked: Debugger.init(null);
width: 30 width: 30
height: 30 height: 30
buttonShortcut: "Ctrl+Shift+F9" buttonShortcut: "Ctrl+Shift+F9"
buttonTooltip: qsTr("Pause") buttonTooltip: qsTr("Stop Debugging")
visible: true visible: true
} }

31
mix/qml/LogsPane.qml

@ -37,7 +37,6 @@ Rectangle
height: parent.height - rowAction.height height: parent.height - rowAction.height
width: parent.width width: parent.width
spacing: 0 spacing: 0
ListModel { ListModel {
id: logsModel id: logsModel
} }
@ -100,7 +99,7 @@ Rectangle
Rectangle Rectangle
{ {
width: 750 width: LogsPaneStyle.generic.layout.dateWidth + LogsPaneStyle.generic.layout.contentWidth + LogsPaneStyle.generic.layout.typeWidth
height: 30 height: 30
color: color:
{ {
@ -171,7 +170,7 @@ Rectangle
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
elide: Text.ElideRight elide: Text.ElideRight
anchors.left: parent.left anchors.left: parent.left
anchors.leftMargin: 190 anchors.leftMargin: 230
color: { color: {
parent.getColor(level); parent.getColor(level);
} }
@ -486,11 +485,31 @@ Rectangle
} }
} }
Rectangle
{
width: 120
radius: 10
height: 25
color: "white"
anchors.verticalCenter: parent.verticalCenter
Image
{
id: searchImg
source: "qrc:/qml/img/searchicon.png"
fillMode: Image.PreserveAspectFit
width: 20
height: 25
z: 3
}
DefaultTextField DefaultTextField
{ {
id: searchBox id: searchBox
anchors.verticalCenter: parent.verticalCenter z: 2
width: LogsPaneStyle.generic.layout.headerInputWidth - 50 width: 100
anchors.left: searchImg.right
anchors.leftMargin: -7
font.family: LogsPaneStyle.generic.layout.logLabelFont font.family: LogsPaneStyle.generic.layout.logLabelFont
font.pointSize: Style.absoluteSize(-3) font.pointSize: Style.absoluteSize(-3)
font.italic: true font.italic: true
@ -517,7 +536,7 @@ Rectangle
} }
} }
} }
}
Rectangle Rectangle
{ {

4
mix/qml/LogsPaneStyle.qml

@ -18,8 +18,8 @@ QtObject {
property string logLabelColor: "#4a4a4a" property string logLabelColor: "#4a4a4a"
property string logLabelFont: "sans serif" property string logLabelFont: "sans serif"
property int headerInputWidth: 200 property int headerInputWidth: 200
property int dateWidth: 70 property int dateWidth: 150
property int typeWidth: 90 property int typeWidth: 150
property int contentWidth: 560 property int contentWidth: 560
property string logAlternateColor: "#f6f5f6" property string logAlternateColor: "#f6f5f6"
property string errorColor: "#fffcd5" property string errorColor: "#fffcd5"

39
mix/qml/StatesComboBox.qml

@ -29,7 +29,7 @@ Rectangle {
id: statesComboBox id: statesComboBox
width: 200 width: 200
height: 20 height: 23
Component.onCompleted: { Component.onCompleted: {
var top = dropDownList var top = dropDownList
@ -53,7 +53,7 @@ Rectangle {
signal selectItem(real item) signal selectItem(real item)
signal editItem(real item) signal editItem(real item)
signal selectCreate signal selectCreate
property variant rowHeight: 25 property int rowHeight: 25
property variant items property variant items
property alias selectedItem: chosenItemText.text property alias selectedItem: chosenItemText.text
property alias selectedIndex: listView.currentRow property alias selectedIndex: listView.currentRow
@ -67,21 +67,31 @@ Rectangle {
property variant colorItem property variant colorItem
property variant colorSelect property variant colorSelect
SourceSansProRegular
{
id: regularFont
}
SourceSansProBold
{
id: boldFont
}
smooth: true smooth: true
Rectangle { Rectangle {
id: chosenItem id: chosenItem
width: parent.width width: parent.width
height: statesComboBox.height height: statesComboBox.height
color: statesComboBox.color color: statesComboBox.color
smooth: true
Text { Text {
id: chosenItemText id: chosenItemText
anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
anchors.margins: 2 anchors.leftMargin: 10
anchors.verticalCenter: parent.verticalCenter
color: statesComboBox.colorItem color: statesComboBox.colorItem
text: "" text: ""
smooth: true font.family: regularFont.name
} }
MouseArea { MouseArea {
@ -111,7 +121,7 @@ Rectangle {
clip: true clip: true
radius: 4 radius: 4
anchors.top: chosenItem.top anchors.top: chosenItem.top
anchors.margins: 2 anchors.topMargin: 23
color: statesComboBox.color color: statesComboBox.color
ColumnLayout { ColumnLayout {
@ -151,7 +161,9 @@ Rectangle {
color: statesComboBox.colorItem color: statesComboBox.colorItem
anchors.top: parent.top anchors.top: parent.top
anchors.left: parent.left anchors.left: parent.left
anchors.margins: 5 anchors.leftMargin: 10
anchors.topMargin: 5
font.family: regularFont.name
} }
Image { Image {
id: imageItemid id: imageItemid
@ -197,15 +209,18 @@ Rectangle {
} //Table View } //Table View
RowLayout { RowLayout {
Rectangle { anchors.top: listView.bottom
width: 1 anchors.topMargin: 4
} anchors.left: parent.left
anchors.leftMargin: 10
Text { Text {
id: createStateText id: createStateText
width: statesComboBox.width width: statesComboBox.width
height: statesComboBox.height height: statesComboBox.height
font.bold: true font.family: boldFont.name
color: "#808080"
text: qsTr("Create State ...") text: qsTr("Create State ...")
font.weight: Font.DemiBold
MouseArea { MouseArea {
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true

4
mix/qml/StatusPane.qml

@ -227,7 +227,7 @@ Rectangle {
top = top.parent top = top.parent
var coordinates = logsContainer.mapToItem(top, 0, 0); var coordinates = logsContainer.mapToItem(top, 0, 0);
logsContainer.parent = top; logsContainer.parent = top;
logsContainer.x = status.x + statusContainer.x - LogsPaneStyle.generic.layout.dateWidth - LogsPaneStyle.generic.layout.typeWidth - 30 logsContainer.x = status.x + statusContainer.x - LogsPaneStyle.generic.layout.dateWidth - LogsPaneStyle.generic.layout.typeWidth + 70
} }
LogsPane LogsPane
@ -239,7 +239,6 @@ Rectangle {
State { State {
name: "opened"; name: "opened";
PropertyChanges { target: logsContainer; height: 500; visible: true } PropertyChanges { target: logsContainer; height: 500; visible: true }
PropertyChanges { target: statusContainer; width: 100; height: 25 }
}, },
State { State {
name: "closed"; name: "closed";
@ -250,7 +249,6 @@ Rectangle {
transitions: Transition { transitions: Transition {
NumberAnimation { properties: "height"; easing.type: Easing.InOutQuad; duration: 200 } NumberAnimation { properties: "height"; easing.type: Easing.InOutQuad; duration: 200 }
NumberAnimation { target: logsContainer; properties: "visible"; easing.type: Easing.InOutQuad; duration: 200 } NumberAnimation { target: logsContainer; properties: "visible"; easing.type: Easing.InOutQuad; duration: 200 }
NumberAnimation { target: statusContainer; properties: "width"; easing.type: Easing.InOutQuad; duration: 500 }
} }
} }
} }

6
mix/qml/TransactionLog.qml

@ -9,6 +9,7 @@ Item {
property ListModel fullModel: ListModel{} property ListModel fullModel: ListModel{}
property ListModel transactionModel: ListModel{} property ListModel transactionModel: ListModel{}
property ListModel callModel: ListModel{} property ListModel callModel: ListModel{}
property int selectedStateIndex: statesCombo.selectedIndex
ColumnLayout { ColumnLayout {
anchors.fill: parent anchors.fill: parent
@ -45,14 +46,15 @@ Item {
projectModel.stateListModel.debugDefaultState(); projectModel.stateListModel.debugDefaultState();
} }
} }
StatesComboBox StatesComboBox
{ {
id: statesCombo id: statesCombo
items: projectModel.stateListModel items: projectModel.stateListModel
onSelectCreate: projectModel.stateListModel.addState(); onSelectCreate: projectModel.stateListModel.addState();
onEditItem: projectModel.stateListModel.editState(item) onEditItem: projectModel.stateListModel.editState(item)
colorItem: "black" colorItem: "#808080"
colorSelect: "blue" colorSelect: "#4a90e2"
color: "white" color: "white"
Connections { Connections {
target: projectModel.stateListModel target: projectModel.stateListModel

BIN
mix/qml/img/searchicon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
mix/qml/img/stop_button2x.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 235 B

2
mix/res.qrc

@ -61,5 +61,7 @@
<file>qml/img/cleariconactive.png</file> <file>qml/img/cleariconactive.png</file>
<file>qml/img/copyicon.png</file> <file>qml/img/copyicon.png</file>
<file>qml/img/copyiconactive.png</file> <file>qml/img/copyiconactive.png</file>
<file>qml/img/searchicon.png</file>
<file>qml/img/stop_button2x.png</file>
</qresource> </qresource>
</RCC> </RCC>

2
neth/main.cpp

@ -550,7 +550,7 @@ int main(int argc, char** argv)
dev::WebThreeDirect web3( dev::WebThreeDirect web3(
clientImplString, clientImplString,
dbPath, dbPath,
killChain, killChain ? WithExisting::Kill : WithExisting::Trust,
mode == NodeMode::Full ? set<string>{"eth", "shh"} : set<string>(), mode == NodeMode::Full ? set<string>{"eth", "shh"} : set<string>(),
netPrefs, netPrefs,
&nodesState, &nodesState,

2
test/blockchain.cpp

@ -78,7 +78,7 @@ void doBlockchainTests(json_spirit::mValue& _v, bool _fillin)
// construct blockchain // construct blockchain
TransientDirectory td; TransientDirectory td;
BlockChain bc(rlpGenesisBlock.out(), td.path(), true); BlockChain bc(rlpGenesisBlock.out(), td.path(), WithExisting::Kill);
if (_fillin) if (_fillin)
{ {

114
test/stMemoryTestFiller.json

@ -1461,7 +1461,7 @@
} }
}, },
"stackLimitPush32_1024": { "stackLimitPush32_1023": {
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
@ -1495,7 +1495,7 @@
} }
}, },
"stackLimitPush32_1025": { "stackLimitPush32_1024": {
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
@ -1529,7 +1529,41 @@
} }
}, },
"stackLimitPush31_1024": { "stackLimitPush32_1025": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
"currentGasLimit" : "42949672960",
"currentDifficulty" : "256",
"currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
},
"pre" : {
"0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "1000000000000000000",
"nonce" : "0",
"code" : "(asm 1023 0x00 MSTORE JUMPDEST 0x0102030405060708090a0102030405060708090a0102030405060708090a0102 0x01 0x00 MLOAD SUB 0x00 MSTORE 0x00 MLOAD 0x06 JUMPI STOP )",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
"balance" : "429496729600",
"nonce" : "0",
"code" : "",
"storage": {}
}
},
"transaction" : {
"nonce" : "0",
"gasPrice" : "1",
"gasLimit" : "100000",
"to" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
"value" : "10",
"secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
"data" : ""
}
},
"stackLimitPush31_1023": {
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
@ -1563,7 +1597,7 @@
} }
}, },
"stackLimitPush31_1025": { "stackLimitPush31_1024": {
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
@ -1597,7 +1631,41 @@
} }
}, },
"stackLimitGas_1024": { "stackLimitPush31_1025": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
"currentGasLimit" : "42949672960",
"currentDifficulty" : "256",
"currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
},
"pre" : {
"0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "1000000000000000000",
"nonce" : "0",
"code" : "(asm 1023 0x00 MSTORE JUMPDEST 0x0102030405060708090a0102030405060708090a0102030405060708090a01 0x01 0x00 MLOAD SUB 0x00 MSTORE 0x00 MLOAD 0x06 JUMPI STOP )",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
"balance" : "429496729600",
"nonce" : "0",
"code" : "",
"storage": {}
}
},
"transaction" : {
"nonce" : "0",
"gasPrice" : "1",
"gasLimit" : "100000",
"to" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
"value" : "10",
"secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
"data" : ""
}
},
"stackLimitGas_1023": {
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
@ -1631,7 +1699,7 @@
} }
}, },
"stackLimitGas_1025": { "stackLimitGas_1024": {
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
@ -1665,6 +1733,40 @@
} }
}, },
"stackLimitGas_1025": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
"currentGasLimit" : "42949672960",
"currentDifficulty" : "256",
"currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
},
"pre" : {
"0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6" : {
"balance" : "1000000000000000000",
"nonce" : "0",
"code" : "(asm 1023 0x00 MSTORE JUMPDEST GAS 0x01 0x00 MLOAD SUB 0x00 MSTORE 0x00 MLOAD 0x06 JUMPI STOP )",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
"balance" : "429496729600",
"nonce" : "0",
"code" : "",
"storage": {}
}
},
"transaction" : {
"nonce" : "0",
"gasPrice" : "1",
"gasLimit" : "100000",
"to" : "0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6",
"value" : "10",
"secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
"data" : ""
}
},
"mstroe8_dejavu": { "mstroe8_dejavu": {
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",

Loading…
Cancel
Save