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