diff --git a/alethzero/MainWin.h b/alethzero/MainWin.h
index 193f8e364..efff89d2b 100644
--- a/alethzero/MainWin.h
+++ b/alethzero/MainWin.h
@@ -238,7 +238,7 @@ private:
void installNameRegWatch();
void installBalancesWatch();
- virtual void timerEvent(QTimerEvent*);
+ virtual void timerEvent(QTimerEvent*) override;
void refreshNetwork();
void refreshMining();
diff --git a/alethzero/NatspecHandler.h b/alethzero/NatspecHandler.h
index 7aeafec41..241df4e06 100644
--- a/alethzero/NatspecHandler.h
+++ b/alethzero/NatspecHandler.h
@@ -39,17 +39,17 @@ class NatspecHandler: public NatSpecFace
~NatspecHandler();
/// Stores locally in a levelDB a key value pair of contract code hash to natspec documentation
- void add(dev::h256 const& _contractHash, std::string const& _doc);
+ virtual void add(dev::h256 const& _contractHash, std::string const& _doc) override;
/// Retrieves the natspec documentation as a string given a contract code hash
std::string retrieve(dev::h256 const& _contractHash) const override;
/// Given a json natspec string and the transaction data return the user notice
- std::string getUserNotice(std::string const& json, const dev::bytes& _transactionData);
+ virtual std::string getUserNotice(std::string const& json, const dev::bytes& _transactionData) override;
/// Given a contract code hash and the transaction's data retrieve the natspec documention's
/// user notice for that transaction.
/// @returns The user notice or an empty string if no natspec for the contract exists
/// or if the existing natspec does not document the @c _methodName
- std::string getUserNotice(dev::h256 const& _contractHash, dev::bytes const& _transactionDacta);
+ virtual std::string getUserNotice(dev::h256 const& _contractHash, dev::bytes const& _transactionDacta) override;
private:
ldb::ReadOptions m_readOptions;
diff --git a/eth/main.cpp b/eth/main.cpp
index 7a85141f4..2c5d938aa 100644
--- a/eth/main.cpp
+++ b/eth/main.cpp
@@ -125,6 +125,7 @@ void help()
<< " --session-sign-key
Sign all transactions with the key of the given address for this session only." << endl
<< " --master Give the master password for the key store." << endl
<< " --password Give a password for a private key." << endl
+ << " --sentinel Set the sentinel for reporting bad blocks or chain issues." << endl
<< endl
<< "Client transacting:" << endl
/*<< " -B,--block-fees Set the block fee profit in the reference unit e.g. ยข (default: 15)." << endl
@@ -137,6 +138,7 @@ void help()
<< " -a,--address Set the coinbase (mining payout) address to addr (default: auto)." << endl
<< " -m,--mining Enable mining, optionally for a specified number of blocks (default: off)" << endl
<< " -f,--force-mining Mine even when there are no transactions to mine (default: off)" << endl
+ << " --mine-on-wrong-chain Mine even when we know it's the wrong chain (default: off)" << endl
<< " -C,--cpu When mining, use the CPU." << endl
<< " -G,--opencl When mining use the GPU via OpenCL." << endl
<< " --opencl-platform When mining using -G/--opencl use OpenCL platform n (default: 0)." << endl
@@ -278,6 +280,7 @@ int main(int argc, char** argv)
bool upnp = true;
WithExisting killChain = WithExisting::Trust;
bool jit = false;
+ string sentinel;
/// Networking params.
string clientName;
@@ -293,6 +296,7 @@ int main(int argc, char** argv)
/// Mining params
unsigned mining = 0;
bool forceMining = false;
+ bool mineOnWrongChain = false;
Address signingKey;
Address sessionKey;
Address beneficiary = signingKey;
@@ -375,6 +379,10 @@ int main(int argc, char** argv)
mode = OperationMode::Export;
filename = argv[++i];
}
+ else if (arg == "--sentinel" && i + 1 < argc)
+ sentinel = argv[++i];
+ else if (arg == "--mine-on-wrong-chain")
+ mineOnWrongChain = true;
else if (arg == "--format" && i + 1 < argc)
{
string m = argv[++i];
@@ -670,6 +678,8 @@ int main(int argc, char** argv)
nodeMode == NodeMode::Full ? set{"eth"/*, "shh"*/} : set(),
netPrefs,
&nodesState);
+ web3.ethereum()->setMineOnBadChain(mineOnWrongChain);
+ web3.ethereum()->setSentinel(sentinel);
auto toNumber = [&](string const& s) -> unsigned {
if (s == "latest")
diff --git a/ethminer/CMakeLists.txt b/ethminer/CMakeLists.txt
index d364f6ed1..3ec92fc14 100644
--- a/ethminer/CMakeLists.txt
+++ b/ethminer/CMakeLists.txt
@@ -5,7 +5,10 @@ aux_source_directory(. SRC_LIST)
include_directories(BEFORE ..)
include_directories(${Boost_INCLUDE_DIRS})
+if (JSONRPC)
+include_directories(BEFORE ${JSONCPP_INCLUDE_DIRS})
include_directories(${JSON_RPC_CPP_INCLUDE_DIRS})
+endif()
set(EXECUTABLE ethminer)
@@ -19,10 +22,6 @@ target_link_libraries(${EXECUTABLE} ${Boost_REGEX_LIBRARIES})
if (JSONRPC)
target_link_libraries(${EXECUTABLE} ${JSON_RPC_CPP_CLIENT_LIBRARIES})
- target_link_libraries(${EXECUTABLE} ${CURL_LIBRARIES})
- if (DEFINED WIN32 AND NOT DEFINED CMAKE_COMPILER_IS_MINGW)
- eth_copy_dlls(${EXECUTABLE} CURL_DLLS)
- endif()
endif()
target_link_libraries(${EXECUTABLE} ethcore)
diff --git a/ethminer/MinerAux.h b/ethminer/MinerAux.h
index 6a42dd774..245b97ceb 100644
--- a/ethminer/MinerAux.h
+++ b/ethminer/MinerAux.h
@@ -127,6 +127,11 @@ public:
cerr << "Bad " << arg << " option: " << argv[i] << endl;
throw BadArgument();
}
+ else if (arg == "--list-devices")
+ {
+ ProofOfWork::GPUMiner::listDevices();
+ exit(0);
+ }
else if (arg == "--use-chunks")
{
dagChunks = 4;
@@ -175,7 +180,7 @@ public:
m_minerType = MinerType::CPU;
else if (arg == "-G" || arg == "--opencl")
{
- if (!ProofOfWork::GPUMiner::haveSufficientGPUMemory())
+ if (!ProofOfWork::GPUMiner::haveSufficientMemory())
{
cout << "No GPU device with sufficient memory was found. Defaulting to CPU" << endl;
m_minerType = MinerType::CPU;
diff --git a/json_spirit/json_spirit_writer_template.h b/json_spirit/json_spirit_writer_template.h
index dbd0f45da..5376ef476 100644
--- a/json_spirit/json_spirit_writer_template.h
+++ b/json_spirit/json_spirit_writer_template.h
@@ -25,13 +25,9 @@ namespace json_spirit
return 'A' - 10 + ch;
}
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-local-typedefs")
template< class String_type >
String_type non_printable_to_string( unsigned int c )
{
- typedef typename String_type::value_type Char_type;
-
String_type result( 6, '\\' );
result[1] = 'u';
@@ -43,7 +39,6 @@ namespace json_spirit
return result;
}
-#pragma GCC diagnostic pop
template< typename Char_type, class String_type >
bool add_esc_char( Char_type c, String_type& s )
diff --git a/libdevcore/Exceptions.h b/libdevcore/Exceptions.h
index 025568efa..7d6fae77c 100644
--- a/libdevcore/Exceptions.h
+++ b/libdevcore/Exceptions.h
@@ -30,7 +30,8 @@
namespace dev
{
-// base class for all exceptions
+
+/// Base class for all exceptions.
struct Exception: virtual std::exception, virtual boost::exception
{
Exception(std::string _message = std::string()): m_message(std::move(_message)) {}
@@ -40,20 +41,26 @@ private:
std::string m_message;
};
-struct BadHexCharacter: virtual Exception {};
-struct RLPException: virtual Exception {};
-struct BadCast: virtual RLPException {};
-struct BadRLP: virtual RLPException {};
-struct OversizeRLP: virtual RLPException {};
-struct UndersizeRLP: virtual RLPException {};
-struct NoNetworking: virtual Exception {};
-struct NoUPnPDevice: virtual Exception {};
-struct RootNotFound: virtual Exception {};
-struct BadRoot: virtual Exception {};
-struct FileError: virtual Exception {};
-struct Overflow: virtual Exception {};
+#define DEV_SIMPLE_EXCEPTION(X) struct X: virtual Exception { public: X(): Exception(#X) {} }
+
+/// Base class for all RLP exceptions.
+struct RLPException: virtual Exception { RLPException(std::string _message = std::string()): Exception(_message) {} };
+#define DEV_SIMPLE_EXCEPTION_RLP(X) struct X: virtual RLPException { public: X(): RLPException(#X) {} }
+
+DEV_SIMPLE_EXCEPTION_RLP(BadCast);
+DEV_SIMPLE_EXCEPTION_RLP(BadRLP);
+DEV_SIMPLE_EXCEPTION_RLP(OversizeRLP);
+DEV_SIMPLE_EXCEPTION_RLP(UndersizeRLP);
+
+DEV_SIMPLE_EXCEPTION(BadHexCharacter);
+DEV_SIMPLE_EXCEPTION(NoNetworking);
+DEV_SIMPLE_EXCEPTION(NoUPnPDevice);
+DEV_SIMPLE_EXCEPTION(RootNotFound);
+DEV_SIMPLE_EXCEPTION(BadRoot);
+DEV_SIMPLE_EXCEPTION(FileError);
+DEV_SIMPLE_EXCEPTION(Overflow);
+DEV_SIMPLE_EXCEPTION(FailedInvariant);
struct InterfaceNotSupported: virtual Exception { public: InterfaceNotSupported(std::string _f): Exception("Interface " + _f + " not supported.") {} };
-struct FailedInvariant: virtual Exception {};
struct ExternalFunctionFailure: virtual Exception { public: ExternalFunctionFailure(std::string _f): Exception("Function " + _f + "() failed.") {} };
// error information to be added to exceptions
@@ -66,5 +73,7 @@ using errinfo_min = boost::error_info;
using errinfo_max = boost::error_info;
using RequirementError = boost::tuple;
using errinfo_hash256 = boost::error_info;
-using HashMismatchError = boost::tuple;
+using errinfo_required_h256 = boost::error_info;
+using errinfo_got_h256 = boost::error_info;
+using Hash256RequirementError = boost::tuple;
}
diff --git a/libdevcore/Log.cpp b/libdevcore/Log.cpp
index f28a2c6b9..1e5c2d8ab 100644
--- a/libdevcore/Log.cpp
+++ b/libdevcore/Log.cpp
@@ -40,6 +40,14 @@ mutex x_logOverride;
/// or equal to the currently output verbosity (g_logVerbosity).
static map s_logOverride;
+bool isLogVisible(std::type_info const* _ch, bool _default)
+{
+ Guard l(x_logOverride);
+ if (s_logOverride.count(_ch))
+ return s_logOverride[_ch];
+ return _default;
+}
+
LogOverrideAux::LogOverrideAux(std::type_info const* _ch, bool _value):
m_ch(_ch)
{
diff --git a/libdevcore/Log.h b/libdevcore/Log.h
index ce0db17fe..e732ac73c 100644
--- a/libdevcore/Log.h
+++ b/libdevcore/Log.h
@@ -73,6 +73,9 @@ public:
LogOverride(bool _value): LogOverrideAux(&typeid(Channel), _value) {}
};
+bool isChannelVisible(std::type_info const* _ch, bool _default);
+template bool isChannelVisible() { return isChannelVisible(&typeid(Channel), Channel::verbosity <= g_logVerbosity); }
+
/// Temporary changes system's verbosity for specific function. Restores the old verbosity when function returns.
/// Not thread-safe, use with caution!
struct VerbosityHolder
diff --git a/libdevcrypto/Common.cpp b/libdevcrypto/Common.cpp
index e68381427..4ebd6a04b 100644
--- a/libdevcrypto/Common.cpp
+++ b/libdevcrypto/Common.cpp
@@ -54,7 +54,7 @@ Public dev::toPublic(Secret const& _secret)
{
Public p;
s_secp256k1.toPublic(_secret, p);
- return std::move(p);
+ return p;
}
Address dev::toAddress(Public const& _public)
@@ -230,7 +230,7 @@ h256 crypto::kdf(Secret const& _priv, h256 const& _hash)
if (!s || !_hash || !_priv)
BOOST_THROW_EXCEPTION(InvalidState());
- return std::move(s);
+ return s;
}
h256 Nonce::get(bool _commit)
diff --git a/libdevcrypto/CryptoPP.cpp b/libdevcrypto/CryptoPP.cpp
index b701fed8d..9b550a666 100644
--- a/libdevcrypto/CryptoPP.cpp
+++ b/libdevcrypto/CryptoPP.cpp
@@ -61,7 +61,7 @@ bytes Secp256k1::eciesKDF(Secret _z, bytes _s1, unsigned kdByteLen)
}
k.resize(kdByteLen);
- return move(k);
+ return k;
}
void Secp256k1::encryptECIES(Public const& _k, bytes& io_cipher)
diff --git a/libdevcrypto/CryptoPP.h b/libdevcrypto/CryptoPP.h
index ca8a2e6b5..377da8754 100644
--- a/libdevcrypto/CryptoPP.h
+++ b/libdevcrypto/CryptoPP.h
@@ -59,7 +59,7 @@ namespace crypto
using namespace CryptoPP;
-inline ECP::Point publicToPoint(Public const& _p) { Integer x(_p.data(), 32); Integer y(_p.data() + 32, 32); return std::move(ECP::Point(x,y)); }
+inline ECP::Point publicToPoint(Public const& _p) { Integer x(_p.data(), 32); Integer y(_p.data() + 32, 32); return ECP::Point(x,y); }
inline Integer secretToExponent(Secret const& _s) { return std::move(Integer(_s.data(), Secret::size)); }
diff --git a/libdevcrypto/OverlayDB.cpp b/libdevcrypto/OverlayDB.cpp
index 80c901635..05b9877ad 100644
--- a/libdevcrypto/OverlayDB.cpp
+++ b/libdevcrypto/OverlayDB.cpp
@@ -95,7 +95,7 @@ bytes OverlayDB::lookupAux(h256 const& _h) const
{
bytes ret = MemoryDB::lookupAux(_h);
if (!ret.empty() || !m_db)
- return move(ret);
+ return ret;
std::string v;
bytes b = _h.asBytes();
b.push_back(255); // for aux
@@ -116,7 +116,7 @@ std::string OverlayDB::lookup(h256 const& _h) const
std::string ret = MemoryDB::lookup(_h);
if (ret.empty() && m_db)
m_db->Get(m_readOptions, ldb::Slice((char const*)_h.data(), 32), &ret);
- return move(ret);
+ return ret;
}
bool OverlayDB::exists(h256 const& _h) const
diff --git a/libethash-cl/ethash_cl_miner.cpp b/libethash-cl/ethash_cl_miner.cpp
index f501d9642..2bdcfcd9a 100644
--- a/libethash-cl/ethash_cl_miner.cpp
+++ b/libethash-cl/ethash_cl_miner.cpp
@@ -127,7 +127,7 @@ unsigned ethash_cl_miner::get_num_devices(unsigned _platformId)
return devices.size();
}
-bool ethash_cl_miner::haveSufficientGPUMemory(unsigned _platformId)
+bool ethash_cl_miner::haveSufficientGPUMemory()
{
std::vector platforms;
cl::Platform::get(&platforms);
@@ -136,15 +136,25 @@ bool ethash_cl_miner::haveSufficientGPUMemory(unsigned _platformId)
ETHCL_LOG("No OpenCL platforms found.");
return false;
}
+ for (unsigned i = 0; i < platforms.size(); ++i)
+ if (haveSufficientGPUMemory(i))
+ return true;
+
+ return false;
+}
+
+bool ethash_cl_miner::haveSufficientGPUMemory(unsigned _platformId)
+{
+ std::vector platforms;
+ cl::Platform::get(&platforms);
+ if (_platformId >= platforms.size())
+ return false;
std::vector devices;
unsigned platform_num = std::min(_platformId, platforms.size() - 1);
platforms[platform_num].getDevices(CL_DEVICE_TYPE_ALL, &devices);
if (devices.empty())
- {
- ETHCL_LOG("No OpenCL devices found.");
return false;
- }
for (cl::Device const& device: devices)
{
@@ -168,6 +178,39 @@ bool ethash_cl_miner::haveSufficientGPUMemory(unsigned _platformId)
return false;
}
+void ethash_cl_miner::listDevices()
+{
+ std::vector platforms;
+ cl::Platform::get(&platforms);
+ if (platforms.empty())
+ {
+ ETHCL_LOG("No OpenCL platforms found.");
+ return;
+ }
+ for (unsigned i = 0; i < platforms.size(); ++i)
+ listDevices(i);
+}
+
+void ethash_cl_miner::listDevices(unsigned _platformId)
+{
+ std::vector platforms;
+ cl::Platform::get(&platforms);
+ if (_platformId >= platforms.size())
+ return;
+
+ std::string outString ="Listing OpenCL devices for platform " + to_string(_platformId) + "\n[deviceID] deviceName\n";
+ std::vector devices;
+ platforms[_platformId].getDevices(CL_DEVICE_TYPE_ALL, &devices);
+ unsigned i = 0;
+ std::string deviceString;
+ for (cl::Device const& device: devices)
+ {
+ outString += "[" + to_string(i) + "] " + device.getInfo() + "\n";
+ ++i;
+ }
+ ETHCL_LOG(outString);
+}
+
void ethash_cl_miner::finish()
{
if (m_queue())
diff --git a/libethash-cl/ethash_cl_miner.h b/libethash-cl/ethash_cl_miner.h
index cdc4cf07f..4d5317186 100644
--- a/libethash-cl/ethash_cl_miner.h
+++ b/libethash-cl/ethash_cl_miner.h
@@ -35,7 +35,10 @@ public:
static unsigned get_num_platforms();
static unsigned get_num_devices(unsigned _platformId = 0);
static std::string platform_info(unsigned _platformId = 0, unsigned _deviceId = 0);
- static bool haveSufficientGPUMemory(unsigned _platformId = 0);
+ static bool haveSufficientGPUMemory();
+ static bool haveSufficientGPUMemory(unsigned _platformId);
+ static void listDevices();
+ static void listDevices(unsigned _platformId);
bool init(
uint8_t const* _dag,
diff --git a/libethcore/BlockInfo.cpp b/libethcore/BlockInfo.cpp
index 0e125b607..69da52b09 100644
--- a/libethcore/BlockInfo.cpp
+++ b/libethcore/BlockInfo.cpp
@@ -139,7 +139,6 @@ void BlockInfo::populateFromHeader(RLP const& _header, Strictness _s, h256 const
mixHash = _header[field = 13].toHash(RLP::VeryStrict);
nonce = _header[field = 14].toHash(RLP::VeryStrict);
}
-
catch (Exception const& _e)
{
_e << errinfo_name("invalid block header format") << BadFieldError(field, toHex(_header[field].data().toBytes()));
@@ -151,9 +150,26 @@ void BlockInfo::populateFromHeader(RLP const& _header, Strictness _s, h256 const
// check it hashes according to proof of work or that it's the genesis block.
if (_s == CheckEverything && parentHash && !ProofOfWork::verify(*this))
- BOOST_THROW_EXCEPTION(InvalidBlockNonce() << errinfo_hash256(headerHash(WithoutNonce)) << errinfo_nonce(nonce) << errinfo_difficulty(difficulty));
+ {
+ InvalidBlockNonce ex;
+ ex << errinfo_hash256(headerHash(WithoutNonce));
+ ex << errinfo_nonce(nonce);
+ ex << errinfo_difficulty(difficulty);
+ ex << errinfo_seedHash(seedHash());
+ ex << errinfo_target(boundary());
+ ex << errinfo_mixHash(mixHash);
+ Ethash::Result er = EthashAux::eval(seedHash(), headerHash(WithoutNonce), nonce);
+ ex << errinfo_ethashResult(make_tuple(er.value, er.mixHash));
+ BOOST_THROW_EXCEPTION(ex);
+ }
else if (_s == QuickNonce && parentHash && !ProofOfWork::preVerify(*this))
- BOOST_THROW_EXCEPTION(InvalidBlockNonce() << errinfo_hash256(headerHash(WithoutNonce)) << errinfo_nonce(nonce) << errinfo_difficulty(difficulty));
+ {
+ InvalidBlockNonce ex;
+ ex << errinfo_hash256(headerHash(WithoutNonce));
+ ex << errinfo_nonce(nonce);
+ ex << errinfo_difficulty(difficulty);
+ BOOST_THROW_EXCEPTION(ex);
+ }
if (_s != CheckNothing)
{
@@ -224,7 +240,7 @@ void BlockInfo::verifyInternals(bytesConstRef _block) const
for (auto const& t: txs)
cdebug << toHex(t);
- BOOST_THROW_EXCEPTION(InvalidTransactionsHash() << HashMismatchError(expectedRoot, transactionsRoot));
+ BOOST_THROW_EXCEPTION(InvalidTransactionsRoot() << Hash256RequirementError(expectedRoot, transactionsRoot));
}
clog(BlockInfoDiagnosticsChannel) << "Expected uncle hash:" << toString(sha3(root[2].data()));
if (sha3Uncles != sha3(root[2].data()))
diff --git a/libethcore/Ethash.cpp b/libethcore/Ethash.cpp
index 0ea09a5bc..f715d6912 100644
--- a/libethcore/Ethash.cpp
+++ b/libethcore/Ethash.cpp
@@ -364,11 +364,6 @@ void Ethash::GPUMiner::pause()
stopWorking();
}
-bool Ethash::GPUMiner::haveSufficientGPUMemory()
-{
- return ethash_cl_miner::haveSufficientGPUMemory(s_platformId);
-}
-
std::string Ethash::GPUMiner::platformInfo()
{
return ethash_cl_miner::platform_info(s_platformId, s_deviceId);
@@ -379,6 +374,16 @@ unsigned Ethash::GPUMiner::getNumDevices()
return ethash_cl_miner::get_num_devices(s_platformId);
}
+void Ethash::GPUMiner::listDevices()
+{
+ return ethash_cl_miner::listDevices();
+}
+
+bool Ethash::GPUMiner::haveSufficientMemory()
+{
+ return ethash_cl_miner::haveSufficientGPUMemory();
+}
+
#endif
}
diff --git a/libethcore/Ethash.h b/libethcore/Ethash.h
index 68c21c609..99df1dc71 100644
--- a/libethcore/Ethash.h
+++ b/libethcore/Ethash.h
@@ -87,10 +87,11 @@ public:
static unsigned instances() { return s_numInstances > 0 ? s_numInstances : std::thread::hardware_concurrency(); }
static std::string platformInfo();
- static bool haveSufficientGPUMemory() { return false; }
static void setDefaultPlatform(unsigned) {}
static void setDagChunks(unsigned) {}
static void setDefaultDevice(unsigned) {}
+ static void listDevices() {}
+ static bool haveSufficientMemory() { return false; }
static void setNumInstances(unsigned _instances) { s_numInstances = std::min(_instances, std::thread::hardware_concurrency()); }
protected:
void kickOff() override
@@ -117,8 +118,9 @@ public:
static unsigned instances() { return s_numInstances > 0 ? s_numInstances : 1; }
static std::string platformInfo();
- static bool haveSufficientGPUMemory();
static unsigned getNumDevices();
+ static void listDevices();
+ static bool haveSufficientMemory();
static void setDefaultPlatform(unsigned _id) { s_platformId = _id; }
static void setDefaultDevice(unsigned _id) { s_deviceId = _id; }
static void setNumInstances(unsigned _instances) { s_numInstances = std::min(_instances, getNumDevices()); }
diff --git a/libethcore/Exceptions.h b/libethcore/Exceptions.h
index 9362e4fed..b411ea416 100644
--- a/libethcore/Exceptions.h
+++ b/libethcore/Exceptions.h
@@ -35,46 +35,45 @@ using errinfo_field = boost::error_info;
using errinfo_data = boost::error_info;
using errinfo_nonce = boost::error_info;
using errinfo_difficulty = boost::error_info;
+using errinfo_target = boost::error_info;
+using errinfo_seedHash = boost::error_info;
+using errinfo_mixHash = boost::error_info;
+using errinfo_ethashResult = boost::error_info>;
using BadFieldError = boost::tuple;
-struct DatabaseAlreadyOpen: virtual dev::Exception {};
-struct OutOfGasBase: virtual dev::Exception {};
-struct NotEnoughAvailableSpace: virtual dev::Exception {};
-struct NotEnoughCash: virtual dev::Exception {};
-struct GasPriceTooLow: virtual dev::Exception {};
-struct BlockGasLimitReached: virtual dev::Exception {};
-struct NoSuchContract: virtual dev::Exception {};
-struct ContractAddressCollision: virtual dev::Exception {};
-struct FeeTooSmall: virtual dev::Exception {};
-struct TooMuchGasUsed: virtual dev::Exception {};
-struct ExtraDataTooBig: virtual dev::Exception {};
-struct InvalidSignature: virtual dev::Exception {};
-struct InvalidBlockFormat: virtual dev::Exception {};
-struct InvalidUnclesHash: virtual dev::Exception {};
-struct InvalidUncle: virtual dev::Exception {};
-struct TooManyUncles: virtual dev::Exception {};
-struct UncleTooOld: virtual dev::Exception {};
-struct UncleIsBrother: virtual dev::Exception {};
-struct UncleInChain: virtual dev::Exception {};
-struct DuplicateUncleNonce: virtual dev::Exception {};
-struct InvalidStateRoot: virtual dev::Exception {};
-struct InvalidGasUsed: virtual dev::Exception {};
-struct InvalidTransactionsHash: virtual dev::Exception {};
-struct InvalidTransaction: virtual dev::Exception {};
-struct InvalidDifficulty: virtual dev::Exception {};
-struct InvalidGasLimit: virtual dev::Exception {};
-struct InvalidTransactionGasUsed: virtual dev::Exception {};
-struct InvalidTransactionsStateRoot: virtual dev::Exception {};
-struct InvalidReceiptsStateRoot: virtual dev::Exception {};
-struct InvalidTimestamp: virtual dev::Exception {};
-struct InvalidLogBloom: virtual dev::Exception {};
-struct InvalidNonce: virtual dev::Exception {};
-struct InvalidBlockHeaderItemCount: virtual dev::Exception {};
-struct InvalidBlockNonce: virtual dev::Exception {};
-struct InvalidParentHash: virtual dev::Exception {};
-struct InvalidNumber: virtual dev::Exception {};
-struct InvalidContractAddress: virtual public dev::Exception {};
-struct DAGCreationFailure: virtual public dev::Exception {};
-struct DAGComputeFailure: virtual public dev::Exception {};
+DEV_SIMPLE_EXCEPTION(OutOfGasBase);
+DEV_SIMPLE_EXCEPTION(OutOfGasIntrinsic);
+DEV_SIMPLE_EXCEPTION(NotEnoughAvailableSpace);
+DEV_SIMPLE_EXCEPTION(NotEnoughCash);
+DEV_SIMPLE_EXCEPTION(GasPriceTooLow);
+DEV_SIMPLE_EXCEPTION(BlockGasLimitReached);
+DEV_SIMPLE_EXCEPTION(FeeTooSmall);
+DEV_SIMPLE_EXCEPTION(TooMuchGasUsed);
+DEV_SIMPLE_EXCEPTION(ExtraDataTooBig);
+DEV_SIMPLE_EXCEPTION(InvalidSignature);
+DEV_SIMPLE_EXCEPTION(InvalidBlockFormat);
+DEV_SIMPLE_EXCEPTION(InvalidUnclesHash);
+DEV_SIMPLE_EXCEPTION(TooManyUncles);
+DEV_SIMPLE_EXCEPTION(UncleTooOld);
+DEV_SIMPLE_EXCEPTION(UncleIsBrother);
+DEV_SIMPLE_EXCEPTION(UncleInChain);
+DEV_SIMPLE_EXCEPTION(InvalidStateRoot);
+DEV_SIMPLE_EXCEPTION(InvalidGasUsed);
+DEV_SIMPLE_EXCEPTION(InvalidTransactionsRoot);
+DEV_SIMPLE_EXCEPTION(InvalidDifficulty);
+DEV_SIMPLE_EXCEPTION(InvalidGasLimit);
+DEV_SIMPLE_EXCEPTION(InvalidReceiptsStateRoot);
+DEV_SIMPLE_EXCEPTION(InvalidTimestamp);
+DEV_SIMPLE_EXCEPTION(InvalidLogBloom);
+DEV_SIMPLE_EXCEPTION(InvalidNonce);
+DEV_SIMPLE_EXCEPTION(InvalidBlockHeaderItemCount);
+DEV_SIMPLE_EXCEPTION(InvalidBlockNonce);
+DEV_SIMPLE_EXCEPTION(InvalidParentHash);
+DEV_SIMPLE_EXCEPTION(InvalidNumber);
+
+DEV_SIMPLE_EXCEPTION(DatabaseAlreadyOpen);
+DEV_SIMPLE_EXCEPTION(DAGCreationFailure);
+DEV_SIMPLE_EXCEPTION(DAGComputeFailure);
+
}
}
diff --git a/libethereum/BlockChain.cpp b/libethereum/BlockChain.cpp
index 67e42d7c8..3838dd362 100644
--- a/libethereum/BlockChain.cpp
+++ b/libethereum/BlockChain.cpp
@@ -331,9 +331,18 @@ tuple BlockChain::sync(BlockQueue& _bq, OverlayDB const& _st
// Can't continue - chain bad.
badBlocks.push_back(block.first.hash());
}
- catch (Exception const& _e)
+ catch (dev::eth::FutureTime)
{
- cnote << "Exception while importing block. Someone (Jeff? That you?) seems to be giving us dodgy blocks!" << LogTag::Error << diagnostic_information(_e);
+ cwarn << "ODD: Import queue contains a block with future time." << LogTag::Error << boost::current_exception_diagnostic_information();
+ // NOTE: don't reimport since the queue should guarantee everything in the past.
+ // Can't continue - chain bad.
+ badBlocks.push_back(block.first.hash());
+ }
+ catch (Exception& ex)
+ {
+ cnote << "Exception while importing block. Someone (Jeff? That you?) seems to be giving us dodgy blocks!" << LogTag::Error << diagnostic_information(ex);
+ if (m_onBad)
+ m_onBad(ex);
// NOTE: don't reimport since the queue should guarantee everything in the right order.
// Can't continue - chain bad.
badBlocks.push_back(block.first.hash());
@@ -360,8 +369,10 @@ pair BlockChain::attemptImport(bytes const& _block, O
{
return make_pair(ImportResult::FutureTime, make_pair(h256s(), h256s()));
}
- catch (...)
+ catch (Exception& ex)
{
+ if (m_onBad)
+ m_onBad(ex);
return make_pair(ImportResult::Malformed, make_pair(h256s(), h256s()));
}
}
@@ -379,10 +390,11 @@ ImportRoute BlockChain::import(bytes const& _block, OverlayDB const& _db, Import
bi.verifyInternals(&_block);
}
#if ETH_CATCH
- catch (Exception const& _e)
+ catch (Exception& ex)
{
- clog(BlockChainNote) << " Malformed block: " << diagnostic_information(_e);
- _e << errinfo_comment("Malformed block ");
+ clog(BlockChainNote) << " Malformed block: " << diagnostic_information(ex);
+ ex << errinfo_now(time(0));
+ ex << errinfo_block(_block);
throw;
}
#endif
@@ -470,14 +482,8 @@ ImportRoute BlockChain::import(BlockInfo const& _bi, bytes const& _block, Overla
blb.blooms.push_back(s.receipt(i).bloom());
br.receipts.push_back(s.receipt(i));
}
- try {
- s.cleanup(true);
- }
- catch (BadRoot)
- {
- cwarn << "BadRoot error. Retrying import later.";
- BOOST_THROW_EXCEPTION(FutureTime());
- }
+
+ s.cleanup(true);
td = pd.totalDifficulty + tdIncrease;
@@ -520,20 +526,20 @@ ImportRoute BlockChain::import(BlockInfo const& _bi, bytes const& _block, Overla
#endif
}
#if ETH_CATCH
- catch (InvalidNonce const& _e)
+ catch (BadRoot& ex)
{
- clog(BlockChainNote) << " Malformed block: " << diagnostic_information(_e);
- _e << errinfo_comment("Malformed block ");
- throw;
+ cwarn << "BadRoot error. Retrying import later.";
+ BOOST_THROW_EXCEPTION(FutureTime());
}
- catch (Exception const& _e)
+ catch (Exception& ex)
{
- clog(BlockChainWarn) << " Malformed block: " << diagnostic_information(_e);
- _e << errinfo_comment("Malformed block ");
+ clog(BlockChainWarn) << " Malformed block: " << diagnostic_information(ex);
clog(BlockChainWarn) << "Block: " << _bi.hash();
clog(BlockChainWarn) << _bi;
clog(BlockChainWarn) << "Block parent: " << _bi.parentHash;
clog(BlockChainWarn) << BlockInfo(block(_bi.parentHash));
+ ex << errinfo_now(time(0));
+ ex << errinfo_block(_block);
throw;
}
#endif
diff --git a/libethereum/BlockChain.h b/libethereum/BlockChain.h
index a67ec9a9c..06a22e27b 100644
--- a/libethereum/BlockChain.h
+++ b/libethereum/BlockChain.h
@@ -256,6 +256,9 @@ public:
/// Deallocate unused data.
void garbageCollect(bool _force = false);
+ /// Change the function that is called with a bad block.
+ template void setOnBad(T const& _t) { m_onBad = _t; }
+
private:
static h256 chunkId(unsigned _level, unsigned _index) { return h256(_index * 0xff + _level); }
@@ -335,6 +338,8 @@ private:
ldb::ReadOptions m_readOptions;
ldb::WriteOptions m_writeOptions;
+ std::function m_onBad; ///< Called if we have a block that doesn't verify.
+
friend std::ostream& operator<<(std::ostream& _out, BlockChain const& _bc);
};
diff --git a/libethereum/BlockQueue.cpp b/libethereum/BlockQueue.cpp
index 360bf915e..07c9ba090 100644
--- a/libethereum/BlockQueue.cpp
+++ b/libethereum/BlockQueue.cpp
@@ -26,6 +26,7 @@
#include
#include
#include "BlockChain.h"
+#include "State.h"
using namespace std;
using namespace dev;
using namespace dev::eth;
@@ -76,56 +77,44 @@ void BlockQueue::verifierBody()
std::pair res;
swap(work.second, res.second);
- try {
- try {
+ try
+ {
+ try
+ {
res.first.populate(res.second, CheckEverything, work.first);
res.first.verifyInternals(&res.second);
}
- catch (InvalidBlockNonce&)
- {
- badBlock(res.second, "Invalid block nonce");
- cwarn << " Nonce:" << res.first.nonce.hex();
- cwarn << " PoWHash:" << res.first.headerHash(WithoutNonce).hex();
- cwarn << " SeedHash:" << res.first.seedHash().hex();
- cwarn << " Target:" << res.first.boundary().hex();
- cwarn << " MixHash:" << res.first.mixHash.hex();
- Ethash::Result er = EthashAux::eval(res.first.seedHash(), res.first.headerHash(WithoutNonce), res.first.nonce);
- cwarn << " Ethash v:" << er.value.hex();
- cwarn << " Ethash mH:" << er.mixHash.hex();
- throw;
- }
- catch (Exception& _e)
+ catch (Exception& ex)
{
- badBlock(res.second, _e.what());
+ clog(BlockChainNote) << " Malformed block: " << diagnostic_information(ex);
+ badBlock(res.second, ex.what());
+ ex << errinfo_now(time(0));
+ ex << errinfo_block(res.second);
+ if (m_onBad)
+ m_onBad(ex);
throw;
}
RLP r(&res.second);
+ unsigned ii = 0;
for (auto const& uncle: r[2])
{
try
{
BlockInfo().populateFromHeader(RLP(uncle.data()), CheckEverything);
}
- catch (InvalidNonce&)
- {
- badBlockHeader(uncle.data(), "Invalid uncle nonce");
- BlockInfo bi = BlockInfo::fromHeader(uncle.data(), CheckNothing);
- cwarn << " Nonce:" << bi.nonce.hex();
- cwarn << " PoWHash:" << bi.headerHash(WithoutNonce).hex();
- cwarn << " SeedHash:" << bi.seedHash().hex();
- cwarn << " Target:" << bi.boundary().hex();
- cwarn << " MixHash:" << bi.mixHash.hex();
- Ethash::Result er = EthashAux::eval(bi.seedHash(), bi.headerHash(WithoutNonce), bi.nonce);
- cwarn << " Ethash v:" << er.value.hex();
- cwarn << " Ethash mH:" << er.mixHash.hex();
- throw;
- }
- catch (Exception& _e)
+ catch (Exception& ex)
{
- badBlockHeader(uncle.data(), _e.what());
+ clog(BlockChainNote) << " Malformed block header: " << diagnostic_information(ex);
+ badBlockHeader(uncle.data(), ex.what());
+ ex << errinfo_uncleIndex(ii);
+ ex << errinfo_now(time(0));
+ ex << errinfo_block(res.second);
+ if (m_onBad)
+ m_onBad(ex);
throw;
}
+ ++ii;
}
}
catch (...)
diff --git a/libethereum/BlockQueue.h b/libethereum/BlockQueue.h
index 45043559b..3a299c5f6 100644
--- a/libethereum/BlockQueue.h
+++ b/libethereum/BlockQueue.h
@@ -110,6 +110,8 @@ public:
template Handler onReady(T const& _t) { return m_onReady.add(_t); }
+ template void setOnBad(T const& _t) { m_onBad = _t; }
+
private:
void noteReady_WITH_LOCK(h256 const& _b);
@@ -134,6 +136,8 @@ private:
std::vector m_verifiers; ///< Threads who only verify.
bool m_deleting = false; ///< Exit condition for verifiers.
+
+ std::function m_onBad; ///< Called if we have a block that doesn't verify.
};
std::ostream& operator<<(std::ostream& _out, BlockQueueStatus const& _s);
diff --git a/libethereum/CMakeLists.txt b/libethereum/CMakeLists.txt
index 8203402cb..7d8f27ee7 100644
--- a/libethereum/CMakeLists.txt
+++ b/libethereum/CMakeLists.txt
@@ -14,6 +14,10 @@ aux_source_directory(. SRC_LIST)
include_directories(BEFORE ..)
include_directories(${LEVELDB_INCLUDE_DIRS})
include_directories(${Boost_INCLUDE_DIRS})
+if (JSONRPC)
+include_directories(BEFORE ${JSONCPP_INCLUDE_DIRS})
+include_directories(${JSON_RPC_CPP_INCLUDE_DIRS})
+endif()
set(EXECUTABLE ethereum)
@@ -30,6 +34,9 @@ target_link_libraries(${EXECUTABLE} ethcore)
target_link_libraries(${EXECUTABLE} ${LEVELDB_LIBRARIES})
target_link_libraries(${EXECUTABLE} ${Boost_REGEX_LIBRARIES})
target_link_libraries(${EXECUTABLE} secp256k1)
+if (JSONRPC)
+ target_link_libraries(${EXECUTABLE} ${JSON_RPC_CPP_CLIENT_LIBRARIES})
+endif()
if (CMAKE_COMPILER_IS_MINGW)
target_link_libraries(${EXECUTABLE} ssp shlwapi)
diff --git a/libethereum/Client.cpp b/libethereum/Client.cpp
index 10481cdf0..1d3539f18 100644
--- a/libethereum/Client.cpp
+++ b/libethereum/Client.cpp
@@ -25,9 +25,16 @@
#include
#include
#include
+#if ETH_JSONRPC || !ETH_TRUE
+#include
+#include
+#endif
#include
#include
#include
+#if ETH_JSONRPC || !ETH_TRUE
+#include "Sentinel.h"
+#endif
#include "Defaults.h"
#include "Executive.h"
#include "EthereumHost.h"
@@ -80,6 +87,101 @@ void VersionChecker::setOk()
}
}
+void Client::onBadBlock(Exception& _ex)
+{
+ // BAD BLOCK!!!
+ bytes const& block = *boost::get_error_info(_ex);
+ if (!&block)
+ {
+ cwarn << "ODD: onBadBlock called but exception has no block in it.";
+ return;
+ }
+
+ badBlock(block, _ex.what());
+ cwarn << boost::diagnostic_information(_ex, true);
+
+#if ETH_JSONRPC || !ETH_TRUE
+ if (!m_sentinel.empty())
+ {
+ Json::Value report;
+
+ report["client"] = "cpp";
+ report["version"] = Version;
+ report["protocolVersion"] = c_protocolVersion;
+ report["databaseVersion"] = c_databaseVersion;
+ report["errortype"] = _ex.what();
+ report["block"] = toHex(block);
+ report["hint"] = Json::Value(Json::objectValue);
+
+ // add the various hints.
+ if (unsigned const* uncleIndex = boost::get_error_info(_ex))
+ {
+ // uncle that failed.
+ report["hints"]["uncleIndex"] = *uncleIndex;
+ }
+ else if (unsigned const* txIndex = boost::get_error_info(_ex))
+ {
+ // transaction that failed.
+ report["hints"]["transactionIndex"] = *txIndex;
+ }
+ else
+ {
+ // general block failure.
+ }
+
+ if (string const* vmtraceJson = boost::get_error_info(_ex))
+ Json::Reader().parse(*vmtraceJson, report["hints"]["vmtrace"]);
+ if (vector const* receipts = boost::get_error_info(_ex))
+ {
+ report["hints"]["receipts"] = Json::arrayValue;
+ for (auto const& r: *receipts)
+ report["hints"]["receipts"].append(toHex(r));
+ }
+ if (h256Hash const* excluded = boost::get_error_info(_ex))
+ {
+ report["hints"]["unclesExcluded"] = Json::arrayValue;
+ for (auto const& r: h256Set() + *excluded)
+ report["hints"]["unclesExcluded"].append(Json::Value(r.hex()));
+ }
+
+#define DEV_HINT_ERRINFO(X) \
+ if (auto const* n = boost::get_error_info(_ex)) \
+ report["hints"][#X] = toString(*n)
+#define DEV_HINT_ERRINFO_HASH(X) \
+ if (auto const* n = boost::get_error_info(_ex)) \
+ report["hints"][#X] = n->hex()
+
+ DEV_HINT_ERRINFO_HASH(hash256);
+ DEV_HINT_ERRINFO(uncleNumber);
+ DEV_HINT_ERRINFO(currentNumber);
+ DEV_HINT_ERRINFO(now);
+ DEV_HINT_ERRINFO(invalidSymbol);
+ DEV_HINT_ERRINFO(wrongAddress);
+ DEV_HINT_ERRINFO(comment);
+ DEV_HINT_ERRINFO(min);
+ DEV_HINT_ERRINFO(max);
+
+ DEV_HINT_ERRINFO(required);
+ DEV_HINT_ERRINFO(got);
+ DEV_HINT_ERRINFO_HASH(required_LogBloom);
+ DEV_HINT_ERRINFO_HASH(got_LogBloom);
+ DEV_HINT_ERRINFO_HASH(required_h256);
+ DEV_HINT_ERRINFO_HASH(got_h256);
+
+ jsonrpc::HttpClient client(m_sentinel);
+ Sentinel rpc(client);
+ try
+ {
+ rpc.eth_badBlock(report);
+ }
+ catch (...)
+ {
+ cwarn << "Error reporting to sentinel. Sure the address" << m_sentinel << "is correct?";
+ }
+ }
+#endif
+}
+
void BasicGasPricer::update(BlockChain const& _bc)
{
unsigned c = 0;
@@ -185,6 +287,8 @@ Client::Client(p2p::Host* _extNet, std::shared_ptr _gp, std::string c
m_lastGetWork = std::chrono::system_clock::now() - chrono::seconds(30);
m_tqReady = m_tq.onReady([=](){ this->onTransactionQueueReady(); }); // TODO: should read m_tq->onReady(thisThread, syncTransactionQueue);
m_bqReady = m_bq.onReady([=](){ this->onBlockQueueReady(); }); // TODO: should read m_bq->onReady(thisThread, syncBlockQueue);
+ m_bq.setOnBad([=](Exception& ex){ this->onBadBlock(ex); });
+ m_bc.setOnBad([=](Exception& ex){ this->onBadBlock(ex); });
m_farm.onSolutionFound([=](ProofOfWork::Solution const& s){ return this->submitWork(s); });
m_gp->update(m_bc);
@@ -206,6 +310,18 @@ Client::~Client()
stopWorking();
}
+static const Address c_canary("0x");
+
+bool Client::isChainBad() const
+{
+ return stateAt(c_canary, 0) != 0;
+}
+
+bool Client::isUpgradeNeeded() const
+{
+ return stateAt(c_canary, 0) == 2;
+}
+
void Client::setNetworkId(u256 _n)
{
if (auto h = m_host.lock())
@@ -448,6 +564,9 @@ ProofOfWork::WorkPackage Client::getWork()
bool oldShould = shouldServeWork();
m_lastGetWork = chrono::system_clock::now();
+ if (!m_mineOnBadChain && isChainBad())
+ return ProofOfWork::WorkPackage();
+
// if this request has made us bother to serve work, prep it now.
if (!oldShould && shouldServeWork())
onPostStateChanged();
@@ -605,11 +724,22 @@ bool Client::remoteActive() const
void Client::onPostStateChanged()
{
- cnote << "Post state changed";
+ cnote << "Post state changed.";
+ rejigMining();
+ m_remoteWorking = false;
+}
- if (m_bq.items().first == 0 && (isMining() || remoteActive()))
+void Client::startMining()
+{
+ m_wouldMine = true;
+ rejigMining();
+}
+
+void Client::rejigMining()
+{
+ if ((wouldMine() || remoteActive()) && !m_bq.items().first && (!isChainBad() || mineOnBadChain()) /*&& (forceMining() || transactionsWaiting())*/)
{
- cnote << "Restarting mining...";
+ cnote << "Rejigging mining...";
DEV_WRITE_GUARDED(x_working)
m_working.commitToMine(m_bc);
DEV_READ_GUARDED(x_working)
@@ -618,20 +748,21 @@ void Client::onPostStateChanged()
m_postMine = m_working;
m_miningInfo = m_postMine.info();
}
- m_farm.setWork(m_miningInfo);
- Ethash::ensurePrecomputed(m_bc.number());
- }
- m_remoteWorking = false;
-}
+ if (m_wouldMine)
+ {
+ m_farm.setWork(m_miningInfo);
+ if (m_turboMining)
+ m_farm.startGPU();
+ else
+ m_farm.startCPU();
-void Client::startMining()
-{
- if (m_turboMining)
- m_farm.startGPU();
- else
- m_farm.startCPU();
- onPostStateChanged();
+ m_farm.setWork(m_miningInfo);
+ Ethash::ensurePrecomputed(m_bc.number());
+ }
+ }
+ if (!m_wouldMine)
+ m_farm.stop();
}
void Client::noteChanged(h256Hash const& _filters)
diff --git a/libethereum/Client.h b/libethereum/Client.h
index adfca38b6..6251fbc9c 100644
--- a/libethereum/Client.h
+++ b/libethereum/Client.h
@@ -143,7 +143,7 @@ public:
ExecutionResult call(Address _dest, bytes const& _data = bytes(), u256 _gas = 125000, u256 _value = 0, u256 _gasPrice = 1 * ether, Address const& _from = Address());
/// Get the remaining gas limit in this block.
- virtual u256 gasLimitRemaining() const { return m_postMine.gasLimitRemaining(); }
+ virtual u256 gasLimitRemaining() const override { return m_postMine.gasLimitRemaining(); }
// [PRIVATE API - only relevant for base clients, not available in general]
dev::eth::State state(unsigned _txi, h256 _block) const;
@@ -161,7 +161,7 @@ public:
// Mining stuff:
- void setAddress(Address _us) { WriteGuard l(x_preMine); m_preMine.setAddress(_us); }
+ virtual void setAddress(Address _us) override { WriteGuard l(x_preMine); m_preMine.setAddress(_us); }
/// Check block validity prior to mining.
bool miningParanoia() const { return m_paranoia; }
@@ -176,14 +176,26 @@ public:
/// Enable/disable GPU mining.
void setTurboMining(bool _enable = true) { m_turboMining = _enable; if (isMining()) startMining(); }
+ /// Check to see if we'd mine on an apparently bad chain.
+ bool mineOnBadChain() const { return m_mineOnBadChain; }
+ /// Set true if you want to mine even when the canary says you're on the wrong chain.
+ void setMineOnBadChain(bool _v) { m_mineOnBadChain = _v; }
+
+ /// @returns true if the canary says that the chain is bad.
+ bool isChainBad() const;
+ /// @returns true if the canary says that the client should be upgraded.
+ bool isUpgradeNeeded() const;
+
/// Start mining.
/// NOT thread-safe - call it & stopMining only from a single thread
void startMining() override;
/// Stop mining.
/// NOT thread-safe
- void stopMining() override { m_farm.stop(); }
+ void stopMining() override { m_wouldMine = false; rejigMining(); }
/// Are we mining now?
bool isMining() const override { return m_farm.isMining(); }
+ /// Are we mining now?
+ bool wouldMine() const override { return m_wouldMine; }
/// The hashrate...
uint64_t hashrate() const override;
/// Check the progress of the mining.
@@ -215,6 +227,8 @@ public:
void retryUnkonwn() { m_bq.retryAllUnknown(); }
/// Get a report of activity.
ActivityReport activityReport() { ActivityReport ret; std::swap(m_report, ret); return ret; }
+ /// Set a JSONRPC server to which we can report bad blocks.
+ void setSentinel(std::string const& _server) { m_sentinel = _server; }
protected:
/// InterfaceStub methods
@@ -251,6 +265,9 @@ private:
/// Called when Worker is exiting.
void doneWorking() override;
+ /// Called when wouldMine(), turboMining(), isChainBad(), forceMining(), pendingTransactions() have changed.
+ void rejigMining();
+
/// Magically called when the chain has changed. An import route is provided.
/// Called by either submitWork() or in our main thread through syncBlockQueue().
void onChainChanged(ImportRoute const& _ir);
@@ -280,6 +297,10 @@ private:
/// @returns true only if it's worth bothering to prep the mining block.
bool shouldServeWork() const { return m_bq.items().first == 0 && (isMining() || remoteActive()); }
+ /// Called when we have attempted to import a bad block.
+ /// @warning May be called from any thread.
+ void onBadBlock(Exception& _ex);
+
VersionChecker m_vc; ///< Dummy object to check & update the protocol version.
CanonBlockChain m_bc; ///< Maintains block database.
BlockQueue m_bq; ///< Maintains a list of incoming blocks not yet on the blockchain (to be imported).
@@ -304,8 +325,10 @@ private:
Handler m_tqReady;
Handler m_bqReady;
+ bool m_wouldMine = false; ///< True if we /should/ be mining.
bool m_turboMining = false; ///< Don't squander all of our time mining actually just sleeping.
bool m_forceMining = false; ///< Mine even when there are no transactions pending?
+ bool m_mineOnBadChain = false; ///< Mine even when the canary says it's a bad chain.
bool m_paranoia = false; ///< Should we be paranoid about our state?
mutable std::chrono::system_clock::time_point m_lastGarbageCollection;
@@ -319,6 +342,8 @@ private:
Mutex x_signalled;
std::atomic m_syncTransactionQueue = {false};
std::atomic m_syncBlockQueue = {false};
+
+ std::string m_sentinel;
};
}
diff --git a/libethereum/ClientBase.cpp b/libethereum/ClientBase.cpp
index 8dc666bb5..6a2c76c0b 100644
--- a/libethereum/ClientBase.cpp
+++ b/libethereum/ClientBase.cpp
@@ -400,17 +400,16 @@ h256s ClientBase::pendingHashes() const
return h256s() + postMine().pendingHashes();
}
-
StateDiff ClientBase::diff(unsigned _txi, h256 _block) const
{
State st = asOf(_block);
- return st.fromPending(_txi).diff(st.fromPending(_txi + 1));
+ return st.fromPending(_txi).diff(st.fromPending(_txi + 1), true);
}
StateDiff ClientBase::diff(unsigned _txi, BlockNumber _block) const
{
State st = asOf(_block);
- return st.fromPending(_txi).diff(st.fromPending(_txi + 1));
+ return st.fromPending(_txi).diff(st.fromPending(_txi + 1), true);
}
Addresses ClientBase::addresses(BlockNumber _block) const
diff --git a/libethereum/ClientBase.h b/libethereum/ClientBase.h
index 2b271b1df..b2afe3597 100644
--- a/libethereum/ClientBase.h
+++ b/libethereum/ClientBase.h
@@ -132,8 +132,8 @@ public:
virtual Transactions pending() const override;
virtual h256s pendingHashes() const override;
- ImportResult injectTransaction(bytes const& _rlp) override { prepareForTransaction(); return m_tq.import(_rlp); }
- ImportResult injectBlock(bytes const& _block);
+ virtual ImportResult injectTransaction(bytes const& _rlp) override { prepareForTransaction(); return m_tq.import(_rlp); }
+ virtual ImportResult injectBlock(bytes const& _block) override;
using Interface::diff;
virtual StateDiff diff(unsigned _txi, h256 _block) const override;
@@ -143,9 +143,6 @@ public:
virtual Addresses addresses(BlockNumber _block) const override;
virtual u256 gasLimitRemaining() const override;
- /// Set the coinbase address
- virtual void setAddress(Address _us) = 0;
-
/// Get the coinbase address
virtual Address address() const override;
@@ -154,6 +151,7 @@ public:
virtual void startMining() override { BOOST_THROW_EXCEPTION(InterfaceNotSupported("ClientBase::startMining")); }
virtual void stopMining() override { BOOST_THROW_EXCEPTION(InterfaceNotSupported("ClientBase::stopMining")); }
virtual bool isMining() const override { BOOST_THROW_EXCEPTION(InterfaceNotSupported("ClientBase::isMining")); }
+ virtual bool wouldMine() const override { BOOST_THROW_EXCEPTION(InterfaceNotSupported("ClientBase::wouldMine")); }
virtual uint64_t hashrate() const override { BOOST_THROW_EXCEPTION(InterfaceNotSupported("ClientBase::hashrate")); }
virtual MiningProgress miningProgress() const override { BOOST_THROW_EXCEPTION(InterfaceNotSupported("ClientBase::miningProgress")); }
virtual ProofOfWork::WorkPackage getWork() override { BOOST_THROW_EXCEPTION(InterfaceNotSupported("ClientBase::getWork")); }
diff --git a/libethereum/EthereumHost.cpp b/libethereum/EthereumHost.cpp
index abeac0af9..d205394ac 100644
--- a/libethereum/EthereumHost.cpp
+++ b/libethereum/EthereumHost.cpp
@@ -277,6 +277,13 @@ void EthereumHost::estimatePeerHashes(EthereumPeer* _peer)
_peer->m_expectedHashes = blockCount;
}
+void EthereumHost::noteRude(p2p::NodeId const& _id, std::string const& _client)
+{
+ cwarn << "RUDE node/client: " << _id << _client;
+ m_rudeNodes.insert(_id);
+ m_rudeClients.insert(_client);
+}
+
void EthereumHost::onPeerHashes(EthereumPeer* _peer, h256s const& _hashes)
{
RecursiveGuard l(x_sync);
@@ -573,6 +580,7 @@ void EthereumHost::onPeerAborting(EthereumPeer* _peer)
if (_peer->isSyncing())
{
_peer->setIdle();
+ _peer->setRude();
continueSync();
}
}
@@ -606,7 +614,7 @@ void EthereumHost::continueSync(EthereumPeer* _peer)
});
if (otherPeerV60Sync && !m_hashes.empty())
{
- /// Downloading from other peer with v60 protocol, nothing ese we can do
+ /// Downloading from other peer with v60 protocol, nothing else we can do
_peer->setIdle();
return;
}
@@ -647,6 +655,10 @@ void EthereumHost::continueSync(EthereumPeer* _peer)
bool EthereumHost::peerShouldGrabBlocks(EthereumPeer* _peer) const
{
+ // Early exit if this peer has proved unreliable.
+ if (_peer->isRude())
+ return false;
+
auto td = _peer->m_totalDifficulty;
auto lh = m_syncingLatestHash;
auto ctd = m_chain.details().totalDifficulty;
@@ -659,6 +671,10 @@ bool EthereumHost::peerShouldGrabBlocks(EthereumPeer* _peer) const
bool EthereumHost::peerShouldGrabChain(EthereumPeer* _peer) const
{
+ // Early exit if this peer has proved unreliable.
+ if (_peer->isRude())
+ return false;
+
h256 c = m_chain.currentHash();
unsigned n = m_chain.number();
u256 td = m_chain.details().totalDifficulty;
diff --git a/libethereum/EthereumHost.h b/libethereum/EthereumHost.h
index 7e03dee8c..8c25a86c6 100644
--- a/libethereum/EthereumHost.h
+++ b/libethereum/EthereumHost.h
@@ -71,7 +71,9 @@ public:
DownloadMan const& downloadMan() const { return m_man; }
bool isSyncing() const { RecursiveGuard l(x_sync); return isSyncing_UNSAFE(); }
- bool isBanned(p2p::NodeId _id) const { return !!m_banned.count(_id); }
+ bool isBanned(p2p::NodeId const& _id) const { return !!m_banned.count(_id); }
+ void noteRude(p2p::NodeId const& _id, std::string const& _client);
+ bool isRude(p2p::NodeId const& _id, std::string const& _client) const { return m_rudeClients.count(_client) && m_rudeNodes.count(_id); }
void noteNewTransactions() { m_newTransactions = true; }
void noteNewBlocks() { m_newBlocks = true; }
@@ -151,6 +153,8 @@ private:
h256s m_hashes; ///< List of hashes with unknown block numbers. Used for PV60 chain downloading and catching up to a particular unknown
unsigned m_estimatedHashes = 0; ///< Number of estimated hashes for the last peer over PV60. Used for status reporting only.
bool m_syncingV61 = false; ///< True if recent activity was over pv61+. Used for status reporting only.
+ std::unordered_set m_rudeNodes; ///< Nodes that were impolite while syncing. We avoid syncing from these if possible.
+ std::unordered_set m_rudeClients; ///< Nodes that were impolite while syncing. We avoid syncing from these if possible.
};
}
diff --git a/libethereum/EthereumPeer.cpp b/libethereum/EthereumPeer.cpp
index 63d407187..50ed76d9b 100644
--- a/libethereum/EthereumPeer.cpp
+++ b/libethereum/EthereumPeer.cpp
@@ -40,6 +40,9 @@ EthereumPeer::EthereumPeer(Session* _s, HostCapabilityFace* _h, unsigned _i, Cap
m_hashSub(host()->hashDownloadMan()),
m_peerCapabilityVersion(_cap.second)
{
+ m_isRude = host()->isRude(session()->id(), session()->info().clientVersion);
+ session()->addNote("manners", m_isRude ? "RUDE" : "nice");
+ m_syncHashNumber = host()->chain().number() + 1;
requestStatus();
}
@@ -54,6 +57,13 @@ void EthereumPeer::abortSync()
host()->onPeerAborting(this);
}
+void EthereumPeer::setRude()
+{
+ m_isRude = true;
+ host()->noteRude(session()->id(), session()->info().clientVersion);
+ session()->addNote("manners", m_isRude ? "RUDE" : "nice");
+}
+
EthereumHost* EthereumPeer::host() const
{
return static_cast(Capability::hostCapability());
diff --git a/libethereum/EthereumPeer.h b/libethereum/EthereumPeer.h
index f7a2e12af..128612f29 100644
--- a/libethereum/EthereumPeer.h
+++ b/libethereum/EthereumPeer.h
@@ -82,6 +82,12 @@ public:
/// Request blocks. Uses block download manager.
void requestBlocks();
+ /// Check if this node is rude.
+ bool isRude() const { return m_isRude; }
+
+ /// Set that it's a rude node.
+ void setRude();
+
private:
using p2p::Capability::sealAndSend;
@@ -101,7 +107,7 @@ private:
void setAsking(Asking _g);
/// Do we presently need syncing with this peer?
- bool needsSyncing() const { return !!m_latestHash; }
+ bool needsSyncing() const { return !isRude() && !!m_latestHash; }
/// Are we presently syncing with this peer?
bool isSyncing() const;
@@ -146,6 +152,8 @@ private:
h256Hash m_knownBlocks; ///< Blocks that the peer already knows about (that don't need to be sent to them).
Mutex x_knownTransactions;
h256Hash m_knownTransactions; ///< Transactions that the peer already knows of.
+
+ bool m_isRude; ///< True if this node has been rude in the past.
};
}
diff --git a/libethereum/Executive.cpp b/libethereum/Executive.cpp
index 5ec5f7313..e89334370 100644
--- a/libethereum/Executive.cpp
+++ b/libethereum/Executive.cpp
@@ -19,6 +19,9 @@
#include "Executive.h"
#include
+#if ETH_JSONRPC || !ETH_TRUE
+#include
+#endif
#include
#include
#include
@@ -34,6 +37,101 @@ using namespace dev::eth;
const char* VMTraceChannel::name() { return "EVM"; }
const char* ExecutiveWarnChannel::name() { return WarnChannel::name(); }
+StandardTrace::StandardTrace():
+ m_trace(new Json::Value(Json::arrayValue))
+{}
+
+bool changesMemory(Instruction _inst)
+{
+ return
+ _inst == Instruction::MSTORE ||
+ _inst == Instruction::MSTORE8 ||
+ _inst == Instruction::CALL ||
+ _inst == Instruction::CALLCODE ||
+ _inst == Instruction::SHA3 ||
+ _inst == Instruction::CALLDATACOPY ||
+ _inst == Instruction::CODECOPY ||
+ _inst == Instruction::EXTCODECOPY;
+}
+
+bool changesStorage(Instruction _inst)
+{
+ return _inst == Instruction::SSTORE;
+}
+
+void StandardTrace::operator()(uint64_t _steps, Instruction inst, bigint newMemSize, bigint gasCost, bigint gas, VM* voidVM, ExtVMFace const* voidExt)
+{
+ ExtVM const& ext = *static_cast(voidExt);
+ VM& vm = *voidVM;
+
+ Json::Value r(Json::objectValue);
+
+ Json::Value stack(Json::arrayValue);
+ for (auto const& i: vm.stack())
+ stack.append(toHex(toCompactBigEndian(i), 1));
+ r["stack"] = stack;
+
+ bool newContext = false;
+ Instruction lastInst = Instruction::STOP;
+
+ if (m_lastInst.size() == ext.depth)
+ {
+ // starting a new context
+ assert(m_lastInst.size() == ext.depth);
+ m_lastInst.push_back(inst);
+ newContext = true;
+ }
+ else if (m_lastInst.size() == ext.depth + 2)
+ {
+ // returned from old context
+ m_lastInst.pop_back();
+ lastInst = m_lastInst.back();
+ }
+ else if (m_lastInst.size() == ext.depth + 1)
+ {
+ // continuing in previous context
+ lastInst = m_lastInst.back();
+ }
+ else
+ {
+ cwarn << "GAA!!! Tracing VM and more than one new/deleted stack frame between steps!";
+ cwarn << "Attmepting naive recovery...";
+ m_lastInst.resize(ext.depth + 1);
+ }
+
+ if (changesMemory(lastInst) || newContext)
+ {
+ Json::Value mem(Json::arrayValue);
+ for (auto const& i: vm.memory())
+ mem.append(toHex(toCompactBigEndian(i), 1));
+ r["memory"] = mem;
+ }
+
+ if (changesStorage(lastInst) || newContext)
+ {
+ Json::Value storage(Json::objectValue);
+ for (auto const& i: ext.state().storage(ext.myAddress))
+ storage[toHex(toCompactBigEndian(i.first), 1)] = toHex(toCompactBigEndian(i.second), 1);
+ r["storage"] = storage;
+ }
+
+ r["depth"] = ext.depth;
+ r["address"] = ext.myAddress.hex();
+ r["steps"] = (unsigned)_steps;
+ r["inst"] = (unsigned)inst;
+ r["pc"] = toString(vm.curPC());
+ r["gas"] = toString(gas);
+ r["gascost"] = toString(gasCost);
+ r["memexpand"] = toString(newMemSize);
+
+ m_trace->append(r);
+}
+
+string StandardTrace::json() const
+{
+ return Json::FastWriter().write(*m_trace);
+}
+
Executive::Executive(State& _s, BlockChain const& _bc, unsigned _level):
m_s(_s),
m_lastHashes(_bc.lastHashes((unsigned)_s.info().number - 1)),
@@ -68,7 +166,7 @@ void Executive::initialize(Transaction const& _transaction)
if (!m_t.checkPayment())
{
clog(ExecutiveWarnChannel) << "Not enough gas to pay for the transaction: Require >" << m_t.gasRequired() << " Got" << m_t.gas();
- m_excepted = TransactionException::OutOfGas;
+ m_excepted = TransactionException::OutOfGasBase;
BOOST_THROW_EXCEPTION(OutOfGasBase() << RequirementError(m_t.gasRequired(), (bigint)m_t.gas()));
}
@@ -202,24 +300,6 @@ OnOpFunc Executive::simpleTrace()
};
}
-OnOpFunc Executive::standardTrace(ostream& o_output)
-{
- return [&](uint64_t steps, Instruction inst, bigint newMemSize, bigint gasCost, bigint gas, VM* voidVM, ExtVMFace const* voidExt)
- {
- ExtVM const& ext = *static_cast(voidExt);
- VM& vm = *voidVM;
-
- o_output << endl << " STACK" << endl;
- for (auto i: vm.stack())
- o_output << (h256)i << endl;
- o_output << " MEMORY" << endl << ((vm.memory().size() > 1000) ? " mem size greater than 1000 bytes " : memDump(vm.memory()));
- o_output << " STORAGE" << endl;
- for (auto const& i: ext.state().storage(ext.myAddress))
- o_output << showbase << hex << i.first << ": " << i.second << endl;
- o_output << " < " << dec << ext.depth << " : " << ext.myAddress << " : #" << steps << " : " << hex << setw(4) << setfill('0') << vm.curPC() << " : " << instructionInfo(inst).name << " : " << dec << gas << " : -" << dec << gasCost << " : " << newMemSize << "x32" << " >";
- };
-}
-
bool Executive::go(OnOpFunc const& _onOp)
{
if (m_ext)
diff --git a/libethereum/Executive.h b/libethereum/Executive.h
index beeee3331..e2c910cd0 100644
--- a/libethereum/Executive.h
+++ b/libethereum/Executive.h
@@ -25,6 +25,11 @@
#include
#include "Transaction.h"
+namespace Json
+{
+ class Value;
+}
+
namespace dev
{
namespace eth
@@ -38,6 +43,19 @@ struct Manifest;
struct VMTraceChannel: public LogChannel { static const char* name(); static const int verbosity = 11; };
struct ExecutiveWarnChannel: public LogChannel { static const char* name(); static const int verbosity = 6; };
+class StandardTrace
+{
+public:
+ StandardTrace();
+ void operator()(uint64_t _steps, Instruction _inst, bigint _newMemSize, bigint _gasCost, bigint _gas, VM* _vm, ExtVMFace const* _extVM);
+
+ std::string json() const;
+
+private:
+ std::vector m_lastInst;
+ std::shared_ptr m_trace;
+};
+
/**
* @brief Message-call/contract-creation executor; useful for executing transactions.
*
diff --git a/libethereum/Interface.h b/libethereum/Interface.h
index f7253ad29..636f73fbf 100644
--- a/libethereum/Interface.h
+++ b/libethereum/Interface.h
@@ -196,6 +196,8 @@ public:
virtual void stopMining() = 0;
/// Are we mining now?
virtual bool isMining() const = 0;
+ /// Would we like to mine now?
+ virtual bool wouldMine() const = 0;
/// Current hash rate.
virtual uint64_t hashrate() const = 0;
diff --git a/libethereum/Precompiled.cpp b/libethereum/Precompiled.cpp
index 0ae9bf3eb..780a8210f 100644
--- a/libethereum/Precompiled.cpp
+++ b/libethereum/Precompiled.cpp
@@ -55,9 +55,13 @@ void ecrecoverCode(bytesConstRef _in, bytesRef _out)
{
try
{
- ret = sha3(recover(sig, in.hash));
+ Public rec = recover(sig, in.hash);
+ if (rec)
+ ret = dev::sha3(rec);
+ else
+ return;
}
- catch (...) {}
+ catch (...) { return; }
}
}
diff --git a/libethereum/Sentinel.h b/libethereum/Sentinel.h
new file mode 100644
index 000000000..141a5ee58
--- /dev/null
+++ b/libethereum/Sentinel.h
@@ -0,0 +1,31 @@
+/**
+ * This file is generated by jsonrpcstub, DO NOT CHANGE IT MANUALLY!
+ */
+
+#ifndef JSONRPC_CPP_STUB_DEV_ETH_SENTINEL_H_
+#define JSONRPC_CPP_STUB_DEV_ETH_SENTINEL_H_
+
+#include
+
+namespace dev {
+ namespace eth {
+ class Sentinel : public jsonrpc::Client
+ {
+ public:
+ Sentinel(jsonrpc::IClientConnector &conn, jsonrpc::clientVersion_t type = jsonrpc::JSONRPC_CLIENT_V2) : jsonrpc::Client(conn, type) {}
+
+ int eth_badBlock(const Json::Value& param1) throw (jsonrpc::JsonRpcException)
+ {
+ Json::Value p;
+ p.append(param1);
+ Json::Value result = this->CallMethod("eth_badBlock",p);
+ if (result.isInt())
+ return result.asInt();
+ else
+ throw jsonrpc::JsonRpcException(jsonrpc::Errors::ERROR_CLIENT_INVALID_RESPONSE, result.toStyledString());
+ }
+ };
+
+ }
+}
+#endif //JSONRPC_CPP_STUB_DEV_ETH_SENTINEL_H_
diff --git a/libethereum/Sentinel.json b/libethereum/Sentinel.json
new file mode 100644
index 000000000..743e4ce44
--- /dev/null
+++ b/libethereum/Sentinel.json
@@ -0,0 +1,3 @@
+[
+ { "name": "eth_badBlock", "params": [ {} ], "order": [], "returns": 0 }
+]
diff --git a/libethereum/State.cpp b/libethereum/State.cpp
index f40574fde..1212c2d74 100644
--- a/libethereum/State.cpp
+++ b/libethereum/State.cpp
@@ -158,6 +158,7 @@ State::State(State const& _s):
m_transactions(_s.m_transactions),
m_receipts(_s.m_receipts),
m_transactionSet(_s.m_transactionSet),
+ m_touched(_s.m_touched),
m_cache(_s.m_cache),
m_previousBlock(_s.m_previousBlock),
m_currentBlock(_s.m_currentBlock),
@@ -206,7 +207,7 @@ State::~State()
{
}
-StateDiff State::diff(State const& _c) const
+StateDiff State::diff(State const& _c, bool _quick) const
{
StateDiff ret;
@@ -217,19 +218,29 @@ StateDiff State::diff(State const& _c) const
auto trie = SecureTrieDB(const_cast(&m_db), rootHash());
auto trieD = SecureTrieDB(const_cast(&_c.m_db), _c.rootHash());
- for (auto i: trie)
- ads.insert(i.first), trieAds.insert(i.first);
- for (auto i: trieD)
- ads.insert(i.first), trieAdsD.insert(i.first);
- for (auto i: m_cache)
+ if (_quick)
+ {
+ trieAds = m_touched;
+ trieAdsD = _c.m_touched;
+ (ads += m_touched) += _c.m_touched;
+ }
+ else
+ {
+ for (auto const& i: trie)
+ ads.insert(i.first), trieAds.insert(i.first);
+ for (auto const& i: trieD)
+ ads.insert(i.first), trieAdsD.insert(i.first);
+ }
+
+ for (auto const& i: m_cache)
ads.insert(i.first);
- for (auto i: _c.m_cache)
+ for (auto const& i: _c.m_cache)
ads.insert(i.first);
// cnote << *this;
// cnote << _c;
- for (auto i: ads)
+ for (auto const& i: ads)
{
auto it = m_cache.find(i);
auto itD = _c.m_cache.find(i);
@@ -272,7 +283,7 @@ void State::ensureCached(std::unordered_map& _cache, Address _
void State::commit()
{
- dev::eth::commit(m_cache, m_db, m_state);
+ m_touched += dev::eth::commit(m_cache, m_db, m_state);
m_cache.clear();
}
@@ -450,6 +461,7 @@ void State::resetCurrent()
m_receipts.clear();
m_transactionSet.clear();
m_cache.clear();
+ m_touched.clear();
m_currentBlock = BlockInfo();
m_currentBlock.coinbaseAddress = m_ourAddress;
m_currentBlock.timestamp = max(m_previousBlock.timestamp + 1, (u256)time(0));
@@ -577,19 +589,20 @@ string State::vmTrace(bytesConstRef _block, BlockChain const& _bc, ImportRequire
LastHashes lh = _bc.lastHashes((unsigned)m_previousBlock.number);
vector receipts;
- ostringstream ss;
+ string ret;
unsigned i = 0;
for (auto const& tr: rlp[1])
{
- ss << " VM Execution of transaction" << i << ":" << endl;
- execute(lh, Transaction(tr.data(), CheckTransaction::Everything), Permanence::Committed, Executive::standardTrace(ss));
+ StandardTrace st;
+ execute(lh, Transaction(tr.data(), CheckTransaction::Everything), Permanence::Committed, [&](uint64_t _steps, Instruction _inst, bigint _newMemSize, bigint _gasCost, bigint _gas, VM* _vm, ExtVMFace const* _extVM) { st(_steps, _inst, _newMemSize, _gasCost, _gas, _vm, _extVM); });
+ ret += (ret.empty() ? "[" : ",") + st.json();
+
RLPStream receiptRLP;
m_receipts.back().streamRLP(receiptRLP);
receipts.push_back(receiptRLP.out());
++i;
- ss << endl;
}
- return ss.str();
+ return ret.empty() ? "[]" : (ret + "]");
}
u256 State::enact(bytesConstRef _block, BlockChain const& _bc, ImportRequirements::value _ir)
@@ -605,6 +618,7 @@ u256 State::enact(bytesConstRef _block, BlockChain const& _bc, ImportRequirement
#endif
if (m_currentBlock.parentHash != m_previousBlock.hash())
+ // Internal client error.
BOOST_THROW_EXCEPTION(InvalidParentHash());
// Populate m_currentBlock with the correct values.
@@ -624,16 +638,19 @@ u256 State::enact(bytesConstRef _block, BlockChain const& _bc, ImportRequirement
unsigned i = 0;
for (auto const& tr: rlp[1])
{
- try {
+ try
+ {
LogOverride o(false);
execute(lh, Transaction(tr.data(), CheckTransaction::Everything));
}
- catch (...)
+ catch (Exception& ex)
{
- badBlock(_block, "Invalid transaction");
+ badBlock(_block, "Invalid transaction: " + toString(toTransactionException(ex)));
cwarn << " Transaction Index:" << i;
LogOverride o(true);
- execute(lh, Transaction(tr.data(), CheckTransaction::Everything));
+ DEV_IGNORE_EXCEPTIONS(execute(lh, Transaction(tr.data(), CheckTransaction::Everything)));
+
+ ex << errinfo_transactionIndex(i);
throw;
}
@@ -658,7 +675,12 @@ u256 State::enact(bytesConstRef _block, BlockChain const& _bc, ImportRequirement
cwarn << " " << TransactionReceipt(&b);
}
cwarn << " VMTrace:\n" << vmTrace(_block, _bc, _ir);
- BOOST_THROW_EXCEPTION(InvalidReceiptsStateRoot());
+
+ InvalidReceiptsStateRoot ex;
+ ex << Hash256RequirementError(receiptsRoot, m_currentBlock.receiptsRoot);
+ ex << errinfo_receipts(receipts);
+ ex << errinfo_vmtrace(vmTrace(_block, _bc, _ir));
+ BOOST_THROW_EXCEPTION(ex);
}
if (m_currentBlock.logBloom != logBloom())
@@ -671,7 +693,10 @@ u256 State::enact(bytesConstRef _block, BlockChain const& _bc, ImportRequirement
cwarn << " " << j << ":" << TransactionReceipt(&b).bloom().hex();
}
cwarn << " Final bloom:" << m_currentBlock.logBloom.hex();
- BOOST_THROW_EXCEPTION(InvalidLogBloom());
+ InvalidLogBloom ex;
+ ex << LogBloomRequirementError(logBloom(), m_currentBlock.logBloom);
+ ex << errinfo_receipts(receipts);
+ BOOST_THROW_EXCEPTION(ex);
}
// Initialise total difficulty calculation.
@@ -681,45 +706,70 @@ u256 State::enact(bytesConstRef _block, BlockChain const& _bc, ImportRequirement
if (rlp[2].itemCount() > 2)
{
badBlock(_block, "Too many uncles");
- BOOST_THROW_EXCEPTION(TooManyUncles());
+ BOOST_THROW_EXCEPTION(TooManyUncles() << errinfo_max(2) << errinfo_got(rlp[2].itemCount()));
}
vector rewarded;
h256Hash excluded = _bc.allKinFrom(m_currentBlock.parentHash, 6);
excluded.insert(m_currentBlock.hash());
+ unsigned ii = 0;
for (auto const& i: rlp[2])
{
- auto h = sha3(i.data());
- if (excluded.count(h))
+ try
{
- badBlock(_block, "Invalid uncle included");
- BOOST_THROW_EXCEPTION(UncleInChain() << errinfo_comment("Uncle in block already mentioned") << errinfo_data(toString(excluded)) << errinfo_hash256(sha3(i.data())));
- }
- excluded.insert(h);
+ auto h = sha3(i.data());
+ if (excluded.count(h))
+ {
+ badBlock(_block, "Invalid uncle included");
+ UncleInChain ex;
+ ex << errinfo_comment("Uncle in block already mentioned");
+ ex << errinfo_unclesExcluded(excluded);
+ ex << errinfo_hash256(sha3(i.data()));
+ BOOST_THROW_EXCEPTION(ex);
+ }
+ excluded.insert(h);
- BlockInfo uncle = BlockInfo::fromHeader(i.data(), (_ir & ImportRequirements::CheckUncles) ? CheckEverything : IgnoreNonce, h);
- BlockInfo uncleParent(_bc.block(uncle.parentHash));
- if ((bigint)uncleParent.number < (bigint)m_currentBlock.number - 7)
- {
- badBlock(_block, "Uncle too old");
- cwarn << " Uncle number: " << uncle.number;
- cwarn << " Uncle parent number: " << uncleParent.number;
- cwarn << " Block number: " << m_currentBlock.number;
- BOOST_THROW_EXCEPTION(UncleTooOld());
+ BlockInfo uncle;
+ BlockInfo uncleParent;
+ uncle = BlockInfo::fromHeader(i.data(), (_ir & ImportRequirements::CheckUncles) ? CheckEverything : IgnoreNonce, h);
+ if (!_bc.isKnown(uncle.parentHash))
+ BOOST_THROW_EXCEPTION(UnknownParent());
+
+ uncleParent = BlockInfo(_bc.block(uncle.parentHash));
+ if ((bigint)uncleParent.number < (bigint)m_currentBlock.number - 7)
+ {
+ badBlock(_block, "Uncle too old");
+ cwarn << " Uncle number: " << uncle.number;
+ cwarn << " Uncle parent number: " << uncleParent.number;
+ cwarn << " Block number: " << m_currentBlock.number;
+ UncleTooOld ex;
+ ex << errinfo_uncleNumber(uncle.number);
+ ex << errinfo_currentNumber(m_currentBlock.number);
+ BOOST_THROW_EXCEPTION(ex);
+ }
+ else if (uncle.number == m_currentBlock.number)
+ {
+ badBlock(_block, "Uncle is brother");
+ cwarn << " Uncle number: " << uncle.number;
+ cwarn << " Uncle parent number: " << uncleParent.number;
+ cwarn << " Block number: " << m_currentBlock.number;
+ UncleIsBrother ex;
+ ex << errinfo_uncleNumber(uncle.number);
+ ex << errinfo_currentNumber(m_currentBlock.number);
+ BOOST_THROW_EXCEPTION(ex);
+ }
+ uncle.verifyParent(uncleParent);
+
+// tdIncrease += uncle.difficulty;
+ rewarded.push_back(uncle);
+ ++ii;
}
- else if (uncle.number == m_currentBlock.number)
+ catch (Exception& ex)
{
- badBlock(_block, "Uncle is brother");
- cwarn << " Uncle number: " << uncle.number;
- cwarn << " Uncle parent number: " << uncleParent.number;
- cwarn << " Block number: " << m_currentBlock.number;
- BOOST_THROW_EXCEPTION(UncleIsBrother());
+ ex << errinfo_uncleIndex(ii);
+ throw;
}
- uncle.verifyParent(uncleParent);
-
-// tdIncrease += uncle.difficulty;
- rewarded.push_back(uncle);
}
applyRewards(rewarded);
@@ -731,15 +781,8 @@ u256 State::enact(bytesConstRef _block, BlockChain const& _bc, ImportRequirement
if (m_currentBlock.stateRoot != m_previousBlock.stateRoot && m_currentBlock.stateRoot != rootHash())
{
badBlock(_block, "Bad state root");
- cnote << " Given to be:" << m_currentBlock.stateRoot;
- // TODO: Fix
-// cnote << SecureTrieDB(&m_db, m_currentBlock.stateRoot);
- cnote << " Calculated to be:" << rootHash();
- cwarn << " VMTrace:\n" << vmTrace(_block, _bc, _ir);
-// cnote << m_state;
- // Rollback the trie.
m_db.rollback();
- BOOST_THROW_EXCEPTION(InvalidStateRoot());
+ BOOST_THROW_EXCEPTION(InvalidStateRoot() << Hash256RequirementError(rootHash(), m_currentBlock.stateRoot));
}
if (m_currentBlock.gasUsed != gasUsed())
@@ -1188,8 +1231,10 @@ ExecutionResult State::execute(LastHashes const& _lh, Transaction const& _t, Per
if (!e.execute())
#if ETH_VMTRACE
{
- (void)_onOp;
- e.go(e.simpleTrace());
+ if (isChannelVisible())
+ e.go(e.simpleTrace());
+ else
+ e.go(_onOp);
}
#else
e.go(_onOp);
diff --git a/libethereum/State.h b/libethereum/State.h
index 55d5cfb4c..9ecab05b5 100644
--- a/libethereum/State.h
+++ b/libethereum/State.h
@@ -46,6 +46,22 @@ namespace test { class ImportTest; class StateLoader; }
namespace eth
{
+// Import-specific errinfos
+using errinfo_uncleIndex = boost::error_info;
+using errinfo_currentNumber = boost::error_info;
+using errinfo_uncleNumber = boost::error_info;
+using errinfo_unclesExcluded = boost::error_info;
+using errinfo_block = boost::error_info;
+using errinfo_now = boost::error_info;
+
+using errinfo_transactionIndex = boost::error_info;
+
+using errinfo_vmtrace = boost::error_info;
+using errinfo_receipts = boost::error_info>;
+using errinfo_required_LogBloom = boost::error_info;
+using errinfo_got_LogBloom = boost::error_info;
+using LogBloomRequirementError = boost::tuple;
+
class BlockChain;
class State;
@@ -294,10 +310,12 @@ public:
State fromPending(unsigned _i) const;
/// @returns the StateDiff caused by the pending transaction of index @a _i.
- StateDiff pendingDiff(unsigned _i) const { return fromPending(_i).diff(fromPending(_i + 1)); }
+ StateDiff pendingDiff(unsigned _i) const { return fromPending(_i).diff(fromPending(_i + 1), true); }
/// @return the difference between this state (origin) and @a _c (destination).
- StateDiff diff(State const& _c) const;
+ /// @param _quick if true doesn't check all addresses possible (/very/ slow for a full chain)
+ /// but rather only those touched by the transactions in creating the two States.
+ StateDiff diff(State const& _c, bool _quick = false) const;
/// Sync our state with the block chain.
/// This basically involves wiping ourselves if we've been superceded and rebuilding from the transaction queue.
@@ -371,6 +389,7 @@ private:
TransactionReceipts m_receipts; ///< The corresponding list of transaction receipts.
h256Hash m_transactionSet; ///< The set of transaction hashes that we've included in the state.
OverlayDB m_lastTx;
+ AddressHash m_touched; ///< Tracks all addresses touched by transactions so far.
mutable std::unordered_map m_cache; ///< Our address cache. This stores the states of each address that has (or at least might have) been changed.
@@ -394,8 +413,9 @@ private:
std::ostream& operator<<(std::ostream& _out, State const& _s);
template
-void commit(std::unordered_map const& _cache, DB& _db, SecureTrieDB& _state)
+AddressHash commit(std::unordered_map const& _cache, DB& _db, SecureTrieDB& _state)
{
+ AddressHash ret;
for (auto const& i: _cache)
if (i.second.isDirty())
{
@@ -434,7 +454,9 @@ void commit(std::unordered_map const& _cache, DB& _db, SecureT
_state.insert(i.first, &s.out());
}
+ ret.insert(i.first);
}
+ return ret;
}
}
diff --git a/libethereum/Transaction.cpp b/libethereum/Transaction.cpp
index b8d8d64c1..65c18f4fd 100644
--- a/libethereum/Transaction.cpp
+++ b/libethereum/Transaction.cpp
@@ -60,8 +60,25 @@ std::string badTransaction(bytesConstRef _tx, string const& _err)
return ret.str();
}
-TransactionException dev::eth::toTransactionException(VMException const& _e)
+TransactionException dev::eth::toTransactionException(Exception const& _e)
{
+ // Basic Transaction exceptions
+ if (!!dynamic_cast(&_e))
+ return TransactionException::BadRLP;
+ if (!!dynamic_cast(&_e))
+ return TransactionException::OutOfGasIntrinsic;
+ if (!!dynamic_cast(&_e))
+ return TransactionException::InvalidSignature;
+ // Executive exceptions
+ if (!!dynamic_cast(&_e))
+ return TransactionException::OutOfGasBase;
+ if (!!dynamic_cast(&_e))
+ return TransactionException::InvalidNonce;
+ if (!!dynamic_cast(&_e))
+ return TransactionException::NotEnoughCash;
+ if (!!dynamic_cast(&_e))
+ return TransactionException::BlockGasLimitReached;
+ // VM execution exceptions
if (!!dynamic_cast(&_e))
return TransactionException::BadInstruction;
if (!!dynamic_cast(&_e))
@@ -75,6 +92,28 @@ TransactionException dev::eth::toTransactionException(VMException const& _e)
return TransactionException::Unknown;
}
+std::ostream& dev::eth::operator<<(std::ostream& _out, TransactionException const& _er)
+{
+ switch (_er)
+ {
+ case TransactionException::None: _out << "None"; break;
+ case TransactionException::BadRLP: _out << "BadRLP"; break;
+ case TransactionException::OutOfGasIntrinsic: _out << "OutOfGasIntrinsic"; break;
+ case TransactionException::InvalidSignature: _out << "InvalidSignature"; break;
+ case TransactionException::InvalidNonce: _out << "InvalidNonce"; break;
+ case TransactionException::NotEnoughCash: _out << "NotEnoughCash"; break;
+ case TransactionException::OutOfGasBase: _out << "OutOfGasBase"; break;
+ case TransactionException::BlockGasLimitReached: _out << "BlockGasLimitReached"; break;
+ case TransactionException::BadInstruction: _out << "BadInstruction"; break;
+ case TransactionException::BadJumpDestination: _out << "BadJumpDestination"; break;
+ case TransactionException::OutOfGas: _out << "OutOfGas"; break;
+ case TransactionException::OutOfStack: _out << "OutOfStack"; break;
+ case TransactionException::StackUnderflow: _out << "StackUnderflow"; break;
+ default: _out << "Unknown"; break;
+ }
+ return _out;
+}
+
Transaction::Transaction(bytesConstRef _rlpData, CheckTransaction _checkSig)
{
int field = 0;
@@ -114,7 +153,7 @@ Transaction::Transaction(bytesConstRef _rlpData, CheckTransaction _checkSig)
throw;
}
if (_checkSig >= CheckTransaction::Cheap && !checkPayment())
- BOOST_THROW_EXCEPTION(OutOfGasBase() << RequirementError(gasRequired(), (bigint)gas()));
+ BOOST_THROW_EXCEPTION(OutOfGasIntrinsic() << RequirementError(gasRequired(), (bigint)gas()));
}
Address const& Transaction::safeSender() const noexcept
diff --git a/libethereum/Transaction.h b/libethereum/Transaction.h
index 33928cd37..fb5566d9a 100644
--- a/libethereum/Transaction.h
+++ b/libethereum/Transaction.h
@@ -25,6 +25,7 @@
#include
#include
#include
+
namespace dev
{
namespace eth
@@ -48,6 +49,8 @@ enum class TransactionException
{
None = 0,
Unknown,
+ BadRLP,
+ OutOfGasIntrinsic, ///< Too little gas to pay for the base transaction cost.
InvalidSignature,
InvalidNonce,
NotEnoughCash,
@@ -69,7 +72,8 @@ enum class CodeDeposit
struct VMException;
-TransactionException toTransactionException(VMException const& _e);
+TransactionException toTransactionException(Exception const& _e);
+std::ostream& operator<<(std::ostream& _out, TransactionException const& _er);
/// Description of the result of executing a transaction.
struct ExecutionResult
diff --git a/libevm/VMFace.h b/libevm/VMFace.h
index 2a9ed808e..cba1c7287 100644
--- a/libevm/VMFace.h
+++ b/libevm/VMFace.h
@@ -25,6 +25,7 @@ namespace dev
namespace eth
{
+#define ETH_SIMPLE_EXCEPTION_VM(X) struct X: virtual VMException { public X(): VMException(#X) {} };
struct VMException: virtual Exception {};
struct BreakPointHit: virtual VMException {};
struct BadInstruction: virtual VMException {};
diff --git a/libevmasm/Assembly.cpp b/libevmasm/Assembly.cpp
index 8642824f6..3557fc0ee 100644
--- a/libevmasm/Assembly.cpp
+++ b/libevmasm/Assembly.cpp
@@ -109,7 +109,7 @@ string Assembly::getLocationFromSources(StringMap const& _sourceCodes, SourceLoc
if (newLinePos != string::npos)
cut = cut.substr(0, newLinePos) + "...";
- return move(cut);
+ return cut;
}
ostream& Assembly::streamAsm(ostream& _out, string const& _prefix, StringMap const& _sourceCodes) const
diff --git a/libevmcore/Exceptions.h b/libevmcore/Exceptions.h
index 72af277df..f520ade5f 100644
--- a/libevmcore/Exceptions.h
+++ b/libevmcore/Exceptions.h
@@ -28,8 +28,8 @@ namespace dev
namespace eth
{
-struct InvalidDeposit: virtual Exception {};
-struct InvalidOpcode: virtual Exception {};
+DEV_SIMPLE_EXCEPTION(InvalidDeposit);
+DEV_SIMPLE_EXCEPTION(InvalidOpcode);
}
}
diff --git a/libp2p/Common.h b/libp2p/Common.h
index 8fd330580..4a1b64b70 100644
--- a/libp2p/Common.h
+++ b/libp2p/Common.h
@@ -183,8 +183,8 @@ struct NodeIPEndpoint
uint16_t udpPort = 0;
uint16_t tcpPort = 0;
- operator bi::udp::endpoint() const { return std::move(bi::udp::endpoint(address, udpPort)); }
- operator bi::tcp::endpoint() const { return std::move(bi::tcp::endpoint(address, tcpPort)); }
+ operator bi::udp::endpoint() const { return bi::udp::endpoint(address, udpPort); }
+ operator bi::tcp::endpoint() const { return bi::tcp::endpoint(address, tcpPort); }
operator bool() const { return !address.is_unspecified() && udpPort > 0 && tcpPort > 0; }
diff --git a/libp2p/Host.cpp b/libp2p/Host.cpp
index b6c9efec9..f47db3c2b 100644
--- a/libp2p/Host.cpp
+++ b/libp2p/Host.cpp
@@ -834,7 +834,7 @@ KeyPair Host::networkAlias(bytesConstRef _b)
{
RLP r(_b);
if (r.itemCount() == 3 && r[0].isInt() && r[0].toInt() >= 3)
- return move(KeyPair(move(Secret(r[1].toBytes()))));
+ return KeyPair(Secret(r[1].toBytes()));
else
- return move(KeyPair::create());
+ return KeyPair::create();
}
diff --git a/libp2p/Network.cpp b/libp2p/Network.cpp
index d8ab90a20..2f2f247b6 100644
--- a/libp2p/Network.cpp
+++ b/libp2p/Network.cpp
@@ -111,7 +111,7 @@ std::set Network::getInterfaceAddresses()
#endif
- return std::move(addresses);
+ return addresses;
}
int Network::tcp4Listen(bi::tcp::acceptor& _acceptor, NetworkPreferences const& _netPrefs)
diff --git a/libp2p/NodeTable.cpp b/libp2p/NodeTable.cpp
index bf056c52f..078b4409b 100644
--- a/libp2p/NodeTable.cpp
+++ b/libp2p/NodeTable.cpp
@@ -88,7 +88,7 @@ shared_ptr NodeTable::addNode(Node const& _node, NodeRelation _relati
}
if (!_node.endpoint)
- return move(shared_ptr());
+ return shared_ptr();
// ping address to recover nodeid if nodeid is empty
if (!_node.id)
@@ -98,7 +98,7 @@ shared_ptr NodeTable::addNode(Node const& _node, NodeRelation _relati
DEV_GUARDED(x_pubkDiscoverPings)
m_pubkDiscoverPings[_node.endpoint.address] = std::chrono::steady_clock::now();
ping(_node.endpoint);
- return move(shared_ptr());
+ return shared_ptr();
}
DEV_GUARDED(x_nodes)
@@ -129,7 +129,7 @@ list NodeTable::nodes() const
DEV_GUARDED(x_nodes)
for (auto& i: m_nodes)
nodes.push_back(i.second->id);
- return move(nodes);
+ return nodes;
}
list NodeTable::snapshot() const
@@ -140,7 +140,7 @@ list NodeTable::snapshot() const
for (auto const& np: s.nodes)
if (auto n = np.lock())
ret.push_back(*n);
- return move(ret);
+ return ret;
}
Node NodeTable::node(NodeId const& _id)
@@ -282,7 +282,7 @@ vector> NodeTable::nearestNodeEntries(NodeId _target)
for (auto const& n: nodes.second)
if (ret.size() < s_bucketSize && !!n->endpoint && n->endpoint.isAllowed())
ret.push_back(n);
- return move(ret);
+ return ret;
}
void NodeTable::ping(NodeIPEndpoint _to) const
diff --git a/libp2p/RLPxFrameIO.cpp b/libp2p/RLPxFrameIO.cpp
index ac1a27bed..4fa8557ba 100644
--- a/libp2p/RLPxFrameIO.cpp
+++ b/libp2p/RLPxFrameIO.cpp
@@ -154,7 +154,7 @@ h128 RLPXFrameIO::egressDigest()
SHA3_256 h(m_egressMac);
h128 digest;
h.TruncatedFinal(digest.data(), h128::size);
- return move(digest);
+ return digest;
}
h128 RLPXFrameIO::ingressDigest()
@@ -162,7 +162,7 @@ h128 RLPXFrameIO::ingressDigest()
SHA3_256 h(m_ingressMac);
h128 digest;
h.TruncatedFinal(digest.data(), h128::size);
- return move(digest);
+ return digest;
}
void RLPXFrameIO::updateEgressMACWithHeader(bytesConstRef _headerCipher)
diff --git a/libp2p/UDP.cpp b/libp2p/UDP.cpp
index 9f89d9ad0..0b85bae4b 100644
--- a/libp2p/UDP.cpp
+++ b/libp2p/UDP.cpp
@@ -52,12 +52,12 @@ h256 RLPXDatagramFace::sign(Secret const& _k)
bytesConstRef signedRLPx(&data[h256::size], data.size() - h256::size);
dev::sha3(signedRLPx).ref().copyTo(rlpxHash);
- return std::move(sighash);
+ return sighash;
}
Public RLPXDatagramFace::authenticate(bytesConstRef _sig, bytesConstRef _rlp)
{
Signature const& sig = *(Signature const*)_sig.data();
- return std::move(dev::recover(sig, sha3(_rlp)));
+ return dev::recover(sig, sha3(_rlp));
}
diff --git a/libp2p/UDP.h b/libp2p/UDP.h
index 474cb5442..e345ce07f 100644
--- a/libp2p/UDP.h
+++ b/libp2p/UDP.h
@@ -81,7 +81,7 @@ template
struct RLPXDatagram: public RLPXDatagramFace
{
RLPXDatagram(bi::udp::endpoint const& _ep): RLPXDatagramFace(_ep) {}
- static T fromBytesConstRef(bi::udp::endpoint const& _ep, bytesConstRef _bytes) { try { T t(_ep); t.interpretRLP(_bytes); return std::move(t); } catch(...) { T t(_ep); return std::move(t); } }
+ static T fromBytesConstRef(bi::udp::endpoint const& _ep, bytesConstRef _bytes) { try { T t(_ep); t.interpretRLP(_bytes); return t; } catch(...) { return T{_ep}; } }
uint8_t packetType() { return T::type; }
};
diff --git a/libsolidity/AST.cpp b/libsolidity/AST.cpp
index 4c7168afa..acb7b50c5 100644
--- a/libsolidity/AST.cpp
+++ b/libsolidity/AST.cpp
@@ -410,7 +410,14 @@ void InheritanceSpecifier::checkTypeRequirements()
BOOST_THROW_EXCEPTION(createTypeError("Wrong argument count for constructor call."));
for (size_t i = 0; i < m_arguments.size(); ++i)
if (!m_arguments[i]->getType()->isImplicitlyConvertibleTo(*parameterTypes[i]))
- BOOST_THROW_EXCEPTION(createTypeError("Invalid type for argument in constructer call."));
+ BOOST_THROW_EXCEPTION(m_arguments[i]->createTypeError(
+ "Invalid type for argument in constructor call. "
+ "Invalid implicit conversion from " +
+ m_arguments[i]->getType()->toString() +
+ " to " +
+ parameterTypes[i]->toString() +
+ " requested."
+ ));
}
TypePointer StructDefinition::getType(ContractDefinition const*) const
@@ -592,7 +599,14 @@ void ModifierInvocation::checkTypeRequirements(vector
BOOST_THROW_EXCEPTION(createTypeError("Wrong argument count for modifier invocation."));
for (size_t i = 0; i < m_arguments.size(); ++i)
if (!m_arguments[i]->getType()->isImplicitlyConvertibleTo(*(*parameters)[i]->getType()))
- BOOST_THROW_EXCEPTION(createTypeError("Invalid type for argument in modifier invocation."));
+ BOOST_THROW_EXCEPTION(m_arguments[i]->createTypeError(
+ "Invalid type for argument in modifier invocation. "
+ "Invalid implicit conversion from " +
+ m_arguments[i]->getType()->toString() +
+ " to " +
+ (*parameters)[i]->getType()->toString() +
+ " requested."
+ ));
}
void EventDefinition::checkTypeRequirements()
@@ -782,9 +796,18 @@ void FunctionCall::checkTypeRequirements(TypePointers const*)
{
// call by positional arguments
for (size_t i = 0; i < m_arguments.size(); ++i)
- if (!functionType->takesArbitraryParameters() &&
- !m_arguments[i]->getType()->isImplicitlyConvertibleTo(*parameterTypes[i]))
- BOOST_THROW_EXCEPTION(m_arguments[i]->createTypeError("Invalid type for argument in function call."));
+ if (
+ !functionType->takesArbitraryParameters() &&
+ !m_arguments[i]->getType()->isImplicitlyConvertibleTo(*parameterTypes[i])
+ )
+ BOOST_THROW_EXCEPTION(m_arguments[i]->createTypeError(
+ "Invalid type for argument in function call. "
+ "Invalid implicit conversion from " +
+ m_arguments[i]->getType()->toString() +
+ " to " +
+ parameterTypes[i]->toString() +
+ " requested."
+ ));
}
else
{
@@ -808,7 +831,14 @@ void FunctionCall::checkTypeRequirements(TypePointers const*)
if (parameterNames[j] == *m_names[i]) {
// check type convertible
if (!m_arguments[i]->getType()->isImplicitlyConvertibleTo(*parameterTypes[j]))
- BOOST_THROW_EXCEPTION(createTypeError("Invalid type for argument in function call."));
+ BOOST_THROW_EXCEPTION(m_arguments[i]->createTypeError(
+ "Invalid type for argument in function call. "
+ "Invalid implicit conversion from " +
+ m_arguments[i]->getType()->toString() +
+ " to " +
+ parameterTypes[i]->toString() +
+ " requested."
+ ));
found = true;
break;
diff --git a/libsolidity/AST.h b/libsolidity/AST.h
index 578709c1e..b3984840f 100644
--- a/libsolidity/AST.h
+++ b/libsolidity/AST.h
@@ -503,7 +503,7 @@ public:
/// Returns the declared or inferred type. Can be an empty pointer if no type was explicitly
/// declared and there is no assignment to the variable that fixes the type.
- TypePointer getType(ContractDefinition const* = nullptr) const { return m_type; }
+ TypePointer getType(ContractDefinition const* = nullptr) const override { return m_type; }
void setType(std::shared_ptr const& _type) { m_type = _type; }
virtual bool isLValue() const override;
diff --git a/libsolidity/CompilerContext.cpp b/libsolidity/CompilerContext.cpp
index 2edff82e1..fde6adacc 100644
--- a/libsolidity/CompilerContext.cpp
+++ b/libsolidity/CompilerContext.cpp
@@ -133,7 +133,7 @@ set CompilerContext::getFunctionsWithoutCode()
for (auto const& it: m_functionEntryLabels)
if (m_functionsWithCode.count(it.first) == 0)
functions.insert(it.first);
- return move(functions);
+ return functions;
}
ModifierDefinition const& CompilerContext::getFunctionModifier(string const& _name) const
diff --git a/libsolidity/LValue.h b/libsolidity/LValue.h
index 1617e8167..726d63328 100644
--- a/libsolidity/LValue.h
+++ b/libsolidity/LValue.h
@@ -109,7 +109,7 @@ public:
StorageItem(CompilerContext& _compilerContext, Declaration const& _declaration);
/// Constructs the LValue and assumes that the storage reference is already on the stack.
StorageItem(CompilerContext& _compilerContext, Type const& _type);
- virtual unsigned sizeOnStack() const { return 2; }
+ virtual unsigned sizeOnStack() const override { return 2; }
virtual void retrieveValue(SourceLocation const& _location, bool _remove = false) const override;
virtual void storeValue(
Type const& _sourceType,
diff --git a/libsolidity/Types.cpp b/libsolidity/Types.cpp
index 1316bbc37..e1161c3fb 100644
--- a/libsolidity/Types.cpp
+++ b/libsolidity/Types.cpp
@@ -1459,29 +1459,29 @@ MagicType::MagicType(MagicType::Kind _kind):
switch (m_kind)
{
case Kind::Block:
- m_members = move(MemberList({
+ m_members = MemberList({
{"coinbase", make_shared(0, IntegerType::Modifier::Address)},
{"timestamp", make_shared(256)},
{"blockhash", make_shared(strings{"uint"}, strings{"bytes32"}, FunctionType::Location::BlockHash)},
{"difficulty", make_shared(256)},
{"number", make_shared(256)},
{"gaslimit", make_shared(256)}
- }));
+ });
break;
case Kind::Message:
- m_members = move(MemberList({
+ m_members = MemberList({
{"sender", make_shared(0, IntegerType::Modifier::Address)},
{"gas", make_shared(256)},
{"value", make_shared(256)},
{"data", make_shared(ReferenceType::Location::CallData)},
{"sig", make_shared(4)}
- }));
+ });
break;
case Kind::Transaction:
- m_members = move(MemberList({
+ m_members = MemberList({
{"origin", make_shared(0, IntegerType::Modifier::Address)},
{"gasprice", make_shared(256)}
- }));
+ });
break;
default:
BOOST_THROW_EXCEPTION(InternalCompilerError() << errinfo_comment("Unknown kind of magic."));
diff --git a/libsolidity/Types.h b/libsolidity/Types.h
index 3ec925395..17d30ea6c 100644
--- a/libsolidity/Types.h
+++ b/libsolidity/Types.h
@@ -407,7 +407,7 @@ public:
virtual TypePointer unaryOperatorResult(Token::Value _operator) const override;
virtual bool operator==(const Type& _other) const override;
virtual unsigned getCalldataEncodedSize(bool _padded) const override;
- virtual bool isDynamicallySized() const { return m_hasDynamicLength; }
+ virtual bool isDynamicallySized() const override { return m_hasDynamicLength; }
virtual u256 getStorageSize() const override;
virtual unsigned getSizeOnStack() const override;
virtual std::string toString() const override;
@@ -820,7 +820,7 @@ public:
return TypePointer();
}
- virtual bool operator==(Type const& _other) const;
+ virtual bool operator==(Type const& _other) const override;
virtual bool canBeStored() const override { return false; }
virtual bool canLiveOutsideStorage() const override { return true; }
virtual unsigned getSizeOnStack() const override { return 0; }
diff --git a/libtestutils/FixedClient.h b/libtestutils/FixedClient.h
index 59da9075f..bdec08849 100644
--- a/libtestutils/FixedClient.h
+++ b/libtestutils/FixedClient.h
@@ -48,7 +48,7 @@ public:
virtual eth::State asOf(h256 const& _h) const override;
virtual eth::State preMine() const override { ReadGuard l(x_stateDB); return m_state; }
virtual eth::State postMine() const override { ReadGuard l(x_stateDB); return m_state; }
- virtual void setAddress(Address _us) { WriteGuard l(x_stateDB); m_state.setAddress(_us); }
+ virtual void setAddress(Address _us) override { WriteGuard l(x_stateDB); m_state.setAddress(_us); }
virtual void prepareForTransaction() override {}
private:
diff --git a/libweb3jsonrpc/WebThreeStubServer.h b/libweb3jsonrpc/WebThreeStubServer.h
index 35c35c3f0..1eddc22d4 100644
--- a/libweb3jsonrpc/WebThreeStubServer.h
+++ b/libweb3jsonrpc/WebThreeStubServer.h
@@ -43,7 +43,7 @@ class WebThreeStubServer: public dev::WebThreeStubServerBase, public dev::WebThr
public:
WebThreeStubServer(jsonrpc::AbstractServerConnector& _conn, dev::WebThreeDirect& _web3, std::shared_ptr const& _ethAccounts, std::vector const& _shhAccounts);
- virtual std::string web3_clientVersion();
+ virtual std::string web3_clientVersion() override;
private:
virtual dev::eth::Interface* client() override;
diff --git a/libweb3jsonrpc/WebThreeStubServerBase.cpp b/libweb3jsonrpc/WebThreeStubServerBase.cpp
index ff7b84dc4..fa07e7dd3 100644
--- a/libweb3jsonrpc/WebThreeStubServerBase.cpp
+++ b/libweb3jsonrpc/WebThreeStubServerBase.cpp
@@ -781,17 +781,15 @@ string WebThreeStubServerBase::eth_newFilter(Json::Value const& _json)
}
}
-string WebThreeStubServerBase::eth_newBlockFilter(string const& _filter)
+string WebThreeStubServerBase::eth_newBlockFilter()
{
- h256 filter;
-
- if (_filter.compare("chain") == 0 || _filter.compare("latest") == 0)
- filter = dev::eth::ChainChangedFilter;
- else if (_filter.compare("pending") == 0)
- filter = dev::eth::PendingChangedFilter;
- else
- BOOST_THROW_EXCEPTION(JsonRpcException(Errors::ERROR_RPC_INVALID_PARAMS));
-
+ h256 filter = dev::eth::ChainChangedFilter;
+ return toJS(client()->installWatch(filter));
+}
+
+string WebThreeStubServerBase::eth_newPendingTransactionFilter()
+{
+ h256 filter = dev::eth::PendingChangedFilter;
return toJS(client()->installWatch(filter));
}
diff --git a/libweb3jsonrpc/WebThreeStubServerBase.h b/libweb3jsonrpc/WebThreeStubServerBase.h
index f3f7edfe7..d90df1445 100644
--- a/libweb3jsonrpc/WebThreeStubServerBase.h
+++ b/libweb3jsonrpc/WebThreeStubServerBase.h
@@ -107,7 +107,8 @@ public:
virtual std::string eth_compileSerpent(std::string const& _s);
virtual std::string eth_compileSolidity(std::string const& _code);
virtual std::string eth_newFilter(Json::Value const& _json);
- virtual std::string eth_newBlockFilter(std::string const& _filter);
+ virtual std::string eth_newBlockFilter();
+ virtual std::string eth_newPendingTransactionFilter();
virtual bool eth_uninstallFilter(std::string const& _filterId);
virtual Json::Value eth_getFilterChanges(std::string const& _filterId);
virtual Json::Value eth_getFilterLogs(std::string const& _filterId);
diff --git a/libweb3jsonrpc/abstractwebthreestubserver.h b/libweb3jsonrpc/abstractwebthreestubserver.h
index 89313df89..6a1a3df10 100644
--- a/libweb3jsonrpc/abstractwebthreestubserver.h
+++ b/libweb3jsonrpc/abstractwebthreestubserver.h
@@ -47,7 +47,8 @@ class AbstractWebThreeStubServer : public jsonrpc::AbstractServerbindAndAddMethod(jsonrpc::Procedure("eth_compileSerpent", jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_STRING, "param1",jsonrpc::JSON_STRING, NULL), &AbstractWebThreeStubServer::eth_compileSerpentI);
this->bindAndAddMethod(jsonrpc::Procedure("eth_compileSolidity", jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_STRING, "param1",jsonrpc::JSON_STRING, NULL), &AbstractWebThreeStubServer::eth_compileSolidityI);
this->bindAndAddMethod(jsonrpc::Procedure("eth_newFilter", jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_STRING, "param1",jsonrpc::JSON_OBJECT, NULL), &AbstractWebThreeStubServer::eth_newFilterI);
- this->bindAndAddMethod(jsonrpc::Procedure("eth_newBlockFilter", jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_STRING, "param1",jsonrpc::JSON_STRING, NULL), &AbstractWebThreeStubServer::eth_newBlockFilterI);
+ this->bindAndAddMethod(jsonrpc::Procedure("eth_newBlockFilter", jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_STRING, NULL), &AbstractWebThreeStubServer::eth_newBlockFilterI);
+ this->bindAndAddMethod(jsonrpc::Procedure("eth_newPendingTransactionFilter", jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_STRING, NULL), &AbstractWebThreeStubServer::eth_newPendingTransactionFilterI);
this->bindAndAddMethod(jsonrpc::Procedure("eth_uninstallFilter", jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_BOOLEAN, "param1",jsonrpc::JSON_STRING, NULL), &AbstractWebThreeStubServer::eth_uninstallFilterI);
this->bindAndAddMethod(jsonrpc::Procedure("eth_getFilterChanges", jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_ARRAY, "param1",jsonrpc::JSON_STRING, NULL), &AbstractWebThreeStubServer::eth_getFilterChangesI);
this->bindAndAddMethod(jsonrpc::Procedure("eth_getFilterLogs", jsonrpc::PARAMS_BY_POSITION, jsonrpc::JSON_ARRAY, "param1",jsonrpc::JSON_STRING, NULL), &AbstractWebThreeStubServer::eth_getFilterLogsI);
@@ -228,7 +229,13 @@ class AbstractWebThreeStubServer : public jsonrpc::AbstractServereth_newBlockFilter(request[0u].asString());
+ (void)request;
+ response = this->eth_newBlockFilter();
+ }
+ inline virtual void eth_newPendingTransactionFilterI(const Json::Value &request, Json::Value &response)
+ {
+ (void)request;
+ response = this->eth_newPendingTransactionFilter();
}
inline virtual void eth_uninstallFilterI(const Json::Value &request, Json::Value &response)
{
@@ -359,7 +366,8 @@ class AbstractWebThreeStubServer : public jsonrpc::AbstractServerc_str());
+ QString source;
+ if (location.sourceName)
+ source = QString::fromUtf8(location.sourceName->c_str());
if (m_codeModel->isContractOrFunctionLocation(location))
location = dev::SourceLocation(-1, -1, location.sourceName);
diff --git a/mix/CodeModel.cpp b/mix/CodeModel.cpp
index 434cf1e7d..1ca5d9160 100644
--- a/mix/CodeModel.cpp
+++ b/mix/CodeModel.cpp
@@ -67,7 +67,7 @@ private:
return LocationPair(_node.getLocation().start, _node.getLocation().end);
}
- virtual bool visit(FunctionDefinition const&)
+ virtual bool visit(FunctionDefinition const&) override
{
m_functionScope = true;
return true;
diff --git a/mix/MixClient.cpp b/mix/MixClient.cpp
index 7c0498ef0..c69619fcd 100644
--- a/mix/MixClient.cpp
+++ b/mix/MixClient.cpp
@@ -203,27 +203,29 @@ void MixClient::executeTransaction(Transaction const& _t, State& _state, bool _c
switch (er.excepted)
{
- case TransactionException::None:
- break;
- case TransactionException::NotEnoughCash:
- BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("Insufficient balance for contract deployment"));
- case TransactionException::OutOfGasBase:
- case TransactionException::OutOfGas:
- BOOST_THROW_EXCEPTION(OutOfGas() << errinfo_comment("Not enough gas"));
- case TransactionException::BlockGasLimitReached:
- BOOST_THROW_EXCEPTION(OutOfGas() << errinfo_comment("Block gas limit reached"));
- case TransactionException::OutOfStack:
- BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("Out of stack"));
- case TransactionException::StackUnderflow:
- BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("Stack underflow"));
- //these should not happen in mix
- case TransactionException::Unknown:
- case TransactionException::BadInstruction:
- case TransactionException::BadJumpDestination:
- case TransactionException::InvalidSignature:
- case TransactionException::InvalidNonce:
- BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("Internal execution error"));
- };
+ case TransactionException::None:
+ break;
+ case TransactionException::NotEnoughCash:
+ BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("Insufficient balance for contract deployment"));
+ case TransactionException::OutOfGasIntrinsic:
+ case TransactionException::OutOfGasBase:
+ case TransactionException::OutOfGas:
+ BOOST_THROW_EXCEPTION(OutOfGas() << errinfo_comment("Not enough gas"));
+ case TransactionException::BlockGasLimitReached:
+ BOOST_THROW_EXCEPTION(OutOfGas() << errinfo_comment("Block gas limit reached"));
+ case TransactionException::OutOfStack:
+ BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("Out of stack"));
+ case TransactionException::StackUnderflow:
+ BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("Stack underflow"));
+ //these should not happen in mix
+ case TransactionException::Unknown:
+ case TransactionException::BadInstruction:
+ case TransactionException::BadJumpDestination:
+ case TransactionException::InvalidSignature:
+ case TransactionException::InvalidNonce:
+ case TransactionException::BadRLP:
+ BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("Internal execution error"));
+ }
ExecutionResult d;
d.result = er;
diff --git a/mix/MixClient.h b/mix/MixClient.h
index 4c5b51a09..ea6416ac4 100644
--- a/mix/MixClient.h
+++ b/mix/MixClient.h
@@ -80,7 +80,7 @@ protected:
/// ClientBase methods
using ClientBase::asOf;
virtual dev::eth::State asOf(h256 const& _block) const override;
- virtual dev::eth::BlockChain& bc() { return *m_bc; }
+ virtual dev::eth::BlockChain& bc() override { return *m_bc; }
virtual dev::eth::BlockChain const& bc() const override { return *m_bc; }
virtual dev::eth::State preMine() const override { ReadGuard l(x_state); return m_startState; }
virtual dev::eth::State postMine() const override { ReadGuard l(x_state); return m_state; }
diff --git a/mix/qml/img/addblock.png b/mix/qml/img/addblock.png
new file mode 100644
index 000000000..016d0ddbb
Binary files /dev/null and b/mix/qml/img/addblock.png differ
diff --git a/mix/qml/img/addblock@2x.png b/mix/qml/img/addblock@2x.png
new file mode 100644
index 000000000..085fcb686
Binary files /dev/null and b/mix/qml/img/addblock@2x.png differ
diff --git a/mix/qml/img/duplicateicon.png b/mix/qml/img/duplicateicon.png
new file mode 100644
index 000000000..b3a255420
Binary files /dev/null and b/mix/qml/img/duplicateicon.png differ
diff --git a/mix/qml/img/duplicateicon@2x.png b/mix/qml/img/duplicateicon@2x.png
new file mode 100644
index 000000000..d0f5274d3
Binary files /dev/null and b/mix/qml/img/duplicateicon@2x.png differ
diff --git a/mix/qml/img/leftarrow.png b/mix/qml/img/leftarrow.png
new file mode 100644
index 000000000..2ce4936ef
Binary files /dev/null and b/mix/qml/img/leftarrow.png differ
diff --git a/mix/qml/img/leftarrow@2x.png b/mix/qml/img/leftarrow@2x.png
new file mode 100644
index 000000000..8602b02ea
Binary files /dev/null and b/mix/qml/img/leftarrow@2x.png differ
diff --git a/mix/qml/img/newaccounticon.png b/mix/qml/img/newaccounticon.png
new file mode 100644
index 000000000..16bb66fcd
Binary files /dev/null and b/mix/qml/img/newaccounticon.png differ
diff --git a/mix/qml/img/newaccounticon@2x.png b/mix/qml/img/newaccounticon@2x.png
new file mode 100644
index 000000000..925dad67d
Binary files /dev/null and b/mix/qml/img/newaccounticon@2x.png differ
diff --git a/mix/qml/img/recyclediscard.png b/mix/qml/img/recyclediscard.png
new file mode 100644
index 000000000..587d9ece3
Binary files /dev/null and b/mix/qml/img/recyclediscard.png differ
diff --git a/mix/qml/img/recyclediscard@2x.png b/mix/qml/img/recyclediscard@2x.png
new file mode 100644
index 000000000..8392198cb
Binary files /dev/null and b/mix/qml/img/recyclediscard@2x.png differ
diff --git a/mix/qml/img/recycleicon.png b/mix/qml/img/recycleicon.png
new file mode 100644
index 000000000..a4bacb21f
Binary files /dev/null and b/mix/qml/img/recycleicon.png differ
diff --git a/mix/qml/img/recycleicon@2x.png b/mix/qml/img/recycleicon@2x.png
new file mode 100644
index 000000000..00f42abd8
Binary files /dev/null and b/mix/qml/img/recycleicon@2x.png differ
diff --git a/mix/qml/img/recyclekeep.png b/mix/qml/img/recyclekeep.png
new file mode 100644
index 000000000..8f7232334
Binary files /dev/null and b/mix/qml/img/recyclekeep.png differ
diff --git a/mix/qml/img/recyclekeep@2x.png b/mix/qml/img/recyclekeep@2x.png
new file mode 100644
index 000000000..37891ce5a
Binary files /dev/null and b/mix/qml/img/recyclekeep@2x.png differ
diff --git a/mix/qml/img/restoreicon.png b/mix/qml/img/restoreicon.png
new file mode 100644
index 000000000..9fc6e8f22
Binary files /dev/null and b/mix/qml/img/restoreicon.png differ
diff --git a/mix/qml/img/restoreicon@2x.png b/mix/qml/img/restoreicon@2x.png
new file mode 100644
index 000000000..3160b0bf3
Binary files /dev/null and b/mix/qml/img/restoreicon@2x.png differ
diff --git a/mix/qml/img/rightarrow.png b/mix/qml/img/rightarrow.png
new file mode 100644
index 000000000..54f2b401f
Binary files /dev/null and b/mix/qml/img/rightarrow.png differ
diff --git a/mix/qml/img/rightarrow@2x.png b/mix/qml/img/rightarrow@2x.png
new file mode 100644
index 000000000..6ed1e6d1b
Binary files /dev/null and b/mix/qml/img/rightarrow@2x.png differ
diff --git a/mix/qml/img/saveicon.png b/mix/qml/img/saveicon.png
new file mode 100644
index 000000000..46e17522b
Binary files /dev/null and b/mix/qml/img/saveicon.png differ
diff --git a/mix/qml/img/saveicon@2x.png b/mix/qml/img/saveicon@2x.png
new file mode 100644
index 000000000..0f77a1af8
Binary files /dev/null and b/mix/qml/img/saveicon@2x.png differ
diff --git a/mix/qml/img/sendtransactionicon.png b/mix/qml/img/sendtransactionicon.png
new file mode 100644
index 000000000..02f359122
Binary files /dev/null and b/mix/qml/img/sendtransactionicon.png differ
diff --git a/mix/qml/img/sendtransactionicon@2x.png b/mix/qml/img/sendtransactionicon@2x.png
new file mode 100644
index 000000000..bb30b0b08
Binary files /dev/null and b/mix/qml/img/sendtransactionicon@2x.png differ
diff --git a/test/libethereum/StateTestsFiller/stPreCompiledContractsFiller.json b/test/libethereum/StateTestsFiller/stPreCompiledContractsFiller.json
index 1b2d59385..1c870c543 100644
--- a/test/libethereum/StateTestsFiller/stPreCompiledContractsFiller.json
+++ b/test/libethereum/StateTestsFiller/stPreCompiledContractsFiller.json
@@ -42,7 +42,2072 @@
}
},
+ "CallEcrecoverH_prefixed0": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xa0b29af6a56d6cfef6415cb195ccbe540e006d0a",
+ "0x01" : "0x00",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ (MSTORE 0 0x00c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 300000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "3652240",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallEcrecoverV_prefixed0": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
+ "0x01" : "0x01",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 0x001c) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 300000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "3652240",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallEcrecoverR_prefixed0": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0x3f17f1962b36e491b30a40b2405849e597ba5fb5",
+ "0x01" : "0x00",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x00b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 300000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "3652240",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallEcrecoverS_prefixed0": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xb4950a7fad428434b11c357fa6d4b4bcd3096a5d",
+ "0x01" : "0x00",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0x00b940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 300000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "3652240",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
"CallEcrecover80": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0x3f17f1962b36e491b30a40b2405849e597ba5fb5",
+ "0x01" : "0x00",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ (MSTORE 0 0x00c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x00b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0x00b940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 300000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "3652240",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallEcrecover0_overlappingInputOutput": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
+ "0x01" : "0x01",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 300000 1 0 0 128 64 32) [[ 0 ]] (MOD (MLOAD 64) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+
+ "CallEcrecover0_completeReturnValue": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 3000 1 0 0 128 128 32) [[ 0 ]] (MLOAD 128) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallEcrecover0_gas3000": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
+ "0x01" : "0x01",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 3000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallEcrecover0_NoGas": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0x011248"
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 0 1 1 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallEcrecover0_Gas2999": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x02" : "0x00"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 2999 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallEcrecover0_0input": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ [[ 2 ]] (CALL 300000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "3652240",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallEcrecover1": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 1) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 100000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallEcrecover2": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 33 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 65 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 100000 1 0 0 97 97 32) [[ 0 ]] (MOD (MLOAD 97) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallEcrecover3": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xe4319f4b631c6d0fcfc84045dbcb676865fe5e13",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ (MSTORE 0 0x2f380a2dea7e778d81affc2443403b8fe4644db442ae4862ff5bb3732829cdb9) (MSTORE 32 27) (MSTORE 64 0x6b65ccb0558806e9b097f27a396d08f964e37b8b7af6ceeb516ff86739fbea0a) (MSTORE 96 0x37cbc8d883e129a4b1ef9d5f1df53c4f21a3ef147cf2a50a4ede0eb06ce092d4) [[ 2 ]] (CALL 100000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallSha256_0": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xec4916dd28fc4c10d78e287ca5d9cc51ee1ae73cbfde08c6b37324cbfaac8bc5"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "0x600160005260206000602060006000600260fff1600051600055",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallSha256_1": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ [[ 2 ]] (CALL 500 2 0 0 0 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallSha256_1_nonzeroValue": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "100000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "0000000000000000000000000000000000000002" : {
+ "balance" : "19"
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "200000000",
+ "nonce" : "0",
+ "code" : "{ [[ 2 ]] (CALL 200000 2 0x13 0 0 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallSha256_2": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xcb39b3bde22925b2f931111130c774761d8895e0e08437c9b396c1e97d10f34d",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 5 0xf34578907f) [[ 2 ]] (CALL 500 2 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallSha256_3": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0x7392925565d67be8e9620aacbcfaecd8cb6ec58d709d25da9eccf1d08a41ce35",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 0 0xf34578907f) [[ 2 ]] (CALL 500 2 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallSha256_3_prefix0": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0x7392925565d67be8e9620aacbcfaecd8cb6ec58d709d25da9eccf1d08a41ce35",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 0 0x00f34578907f) [[ 2 ]] (CALL 500 2 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallSha256_3_postfix0": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0x3b745a1c00d035c334f358d007a430e4cf0ae63aa0556fb05529706de546464d",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 0 0xf34578907f00) [[ 2 ]] (CALL 500 2 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallSha256_4": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xaf9613760f72635fbdb44a5a0a63c39f12af30f950a6ee5c971be188e89c4051",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALL 100 2 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallSha256_4_gas99": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xaf9613760f72635fbdb44a5a0a63c39f12af30f950a6ee5c971be188e89c4051",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALL 99 2 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallSha256_5": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALL 600 2 0 0 1000000 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "10000000",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallRipemd160_0": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "0x600160005260206000602060006000600360fff1600051600055",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallRipemd160_1": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0x9c1185a5c5e9fc54612808977ee8f548b2258d31",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ [[ 2 ]] (CALL 600 3 0 0 0 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallRipemd160_2": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x00" : "0xdbc100f916bfbc53535573d98cf0cbb3a5b36124",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 5 0xf34578907f) [[ 2 ]] (CALL 6000 3 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallRipemd160_3": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x00" : "0x316750573f9be26bc17727b47cacedbd0ab3e6ca",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 0 0xf34578907f) [[ 2 ]] (CALL 6000 3 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallRipemd160_3_prefixed0": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x00" : "0x316750573f9be26bc17727b47cacedbd0ab3e6ca",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 0 0x00f34578907f) [[ 2 ]] (CALL 6000 3 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallRipemd160_3_postfixed0": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x00" : "0x7730b4642169b0f16752696da8da830a4b429c9d",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 0 0xf34578907f00) [[ 2 ]] (CALL 6000 3 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallRipemd160_4": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x00" : "0x1cf4e77f5966e13e109703cd8a0df7ceda7f3dc3",
+ "0x02" : "0x01" }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALL 720 3 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallRipemd160_4_gas719": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALL 719 3 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallRipemd160_5": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALL 6000 3 0 0 1000000 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "10000000",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallIdentitiy_0": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0000000000000000000000000000000000000000000000000000000000000001"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "0x600160005260206000602060006000600460fff1600051600055",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallIdentitiy_1": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0x00",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ [[ 2 ]] (CALL 500 4 0 0 0 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallIdentity_1_nonzeroValue": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "100000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "0000000000000000000000000000000000000004" : {
+ "balance" : "19"
+ },
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0x00",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "200000000",
+ "nonce" : "0",
+ "code" : "{ [[ 2 ]] (CALL 200000 4 0x13 0 0 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallIdentity_2": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0x000000000000000000000000000000000000000000000000000000f34578907f",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 0 0xf34578907f) [[ 2 ]] (CALL 500 4 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallIdentity_3": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0x000000000000000000000000000000000000000000000000000000f34578907f",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 0 0xf34578907f) [[ 2 ]] (CALL 500 4 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallIdentity_4": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALL 100 4 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallIdentity_4_gas18": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALL 18 4 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallIdentity_4_gas17": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "0x02" : "0x00"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALL 17 4 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CallIdentity_5": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALL 600 4 0 0 1000000 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "10000000",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CALLCODEEcrecover0": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
+ "0x01" : "0x01",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALLCODE 300000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "3652240",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CALLCODEEcrecoverH_prefixed0": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xa0b29af6a56d6cfef6415cb195ccbe540e006d0a",
+ "0x01" : "0x00",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ (MSTORE 0 0x00c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALLCODE 300000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "3652240",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CALLCODEEcrecoverV_prefixed0": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
+ "0x01" : "0x01",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 0x001c) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALLCODE 300000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "3652240",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CALLCODEEcrecoverR_prefixed0": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0x3f17f1962b36e491b30a40b2405849e597ba5fb5",
+ "0x01" : "0x00",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x00b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALLCODE 300000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "3652240",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CALLCODEEcrecoverS_prefixed0": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xb4950a7fad428434b11c357fa6d4b4bcd3096a5d",
+ "0x01" : "0x00",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0x00b940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALLCODE 300000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "3652240",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CALLCODEEcrecover80": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0x3f17f1962b36e491b30a40b2405849e597ba5fb5",
+ "0x01" : "0x00",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ (MSTORE 0 0x00c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x00b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0x00b940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALLCODE 300000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "3652240",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CALLCODEEcrecover0_overlappingInputOutput": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
+ "0x01" : "0x01",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALLCODE 300000 1 0 0 128 64 32) [[ 0 ]] (MOD (MLOAD 64) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+
+ "CALLCODEEcrecover0_completeReturnValue": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -55,7 +2120,6 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"storage" : {
"0x" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
- "0x01" : "0x01",
"0x02" : "0x01"
}
}
@@ -64,7 +2128,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code": "{ (MSTORE 0 0x00c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x00b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0x00b940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 300000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALLCODE 3000 1 0 0 128 128 32) [[ 0 ]] (MLOAD 128) }",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -77,7 +2141,7 @@
"transaction" : {
"nonce" : "0",
"gasPrice" : "1",
- "gasLimit" : "3652240",
+ "gasLimit" : "365224",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
"value" : "100000",
"secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
@@ -85,7 +2149,7 @@
}
},
- "CallEcrecover0_overlappingInputOutput": {
+ "CALLCODEEcrecover0_gas3000": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -107,7 +2171,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 300000 1 0 0 128 64 32) [[ 0 ]] (MOD (MLOAD 64) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALLCODE 3000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -128,8 +2192,7 @@
}
},
-
- "CallEcrecover0_completeReturnValue": {
+ "CALLCODEEcrecover0_NoGas": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -139,18 +2202,15 @@
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
},
"expect" : {
- "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
- "storage" : {
- "0x" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
- "0x02" : "0x01"
- }
+ "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba" : {
+ "balance" : "0xb0a0"
}
},
"pre" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 3000 1 0 0 128 128 32) [[ 0 ]] (MLOAD 128) }",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALLCODE 0 1 1 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -171,7 +2231,7 @@
}
},
- "CallEcrecover0_gas3000": {
+ "CALLCODEEcrecover0_Gas2999": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -183,9 +2243,7 @@
"expect" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"storage" : {
- "0x" : "0xa94f5374fce5edbc8e2a8697c15331677e6ebf0b",
- "0x01" : "0x01",
- "0x02" : "0x01"
+ "0x02" : "0x00"
}
}
},
@@ -193,7 +2251,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 3000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALLCODE 2999 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -214,7 +2272,7 @@
}
},
- "CallEcrecover0_BonusGas": {
+ "CALLCODEEcrecover0_0input": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -226,6 +2284,7 @@
"expect" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"storage" : {
+ "0x02" : "0x01"
}
}
},
@@ -233,7 +2292,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 0 1 1 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "code": "{ [[ 2 ]] (CALLCODE 300000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) }",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -246,7 +2305,7 @@
"transaction" : {
"nonce" : "0",
"gasPrice" : "1",
- "gasLimit" : "365224",
+ "gasLimit" : "3652240",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
"value" : "100000",
"secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
@@ -254,7 +2313,7 @@
}
},
- "CallEcrecover0_Gas2999": {
+ "CALLCODEEcrecover1": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -266,6 +2325,7 @@
"expect" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"storage" : {
+ "0x02" : "0x01"
}
}
},
@@ -273,7 +2333,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 2999 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 1) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALLCODE 100000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -294,7 +2354,7 @@
}
},
- "CallEcrecover0_0input": {
+ "CALLCODEEcrecover2": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -314,7 +2374,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code": "{ [[ 2 ]] (CALL 300000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) }",
+ "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 33 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 65 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALLCODE 100000 1 0 0 97 97 32) [[ 0 ]] (MOD (MLOAD 97) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -327,7 +2387,7 @@
"transaction" : {
"nonce" : "0",
"gasPrice" : "1",
- "gasLimit" : "3652240",
+ "gasLimit" : "365224",
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
"value" : "100000",
"secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
@@ -335,7 +2395,7 @@
}
},
- "CallEcrecover1": {
+ "CALLCODEEcrecover3": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -347,6 +2407,7 @@
"expect" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"storage" : {
+ "0x" : "0xe4319f4b631c6d0fcfc84045dbcb676865fe5e13",
"0x02" : "0x01"
}
}
@@ -355,7 +2416,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 1) (MSTORE 64 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 96 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 100000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "code": "{ (MSTORE 0 0x2f380a2dea7e778d81affc2443403b8fe4644db442ae4862ff5bb3732829cdb9) (MSTORE 32 27) (MSTORE 64 0x6b65ccb0558806e9b097f27a396d08f964e37b8b7af6ceeb516ff86739fbea0a) (MSTORE 96 0x37cbc8d883e129a4b1ef9d5f1df53c4f21a3ef147cf2a50a4ede0eb06ce092d4) [[ 2 ]] (CALLCODE 100000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -376,7 +2437,7 @@
}
},
- "CallEcrecover2": {
+ "CALLCODESha256_0": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -388,7 +2449,7 @@
"expect" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"storage" : {
- "0x02" : "0x01"
+ "0x" : "0xec4916dd28fc4c10d78e287ca5d9cc51ee1ae73cbfde08c6b37324cbfaac8bc5"
}
}
},
@@ -396,7 +2457,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code": "{ (MSTORE 0 0x18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c) (MSTORE 32 28) (MSTORE 33 0x73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f) (MSTORE 65 0xeeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549) [[ 2 ]] (CALL 100000 1 0 0 97 97 32) [[ 0 ]] (MOD (MLOAD 97) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "code" : "0x600160005260206000602060006000600260fff2600051600055",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -417,7 +2478,7 @@
}
},
- "CallEcrecover3": {
+ "CALLCODESha256_1": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -429,7 +2490,7 @@
"expect" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"storage" : {
- "0x" : "0xe4319f4b631c6d0fcfc84045dbcb676865fe5e13",
+ "0x" : "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"0x02" : "0x01"
}
}
@@ -438,7 +2499,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code": "{ (MSTORE 0 0x2f380a2dea7e778d81affc2443403b8fe4644db442ae4862ff5bb3732829cdb9) (MSTORE 32 27) (MSTORE 64 0x6b65ccb0558806e9b097f27a396d08f964e37b8b7af6ceeb516ff86739fbea0a) (MSTORE 96 0x37cbc8d883e129a4b1ef9d5f1df53c4f21a3ef147cf2a50a4ede0eb06ce092d4) [[ 2 ]] (CALL 100000 1 0 0 128 128 32) [[ 0 ]] (MOD (MLOAD 128) (EXP 2 160)) [[ 1 ]] (EQ (ORIGIN) (SLOAD 0)) }",
+ "code" : "{ [[ 2 ]] (CALLCODE 500 2 0 0 0 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -459,11 +2520,11 @@
}
},
- "CallSha256_0": {
+ "CALLCODESha256_1_nonzeroValue": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
- "currentGasLimit" : "10000000",
+ "currentGasLimit" : "100000000",
"currentDifficulty" : "256",
"currentTimestamp" : 1,
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
@@ -471,15 +2532,16 @@
"expect" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"storage" : {
- "0x" : "0xec4916dd28fc4c10d78e287ca5d9cc51ee1ae73cbfde08c6b37324cbfaac8bc5"
+ "0x" : "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "0x02" : "0x01"
}
}
},
"pre" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
- "balance" : "20000000",
+ "balance" : "200000000",
"nonce" : "0",
- "code" : "0x600160005260206000602060006000600260fff1600051600055",
+ "code" : "{ [[ 2 ]] (CALLCODE 200000 2 0x13 0 0 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -500,7 +2562,7 @@
}
},
- "CallSha256_1": {
+ "CALLCODESha256_2": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -512,7 +2574,7 @@
"expect" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"storage" : {
- "0x" : "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "0x" : "0xcb39b3bde22925b2f931111130c774761d8895e0e08437c9b396c1e97d10f34d",
"0x02" : "0x01"
}
}
@@ -521,7 +2583,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "{ [[ 2 ]] (CALL 500 2 0 0 0 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ (MSTORE 5 0xf34578907f) [[ 2 ]] (CALLCODE 500 2 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -542,31 +2604,28 @@
}
},
- "CallSha256_1_nonzeroValue": {
+ "CALLCODESha256_3": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
- "currentGasLimit" : "100000000",
+ "currentGasLimit" : "10000000",
"currentDifficulty" : "256",
"currentTimestamp" : 1,
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
},
"expect" : {
- "0000000000000000000000000000000000000002" : {
- "balance" : "19"
- },
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"storage" : {
- "0x" : "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
+ "0x" : "0x7392925565d67be8e9620aacbcfaecd8cb6ec58d709d25da9eccf1d08a41ce35",
"0x02" : "0x01"
}
}
},
"pre" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
- "balance" : "200000000",
+ "balance" : "20000000",
"nonce" : "0",
- "code" : "{ [[ 2 ]] (CALL 200000 2 0x13 0 0 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ (MSTORE 0 0xf34578907f) [[ 2 ]] (CALLCODE 500 2 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -587,7 +2646,7 @@
}
},
- "CallSha256_2": {
+ "CALLCODESha256_3_prefix0": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -599,7 +2658,7 @@
"expect" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"storage" : {
- "0x" : "0xcb39b3bde22925b2f931111130c774761d8895e0e08437c9b396c1e97d10f34d",
+ "0x" : "0x7392925565d67be8e9620aacbcfaecd8cb6ec58d709d25da9eccf1d08a41ce35",
"0x02" : "0x01"
}
}
@@ -608,7 +2667,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "{ (MSTORE 5 0xf34578907f) [[ 2 ]] (CALL 500 2 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ (MSTORE 0 0x00f34578907f) [[ 2 ]] (CALLCODE 500 2 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -629,7 +2688,7 @@
}
},
- "CallSha256_3": {
+ "CALLCODESha256_3_postfix0": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -641,7 +2700,7 @@
"expect" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"storage" : {
- "0x" : "0x7392925565d67be8e9620aacbcfaecd8cb6ec58d709d25da9eccf1d08a41ce35",
+ "0x" : "0x3b745a1c00d035c334f358d007a430e4cf0ae63aa0556fb05529706de546464d",
"0x02" : "0x01"
}
}
@@ -650,7 +2709,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "{ (MSTORE 0 0xf34578907f) [[ 2 ]] (CALL 500 2 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ (MSTORE 0 0xf34578907f00) [[ 2 ]] (CALLCODE 500 2 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -671,7 +2730,7 @@
}
},
- "CallSha256_4": {
+ "CALLCODESha256_4": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -692,7 +2751,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALL 100 2 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALLCODE 100 2 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -713,7 +2772,7 @@
}
},
- "CallSha256_4_gas99": {
+ "CALLCODESha256_4_gas99": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -734,7 +2793,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALL 99 2 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALLCODE 99 2 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -755,7 +2814,7 @@
}
},
- "CallSha256_5": {
+ "CALLCODESha256_5": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -775,7 +2834,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALL 600 2 0 0 1000000 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALLCODE 600 2 0 0 1000000 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -796,7 +2855,7 @@
}
},
- "CallRipemd160_0": {
+ "CALLCODERipemd160_0": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -816,7 +2875,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "0x600160005260206000602060006000600360fff1600051600055",
+ "code" : "0x600160005260206000602060006000600360fff2600051600055",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -837,7 +2896,7 @@
}
},
- "CallRipemd160_1": {
+ "CALLCODERipemd160_1": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -858,7 +2917,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "{ [[ 2 ]] (CALL 600 3 0 0 0 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ [[ 2 ]] (CALLCODE 600 3 0 0 0 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -879,7 +2938,7 @@
}
},
- "CallRipemd160_2": {
+ "CALLCODERipemd160_2": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -891,6 +2950,8 @@
"expect" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"storage" : {
+ "0x00" : "0xdbc100f916bfbc53535573d98cf0cbb3a5b36124",
+ "0x02" : "0x01"
}
}
},
@@ -898,7 +2959,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "{ (MSTORE 5 0xf34578907f) [[ 2 ]] (CALL 600 3 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ (MSTORE 5 0xf34578907f) [[ 2 ]] (CALLCODE 6000 3 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -919,7 +2980,7 @@
}
},
- "CallRipemd160_3": {
+ "CALLCODERipemd160_3": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -931,7 +2992,8 @@
"expect" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"storage" : {
- "0x" : "0xf34578907f"
+ "0x00" : "0x316750573f9be26bc17727b47cacedbd0ab3e6ca",
+ "0x02" : "0x01"
}
}
},
@@ -939,7 +3001,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "{ (MSTORE 0 0xf34578907f) [[ 2 ]] (CALL 600 3 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ (MSTORE 0 0xf34578907f) [[ 2 ]] (CALLCODE 6000 3 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -960,7 +3022,7 @@
}
},
- "CallRipemd160_4": {
+ "CALLCODERipemd160_3_prefixed0": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -972,7 +3034,50 @@
"expect" : {
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"storage" : {
- "0x" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
+ "0x00" : "0x316750573f9be26bc17727b47cacedbd0ab3e6ca",
+ "0x02" : "0x01"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 0 0x00f34578907f) [[ 2 ]] (CALLCODE 6000 3 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CALLCODERipemd160_3_postfixed0": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x00" : "0x7730b4642169b0f16752696da8da830a4b429c9d",
+ "0x02" : "0x01"
}
}
},
@@ -980,7 +3085,48 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALL 120 3 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ (MSTORE 0 0xf34578907f00) [[ 2 ]] (CALLCODE 6000 3 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "365224",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "CALLCODERipemd160_4": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x00" : "0x1cf4e77f5966e13e109703cd8a0df7ceda7f3dc3",
+ "0x02" : "0x01" }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALLCODE 720 3 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -1001,7 +3147,7 @@
}
},
- "CallRipemd160_4_gas99": {
+ "CALLCODERipemd160_4_gas719": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -1021,7 +3167,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALL 119 3 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALLCODE 719 3 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -1042,7 +3188,7 @@
}
},
- "CallRipemd160_5": {
+ "CALLCODERipemd160_5": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -1062,7 +3208,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALL 600 3 0 0 1000000 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALLCODE 6000 3 0 0 1000000 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -1083,7 +3229,7 @@
}
},
- "CallIdentitiy_0": {
+ "CALLCODEIdentitiy_0": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -1103,7 +3249,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "0x600160005260206000602060006000600460fff1600051600055",
+ "code" : "0x600160005260206000602060006000600460fff2600051600055",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -1124,7 +3270,7 @@
}
},
- "CallIdentitiy_1": {
+ "CALLCODEIdentitiy_1": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -1145,7 +3291,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "{ [[ 2 ]] (CALL 500 4 0 0 0 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ [[ 2 ]] (CALLCODE 500 4 0 0 0 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -1166,7 +3312,7 @@
}
},
- "CallIdentity_1_nonzeroValue": {
+ "CALLCODEIdentity_1_nonzeroValue": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -1176,9 +3322,6 @@
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
},
"expect" : {
- "0000000000000000000000000000000000000004" : {
- "balance" : "19"
- },
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"storage" : {
"0x" : "0x00",
@@ -1190,7 +3333,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "200000000",
"nonce" : "0",
- "code" : "{ [[ 2 ]] (CALL 200000 4 0x13 0 0 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ [[ 2 ]] (CALLCODE 200000 4 0x13 0 0 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -1211,7 +3354,7 @@
}
},
- "CallIdentity_2": {
+ "CALLCODEIdentity_2": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -1232,7 +3375,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "{ (MSTORE 0 0xf34578907f) [[ 2 ]] (CALL 500 4 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ (MSTORE 0 0xf34578907f) [[ 2 ]] (CALLCODE 500 4 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -1253,7 +3396,7 @@
}
},
- "CallIdentity_3": {
+ "CALLCODEIdentity_3": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -1274,7 +3417,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "{ (MSTORE 0 0xf34578907f) [[ 2 ]] (CALL 500 4 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ (MSTORE 0 0xf34578907f) [[ 2 ]] (CALLCODE 500 4 0 0 37 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -1295,7 +3438,7 @@
}
},
- "CallIdentity_4": {
+ "CALLCODEIdentity_4": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -1316,7 +3459,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALL 100 4 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALLCODE 100 4 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -1337,7 +3480,7 @@
}
},
- "CallIdentity_4_gas18": {
+ "CALLCODEIdentity_4_gas18": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -1358,7 +3501,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALL 18 4 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALLCODE 18 4 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -1379,7 +3522,7 @@
}
},
- "CallIdentity_4_gas17": {
+ "CALLCODEIdentity_4_gas17": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -1400,7 +3543,7 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALL 17 4 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALLCODE 17 4 0 0 32 0 32) [[ 0 ]] (MLOAD 0)}",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -1421,7 +3564,7 @@
}
},
- "CallIdentity_5": {
+ "CALLCODEIdentity_5": {
"env" : {
"previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
"currentNumber" : "0",
@@ -1441,7 +3584,48 @@
"095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
"balance" : "20000000",
"nonce" : "0",
- "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALL 600 4 0 0 1000000 0 32) [[ 0 ]] (MLOAD 0)}",
+ "code" : "{ (MSTORE 0 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) [[ 2 ]] (CALLCODE 600 4 0 0 1000000 0 32) [[ 0 ]] (MLOAD 0)}",
+ "storage": {}
+ },
+ "a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
+ "balance" : "1000000000000000000",
+ "nonce" : "0",
+ "code" : "",
+ "storage": {}
+ }
+ },
+ "transaction" : {
+ "nonce" : "0",
+ "gasPrice" : "1",
+ "gasLimit" : "10000000",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000",
+ "secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
+ "data" : ""
+ }
+ },
+
+ "sec80": {
+ "env" : {
+ "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6",
+ "currentNumber" : "0",
+ "currentGasLimit" : "10000000",
+ "currentDifficulty" : "256",
+ "currentTimestamp" : 1,
+ "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba"
+ },
+ "expect" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "storage" : {
+ "0x00" : "0xc001f00d"
+ }
+ }
+ },
+ "pre" : {
+ "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
+ "balance" : "20000000",
+ "nonce" : "0",
+ "code" : "0x601b565b6000555b005b630badf00d6003565b63c001f00d6003565b7319e7e376e7c213b7e7e7e46cc70a5dd086daff2a7f22ae6da6b482f9b1b19b0b897c3fd43884180a1c5ee361e1107a1bc635649dda600052601b603f537f16433dce375ce6dc8151d3f0a22728bc4a1d9fd6ed39dfd18b4609331937367f6040527f306964c0cf5d74f04129fdc60b54d35b596dde1bf89ad92cb4123318f4c0e40060605260206080607f60006000600161fffff21560075760805114601257600956",
"storage": {}
},
"a94f5374fce5edbc8e2a8697c15331677e6ebf0b" : {
@@ -1460,6 +3644,6 @@
"secretKey" : "45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8",
"data" : ""
}
- }
+ },
}
diff --git a/test/libethereum/StateTestsFiller/stSpecialTestFiller.json b/test/libethereum/StateTestsFiller/stSpecialTestFiller.json
index aeaebefd8..8dee4af11 100644
--- a/test/libethereum/StateTestsFiller/stSpecialTestFiller.json
+++ b/test/libethereum/StateTestsFiller/stSpecialTestFiller.json
@@ -194,44 +194,6 @@
}
},
- "txfrom0_deja" : {
- "env" : {
- "currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
- "currentDifficulty" : "256",
- "currentGasLimit" : "1000000",
- "currentNumber" : "0",
- "currentTimestamp" : 1,
- "previousHash" : "5e20a0453cecd065ea59c37ac63e079ee08998b6045136a8ce6635c7912ec0b6"
- },
- "pre" : {
- "095e7baea6a6c7c4c2dfeb977efac326af552d87" : {
- "balance" : "1000000000000000000",
- "code" : "0x6042601f53600064ffffffffff2080",
- "nonce" : "0",
- "storage" : {
- }
- },
- "0000000000000000000000000000000000000000" : {
- "balance" : "1000000000000000000",
- "code" : "0x",
- "nonce" : "0",
- "storage" : {
- }
- }
- },
- "transaction" : {
- "data" : "",
- "gasLimit" : "1000000",
- "gasPrice" : "0",
- "nonce" : "0",
- "r" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
- "s" : "0xbadf00d70ec28c94a3b55ec771bcbc70778d6ee0b51ca7ea9514594c861b1884",
- "v": "27",
- "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
- "value" : "100000"
- }
- },
-
"JUMPDEST_Attack" : {
"env" : {
"currentCoinbase" : "2adc25665018aa1fe0e6bc666dac8fc2697ff9ba",
diff --git a/test/libethereum/TransactionTestsFiller/ttTransactionTestFiller.json b/test/libethereum/TransactionTestsFiller/ttTransactionTestFiller.json
index 410434d1d..c5789f859 100644
--- a/test/libethereum/TransactionTestsFiller/ttTransactionTestFiller.json
+++ b/test/libethereum/TransactionTestsFiller/ttTransactionTestFiller.json
@@ -15,6 +15,21 @@
}
},
+ "invalidSignature" : {
+ "expect" : "invalid",
+ "transaction" : {
+ "data" : "",
+ "gasLimit" : "1000000",
+ "gasPrice" : "0",
+ "nonce" : "0",
+ "r" : "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
+ "s" : "0xbadf00d70ec28c94a3b55ec771bcbc70778d6ee0b51ca7ea9514594c861b1884",
+ "v": "27",
+ "to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87",
+ "value" : "100000"
+ }
+ },
+
"NotEnoughGasLimit" : {
"expect" : "invalid",
"transaction" :
diff --git a/test/libp2p/net.cpp b/test/libp2p/net.cpp
index 1cd43b13f..a31537b98 100644
--- a/test/libp2p/net.cpp
+++ b/test/libp2p/net.cpp
@@ -74,7 +74,7 @@ struct TestNodeTable: public NodeTable
ret.push_back(make_pair(k,s_basePort+i));
}
- return std::move(ret);
+ return ret;
}
void pingTestNodes(std::vector> const& _testNodes)
diff --git a/test/libweb3jsonrpc/webthreestubclient.h b/test/libweb3jsonrpc/webthreestubclient.h
index 51d556eec..99fe48034 100644
--- a/test/libweb3jsonrpc/webthreestubclient.h
+++ b/test/libweb3jsonrpc/webthreestubclient.h
@@ -374,16 +374,26 @@ class WebThreeStubClient : public jsonrpc::Client
else
throw jsonrpc::JsonRpcException(jsonrpc::Errors::ERROR_CLIENT_INVALID_RESPONSE, result.toStyledString());
}
- std::string eth_newBlockFilter(const std::string& param1) throw (jsonrpc::JsonRpcException)
+ std::string eth_newBlockFilter() throw (jsonrpc::JsonRpcException)
{
Json::Value p;
- p.append(param1);
+ p = Json::nullValue;
Json::Value result = this->CallMethod("eth_newBlockFilter",p);
if (result.isString())
return result.asString();
else
throw jsonrpc::JsonRpcException(jsonrpc::Errors::ERROR_CLIENT_INVALID_RESPONSE, result.toStyledString());
}
+ std::string eth_newPendingTransactionFilter() throw (jsonrpc::JsonRpcException)
+ {
+ Json::Value p;
+ p = Json::nullValue;
+ Json::Value result = this->CallMethod("eth_newPendingTransactionFilter",p);
+ if (result.isString())
+ return result.asString();
+ else
+ throw jsonrpc::JsonRpcException(jsonrpc::Errors::ERROR_CLIENT_INVALID_RESPONSE, result.toStyledString());
+ }
bool eth_uninstallFilter(const std::string& param1) throw (jsonrpc::JsonRpcException)
{
Json::Value p;
diff --git a/test/libwhisper/whisperMessage.cpp b/test/libwhisper/whisperMessage.cpp
index 56a763622..343573713 100644
--- a/test/libwhisper/whisperMessage.cpp
+++ b/test/libwhisper/whisperMessage.cpp
@@ -37,7 +37,7 @@ Topics createRandomTopics(unsigned int i)
ret.push_back(t);
}
- return move(ret);
+ return ret;
}
bytes createRandomPayload(unsigned int i)
@@ -48,7 +48,7 @@ bytes createRandomPayload(unsigned int i)
for (int j = 0; j < sz; ++j)
ret.push_back(rand() % 256);
- return move(ret);
+ return ret;
}
void comparePayloads(Message const& m1, Message const& m2)