github.com/ccm-chain/ccmchain@v1.0.0/core/genesis.go (about) 1 // Copyright 2014 The go-ethereum Authors 2 // This file is part of the go-ethereum library. 3 // 4 // The go-ethereum library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser 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 // The go-ethereum library 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 Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 16 17 package core 18 19 import ( 20 "bytes" 21 "encoding/hex" 22 "encoding/json" 23 "errors" 24 "fmt" 25 "math/big" 26 "strings" 27 28 "github.com/ccm-chain/ccmchain/common" 29 "github.com/ccm-chain/ccmchain/common/hexutil" 30 "github.com/ccm-chain/ccmchain/common/math" 31 "github.com/ccm-chain/ccmchain/core/rawdb" 32 "github.com/ccm-chain/ccmchain/core/state" 33 "github.com/ccm-chain/ccmchain/core/types" 34 "github.com/ccm-chain/ccmchain/crypto" 35 "github.com/ccm-chain/ccmchain/database" 36 "github.com/ccm-chain/ccmchain/log" 37 "github.com/ccm-chain/ccmchain/params" 38 "github.com/ccm-chain/ccmchain/rlp" 39 "github.com/ccm-chain/ccmchain/trie" 40 ) 41 42 //go:generate gencodec -type Genesis -field-override genesisSpecMarshaling -out gen_genesis.go 43 //go:generate gencodec -type GenesisAccount -field-override genesisAccountMarshaling -out gen_genesis_account.go 44 45 var errGenesisNoConfig = errors.New("genesis has no chain configuration") 46 47 // Genesis specifies the header fields, state of a genesis block. It also defines hard 48 // fork switch-over blocks through the chain configuration. 49 type Genesis struct { 50 Config *params.ChainConfig `json:"config"` 51 Nonce uint64 `json:"nonce"` 52 Timestamp uint64 `json:"timestamp"` 53 ExtraData []byte `json:"extraData"` 54 GasLimit uint64 `json:"gasLimit" gencodec:"required"` 55 Difficulty *big.Int `json:"difficulty" gencodec:"required"` 56 Mixhash common.Hash `json:"mixHash"` 57 Coinbase common.Address `json:"coinbase"` 58 Alloc GenesisAlloc `json:"alloc" gencodec:"required"` 59 60 // These fields are used for consensus tests. Please don't use them 61 // in actual genesis blocks. 62 Number uint64 `json:"number"` 63 GasUsed uint64 `json:"gasUsed"` 64 ParentHash common.Hash `json:"parentHash"` 65 } 66 67 // GenesisAlloc specifies the initial state that is part of the genesis block. 68 type GenesisAlloc map[common.Address]GenesisAccount 69 70 func (ga *GenesisAlloc) UnmarshalJSON(data []byte) error { 71 m := make(map[common.UnprefixedAddress]GenesisAccount) 72 if err := json.Unmarshal(data, &m); err != nil { 73 return err 74 } 75 *ga = make(GenesisAlloc) 76 for addr, a := range m { 77 (*ga)[common.Address(addr)] = a 78 } 79 return nil 80 } 81 82 // GenesisAccount is an account in the state of the genesis block. 83 type GenesisAccount struct { 84 Code []byte `json:"code,omitempty"` 85 Storage map[common.Hash]common.Hash `json:"storage,omitempty"` 86 Balance *big.Int `json:"balance" gencodec:"required"` 87 Nonce uint64 `json:"nonce,omitempty"` 88 PrivateKey []byte `json:"secretKey,omitempty"` // for tests 89 } 90 91 // field type overrides for gencodec 92 type genesisSpecMarshaling struct { 93 Nonce math.HexOrDecimal64 94 Timestamp math.HexOrDecimal64 95 ExtraData hexutil.Bytes 96 GasLimit math.HexOrDecimal64 97 GasUsed math.HexOrDecimal64 98 Number math.HexOrDecimal64 99 Difficulty *math.HexOrDecimal256 100 Alloc map[common.UnprefixedAddress]GenesisAccount 101 } 102 103 type genesisAccountMarshaling struct { 104 Code hexutil.Bytes 105 Balance *math.HexOrDecimal256 106 Nonce math.HexOrDecimal64 107 Storage map[storageJSON]storageJSON 108 PrivateKey hexutil.Bytes 109 } 110 111 // storageJSON represents a 256 bit byte array, but allows less than 256 bits when 112 // unmarshaling from hex. 113 type storageJSON common.Hash 114 115 func (h *storageJSON) UnmarshalText(text []byte) error { 116 text = bytes.TrimPrefix(text, []byte("0x")) 117 if len(text) > 64 { 118 return fmt.Errorf("too many hex characters in storage key/value %q", text) 119 } 120 offset := len(h) - len(text)/2 // pad on the left 121 if _, err := hex.Decode(h[offset:], text); err != nil { 122 fmt.Println(err) 123 return fmt.Errorf("invalid hex storage key/value %q", text) 124 } 125 return nil 126 } 127 128 func (h storageJSON) MarshalText() ([]byte, error) { 129 return hexutil.Bytes(h[:]).MarshalText() 130 } 131 132 // GenesisMismatchError is raised when trying to overwrite an existing 133 // genesis block with an incompatible one. 134 type GenesisMismatchError struct { 135 Stored, New common.Hash 136 } 137 138 func (e *GenesisMismatchError) Error() string { 139 return fmt.Sprintf("database contains incompatible genesis (have %x, new %x)", e.Stored, e.New) 140 } 141 142 // SetupGenesisBlock writes or updates the genesis block in db. 143 // The block that will be used is: 144 // 145 // genesis == nil genesis != nil 146 // +------------------------------------------ 147 // db has no genesis | main-net default | genesis 148 // db has genesis | from DB | genesis (if compatible) 149 // 150 // The stored chain configuration will be updated if it is compatible (i.e. does not 151 // specify a fork block below the local head block). In case of a conflict, the 152 // error is a *params.ConfigCompatError and the new, unwritten config is returned. 153 // 154 // The returned chain configuration is never nil. 155 func SetupGenesisBlock(db database.Database, genesis *Genesis) (*params.ChainConfig, common.Hash, error) { 156 return SetupGenesisBlockWithOverride(db, genesis) 157 } 158 159 func SetupGenesisBlockWithOverride(db database.Database, genesis *Genesis) (*params.ChainConfig, common.Hash, error) { 160 if genesis != nil && genesis.Config == nil { 161 return params.AllEthashProtocolChanges, common.Hash{}, errGenesisNoConfig 162 } 163 // Just commit the new block if there is no stored genesis block. 164 stored := rawdb.ReadCanonicalHash(db, 0) 165 if (stored == common.Hash{}) { 166 if genesis == nil { 167 log.Info("Writing default main-net genesis block") 168 genesis = DefaultGenesisBlock() 169 } else { 170 log.Info("Writing custom genesis block") 171 } 172 block, err := genesis.Commit(db) 173 if err != nil { 174 return genesis.Config, common.Hash{}, err 175 } 176 return genesis.Config, block.Hash(), nil 177 } 178 179 // We have the genesis block in database(perhaps in ancient database) 180 // but the corresponding state is missing. 181 header := rawdb.ReadHeader(db, stored, 0) 182 if _, err := state.New(header.Root, state.NewDatabaseWithCache(db, 0, ""), nil); err != nil { 183 if genesis == nil { 184 genesis = DefaultGenesisBlock() 185 } 186 // Ensure the stored genesis matches with the given one. 187 hash := genesis.ToBlock(nil).Hash() 188 if hash != stored { 189 return genesis.Config, hash, &GenesisMismatchError{stored, hash} 190 } 191 block, err := genesis.Commit(db) 192 if err != nil { 193 return genesis.Config, hash, err 194 } 195 return genesis.Config, block.Hash(), nil 196 } 197 198 // Check whether the genesis block is already written. 199 if genesis != nil { 200 hash := genesis.ToBlock(nil).Hash() 201 if hash != stored { 202 return genesis.Config, hash, &GenesisMismatchError{stored, hash} 203 } 204 } 205 206 // Get the existing chain configuration. 207 newcfg := genesis.configOrDefault(stored) 208 storedcfg := rawdb.ReadChainConfig(db, stored) 209 if storedcfg == nil { 210 log.Warn("Found genesis block without chain config") 211 rawdb.WriteChainConfig(db, stored, newcfg) 212 return newcfg, stored, nil 213 } 214 // Special case: don't change the existing config of a non-mainnet chain if no new 215 // config is supplied. These chains would get AllProtocolChanges (and a compat error) 216 // if we just continued here. 217 if genesis == nil && stored != params.MainnetGenesisHash { 218 return storedcfg, stored, nil 219 } 220 221 // Check config compatibility and write the config. Compatibility errors 222 // are returned to the caller unless we're already at block zero. 223 height := rawdb.ReadHeaderNumber(db, rawdb.ReadHeadHeaderHash(db)) 224 if height == nil { 225 return newcfg, stored, fmt.Errorf("missing block number for head header hash") 226 } 227 compatErr := storedcfg.CheckCompatible(newcfg, *height) 228 if compatErr != nil && *height != 0 && compatErr.RewindTo != 0 { 229 return newcfg, stored, compatErr 230 } 231 rawdb.WriteChainConfig(db, stored, newcfg) 232 return newcfg, stored, nil 233 } 234 235 func (g *Genesis) configOrDefault(ghash common.Hash) *params.ChainConfig { 236 switch { 237 case g != nil: 238 return g.Config 239 case ghash == params.MainnetGenesisHash: 240 return params.MainnetChainConfig 241 case ghash == params.TestnetGenesisHash: 242 return params.TestnetChainConfig 243 default: 244 return params.AllEthashProtocolChanges 245 } 246 } 247 248 // ToBlock creates the genesis block and writes state of a genesis specification 249 // to the given database (or discards it if nil). 250 func (g *Genesis) ToBlock(db database.Database) *types.Block { 251 if db == nil { 252 db = rawdb.NewMemoryDatabase() 253 } 254 statedb, _ := state.New(common.Hash{}, state.NewDatabase(db), nil) 255 for addr, account := range g.Alloc { 256 statedb.AddBalance(addr, account.Balance) 257 statedb.SetCode(addr, account.Code) 258 statedb.SetNonce(addr, account.Nonce) 259 for key, value := range account.Storage { 260 statedb.SetState(addr, key, value) 261 } 262 } 263 root := statedb.IntermediateRoot(false) 264 head := &types.Header{ 265 Number: new(big.Int).SetUint64(g.Number), 266 Nonce: types.EncodeNonce(g.Nonce), 267 Time: g.Timestamp, 268 ParentHash: g.ParentHash, 269 Extra: g.ExtraData, 270 GasLimit: g.GasLimit, 271 GasUsed: g.GasUsed, 272 Difficulty: g.Difficulty, 273 MixDigest: g.Mixhash, 274 Coinbase: g.Coinbase, 275 Root: root, 276 } 277 if g.GasLimit == 0 { 278 head.GasLimit = params.GenesisGasLimit 279 } 280 if g.Difficulty == nil { 281 head.Difficulty = params.GenesisDifficulty 282 } 283 statedb.Commit(false) 284 statedb.Database().TrieDB().Commit(root, true, nil) 285 286 return types.NewBlock(head, nil, nil, nil, new(trie.Trie)) 287 } 288 289 // Commit writes the block and state of a genesis specification to the database. 290 // The block is committed as the canonical head block. 291 func (g *Genesis) Commit(db database.Database) (*types.Block, error) { 292 block := g.ToBlock(db) 293 if block.Number().Sign() != 0 { 294 return nil, fmt.Errorf("can't commit genesis block with number > 0") 295 } 296 config := g.Config 297 if config == nil { 298 config = params.AllEthashProtocolChanges 299 } 300 rawdb.WriteTd(db, block.Hash(), block.NumberU64(), g.Difficulty) 301 rawdb.WriteBlock(db, block) 302 rawdb.WriteReceipts(db, block.Hash(), block.NumberU64(), nil) 303 rawdb.WriteCanonicalHash(db, block.Hash(), block.NumberU64()) 304 rawdb.WriteHeadBlockHash(db, block.Hash()) 305 rawdb.WriteHeadFastBlockHash(db, block.Hash()) 306 rawdb.WriteHeadHeaderHash(db, block.Hash()) 307 rawdb.WriteChainConfig(db, block.Hash(), config) 308 return block, nil 309 } 310 311 // MustCommit writes the genesis block and state to db, panicking on error. 312 // The block is committed as the canonical head block. 313 func (g *Genesis) MustCommit(db database.Database) *types.Block { 314 block, err := g.Commit(db) 315 if err != nil { 316 panic(err) 317 } 318 return block 319 } 320 321 // GenesisBlockForTesting creates and writes a block in which addr has the given wei balance. 322 func GenesisBlockForTesting(db database.Database, addr common.Address, balance *big.Int) *types.Block { 323 g := Genesis{Alloc: GenesisAlloc{addr: {Balance: balance}}} 324 return g.MustCommit(db) 325 } 326 327 // DefaultGenesisBlock returns the Ethereum main net genesis block. 328 func DefaultGenesisBlock() *Genesis { 329 return &Genesis{ 330 Config: params.MainnetChainConfig, 331 Nonce: 66, 332 ExtraData: hexutil.MustDecode("0x"), 333 GasLimit: 3141592, 334 Difficulty: big.NewInt(1051072), 335 Alloc: decodePrealloc(mainnetAllocData), 336 } 337 } 338 339 // DefaultTestnetGenesisBlock returns the Ropsten network genesis block. 340 func DefaultTestnetGenesisBlock() *Genesis { 341 return &Genesis{ 342 Config: params.TestnetChainConfig, 343 Nonce: 66, 344 ExtraData: hexutil.MustDecode("0x3535353535353535353535353535353535353535353535353535353535353535"), 345 GasLimit: 16777216, 346 Difficulty: big.NewInt(1048576), 347 Alloc: decodePrealloc(testnetAllocData), 348 } 349 } 350 351 // DeveloperGenesisBlock returns the 'geth --dev' genesis block. 352 func DeveloperGenesisBlock(period uint64, faucet common.Address) *Genesis { 353 // Override the default period to the user requested one 354 config := *params.AllCliqueProtocolChanges 355 config.Clique.Period = period 356 357 // Assemble and return the genesis with the precompiles and faucet pre-funded 358 return &Genesis{ 359 Config: &config, 360 ExtraData: append(append(make([]byte, 32), faucet[:]...), make([]byte, crypto.SignatureLength)...), 361 GasLimit: 11500000, 362 Difficulty: big.NewInt(1), 363 Alloc: map[common.Address]GenesisAccount{ 364 common.BytesToAddress([]byte{1}): {Balance: big.NewInt(1)}, // ECRecover 365 common.BytesToAddress([]byte{2}): {Balance: big.NewInt(1)}, // SHA256 366 common.BytesToAddress([]byte{3}): {Balance: big.NewInt(1)}, // RIPEMD 367 common.BytesToAddress([]byte{4}): {Balance: big.NewInt(1)}, // Identity 368 common.BytesToAddress([]byte{5}): {Balance: big.NewInt(1)}, // ModExp 369 common.BytesToAddress([]byte{6}): {Balance: big.NewInt(1)}, // ECAdd 370 common.BytesToAddress([]byte{7}): {Balance: big.NewInt(1)}, // ECScalarMul 371 common.BytesToAddress([]byte{8}): {Balance: big.NewInt(1)}, // ECPairing 372 common.BytesToAddress([]byte{9}): {Balance: big.NewInt(1)}, // BLAKE2b 373 faucet: {Balance: new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 256), big.NewInt(9))}, 374 }, 375 } 376 } 377 378 func decodePrealloc(data string) GenesisAlloc { 379 var p []struct{ Addr, Balance *big.Int } 380 if err := rlp.NewStream(strings.NewReader(data), 0).Decode(&p); err != nil { 381 panic(err) 382 } 383 ga := make(GenesisAlloc, len(p)) 384 for _, account := range p { 385 ga[common.BigToAddress(account.Addr)] = GenesisAccount{Balance: account.Balance} 386 } 387 return ga 388 }