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