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