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