github.com/klaytn/klaytn@v1.10.2/cmd/utils/nodecmd/genesis_test.go (about) 1 // Modifications Copyright 2018 The klaytn Authors 2 // Copyright 2016 The go-ethereum Authors 3 // This file is part of go-ethereum. 4 // 5 // go-ethereum is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // go-ethereum is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU General Public License for more details. 14 // 15 // You should have received a copy of the GNU General Public License 16 // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>. 17 // 18 // This file is derived from cmd/geth/genesis_test.go (2018/06/04). 19 // Modified and improved for the klaytn development. 20 21 package nodecmd 22 23 import ( 24 "io/ioutil" 25 "os" 26 "path/filepath" 27 "testing" 28 ) 29 30 var customGenesisTests = []struct { 31 genesis string 32 query []string 33 result []string 34 }{ 35 // Plain genesis file without anything extra 36 { 37 genesis: `{ 38 "alloc" : {}, 39 "blockScore" : "0x20000", 40 "extraData" : "0x0000000000000000000000000000000000000000000000000000000000000000f89af85494dddfb991127b43e209c2f8ed08b8b3d0b5843d3694195ba9cc787b00796a7ae6356e5b656d4360353794777fd033b5e3bcaad6006bc9f481ffed6b83cf5a94d473284239f704adccd24647c7ca132992a28973b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", 41 "gasLimit" : "0x2fefd8", 42 "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", 43 "timestamp" : "0x00" 44 }`, 45 query: []string{"klay.getBlock(0).parentHash"}, 46 result: []string{"0x0000000000000000000000000000000000000000000000000000000000000000"}, 47 }, 48 // Genesis file with an empty chain configuration (ensure missing fields work) 49 { 50 genesis: `{ 51 "alloc" : {}, 52 "blockScore" : "0x20000", 53 "extraData" : "0x0000000000000000000000000000000000000000000000000000000000000000f89af85494dddfb991127b43e209c2f8ed08b8b3d0b5843d3694195ba9cc787b00796a7ae6356e5b656d4360353794777fd033b5e3bcaad6006bc9f481ffed6b83cf5a94d473284239f704adccd24647c7ca132992a28973b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", 54 "gasLimit" : "0x2fefd8", 55 "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", 56 "timestamp" : "0x00", 57 "config" : {} 58 }`, 59 query: []string{"klay.getBlock(0).parentHash"}, 60 result: []string{"0x0000000000000000000000000000000000000000000000000000000000000000"}, 61 }, 62 // Genesis file with specific chain configurations 63 { 64 genesis: `{ 65 "alloc" : {}, 66 "blockScore" : "0x20000", 67 "extraData" : "0x0000000000000000000000000000000000000000000000000000000000000000f89af85494dddfb991127b43e209c2f8ed08b8b3d0b5843d3694195ba9cc787b00796a7ae6356e5b656d4360353794777fd033b5e3bcaad6006bc9f481ffed6b83cf5a94d473284239f704adccd24647c7ca132992a28973b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", 68 "gasLimit" : "0x2fefd8", 69 "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", 70 "timestamp" : "0x00", 71 "config" : { 72 "homesteadBlock" : 314, 73 "daoForkBlock" : 141, 74 "daoForkSupport" : true 75 } 76 }`, 77 query: []string{"klay.getBlock(0).parentHash"}, 78 result: []string{"0x0000000000000000000000000000000000000000000000000000000000000000"}, 79 }, 80 { 81 genesis: `{ 82 "config": { 83 "chainId": 1000, 84 "istanbul": { 85 "epoch": 30, 86 "policy": 0, 87 "sub": 22 88 }, 89 "unitPrice": 0, 90 "deriveShaImpl": 2, 91 "governance": null 92 }, 93 "timestamp": "0x5da3fdfd", 94 "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000f89af8549413c9a496fb7b84ea6bf39f3602658c41f0dd7a51947cf8c6a6a6a4fbb9b846527b5d762b278adfe7369438b99937e557a21d9ab9b6d9cfc07498b50660d09442b1d1fccee0e7b51a5091c532eb2b92a1e49296b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", 95 "governanceData": null, 96 "blockScore": "0x1", 97 "alloc": { 98 "04d67289f30351fc46c161eb3c588d07c2995367": { 99 "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" 100 }, 101 "13c9a496fb7b84ea6bf39f3602658c41f0dd7a51": { 102 "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" 103 }, 104 "2913ecaec7da798466611271a27b53836f20b108": { 105 "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" 106 }, 107 "30208f32c70e8b53a67ea171c8720cbfe32888ff": { 108 "balance": "0x446c3b15f9926687d2c40534fdb564000000000000" 109 } 110 }, 111 "number": "0x0", 112 "gasUsed": "0x0", 113 "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" 114 }`, 115 query: []string{"klay.getBlock(0).parentHash", "klay.getBlock(0).blockScore", "klay.getBlock(0).extraData", "governance.chainConfig.chainId", "governance.chainConfig.deriveShaImpl", "governance.chainConfig.unitPrice", "governance.chainConfig.governance.governanceMode", "governance.chainConfig.governance.governingNode", "governance.chainConfig.governance.reward.deferredTxFee", "governance.chainConfig.governance.reward.minimumStake", "governance.chainConfig.governance.reward.mintingAmount", "governance.chainConfig.governance.reward.proposerUpdateInterval", "governance.chainConfig.governance.reward.ratio", "governance.chainConfig.governance.reward.stakingUpdateInterval", "governance.chainConfig.governance.reward.useGiniCoeff", "governance.chainConfig.istanbul.epoch", "governance.chainConfig.istanbul.policy", "governance.chainConfig.istanbul.sub"}, 116 result: []string{"0x0000000000000000000000000000000000000000000000000000000000000000", "0x1", "0x0000000000000000000000000000000000000000000000000000000000000000f89af8549413c9a496fb7b84ea6bf39f3602658c41f0dd7a51947cf8c6a6a6a4fbb9b846527b5d762b278adfe7369438b99937e557a21d9ab9b6d9cfc07498b50660d09442b1d1fccee0e7b51a5091c532eb2b92a1e49296b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", "1000", "2", "0", "none", "0x0000000000000000000000000000000000000000", "false", "2000000", "0", "3600", "100/0/0", "86400", "false", "30", "0", "22"}, 117 }, 118 { 119 genesis: `{"config":{"chainId":2019,"istanbul":{"epoch":30,"policy":2,"sub":13},"unitPrice":25000000000,"deriveShaImpl":2,"governance":{"governingNode":"0xdddfb991127b43e209c2f8ed08b8b3d0b5843d36","governanceMode":"single","reward":{"mintingAmount":9600000000000000000,"ratio":"34/54/12","useGiniCoeff":false,"deferredTxFee":true,"stakingUpdateInterval":60,"proposerUpdateInterval":30,"minimumStake":5000000}}},"timestamp":"0x5ce33d6e","extraData":"0x0000000000000000000000000000000000000000000000000000000000000000f89af85494dddfb991127b43e209c2f8ed08b8b3d0b5843d3694195ba9cc787b00796a7ae6356e5b656d4360353794777fd033b5e3bcaad6006bc9f481ffed6b83cf5a94d473284239f704adccd24647c7ca132992a28973b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0","governanceData":null,"blockScore":"0x1","alloc":{"195ba9cc787b00796a7ae6356e5b656d43603537":{"balance":"0x446c3b15f9926687d2c40534fdb564000000000000"},"777fd033b5e3bcaad6006bc9f481ffed6b83cf5a":{"balance":"0x446c3b15f9926687d2c40534fdb564000000000000"},"d473284239f704adccd24647c7ca132992a28973":{"balance":"0x446c3b15f9926687d2c40534fdb564000000000000"},"dddfb991127b43e209c2f8ed08b8b3d0b5843d36":{"balance":"0x446c3b15f9926687d2c40534fdb564000000000000"},"f4316f69d9522667c0674afcd8638288489f0333":{"balance":"0x446c3b15f9926687d2c40534fdb564000000000000"}},"number":"0x0","gasUsed":"0x0","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000"}`, 120 query: []string{"klay.getBlock(0).parentHash", "klay.getBlock(0).blockScore", "klay.getBlock(0).extraData", "governance.chainConfig.chainId", "governance.chainConfig.deriveShaImpl", "governance.chainConfig.unitPrice", "governance.chainConfig.governance.governanceMode", "governance.chainConfig.governance.governingNode", "governance.chainConfig.governance.reward.deferredTxFee", "governance.chainConfig.governance.reward.minimumStake", "governance.chainConfig.governance.reward.mintingAmount", "governance.chainConfig.governance.reward.proposerUpdateInterval", "governance.chainConfig.governance.reward.ratio", "governance.chainConfig.governance.reward.stakingUpdateInterval", "governance.chainConfig.governance.reward.useGiniCoeff", "governance.chainConfig.istanbul.epoch", "governance.chainConfig.istanbul.policy", "governance.chainConfig.istanbul.sub"}, 121 result: []string{"0x0000000000000000000000000000000000000000000000000000000000000000", "0x1", "0x0000000000000000000000000000000000000000000000000000000000000000f89af85494dddfb991127b43e209c2f8ed08b8b3d0b5843d3694195ba9cc787b00796a7ae6356e5b656d4360353794777fd033b5e3bcaad6006bc9f481ffed6b83cf5a94d473284239f704adccd24647c7ca132992a28973b8410000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0", "2019", "2", "25000000000", "single", "0xdddfb991127b43e209c2f8ed08b8b3d0b5843d36", "true", "5000000", "9600000000000000000", "30", "34/54/12", "60", "false", "30", "2", "13"}, 122 }, 123 } 124 125 // Tests that initializing Klay with a custom genesis block and chain definitions 126 // work properly. 127 func TestCustomGenesis(t *testing.T) { 128 for i, tt := range customGenesisTests { 129 // Create a temporary data directory to use and inspect later 130 datadir := tmpdir(t) 131 defer os.RemoveAll(datadir) 132 133 // Initialize the data directory with the custom genesis block 134 json := filepath.Join(datadir, "genesis.json") 135 if err := ioutil.WriteFile(json, []byte(tt.genesis), 0o600); err != nil { 136 t.Fatalf("test %d: failed to write genesis file: %v", i, err) 137 } 138 runKlay(t, "klay-test", "--datadir", datadir, "--verbosity", "0", "init", json).WaitExit() 139 140 // Query the custom genesis block 141 if len(tt.query) != len(tt.result) { 142 t.Errorf("Test cases are wrong, #query: %v, #result, %v", len(tt.query), len(tt.result)) 143 } 144 for idx, query := range tt.query { 145 klay := runKlay(t, 146 "klay-test", "--datadir", datadir, "--maxconnections", "0", "--port", "0", 147 "--nodiscover", "--nat", "none", "--ipcdisable", "--ntp.disable", 148 "--exec", query, "--verbosity", "0", "console") 149 klay.ExpectRegexp(tt.result[idx]) 150 klay.ExpectExit() 151 } 152 } 153 }