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