diff --git a/cmd/integration/commands/stages.go b/cmd/integration/commands/stages.go index 12244132e64bd0a5f105fd23b965c6f758299437..8f5d35643a94b0c5540f772d600ae06e3770d7b6 100644 --- a/cmd/integration/commands/stages.go +++ b/cmd/integration/commands/stages.go @@ -924,6 +924,9 @@ func byChain() (*core.Genesis, *params.ChainConfig) { case params.SokolChainName: chainConfig = params.SokolChainConfig genesis = core.DefaultSokolGenesisBlock() + case params.KovanChainName: + chainConfig = params.KovanChainConfig + genesis = core.DefaultKovanGenesisBlock() } return genesis, chainConfig } @@ -953,7 +956,7 @@ func newSync(ctx context.Context, db kv.RwDB, miningConfig *params.MiningConfig) var engine consensus.Engine engine = ethash.NewFaker() switch chain { - case params.SokolChainName: + case params.SokolChainName, params.KovanChainName: engine = ethconfig.CreateConsensusEngine(chainConfig, logger, ¶ms.AuRaConfig{DBPath: path.Join(datadir, "aura")}, nil, false) } diff --git a/cmd/sentry/download/sentry.go b/cmd/sentry/download/sentry.go index 20022057300b67b39b116cb307d0ae2f6f019db8..28edf846eb930bc85cd939698e03d3fcf3370fba 100644 --- a/cmd/sentry/download/sentry.go +++ b/cmd/sentry/download/sentry.go @@ -122,6 +122,8 @@ func makeP2PServer( urls = params.RinkebyBootnodes case params.SokolGenesisHash: urls = params.SokolBootnodes + case params.KovanGenesisHash: + urls = params.KovanBootnodes } p2pConfig.BootstrapNodes = make([]*enode.Node, 0, len(urls)) for _, url := range urls { diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index ee8ad576473d3214e86ef53e8d50e98b0c35fde0..2b87de396c2389c7da197eb23ce6973496b9d9e0 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -599,6 +599,8 @@ func setBootstrapNodes(ctx *cli.Context, cfg *p2p.Config) { urls = params.ErigonBootnodes case params.SokolChainName: urls = params.SokolBootnodes + case params.KovanChainName: + urls = params.KovanBootnodes default: if cfg.BootstrapNodes != nil { return // already set, don't apply defaults. @@ -639,6 +641,8 @@ func setBootstrapNodesV5(ctx *cli.Context, cfg *p2p.Config) { urls = params.ErigonBootnodes case params.SokolChainName: urls = params.SokolBootnodes + case params.KovanChainName: + urls = params.KovanBootnodes default: if cfg.BootstrapNodesV5 != nil { return // already set, don't apply defaults. @@ -869,6 +873,8 @@ func DataDirForNetwork(datadir string, network string) string { filepath.Join(datadir, "goerli") case params.SokolChainName: return filepath.Join(datadir, "sokol") + case params.KovanChainName: + return filepath.Join(datadir, "kovan") default: return datadir } @@ -1242,6 +1248,11 @@ func SetEthConfig(ctx *cli.Context, nodeConfig *node.Config, cfg *ethconfig.Conf cfg.NetworkID = 77 } cfg.Genesis = core.DefaultSokolGenesisBlock() + case params.KovanChainName: + if !ctx.GlobalIsSet(NetworkIdFlag.Name) { + cfg.NetworkID = 42 + } + cfg.Genesis = core.DefaultKovanGenesisBlock() case params.DevChainName: if !ctx.GlobalIsSet(NetworkIdFlag.Name) { cfg.NetworkID = 1337 @@ -1315,6 +1326,8 @@ func MakeGenesis(ctx *cli.Context) *core.Genesis { genesis = core.DefaultErigonGenesisBlock() case params.SokolChainName: genesis = core.DefaultSokolGenesisBlock() + case params.KovanChainName: + genesis = core.DefaultKovanGenesisBlock() case params.DevChainName: Fatalf("Developer chains are ephemeral") } diff --git a/consensus/aura/consensusconfig/embed.go b/consensus/aura/consensusconfig/embed.go index 2ab017dd741232563fa9d686ab64dc3a64c0f64a..883c4c3d04e2ebb9d3e7ac52b2f4662e669f03a0 100644 --- a/consensus/aura/consensusconfig/embed.go +++ b/consensus/aura/consensusconfig/embed.go @@ -2,7 +2,22 @@ package consensusconfig import ( _ "embed" + "github.com/ledgerwatch/erigon/params" ) //go:embed poasokol.json var Sokol []byte + +//go:embed kovan.json +var Kovan []byte + +func GetConfigByChain(chainName string) []byte { + switch chainName { + case params.SokolChainName: + return Sokol + case params.KovanChainName: + return Kovan + default: + return Sokol + } +} diff --git a/consensus/aura/consensusconfig/kovan.json b/consensus/aura/consensusconfig/kovan.json new file mode 100644 index 0000000000000000000000000000000000000000..603a5fbdd3140e8a1d9f04af248f1ebb6e127172 --- /dev/null +++ b/consensus/aura/consensusconfig/kovan.json @@ -0,0 +1,36 @@ +{ + "stepDuration": 4, + "blockReward": "0x4563918244F40000", + "validators": { + "multi": { + "0": { + "list": [ + "0x00D6Cc1BA9cf89BD2e58009741f4F7325BAdc0ED", + "0x00427feae2419c15b89d1c21af10d1b6650a4d3d", + "0x4Ed9B08e6354C70fE6F8CB0411b0d3246b424d6c", + "0x0020ee4Be0e2027d76603cB751eE069519bA81A1", + "0x0010f94b296a852aaac52ea6c5ac72e03afd032d", + "0x007733a1FE69CF3f2CF989F81C7b4cAc1693387A", + "0x00E6d2b931F55a3f1701c7389d592a7778897879", + "0x00e4a10650e5a6D6001C38ff8E64F97016a1645c", + "0x00a0a24b9f0e5ec7aa4c7389b8302fd0123194de" + ] + }, + "10960440": { + "list": [ + "0x00D6Cc1BA9cf89BD2e58009741f4F7325BAdc0ED", + "0x0010f94b296a852aaac52ea6c5ac72e03afd032d", + "0x00a0a24b9f0e5ec7aa4c7389b8302fd0123194de" + ] + }, + "10960500": { + "safeContract": "0xaE71807C1B0a093cB1547b682DC78316D945c9B8" + } + } + }, + "validateScoreTransition": 4301764, + "validateStepTransition": 1500000, + "maximumUncleCountTransition": 5067000, + "maximumUncleCount": 0 +} + diff --git a/core/allocs/kovan.json b/core/allocs/kovan.json new file mode 100644 index 0000000000000000000000000000000000000000..1821842a5631b68d32f81a1d7d8252427e69f69e --- /dev/null +++ b/core/allocs/kovan.json @@ -0,0 +1,17 @@ +{ + "0x0000000000000000000000000000000000000001": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000002": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000003": { + "balance": "0x1" + }, + "0x0000000000000000000000000000000000000004": { + "balance": "0x1" + }, + "0x00521965e7bd230323c423d96c657db5b79d099f": { + "balance": "1606938044258990275541962092341162602522202993782792835301376" + } +} \ No newline at end of file diff --git a/core/genesis.go b/core/genesis.go index aac7f713bca08a608aaab9f2bd4e2e3c799a7c48..e52eddf006d9cdf1455c74200ce2a101dde653ad 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -307,6 +307,8 @@ func (g *Genesis) configOrDefault(ghash common.Hash) *params.ChainConfig { return params.ErigonChainConfig case ghash == params.SokolGenesisHash: return params.SokolChainConfig + case ghash == params.KovanGenesisHash: + return params.KovanChainConfig default: return params.AllEthashProtocolChanges } @@ -601,6 +603,24 @@ func DefaultSokolGenesisBlock() *Genesis { } } +func DefaultKovanGenesisBlock() *Genesis { + sealRlp, err := rlp.EncodeToBytes([][]byte{ + common.FromHex(""), + common.FromHex("0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), + }) + if err != nil { + panic(err) + } + return &Genesis{ + Config: params.KovanChainConfig, + Timestamp: 0x0, + SealRlp: sealRlp, + GasLimit: 0x5B8D80, + Difficulty: big.NewInt(0x20000), + Alloc: readPrealloc("allocs/kovan.json"), + } +} + // Pre-calculated version of: // DevnetSignPrivateKey = crypto.HexToECDSA(sha256.Sum256([]byte("erigon devnet key"))) // DevnetEtherbase=crypto.PubkeyToAddress(DevnetSignPrivateKey.PublicKey) diff --git a/eth/ethconfig/config.go b/eth/ethconfig/config.go index a116e27d48dea398ab59f4c5d41e798fa1255547..c3186024cba50a332845345862fb42e79cb9ac34 100644 --- a/eth/ethconfig/config.go +++ b/eth/ethconfig/config.go @@ -214,7 +214,7 @@ func CreateConsensusEngine(chainConfig *params.ChainConfig, logger log.Logger, c case *params.AuRaConfig: if chainConfig.Aura != nil { var err error - eng, err = aura.NewAuRa(chainConfig.Aura, db.OpenDatabase(consensusCfg.DBPath, logger, consensusCfg.InMemory), chainConfig.Aura.Etherbase, consensusconfig.Sokol) + eng, err = aura.NewAuRa(chainConfig.Aura, db.OpenDatabase(consensusCfg.DBPath, logger, consensusCfg.InMemory), chainConfig.Aura.Etherbase, consensusconfig.GetConfigByChain(chainConfig.ChainName)) if err != nil { panic(err) } diff --git a/params/bootnodes.go b/params/bootnodes.go index 6806fc01bc61b38d070f330c4482486663a840f4..9328d8d6994107890d3223a867b772a31de9e426 100644 --- a/params/bootnodes.go +++ b/params/bootnodes.go @@ -77,6 +77,12 @@ var SokolBootnodes = []string{ "enode://f11a0f80939b49a28bf99581da9b351a592ec1504b9d32a7dfda79b36510a891e96631239c4166e5c73368c21e9bb3241e7fd6929b899772e5a8fe9a7b7c3af6@45.77.52.149:30303", } +var KovanBootnodes = []string{ + "enode://30499bde23362f7d310a34518a2a6ff765921870bf0c3e63d21153cfa7ba9cf39cc7c8e54e9dad2f2b3c07288b3e91b220656833cc2d843a54875c229f3f959a@8.9.8.175:30303", + "enode://16898006ba2cd4fa8bf9a3dfe32684c178fa861df144bfc21fe800dc4838a03e342056951fa9fd533dcb0be1219e306106442ff2cf1f7e9f8faa5f2fc1a3aa45@116.203.116.241:30303", + "enode://49a0e1aa38caa12cbf31222cb4e31cef1e8794cb4dd38012f84498ac867b19584e29bbf6d53201d7dfd3b5eb0998a4d908d096ed4ddb5f9102c623852cd331ec@54.87.247.5:30303", +} + var V5Bootnodes = []string{ // Teku team's bootnode "enr:-KG4QOtcP9X1FbIMOe17QNMKqDxCpm14jcX5tiOE4_TyMrFqbmhPZHK_ZPG2Gxb1GE2xdtodOfx9-cgvNtxnRyHEmC0ghGV0aDKQ9aX9QgAAAAD__________4JpZIJ2NIJpcIQDE8KdiXNlY3AyNTZrMaEDhpehBDbZjM_L9ek699Y7vhUJ-eAdMyQW_Fil522Y0fODdGNwgiMog3VkcIIjKA", diff --git a/params/config.go b/params/config.go index 97e16c0cf71f0ae0f961e822523bb79ac492535a..56e36ce9b682a624d25f9696b19b479db9d0dd22 100644 --- a/params/config.go +++ b/params/config.go @@ -33,6 +33,7 @@ const ( DevChainName = "dev" ErigonMineName = "erigonmine" SokolChainName = "sokol" + KovanChainName = "kovan" ) // Genesis hashes to enforce below configs on. @@ -43,6 +44,7 @@ var ( GoerliGenesisHash = common.HexToHash("0xbf7e331f7f7c1dd2e05159666b3bf8bc7a8a3a9eb1d518969eab529dd9b88c1a") ErigonGenesisHash = common.HexToHash("0xfecd5c85712e36f30f09ba3a42386b42c46b5ba5395a4246b952e655f9aa0f58") SokolGenesisHash = common.HexToHash("0x5b28c1bfd3a15230c9a46b399cd0f9a6920d432e85381cc6a140b06e8410112f") + KovanGenesisHash = common.HexToHash("0xa3c565fc15c7478862d50ccd6561e3c06b24cc509bf388941c25ea985ce32cb9") ) var ( @@ -51,6 +53,7 @@ var ( var ( SokolGenesisStateRoot = common.HexToHash("0xfad4af258fd11939fae0c6c6eec9d340b1caac0b0196fd9a1bc3f489c5bf00b3") + KovanGenesisStateRoot = common.HexToHash("0x2480155b48a1cea17d67dbfdfaafe821c1d19cdd478c5358e8ec56dec24502b2") ) var ( @@ -225,6 +228,26 @@ var ( Aura: &AuRaConfig{}, } + KovanChainConfig = &ChainConfig{ + ChainName: KovanChainName, + ChainID: big.NewInt(42), + HomesteadBlock: big.NewInt(0), + DAOForkBlock: nil, + DAOForkSupport: false, + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + ByzantiumBlock: big.NewInt(5067000), + ConstantinopleBlock: big.NewInt(9200000), + PetersburgBlock: big.NewInt(10255201), + IstanbulBlock: big.NewInt(14111141), + MuirGlacierBlock: nil, + BerlinBlock: big.NewInt(24770900), + LondonBlock: big.NewInt(26741100), + CatalystBlock: nil, + Aura: &AuRaConfig{}, + } + // AllEthashProtocolChanges contains every protocol change (EIPs) introduced // and accepted by the Ethereum core developers into the Ethash consensus. // diff --git a/turbo/stages/genesis_test.go b/turbo/stages/genesis_test.go index 2b166f0010c3b7efac44f1ad59628668d00d2c4c..b9c3fdcef47196b04b6b48b3542652574844a07a 100644 --- a/turbo/stages/genesis_test.go +++ b/turbo/stages/genesis_test.go @@ -60,6 +60,17 @@ func TestDefaultGenesisBlock(t *testing.T) { if block.Hash() != params.SokolGenesisHash { t.Errorf("wrong sokol genesis hash, got %v, want %v", block.Hash(), params.SokolGenesisHash) } + + block, _, err = core.DefaultKovanGenesisBlock().ToBlock() + if err != nil { + t.Errorf("error: %w", err) + } + if block.Root() != params.KovanGenesisStateRoot { + t.Errorf("wrong kovan genesis state root, got %v, want %v", block.Root(), params.KovanGenesisStateRoot) + } + if block.Hash() != params.KovanGenesisHash { + t.Errorf("wrong kovan genesis hash, got %v, want %v", block.Hash(), params.KovanGenesisHash) + } } func TestSokolHeaderRLP(t *testing.T) {