Browse Source

Merge branch 'develop' into new_jsonrpc

cl-refactor
Marek Kotewicz 10 years ago
parent
commit
2b293a3f9b
  1. 9
      CMakeLists.txt
  2. 228
      alethzero/MainWin.cpp
  3. 123
      eth/main.cpp
  4. 2
      libethereum/BlockQueue.cpp
  5. 54
      libethereum/Client.cpp
  6. 27
      libethereum/Client.h
  7. 6
      libethereum/Executive.cpp
  8. 39
      libethereum/State.cpp
  9. 55
      libethereum/State.h
  10. 2
      libsolidity/Compiler.cpp
  11. 2
      libsolidity/CompilerContext.cpp
  12. 89
      mix/ClientModel.cpp
  13. 2
      mix/ClientModel.h
  14. 111
      mix/CodeModel.cpp
  15. 31
      mix/CodeModel.h
  16. 7
      mix/DebuggingStateWrapper.cpp
  17. 45
      mix/DebuggingStateWrapper.h
  18. 2
      mix/MixClient.cpp
  19. 74
      mix/qml/CallStack.qml
  20. 193
      mix/qml/Debugger.qml
  21. 4
      mix/qml/StatusPane.qml
  22. 69
      mix/qml/StorageView.qml
  23. 31
      mix/qml/js/Debugger.js
  24. 2
      mix/res.qrc
  25. 40
      test/TestHelper.h
  26. 2
      test/blockchain.cpp
  27. 176
      test/stTransactionTestFiller.json
  28. 196
      test/vmArithmeticTestFiller.json

9
CMakeLists.txt

@ -121,13 +121,8 @@ cmake_policy(SET CMP0015 NEW)
createDefaultCacheConfig() createDefaultCacheConfig()
configureProject() configureProject()
# TODO: Move to some other place / remove once we make Qt5.4 mandatory. # Force chromium.
find_package (Qt5WebEngine QUIET) set (ETH_HAVE_WEBENGINE 1)
if ("${Qt5WebEngine_VERSION_STRING}" VERSION_GREATER "5.3.0")
set (ETH_HAVE_WEBENGINE 1)
else()
set (ETH_HAVE_WEBENGINE 0)
endif()
message(STATUS "CMAKE_VERSION: ${CMAKE_VERSION}") message(STATUS "CMAKE_VERSION: ${CMAKE_VERSION}")
message("-- VMTRACE: ${VMTRACE}; PARANOIA: ${PARANOIA}; HEADLESS: ${HEADLESS}; JSONRPC: ${JSONRPC}; EVMJIT: ${EVMJIT}; FATDB: ${FATDB}; CHROMIUM: ${ETH_HAVE_WEBENGINE}") message("-- VMTRACE: ${VMTRACE}; PARANOIA: ${PARANOIA}; HEADLESS: ${HEADLESS}; JSONRPC: ${JSONRPC}; EVMJIT: ${EVMJIT}; FATDB: ${FATDB}; CHROMIUM: ${ETH_HAVE_WEBENGINE}")

228
alethzero/MainWin.cpp

@ -372,28 +372,6 @@ void Main::load(QString _s)
{ {
QString contents = QString::fromStdString(dev::asString(dev::contents(_s.toStdString()))); QString contents = QString::fromStdString(dev::asString(dev::contents(_s.toStdString())));
ui->webView->page()->runJavaScript(contents); 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() void Main::on_newTransaction_triggered()
@ -472,37 +450,17 @@ static Public stringToPublic(QString const& _a)
return Public(); return Public();
} }
//static Address g_newNameReg;
QString Main::pretty(dev::Address _a) const QString Main::pretty(dev::Address _a) const
{ {
/* static map<Address, QString> s_memos; auto g_newNameReg = getNameReg();
if (!s_memos.count(_a))
{*/
// if (!g_newNameReg)
auto g_newNameReg = getNameReg();
if (g_newNameReg)
{
QString s = QString::fromStdString(toString(abiOut<string32>(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];*/
if (g_newNameReg)
{
QString s = QString::fromStdString(toString(abiOut<string32>(ethereum()->call(g_newNameReg, abiIn("nameOf(address)", _a)))));
if (s.size())
return s;
}
h256 n; 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); return fromRaw(n);
} }
@ -527,41 +485,13 @@ Address Main::fromString(QString const& _n) const
if (_n == "(Create Contract)") if (_n == "(Create Contract)")
return Address(); return Address();
/* static map<QString, Address> s_memos; auto g_newNameReg = getNameReg();
if (g_newNameReg)
if (!s_memos.count(_n))
{*/
// if (!g_newNameReg)
auto g_newNameReg = getNameReg();
if (g_newNameReg)
{
Address a = abiOut<Address>(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())
{ {
if (h160 nameReg = (u160)ethereum()->stateAt(c_config, 0)) Address a = abiOut<Address>(ethereum()->call(g_newNameReg, abiIn("addressOf(string32)", ::fromString(_n.toStdString()))));
if (h256 a = ethereum()->stateAt(nameReg, n)) if (a)
return right160(a); return a;
}
if (h256 a = ethereum()->stateAt(m_nameReg, n))
return right160(a);
}*/
if (_n.size() == 40) if (_n.size() == 40)
{ {
try try
@ -595,13 +525,6 @@ QString Main::lookup(QString const& _a) const
h256 n; h256 n;
memcpy(n.data(), sn.data(), sn.size()); 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; h256 ret;
// TODO: fix with the new DNSreg contract // TODO: fix with the new DNSreg contract
// if (h160 dnsReg = (u160)ethereum()->stateAt(c_config, 4, 0)) // 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")); 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() void Main::on_turboMining_triggered()
{ {
ethereum()->setTurboMining(ui->turboMining->isChecked()); ethereum()->setTurboMining(ui->turboMining->isChecked());
@ -1072,55 +970,81 @@ void Main::refreshBlockChain()
{ {
cwatch << "refreshBlockChain()"; cwatch << "refreshBlockChain()";
QByteArray oldSelected = ui->blocks->count() ? ui->blocks->currentItem()->data(Qt::UserRole).toByteArray() : QByteArray(); // TODO: keep the same thing highlighted.
ui->blocks->clear(); // 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(); auto const& bc = ethereum()->blockChain();
unsigned i = (ui->showAll->isChecked() || !filter.empty()) ? (unsigned)-1 : 10; QStringList filters = ui->blockChainFilter->text().toLower().split(QRegExp("\\s+"), QString::SkipEmptyParts);
for (auto h = bc.currentHash(); bc.details(h) && i; h = bc.details(h).parent, --i)
{ h256Set blocks;
auto d = bc.details(h); for (QString f: filters)
auto bm = blockMatch(filter, d, h, bc); if (f.size() == 64)
if (bm)
{ {
QListWidgetItem* blockItem = new QListWidgetItem(QString("#%1 %2").arg(d.number).arg(h.abridged().c_str()), ui->blocks); h256 h(f.toStdString());
auto hba = QByteArray((char const*)h.data(), h.size); if (bc.isKnown(h))
blockItem->setData(Qt::UserRole, hba); blocks.insert(h);
if (oldSelected == hba)
blockItem->setSelected(true);
} }
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; int n = 0;
auto b = bc.block(h); auto b = bc.block(h);
for (auto const& i: RLP(b)[1]) for (auto const& i: RLP(b)[1])
{ {
Transaction t(i.data(), CheckSignature::Sender); Transaction t(i.data(), CheckSignature::Sender);
if (bm || transactionMatch(filter, t)) QString s = t.receiveAddress() ?
{ QString(" %2 %5> %3: %1 [%4]")
QString s = t.receiveAddress() ? .arg(formatBalance(t.value()).c_str())
QString(" %2 %5> %3: %1 [%4]") .arg(render(t.safeSender()))
.arg(formatBalance(t.value()).c_str()) .arg(render(t.receiveAddress()))
.arg(render(t.safeSender())) .arg((unsigned)t.nonce())
.arg(render(t.receiveAddress())) .arg(ethereum()->codeAt(t.receiveAddress()).size() ? '*' : '-') :
.arg((unsigned)t.nonce()) QString(" %2 +> %3: %1 [%4]")
.arg(ethereum()->codeAt(t.receiveAddress()).size() ? '*' : '-') : .arg(formatBalance(t.value()).c_str())
QString(" %2 +> %3: %1 [%4]") .arg(render(t.safeSender()))
.arg(formatBalance(t.value()).c_str()) .arg(render(right160(sha3(rlpList(t.safeSender(), t.nonce())))))
.arg(render(t.safeSender())) .arg((unsigned)t.nonce());
.arg(render(right160(sha3(rlpList(t.safeSender(), t.nonce()))))) QListWidgetItem* txItem = new QListWidgetItem(s, ui->blocks);
.arg((unsigned)t.nonce()); auto hba = QByteArray((char const*)h.data(), h.size);
QListWidgetItem* txItem = new QListWidgetItem(s, ui->blocks); txItem->setData(Qt::UserRole, hba);
auto hba = QByteArray((char const*)h.data(), h.size); txItem->setData(Qt::UserRole + 1, n);
txItem->setData(Qt::UserRole, hba); if (oldSelected == hba)
txItem->setData(Qt::UserRole + 1, n); txItem->setSelected(true);
if (oldSelected == hba)
txItem->setSelected(true);
}
n++; 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()) if (!ui->blocks->currentItem())
ui->blocks->setCurrentRow(0); ui->blocks->setCurrentRow(0);

123
eth/main.cpp

@ -74,6 +74,9 @@ void interactiveHelp()
<< " jsonstop Stops the JSON-RPC server." << endl << " jsonstop Stops the JSON-RPC server." << endl
<< " connect <addr> <port> Connects to a specific peer." << endl << " connect <addr> <port> Connects to a specific peer." << endl
<< " verbosity (<level>) Gets or sets verbosity level." << endl << " verbosity (<level>) Gets or sets verbosity level." << endl
<< " setetherprice <p> Resets the ether price." << endl
<< " setpriority <p> Resets the transaction priority." << endl
<< " minestart Starts mining." << endl
<< " minestart Starts mining." << endl << " minestart Starts mining." << endl
<< " minestop Stops mining." << endl << " minestop Stops mining." << endl
<< " mineforce <enable> Forces mining, even when there are no transactions." << endl << " mineforce <enable> Forces mining, even when there are no transactions." << endl
@ -85,12 +88,12 @@ void interactiveHelp()
<< " send Execute a given transaction with current secret." << endl << " send Execute a given transaction with current secret." << endl
<< " contract Create a new contract with current secret." << endl << " contract Create a new contract with current secret." << endl
<< " peers List the peers that are connected" << endl << " peers List the peers that are connected" << endl
<< " listAccounts List the accounts on the network." << endl << " listaccounts List the accounts on the network." << endl
<< " listContracts List the contracts on the network." << endl << " listcontracts List the contracts on the network." << endl
<< " setSecret <secret> Set the secret to the hex secret key." <<endl << " setsecret <secret> Set the secret to the hex secret key." <<endl
<< " setAddress <addr> Set the coinbase (mining payout) address." <<endl << " setaddress <addr> Set the coinbase (mining payout) address." <<endl
<< " exportConfig <path> Export the config (.RLP) to the path provided." <<endl << " exportconfig <path> Export the config (.RLP) to the path provided." <<endl
<< " importConfig <path> Import the config (.RLP) from the path provided." <<endl << " importconfig <path> Import the config (.RLP) from the path provided." <<endl
<< " inspect <contract> Dumps a contract to <APPDATA>/<contract>.evm." << endl << " inspect <contract> Dumps a contract to <APPDATA>/<contract>.evm." << endl
<< " dumptrace <block> <index> <filename> <format> Dumps a transaction trace" << endl << "to <filename>. <format> should be one of pretty, standard, standard+." << endl << " dumptrace <block> <index> <filename> <format> Dumps a transaction trace" << endl << "to <filename>. <format> should be one of pretty, standard, standard+." << endl
<< " dumpreceipt <block> <index> Dumps a transation receipt." << endl << " dumpreceipt <block> <index> Dumps a transation receipt." << endl
@ -104,9 +107,11 @@ void help()
<< "Options:" << endl << "Options:" << endl
<< " -a,--address <addr> Set the coinbase (mining payout) address to addr (default: auto)." << endl << " -a,--address <addr> Set the coinbase (mining payout) address to addr (default: auto)." << endl
<< " -b,--bootstrap Connect to the default Ethereum peerserver." << endl << " -b,--bootstrap Connect to the default Ethereum peerserver." << endl
<< " -B,--block-fees <n> Set the block fee profit in the reference unit e.g. ¢ (Default: 15)." << endl
<< " -c,--client-name <name> Add a name to your client's version string (default: blank)." << endl << " -c,--client-name <name> Add a name to your client's version string (default: blank)." << endl
<< " -d,--db-path <path> Load database from path (default: ~/.ethereum " << endl << " -d,--db-path <path> Load database from path (default: ~/.ethereum " << endl
<< " <APPDATA>/Etherum or Library/Application Support/Ethereum)." << endl << " <APPDATA>/Etherum or Library/Application Support/Ethereum)." << endl
<< " -e,--ether-price <n> 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 << " -f,--force-mining Mine even when there are no transaction to mine (Default: off)" << endl
<< " -h,--help Show this help message and exit." << endl << " -h,--help Show this help message and exit." << endl
<< " -i,--interactive Enter interactive mode (default: non-interactive)." << 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 << " --json-rpc-port Specify JSON-RPC server port (implies '-j', default: 8080)." << endl
#endif #endif
<< " -l,--listen <port> Listen on the given port for incoming connected (default: 30303)." << endl << " -l,--listen <port> Listen on the given port for incoming connected (default: 30303)." << endl
<< " -L,--local-networking Use peers whose addresses are local." << endl
<< " -m,--mining <on/off/number> Enable mining, optionally for a specified number of blocks (Default: off)" << endl << " -m,--mining <on/off/number> Enable mining, optionally for a specified number of blocks (Default: off)" << endl
<< " -n,--upnp <on/off> Use upnp for NAT (default: on)." << endl << " -n,--upnp <on/off> Use upnp for NAT (default: on)." << endl
<< " -L,--local-networking Use peers whose addresses are local." << endl
<< " -o,--mode <full/peer> Start a full node or a peer node (Default: full)." << endl << " -o,--mode <full/peer> Start a full node or a peer node (Default: full)." << endl
<< " -p,--port <port> Connect to remote port (default: 30303)." << endl << " -p,--port <port> Connect to remote port (default: 30303)." << endl
<< " -P,--priority <0 - 100> Default % priority of a transaction (default: 50)." << endl
<< " -r,--remote <host> Connect to remote host (default: none)." << endl << " -r,--remote <host> Connect to remote host (default: none)." << endl
<< " -s,--secret <secretkeyhex> Set the secret key for use with send command (default: auto)." << endl << " -s,--secret <secretkeyhex> Set the secret key for use with send command (default: auto)." << endl
<< " -t,--miners <number> Number of mining threads to start (Default: " << thread::hardware_concurrency() << ")" << endl << " -t,--miners <number> Number of mining threads to start (Default: " << thread::hardware_concurrency() << ")" << endl
@ -128,7 +134,7 @@ void help()
<< " -x,--peers <number> Attempt to connect to given number of peers (Default: 5)." << endl << " -x,--peers <number> Attempt to connect to given number of peers (Default: 5)." << endl
<< " -V,--version Show the version and exit." << endl << " -V,--version Show the version and exit." << endl
#if ETH_EVMJIT #if ETH_EVMJIT
<< " --jit Use EVM JIT (default: off)." << endl << " --jit Use EVM JIT (default: off)." << endl
#endif #endif
; ;
exit(0); exit(0);
@ -212,6 +218,9 @@ int main(int argc, char** argv)
bool structuredLogging = false; bool structuredLogging = false;
string structuredLoggingFormat = "%Y-%m-%dT%H:%M:%S"; string structuredLoggingFormat = "%Y-%m-%dT%H:%M:%S";
string clientName; string clientName;
TransactionPriority priority = TransactionPriority::Medium;
double etherPrice = 30.679;
double blockFees = 15.0;
// Init defaults // Init defaults
Defaults::get(); Defaults::get();
@ -289,6 +298,48 @@ int main(int argc, char** argv)
structuredLogging = true; structuredLogging = true;
else if ((arg == "-d" || arg == "--path" || arg == "--db-path") && i + 1 < argc) else if ((arg == "-d" || arg == "--path" || arg == "--db-path") && i + 1 < argc)
dbPath = argv[++i]; 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) else if ((arg == "-m" || arg == "--mining") && i + 1 < argc)
{ {
string m = argv[++i]; string m = argv[++i];
@ -301,7 +352,7 @@ int main(int argc, char** argv)
mining = stoi(m); mining = stoi(m);
} }
catch (...) { catch (...) {
cerr << "Unknown -m/--mining option: " << m << endl; cerr << "Unknown " << arg << " option: " << m << endl;
return -1; return -1;
} }
} }
@ -373,10 +424,12 @@ int main(int argc, char** argv)
miners miners
); );
web3.setIdealPeerCount(peers); web3.setIdealPeerCount(peers);
std::shared_ptr<eth::BasicGasPricer> gasPricer = make_shared<eth::BasicGasPricer>(u256(double(ether / 1000) / etherPrice), u256(blockFees * 1000));
eth::Client* c = mode == NodeMode::Full ? web3.ethereum() : nullptr; eth::Client* c = mode == NodeMode::Full ? web3.ethereum() : nullptr;
StructuredLogger::starting(clientImplString, dev::Version); StructuredLogger::starting(clientImplString, dev::Version);
if (c) if (c)
{ {
c->setGasPricer(gasPricer);
c->setForceMining(forceMining); c->setForceMining(forceMining);
c->setAddress(coinbase); c->setAddress(coinbase);
} }
@ -435,6 +488,7 @@ int main(int argc, char** argv)
istringstream iss(l); istringstream iss(l);
string cmd; string cmd;
iss >> cmd; iss >> cmd;
boost::to_lower(cmd);
if (cmd == "netstart") if (cmd == "netstart")
{ {
iss >> netPrefs.listenPort; iss >> netPrefs.listenPort;
@ -466,6 +520,42 @@ int main(int argc, char** argv)
iss >> enable; iss >> enable;
c->setForceMining(isTrue(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") else if (cmd == "verbosity")
{ {
if (iss.peek() != -1) if (iss.peek() != -1)
@ -536,6 +626,9 @@ int main(int argc, char** argv)
iss >> hexAddr >> amount >> gasPrice >> gas >> sechex >> sdata; iss >> hexAddr >> amount >> gasPrice >> gas >> sechex >> sdata;
if (!gasPrice)
gasPrice = gasPricer->bid(priority);
cnote << "Data:"; cnote << "Data:";
cnote << sdata; cnote << sdata;
bytes data = dev::eth::parseData(sdata); bytes data = dev::eth::parseData(sdata);
@ -582,7 +675,7 @@ int main(int argc, char** argv)
else else
cwarn << "Require parameters: transact ADDRESS AMOUNT GASPRICE GAS SECRET DATA"; cwarn << "Require parameters: transact ADDRESS AMOUNT GASPRICE GAS SECRET DATA";
} }
else if (c && cmd == "listContracts") else if (c && cmd == "listcontracts")
{ {
auto acs =c->addresses(); auto acs =c->addresses();
string ss; string ss;
@ -593,7 +686,7 @@ int main(int argc, char** argv)
cout << ss << endl; cout << ss << endl;
} }
} }
else if (c && cmd == "listAccounts") else if (c && cmd == "listaccounts")
{ {
auto acs =c->addresses(); auto acs =c->addresses();
string ss; string ss;
@ -809,7 +902,7 @@ int main(int argc, char** argv)
} }
} }
} }
else if (cmd == "setSecret") else if (cmd == "setsecret")
{ {
if (iss.peek() != -1) if (iss.peek() != -1)
{ {
@ -820,7 +913,7 @@ int main(int argc, char** argv)
else else
cwarn << "Require parameter: setSecret HEXSECRETKEY"; cwarn << "Require parameter: setSecret HEXSECRETKEY";
} }
else if (cmd == "setAddress") else if (cmd == "setaddress")
{ {
if (iss.peek() != -1) if (iss.peek() != -1)
{ {
@ -848,7 +941,7 @@ int main(int argc, char** argv)
else else
cwarn << "Require parameter: setAddress HEXADDRESS"; cwarn << "Require parameter: setAddress HEXADDRESS";
} }
else if (cmd == "exportConfig") else if (cmd == "exportconfig")
{ {
if (iss.peek() != -1) if (iss.peek() != -1)
{ {
@ -861,7 +954,7 @@ int main(int argc, char** argv)
else else
cwarn << "Require parameter: exportConfig PATH"; cwarn << "Require parameter: exportConfig PATH";
} }
else if (cmd == "importConfig") else if (cmd == "importconfig")
{ {
if (iss.peek() != -1) if (iss.peek() != -1)
{ {

2
libethereum/BlockQueue.cpp

@ -107,7 +107,7 @@ ImportResult BlockQueue::import(bytesConstRef _block, BlockChain const& _bc)
void BlockQueue::tick(BlockChain const& _bc) void BlockQueue::tick(BlockChain const& _bc)
{ {
unsigned t = time(0); 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); import(&(i->second), _bc);
WriteGuard l(m_lock); WriteGuard l(m_lock);

54
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<u256, unsigned> 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): Client::Client(p2p::Host* _extNet, std::string const& _dbPath, bool _forceClean, u256 _networkId, int _miners):
Worker("eth"), Worker("eth"),
m_vc(_dbPath), m_vc(_dbPath),
m_bc(_dbPath, !m_vc.ok() || _forceClean), 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_stateDB(State::openDB(_dbPath, !m_vc.ok() || _forceClean)),
m_preMine(Address(), m_stateDB), m_preMine(Address(), m_stateDB),
m_postMine(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)); 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(); 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<GasPricer> _gp, std::string const& _dbPath, bool _forceClean, u256 _networkId, int _miners):
Worker("eth"), Worker("eth"),
m_vc(_dbPath), m_vc(_dbPath),
m_bc(_dbPath, !m_vc.ok() || _forceClean), m_bc(_dbPath, !m_vc.ok() || _forceClean),
m_gp(weiPerCent), m_gp(_gp),
m_stateDB(State::openDB(_dbPath, !m_vc.ok() || _forceClean)), m_stateDB(State::openDB(_dbPath, !m_vc.ok() || _forceClean)),
m_preMine(Address(), m_stateDB), m_preMine(Address(), m_stateDB),
m_postMine(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)); 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. // returns h256s as blooms, once for each transaction.
cwork << "postSTATE <== TQ"; 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()) if (newPendingReceipts.size())
{ {
for (size_t i = 0; i < newPendingReceipts.size(); i++) for (size_t i = 0; i < newPendingReceipts.size(); i++)

27
libethereum/Client.h

@ -160,6 +160,26 @@ private:
State m_state; 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<u256, 9> m_octiles;
};
/** /**
* @brief Main API hub for interfacing with Ethereum. * @brief Main API hub for interfacing with Ethereum.
*/ */
@ -179,7 +199,7 @@ public:
explicit Client( explicit Client(
p2p::Host* _host, p2p::Host* _host,
u256 _weiPerCent, std::shared_ptr<GasPricer> _gpForAdoption, // pass it in with new.
std::string const& _dbPath = std::string(), std::string const& _dbPath = std::string(),
bool _forceClean = false, bool _forceClean = false,
u256 _networkId = 0, u256 _networkId = 0,
@ -189,6 +209,9 @@ public:
/// Destructor. /// Destructor.
virtual ~Client(); virtual ~Client();
/// Resets the gas pricer to some other object.
void setGasPricer(std::shared_ptr<GasPricer> _gp) { m_gp = _gp; }
/// Submits the given message-call transaction. /// 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); 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. CanonBlockChain m_bc; ///< Maintains block database.
TransactionQueue m_tq; ///< Maintains a list of incoming transactions not yet in a block on the blockchain. 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). 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<GasPricer> m_gp; ///< The gas pricer.
mutable SharedMutex x_stateDB; ///< Lock on the state DB, effectively a lock on m_postMine. 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. OverlayDB m_stateDB; ///< Acts as the central point for the state database, so multiple States can share it.

6
libethereum/Executive.cpp

@ -176,7 +176,7 @@ OnOpFunc Executive::simpleTrace()
o << endl << " STACK" << endl; o << endl << " STACK" << endl;
for (auto i: vm.stack()) for (auto i: vm.stack())
o << (h256)i << endl; 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; o << " STORAGE" << endl;
for (auto const& i: ext.state().storage(ext.myAddress)) for (auto const& i: ext.state().storage(ext.myAddress))
o << showbase << hex << i.first << ": " << i.second << endl; o << showbase << hex << i.first << ": " << i.second << endl;
@ -236,6 +236,10 @@ bool Executive::go(OnOpFunc const& _onOp)
void Executive::finalize() void Executive::finalize()
{ {
// Accumulate refunds for suicides.
if (m_ext)
m_ext->sub.refunds += c_suicideRefundGas * m_ext->sub.suicides.size();
// SSTORE refunds... // SSTORE refunds...
// must be done before the miner gets the fees. // must be done before the miner gets the fees.
if (m_ext) if (m_ext)

39
libethereum/State.cpp

@ -464,45 +464,6 @@ TransactionReceipts State::sync(BlockChain const& _bc, TransactionQueue& _tq, Ga
return ret; return ret;
} }
void GasPricer::updateQuartiles(BlockChain const& _bc)
{
unsigned c = 0;
h256 p = _bc.currentHash();
map<u256, unsigned> 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) u256 State::enact(bytesConstRef _block, BlockChain const& _bc, bool _checkNonce)
{ {
// m_currentBlock is assumed to be prepopulated and reset. // m_currentBlock is assumed to be prepopulated and reset.

55
libethereum/State.h

@ -47,6 +47,7 @@ namespace eth
{ {
class BlockChain; class BlockChain;
class State;
struct StateChat: public LogChannel { static const char* name() { return "-S-"; } static const int verbosity = 4; }; 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; }; 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 }; 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. * @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. /// Like sync but only operate on _tq, killing the invalid/old ones.
bool cull(TransactionQueue& _tq) const; bool cull(TransactionQueue& _tq) const;
/// Returns the last few block hashes of the current chain.
LastHashes getLastHashes(BlockChain const& _bc, unsigned _n) const; LastHashes getLastHashes(BlockChain const& _bc, unsigned _n) const;
/// Execute a given transaction. /// Execute a given transaction.
@ -370,32 +397,6 @@ void commit(std::map<Address, Account> const& _cache, DB& _db, SecureTrieDB<Addr
} }
} }
enum class TransactionPriority
{
Low = 0,
Medium = 1,
High = 2
};
class GasPricer
{
public:
explicit GasPricer(u256 _weiPerCent): m_weiPerCent(_weiPerCent) {}
u256 ask(State const&) const { return m_weiPerCent * m_centsPerBlock / m_gasPerBlock; }
u256 bid(TransactionPriority _p = TransactionPriority::Medium) const { return m_quartiles[(int)_p]; }
void updateRefPrice(u256 _weiPerCent) { m_weiPerCent = _weiPerCent; }
void updateRefRequirement(u256 _centsPerBlock) { m_centsPerBlock = _centsPerBlock; }
void updateQuartiles(BlockChain const& _bc);
private:
u256 m_weiPerCent;
u256 m_centsPerBlock = 15;
u256 m_gasPerBlock = 1000000;
std::array<u256, 100> m_quartiles;
};
} }
} }

2
libsolidity/Compiler.cpp

@ -375,7 +375,7 @@ bool Compiler::visit(FunctionDefinition const& _function)
for (VariableDeclaration const* localVariable: _function.getLocalVariables()) for (VariableDeclaration const* localVariable: _function.getLocalVariables())
m_context.removeVariable(*localVariable); m_context.removeVariable(*localVariable);
m_context.adjustStackOffset(-c_returnValuesSize); m_context.adjustStackOffset(-(int)c_returnValuesSize);
if (!_function.isConstructor()) if (!_function.isConstructor())
m_context << eth::Instruction::JUMP; m_context << eth::Instruction::JUMP;
return false; return false;

2
libsolidity/CompilerContext.cpp

@ -63,7 +63,7 @@ void CompilerContext::addVariable(VariableDeclaration const& _declaration,
void CompilerContext::removeVariable(VariableDeclaration const& _declaration) void CompilerContext::removeVariable(VariableDeclaration const& _declaration)
{ {
solAssert(m_localVariables.count(&_declaration), ""); solAssert(!!m_localVariables.count(&_declaration), "");
m_localVariables.erase(&_declaration); m_localVariables.erase(&_declaration);
} }

89
mix/ClientModel.cpp

@ -37,7 +37,6 @@
#include "QVariableDefinition.h" #include "QVariableDefinition.h"
#include "ContractCallDataEncoder.h" #include "ContractCallDataEncoder.h"
#include "CodeModel.h" #include "CodeModel.h"
#include "ClientModel.h"
#include "QEther.h" #include "QEther.h"
#include "Web3Server.h" #include "Web3Server.h"
#include "ClientModel.h" #include "ClientModel.h"
@ -318,19 +317,28 @@ void ClientModel::showDebuggerForTransaction(ExecutionResult const& _t)
QDebugData* debugData = new QDebugData(); QDebugData* debugData = new QDebugData();
QQmlEngine::setObjectOwnership(debugData, QQmlEngine::JavaScriptOwnership); QQmlEngine::setObjectOwnership(debugData, QQmlEngine::JavaScriptOwnership);
QList<QCode*> codes; QList<QCode*> codes;
QList<QHash<int, int>> codeMaps;
QList<AssemblyItems> codeItems;
QList<CompiledContract const*> contracts;
for (MachineCode const& code: _t.executionCode) for (MachineCode const& code: _t.executionCode)
{ {
codes.push_back(QMachineState::getHumanReadableCode(debugData, code.address, code.code)); QHash<int, int> 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 //try to resolve contract for source level debugging
auto nameIter = m_contractNames.find(code.address); auto nameIter = m_contractNames.find(code.address);
if (nameIter != m_contractNames.end()) if (nameIter != m_contractNames.end())
{ {
CompiledContract const& compilerRes = m_context->codeModel()->contract(nameIter->second); CompiledContract const& compilerRes = m_context->codeModel()->contract(nameIter->second);
eth::AssemblyItems assemblyItems = !_t.isConstructor() ? compilerRes.assemblyItems() : compilerRes.constructorAssemblyItems(); eth::AssemblyItems assemblyItems = !_t.isConstructor() ? compilerRes.assemblyItems() : compilerRes.constructorAssemblyItems();
QVariantList locations; codes.back()->setDocument(compilerRes.documentId());
for (eth::AssemblyItem const& item: assemblyItems) codeItems.push_back(std::move(assemblyItems));
locations.push_back(QVariant::fromValue(new QSourceLocation(debugData, item.getLocation().start, item.getLocation().end))); contracts.push_back(&compilerRes);
codes.back()->setLocations(compilerRes.documentId(), std::move(locations)); }
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)); data.push_back(QMachineState::getDebugCallData(debugData, d));
QVariantList states; QVariantList states;
QStringList solCallStack;
std::map<int, SolidityDeclaration> solLocals; //<stack pos, declaration>
QList<int> returnStack;
unsigned prevInstructionIndex = 0;
for (MachineState const& s: _t.machineStates) 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<unsigned>(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<QVariableDefinition*> returnParameters; if (instruction.type() == dev::eth::Tag) //TODO: use annotations
//returnParameters = encoder.decode(f->returnParameters(), debuggingContent.returnValue); {
//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<unsigned>::max())
{
auto storageIter = contract->storage().find(static_cast<unsigned>(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); debugDataReady(debugData);
} }
QString ClientModel::formatValue(SolidityType const&, dev::u256 const& _value)
{
return QString::fromStdString(prettyU256(_value));
}
void ClientModel::emptyRecord() void ClientModel::emptyRecord()
{ {
debugDataReady(new QDebugData()); debugDataReady(new QDebugData());

2
mix/ClientModel.h

@ -41,6 +41,7 @@ class QEther;
class QDebugData; class QDebugData;
class MixClient; class MixClient;
class QVariableDefinition; class QVariableDefinition;
struct SolidityType;
/// Backend transaction config class /// Backend transaction config class
struct TransactionSettings struct TransactionSettings
@ -198,6 +199,7 @@ private:
void onNewTransaction(); void onNewTransaction();
void onStateReset(); void onStateReset();
void showDebuggerForTransaction(ExecutionResult const& _t); void showDebuggerForTransaction(ExecutionResult const& _t);
QString formatValue(SolidityType const& _type, dev::u256 const& _value);
AppContext* m_context; AppContext* m_context;
std::atomic<bool> m_running; std::atomic<bool> m_running;

111
mix/CodeModel.cpp

@ -25,7 +25,10 @@
#include <QDebug> #include <QDebug>
#include <QApplication> #include <QApplication>
#include <QtQml> #include <QtQml>
#include <libdevcore/Common.h>
#include <libevmcore/SourceLocation.h> #include <libevmcore/SourceLocation.h>
#include <libsolidity/AST.h>
#include <libsolidity/ASTVisitor.h>
#include <libsolidity/CompilerStack.h> #include <libsolidity/CompilerStack.h>
#include <libsolidity/SourceReferenceFormatter.h> #include <libsolidity/SourceReferenceFormatter.h>
#include <libsolidity/InterfaceHandler.h> #include <libsolidity/InterfaceHandler.h>
@ -43,6 +46,91 @@ using namespace dev::mix;
const std::set<std::string> c_predefinedContracts = const std::set<std::string> c_predefinedContracts =
{ "Config", "Coin", "CoinReg", "coin", "service", "owned", "mortal", "NameReg", "named", "std", "configUser" }; { "Config", "Coin", "CoinReg", "coin", "service", "owned", "mortal", "NameReg", "named", "std", "configUser" };
namespace
{
using namespace dev::solidity;
class CollectDeclarationsVisitor: public ASTConstVisitor
{
public:
CollectDeclarationsVisitor(QHash<LocationPair, QString>* _functions, QHash<LocationPair, SolidityDeclaration>* _locals, QHash<unsigned, SolidityDeclaration>* _storage):
m_functions(_functions), m_locals(_locals), m_storage(_storage), m_functionScope(false), m_storageSlot(0) {}
private:
QHash<LocationPair, QString>* m_functions;
QHash<LocationPair, SolidityDeclaration>* m_locals;
QHash<unsigned, SolidityDeclaration>* 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<IntegerType const*>(_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<StaticStringType const*>(_type);
return SolidityType { SolidityType::Type::String, static_cast<unsigned>(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) void BackgroundWorker::queueCodeChange(int _jobId)
{ {
m_model->runCompilationJob(_jobId); m_model->runCompilationJob(_jobId);
@ -52,18 +140,23 @@ CompiledContract::CompiledContract(const dev::solidity::CompilerStack& _compiler
QObject(nullptr), QObject(nullptr),
m_sourceHash(qHash(_source)) 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)); m_contract.reset(new QContractDefinition(&contractDefinition));
QQmlEngine::setObjectOwnership(m_contract.get(), QQmlEngine::CppOwnership); QQmlEngine::setObjectOwnership(m_contract.get(), QQmlEngine::CppOwnership);
m_bytes = _compiler.getBytecode(_contractName.toStdString()); m_bytes = _compiler.getBytecode(_contractName.toStdString());
m_assemblyItems = _compiler.getRuntimeAssemblyItems(_contractName.toStdString()); m_assemblyItems = _compiler.getRuntimeAssemblyItems(name);
m_constructorAssemblyItems = _compiler.getAssemblyItems(_contractName.toStdString()); m_constructorAssemblyItems = _compiler.getAssemblyItems(name);
dev::solidity::InterfaceHandler interfaceHandler; dev::solidity::InterfaceHandler interfaceHandler;
m_contractInterface = QString::fromStdString(*interfaceHandler.getABIInterface(contractDefinition)); m_contractInterface = QString::fromStdString(*interfaceHandler.getABIInterface(contractDefinition));
if (m_contractInterface.isEmpty()) if (m_contractInterface.isEmpty())
m_contractInterface = "[]"; m_contractInterface = "[]";
if (contractDefinition.getLocation().sourceName.get()) if (contractDefinition.getLocation().sourceName.get())
m_documentId = QString::fromStdString(*contractDefinition.getLocation().sourceName); m_documentId = QString::fromStdString(*contractDefinition.getLocation().sourceName);
CollectDeclarationsVisitor visitor(&m_functions, &m_locals, &m_storage);
contractDefinition.accept(visitor);
} }
QString CompiledContract::codeHex() const QString CompiledContract::codeHex() const
@ -121,12 +214,11 @@ void CodeModel::reset(QVariantMap const& _documents)
void CodeModel::registerCodeChange(QString const& _documentId, QString const& _code) void CodeModel::registerCodeChange(QString const& _documentId, QString const& _code)
{ {
{ CompiledContract* contract = contractByDocumentId(_documentId);
Guard l(x_contractMap); if (contract != nullptr && contract->m_sourceHash == qHash(_code))
CompiledContract* contract = m_contractMap.value(_documentId); return;
if (contract != nullptr && contract->m_sourceHash == qHash(_code))
return;
{
Guard pl(x_pendingContracts); Guard pl(x_pendingContracts);
m_pendingContracts[_documentId] = _code; m_pendingContracts[_documentId] = _code;
} }
@ -196,7 +288,8 @@ void CodeModel::runCompilationJob(int _jobId)
if (c_predefinedContracts.count(n) != 0) if (c_predefinedContracts.count(n) != 0)
continue; continue;
QString name = QString::fromStdString(n); 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(); QString source = sourceIter != m_pendingContracts.end() ? sourceIter->second : QString();
CompiledContract* contract = new CompiledContract(cs, name, source); CompiledContract* contract = new CompiledContract(cs, name, source);
QQmlEngine::setObjectOwnership(contract, QQmlEngine::CppOwnership); QQmlEngine::setObjectOwnership(contract, QQmlEngine::CppOwnership);

31
mix/CodeModel.h

@ -64,6 +64,29 @@ private:
CodeModel* m_model; CodeModel* m_model;
}; };
using LocationPair = QPair<int, int>;
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 ///Compilation result model. Contains all the compiled contract data required by UI
class CompiledContract: public QObject class CompiledContract: public QObject
{ {
@ -93,6 +116,10 @@ public:
/// @returns contract source Id /// @returns contract source Id
QString documentId() const { return m_documentId; } QString documentId() const { return m_documentId; }
QHash<LocationPair, QString> const& functions() const { return m_functions; }
QHash<LocationPair, SolidityDeclaration> const& locals() const { return m_locals; }
QHash<unsigned, SolidityDeclaration> const& storage() const { return m_storage; }
private: private:
uint m_sourceHash; uint m_sourceHash;
std::shared_ptr<QContractDefinition> m_contract; std::shared_ptr<QContractDefinition> m_contract;
@ -102,11 +129,13 @@ private:
QString m_documentId; QString m_documentId;
eth::AssemblyItems m_assemblyItems; eth::AssemblyItems m_assemblyItems;
eth::AssemblyItems m_constructorAssemblyItems; eth::AssemblyItems m_constructorAssemblyItems;
QHash<LocationPair, QString> m_functions;
QHash<LocationPair, SolidityDeclaration> m_locals;
QHash<unsigned, SolidityDeclaration> m_storage;
friend class CodeModel; friend class CodeModel;
}; };
using ContractMap = QHash<QString, CompiledContract*>; using ContractMap = QHash<QString, CompiledContract*>;
/// Code compilation model. Compiles contracts in background an provides compiled contract data /// Code compilation model. Compiles contracts in background an provides compiled contract data

7
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<int, int>& o_codeMap)
{ {
QVariantList codeStr; QVariantList codeStr;
for (unsigned i = 0; i <= _code.size(); ++i) 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); QString s = QString::fromStdString(instructionInfo((Instruction)b).name);
std::ostringstream out; std::ostringstream out;
out << std::hex << std::setw(4) << std::setfill('0') << i; 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) if (b >= (byte)Instruction::PUSH1 && b <= (byte)Instruction::PUSH32)
{ {
unsigned bc = getPushNumber((Instruction)b); unsigned bc = getPushNumber((Instruction)b);
s = "PUSH 0x" + QString::fromStdString(toHex(bytesConstRef(&_code[i + 1], bc))); s = "PUSH 0x" + QString::fromStdString(toHex(bytesConstRef(&_code[i + 1], bc)));
i += 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 (...) catch (...)
{ {

45
mix/DebuggingStateWrapper.h

@ -26,12 +26,12 @@
#include <boost/asio.hpp> #include <boost/asio.hpp>
#include <QStringList> #include <QStringList>
#include <QMap> #include <QHash>
#include <libdevcore/Common.h> #include <libdevcore/Common.h>
#include <libethereum/State.h> #include <libethereum/State.h>
#include <libethereum/Executive.h> #include <libethereum/Executive.h>
#include "MachineStates.h"
#include "QVariableDefinition.h" #include "QVariableDefinition.h"
#include "MixClient.h"
#include "QBigInt.h" #include "QBigInt.h"
namespace dev namespace dev
@ -46,32 +46,39 @@ class QInstruction: public QObject
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QString line MEMBER m_line CONSTANT) Q_PROPERTY(QString line MEMBER m_line CONSTANT)
Q_PROPERTY(int processIndex MEMBER m_processIndex CONSTANT)
public: 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: private:
QString m_line; QString m_line;
int m_processIndex;
}; };
/**
class QSourceLocation: public QObject * @brief Solidity state
*/
class QSolState: public QObject
{ {
Q_OBJECT 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 start MEMBER m_start CONSTANT)
Q_PROPERTY(int end MEMBER m_end CONSTANT) Q_PROPERTY(int end MEMBER m_end CONSTANT)
public: 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: private:
QStringList m_storage;
QStringList m_callStack;
QStringList m_locals;
int m_start; int m_start;
int m_end; int m_end;
}; };
/** /**
* @brief Shared container for lines * @brief Shared container for lines
*/ */
@ -79,19 +86,17 @@ class QCode: public QObject
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QVariantList instructions MEMBER m_instructions CONSTANT) 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 address MEMBER m_address CONSTANT)
Q_PROPERTY(QString documentId MEMBER m_document CONSTANT) Q_PROPERTY(QString documentId MEMBER m_document CONSTANT)
public: public:
QCode(QObject* _owner, QString const& _address, QVariantList&& _instrunctions): QObject(_owner), m_instructions(_instrunctions), m_address(_address) {} 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: private:
QVariantList m_instructions; QVariantList m_instructions;
QString m_address; QString m_address;
QString m_document; QString m_document;
QVariantList m_locations;
}; };
/** /**
@ -133,6 +138,7 @@ class QMachineState: public QObject
Q_OBJECT Q_OBJECT
Q_PROPERTY(int step READ step CONSTANT) Q_PROPERTY(int step READ step CONSTANT)
Q_PROPERTY(int curPC READ curPC 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* gasCost READ gasCost CONSTANT)
Q_PROPERTY(QBigInt* gas READ gas CONSTANT) Q_PROPERTY(QBigInt* gas READ gas CONSTANT)
Q_PROPERTY(QString instruction READ instruction 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(QVariantList levels READ levels CONSTANT)
Q_PROPERTY(unsigned codeIndex READ codeIndex CONSTANT) Q_PROPERTY(unsigned codeIndex READ codeIndex CONSTANT)
Q_PROPERTY(unsigned dataIndex READ dataIndex CONSTANT) Q_PROPERTY(unsigned dataIndex READ dataIndex CONSTANT)
Q_PROPERTY(QObject* solidity MEMBER m_solState CONSTANT)
public: public:
QMachineState(QObject* _owner, MachineState const& _state, QCode* _code, QCallData* _callData): QMachineState(QObject* _owner, int _instructionIndex, MachineState const& _state, QCode* _code, QCallData* _callData, QSolState* _solState):
QObject(_owner), m_state(_state), m_code(_code), m_callData(_callData) {} QObject(_owner), m_instructionIndex(_instructionIndex), m_state(_state), m_code(_code), m_callData(_callData), m_solState(_solState) { }
/// Get the step of this machine states. /// Get the step of this machine states.
int step() { return (int)m_state.steps; } int step() { return (int)m_state.steps; }
/// Get the proccessed code index. /// Get the proccessed code index.
@ -168,7 +175,7 @@ public:
QStringList debugStorage(); QStringList debugStorage();
/// Get memory. /// Get memory.
QVariantList debugMemory(); QVariantList debugMemory();
/// get end of debug information. /// Get end of debug information.
QString endOfDebug(); QString endOfDebug();
/// Get the new memory size. /// Get the new memory size.
QBigInt* newMemSize(); QBigInt* newMemSize();
@ -177,18 +184,18 @@ public:
/// Get all previous steps. /// Get all previous steps.
QVariantList levels(); QVariantList levels();
/// Get the current processed machine state. /// Get the current processed machine state.
MachineState state() { return m_state; } MachineState const& state() const { return m_state; }
/// Set the current processed machine state.
void setState(MachineState _state) { m_state = _state; }
/// Convert all machine states in human readable code. /// 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<int, int>& o_codeMap);
/// Convert call data into human readable form /// Convert call data into human readable form
static QCallData* getDebugCallData(QObject* _owner, bytes const& _data); static QCallData* getDebugCallData(QObject* _owner, bytes const& _data);
private: private:
int m_instructionIndex;
MachineState m_state; MachineState m_state;
QCode* m_code; QCode* m_code;
QCallData* m_callData; QCallData* m_callData;
QSolState* m_solState;
}; };
} }

2
mix/MixClient.cpp

@ -41,7 +41,7 @@ namespace mix
{ {
const Secret c_defaultUserAccountSecret = Secret("cb73d9408c4720e230387d956eb0f829d8a4dd2c1055f96257167e14e7169074"); 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 class MixBlockChain: public dev::eth::BlockChain
{ {

74
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
}
}
}

193
mix/qml/Debugger.qml

@ -29,6 +29,7 @@ Rectangle {
onAssemblyModeChanged: onAssemblyModeChanged:
{ {
Debugger.updateMode(); Debugger.updateMode();
machineStates.updateHeight();
} }
function displayCompilationErrorIfAny() function displayCompilationErrorIfAny()
@ -90,6 +91,9 @@ Rectangle {
property alias memoryDumpHeightSettings: memoryRect.height property alias memoryDumpHeightSettings: memoryRect.height
property alias callDataHeightSettings: callDataRect.height property alias callDataHeightSettings: callDataRect.height
property alias transactionLogVisible: transactionLog.visible property alias transactionLogVisible: transactionLog.visible
property alias solCallStackHeightSettings: solStackRect.height
property alias solStorageHeightSettings: solStorageRect.height
property alias solLocalsHeightSettings: solLocalsRect.height
} }
Rectangle Rectangle
@ -183,8 +187,12 @@ Rectangle {
Layout.fillWidth: true Layout.fillWidth: true
Layout.fillHeight: true Layout.fillHeight: true
function updateHeight() { function updateHeight() {
statesLayout.height = buttonRow.childrenRect.height + assemblyCodeRow.childrenRect.height + var h = buttonRow.childrenRect.height;
callStackRect.childrenRect.height + storageRect.childrenRect.height + memoryRect.childrenRect.height + callDataRect.childrenRect.height + 120; 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(); Component.onCompleted: updateHeight();
@ -546,83 +554,66 @@ Rectangle {
Rectangle Rectangle
{ {
id: callStackRect; id: solStackRect;
color: "transparent" color: "transparent"
Layout.minimumHeight: 25 Layout.minimumHeight: 25
Layout.maximumHeight: 800 Layout.maximumHeight: 800
onHeightChanged: machineStates.updateHeight(); onHeightChanged: machineStates.updateHeight();
DebugInfoList visible: !assemblyMode
{ CallStack {
id: callStack
collapsible: true
anchors.fill: parent anchors.fill: parent
title : qsTr("Call Stack") id: solCallStack
enableSelection: true }
onRowActivated: Debugger.displayFrame(index); }
itemDelegate:
Item {
anchors.fill: parent
Rectangle { Rectangle
anchors.fill: parent {
color: "#4A90E2" id: solLocalsRect;
visible: styleData.selected; color: "transparent"
} Layout.minimumHeight: 25
Layout.maximumHeight: 800
onHeightChanged: machineStates.updateHeight();
visible: !assemblyMode
StorageView {
title : qsTr("Locals")
anchors.fill: parent
id: solLocals
}
}
RowLayout Rectangle
{ {
id: row id: solStorageRect;
anchors.fill: parent color: "transparent"
Rectangle Layout.minimumHeight: 25
{ Layout.maximumHeight: 800
color: "#f7f7f7" onHeightChanged: machineStates.updateHeight();
Layout.fillWidth: true visible: !assemblyMode
Layout.minimumWidth: 30 StorageView {
Layout.maximumWidth: 30 title : qsTr("Members")
Text { anchors.fill: parent
anchors.verticalCenter: parent.verticalCenter id: solStorage
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 { Rectangle
anchors.top: row.bottom {
width: parent.width; id: callStackRect;
height: 1; color: "transparent"
color: "#cccccc" Layout.minimumHeight: 25
anchors.bottom: parent.bottom Layout.maximumHeight: 800
} onHeightChanged: machineStates.updateHeight();
} visible: assemblyMode
CallStack {
anchors.fill: parent
id: callStack
onRowActivated: Debugger.displayFrame(index);
} }
} }
Rectangle Rectangle
{ {
id: storageRect id: storageRect
@ -631,68 +622,10 @@ Rectangle {
Layout.minimumHeight: 25 Layout.minimumHeight: 25
Layout.maximumHeight: 800 Layout.maximumHeight: 800
onHeightChanged: machineStates.updateHeight(); onHeightChanged: machineStates.updateHeight();
DebugInfoList visible: assemblyMode
{ StorageView {
id: storage
anchors.fill: parent anchors.fill: parent
collapsible: true id: storage
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
}
}
} }
} }
@ -704,6 +637,7 @@ Rectangle {
Layout.minimumHeight: 25 Layout.minimumHeight: 25
Layout.maximumHeight: 800 Layout.maximumHeight: 800
onHeightChanged: machineStates.updateHeight(); onHeightChanged: machineStates.updateHeight();
visible: assemblyMode
DebugInfoList { DebugInfoList {
id: memoryDump id: memoryDump
anchors.fill: parent anchors.fill: parent
@ -726,6 +660,7 @@ Rectangle {
Layout.minimumHeight: 25 Layout.minimumHeight: 25
Layout.maximumHeight: 800 Layout.maximumHeight: 800
onHeightChanged: machineStates.updateHeight(); onHeightChanged: machineStates.updateHeight();
visible: assemblyMode
DebugInfoList { DebugInfoList {
id: callDataDump id: callDataDump
anchors.fill: parent anchors.fill: parent

4
mix/qml/StatusPane.qml

@ -159,8 +159,8 @@ Rectangle {
color: "transparent" color: "transparent"
width: 100 width: 100
height: parent.height height: parent.height
anchors.top: statusHeader.top anchors.top: parent.top
anchors.right: statusHeader.right anchors.right: parent.right
RowLayout RowLayout
{ {
anchors.fill: parent anchors.fill: parent

69
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
}
}
}

31
mix/qml/js/Debugger.js

@ -4,7 +4,6 @@
var currentSelectedState = null; var currentSelectedState = null;
var currentDisplayedState = null; var currentDisplayedState = null;
var debugData = null; var debugData = null;
var codeMap = null;
var locations = []; var locations = [];
var locationMap = {}; var locationMap = {};
var breakpoints = {}; var breakpoints = {};
@ -56,7 +55,7 @@ function initLocations()
for (var i = 0; i < debugData.states.length - 1; i++) { for (var i = 0; i < debugData.states.length - 1; i++) {
var code = debugData.states[i].code; 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) 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 }; prevLocation = { start: location.start, end: location.end, documentId: code.documentId, state: i };
@ -65,6 +64,7 @@ function initLocations()
locationMap[i] = locations.length - 1; locationMap[i] = locations.length - 1;
} }
locations.push({ start: -1, end: -1, documentId: code.documentId, state: i }); locations.push({ start: -1, end: -1, documentId: code.documentId, state: i });
locationMap[debugData.states.length - 1] = locations.length - 1; locationMap[debugData.states.length - 1] = locations.length - 1;
} }
@ -93,12 +93,10 @@ function initSlider()
function setupInstructions(stateIndex) function setupInstructions(stateIndex)
{ {
var instructions = debugData.states[stateIndex].code.instructions; var instructions = debugData.states[stateIndex].code.instructions;
codeMap = {};
statesList.model.clear(); statesList.model.clear();
for (var i = 0; i < instructions.length; i++) { for (var i = 0; i < instructions.length; i++)
statesList.model.append(instructions[i]); statesList.model.append(instructions[i]);
codeMap[instructions[i].processIndex] = i;
}
callDataDump.listModel = debugData.states[stateIndex].callData.items; callDataDump.listModel = debugData.states[stateIndex].callData.items;
} }
@ -129,14 +127,14 @@ function display(stateIndex)
setupInstructions(stateIndex); setupInstructions(stateIndex);
if (debugData.states[stateIndex].dataIndex !== debugData.states[currentDisplayedState].dataIndex) if (debugData.states[stateIndex].dataIndex !== debugData.states[currentDisplayedState].dataIndex)
setupCallData(stateIndex); setupCallData(stateIndex);
var codeLine = codeStr(stateIndex);
var state = debugData.states[stateIndex]; var state = debugData.states[stateIndex];
var codeLine = state.instructionIndex;
highlightSelection(codeLine); highlightSelection(codeLine);
completeCtxInformation(state); completeCtxInformation(state);
currentDisplayedState = stateIndex; currentDisplayedState = stateIndex;
var docId = debugData.states[stateIndex].code.documentId; var docId = debugData.states[stateIndex].code.documentId;
if (docId) if (docId)
debugExecuteLocation(docId, locations[locationMap[stateIndex]]); debugExecuteLocation(docId, debugData.states[stateIndex].solidity);
} }
function displayFrame(frameIndex) function displayFrame(frameIndex)
@ -183,12 +181,6 @@ function selectState(stateIndex)
statesSlider.value = stateIndex; statesSlider.value = stateIndex;
} }
function codeStr(stateIndex)
{
var state = debugData.states[stateIndex];
return codeMap[state.curPC];
}
function highlightSelection(index) function highlightSelection(index)
{ {
statesList.positionViewAtRow(index, ListView.Center); statesList.positionViewAtRow(index, ListView.Center);
@ -206,6 +198,15 @@ function completeCtxInformation(state)
stack.listModel = state.debugStack; stack.listModel = state.debugStack;
storage.listModel = state.debugStorage; storage.listModel = state.debugStorage;
memoryDump.listModel = state.debugMemory; 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) function isCallInstruction(index)
@ -229,7 +230,7 @@ function breakpointHit(i)
{ {
var bpLocations = breakpoints[debugData.states[i].code.documentId]; var bpLocations = breakpoints[debugData.states[i].code.documentId];
if (bpLocations) { if (bpLocations) {
var location = locations[locationMap[i]]; var location = debugData.states[i].solidity;
if (location.start >= 0 && location.end >= location.start) if (location.start >= 0 && location.end >= location.start)
for (var b = 0; b < bpLocations.length; b++) for (var b = 0; b < bpLocations.length; b++)
if (locationsIntersect(location, bpLocations[b])) if (locationsIntersect(location, bpLocations[b]))

2
mix/res.qrc

@ -103,6 +103,8 @@
<file>qml/img/available_updates.png</file> <file>qml/img/available_updates.png</file>
<file>qml/DeploymentDialog.qml</file> <file>qml/DeploymentDialog.qml</file>
<file>qml/img/search_filled.png</file> <file>qml/img/search_filled.png</file>
<file>qml/StorageView.qml</file>
<file>qml/CallStack.qml</file>
<file>qml/img/help.png</file> <file>qml/img/help.png</file>
<file>qml/img/openedfolder.png</file> <file>qml/img/openedfolder.png</file>
<file>qml/img/b64.png</file> <file>qml/img/b64.png</file>

40
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. /// 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() /// 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 /// @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 \ do \
{ \ { \
try \ try \
{ \ { \
_expression; \ BOOST_TEST_PASSPOINT(); \
_statement; \
} \ } \
catch (boost::exception const& _e) \ catch (boost::exception const& _e) \
{ \ { \
auto msg = std::string(_message"\n") + boost::diagnostic_information(_e); \ auto msg = std::string(_message " due to an exception thrown by " \
BOOST_FAIL(msg); \ 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 /// 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() /// 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 /// @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 \ do \
{ \ { \
try \ try \
{ \ { \
_expression; \ BOOST_TEST_PASSPOINT(); \
_statement; \
} \ } \
catch (boost::exception const& _e) \ catch (boost::exception const& _e) \
{ \ { \
auto msg = std::string(_message"\n") + boost::diagnostic_information(_e); \ auto msg = std::string(_message " due to an exception thrown by " \
BOOST_MESSAGE(msg); \ 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 class ImportTest

2
test/blockchain.cpp

@ -87,7 +87,7 @@ void doBlockchainTests(json_spirit::mValue& _v, bool _fillin)
// get txs // get txs
TransactionQueue txs; TransactionQueue txs;
GasPricer gp(10000); TrivialGasPricer gp;
BOOST_REQUIRE(blObj.count("transactions")); BOOST_REQUIRE(blObj.count("transactions"));
for (auto const& txObj: blObj["transactions"].get_array()) for (auto const& txObj: blObj["transactions"].get_array())
{ {

176
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" : { "TransactionSendingToEmpty" : {
"env" : { "env" : {
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", "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" : { "TransactionFromCoinbaseHittingBlockGasLimit" : {
"env" : { "env" : {
"currentCoinbase" : "a94f5374fce5edbc8e2a8697c15331677e6ebf0b", "currentCoinbase" : "a94f5374fce5edbc8e2a8697c15331677e6ebf0b",
@ -584,7 +709,7 @@
"pre" : "pre" :
{ {
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
"balance" : "100000", "balance" : "1000000",
"code" : "", "code" : "",
"nonce" : "0", "nonce" : "0",
"storage" : { "storage" : {
@ -811,7 +936,7 @@
} }
}, },
"TransactionCosts555" : { "TransactionDataCosts652" : {
"env" : { "env" : {
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
"currentDifficulty" : "45678256", "currentDifficulty" : "45678256",
@ -916,7 +1041,7 @@
"pre" : "pre" :
{ {
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : { "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
"balance" : "33000", "balance" : "133000",
"code" : "", "code" : "",
"nonce" : "0", "nonce" : "0",
"storage" : { "storage" : {
@ -927,7 +1052,7 @@
{ {
"data" : "0x3240349548983454", "data" : "0x3240349548983454",
"gasLimit" : "32600", "gasLimit" : "32600",
"gasPrice" : "1", "gasPrice" : "0",
"nonce" : "0", "nonce" : "0",
"secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
"to" : "b94f5374fce5edbc8e2a8697c15331677e6ebf0b", "to" : "b94f5374fce5edbc8e2a8697c15331677e6ebf0b",
@ -1089,7 +1214,7 @@
"transaction" : "transaction" :
{ {
"data" : "0x602280600c6000396000f30060e060020a600035048063f8a8fd6d14601457005b601a6020565b60006000f35b56", "data" : "0x602280600c6000396000f30060e060020a600035048063f8a8fd6d14601457005b601a6020565b60006000f35b56",
"gasLimit" : "25000", "gasLimit" : "23679",
"gasPrice" : "1", "gasPrice" : "1",
"nonce" : "0", "nonce" : "0",
"secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
@ -1098,7 +1223,7 @@
} }
}, },
"CreateTransactionWorking" : { "CreateTransactionSuccess" : {
"env" : { "env" : {
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba", "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
"currentDifficulty" : "45678256", "currentDifficulty" : "45678256",
@ -1166,5 +1291,44 @@
"to" : "b94f5374fce5edbc8e2a8697c15331677e6ebf0b", "to" : "b94f5374fce5edbc8e2a8697c15331677e6ebf0b",
"value" : "100" "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"
}
} }
} }

196
test/vmArithmeticTestFiller.json

@ -3535,7 +3535,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -3555,7 +3555,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -3563,7 +3563,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -3583,7 +3583,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -3591,7 +3591,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -3611,7 +3611,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -3619,7 +3619,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -3639,7 +3639,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -3647,7 +3647,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -3667,7 +3667,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -3675,7 +3675,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -3695,7 +3695,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -3703,7 +3703,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -3723,7 +3723,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -3731,7 +3731,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -3751,7 +3751,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -3759,7 +3759,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "100000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -3779,7 +3779,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "10000000"
} }
}, },
@ -3787,7 +3787,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -3807,7 +3807,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -3815,7 +3815,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -3835,7 +3835,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -3843,7 +3843,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -3863,7 +3863,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -3871,7 +3871,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -3891,7 +3891,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -3899,7 +3899,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -3919,7 +3919,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -3927,7 +3927,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -3947,7 +3947,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -3955,7 +3955,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -3975,7 +3975,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -3983,7 +3983,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4003,7 +4003,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4011,7 +4011,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4031,7 +4031,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4039,7 +4039,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4059,7 +4059,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4067,7 +4067,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4087,7 +4087,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4095,7 +4095,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4115,7 +4115,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4123,7 +4123,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4143,7 +4143,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4151,7 +4151,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4171,7 +4171,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4179,7 +4179,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4199,7 +4199,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4207,7 +4207,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4227,7 +4227,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4235,7 +4235,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4255,7 +4255,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4263,7 +4263,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4283,7 +4283,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4291,7 +4291,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4311,7 +4311,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4319,7 +4319,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4339,7 +4339,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4347,7 +4347,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4367,7 +4367,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4375,7 +4375,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4395,7 +4395,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4403,7 +4403,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4423,7 +4423,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4431,7 +4431,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4451,7 +4451,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4459,7 +4459,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4479,7 +4479,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4487,7 +4487,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4507,7 +4507,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4515,7 +4515,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4535,7 +4535,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4543,7 +4543,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4563,7 +4563,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4571,7 +4571,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4591,7 +4591,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4599,7 +4599,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4619,7 +4619,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4627,7 +4627,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4647,7 +4647,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4655,7 +4655,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4675,7 +4675,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4683,7 +4683,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4703,7 +4703,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4711,7 +4711,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4731,7 +4731,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4739,7 +4739,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4759,7 +4759,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4767,7 +4767,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4787,7 +4787,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4795,7 +4795,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4815,7 +4815,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4823,7 +4823,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4843,7 +4843,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4851,7 +4851,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4871,7 +4871,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
}, },
@ -4879,7 +4879,7 @@
"env" : { "env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6", "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0", "currentNumber" : "0",
"currentGasLimit" : "1000000", "currentGasLimit" : "10000000",
"currentDifficulty" : "256", "currentDifficulty" : "256",
"currentTimestamp" : "1", "currentTimestamp" : "1",
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@ -4899,7 +4899,7 @@
"value" : "1000000000000000000", "value" : "1000000000000000000",
"data" : "", "data" : "",
"gasPrice" : "100000000000000", "gasPrice" : "100000000000000",
"gas" : "100000" "gas" : "1000000"
} }
} }
} }

Loading…
Cancel
Save