Gav Wood
10 years ago
48 changed files with 1444 additions and 666 deletions
@ -1,105 +0,0 @@ |
|||
|
|||
/*
|
|||
This file is part of cpp-ethereum. |
|||
|
|||
cpp-ethereum is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
cpp-ethereum is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/**
|
|||
* @author Christian <c@ethdev.com> |
|||
* @date 2014 |
|||
* Callgraph of functions inside a contract. |
|||
*/ |
|||
|
|||
#include <libsolidity/AST.h> |
|||
#include <libsolidity/CallGraph.h> |
|||
|
|||
using namespace std; |
|||
|
|||
namespace dev |
|||
{ |
|||
namespace solidity |
|||
{ |
|||
|
|||
void CallGraph::addNode(ASTNode const& _node) |
|||
{ |
|||
if (!m_nodesSeen.count(&_node)) |
|||
{ |
|||
m_workQueue.push(&_node); |
|||
m_nodesSeen.insert(&_node); |
|||
} |
|||
} |
|||
|
|||
set<FunctionDefinition const*> const& CallGraph::getCalls() |
|||
{ |
|||
computeCallGraph(); |
|||
return m_functionsSeen; |
|||
} |
|||
|
|||
void CallGraph::computeCallGraph() |
|||
{ |
|||
while (!m_workQueue.empty()) |
|||
{ |
|||
m_workQueue.front()->accept(*this); |
|||
m_workQueue.pop(); |
|||
} |
|||
} |
|||
|
|||
bool CallGraph::visit(Identifier const& _identifier) |
|||
{ |
|||
if (auto fun = dynamic_cast<FunctionDefinition const*>(_identifier.getReferencedDeclaration())) |
|||
{ |
|||
if (m_functionOverrideResolver) |
|||
fun = (*m_functionOverrideResolver)(fun->getName()); |
|||
solAssert(fun, "Error finding override for function " + fun->getName()); |
|||
addNode(*fun); |
|||
} |
|||
if (auto modifier = dynamic_cast<ModifierDefinition const*>(_identifier.getReferencedDeclaration())) |
|||
{ |
|||
if (m_modifierOverrideResolver) |
|||
modifier = (*m_modifierOverrideResolver)(modifier->getName()); |
|||
solAssert(modifier, "Error finding override for modifier " + modifier->getName()); |
|||
addNode(*modifier); |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
bool CallGraph::visit(FunctionDefinition const& _function) |
|||
{ |
|||
m_functionsSeen.insert(&_function); |
|||
return true; |
|||
} |
|||
|
|||
bool CallGraph::visit(MemberAccess const& _memberAccess) |
|||
{ |
|||
// used for "BaseContract.baseContractFunction"
|
|||
if (_memberAccess.getExpression().getType()->getCategory() == Type::Category::TYPE) |
|||
{ |
|||
TypeType const& type = dynamic_cast<TypeType const&>(*_memberAccess.getExpression().getType()); |
|||
if (type.getMembers().getMemberType(_memberAccess.getMemberName())) |
|||
{ |
|||
ContractDefinition const& contract = dynamic_cast<ContractType const&>(*type.getActualType()) |
|||
.getContractDefinition(); |
|||
for (ASTPointer<FunctionDefinition> const& function: contract.getDefinedFunctions()) |
|||
if (function->getName() == _memberAccess.getMemberName()) |
|||
{ |
|||
addNode(*function); |
|||
return true; |
|||
} |
|||
} |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
} |
|||
} |
@ -1,69 +0,0 @@ |
|||
/*
|
|||
This file is part of cpp-ethereum. |
|||
|
|||
cpp-ethereum is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
cpp-ethereum is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/**
|
|||
* @author Christian <c@ethdev.com> |
|||
* @date 2014 |
|||
* Callgraph of functions inside a contract. |
|||
*/ |
|||
|
|||
#include <set> |
|||
#include <queue> |
|||
#include <functional> |
|||
#include <boost/range/iterator_range.hpp> |
|||
#include <libsolidity/ASTVisitor.h> |
|||
|
|||
namespace dev |
|||
{ |
|||
namespace solidity |
|||
{ |
|||
|
|||
/**
|
|||
* Can be used to compute the graph of calls (or rather references) between functions of the same |
|||
* contract. Current functionality is limited to computing all functions that are directly |
|||
* or indirectly called by some functions. |
|||
*/ |
|||
class CallGraph: private ASTConstVisitor |
|||
{ |
|||
public: |
|||
using FunctionOverrideResolver = std::function<FunctionDefinition const*(std::string const&)>; |
|||
using ModifierOverrideResolver = std::function<ModifierDefinition const*(std::string const&)>; |
|||
|
|||
CallGraph(FunctionOverrideResolver const& _functionOverrideResolver, |
|||
ModifierOverrideResolver const& _modifierOverrideResolver): |
|||
m_functionOverrideResolver(&_functionOverrideResolver), |
|||
m_modifierOverrideResolver(&_modifierOverrideResolver) {} |
|||
|
|||
void addNode(ASTNode const& _node); |
|||
|
|||
std::set<FunctionDefinition const*> const& getCalls(); |
|||
|
|||
private: |
|||
virtual bool visit(FunctionDefinition const& _function) override; |
|||
virtual bool visit(Identifier const& _identifier) override; |
|||
virtual bool visit(MemberAccess const& _memberAccess) override; |
|||
|
|||
void computeCallGraph(); |
|||
|
|||
FunctionOverrideResolver const* m_functionOverrideResolver; |
|||
ModifierOverrideResolver const* m_modifierOverrideResolver; |
|||
std::set<ASTNode const*> m_nodesSeen; |
|||
std::set<FunctionDefinition const*> m_functionsSeen; |
|||
std::queue<ASTNode const*> m_workQueue; |
|||
}; |
|||
|
|||
} |
|||
} |
@ -1,46 +0,0 @@ |
|||
/*
|
|||
This file is part of cpp-ethereum. |
|||
|
|||
cpp-ethereum is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
cpp-ethereum is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file CorsHttpServer.cpp
|
|||
* @author Marek Kotewicz <marek@ethdev.com> |
|||
* @date 2014 |
|||
*/ |
|||
|
|||
#include "CorsHttpServer.h" |
|||
|
|||
namespace jsonrpc |
|||
{ |
|||
|
|||
int HttpServer::callback(struct mg_connection*) |
|||
{ |
|||
return 0; |
|||
} |
|||
|
|||
bool CorsHttpServer::SendResponse(std::string const& _response, void* _addInfo) |
|||
{ |
|||
struct mg_connection* conn = (struct mg_connection*) _addInfo; |
|||
if (mg_printf(conn, "HTTP/1.1 200 OK\r\n" |
|||
"Content-Type: application/json\r\n" |
|||
"Content-Length: %d\r\n" |
|||
"Access-Control-Allow-Origin: *\r\n" |
|||
"Access-Control-Allow-Headers: Content-Type\r\n" |
|||
"\r\n" |
|||
"%s",(int)_response.length(), _response.c_str()) > 0) |
|||
return true; |
|||
return false; |
|||
} |
|||
|
|||
} |
@ -1,35 +0,0 @@ |
|||
/*
|
|||
This file is part of cpp-ethereum. |
|||
|
|||
cpp-ethereum is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
cpp-ethereum is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file CorsHttpServer.h
|
|||
* @author Marek Kotewicz <marek@ethdev.com> |
|||
* @date 2014 |
|||
*/ |
|||
|
|||
#include <jsonrpccpp/server/connectors/httpserver.h> |
|||
|
|||
namespace jsonrpc |
|||
{ |
|||
|
|||
class CorsHttpServer: public HttpServer |
|||
{ |
|||
public: |
|||
using HttpServer::HttpServer; |
|||
bool virtual SendResponse(std::string const& _response, void* _addInfo = NULL); |
|||
}; |
|||
|
|||
} |
|||
|
@ -0,0 +1,219 @@ |
|||
/*
|
|||
This file is part of cpp-ethereum. |
|||
|
|||
cpp-ethereum is free software: you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation, either version 3 of the License, or |
|||
(at your option) any later version. |
|||
|
|||
cpp-ethereum is distributed in the hope that it will be useful, |
|||
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
GNU General Public License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with cpp-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
/** @file transaction.cpp
|
|||
* @author Dmitrii Khokhlov <winsvega@mail.ru> |
|||
* @date 2015 |
|||
* Transaaction test functions. |
|||
*/ |
|||
|
|||
#include "TestHelper.h" |
|||
|
|||
using namespace std; |
|||
using namespace json_spirit; |
|||
using namespace dev; |
|||
using namespace dev::eth; |
|||
|
|||
namespace dev { namespace test { |
|||
|
|||
Transaction createTransactionFromFields(mObject& _tObj) |
|||
{ |
|||
BOOST_REQUIRE(_tObj.count("data") > 0); |
|||
BOOST_REQUIRE(_tObj.count("value") > 0); |
|||
BOOST_REQUIRE(_tObj.count("gasPrice") > 0); |
|||
BOOST_REQUIRE(_tObj.count("gasLimit") > 0); |
|||
BOOST_REQUIRE(_tObj.count("nonce")> 0); |
|||
BOOST_REQUIRE(_tObj.count("to") > 0); |
|||
|
|||
BOOST_REQUIRE(_tObj.count("v") > 0); |
|||
BOOST_REQUIRE(_tObj.count("r") > 0); |
|||
BOOST_REQUIRE(_tObj.count("s") > 0); |
|||
|
|||
//Construct Rlp of the given transaction
|
|||
RLPStream rlpStream; |
|||
rlpStream.appendList(9); |
|||
rlpStream << bigint(_tObj["nonce"].get_str()) << bigint(_tObj["gasPrice"].get_str()) << bigint(_tObj["gasLimit"].get_str()); |
|||
if (_tObj["to"].get_str().empty()) |
|||
rlpStream << ""; |
|||
else |
|||
rlpStream << Address(_tObj["to"].get_str()); |
|||
rlpStream << bigint(_tObj["value"].get_str()) << importData(_tObj); |
|||
rlpStream << bigint(_tObj["v"].get_str()) << bigint(_tObj["r"].get_str()) << bigint(_tObj["s"].get_str()); |
|||
|
|||
return Transaction(rlpStream.out(), CheckSignature::Sender); |
|||
} |
|||
|
|||
void doTransactionTests(json_spirit::mValue& _v, bool _fillin) |
|||
{ |
|||
for (auto& i: _v.get_obj()) |
|||
{ |
|||
cerr << i.first << endl; |
|||
mObject& o = i.second.get_obj(); |
|||
|
|||
if (_fillin == false) |
|||
{ |
|||
BOOST_REQUIRE(o.count("rlp") > 0); |
|||
bytes rlpReaded = importByteArray(o["rlp"].get_str()); |
|||
Transaction txFromRlp; |
|||
|
|||
try |
|||
{ |
|||
txFromRlp = Transaction(rlpReaded, CheckSignature::Sender); |
|||
if (!txFromRlp.signature().isValid()) |
|||
BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("transaction from RLP signature is invalid") ); |
|||
} |
|||
catch(...) |
|||
{ |
|||
BOOST_CHECK_MESSAGE(o.count("transaction") == 0, "A transction object should not be defined because the RLP is invalid!"); |
|||
return; |
|||
} |
|||
|
|||
BOOST_REQUIRE(o.count("transaction") > 0); |
|||
|
|||
mObject tObj = o["transaction"].get_obj(); |
|||
Transaction txFromFields = createTransactionFromFields(tObj); |
|||
|
|||
//Check the fields restored from RLP to original fields
|
|||
BOOST_CHECK_MESSAGE(txFromFields.data() == txFromRlp.data(), "Data in given RLP not matching the Transaction data!"); |
|||
BOOST_CHECK_MESSAGE(txFromFields.value() == txFromRlp.value(), "Value in given RLP not matching the Transaction value!"); |
|||
BOOST_CHECK_MESSAGE(txFromFields.gasPrice() == txFromRlp.gasPrice(), "GasPrice in given RLP not matching the Transaction gasPrice!"); |
|||
BOOST_CHECK_MESSAGE(txFromFields.gas() == txFromRlp.gas(),"Gas in given RLP not matching the Transaction gas!"); |
|||
BOOST_CHECK_MESSAGE(txFromFields.nonce() == txFromRlp.nonce(),"Nonce in given RLP not matching the Transaction nonce!"); |
|||
BOOST_CHECK_MESSAGE(txFromFields.receiveAddress() == txFromRlp.receiveAddress(), "Receive address in given RLP not matching the Transaction 'to' address!"); |
|||
BOOST_CHECK_MESSAGE(txFromFields.sender() == txFromRlp.sender(), "Transaction sender address in given RLP not matching the Transaction 'vrs' signature!"); |
|||
BOOST_CHECK_MESSAGE(txFromFields == txFromRlp, "However, txFromFields != txFromRlp!"); |
|||
BOOST_REQUIRE (o.count("sender") > 0); |
|||
|
|||
Address addressReaded = Address(o["sender"].get_str()); |
|||
BOOST_CHECK_MESSAGE(txFromFields.sender() == addressReaded || txFromRlp.sender() == addressReaded, "Signature address of sender does not match given sender address!"); |
|||
} |
|||
else |
|||
{ |
|||
BOOST_REQUIRE(o.count("transaction") > 0); |
|||
mObject tObj = o["transaction"].get_obj(); |
|||
|
|||
//Construct Rlp of the given transaction
|
|||
RLPStream rlpStream; |
|||
rlpStream.appendList(tObj.size()); |
|||
|
|||
if (tObj.count("nonce") > 0) |
|||
rlpStream << bigint(tObj["nonce"].get_str()); |
|||
|
|||
if (tObj.count("gasPrice") > 0) |
|||
rlpStream << bigint(tObj["gasPrice"].get_str()); |
|||
|
|||
if (tObj.count("gasLimit") > 0) |
|||
rlpStream << bigint(tObj["gasLimit"].get_str()); |
|||
|
|||
if (tObj.count("to") > 0) |
|||
{ |
|||
if (tObj["to"].get_str().empty()) |
|||
rlpStream << ""; |
|||
else |
|||
rlpStream << Address(tObj["to"].get_str()); |
|||
} |
|||
|
|||
if (tObj.count("value") > 0) |
|||
rlpStream << bigint(tObj["value"].get_str()); |
|||
|
|||
if (tObj.count("data") > 0) |
|||
rlpStream << importData(tObj); |
|||
|
|||
if (tObj.count("v") > 0) |
|||
rlpStream << bigint(tObj["v"].get_str()); |
|||
|
|||
if (tObj.count("r") > 0) |
|||
rlpStream << bigint(tObj["r"].get_str()); |
|||
|
|||
if (tObj.count("s") > 0) |
|||
rlpStream << bigint(tObj["s"].get_str()); |
|||
|
|||
if (tObj.count("extrafield") > 0) |
|||
rlpStream << bigint(tObj["extrafield"].get_str()); |
|||
|
|||
o["rlp"] = "0x" + toHex(rlpStream.out()); |
|||
|
|||
try |
|||
{ |
|||
Transaction txFromFields(rlpStream.out(), CheckSignature::Sender); |
|||
if (!txFromFields.signature().isValid()) |
|||
BOOST_THROW_EXCEPTION(Exception() << errinfo_comment("transaction from RLP signature is invalid") ); |
|||
|
|||
o["sender"] = toString(txFromFields.sender()); |
|||
} |
|||
catch(...) |
|||
{ |
|||
o.erase(o.find("transaction")); |
|||
} |
|||
} |
|||
}//for
|
|||
}//doTransactionTests
|
|||
|
|||
} }// Namespace Close
|
|||
|
|||
|
|||
BOOST_AUTO_TEST_SUITE(TransactionTests) |
|||
|
|||
BOOST_AUTO_TEST_CASE(TransactionTest) |
|||
{ |
|||
dev::test::executeTests("ttTransactionTest", "/TransactionTests", dev::test::doTransactionTests); |
|||
} |
|||
|
|||
BOOST_AUTO_TEST_CASE(tt10mbDataField) |
|||
{ |
|||
dev::test::executeTests("tt10mbDataField", "/TransactionTests", dev::test::doTransactionTests); |
|||
} |
|||
|
|||
BOOST_AUTO_TEST_CASE(ttCreateTest) |
|||
{ |
|||
for (int i = 1; i < boost::unit_test::framework::master_test_suite().argc; ++i) |
|||
{ |
|||
string arg = boost::unit_test::framework::master_test_suite().argv[i]; |
|||
if (arg == "--createtest") |
|||
{ |
|||
if (boost::unit_test::framework::master_test_suite().argc <= i + 2) |
|||
{ |
|||
cnote << "usage: ./testeth --createtest <PathToConstructor> <PathToDestiny>\n"; |
|||
return; |
|||
} |
|||
try |
|||
{ |
|||
cnote << "Populating tests..."; |
|||
json_spirit::mValue v; |
|||
string s = asString(dev::contents(boost::unit_test::framework::master_test_suite().argv[i + 1])); |
|||
BOOST_REQUIRE_MESSAGE(s.length() > 0, "Content of " + (string)boost::unit_test::framework::master_test_suite().argv[i + 1] + " is empty."); |
|||
json_spirit::read_string(s, v); |
|||
dev::test::doTransactionTests(v, true); |
|||
writeFile(boost::unit_test::framework::master_test_suite().argv[i + 2], asBytes(json_spirit::write_string(v, true))); |
|||
} |
|||
catch (Exception const& _e) |
|||
{ |
|||
BOOST_ERROR("Failed transaction test with Exception: " << diagnostic_information(_e)); |
|||
} |
|||
catch (std::exception const& _e) |
|||
{ |
|||
BOOST_ERROR("Failed transaction test with Exception: " << _e.what()); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
BOOST_AUTO_TEST_CASE(userDefinedFileTT) |
|||
{ |
|||
dev::test::userDefinedTest("--ttTest", dev::test::doTransactionTests); |
|||
} |
|||
|
|||
BOOST_AUTO_TEST_SUITE_END() |
File diff suppressed because one or more lines are too long
@ -0,0 +1,290 @@ |
|||
{ |
|||
"RightVRSTest" : { |
|||
"transaction" : |
|||
{ |
|||
"data" : "0x5544", |
|||
"gasLimit" : "2000", |
|||
"gasPrice" : "1", |
|||
"nonce" : "3", |
|||
"to" : "b94f5374fce5edbc8e2a8697c15331677e6ebf0b", |
|||
"value" : "10", |
|||
"v" : "28", |
|||
"r" : "0x98ff921201554726367d2be8c804a7ff89ccf285ebc57dff8ae4c44b9c19ac4a", |
|||
"s" : "0x8887321be575c8095f789dd4c743dfe42c1820f9231f98a962b210e3ac2452a3" |
|||
|
|||
} |
|||
}, |
|||
|
|||
"WrongVRSTestVl27" : { |
|||
"transaction" : |
|||
{ |
|||
"data" : "", |
|||
"gasLimit" : "2000", |
|||
"gasPrice" : "1", |
|||
"nonce" : "0", |
|||
"to" : "b94f5374fce5edbc8e2a8697c15331677e6ebf0b", |
|||
"value" : "10", |
|||
"v" : "26", |
|||
"r" : "0x98ff921201554726367d2be8c804a7ff89ccf285ebc57dff8ae4c44b9c19ac4a", |
|||
"s" : "0x8887321be575c8095f789dd4c743dfe42c1820f9231f98a962b210e3ac2452a3" |
|||
} |
|||
}, |
|||
|
|||
"WrongVRSTestVge31" : { |
|||
"transaction" : |
|||
{ |
|||
"data" : "", |
|||
"gasLimit" : "2000", |
|||
"gasPrice" : "1", |
|||
"nonce" : "0", |
|||
"to" : "b94f5374fce5edbc8e2a8697c15331677e6ebf0b", |
|||
"value" : "10", |
|||
"v" : "31", |
|||
"r" : "0x98ff921201554726367d2be8c804a7ff89ccf285ebc57dff8ae4c44b9c19ac4a", |
|||
"s" : "0x8887321be575c8095f789dd4c743dfe42c1820f9231f98a962b210e3ac2452a3" |
|||
} |
|||
}, |
|||
|
|||
"SenderTest" : { |
|||
"//" : "sender a94f5374fce5edbc8e2a8697c15331677e6ebf0b", |
|||
"transaction" : |
|||
{ |
|||
"data" : "", |
|||
"gasLimit" : "850", |
|||
"gasPrice" : "1", |
|||
"nonce" : "0", |
|||
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", |
|||
"value" : "10", |
|||
"v" : "27", |
|||
"r" : "0x48b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353", |
|||
"s" : "secretkey 45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8", |
|||
"s" : "0xefffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804" |
|||
} |
|||
}, |
|||
|
|||
"TransactionWithTooManyRLPElements" : { |
|||
"transaction" : |
|||
{ |
|||
"data" : "", |
|||
"gasLimit" : "850", |
|||
"gasPrice" : "1", |
|||
"nonce" : "0", |
|||
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", |
|||
"value" : "10", |
|||
"v" : "27", |
|||
"r" : "0x48b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353", |
|||
"s" : "0xefffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804", |
|||
"extrafield" : "128472387293" |
|||
} |
|||
}, |
|||
|
|||
"TransactionWithTooFewRLPElements" : { |
|||
"transaction" : |
|||
{ |
|||
"data" : "", |
|||
"gasPrice" : "1", |
|||
"nonce" : "0", |
|||
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", |
|||
"v" : "27", |
|||
"r" : "0x48b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353", |
|||
"s" : "0xefffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804" |
|||
} |
|||
}, |
|||
|
|||
"TransactionWithHihghValue" : { |
|||
"transaction" : |
|||
{ |
|||
"data" : "", |
|||
"gasLimit" : "850", |
|||
"gasPrice" : "1", |
|||
"nonce" : "0", |
|||
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", |
|||
"value" : "115792089237316195423570985008687907853269984665640564039457584007913129639935", |
|||
"v" : "27", |
|||
"r" : "0x48b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353", |
|||
"s" : "0xefffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804" |
|||
} |
|||
}, |
|||
|
|||
|
|||
"TransactionWithHihghValueOverflow" : { |
|||
"transaction" : |
|||
{ |
|||
"data" : "", |
|||
"gasLimit" : "850", |
|||
"gasPrice" : "1", |
|||
"nonce" : "0", |
|||
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", |
|||
"value" : "115792089237316195423570985008687907853269984665640564039457584007913129639936", |
|||
"v" : "27", |
|||
"r" : "0x48b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353", |
|||
"s" : "0xefffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804" |
|||
} |
|||
}, |
|||
|
|||
"TransactionWithSvalueOverflow" : { |
|||
"transaction" : |
|||
{ |
|||
"data" : "", |
|||
"gasLimit" : "850", |
|||
"gasPrice" : "1", |
|||
"nonce" : "0", |
|||
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", |
|||
"value" : "11", |
|||
"v" : "27", |
|||
"r" : "0x48b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353", |
|||
"s" : "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f" |
|||
} |
|||
}, |
|||
|
|||
"TransactionWithRvalueOverflow" : { |
|||
"transaction" : |
|||
{ |
|||
"data" : "", |
|||
"gasLimit" : "850", |
|||
"gasPrice" : "1", |
|||
"nonce" : "0", |
|||
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", |
|||
"value" : "11", |
|||
"v" : "27", |
|||
"r" : "0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", |
|||
"s" : "0xefffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804" |
|||
} |
|||
}, |
|||
|
|||
"TransactionWithNonceOverflow" : { |
|||
"transaction" : |
|||
{ |
|||
"data" : "", |
|||
"gasLimit" : "850", |
|||
"gasPrice" : "1", |
|||
"nonce" : "115792089237316195423570985008687907853269984665640564039457584007913129639936", |
|||
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", |
|||
"value" : "11", |
|||
"v" : "27", |
|||
"r" : "0x48b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353", |
|||
"s" : "0xefffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804" |
|||
} |
|||
}, |
|||
|
|||
"TransactionWithGasPriceOverflow" : { |
|||
"transaction" : |
|||
{ |
|||
"data" : "", |
|||
"gasLimit" : "850", |
|||
"gasPrice" : "115792089237316195423570985008687907853269984665640564039457584007913129639936", |
|||
"nonce" : "0", |
|||
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", |
|||
"value" : "11", |
|||
"v" : "27", |
|||
"r" : "0x48b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353", |
|||
"s" : "0xefffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804" |
|||
} |
|||
}, |
|||
|
|||
"TransactionWithGasLimitOverflow" : { |
|||
"transaction" : |
|||
{ |
|||
"data" : "", |
|||
"gasLimit" : "115792089237316195423570985008687907853269984665640564039457584007913129639936", |
|||
"gasPrice" : "123", |
|||
"nonce" : "0", |
|||
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", |
|||
"value" : "11", |
|||
"v" : "27", |
|||
"r" : "0x48b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353", |
|||
"s" : "0xefffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804" |
|||
} |
|||
}, |
|||
|
|||
"RLPElementsWithZeros" : { |
|||
"transaction" : |
|||
{ |
|||
"data" : "0x0000011222333", |
|||
"gasLimit" : "1000", |
|||
"gasPrice" : "00123", |
|||
"nonce" : "0054", |
|||
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", |
|||
"value" : "00000011", |
|||
"v" : "27", |
|||
"r" : "0x48b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353", |
|||
"s" : "0xefffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804" |
|||
} |
|||
}, |
|||
|
|||
"RLPWrongHexElements" : { |
|||
"transaction" : |
|||
{ |
|||
"data" : "0x0000000012", |
|||
"gasLimit" : "1000", |
|||
"gasPrice" : "123", |
|||
"nonce" : "54", |
|||
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", |
|||
"value" : "11", |
|||
"v" : "27", |
|||
"r" : "0x0048b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353", |
|||
"s" : "0x00efffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804" |
|||
} |
|||
}, |
|||
|
|||
"EmptyTransaction" : { |
|||
"transaction" : |
|||
{ |
|||
"data" : "", |
|||
"gasLimit" : "", |
|||
"gasPrice" : "", |
|||
"nonce" : "", |
|||
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d87", |
|||
"value" : "", |
|||
"v" : "27", |
|||
"r" : "0x48b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353", |
|||
"s" : "0xefffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804" |
|||
} |
|||
}, |
|||
|
|||
"AddressMore20" : { |
|||
"transaction" : |
|||
{ |
|||
"data" : "", |
|||
"gasLimit" : "", |
|||
"gasPrice" : "", |
|||
"nonce" : "", |
|||
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d871f", |
|||
"value" : "", |
|||
"v" : "27", |
|||
"r" : "0x48b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353", |
|||
"s" : "0xefffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804" |
|||
} |
|||
}, |
|||
|
|||
"AddressLess20" : { |
|||
"transaction" : |
|||
{ |
|||
"data" : "", |
|||
"gasLimit" : "", |
|||
"gasPrice" : "", |
|||
"nonce" : "", |
|||
"to" : "095e7baea6a6c7c4c2dfeb977efac326af552d", |
|||
"value" : "", |
|||
"v" : "27", |
|||
"r" : "0x48b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353", |
|||
"s" : "0xefffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804" |
|||
} |
|||
}, |
|||
|
|||
"AddressMore20WithFirstZeros" : { |
|||
"transaction" : |
|||
{ |
|||
"data" : "", |
|||
"gasLimit" : "", |
|||
"gasPrice" : "", |
|||
"nonce" : "", |
|||
"to" : "0x00000000000000000000000095e7baea6a6c7c4c2dfeb977efac326af552d", |
|||
"value" : "", |
|||
"v" : "27", |
|||
"r" : "0x48b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353", |
|||
"s" : "0xefffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804" |
|||
} |
|||
} |
|||
|
|||
} |
Loading…
Reference in new issue