github.com/Elemental-core/elementalcore@v0.0.0-20191206075037-63891242267a/cmd/geth/dao_test.go (about) 1 // Copyright 2016 The elementalcore Authors 2 // This file is part of elementalcore. 3 // 4 // elementalcore is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // elementalcore is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with elementalcore. If not, see <http://www.gnu.org/licenses/>. 16 17 package main 18 19 import ( 20 "io/ioutil" 21 "math/big" 22 "os" 23 "path/filepath" 24 "testing" 25 26 "github.com/Elemental-core/elementalcore/common" 27 "github.com/Elemental-core/elementalcore/core" 28 "github.com/Elemental-core/elementalcore/ethdb" 29 ) 30 31 // Genesis block for nodes which don't care about the DAO fork (i.e. not configured) 32 var daoOldGenesis = `{ 33 "alloc" : {}, 34 "coinbase" : "0x0000000000000000000000000000000000000000", 35 "difficulty" : "0x20000", 36 "extraData" : "", 37 "gasLimit" : "0x2fefd8", 38 "nonce" : "0x0000000000000042", 39 "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000", 40 "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", 41 "timestamp" : "0x00", 42 "config" : {} 43 }` 44 45 // Genesis block for nodes which actively oppose the DAO fork 46 var daoNoForkGenesis = `{ 47 "alloc" : {}, 48 "coinbase" : "0x0000000000000000000000000000000000000000", 49 "difficulty" : "0x20000", 50 "extraData" : "", 51 "gasLimit" : "0x2fefd8", 52 "nonce" : "0x0000000000000042", 53 "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000", 54 "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", 55 "timestamp" : "0x00", 56 "config" : { 57 "daoForkBlock" : 314, 58 "daoForkSupport" : false 59 } 60 }` 61 62 // Genesis block for nodes which actively support the DAO fork 63 var daoProForkGenesis = `{ 64 "alloc" : {}, 65 "coinbase" : "0x0000000000000000000000000000000000000000", 66 "difficulty" : "0x20000", 67 "extraData" : "", 68 "gasLimit" : "0x2fefd8", 69 "nonce" : "0x0000000000000042", 70 "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000", 71 "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", 72 "timestamp" : "0x00", 73 "config" : { 74 "daoForkBlock" : 314, 75 "daoForkSupport" : true 76 } 77 }` 78 79 var daoGenesisHash = common.HexToHash("5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0") 80 var daoGenesisForkBlock = big.NewInt(314) 81 82 func testDAOForkBlockNewChain(t *testing.T, test int, genesis string, expectBlock *big.Int, expectVote bool) { 83 // Create a temporary data directory to use and inspect later 84 datadir := tmpdir(t) 85 defer os.RemoveAll(datadir) 86 87 // Start a Geth instance with the requested flags set and immediately terminate 88 if genesis != "" { 89 json := filepath.Join(datadir, "genesis.json") 90 if err := ioutil.WriteFile(json, []byte(genesis), 0600); err != nil { 91 t.Fatalf("test %d: failed to write genesis file: %v", test, err) 92 } 93 runGeth(t, "--datadir", datadir, "init", json).WaitExit() 94 } else { 95 // Force chain initialization 96 args := []string{"--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none", "--ipcdisable", "--datadir", datadir} 97 geth := runGeth(t, append(args, []string{"--exec", "2+2", "console"}...)...) 98 geth.WaitExit() 99 } 100 // Retrieve the DAO config flag from the database 101 path := filepath.Join(datadir, "geth", "chaindata") 102 db, err := ethdb.NewLDBDatabase(path, 0, 0) 103 if err != nil { 104 t.Fatalf("test %d: failed to open test database: %v", test, err) 105 } 106 defer db.Close() 107 108 genesisHash := common.HexToHash("0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3") 109 if genesis != "" { 110 genesisHash = daoGenesisHash 111 } 112 config, err := core.GetChainConfig(db, genesisHash) 113 if err != nil { 114 t.Errorf("test %d: failed to retrieve chain config: %v", test, err) 115 return // we want to return here, the other checks can't make it past this point (nil panic). 116 } 117 // Validate the DAO hard-fork block number against the expected value 118 if config.DAOForkBlock == nil { 119 if expectBlock != nil { 120 t.Errorf("test %d: dao hard-fork block mismatch: have nil, want %v", test, expectBlock) 121 } 122 } else if expectBlock == nil { 123 t.Errorf("test %d: dao hard-fork block mismatch: have %v, want nil", test, config.DAOForkBlock) 124 } else if config.DAOForkBlock.Cmp(expectBlock) != 0 { 125 t.Errorf("test %d: dao hard-fork block mismatch: have %v, want %v", test, config.DAOForkBlock, expectBlock) 126 } 127 if config.DAOForkSupport != expectVote { 128 t.Errorf("test %d: dao hard-fork support mismatch: have %v, want %v", test, config.DAOForkSupport, expectVote) 129 } 130 }