github.com/Consensys/quorum@v21.1.0+incompatible/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/ethereum/go-ethereum/common" 29 "github.com/ethereum/go-ethereum/common/hexutil" 30 "github.com/ethereum/go-ethereum/common/math" 31 "github.com/ethereum/go-ethereum/core/rawdb" 32 "github.com/ethereum/go-ethereum/core/state" 33 "github.com/ethereum/go-ethereum/core/types" 34 "github.com/ethereum/go-ethereum/crypto" 35 "github.com/ethereum/go-ethereum/ethdb" 36 "github.com/ethereum/go-ethereum/log" 37 "github.com/ethereum/go-ethereum/params" 38 "github.com/ethereum/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) 156 } 157 158 func SetupGenesisBlockWithOverride(db ethdb.Database, genesis *Genesis, overrideIstanbul *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 172 // Quorum: Set default transaction size limit if not set in genesis 173 if genesis.Config.TransactionSizeLimit == 0 { 174 genesis.Config.TransactionSizeLimit = DefaultTxPoolConfig.TransactionSizeLimit 175 } 176 177 // Check transaction size limit and max contract code size 178 err := genesis.Config.IsValid() 179 if err != nil { 180 return genesis.Config, common.Hash{}, err 181 } 182 183 // /Quorum 184 185 block, err := genesis.Commit(db) 186 if err != nil { 187 return genesis.Config, common.Hash{}, err 188 } 189 checkAndPrintPrivacyEnhancementsWarning(genesis.Config) 190 return genesis.Config, block.Hash(), nil 191 } 192 193 // We have the genesis block in database(perhaps in ancient database) 194 // but the corresponding state is missing. 195 header := rawdb.ReadHeader(db, stored, 0) 196 if _, err := state.New(header.Root, state.NewDatabaseWithCache(db, 0)); err != nil { 197 if genesis == nil { 198 genesis = DefaultGenesisBlock() 199 } 200 // Ensure the stored genesis matches with the given one. 201 hash := genesis.ToBlock(nil).Hash() 202 if hash != stored { 203 return genesis.Config, hash, &GenesisMismatchError{stored, hash} 204 } 205 block, err := genesis.Commit(db) 206 if err != nil { 207 return genesis.Config, hash, err 208 } 209 return genesis.Config, block.Hash(), nil 210 } 211 212 // Check whether the genesis block is already written. 213 if genesis != nil { 214 hash := genesis.ToBlock(nil).Hash() 215 if hash != stored { 216 return genesis.Config, hash, &GenesisMismatchError{stored, hash} 217 } 218 } 219 220 // Get the existing chain configuration. 221 newcfg := genesis.configOrDefault(stored) 222 if overrideIstanbul != nil { 223 newcfg.IstanbulBlock = overrideIstanbul 224 } 225 if err := newcfg.CheckConfigForkOrder(); err != nil { 226 return newcfg, common.Hash{}, err 227 } 228 storedcfg := rawdb.ReadChainConfig(db, stored) 229 if storedcfg == nil { 230 log.Warn("Found genesis block without chain config") 231 rawdb.WriteChainConfig(db, stored, newcfg) 232 checkAndPrintPrivacyEnhancementsWarning(newcfg) 233 return newcfg, stored, nil 234 } 235 // Special case: don't change the existing config of a non-mainnet chain if no new 236 // config is supplied. These chains would get AllProtocolChanges (and a compat error) 237 // if we just continued here. 238 if genesis == nil && stored != params.MainnetGenesisHash { 239 return storedcfg, stored, nil 240 } 241 242 // Check config compatibility and write the config. Compatibility errors 243 // are returned to the caller unless we're already at block zero. 244 height := rawdb.ReadHeaderNumber(db, rawdb.ReadHeadHeaderHash(db)) 245 if height == nil { 246 return newcfg, stored, fmt.Errorf("missing block number for head header hash") 247 } 248 compatErr := storedcfg.CheckCompatible(newcfg, *height, rawdb.GetIsQuorumEIP155Activated(db)) 249 if compatErr != nil && *height != 0 && compatErr.RewindTo != 0 { 250 return newcfg, stored, compatErr 251 } 252 rawdb.WriteChainConfig(db, stored, newcfg) 253 if storedcfg.PrivacyEnhancementsBlock == nil { 254 checkAndPrintPrivacyEnhancementsWarning(newcfg) 255 } 256 return newcfg, stored, nil 257 } 258 259 func checkAndPrintPrivacyEnhancementsWarning(config *params.ChainConfig) { 260 if config.PrivacyEnhancementsBlock != nil { 261 log.Warn("Privacy enhancements have been enabled from block height " + config.PrivacyEnhancementsBlock.String() + 262 ". Please ensure your privacy manager is upgraded and supports privacy enhancements (tessera version 1.*) " + 263 "otherwise your quorum node will fail to start.") 264 } 265 } 266 267 func (g *Genesis) configOrDefault(ghash common.Hash) *params.ChainConfig { 268 switch { 269 case g != nil: 270 return g.Config 271 case ghash == params.MainnetGenesisHash: 272 return params.MainnetChainConfig 273 case ghash == params.TestnetGenesisHash: 274 return params.TestnetChainConfig 275 default: 276 return params.AllEthashProtocolChanges 277 } 278 } 279 280 // ToBlock creates the genesis block and writes state of a genesis specification 281 // to the given database (or discards it if nil). 282 func (g *Genesis) ToBlock(db ethdb.Database) *types.Block { 283 if db == nil { 284 db = rawdb.NewMemoryDatabase() 285 } 286 statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) 287 for addr, account := range g.Alloc { 288 statedb.AddBalance(addr, account.Balance) 289 statedb.SetCode(addr, account.Code) 290 statedb.SetNonce(addr, account.Nonce) 291 for key, value := range account.Storage { 292 statedb.SetState(addr, key, value) 293 } 294 } 295 root := statedb.IntermediateRoot(false) 296 head := &types.Header{ 297 Number: new(big.Int).SetUint64(g.Number), 298 Nonce: types.EncodeNonce(g.Nonce), 299 Time: g.Timestamp, 300 ParentHash: g.ParentHash, 301 Extra: g.ExtraData, 302 GasLimit: g.GasLimit, 303 GasUsed: g.GasUsed, 304 Difficulty: g.Difficulty, 305 MixDigest: g.Mixhash, 306 Coinbase: g.Coinbase, 307 Root: root, 308 } 309 if g.GasLimit == 0 { 310 head.GasLimit = params.GenesisGasLimit 311 } 312 if g.Difficulty == nil { 313 head.Difficulty = params.GenesisDifficulty 314 } 315 statedb.Commit(false) 316 statedb.Database().TrieDB().Commit(root, true) 317 318 return types.NewBlock(head, nil, nil, nil) 319 } 320 321 // Commit writes the block and state of a genesis specification to the database. 322 // The block is committed as the canonical head block. 323 func (g *Genesis) Commit(db ethdb.Database) (*types.Block, error) { 324 block := g.ToBlock(db) 325 if block.Number().Sign() != 0 { 326 return nil, fmt.Errorf("can't commit genesis block with number > 0") 327 } 328 config := g.Config 329 if config == nil { 330 config = params.AllEthashProtocolChanges 331 } 332 if err := config.CheckConfigForkOrder(); err != nil { 333 return nil, err 334 } 335 rawdb.WriteTd(db, block.Hash(), block.NumberU64(), g.Difficulty) 336 rawdb.WriteBlock(db, block) 337 rawdb.WriteReceipts(db, block.Hash(), block.NumberU64(), nil) 338 rawdb.WriteCanonicalHash(db, block.Hash(), block.NumberU64()) 339 rawdb.WriteHeadBlockHash(db, block.Hash()) 340 rawdb.WriteHeadFastBlockHash(db, block.Hash()) 341 rawdb.WriteHeadHeaderHash(db, block.Hash()) 342 rawdb.WriteChainConfig(db, block.Hash(), config) 343 return block, nil 344 } 345 346 // MustCommit writes the genesis block and state to db, panicking on error. 347 // The block is committed as the canonical head block. 348 func (g *Genesis) MustCommit(db ethdb.Database) *types.Block { 349 block, err := g.Commit(db) 350 if err != nil { 351 panic(err) 352 } 353 return block 354 } 355 356 // GenesisBlockForTesting creates and writes a block in which addr has the given wei balance. 357 func GenesisBlockForTesting(db ethdb.Database, addr common.Address, balance *big.Int) *types.Block { 358 g := Genesis{Alloc: GenesisAlloc{addr: {Balance: balance}}} 359 return g.MustCommit(db) 360 } 361 362 // DefaultGenesisBlock returns the Ethereum main net genesis block. 363 func DefaultGenesisBlock() *Genesis { 364 return &Genesis{ 365 Config: params.MainnetChainConfig, 366 Nonce: 66, 367 ExtraData: hexutil.MustDecode("0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa"), 368 GasLimit: 5000, 369 Difficulty: big.NewInt(17179869184), 370 Alloc: decodePrealloc(mainnetAllocData), 371 } 372 } 373 374 // DefaultTestnetGenesisBlock returns the Ropsten network genesis block. 375 func DefaultTestnetGenesisBlock() *Genesis { 376 return &Genesis{ 377 Config: params.TestnetChainConfig, 378 Nonce: 66, 379 ExtraData: hexutil.MustDecode("0x3535353535353535353535353535353535353535353535353535353535353535"), 380 GasLimit: 16777216, 381 Difficulty: big.NewInt(1048576), 382 Alloc: decodePrealloc(testnetAllocData), 383 } 384 } 385 386 // DefaultRinkebyGenesisBlock returns the Rinkeby network genesis block. 387 func DefaultRinkebyGenesisBlock() *Genesis { 388 return &Genesis{ 389 Config: params.RinkebyChainConfig, 390 Timestamp: 1492009146, 391 ExtraData: hexutil.MustDecode("0x52657370656374206d7920617574686f7269746168207e452e436172746d616e42eb768f2244c8811c63729a21a3569731535f067ffc57839b00206d1ad20c69a1981b489f772031b279182d99e65703f0076e4812653aab85fca0f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), 392 GasLimit: 4700000, 393 Difficulty: big.NewInt(1), 394 Alloc: decodePrealloc(rinkebyAllocData), 395 } 396 } 397 398 // DefaultGoerliGenesisBlock returns the Görli network genesis block. 399 func DefaultGoerliGenesisBlock() *Genesis { 400 return &Genesis{ 401 Config: params.GoerliChainConfig, 402 Timestamp: 1548854791, 403 ExtraData: hexutil.MustDecode("0x22466c6578692069732061207468696e6722202d204166726900000000000000e0a2bd4258d2768837baa26a28fe71dc079f84c70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), 404 GasLimit: 10485760, 405 Difficulty: big.NewInt(1), 406 Alloc: decodePrealloc(goerliAllocData), 407 } 408 } 409 410 // DeveloperGenesisBlock returns the 'geth --dev' genesis block. Note, this must 411 // be seeded with the 412 func DeveloperGenesisBlock(period uint64, faucet common.Address) *Genesis { 413 // Override the default period to the user requested one 414 config := *params.AllCliqueProtocolChanges 415 config.Clique.Period = period 416 417 // Assemble and return the genesis with the precompiles and faucet pre-funded 418 return &Genesis{ 419 Config: &config, 420 ExtraData: append(append(make([]byte, 32), faucet[:]...), make([]byte, crypto.SignatureLength)...), 421 GasLimit: 6283185, 422 Difficulty: big.NewInt(1), 423 Alloc: map[common.Address]GenesisAccount{ 424 common.BytesToAddress([]byte{1}): {Balance: big.NewInt(1)}, // ECRecover 425 common.BytesToAddress([]byte{2}): {Balance: big.NewInt(1)}, // SHA256 426 common.BytesToAddress([]byte{3}): {Balance: big.NewInt(1)}, // RIPEMD 427 common.BytesToAddress([]byte{4}): {Balance: big.NewInt(1)}, // Identity 428 common.BytesToAddress([]byte{5}): {Balance: big.NewInt(1)}, // ModExp 429 common.BytesToAddress([]byte{6}): {Balance: big.NewInt(1)}, // ECAdd 430 common.BytesToAddress([]byte{7}): {Balance: big.NewInt(1)}, // ECScalarMul 431 common.BytesToAddress([]byte{8}): {Balance: big.NewInt(1)}, // ECPairing 432 faucet: {Balance: new(big.Int).Sub(new(big.Int).Lsh(big.NewInt(1), 256), big.NewInt(9))}, 433 }, 434 } 435 } 436 437 func decodePrealloc(data string) GenesisAlloc { 438 var p []struct{ Addr, Balance *big.Int } 439 if err := rlp.NewStream(strings.NewReader(data), 0).Decode(&p); err != nil { 440 panic(err) 441 } 442 ga := make(GenesisAlloc, len(p)) 443 for _, account := range p { 444 ga[common.BigToAddress(account.Addr)] = GenesisAccount{Balance: account.Balance} 445 } 446 return ga 447 }