diff options
author | Christian <c@ethdev.com> | 2014-11-06 00:56:38 +0800 |
---|---|---|
committer | Christian <c@ethdev.com> | 2014-11-06 00:56:38 +0800 |
commit | 3e73402ba385182638a7730736244997dfd60e98 (patch) | |
tree | 06cb3ad63f95d02a90bf7cacbf2c69096b84b499 | |
parent | bfb2ae9f3c6fd4c66fef5acef9c09e2ca49159e4 (diff) | |
parent | aa41f1c6f1f0cbed7fe21005aab6562cb2588ea4 (diff) | |
download | dexon-solidity-3e73402ba385182638a7730736244997dfd60e98.tar.gz dexon-solidity-3e73402ba385182638a7730736244997dfd60e98.tar.zst dexon-solidity-3e73402ba385182638a7730736244997dfd60e98.zip |
Merge remote-tracking branch 'ethereum/develop' into HEAD
Conflicts:
libsolidity/Compiler.cpp
test/solidityCompiler.cpp
-rw-r--r-- | crypto.cpp | 14 | ||||
-rw-r--r-- | jsonrpc.cpp | 96 | ||||
-rw-r--r-- | solidityParser.cpp | 10 | ||||
-rw-r--r-- | state.cpp | 7 | ||||
-rw-r--r-- | vm.cpp | 38 |
5 files changed, 70 insertions, 95 deletions
@@ -339,16 +339,11 @@ BOOST_AUTO_TEST_CASE(eth_keypairs) BOOST_REQUIRE(p.pub() == Public(fromHex("97466f2b32bc3bb76d4741ae51cd1d8578b48d3f1e68da206d47321aec267ce78549b514e4453d74ef11b0cd5e4e4c364effddac8b51bcfc8de80682f952896f"))); BOOST_REQUIRE(p.address() == Address(fromHex("8a40bfaa73256b60764c1bf40675a99083efb075"))); { - eth::Transaction t; - t.nonce = 0; - t.type = eth::Transaction::MessageCall; - t.receiveAddress = h160(fromHex("944400f4b88ac9589a0f17ed4671da26bddb668b")); - t.value = 1000; + eth::Transaction t(1000, 0, 0, h160(fromHex("944400f4b88ac9589a0f17ed4671da26bddb668b")), bytes(), 0, p.secret()); auto rlp = t.rlp(false); cnote << RLP(rlp); cnote << toHex(rlp); cnote << t.sha3(false); - t.sign(p.secret()); rlp = t.rlp(true); cnote << RLP(rlp); cnote << toHex(rlp); @@ -368,16 +363,11 @@ int cryptoTest() assert(p.pub() == Public(fromHex("97466f2b32bc3bb76d4741ae51cd1d8578b48d3f1e68da206d47321aec267ce78549b514e4453d74ef11b0cd5e4e4c364effddac8b51bcfc8de80682f952896f"))); assert(p.address() == Address(fromHex("8a40bfaa73256b60764c1bf40675a99083efb075"))); { - eth::Transaction t; - t.nonce = 0; - t.type = eth::Transaction::MessageCall; - t.receiveAddress = h160(fromHex("944400f4b88ac9589a0f17ed4671da26bddb668b")); - t.value = 1000; + eth::Transaction t(1000, 0, 0, h160(fromHex("944400f4b88ac9589a0f17ed4671da26bddb668b")), bytes(), 0, p.secret()); auto rlp = t.rlp(false); cnote << RLP(rlp); cnote << toHex(rlp); cnote << t.sha3(false); - t.sign(p.secret()); rlp = t.rlp(true); cnote << RLP(rlp); cnote << toHex(rlp); diff --git a/jsonrpc.cpp b/jsonrpc.cpp index 033339ec..68c30734 100644 --- a/jsonrpc.cpp +++ b/jsonrpc.cpp @@ -43,44 +43,39 @@ using namespace dev; using namespace dev::eth; namespace js = json_spirit; -namespace jsonrpc_tests -{ - -string name = "Ethereum(++) tests"; -string dbPath; -auto s = set<string>{"eth", "shh"}; -dev::p2p::NetworkPreferences np(30303, std::string(), false); -dev::WebThreeDirect web3(name, dbPath, true, s, np); - +WebThreeDirect *web3; unique_ptr<WebThreeStubServer> jsonrpcServer; unique_ptr<WebThreeStubClient> jsonrpcClient; -struct JsonrpcFixture { - JsonrpcFixture() +struct Setup +{ + Setup() { - cnote << "setup jsonrpc"; + static bool setup = false; + if (setup) + return; + setup = true; - web3.setIdealPeerCount(5); - web3.ethereum()->setForceMining(true); - jsonrpcServer = unique_ptr<WebThreeStubServer>(new WebThreeStubServer(new jsonrpc::CorsHttpServer(8080), web3, {})); + dev::p2p::NetworkPreferences nprefs(30303, std::string(), false); + web3 = new WebThreeDirect("Ethereum(++) tests", "", true, {"eth", "shh"}, nprefs); + + web3->setIdealPeerCount(5); + web3->ethereum()->setForceMining(true); + jsonrpcServer = unique_ptr<WebThreeStubServer>(new WebThreeStubServer(new jsonrpc::CorsHttpServer(8080), *web3, {})); jsonrpcServer->setIdentities({}); jsonrpcServer->StartListening(); jsonrpcClient = unique_ptr<WebThreeStubClient>(new WebThreeStubClient(new jsonrpc::HttpClient("http://localhost:8080"))); } - ~JsonrpcFixture() - { - cnote << "teardown jsonrpc"; - } }; -BOOST_GLOBAL_FIXTURE(JsonrpcFixture) +BOOST_FIXTURE_TEST_SUITE(environment, Setup) BOOST_AUTO_TEST_CASE(jsonrpc_defaultBlock) { cnote << "Testing jsonrpc defaultBlock..."; int defaultBlock = jsonrpcClient->defaultBlock(); - BOOST_CHECK_EQUAL(defaultBlock, web3.ethereum()->getDefault()); + BOOST_CHECK_EQUAL(defaultBlock, web3->ethereum()->getDefault()); } BOOST_AUTO_TEST_CASE(jsonrpc_gasPrice) @@ -94,26 +89,26 @@ BOOST_AUTO_TEST_CASE(jsonrpc_isListening) { cnote << "Testing jsonrpc isListening..."; - web3.startNetwork(); + web3->startNetwork(); bool listeningOn = jsonrpcClient->listening(); - BOOST_CHECK_EQUAL(listeningOn, web3.isNetworkStarted()); + BOOST_CHECK_EQUAL(listeningOn, web3->isNetworkStarted()); - web3.stopNetwork(); + web3->stopNetwork(); bool listeningOff = jsonrpcClient->listening(); - BOOST_CHECK_EQUAL(listeningOff, web3.isNetworkStarted()); + BOOST_CHECK_EQUAL(listeningOff, web3->isNetworkStarted()); } BOOST_AUTO_TEST_CASE(jsonrpc_isMining) { cnote << "Testing jsonrpc isMining..."; - web3.ethereum()->startMining(); + web3->ethereum()->startMining(); bool miningOn = jsonrpcClient->mining(); - BOOST_CHECK_EQUAL(miningOn, web3.ethereum()->isMining()); + BOOST_CHECK_EQUAL(miningOn, web3->ethereum()->isMining()); - web3.ethereum()->stopMining(); + web3->ethereum()->stopMining(); bool miningOff = jsonrpcClient->mining(); - BOOST_CHECK_EQUAL(miningOff, web3.ethereum()->isMining()); + BOOST_CHECK_EQUAL(miningOff, web3->ethereum()->isMining()); } BOOST_AUTO_TEST_CASE(jsonrpc_accounts) @@ -139,18 +134,18 @@ BOOST_AUTO_TEST_CASE(jsonrpc_number) { cnote << "Testing jsonrpc number2..."; int number = jsonrpcClient->number(); - BOOST_CHECK_EQUAL(number, web3.ethereum()->number() + 1); - dev::eth::mine(*(web3.ethereum()), 1); + BOOST_CHECK_EQUAL(number, web3->ethereum()->number() + 1); + dev::eth::mine(*(web3->ethereum()), 1); int numberAfter = jsonrpcClient->number(); BOOST_CHECK_EQUAL(number + 1, numberAfter); - BOOST_CHECK_EQUAL(numberAfter, web3.ethereum()->number() + 1); + BOOST_CHECK_EQUAL(numberAfter, web3->ethereum()->number() + 1); } BOOST_AUTO_TEST_CASE(jsonrpc_peerCount) { cnote << "Testing jsonrpc peerCount..."; int peerCount = jsonrpcClient->peerCount(); - BOOST_CHECK_EQUAL(web3.peerCount(), peerCount); + BOOST_CHECK_EQUAL(web3->peerCount(), peerCount); } BOOST_AUTO_TEST_CASE(jsonrpc_setListening) @@ -158,10 +153,10 @@ BOOST_AUTO_TEST_CASE(jsonrpc_setListening) cnote << "Testing jsonrpc setListening..."; jsonrpcClient->setListening(true); - BOOST_CHECK_EQUAL(web3.isNetworkStarted(), true); + BOOST_CHECK_EQUAL(web3->isNetworkStarted(), true); jsonrpcClient->setListening(false); - BOOST_CHECK_EQUAL(web3.isNetworkStarted(), false); + BOOST_CHECK_EQUAL(web3->isNetworkStarted(), false); } BOOST_AUTO_TEST_CASE(jsonrpc_setMining) @@ -169,10 +164,10 @@ BOOST_AUTO_TEST_CASE(jsonrpc_setMining) cnote << "Testing jsonrpc setMining..."; jsonrpcClient->setMining(true); - BOOST_CHECK_EQUAL(web3.ethereum()->isMining(), true); + BOOST_CHECK_EQUAL(web3->ethereum()->isMining(), true); jsonrpcClient->setMining(false); - BOOST_CHECK_EQUAL(web3.ethereum()->isMining(), false); + BOOST_CHECK_EQUAL(web3->ethereum()->isMining(), false); } BOOST_AUTO_TEST_CASE(jsonrpc_stateAt) @@ -181,36 +176,36 @@ BOOST_AUTO_TEST_CASE(jsonrpc_stateAt) dev::KeyPair key = KeyPair::create(); auto address = key.address(); string stateAt = jsonrpcClient->stateAt(toJS(address), "0"); - BOOST_CHECK_EQUAL(toJS(web3.ethereum()->stateAt(address, jsToU256("0"), 0)), stateAt); + BOOST_CHECK_EQUAL(toJS(web3->ethereum()->stateAt(address, jsToU256("0"), 0)), stateAt); } BOOST_AUTO_TEST_CASE(jsonrpc_transact) { cnote << "Testing jsonrpc transact..."; string coinbase = jsonrpcClient->coinbase(); - BOOST_CHECK_EQUAL(jsToAddress(coinbase), web3.ethereum()->address()); + BOOST_CHECK_EQUAL(jsToAddress(coinbase), web3->ethereum()->address()); dev::KeyPair key = KeyPair::create(); auto address = key.address(); auto receiver = KeyPair::create(); - web3.ethereum()->setAddress(address); + web3->ethereum()->setAddress(address); coinbase = jsonrpcClient->coinbase(); - BOOST_CHECK_EQUAL(jsToAddress(coinbase), web3.ethereum()->address()); + BOOST_CHECK_EQUAL(jsToAddress(coinbase), web3->ethereum()->address()); BOOST_CHECK_EQUAL(jsToAddress(coinbase), address); jsonrpcServer->setAccounts({key}); - auto balance = web3.ethereum()->balanceAt(address, 0); + auto balance = web3->ethereum()->balanceAt(address, 0); string balanceString = jsonrpcClient->balanceAt(toJS(address)); double countAt = jsonrpcClient->countAt(toJS(address)); - BOOST_CHECK_EQUAL(countAt, (double)(uint64_t)web3.ethereum()->countAt(address)); + BOOST_CHECK_EQUAL(countAt, (double)(uint64_t)web3->ethereum()->countAt(address)); BOOST_CHECK_EQUAL(countAt, 0); BOOST_CHECK_EQUAL(toJS(balance), balanceString); BOOST_CHECK_EQUAL(jsToDecimal(balanceString), "0"); - dev::eth::mine(*(web3.ethereum()), 1); - balance = web3.ethereum()->balanceAt(address, 0); + dev::eth::mine(*(web3->ethereum()), 1); + balance = web3->ethereum()->balanceAt(address, 0); balanceString = jsonrpcClient->balanceAt(toJS(address)); BOOST_CHECK_EQUAL(toJS(balance), balanceString); @@ -230,21 +225,20 @@ BOOST_AUTO_TEST_CASE(jsonrpc_transact) jsonrpcClient->transact(t); jsonrpcServer->setAccounts({}); - dev::eth::mine(*(web3.ethereum()), 1); + dev::eth::mine(*(web3->ethereum()), 1); countAt = jsonrpcClient->countAt(toJS(address)); - auto balance2 = web3.ethereum()->balanceAt(receiver.address()); + auto balance2 = web3->ethereum()->balanceAt(receiver.address()); string balanceString2 = jsonrpcClient->balanceAt(toJS(receiver.address())); - BOOST_CHECK_EQUAL(countAt, (double)(uint64_t)web3.ethereum()->countAt(address)); + BOOST_CHECK_EQUAL(countAt, (double)(uint64_t)web3->ethereum()->countAt(address)); BOOST_CHECK_EQUAL(countAt, 1); BOOST_CHECK_EQUAL(toJS(balance2), balanceString2); BOOST_CHECK_EQUAL(jsToDecimal(balanceString2), "750000000000000000"); BOOST_CHECK_EQUAL(txAmount, balance2); } - -} - + +BOOST_AUTO_TEST_SUITE_END() BOOST_AUTO_TEST_SUITE_END() #endif diff --git a/solidityParser.cpp b/solidityParser.cpp index 4ca9370d..9319a02c 100644 --- a/solidityParser.cpp +++ b/solidityParser.cpp @@ -211,7 +211,15 @@ BOOST_AUTO_TEST_CASE(else_if_statement) BOOST_CHECK_NO_THROW(parseText(text)); } - +BOOST_AUTO_TEST_CASE(statement_starting_with_type_conversion) +{ + char const* text = "contract test {\n" + " function fun() {\n" + " uint64(2);\n" + " }\n" + "}\n"; + BOOST_CHECK_NO_THROW(parseText(text)); +} BOOST_AUTO_TEST_SUITE_END() @@ -65,12 +65,7 @@ int stateTest() // Inject a transaction to transfer funds from miner to me. bytes tx; { - Transaction t; - t.nonce = s.transactionsFrom(myMiner.address()); - t.value = 1000; // 1e3 wei. - t.type = eth::Transaction::MessageCall; - t.receiveAddress = me.address(); - t.sign(myMiner.secret()); + Transaction t(1000, 0, 0, me.address(), bytes(), s.transactionsFrom(myMiner.address()), myMiner.secret()); assert(t.sender() == myMiner.address()); tx = t.rlp(); } @@ -36,11 +36,7 @@ FakeExtVM::FakeExtVM(eth::BlockInfo const& _previousBlock, eth::BlockInfo const& h160 FakeExtVM::create(u256 _endowment, u256* _gas, bytesConstRef _init, OnOpFunc const&) { - Transaction t; - t.value = _endowment; - t.gasPrice = gasPrice; - t.gas = *_gas; - t.data = _init.toBytes(); + Transaction t(_endowment, gasPrice, *_gas, _init.toBytes()); m_s.noteSending(myAddress); m_ms.internal.resize(m_ms.internal.size() + 1); @@ -55,7 +51,6 @@ h160 FakeExtVM::create(u256 _endowment, u256* _gas, bytesConstRef _init, OnOpFun get<3>(addresses[ret]) = m_s.code(ret); } - t.type = eth::Transaction::ContractCreation; callcreates.push_back(t); return ret; } @@ -64,13 +59,7 @@ bool FakeExtVM::call(Address _receiveAddress, u256 _value, bytesConstRef _data, { u256 contractgas = 0xffff; - Transaction t; - t.value = _value; - t.gasPrice = gasPrice; - t.gas = *_gas; - t.data = _data.toVector(); - t.type = eth::Transaction::MessageCall; - t.receiveAddress = _receiveAddress; + Transaction t(_value, gasPrice, *_gas, _receiveAddress, _data.toVector()); callcreates.push_back(t); string codeOf_CodeAddress = _codeAddressOverride ? toHex(get<3>(addresses[_codeAddressOverride])) : toHex(get<3>(addresses[_receiveAddress]) ); @@ -386,10 +375,10 @@ mArray FakeExtVM::exportCallCreates() for (Transaction const& tx: callcreates) { mObject o; - o["destination"] = tx.type == Transaction::ContractCreation ? "" : toString(tx.receiveAddress); - push(o, "gasLimit", tx.gas); - push(o, "value", tx.value); - o["data"] = "0x" + toHex(tx.data); + o["destination"] = tx.type() == Transaction::ContractCreation ? "" : toString(tx.receiveAddress()); + push(o, "gasLimit", tx.gas()); + push(o, "value", tx.value()); + o["data"] = "0x" + toHex(tx.data()); ret.push_back(o); } return ret; @@ -404,19 +393,18 @@ void FakeExtVM::importCallCreates(mArray& _callcreates) BOOST_REQUIRE(tx.count("value") > 0); BOOST_REQUIRE(tx.count("destination") > 0); BOOST_REQUIRE(tx.count("gasLimit") > 0); - Transaction t; - t.type = tx["destination"].get_str().empty() ? Transaction::ContractCreation : Transaction::MessageCall; - t.receiveAddress = Address(tx["destination"].get_str()); - t.value = toInt(tx["value"]); - t.gas = toInt(tx["gasLimit"]); + bytes data; if (tx["data"].type() == str_type) if (tx["data"].get_str().find_first_of("0x") == 0) - t.data = fromHex(tx["data"].get_str().substr(2)); + data = fromHex(tx["data"].get_str().substr(2)); else - t.data = fromHex(tx["data"].get_str()); + data = fromHex(tx["data"].get_str()); else for (auto const& j: tx["data"].get_array()) - t.data.push_back(toByte(j)); + data.push_back(toByte(j)); + Transaction t = tx["destination"].get_str().empty() ? + Transaction(toInt(tx["value"]), 0, toInt(tx["gasLimit"]), data) : + Transaction(toInt(tx["value"]), 0, toInt(tx["gasLimit"]), Address(tx["destination"].get_str()), data); callcreates.push_back(t); } } |