github.com/murrekatt/go-ethereum@v1.5.8-0.20170123175102-fc52f2c007fb/cmd/geth/dao_test.go (about) 1 // Copyright 2016 The go-ethereum Authors 2 // This file is part of go-ethereum. 3 // 4 // go-ethereum 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 // go-ethereum 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 go-ethereum. 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/ethereum/go-ethereum/common" 27 "github.com/ethereum/go-ethereum/core" 28 "github.com/ethereum/go-ethereum/ethdb" 29 "github.com/ethereum/go-ethereum/params" 30 ) 31 32 // Genesis block for nodes which don't care about the DAO fork (i.e. not configured) 33 var daoOldGenesis = `{ 34 "alloc" : {}, 35 "coinbase" : "0x0000000000000000000000000000000000000000", 36 "difficulty" : "0x20000", 37 "extraData" : "", 38 "gasLimit" : "0x2fefd8", 39 "nonce" : "0x0000000000000042", 40 "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000", 41 "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", 42 "timestamp" : "0x00", 43 "config" : {} 44 }` 45 46 // Genesis block for nodes which actively oppose the DAO fork 47 var daoNoForkGenesis = `{ 48 "alloc" : {}, 49 "coinbase" : "0x0000000000000000000000000000000000000000", 50 "difficulty" : "0x20000", 51 "extraData" : "", 52 "gasLimit" : "0x2fefd8", 53 "nonce" : "0x0000000000000042", 54 "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000", 55 "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", 56 "timestamp" : "0x00", 57 "config" : { 58 "daoForkBlock" : 314, 59 "daoForkSupport" : false 60 } 61 }` 62 63 // Genesis block for nodes which actively support the DAO fork 64 var daoProForkGenesis = `{ 65 "alloc" : {}, 66 "coinbase" : "0x0000000000000000000000000000000000000000", 67 "difficulty" : "0x20000", 68 "extraData" : "", 69 "gasLimit" : "0x2fefd8", 70 "nonce" : "0x0000000000000042", 71 "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000", 72 "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", 73 "timestamp" : "0x00", 74 "config" : { 75 "daoForkBlock" : 314, 76 "daoForkSupport" : true 77 } 78 }` 79 80 var daoGenesisHash = common.HexToHash("5e1fc79cb4ffa4739177b5408045cd5d51c6cf766133f23f7cd72ee1f8d790e0") 81 var daoGenesisForkBlock = big.NewInt(314) 82 83 // TestDAOForkBlockNewChain tests that the DAO hard-fork number and the nodes support/opposition is correctly 84 // set in the database after various initialization procedures and invocations. 85 func TestDAOForkBlockNewChain(t *testing.T) { 86 for i, arg := range []struct { 87 testnet bool 88 genesis string 89 expectBlock *big.Int 90 expectVote bool 91 }{ 92 // Test DAO Default Mainnet 93 {false, "", params.MainNetDAOForkBlock, true}, 94 // test DAO Default Testnet 95 {true, "", params.TestNetDAOForkBlock, true}, 96 // test DAO Init Old Privnet 97 {false, daoOldGenesis, nil, false}, 98 // test DAO Default No Fork Privnet 99 {false, daoNoForkGenesis, daoGenesisForkBlock, false}, 100 // test DAO Default Pro Fork Privnet 101 {false, daoProForkGenesis, daoGenesisForkBlock, true}, 102 } { 103 testDAOForkBlockNewChain(t, i, arg.testnet, arg.genesis, arg.expectBlock, arg.expectVote) 104 } 105 } 106 107 func testDAOForkBlockNewChain(t *testing.T, test int, testnet bool, genesis string, expectBlock *big.Int, expectVote bool) { 108 // Create a temporary data directory to use and inspect later 109 datadir := tmpdir(t) 110 defer os.RemoveAll(datadir) 111 112 // Start a Geth instance with the requested flags set and immediately terminate 113 if genesis != "" { 114 json := filepath.Join(datadir, "genesis.json") 115 if err := ioutil.WriteFile(json, []byte(genesis), 0600); err != nil { 116 t.Fatalf("test %d: failed to write genesis file: %v", test, err) 117 } 118 runGeth(t, "--datadir", datadir, "init", json).cmd.Wait() 119 } else { 120 // Force chain initialization 121 args := []string{"--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none", "--ipcdisable", "--datadir", datadir} 122 if testnet { 123 args = append(args, "--testnet") 124 } 125 geth := runGeth(t, append(args, []string{"--exec", "2+2", "console"}...)...) 126 geth.cmd.Wait() 127 } 128 // Retrieve the DAO config flag from the database 129 path := filepath.Join(datadir, "geth", "chaindata") 130 if testnet && genesis == "" { 131 path = filepath.Join(datadir, "testnet", "geth", "chaindata") 132 } 133 db, err := ethdb.NewLDBDatabase(path, 0, 0) 134 if err != nil { 135 t.Fatalf("test %d: failed to open test database: %v", test, err) 136 } 137 defer db.Close() 138 139 genesisHash := common.HexToHash("0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3") 140 if testnet { 141 genesisHash = common.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d") 142 } 143 if genesis != "" { 144 genesisHash = daoGenesisHash 145 } 146 config, err := core.GetChainConfig(db, genesisHash) 147 if err != nil { 148 t.Errorf("test %d: failed to retrieve chain config: %v", test, err) 149 return // we want to return here, the other checks can't make it past this point (nil panic). 150 } 151 // Validate the DAO hard-fork block number against the expected value 152 if config.DAOForkBlock == nil { 153 if expectBlock != nil { 154 t.Errorf("test %d: dao hard-fork block mismatch: have nil, want %v", test, expectBlock) 155 } 156 } else if expectBlock == nil { 157 t.Errorf("test %d: dao hard-fork block mismatch: have %v, want nil", test, config.DAOForkBlock) 158 } else if config.DAOForkBlock.Cmp(expectBlock) != 0 { 159 t.Errorf("test %d: dao hard-fork block mismatch: have %v, want %v", test, config.DAOForkBlock, expectBlock) 160 } 161 if config.DAOForkSupport != expectVote { 162 t.Errorf("test %d: dao hard-fork support mismatch: have %v, want %v", test, config.DAOForkSupport, expectVote) 163 } 164 }