1 #include <boost/test/unit_test.hpp>
2 #include <qtumtests/test_utils.h>
3 #include <script/standard.h>
4 #include <chainparams.h>
5
6 namespace IstanbulTest{
7
8 const dev::u256 GASLIMIT = dev::u256(500000);
9 const dev::h256 HASHTX = dev::h256(ParseHex("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"));
10
11 // Codes used to check that the newer forks up to istanbul are present
12 const std::vector<valtype> CODE = {
13 /*
14 // Contract for Istanbul check
15 pragma solidity 0.5.13;
16
17 contract IstanbulContract {
18 function getChainID() public view returns (uint256 id) {
19 assembly {
20 id := chainid()
21 }
22 }
23 }
24 */ valtype(ParseHex("6080604052348015600f57600080fd5b5060868061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063564b81ef14602d575b600080fd5b60336049565b6040518082815260200191505060405180910390f35b60004690509056fea265627a7a72315820a0b6703e30e0f059af077092e6e0a97a0ae52192355468108d9a24b0ebbe9a7464736f6c634300050d0032")),
25
26 // getChainID()
27 valtype(ParseHex("564b81ef"))
28 };
29
genesisLoading()30 void genesisLoading(){
31 const CChainParams& chainparams = Params();
32 int forkHeight = Params().GetConsensus().CoinbaseMaturity(0) + 499;
33 dev::eth::ChainParams cp(chainparams.EVMGenesisInfo(forkHeight));
34 globalState->populateFrom(cp.genesisState);
35 globalSealEngine = std::unique_ptr<dev::eth::SealEngineFace>(cp.createSealEngine());
36 globalState->db().commit();
37 }
38
createNewBlocks(TestChain100Setup * testChain100Setup,size_t n)39 void createNewBlocks(TestChain100Setup* testChain100Setup, size_t n){
40 std::function<void(size_t n)> generateBlocks = [&](size_t n){
41 dev::h256 oldHashStateRoot = globalState->rootHash();
42 dev::h256 oldHashUTXORoot = globalState->rootHashUTXO();
43 for(size_t i = 0; i < n; i++){
44 testChain100Setup->CreateAndProcessBlock({}, GetScriptForRawPubKey(testChain100Setup->coinbaseKey.GetPubKey()));
45 }
46 globalState->setRoot(oldHashStateRoot);
47 globalState->setRootUTXO(oldHashUTXORoot);
48 };
49
50 generateBlocks(n);
51 }
BOOST_FIXTURE_TEST_SUITE(istanbulfork_tests,TestChain100Setup)52 BOOST_FIXTURE_TEST_SUITE(istanbulfork_tests, TestChain100Setup)
53
54 BOOST_AUTO_TEST_CASE(checking_istanbul_after_fork){
55 genesisLoading();
56 createNewBlocks(this, 499);
57 dev::h256 hashTx(HASHTX);
58
59 // Create contract
60 std::vector<QtumTransaction> txs;
61 txs.push_back(createQtumTransaction(CODE[0], 0, GASLIMIT, dev::u256(1), hashTx, dev::Address()));
62 executeBC(txs);
63
64 // Call is it istanbul
65 dev::Address proxy = createQtumAddress(txs[0].getHashWith(), txs[0].getNVout());
66 std::vector<QtumTransaction> txIsItIstanbul;
67 txIsItIstanbul.push_back(createQtumTransaction(CODE[1], 0, GASLIMIT, dev::u256(1), ++hashTx, proxy));
68 auto result = executeBC(txIsItIstanbul);
69 BOOST_CHECK(dev::h256(result.first[0].execRes.output) == dev::h256(globalSealEngine->chainParams().chainID));
70 }
71
BOOST_AUTO_TEST_CASE(checking_istanbul_before_fork)72 BOOST_AUTO_TEST_CASE(checking_istanbul_before_fork){
73 genesisLoading();
74 createNewBlocks(this, 498);
75 dev::h256 hashTx(HASHTX);
76
77 // Create contract
78 std::vector<QtumTransaction> txs;
79 txs.push_back(createQtumTransaction(CODE[0], 0, GASLIMIT, dev::u256(1), hashTx, dev::Address()));
80 executeBC(txs);
81
82 // Call is it istanbul
83 dev::Address proxy = createQtumAddress(txs[0].getHashWith(), txs[0].getNVout());
84 std::vector<QtumTransaction> txIsItIstanbul;
85 txIsItIstanbul.push_back(createQtumTransaction(CODE[1], 0, GASLIMIT, dev::u256(1), ++hashTx, proxy));
86 auto result = executeBC(txIsItIstanbul);
87 BOOST_CHECK(dev::h256(result.first[0].execRes.output) != dev::h256(globalSealEngine->chainParams().chainID));
88 }
89
90 BOOST_AUTO_TEST_SUITE_END()
91
92 }
93