diff --git a/CMakeLists.txt b/CMakeLists.txt index e65f0b398..4603bb898 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -121,13 +121,8 @@ cmake_policy(SET CMP0015 NEW) createDefaultCacheConfig() configureProject() -# TODO: Move to some other place / remove once we make Qt5.4 mandatory. -find_package (Qt5WebEngine QUIET) -if ("${Qt5WebEngine_VERSION_STRING}" VERSION_GREATER "5.3.0") - set (ETH_HAVE_WEBENGINE 1) -else() - set (ETH_HAVE_WEBENGINE 0) -endif() +# Force chromium. +set (ETH_HAVE_WEBENGINE 1) message(STATUS "CMAKE_VERSION: ${CMAKE_VERSION}") message("-- VMTRACE: ${VMTRACE}; PARANOIA: ${PARANOIA}; HEADLESS: ${HEADLESS}; JSONRPC: ${JSONRPC}; EVMJIT: ${EVMJIT}; FATDB: ${FATDB}; CHROMIUM: ${ETH_HAVE_WEBENGINE}") diff --git a/alethzero/MainWin.cpp b/alethzero/MainWin.cpp index e786b12ed..88b9103cb 100644 --- a/alethzero/MainWin.cpp +++ b/alethzero/MainWin.cpp @@ -372,28 +372,6 @@ void Main::load(QString _s) { QString contents = QString::fromStdString(dev::asString(dev::contents(_s.toStdString()))); ui->webView->page()->runJavaScript(contents); - /* - QFile fin(_s); - if (!fin.open(QFile::ReadOnly)) - return; - QString line; - while (!fin.atEnd()) - { - QString l = QString::fromUtf8(fin.readLine()); - line.append(l); - if (line.count('"') % 2) - { - line.chop(1); - } - else if (line.endsWith("\\\n")) - line.chop(2); - else - { - ui->webView->page()->currentFrame()->evaluateJavaScript(line); - //eval(line); - line.clear(); - } - }*/ } void Main::on_newTransaction_triggered() @@ -472,37 +450,17 @@ static Public stringToPublic(QString const& _a) return Public(); } -//static Address g_newNameReg; - QString Main::pretty(dev::Address _a) const { -/* static map s_memos; - - if (!s_memos.count(_a)) - {*/ -// if (!g_newNameReg) - auto g_newNameReg = getNameReg(); - - if (g_newNameReg) - { - QString s = QString::fromStdString(toString(abiOut(ethereum()->call(g_newNameReg, abiIn("nameOf(address)", _a))))); -// s_memos[_a] = s; - if (s.size()) - return s; - } -/* } - else - if (s_memos[_a].size()) - return s_memos[_a];*/ + auto g_newNameReg = getNameReg(); + if (g_newNameReg) + { + QString s = QString::fromStdString(toString(abiOut(ethereum()->call(g_newNameReg, abiIn("nameOf(address)", _a))))); + if (s.size()) + return s; + } h256 n; -/* - if (h160 nameReg = (u160)ethereum()->stateAt(c_config, 0)) - n = ethereum()->stateAt(nameReg, (u160)(_a)); - - if (!n) - n = ethereum()->stateAt(m_nameReg, (u160)(_a)); -*/ return fromRaw(n); } @@ -527,41 +485,13 @@ Address Main::fromString(QString const& _n) const if (_n == "(Create Contract)") return Address(); -/* static map s_memos; - - if (!s_memos.count(_n)) - {*/ -// if (!g_newNameReg) - auto g_newNameReg = getNameReg(); - - if (g_newNameReg) - { - Address a = abiOut
(ethereum()->call(g_newNameReg, abiIn("addressOf(string32)", ::fromString(_n.toStdString())))); -// s_memos[_n] = a; - if (a) - return a; - } -/* } - else - if (s_memos[_n]) - return s_memos[_n]; - - string sn = _n.toStdString(); - if (sn.size() > 32) - sn.resize(32); - h256 n; - memcpy(n.data(), sn.data(), sn.size()); - memset(n.data() + sn.size(), 0, 32 - sn.size()); - if (_n.size()) + auto g_newNameReg = getNameReg(); + if (g_newNameReg) { - if (h160 nameReg = (u160)ethereum()->stateAt(c_config, 0)) - if (h256 a = ethereum()->stateAt(nameReg, n)) - return right160(a); - - if (h256 a = ethereum()->stateAt(m_nameReg, n)) - return right160(a); - }*/ - + Address a = abiOut
(ethereum()->call(g_newNameReg, abiIn("addressOf(string32)", ::fromString(_n.toStdString())))); + if (a) + return a; + } if (_n.size() == 40) { try @@ -595,13 +525,6 @@ QString Main::lookup(QString const& _a) const h256 n; memcpy(n.data(), sn.data(), sn.size()); -/* string sn2 = _a.toStdString(); - if (sn2.size() > 32) - sn2 = sha3(sn2, false); - h256 n2; - memcpy(n2.data(), sn2.data(), sn2.size()); -*/ - h256 ret; // TODO: fix with the new DNSreg contract // if (h160 dnsReg = (u160)ethereum()->stateAt(c_config, 4, 0)) @@ -1038,31 +961,6 @@ void Main::refreshBlockCount() ui->blockCount->setText(QString("%6 #%1 @%3 T%2 PV%4 D%5").arg(d.number).arg(toLog2(d.totalDifficulty)).arg(toLog2(diff)).arg(c_protocolVersion).arg(c_databaseVersion).arg(m_privateChain.size() ? "[" + m_privateChain + "] " : "testnet")); } -static bool blockMatch(string const& _f, BlockDetails const& _b, h256 _h, CanonBlockChain const& _bc) -{ - try - { - if (_f.size() > 1 && _f.size() < 10 && _f[0] == '#' && stoul(_f.substr(1)) == _b.number) - return true; - } - catch (...) {} - if (toHex(_h.ref()).find(_f) != string::npos) - return true; - BlockInfo bi(_bc.block(_h)); - string info = toHex(bi.stateRoot.ref()) + " " + toHex(bi.coinbaseAddress.ref()) + " " + toHex(bi.transactionsRoot.ref()) + " " + toHex(bi.sha3Uncles.ref()); - if (info.find(_f) != string::npos) - return true; - return false; -} - -static bool transactionMatch(string const& _f, Transaction const& _t) -{ - string info = toHex(_t.receiveAddress().ref()) + " " + toHex(_t.sha3().ref()) + " " + toHex(_t.sha3(eth::WithoutSignature).ref()) + " " + toHex(_t.sender().ref()); - if (info.find(_f) != string::npos) - return true; - return false; -} - void Main::on_turboMining_triggered() { ethereum()->setTurboMining(ui->turboMining->isChecked()); @@ -1072,55 +970,81 @@ void Main::refreshBlockChain() { cwatch << "refreshBlockChain()"; - QByteArray oldSelected = ui->blocks->count() ? ui->blocks->currentItem()->data(Qt::UserRole).toByteArray() : QByteArray(); - ui->blocks->clear(); + // TODO: keep the same thing highlighted. + // TODO: refactor into MVC + // TODO: use get by hash/number + // TODO: transactions, log addresses, log topics - string filter = ui->blockChainFilter->text().toLower().toStdString(); auto const& bc = ethereum()->blockChain(); - unsigned i = (ui->showAll->isChecked() || !filter.empty()) ? (unsigned)-1 : 10; - for (auto h = bc.currentHash(); bc.details(h) && i; h = bc.details(h).parent, --i) - { - auto d = bc.details(h); - auto bm = blockMatch(filter, d, h, bc); - if (bm) + QStringList filters = ui->blockChainFilter->text().toLower().split(QRegExp("\\s+"), QString::SkipEmptyParts); + + h256Set blocks; + for (QString f: filters) + if (f.size() == 64) { - QListWidgetItem* blockItem = new QListWidgetItem(QString("#%1 %2").arg(d.number).arg(h.abridged().c_str()), ui->blocks); - auto hba = QByteArray((char const*)h.data(), h.size); - blockItem->setData(Qt::UserRole, hba); - if (oldSelected == hba) - blockItem->setSelected(true); + h256 h(f.toStdString()); + if (bc.isKnown(h)) + blocks.insert(h); } + else if (f.toLongLong() <= bc.number()) + blocks.insert(bc.numberHash(u256(f.toLongLong()))); + /*else if (f.size() == 40) + { + Address h(f[0]); + if (bc.(h)) + blocks.insert(h); + }*/ + + QByteArray oldSelected = ui->blocks->count() ? ui->blocks->currentItem()->data(Qt::UserRole).toByteArray() : QByteArray(); + ui->blocks->clear(); + auto showBlock = [&](h256 const& h) { + auto d = bc.details(h); + QListWidgetItem* blockItem = new QListWidgetItem(QString("#%1 %2").arg(d.number).arg(h.abridged().c_str()), ui->blocks); + auto hba = QByteArray((char const*)h.data(), h.size); + blockItem->setData(Qt::UserRole, hba); + if (oldSelected == hba) + blockItem->setSelected(true); + int n = 0; auto b = bc.block(h); for (auto const& i: RLP(b)[1]) { Transaction t(i.data(), CheckSignature::Sender); - if (bm || transactionMatch(filter, t)) - { - QString s = t.receiveAddress() ? - QString(" %2 %5> %3: %1 [%4]") - .arg(formatBalance(t.value()).c_str()) - .arg(render(t.safeSender())) - .arg(render(t.receiveAddress())) - .arg((unsigned)t.nonce()) - .arg(ethereum()->codeAt(t.receiveAddress()).size() ? '*' : '-') : - QString(" %2 +> %3: %1 [%4]") - .arg(formatBalance(t.value()).c_str()) - .arg(render(t.safeSender())) - .arg(render(right160(sha3(rlpList(t.safeSender(), t.nonce()))))) - .arg((unsigned)t.nonce()); - QListWidgetItem* txItem = new QListWidgetItem(s, ui->blocks); - auto hba = QByteArray((char const*)h.data(), h.size); - txItem->setData(Qt::UserRole, hba); - txItem->setData(Qt::UserRole + 1, n); - if (oldSelected == hba) - txItem->setSelected(true); - } + QString s = t.receiveAddress() ? + QString(" %2 %5> %3: %1 [%4]") + .arg(formatBalance(t.value()).c_str()) + .arg(render(t.safeSender())) + .arg(render(t.receiveAddress())) + .arg((unsigned)t.nonce()) + .arg(ethereum()->codeAt(t.receiveAddress()).size() ? '*' : '-') : + QString(" %2 +> %3: %1 [%4]") + .arg(formatBalance(t.value()).c_str()) + .arg(render(t.safeSender())) + .arg(render(right160(sha3(rlpList(t.safeSender(), t.nonce()))))) + .arg((unsigned)t.nonce()); + QListWidgetItem* txItem = new QListWidgetItem(s, ui->blocks); + auto hba = QByteArray((char const*)h.data(), h.size); + txItem->setData(Qt::UserRole, hba); + txItem->setData(Qt::UserRole + 1, n); + if (oldSelected == hba) + txItem->setSelected(true); n++; } - if (h == bc.genesisHash()) - break; + }; + + if (filters.empty()) + { + unsigned i = ui->showAll->isChecked() ? (unsigned)-1 : 10; + for (auto h = bc.currentHash(); bc.details(h) && i; h = bc.details(h).parent, --i) + { + showBlock(h); + if (h == bc.genesisHash()) + break; + } } + else + for (auto const& h: blocks) + showBlock(h); if (!ui->blocks->currentItem()) ui->blocks->setCurrentRow(0); diff --git a/eth/main.cpp b/eth/main.cpp index a7bed4f3b..3b97c561d 100644 --- a/eth/main.cpp +++ b/eth/main.cpp @@ -74,6 +74,9 @@ void interactiveHelp() << " jsonstop Stops the JSON-RPC server." << endl << " connect Connects to a specific peer." << endl << " verbosity () Gets or sets verbosity level." << endl + << " setetherprice

Resets the ether price." << endl + << " setpriority

Resets the transaction priority." << endl + << " minestart Starts mining." << endl << " minestart Starts mining." << endl << " minestop Stops mining." << endl << " mineforce Forces mining, even when there are no transactions." << endl @@ -85,12 +88,12 @@ void interactiveHelp() << " send Execute a given transaction with current secret." << endl << " contract Create a new contract with current secret." << endl << " peers List the peers that are connected" << endl - << " listAccounts List the accounts on the network." << endl - << " listContracts List the contracts on the network." << endl - << " setSecret Set the secret to the hex secret key." < Set the coinbase (mining payout) address." < Export the config (.RLP) to the path provided." < Import the config (.RLP) from the path provided." < Set the secret to the hex secret key." < Set the coinbase (mining payout) address." < Export the config (.RLP) to the path provided." < Import the config (.RLP) from the path provided." < Dumps a contract to /.evm." << endl << " dumptrace Dumps a transaction trace" << endl << "to . should be one of pretty, standard, standard+." << endl << " dumpreceipt Dumps a transation receipt." << endl @@ -104,9 +107,11 @@ void help() << "Options:" << endl << " -a,--address Set the coinbase (mining payout) address to addr (default: auto)." << endl << " -b,--bootstrap Connect to the default Ethereum peerserver." << endl + << " -B,--block-fees Set the block fee profit in the reference unit e.g. ¢ (Default: 15)." << endl << " -c,--client-name Add a name to your client's version string (default: blank)." << endl << " -d,--db-path Load database from path (default: ~/.ethereum " << endl << " /Etherum or Library/Application Support/Ethereum)." << endl + << " -e,--ether-price Set the ether price in the reference unit e.g. ¢ (Default: 30.679)." << endl << " -f,--force-mining Mine even when there are no transaction to mine (Default: off)" << endl << " -h,--help Show this help message and exit." << endl << " -i,--interactive Enter interactive mode (default: non-interactive)." << endl @@ -115,11 +120,12 @@ void help() << " --json-rpc-port Specify JSON-RPC server port (implies '-j', default: 8080)." << endl #endif << " -l,--listen Listen on the given port for incoming connected (default: 30303)." << endl + << " -L,--local-networking Use peers whose addresses are local." << endl << " -m,--mining Enable mining, optionally for a specified number of blocks (Default: off)" << endl << " -n,--upnp Use upnp for NAT (default: on)." << endl - << " -L,--local-networking Use peers whose addresses are local." << endl << " -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,--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 @@ -128,7 +134,7 @@ void help() << " -x,--peers Attempt to connect to given number of peers (Default: 5)." << endl << " -V,--version Show the version and exit." << endl #if ETH_EVMJIT - << " --jit Use EVM JIT (default: off)." << endl + << " --jit Use EVM JIT (default: off)." << endl #endif ; exit(0); @@ -212,6 +218,9 @@ int main(int argc, char** argv) bool structuredLogging = false; string structuredLoggingFormat = "%Y-%m-%dT%H:%M:%S"; string clientName; + TransactionPriority priority = TransactionPriority::Medium; + double etherPrice = 30.679; + double blockFees = 15.0; // Init defaults Defaults::get(); @@ -289,6 +298,48 @@ int main(int argc, char** argv) structuredLogging = true; else if ((arg == "-d" || arg == "--path" || arg == "--db-path") && i + 1 < argc) dbPath = argv[++i]; + else if ((arg == "-B" || arg == "--block-fees") && i + 1 < argc) + { + try { + blockFees = stof(argv[++i]); + } + catch (...) { + cerr << "Bad " << arg << " option: " << argv[++i] << endl; + return -1; + } + } + else if ((arg == "-e" || arg == "--ether-price") && i + 1 < argc) + { + try { + etherPrice = stof(argv[++i]); + } + catch (...) { + cerr << "Bad " << arg << " option: " << argv[++i] << endl; + return -1; + } + } + else if ((arg == "-P" || arg == "--priority") && i + 1 < argc) + { + string m = boost::to_lower_copy(string(argv[++i])); + if (m == "lowest") + priority = TransactionPriority::Lowest; + else if (m == "low") + priority = TransactionPriority::Low; + else if (m == "medium" || m == "mid" || m == "default" || m == "normal") + priority = TransactionPriority::Medium; + else if (m == "high") + priority = TransactionPriority::High; + else if (m == "highest") + priority = TransactionPriority::Highest; + else + try { + priority = (TransactionPriority)(max(0, min(100, stoi(m))) * 8 / 100); + } + catch (...) { + cerr << "Unknown " << arg << " option: " << m << endl; + return -1; + } + } else if ((arg == "-m" || arg == "--mining") && i + 1 < argc) { string m = argv[++i]; @@ -301,7 +352,7 @@ int main(int argc, char** argv) mining = stoi(m); } catch (...) { - cerr << "Unknown -m/--mining option: " << m << endl; + cerr << "Unknown " << arg << " option: " << m << endl; return -1; } } @@ -373,10 +424,12 @@ int main(int argc, char** argv) miners ); web3.setIdealPeerCount(peers); + std::shared_ptr gasPricer = make_shared(u256(double(ether / 1000) / etherPrice), u256(blockFees * 1000)); eth::Client* c = mode == NodeMode::Full ? web3.ethereum() : nullptr; StructuredLogger::starting(clientImplString, dev::Version); if (c) { + c->setGasPricer(gasPricer); c->setForceMining(forceMining); c->setAddress(coinbase); } @@ -435,6 +488,7 @@ int main(int argc, char** argv) istringstream iss(l); string cmd; iss >> cmd; + boost::to_lower(cmd); if (cmd == "netstart") { iss >> netPrefs.listenPort; @@ -466,6 +520,42 @@ int main(int argc, char** argv) iss >> enable; c->setForceMining(isTrue(enable)); } + else if (c && cmd == "setblockfees") + { + iss >> blockFees; + gasPricer->setRefBlockFees(u256(blockFees * 1000)); + cout << "Block fees: " << blockFees << endl; + } + else if (c && cmd == "setetherprice") + { + iss >> etherPrice; + gasPricer->setRefPrice(u256(double(ether / 1000) / etherPrice)); + cout << "ether Price: " << etherPrice << endl; + } + else if (c && cmd == "setpriority") + { + string m; + iss >> m; + boost::to_lower(m); + if (m == "lowest") + priority = TransactionPriority::Lowest; + else if (m == "low") + priority = TransactionPriority::Low; + else if (m == "medium" || m == "mid" || m == "default" || m == "normal") + priority = TransactionPriority::Medium; + else if (m == "high") + priority = TransactionPriority::High; + else if (m == "highest") + priority = TransactionPriority::Highest; + else + try { + priority = (TransactionPriority)(max(0, min(100, stoi(m))) * 8 / 100); + } + catch (...) { + cerr << "Unknown priority: " << m << endl; + } + cout << "Priority: " << (int)priority << "/8" << endl; + } else if (cmd == "verbosity") { if (iss.peek() != -1) @@ -536,6 +626,9 @@ int main(int argc, char** argv) iss >> hexAddr >> amount >> gasPrice >> gas >> sechex >> sdata; + if (!gasPrice) + gasPrice = gasPricer->bid(priority); + cnote << "Data:"; cnote << sdata; bytes data = dev::eth::parseData(sdata); @@ -582,7 +675,7 @@ int main(int argc, char** argv) else cwarn << "Require parameters: transact ADDRESS AMOUNT GASPRICE GAS SECRET DATA"; } - else if (c && cmd == "listContracts") + else if (c && cmd == "listcontracts") { auto acs =c->addresses(); string ss; @@ -593,7 +686,7 @@ int main(int argc, char** argv) cout << ss << endl; } } - else if (c && cmd == "listAccounts") + else if (c && cmd == "listaccounts") { auto acs =c->addresses(); string ss; @@ -809,7 +902,7 @@ int main(int argc, char** argv) } } } - else if (cmd == "setSecret") + else if (cmd == "setsecret") { if (iss.peek() != -1) { @@ -820,7 +913,7 @@ int main(int argc, char** argv) else cwarn << "Require parameter: setSecret HEXSECRETKEY"; } - else if (cmd == "setAddress") + else if (cmd == "setaddress") { if (iss.peek() != -1) { @@ -848,7 +941,7 @@ int main(int argc, char** argv) else cwarn << "Require parameter: setAddress HEXADDRESS"; } - else if (cmd == "exportConfig") + else if (cmd == "exportconfig") { if (iss.peek() != -1) { @@ -861,7 +954,7 @@ int main(int argc, char** argv) else cwarn << "Require parameter: exportConfig PATH"; } - else if (cmd == "importConfig") + else if (cmd == "importconfig") { if (iss.peek() != -1) { diff --git a/libethereum/BlockQueue.cpp b/libethereum/BlockQueue.cpp index 01c8c796c..29c9a4c71 100644 --- a/libethereum/BlockQueue.cpp +++ b/libethereum/BlockQueue.cpp @@ -107,7 +107,7 @@ ImportResult BlockQueue::import(bytesConstRef _block, BlockChain const& _bc) void BlockQueue::tick(BlockChain const& _bc) { unsigned t = time(0); - for (auto i = m_future.begin(); i != m_future.end() && i->first < time(0); ++i) + for (auto i = m_future.begin(); i != m_future.end() && i->first < t; ++i) import(&(i->second), _bc); WriteGuard l(m_lock); diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp index 0ee0aac03..18376c071 100644 --- a/libethereum/Client.cpp +++ b/libethereum/Client.cpp @@ -60,16 +60,58 @@ void VersionChecker::setOk() } } +void BasicGasPricer::update(BlockChain const& _bc) +{ + unsigned c = 0; + h256 p = _bc.currentHash(); + m_gasPerBlock = _bc.info(p).gasLimit; + + map dist; + unsigned total = 0; + while (c < 1000 && p) + { + BlockInfo bi = _bc.info(p); + if (bi.transactionsRoot != EmptyTrie) + { + auto bb = _bc.block(p); + RLP r(bb); + BlockReceipts brs(_bc.receipts(bi.hash)); + for (unsigned i = 0; i < r[1].size(); ++i) + { + auto gu = brs.receipts[i].gasUsed(); + dist[Transaction(r[1][i].data(), CheckSignature::None).gasPrice()] += (unsigned)brs.receipts[i].gasUsed(); + total += (unsigned)gu; + } + } + p = bi.parentHash; + ++c; + } + if (total > 0) + { + unsigned t = 0; + unsigned q = 1; + m_octiles[0] = dist.begin()->first; + for (auto const& i: dist) + { + for (; t <= total * q / 8 && t + i.second > total * q / 8; ++q) + m_octiles[q] = i.first; + if (q > 7) + break; + } + m_octiles[8] = dist.rbegin()->first; + } +} + Client::Client(p2p::Host* _extNet, std::string const& _dbPath, bool _forceClean, u256 _networkId, int _miners): Worker("eth"), m_vc(_dbPath), m_bc(_dbPath, !m_vc.ok() || _forceClean), - m_gp(u256("60000000000000")), + m_gp(new TrivialGasPricer), m_stateDB(State::openDB(_dbPath, !m_vc.ok() || _forceClean)), m_preMine(Address(), m_stateDB), m_postMine(Address(), m_stateDB) { - m_gp.updateQuartiles(m_bc); + m_gp->update(m_bc); m_host = _extNet->registerCapability(new EthereumHost(m_bc, m_tq, m_bq, _networkId)); @@ -85,16 +127,16 @@ Client::Client(p2p::Host* _extNet, std::string const& _dbPath, bool _forceClean, startWorking(); } -Client::Client(p2p::Host* _extNet, u256 weiPerCent, std::string const& _dbPath, bool _forceClean, u256 _networkId, int _miners): +Client::Client(p2p::Host* _extNet, std::shared_ptr _gp, std::string const& _dbPath, bool _forceClean, u256 _networkId, int _miners): Worker("eth"), m_vc(_dbPath), m_bc(_dbPath, !m_vc.ok() || _forceClean), - m_gp(weiPerCent), + m_gp(_gp), m_stateDB(State::openDB(_dbPath, !m_vc.ok() || _forceClean)), m_preMine(Address(), m_stateDB), m_postMine(Address(), m_stateDB) { - m_gp.updateQuartiles(m_bc); + m_gp->update(m_bc); m_host = _extNet->registerCapability(new EthereumHost(m_bc, m_tq, m_bq, _networkId)); @@ -620,7 +662,7 @@ void Client::doWork() // returns h256s as blooms, once for each transaction. cwork << "postSTATE <== TQ"; - TransactionReceipts newPendingReceipts = m_postMine.sync(m_bc, m_tq, m_gp); + TransactionReceipts newPendingReceipts = m_postMine.sync(m_bc, m_tq, *m_gp); if (newPendingReceipts.size()) { for (size_t i = 0; i < newPendingReceipts.size(); i++) diff --git a/libethereum/Client.h b/libethereum/Client.h index a18425124..39a9fd49e 100644 --- a/libethereum/Client.h +++ b/libethereum/Client.h @@ -160,6 +160,26 @@ private: State m_state; }; +class BasicGasPricer: public GasPricer +{ +public: + explicit BasicGasPricer(u256 _weiPerRef, u256 _refsPerBlock): m_weiPerRef(_weiPerRef), m_refsPerBlock(_refsPerBlock) {} + + void setRefPrice(u256 _weiPerRef) { m_weiPerRef = _weiPerRef; } + void setRefBlockFees(u256 _refsPerBlock) { m_refsPerBlock = _refsPerBlock; } + + u256 ask(State const&) const override { return m_weiPerRef * m_refsPerBlock / m_gasPerBlock; } + u256 bid(TransactionPriority _p = TransactionPriority::Medium) const override { return m_octiles[(int)_p] > 0 ? m_octiles[(int)_p] : (m_weiPerRef * m_refsPerBlock / m_gasPerBlock); } + + void update(BlockChain const& _bc) override; + +private: + u256 m_weiPerRef; + u256 m_refsPerBlock; + u256 m_gasPerBlock = 1000000; + std::array m_octiles; +}; + /** * @brief Main API hub for interfacing with Ethereum. */ @@ -179,7 +199,7 @@ public: explicit Client( p2p::Host* _host, - u256 _weiPerCent, + std::shared_ptr _gpForAdoption, // pass it in with new. std::string const& _dbPath = std::string(), bool _forceClean = false, u256 _networkId = 0, @@ -189,6 +209,9 @@ public: /// Destructor. virtual ~Client(); + /// Resets the gas pricer to some other object. + void setGasPricer(std::shared_ptr _gp) { m_gp = _gp; } + /// Submits the given message-call transaction. virtual void transact(Secret _secret, u256 _value, Address _dest, bytes const& _data = bytes(), u256 _gas = 10000, u256 _gasPrice = 10 * szabo); @@ -364,7 +387,7 @@ private: CanonBlockChain m_bc; ///< Maintains block database. TransactionQueue m_tq; ///< Maintains a list of incoming transactions not yet in a block on the blockchain. BlockQueue m_bq; ///< Maintains a list of incoming blocks not yet on the blockchain (to be imported). - GasPricer m_gp; ///< The gas pricer. + std::shared_ptr m_gp; ///< The gas pricer. mutable SharedMutex x_stateDB; ///< Lock on the state DB, effectively a lock on m_postMine. OverlayDB m_stateDB; ///< Acts as the central point for the state database, so multiple States can share it. diff --git a/libethereum/Executive.cpp b/libethereum/Executive.cpp index d8c80a577..e009b49fb 100644 --- a/libethereum/Executive.cpp +++ b/libethereum/Executive.cpp @@ -176,7 +176,7 @@ OnOpFunc Executive::simpleTrace() o << endl << " STACK" << endl; for (auto i: vm.stack()) o << (h256)i << endl; - o << " MEMORY" << endl << (vm.memory().size() > 1000) ? " mem size greater than 1000 bytes " : memDump(vm.memory()); + o << " MEMORY" << endl << ((vm.memory().size() > 1000) ? " mem size greater than 1000 bytes " : memDump(vm.memory())); o << " STORAGE" << endl; for (auto const& i: ext.state().storage(ext.myAddress)) o << showbase << hex << i.first << ": " << i.second << endl; @@ -236,6 +236,10 @@ bool Executive::go(OnOpFunc const& _onOp) void Executive::finalize() { + // Accumulate refunds for suicides. + if (m_ext) + m_ext->sub.refunds += c_suicideRefundGas * m_ext->sub.suicides.size(); + // SSTORE refunds... // must be done before the miner gets the fees. if (m_ext) diff --git a/libethereum/State.cpp b/libethereum/State.cpp index e405f5cb8..d1e430dbe 100644 --- a/libethereum/State.cpp +++ b/libethereum/State.cpp @@ -464,45 +464,6 @@ TransactionReceipts State::sync(BlockChain const& _bc, TransactionQueue& _tq, Ga return ret; } -void GasPricer::updateQuartiles(BlockChain const& _bc) -{ - unsigned c = 0; - h256 p = _bc.currentHash(); - - map dist; - unsigned total; - while (c < 1000 && p) - { - BlockInfo bi = _bc.info(p); - if (bi.transactionsRoot != EmptyTrie) - { - auto bb = _bc.block(p); - RLP r(bb); - BlockReceipts brs(_bc.receipts(bi.hash)); - for (unsigned i = 0; i < r[1].size(); ++i) - { - auto gu = brs.receipts[i].gasUsed(); - dist[Transaction(r[1][i].data(), CheckSignature::None).gasPrice()] += (unsigned)brs.receipts[i].gasUsed(); - total += (unsigned)gu; - } - } - p = bi.parentHash; - ++c; - } - if (total > 0) - { - unsigned t = 0; - unsigned q = 1; - for (auto const& i: dist) - { - for (; t <= total * q / 4 && t + i.second > total * q / 4; ++q) - m_quartiles[q - 1] = i.first; - if (q > 3) - break; - } - } -} - u256 State::enact(bytesConstRef _block, BlockChain const& _bc, bool _checkNonce) { // m_currentBlock is assumed to be prepopulated and reset. diff --git a/libethereum/State.h b/libethereum/State.h index 49e353b1e..78ec85f38 100644 --- a/libethereum/State.h +++ b/libethereum/State.h @@ -47,6 +47,7 @@ namespace eth { class BlockChain; +class State; struct StateChat: public LogChannel { static const char* name() { return "-S-"; } static const int verbosity = 4; }; struct StateTrace: public LogChannel { static const char* name() { return "=S="; } static const int verbosity = 7; }; @@ -55,7 +56,32 @@ struct StateSafeExceptions: public LogChannel { static const char* name() { retu enum class BaseState { Empty, CanonGenesis }; -class GasPricer; +enum class TransactionPriority +{ + Lowest = 0, + Low = 2, + Medium = 4, + High = 6, + Highest = 8 +}; + +class GasPricer +{ +public: + GasPricer() {} + + virtual u256 ask(State const&) const = 0; + virtual u256 bid(TransactionPriority _p = TransactionPriority::Medium) const = 0; + + virtual void update(BlockChain const&) {} +}; + +class TrivialGasPricer: public GasPricer +{ +protected: + u256 ask(State const&) const override { return 10 * szabo; } + u256 bid(TransactionPriority = TransactionPriority::Medium) const override { return 10 * szabo; } +}; /** * @brief Model of the current state of the ledger. @@ -153,6 +179,7 @@ public: /// Like sync but only operate on _tq, killing the invalid/old ones. bool cull(TransactionQueue& _tq) const; + /// Returns the last few block hashes of the current chain. LastHashes getLastHashes(BlockChain const& _bc, unsigned _n) const; /// Execute a given transaction. @@ -370,32 +397,6 @@ void commit(std::map const& _cache, DB& _db, SecureTrieDB m_quartiles; -}; - } } diff --git a/libsolidity/Compiler.cpp b/libsolidity/Compiler.cpp index 241cf0402..5eeb0c3e2 100644 --- a/libsolidity/Compiler.cpp +++ b/libsolidity/Compiler.cpp @@ -375,7 +375,7 @@ bool Compiler::visit(FunctionDefinition const& _function) for (VariableDeclaration const* localVariable: _function.getLocalVariables()) m_context.removeVariable(*localVariable); - m_context.adjustStackOffset(-c_returnValuesSize); + m_context.adjustStackOffset(-(int)c_returnValuesSize); if (!_function.isConstructor()) m_context << eth::Instruction::JUMP; return false; diff --git a/libsolidity/CompilerContext.cpp b/libsolidity/CompilerContext.cpp index 61c25052c..ee8d3e00c 100644 --- a/libsolidity/CompilerContext.cpp +++ b/libsolidity/CompilerContext.cpp @@ -63,7 +63,7 @@ void CompilerContext::addVariable(VariableDeclaration const& _declaration, void CompilerContext::removeVariable(VariableDeclaration const& _declaration) { - solAssert(m_localVariables.count(&_declaration), ""); + solAssert(!!m_localVariables.count(&_declaration), ""); m_localVariables.erase(&_declaration); } diff --git a/mix/ClientModel.cpp b/mix/ClientModel.cpp index 809d2dfd6..4e099b05b 100644 --- a/mix/ClientModel.cpp +++ b/mix/ClientModel.cpp @@ -37,7 +37,6 @@ #include "QVariableDefinition.h" #include "ContractCallDataEncoder.h" #include "CodeModel.h" -#include "ClientModel.h" #include "QEther.h" #include "Web3Server.h" #include "ClientModel.h" @@ -318,19 +317,28 @@ void ClientModel::showDebuggerForTransaction(ExecutionResult const& _t) QDebugData* debugData = new QDebugData(); QQmlEngine::setObjectOwnership(debugData, QQmlEngine::JavaScriptOwnership); QList codes; + QList> codeMaps; + QList codeItems; + QList contracts; for (MachineCode const& code: _t.executionCode) { - codes.push_back(QMachineState::getHumanReadableCode(debugData, code.address, code.code)); + QHash codeMap; + codes.push_back(QMachineState::getHumanReadableCode(debugData, code.address, code.code, codeMap)); + codeMaps.push_back(std::move(codeMap)); //try to resolve contract for source level debugging auto nameIter = m_contractNames.find(code.address); if (nameIter != m_contractNames.end()) { CompiledContract const& compilerRes = m_context->codeModel()->contract(nameIter->second); eth::AssemblyItems assemblyItems = !_t.isConstructor() ? compilerRes.assemblyItems() : compilerRes.constructorAssemblyItems(); - QVariantList locations; - for (eth::AssemblyItem const& item: assemblyItems) - locations.push_back(QVariant::fromValue(new QSourceLocation(debugData, item.getLocation().start, item.getLocation().end))); - codes.back()->setLocations(compilerRes.documentId(), std::move(locations)); + codes.back()->setDocument(compilerRes.documentId()); + codeItems.push_back(std::move(assemblyItems)); + contracts.push_back(&compilerRes); + } + else + { + codeItems.push_back(AssemblyItems()); + contracts.push_back(nullptr); } } @@ -339,18 +347,77 @@ void ClientModel::showDebuggerForTransaction(ExecutionResult const& _t) data.push_back(QMachineState::getDebugCallData(debugData, d)); QVariantList states; + QStringList solCallStack; + std::map solLocals; // + QList returnStack; + + unsigned prevInstructionIndex = 0; for (MachineState const& s: _t.machineStates) - states.append(QVariant::fromValue(new QMachineState(debugData, s, codes[s.codeIndex], data[s.dataIndex]))); + { + int instructionIndex = codeMaps[s.codeIndex][static_cast(s.curPC)]; + QSolState* solState = nullptr; + if (!codeItems[s.codeIndex].empty() && contracts[s.codeIndex]) + { + CompiledContract const* contract = contracts[s.codeIndex]; + AssemblyItem const& instruction = codeItems[s.codeIndex][instructionIndex]; - debugData->setStates(std::move(states)); + if (instruction.type() == dev::eth::Push && !instruction.data()) + { + //register new local variable initialization + auto localIter = contract->locals().find(LocationPair(instruction.getLocation().start, instruction.getLocation().end)); + if (localIter != contract->locals().end()) + solLocals[s.stack.size()] = localIter.value(); + } - //QList returnParameters; - //returnParameters = encoder.decode(f->returnParameters(), debuggingContent.returnValue); + if (instruction.type() == dev::eth::Tag) //TODO: use annotations + { + //track calls into functions + auto functionIter = contract->functions().find(LocationPair(instruction.getLocation().start, instruction.getLocation().end)); + if (functionIter != contract->functions().end()) + { + QString functionName = functionIter.value(); + solCallStack.push_back(functionName); + returnStack.push_back(prevInstructionIndex + 1); + } + else if (!returnStack.empty() && instructionIndex == returnStack.back()) + { + returnStack.pop_back(); + solCallStack.pop_back(); + } + } + + //format solidity context values + QStringList locals; + for(auto l: solLocals) + if (l.first < (int)s.stack.size()) + locals.push_back(l.second.name + "\t" + formatValue(l.second.type, s.stack[l.first])); + + QStringList storage; + for(auto st: s.storage) + { + if (st.first < std::numeric_limits::max()) + { + auto storageIter = contract->storage().find(static_cast(st.first)); + if (storageIter != contract->storage().end()) + storage.push_back(storageIter.value().name + "\t" + formatValue(storageIter.value().type, st.second)); + } + } + prevInstructionIndex = instructionIndex; + solState = new QSolState(debugData, storage, solCallStack, locals, instruction.getLocation().start, instruction.getLocation().end); + } + + states.append(QVariant::fromValue(new QMachineState(debugData, instructionIndex, s, codes[s.codeIndex], data[s.dataIndex], solState))); + } - //collect states for last transaction + debugData->setStates(std::move(states)); debugDataReady(debugData); } +QString ClientModel::formatValue(SolidityType const&, dev::u256 const& _value) +{ + return QString::fromStdString(prettyU256(_value)); +} + void ClientModel::emptyRecord() { debugDataReady(new QDebugData()); diff --git a/mix/ClientModel.h b/mix/ClientModel.h index 8810502bd..a12fe22e6 100644 --- a/mix/ClientModel.h +++ b/mix/ClientModel.h @@ -41,6 +41,7 @@ class QEther; class QDebugData; class MixClient; class QVariableDefinition; +struct SolidityType; /// Backend transaction config class struct TransactionSettings @@ -198,6 +199,7 @@ private: void onNewTransaction(); void onStateReset(); void showDebuggerForTransaction(ExecutionResult const& _t); + QString formatValue(SolidityType const& _type, dev::u256 const& _value); AppContext* m_context; std::atomic m_running; diff --git a/mix/CodeModel.cpp b/mix/CodeModel.cpp index cc2a29b42..bb258334c 100644 --- a/mix/CodeModel.cpp +++ b/mix/CodeModel.cpp @@ -25,7 +25,10 @@ #include #include #include +#include #include +#include +#include #include #include #include @@ -43,6 +46,91 @@ using namespace dev::mix; const std::set c_predefinedContracts = { "Config", "Coin", "CoinReg", "coin", "service", "owned", "mortal", "NameReg", "named", "std", "configUser" }; + +namespace +{ + using namespace dev::solidity; + class CollectDeclarationsVisitor: public ASTConstVisitor + { + public: + CollectDeclarationsVisitor(QHash* _functions, QHash* _locals, QHash* _storage): + m_functions(_functions), m_locals(_locals), m_storage(_storage), m_functionScope(false), m_storageSlot(0) {} + private: + QHash* m_functions; + QHash* m_locals; + QHash* m_storage; + bool m_functionScope; + uint m_storageSlot; + + LocationPair nodeLocation(ASTNode const& _node) + { + return LocationPair(_node.getLocation().start, _node.getLocation().end); + } + + SolidityType nodeType(Type const* _type) + { + if (!_type) + return SolidityType { SolidityType::Type::UnsignedInteger, 32 }; + switch (_type->getCategory()) + { + case Type::Category::Integer: + { + IntegerType const* it = dynamic_cast(_type); + unsigned size = it->getNumBits() / 8; + SolidityType::Type typeCode = it->isAddress() ? SolidityType::Type::Address : it->isHash() ? SolidityType::Type::Hash : it->isSigned() ? SolidityType::Type::SignedInteger : SolidityType::Type::UnsignedInteger; + return SolidityType { typeCode, size }; + } + case Type::Category::Bool: + return SolidityType { SolidityType::Type::Bool, _type->getSizeOnStack() * 32 }; + case Type::Category::String: + { + StaticStringType const* s = dynamic_cast(_type); + return SolidityType { SolidityType::Type::String, static_cast(s->getNumBytes()) }; + } + case Type::Category::Contract: + return SolidityType { SolidityType::Type::Address, _type->getSizeOnStack() * 32 }; + case Type::Category::Array: + case Type::Category::Enum: + case Type::Category::Function: + case Type::Category::IntegerConstant: + case Type::Category::Magic: + case Type::Category::Mapping: + case Type::Category::Modifier: + case Type::Category::Real: + case Type::Category::Struct: + case Type::Category::TypeType: + case Type::Category::Void: + default: + return SolidityType { SolidityType::Type::UnsignedInteger, 32 }; + } + } + + virtual bool visit(FunctionDefinition const& _node) + { + m_functions->insert(nodeLocation(_node), QString::fromStdString(_node.getName())); + m_functionScope = true; + return true; + } + + virtual void endVisit(FunctionDefinition const&) + { + m_functionScope = false; + } + + virtual bool visit(VariableDeclaration const& _node) + { + SolidityDeclaration decl; + decl.type = nodeType(_node.getType().get()); + decl.name = QString::fromStdString(_node.getName()); + if (m_functionScope) + m_locals->insert(nodeLocation(_node), decl); + else + m_storage->insert(m_storageSlot++, decl); + return true; + } + }; +} + void BackgroundWorker::queueCodeChange(int _jobId) { m_model->runCompilationJob(_jobId); @@ -52,18 +140,23 @@ CompiledContract::CompiledContract(const dev::solidity::CompilerStack& _compiler QObject(nullptr), m_sourceHash(qHash(_source)) { - auto const& contractDefinition = _compiler.getContractDefinition(_contractName.toStdString()); + std::string name = _contractName.toStdString(); + auto const& contractDefinition = _compiler.getContractDefinition(name); m_contract.reset(new QContractDefinition(&contractDefinition)); QQmlEngine::setObjectOwnership(m_contract.get(), QQmlEngine::CppOwnership); m_bytes = _compiler.getBytecode(_contractName.toStdString()); - m_assemblyItems = _compiler.getRuntimeAssemblyItems(_contractName.toStdString()); - m_constructorAssemblyItems = _compiler.getAssemblyItems(_contractName.toStdString()); + m_assemblyItems = _compiler.getRuntimeAssemblyItems(name); + m_constructorAssemblyItems = _compiler.getAssemblyItems(name); + dev::solidity::InterfaceHandler interfaceHandler; m_contractInterface = QString::fromStdString(*interfaceHandler.getABIInterface(contractDefinition)); if (m_contractInterface.isEmpty()) m_contractInterface = "[]"; if (contractDefinition.getLocation().sourceName.get()) m_documentId = QString::fromStdString(*contractDefinition.getLocation().sourceName); + + CollectDeclarationsVisitor visitor(&m_functions, &m_locals, &m_storage); + contractDefinition.accept(visitor); } QString CompiledContract::codeHex() const @@ -121,12 +214,11 @@ void CodeModel::reset(QVariantMap const& _documents) void CodeModel::registerCodeChange(QString const& _documentId, QString const& _code) { - { - Guard l(x_contractMap); - CompiledContract* contract = m_contractMap.value(_documentId); - if (contract != nullptr && contract->m_sourceHash == qHash(_code)) - return; + CompiledContract* contract = contractByDocumentId(_documentId); + if (contract != nullptr && contract->m_sourceHash == qHash(_code)) + return; + { Guard pl(x_pendingContracts); m_pendingContracts[_documentId] = _code; } @@ -196,7 +288,8 @@ void CodeModel::runCompilationJob(int _jobId) if (c_predefinedContracts.count(n) != 0) continue; QString name = QString::fromStdString(n); - auto sourceIter = m_pendingContracts.find(name); + QString sourceName = QString::fromStdString(*cs.getContractDefinition(n).getLocation().sourceName); + auto sourceIter = m_pendingContracts.find(sourceName); QString source = sourceIter != m_pendingContracts.end() ? sourceIter->second : QString(); CompiledContract* contract = new CompiledContract(cs, name, source); QQmlEngine::setObjectOwnership(contract, QQmlEngine::CppOwnership); diff --git a/mix/CodeModel.h b/mix/CodeModel.h index 511d2e01f..de9a07bab 100644 --- a/mix/CodeModel.h +++ b/mix/CodeModel.h @@ -64,6 +64,29 @@ private: CodeModel* m_model; }; +using LocationPair = QPair; + +struct SolidityType +{ + enum class Type //TODO: arrays and structs + { + SignedInteger, + UnsignedInteger, + Hash, + Bool, + Address, + String, + }; + Type type; + unsigned size; //bytes +}; + +struct SolidityDeclaration +{ + QString name; + SolidityType type; +}; + ///Compilation result model. Contains all the compiled contract data required by UI class CompiledContract: public QObject { @@ -93,6 +116,10 @@ public: /// @returns contract source Id QString documentId() const { return m_documentId; } + QHash const& functions() const { return m_functions; } + QHash const& locals() const { return m_locals; } + QHash const& storage() const { return m_storage; } + private: uint m_sourceHash; std::shared_ptr m_contract; @@ -102,11 +129,13 @@ private: QString m_documentId; eth::AssemblyItems m_assemblyItems; eth::AssemblyItems m_constructorAssemblyItems; + QHash m_functions; + QHash m_locals; + QHash m_storage; friend class CodeModel; }; - using ContractMap = QHash; /// Code compilation model. Compiles contracts in background an provides compiled contract data diff --git a/mix/DebuggingStateWrapper.cpp b/mix/DebuggingStateWrapper.cpp index 6cb29bbae..b8fbdef30 100644 --- a/mix/DebuggingStateWrapper.cpp +++ b/mix/DebuggingStateWrapper.cpp @@ -69,7 +69,7 @@ namespace } } -QCode* QMachineState::getHumanReadableCode(QObject* _owner, const Address& _address, const bytes& _code) +QCode* QMachineState::getHumanReadableCode(QObject* _owner, const Address& _address, const bytes& _code, QHash& o_codeMap) { QVariantList codeStr; for (unsigned i = 0; i <= _code.size(); ++i) @@ -80,14 +80,15 @@ QCode* QMachineState::getHumanReadableCode(QObject* _owner, const Address& _addr QString s = QString::fromStdString(instructionInfo((Instruction)b).name); std::ostringstream out; out << std::hex << std::setw(4) << std::setfill('0') << i; - int line = i; + int offset = i; if (b >= (byte)Instruction::PUSH1 && b <= (byte)Instruction::PUSH32) { unsigned bc = getPushNumber((Instruction)b); s = "PUSH 0x" + QString::fromStdString(toHex(bytesConstRef(&_code[i + 1], bc))); i += bc; } - codeStr.append(QVariant::fromValue(new QInstruction(_owner, QString::fromStdString(out.str()) + " " + s, line))); + o_codeMap[offset] = codeStr.size(); + codeStr.append(QVariant::fromValue(new QInstruction(_owner, QString::fromStdString(out.str()) + " " + s))); } catch (...) { diff --git a/mix/DebuggingStateWrapper.h b/mix/DebuggingStateWrapper.h index 7a34d6493..7eb8c932c 100644 --- a/mix/DebuggingStateWrapper.h +++ b/mix/DebuggingStateWrapper.h @@ -26,12 +26,12 @@ #include #include -#include +#include #include #include #include +#include "MachineStates.h" #include "QVariableDefinition.h" -#include "MixClient.h" #include "QBigInt.h" namespace dev @@ -46,32 +46,39 @@ class QInstruction: public QObject { Q_OBJECT Q_PROPERTY(QString line MEMBER m_line CONSTANT) - Q_PROPERTY(int processIndex MEMBER m_processIndex CONSTANT) public: - QInstruction(QObject* _owner, QString _line, int _processIndex): QObject(_owner), m_line(_line), m_processIndex(_processIndex) {} + QInstruction(QObject* _owner, QString _line): QObject(_owner), m_line(_line) {} private: QString m_line; - int m_processIndex; }; - -class QSourceLocation: public QObject +/** + * @brief Solidity state + */ +class QSolState: public QObject { Q_OBJECT + Q_PROPERTY(QStringList storage MEMBER m_storage CONSTANT) + Q_PROPERTY(QStringList callStack MEMBER m_callStack CONSTANT) + Q_PROPERTY(QStringList locals MEMBER m_locals CONSTANT) Q_PROPERTY(int start MEMBER m_start CONSTANT) Q_PROPERTY(int end MEMBER m_end CONSTANT) public: - QSourceLocation(QObject* _owner, int _start, int _end): QObject(_owner), m_start(_start), m_end(_end) {} + QSolState(QObject* _parent, QStringList const& _storage, QStringList const& _callStack, QStringList const& _locals, int _start, int _end): + QObject(_parent), m_storage(_storage), m_callStack(_callStack), m_locals(_locals), m_start(_start), m_end(_end) + { } private: + QStringList m_storage; + QStringList m_callStack; + QStringList m_locals; int m_start; int m_end; }; - /** * @brief Shared container for lines */ @@ -79,19 +86,17 @@ class QCode: public QObject { Q_OBJECT Q_PROPERTY(QVariantList instructions MEMBER m_instructions CONSTANT) - Q_PROPERTY(QVariantList locations MEMBER m_locations CONSTANT) Q_PROPERTY(QString address MEMBER m_address CONSTANT) Q_PROPERTY(QString documentId MEMBER m_document CONSTANT) public: QCode(QObject* _owner, QString const& _address, QVariantList&& _instrunctions): QObject(_owner), m_instructions(_instrunctions), m_address(_address) {} - void setLocations(QString const& _document, QVariantList&& _locations) { m_document = _document; m_locations = _locations; } + void setDocument(QString const& _documentId) { m_document = _documentId; } private: QVariantList m_instructions; QString m_address; QString m_document; - QVariantList m_locations; }; /** @@ -133,6 +138,7 @@ class QMachineState: public QObject Q_OBJECT Q_PROPERTY(int step READ step CONSTANT) Q_PROPERTY(int curPC READ curPC CONSTANT) + Q_PROPERTY(int instructionIndex MEMBER m_instructionIndex CONSTANT) Q_PROPERTY(QBigInt* gasCost READ gasCost CONSTANT) Q_PROPERTY(QBigInt* gas READ gas CONSTANT) Q_PROPERTY(QString instruction READ instruction CONSTANT) @@ -146,10 +152,11 @@ class QMachineState: public QObject Q_PROPERTY(QVariantList levels READ levels CONSTANT) Q_PROPERTY(unsigned codeIndex READ codeIndex CONSTANT) Q_PROPERTY(unsigned dataIndex READ dataIndex CONSTANT) + Q_PROPERTY(QObject* solidity MEMBER m_solState CONSTANT) public: - QMachineState(QObject* _owner, MachineState const& _state, QCode* _code, QCallData* _callData): - QObject(_owner), m_state(_state), m_code(_code), m_callData(_callData) {} + QMachineState(QObject* _owner, int _instructionIndex, MachineState const& _state, QCode* _code, QCallData* _callData, QSolState* _solState): + QObject(_owner), m_instructionIndex(_instructionIndex), m_state(_state), m_code(_code), m_callData(_callData), m_solState(_solState) { } /// Get the step of this machine states. int step() { return (int)m_state.steps; } /// Get the proccessed code index. @@ -168,7 +175,7 @@ public: QStringList debugStorage(); /// Get memory. QVariantList debugMemory(); - /// get end of debug information. + /// Get end of debug information. QString endOfDebug(); /// Get the new memory size. QBigInt* newMemSize(); @@ -177,18 +184,18 @@ public: /// Get all previous steps. QVariantList levels(); /// Get the current processed machine state. - MachineState state() { return m_state; } - /// Set the current processed machine state. - void setState(MachineState _state) { m_state = _state; } + MachineState const& state() const { return m_state; } /// Convert all machine states in human readable code. - static QCode* getHumanReadableCode(QObject* _owner, const Address& _address, const bytes& _code); + static QCode* getHumanReadableCode(QObject* _owner, const Address& _address, const bytes& _code, QHash& o_codeMap); /// Convert call data into human readable form static QCallData* getDebugCallData(QObject* _owner, bytes const& _data); private: + int m_instructionIndex; MachineState m_state; QCode* m_code; QCallData* m_callData; + QSolState* m_solState; }; } diff --git a/mix/MixClient.cpp b/mix/MixClient.cpp index 2e0270849..672ec788c 100644 --- a/mix/MixClient.cpp +++ b/mix/MixClient.cpp @@ -41,7 +41,7 @@ namespace mix { const Secret c_defaultUserAccountSecret = Secret("cb73d9408c4720e230387d956eb0f829d8a4dd2c1055f96257167e14e7169074"); -const u256 c_mixGenesisDifficulty = (u256) 1 << 4; +const u256 c_mixGenesisDifficulty = c_minimumDifficulty; //TODO: make it lower for Mix somehow class MixBlockChain: public dev::eth::BlockChain { diff --git a/mix/qml/CallStack.qml b/mix/qml/CallStack.qml new file mode 100644 index 000000000..c9e22532d --- /dev/null +++ b/mix/qml/CallStack.qml @@ -0,0 +1,74 @@ +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Layouts 1.1 +import "." + +DebugInfoList +{ + id: callStack + collapsible: true + title : qsTr("Call Stack") + enableSelection: true + itemDelegate: + Item { + anchors.fill: parent + + Rectangle { + anchors.fill: parent + color: "#4A90E2" + visible: styleData.selected; + } + + RowLayout + { + id: row + anchors.fill: parent + Rectangle + { + color: "#f7f7f7" + Layout.fillWidth: true + Layout.minimumWidth: 30 + Layout.maximumWidth: 30 + Text { + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + font.family: "monospace" + anchors.leftMargin: 5 + color: "#4a4a4a" + text: styleData.row; + font.pointSize: DebuggerPaneStyle.general.basicFontSize + width: parent.width - 5 + elide: Text.ElideRight + } + } + Rectangle + { + color: "transparent" + Layout.fillWidth: true + Layout.minimumWidth: parent.width - 30 + Layout.maximumWidth: parent.width - 30 + Text { + anchors.leftMargin: 5 + width: parent.width - 5 + wrapMode: Text.NoWrap + anchors.left: parent.left + font.family: "monospace" + anchors.verticalCenter: parent.verticalCenter + color: "#4a4a4a" + text: styleData.value; + elide: Text.ElideRight + font.pointSize: DebuggerPaneStyle.general.basicFontSize + } + } + } + + Rectangle { + anchors.top: row.bottom + width: parent.width; + height: 1; + color: "#cccccc" + anchors.bottom: parent.bottom + } + } +} diff --git a/mix/qml/Debugger.qml b/mix/qml/Debugger.qml index af46bee1c..732d02f75 100644 --- a/mix/qml/Debugger.qml +++ b/mix/qml/Debugger.qml @@ -29,6 +29,7 @@ Rectangle { onAssemblyModeChanged: { Debugger.updateMode(); + machineStates.updateHeight(); } function displayCompilationErrorIfAny() @@ -90,6 +91,9 @@ Rectangle { property alias memoryDumpHeightSettings: memoryRect.height property alias callDataHeightSettings: callDataRect.height property alias transactionLogVisible: transactionLog.visible + property alias solCallStackHeightSettings: solStackRect.height + property alias solStorageHeightSettings: solStorageRect.height + property alias solLocalsHeightSettings: solLocalsRect.height } Rectangle @@ -183,8 +187,12 @@ Rectangle { Layout.fillWidth: true Layout.fillHeight: true function updateHeight() { - statesLayout.height = buttonRow.childrenRect.height + assemblyCodeRow.childrenRect.height + - callStackRect.childrenRect.height + storageRect.childrenRect.height + memoryRect.childrenRect.height + callDataRect.childrenRect.height + 120; + var h = buttonRow.childrenRect.height; + if (assemblyMode) + h += assemblyCodeRow.childrenRect.height + callStackRect.childrenRect.height + storageRect.childrenRect.height + memoryRect.childrenRect.height + callDataRect.childrenRect.height; + else + h += solStackRect.childrenRect.height + solLocalsRect.childrenRect.height + solStorageRect.childrenRect.height; + statesLayout.height = h + 120; } Component.onCompleted: updateHeight(); @@ -546,83 +554,66 @@ Rectangle { Rectangle { - id: callStackRect; + id: solStackRect; color: "transparent" Layout.minimumHeight: 25 Layout.maximumHeight: 800 onHeightChanged: machineStates.updateHeight(); - DebugInfoList - { - id: callStack - collapsible: true + visible: !assemblyMode + CallStack { anchors.fill: parent - title : qsTr("Call Stack") - enableSelection: true - onRowActivated: Debugger.displayFrame(index); - itemDelegate: - Item { - anchors.fill: parent + id: solCallStack + } + } - Rectangle { - anchors.fill: parent - color: "#4A90E2" - visible: styleData.selected; - } + Rectangle + { + id: solLocalsRect; + color: "transparent" + Layout.minimumHeight: 25 + Layout.maximumHeight: 800 + onHeightChanged: machineStates.updateHeight(); + visible: !assemblyMode + StorageView { + title : qsTr("Locals") + anchors.fill: parent + id: solLocals + } + } - RowLayout - { - id: row - anchors.fill: parent - Rectangle - { - color: "#f7f7f7" - Layout.fillWidth: true - Layout.minimumWidth: 30 - Layout.maximumWidth: 30 - Text { - anchors.verticalCenter: parent.verticalCenter - anchors.left: parent.left - font.family: "monospace" - anchors.leftMargin: 5 - color: "#4a4a4a" - text: styleData.row; - font.pointSize: DebuggerPaneStyle.general.basicFontSize - width: parent.width - 5 - elide: Text.ElideRight - } - } - Rectangle - { - color: "transparent" - Layout.fillWidth: true - Layout.minimumWidth: parent.width - 30 - Layout.maximumWidth: parent.width - 30 - Text { - anchors.leftMargin: 5 - width: parent.width - 5 - wrapMode: Text.NoWrap - anchors.left: parent.left - font.family: "monospace" - anchors.verticalCenter: parent.verticalCenter - color: "#4a4a4a" - text: styleData.value; - elide: Text.ElideRight - font.pointSize: DebuggerPaneStyle.general.basicFontSize - } - } - } + Rectangle + { + id: solStorageRect; + color: "transparent" + Layout.minimumHeight: 25 + Layout.maximumHeight: 800 + onHeightChanged: machineStates.updateHeight(); + visible: !assemblyMode + StorageView { + title : qsTr("Members") + anchors.fill: parent + id: solStorage + } + } - Rectangle { - anchors.top: row.bottom - width: parent.width; - height: 1; - color: "#cccccc" - anchors.bottom: parent.bottom - } - } + Rectangle + { + id: callStackRect; + color: "transparent" + Layout.minimumHeight: 25 + Layout.maximumHeight: 800 + onHeightChanged: machineStates.updateHeight(); + visible: assemblyMode + CallStack { + anchors.fill: parent + id: callStack + onRowActivated: Debugger.displayFrame(index); } } + + + Rectangle { id: storageRect @@ -631,68 +622,10 @@ Rectangle { Layout.minimumHeight: 25 Layout.maximumHeight: 800 onHeightChanged: machineStates.updateHeight(); - DebugInfoList - { - id: storage + visible: assemblyMode + StorageView { anchors.fill: parent - collapsible: true - title : qsTr("Storage") - itemDelegate: - Item { - anchors.fill: parent - RowLayout - { - id: row - anchors.fill: parent - Rectangle - { - color: "#f7f7f7" - Layout.fillWidth: true - Layout.minimumWidth: parent.width / 2 - Layout.maximumWidth: parent.width / 2 - Text { - anchors.verticalCenter: parent.verticalCenter - anchors.left: parent.left - font.family: "monospace" - anchors.leftMargin: 5 - color: "#4a4a4a" - text: styleData.value.split('\t')[0]; - font.pointSize: DebuggerPaneStyle.general.basicFontSize - width: parent.width - 5 - elide: Text.ElideRight - } - } - Rectangle - { - color: "transparent" - Layout.fillWidth: true - Layout.minimumWidth: parent.width / 2 - Layout.maximumWidth: parent.width / 2 - Text { - maximumLineCount: 1 - clip: true - anchors.leftMargin: 5 - width: parent.width - 5 - wrapMode: Text.WrapAnywhere - anchors.left: parent.left - font.family: "monospace" - anchors.verticalCenter: parent.verticalCenter - color: "#4a4a4a" - text: styleData.value.split('\t')[1]; - elide: Text.ElideRight - font.pointSize: DebuggerPaneStyle.general.basicFontSize - } - } - } - - Rectangle { - anchors.top: row.bottom - width: parent.width; - height: 1; - color: "#cccccc" - anchors.bottom: parent.bottom - } - } + id: storage } } @@ -704,6 +637,7 @@ Rectangle { Layout.minimumHeight: 25 Layout.maximumHeight: 800 onHeightChanged: machineStates.updateHeight(); + visible: assemblyMode DebugInfoList { id: memoryDump anchors.fill: parent @@ -726,6 +660,7 @@ Rectangle { Layout.minimumHeight: 25 Layout.maximumHeight: 800 onHeightChanged: machineStates.updateHeight(); + visible: assemblyMode DebugInfoList { id: callDataDump anchors.fill: parent diff --git a/mix/qml/StatusPane.qml b/mix/qml/StatusPane.qml index e526d65bd..60a9a051e 100644 --- a/mix/qml/StatusPane.qml +++ b/mix/qml/StatusPane.qml @@ -159,8 +159,8 @@ Rectangle { color: "transparent" width: 100 height: parent.height - anchors.top: statusHeader.top - anchors.right: statusHeader.right + anchors.top: parent.top + anchors.right: parent.right RowLayout { anchors.fill: parent diff --git a/mix/qml/StorageView.qml b/mix/qml/StorageView.qml new file mode 100644 index 000000000..f4831e3c3 --- /dev/null +++ b/mix/qml/StorageView.qml @@ -0,0 +1,69 @@ +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Layouts 1.1 +import "." + +DebugInfoList +{ + id: storage + collapsible: true + title : qsTr("Storage") + itemDelegate: + Item { + anchors.fill: parent + RowLayout + { + id: row + anchors.fill: parent + Rectangle + { + color: "#f7f7f7" + Layout.fillWidth: true + Layout.minimumWidth: parent.width / 2 + Layout.maximumWidth: parent.width / 2 + Text { + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + font.family: "monospace" + anchors.leftMargin: 5 + color: "#4a4a4a" + text: styleData.value.split('\t')[0]; + font.pointSize: DebuggerPaneStyle.general.basicFontSize + width: parent.width - 5 + elide: Text.ElideRight + } + } + Rectangle + { + color: "transparent" + Layout.fillWidth: true + Layout.minimumWidth: parent.width / 2 + Layout.maximumWidth: parent.width / 2 + Text { + maximumLineCount: 1 + clip: true + anchors.leftMargin: 5 + width: parent.width - 5 + wrapMode: Text.WrapAnywhere + anchors.left: parent.left + font.family: "monospace" + anchors.verticalCenter: parent.verticalCenter + color: "#4a4a4a" + text: styleData.value.split('\t')[1]; + elide: Text.ElideRight + font.pointSize: DebuggerPaneStyle.general.basicFontSize + } + } + } + + Rectangle { + anchors.top: row.bottom + width: parent.width; + height: 1; + color: "#cccccc" + anchors.bottom: parent.bottom + } + } +} + diff --git a/mix/qml/js/Debugger.js b/mix/qml/js/Debugger.js index 30dd5489b..23aa81844 100644 --- a/mix/qml/js/Debugger.js +++ b/mix/qml/js/Debugger.js @@ -4,7 +4,6 @@ var currentSelectedState = null; var currentDisplayedState = null; var debugData = null; -var codeMap = null; var locations = []; var locationMap = {}; var breakpoints = {}; @@ -56,7 +55,7 @@ function initLocations() for (var i = 0; i < debugData.states.length - 1; i++) { var code = debugData.states[i].code; - var location = code.documentId ? code.locations[codeStr(i)] : nullLocation; + var location = code.documentId ? debugData.states[i].solidity : nullLocation; if (location.start !== prevLocation.start || location.end !== prevLocation.end || code.documentId !== prevLocation.documentId) { prevLocation = { start: location.start, end: location.end, documentId: code.documentId, state: i }; @@ -65,6 +64,7 @@ function initLocations() locationMap[i] = locations.length - 1; } locations.push({ start: -1, end: -1, documentId: code.documentId, state: i }); + locationMap[debugData.states.length - 1] = locations.length - 1; } @@ -93,12 +93,10 @@ function initSlider() function setupInstructions(stateIndex) { var instructions = debugData.states[stateIndex].code.instructions; - codeMap = {}; statesList.model.clear(); - for (var i = 0; i < instructions.length; i++) { + for (var i = 0; i < instructions.length; i++) statesList.model.append(instructions[i]); - codeMap[instructions[i].processIndex] = i; - } + callDataDump.listModel = debugData.states[stateIndex].callData.items; } @@ -129,14 +127,14 @@ function display(stateIndex) setupInstructions(stateIndex); if (debugData.states[stateIndex].dataIndex !== debugData.states[currentDisplayedState].dataIndex) setupCallData(stateIndex); - var codeLine = codeStr(stateIndex); var state = debugData.states[stateIndex]; + var codeLine = state.instructionIndex; highlightSelection(codeLine); completeCtxInformation(state); currentDisplayedState = stateIndex; var docId = debugData.states[stateIndex].code.documentId; if (docId) - debugExecuteLocation(docId, locations[locationMap[stateIndex]]); + debugExecuteLocation(docId, debugData.states[stateIndex].solidity); } function displayFrame(frameIndex) @@ -183,12 +181,6 @@ function selectState(stateIndex) statesSlider.value = stateIndex; } -function codeStr(stateIndex) -{ - var state = debugData.states[stateIndex]; - return codeMap[state.curPC]; -} - function highlightSelection(index) { statesList.positionViewAtRow(index, ListView.Center); @@ -206,6 +198,15 @@ function completeCtxInformation(state) stack.listModel = state.debugStack; storage.listModel = state.debugStorage; memoryDump.listModel = state.debugMemory; + if (state.solidity) { + solLocals.listModel = state.solidity.locals; + solStorage.listModel = state.solidity.storage; + solCallStack.listModel = state.solidity.callStack; + } else { + solLocals.listModel = []; + solStorage.listModel = []; + solCallStack.listModel = []; + } } function isCallInstruction(index) @@ -229,7 +230,7 @@ function breakpointHit(i) { var bpLocations = breakpoints[debugData.states[i].code.documentId]; if (bpLocations) { - var location = locations[locationMap[i]]; + var location = debugData.states[i].solidity; if (location.start >= 0 && location.end >= location.start) for (var b = 0; b < bpLocations.length; b++) if (locationsIntersect(location, bpLocations[b])) diff --git a/mix/res.qrc b/mix/res.qrc index fc1b2fb23..515c5fadf 100644 --- a/mix/res.qrc +++ b/mix/res.qrc @@ -103,6 +103,8 @@ qml/img/available_updates.png qml/DeploymentDialog.qml qml/img/search_filled.png + qml/StorageView.qml + qml/CallStack.qml qml/img/help.png qml/img/openedfolder.png qml/img/b64.png diff --git a/test/TestHelper.h b/test/TestHelper.h index 91ec977db..0f23f945c 100644 --- a/test/TestHelper.h +++ b/test/TestHelper.h @@ -46,39 +46,55 @@ namespace test /// Make sure that no Exception is thrown during testing. If one is thrown show its info and fail the test. /// Our version of BOOST_REQUIRE_NO_THROW() -/// @param _expression The expression for which to make sure no exceptions are thrown +/// @param _statenent The statement for which to make sure no exceptions are thrown /// @param _message A message to act as a prefix to the expression's error information -#define ETH_TEST_REQUIRE_NO_THROW(_expression, _message) \ +#define ETH_TEST_REQUIRE_NO_THROW(_statement, _message) \ do \ { \ try \ { \ - _expression; \ + BOOST_TEST_PASSPOINT(); \ + _statement; \ } \ catch (boost::exception const& _e) \ { \ - auto msg = std::string(_message"\n") + boost::diagnostic_information(_e); \ - BOOST_FAIL(msg); \ + auto msg = std::string(_message " due to an exception thrown by " \ + BOOST_STRINGIZE(_statement) "\n") + boost::diagnostic_information(_e); \ + BOOST_CHECK_IMPL(false, msg, REQUIRE, CHECK_MSG); \ } \ - } while (0) + catch (...) \ + { \ + BOOST_CHECK_IMPL(false, "Unknown exception thrown by " \ + BOOST_STRINGIZE(_statement), REQUIRE, CHECK_MSG); \ + } \ + } \ + while (0) /// Check if an Exception is thrown during testing. If one is thrown show its info and continue the test /// Our version of BOOST_CHECK_NO_THROW() -/// @param _expression The expression for which to make sure no exceptions are thrown +/// @param _statement The statement for which to make sure no exceptions are thrown /// @param _message A message to act as a prefix to the expression's error information -#define ETH_TEST_CHECK_NO_THROW(_expression, _message) \ +#define ETH_TEST_CHECK_NO_THROW(_statement, _message) \ do \ { \ try \ { \ - _expression; \ + BOOST_TEST_PASSPOINT(); \ + _statement; \ } \ catch (boost::exception const& _e) \ { \ - auto msg = std::string(_message"\n") + boost::diagnostic_information(_e); \ - BOOST_MESSAGE(msg); \ + auto msg = std::string(_message " due to an exception thrown by " \ + BOOST_STRINGIZE(_statement) "\n") + boost::diagnostic_information(_e); \ + BOOST_CHECK_IMPL(false, msg, CHECK, CHECK_MSG); \ + } \ + catch (...) \ + { \ + BOOST_CHECK_IMPL(false, "Unknown exception thrown by " \ + BOOST_STRINGIZE(_statement), CHECK, CHECK_MSG ); \ } \ - } while (0) + } \ + while (0) class ImportTest diff --git a/test/blockchain.cpp b/test/blockchain.cpp index ccbc84956..0e1128ef9 100644 --- a/test/blockchain.cpp +++ b/test/blockchain.cpp @@ -87,7 +87,7 @@ void doBlockchainTests(json_spirit::mValue& _v, bool _fillin) // get txs TransactionQueue txs; - GasPricer gp(10000); + TrivialGasPricer gp; BOOST_REQUIRE(blObj.count("transactions")); for (auto const& txObj: blObj["transactions"].get_array()) { diff --git a/test/stTransactionTestFiller.json b/test/stTransactionTestFiller.json index 1299e6d94..9bd7436bc 100644 --- a/test/stTransactionTestFiller.json +++ b/test/stTransactionTestFiller.json @@ -30,6 +30,37 @@ } }, + "EmptyTransaction2" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "45678256", + "currentGasLimit" : "1000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "pre" : + { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "100000", + "code" : "", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : + { + "data" : "", + "gasLimit" : "22000", + "gasPrice" : "", + "nonce" : "", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "", + "value" : "" + } + }, + "TransactionSendingToEmpty" : { "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", @@ -236,6 +267,100 @@ } }, + "InternalCallHittingGasLimit2" : { + "env" : { + "currentCoinbase" : "2adf5374fce5edbc8e2a8697c15331677e6ebf0b", + "currentDifficulty" : "45678256", + "currentGasLimit" : "47766", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "pre" : + { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000", + "code" : "", + "nonce" : "0", + "storage" : { + } + }, + + "b94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0", + "code" : "{ (CALL 25000 0xc94f5374fce5edbc8e2a8697c15331677e6ebf0b 1 0 0 0 0) }", + "nonce" : "0", + "storage" : { + } + }, + + "c94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0", + "code" : "{[[1]]55}", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : + { + "data" : "", + "gasLimit" : "47766", + "gasPrice" : "1", + "nonce" : "", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "b94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "value" : "10" + } + }, + + "InternalCallHittingGasLimitSuccess" : { + "env" : { + "currentCoinbase" : "2adf5374fce5edbc8e2a8697c15331677e6ebf0b", + "currentDifficulty" : "45678256", + "currentGasLimit" : "220000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "pre" : + { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "1000000", + "code" : "", + "nonce" : "0", + "storage" : { + } + }, + + "b94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0", + "code" : "{ (CALL 25000 0xc94f5374fce5edbc8e2a8697c15331677e6ebf0b 1 0 0 0 0) }", + "nonce" : "0", + "storage" : { + } + }, + + "c94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0", + "code" : "{[[1]]55}", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : + { + "data" : "", + "gasLimit" : "150000", + "gasPrice" : "1", + "nonce" : "", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "b94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "value" : "10" + } + }, + "TransactionFromCoinbaseHittingBlockGasLimit" : { "env" : { "currentCoinbase" : "a94f5374fce5edbc8e2a8697c15331677e6ebf0b", @@ -584,7 +709,7 @@ "pre" : { "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "100000", + "balance" : "1000000", "code" : "", "nonce" : "0", "storage" : { @@ -811,7 +936,7 @@ } }, - "TransactionCosts555" : { + "TransactionDataCosts652" : { "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", "currentDifficulty" : "45678256", @@ -916,7 +1041,7 @@ "pre" : { "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { - "balance" : "33000", + "balance" : "133000", "code" : "", "nonce" : "0", "storage" : { @@ -927,7 +1052,7 @@ { "data" : "0x3240349548983454", "gasLimit" : "32600", - "gasPrice" : "1", + "gasPrice" : "0", "nonce" : "0", "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", "to" : "b94f5374fce5edbc8e2a8697c15331677e6ebf0b", @@ -1089,7 +1214,7 @@ "transaction" : { "data" : "0x602280600c6000396000f30060e060020a600035048063f8a8fd6d14601457005b601a6020565b60006000f35b56", - "gasLimit" : "25000", + "gasLimit" : "23679", "gasPrice" : "1", "nonce" : "0", "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", @@ -1098,7 +1223,7 @@ } }, - "CreateTransactionWorking" : { + "CreateTransactionSuccess" : { "env" : { "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", "currentDifficulty" : "45678256", @@ -1166,5 +1291,44 @@ "to" : "b94f5374fce5edbc8e2a8697c15331677e6ebf0b", "value" : "100" } + }, + + "CreateMessageSuccess" : { + "env" : { + "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", + "currentDifficulty" : "45678256", + "currentGasLimit" : "1000000000000", + "currentNumber" : "0", + "currentTimestamp" : 1, + "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6" + }, + "pre" : + { + "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "400000", + "code" : "", + "nonce" : "0", + "storage" : { + } + }, + + "b94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { + "balance" : "0", + "code" : "{(MSTORE 0 0x600c600055) (CREATE 0 27 5)}", + "nonce" : "0", + "storage" : { + } + } + }, + "transaction" : + { + "data" : "", + "gasLimit" : "131882", + "gasPrice" : "1", + "nonce" : "0", + "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", + "to" : "b94f5374fce5edbc8e2a8697c15331677e6ebf0b", + "value" : "100" + } } } diff --git a/test/vmArithmeticTestFiller.json b/test/vmArithmeticTestFiller.json index 933df72d1..3e453f8e9 100644 --- a/test/vmArithmeticTestFiller.json +++ b/test/vmArithmeticTestFiller.json @@ -3535,7 +3535,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -3555,7 +3555,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -3563,7 +3563,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -3583,7 +3583,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -3591,7 +3591,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -3611,7 +3611,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -3619,7 +3619,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -3639,7 +3639,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -3647,7 +3647,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -3667,7 +3667,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -3675,7 +3675,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -3695,7 +3695,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -3703,7 +3703,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -3723,7 +3723,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -3731,7 +3731,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -3751,7 +3751,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -3759,7 +3759,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "100000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -3779,7 +3779,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "10000000" } }, @@ -3787,7 +3787,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -3807,7 +3807,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -3815,7 +3815,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -3835,7 +3835,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -3843,7 +3843,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -3863,7 +3863,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -3871,7 +3871,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -3891,7 +3891,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -3899,7 +3899,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -3919,7 +3919,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -3927,7 +3927,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -3947,7 +3947,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -3955,7 +3955,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -3975,7 +3975,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -3983,7 +3983,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4003,7 +4003,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4011,7 +4011,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4031,7 +4031,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4039,7 +4039,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4059,7 +4059,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4067,7 +4067,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4087,7 +4087,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4095,7 +4095,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4115,7 +4115,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4123,7 +4123,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4143,7 +4143,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4151,7 +4151,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4171,7 +4171,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4179,7 +4179,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4199,7 +4199,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4207,7 +4207,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4227,7 +4227,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4235,7 +4235,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4255,7 +4255,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4263,7 +4263,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4283,7 +4283,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4291,7 +4291,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4311,7 +4311,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4319,7 +4319,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4339,7 +4339,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4347,7 +4347,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4367,7 +4367,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4375,7 +4375,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4395,7 +4395,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4403,7 +4403,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4423,7 +4423,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4431,7 +4431,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4451,7 +4451,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4459,7 +4459,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4479,7 +4479,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4487,7 +4487,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4507,7 +4507,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4515,7 +4515,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4535,7 +4535,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4543,7 +4543,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4563,7 +4563,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4571,7 +4571,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4591,7 +4591,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4599,7 +4599,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4619,7 +4619,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4627,7 +4627,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4647,7 +4647,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4655,7 +4655,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4675,7 +4675,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4683,7 +4683,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4703,7 +4703,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4711,7 +4711,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4731,7 +4731,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4739,7 +4739,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4759,7 +4759,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4767,7 +4767,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4787,7 +4787,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4795,7 +4795,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4815,7 +4815,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4823,7 +4823,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4843,7 +4843,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4851,7 +4851,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4871,7 +4871,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } }, @@ -4879,7 +4879,7 @@ "env" : { "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "currentNumber" : "0", - "currentGasLimit" : "1000000", + "currentGasLimit" : "10000000", "currentDifficulty" : "256", "currentTimestamp" : "1", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" @@ -4899,7 +4899,7 @@ "value" : "1000000000000000000", "data" : "", "gasPrice" : "100000000000000", - "gas" : "100000" + "gas" : "1000000" } } }