Add support for amoy testnet (#8674)

Co-authored-by: Mark Holt <mark@distributed.vision>
Co-authored-by: alex.sharov <AskAlexSharov@gmail.com>
This commit is contained in:
Anshal Shukla 2023-11-30 04:19:52 +03:00 committed by GitHub
parent 473e0414ef
commit 8d1758ceea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 149 additions and 3 deletions

View File

@ -102,8 +102,8 @@ download speed by flag `--torrent.download.rate=20mb`. <code>🔬 See [Downloade
Use `--datadir` to choose where to store data. Use `--datadir` to choose where to store data.
Use `--chain=gnosis` for [Gnosis Chain](https://www.gnosis.io/), `--chain=bor-mainnet` for Polygon Mainnet, Use `--chain=gnosis` for [Gnosis Chain](https://www.gnosis.io/), `--chain=bor-mainnet` for Polygon Mainnet,
and `--chain=mumbai` for Polygon Mumbai. `--chain=mumbai` for Polygon Mumbai and `--chain=amoy` for Polygon Amoy.
For Gnosis Chain you need a [Consensus Layer](#beacon-chain-consensus-layer) client alongside For Gnosis Chain you need a [Consensus Layer](#beacon-chain-consensus-layer) client alongside
Erigon (https://docs.gnosischain.com/node/guide/beacon). Erigon (https://docs.gnosischain.com/node/guide/beacon).

View File

@ -88,6 +88,8 @@ func DataDirForNetwork(datadir string, network string) string {
return networkDataDirCheckingLegacy(datadir, "goerli") return networkDataDirCheckingLegacy(datadir, "goerli")
case networkname.MumbaiChainName: case networkname.MumbaiChainName:
return networkDataDirCheckingLegacy(datadir, "mumbai") return networkDataDirCheckingLegacy(datadir, "mumbai")
case networkname.AmoyChainName:
return networkDataDirCheckingLegacy(datadir, "amoy")
case networkname.BorMainnetChainName: case networkname.BorMainnetChainName:
return networkDataDirCheckingLegacy(datadir, "bor-mainnet") return networkDataDirCheckingLegacy(datadir, "bor-mainnet")
case networkname.BorDevnetChainName: case networkname.BorDevnetChainName:

17
core/allocs/amoy.json Normal file

File diff suppressed because one or more lines are too long

View File

@ -154,6 +154,15 @@ func TestCreation(t *testing.T) {
{41874000, 0, ID{Hash: checksumToBytes(0x0c015a91), Next: 0}}, // First Agra block {41874000, 0, ID{Hash: checksumToBytes(0x0c015a91), Next: 0}}, // First Agra block
}, },
}, },
// Amoy test cases
{
params.AmoyChainConfig,
params.AmoyGenesisHash,
[]testcase{
{0, 0, ID{Hash: checksumToBytes(0xbe06a477), Next: 73100}},
{73100, 0, ID{Hash: checksumToBytes(0x135d2cd5), Next: 0}}, // First London, Jaipur, Delhi, Indore, Agra
},
},
// Bor mainnet test cases // Bor mainnet test cases
{ {
params.BorMainnetChainConfig, params.BorMainnetChainConfig,

View File

@ -380,6 +380,7 @@ func GoerliGenesisBlock() *types.Genesis {
} }
} }
// MumbaiGenesisBlock returns the Amoy network genesis block.
func MumbaiGenesisBlock() *types.Genesis { func MumbaiGenesisBlock() *types.Genesis {
return &types.Genesis{ return &types.Genesis{
Config: params.MumbaiChainConfig, Config: params.MumbaiChainConfig,
@ -393,6 +394,20 @@ func MumbaiGenesisBlock() *types.Genesis {
} }
} }
// AmoyGenesisBlock returns the Amoy network genesis block.
func AmoyGenesisBlock() *types.Genesis {
return &types.Genesis{
Config: params.AmoyChainConfig,
Nonce: 0,
Timestamp: 1700225065,
GasLimit: 10000000,
Difficulty: big.NewInt(1),
Mixhash: libcommon.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000"),
Coinbase: libcommon.HexToAddress("0x0000000000000000000000000000000000000000"),
Alloc: readPrealloc("allocs/amoy.json"),
}
}
// BorMainnetGenesisBlock returns the Bor Mainnet network genesis block. // BorMainnetGenesisBlock returns the Bor Mainnet network genesis block.
func BorMainnetGenesisBlock() *types.Genesis { func BorMainnetGenesisBlock() *types.Genesis {
return &types.Genesis{ return &types.Genesis{
@ -650,6 +665,8 @@ func GenesisBlockByChainName(chain string) *types.Genesis {
return GoerliGenesisBlock() return GoerliGenesisBlock()
case networkname.MumbaiChainName: case networkname.MumbaiChainName:
return MumbaiGenesisBlock() return MumbaiGenesisBlock()
case networkname.AmoyChainName:
return AmoyGenesisBlock()
case networkname.BorMainnetChainName: case networkname.BorMainnetChainName:
return BorMainnetGenesisBlock() return BorMainnetGenesisBlock()
case networkname.BorDevnetChainName: case networkname.BorDevnetChainName:

View File

@ -15,7 +15,7 @@ import (
func init() { func init() {
// Initialise SystemContractCodeLookup // Initialise SystemContractCodeLookup
for _, chainName := range []string{networkname.BorMainnetChainName, networkname.MumbaiChainName, networkname.BorDevnetChainName} { for _, chainName := range []string{networkname.BorMainnetChainName, networkname.MumbaiChainName, networkname.AmoyChainName, networkname.BorDevnetChainName} {
byChain := map[libcommon.Address][]libcommon.CodeRecord{} byChain := map[libcommon.Address][]libcommon.CodeRecord{}
systemcontracts.SystemContractCodeLookup[chainName] = byChain systemcontracts.SystemContractCodeLookup[chainName] = byChain
// Apply genesis with the block number 0 // Apply genesis with the block number 0

View File

@ -7,6 +7,7 @@ const (
GoerliChainName = "goerli" GoerliChainName = "goerli"
DevChainName = "dev" DevChainName = "dev"
MumbaiChainName = "mumbai" MumbaiChainName = "mumbai"
AmoyChainName = "amoy"
BorMainnetChainName = "bor-mainnet" BorMainnetChainName = "bor-mainnet"
BorDevnetChainName = "bor-devnet" BorDevnetChainName = "bor-devnet"
GnosisChainName = "gnosis" GnosisChainName = "gnosis"
@ -20,6 +21,7 @@ var All = []string{
SepoliaChainName, SepoliaChainName,
GoerliChainName, GoerliChainName,
MumbaiChainName, MumbaiChainName,
AmoyChainName,
BorMainnetChainName, BorMainnetChainName,
BorDevnetChainName, BorDevnetChainName,
GnosisChainName, GnosisChainName,

View File

@ -19,6 +19,7 @@ var (
Sepolia = fromToml(snapshothashes.Sepolia) Sepolia = fromToml(snapshothashes.Sepolia)
Goerli = fromToml(snapshothashes.Goerli) Goerli = fromToml(snapshothashes.Goerli)
Mumbai = fromToml(snapshothashes.Mumbai) Mumbai = fromToml(snapshothashes.Mumbai)
Amoy = fromToml(snapshothashes.Amoy)
BorMainnet = fromToml(snapshothashes.BorMainnet) BorMainnet = fromToml(snapshothashes.BorMainnet)
Gnosis = fromToml(snapshothashes.Gnosis) Gnosis = fromToml(snapshothashes.Gnosis)
Chiado = fromToml(snapshothashes.Chiado) Chiado = fromToml(snapshothashes.Chiado)
@ -53,6 +54,7 @@ var (
SepoliaChainSnapshotCfg = newCfg(Sepolia) SepoliaChainSnapshotCfg = newCfg(Sepolia)
GoerliChainSnapshotCfg = newCfg(Goerli) GoerliChainSnapshotCfg = newCfg(Goerli)
MumbaiChainSnapshotCfg = newCfg(Mumbai) MumbaiChainSnapshotCfg = newCfg(Mumbai)
AmoyChainSnapshotCfg = newCfg(Amoy)
BorMainnetChainSnapshotCfg = newCfg(BorMainnet) BorMainnetChainSnapshotCfg = newCfg(BorMainnet)
GnosisChainSnapshotCfg = newCfg(Gnosis) GnosisChainSnapshotCfg = newCfg(Gnosis)
ChiadoChainSnapshotCfg = newCfg(Chiado) ChiadoChainSnapshotCfg = newCfg(Chiado)
@ -100,6 +102,7 @@ var KnownCfgs = map[string]*Cfg{
networkname.SepoliaChainName: SepoliaChainSnapshotCfg, networkname.SepoliaChainName: SepoliaChainSnapshotCfg,
networkname.GoerliChainName: GoerliChainSnapshotCfg, networkname.GoerliChainName: GoerliChainSnapshotCfg,
networkname.MumbaiChainName: MumbaiChainSnapshotCfg, networkname.MumbaiChainName: MumbaiChainSnapshotCfg,
networkname.AmoyChainName: AmoyChainSnapshotCfg,
networkname.BorMainnetChainName: BorMainnetChainSnapshotCfg, networkname.BorMainnetChainName: BorMainnetChainSnapshotCfg,
networkname.GnosisChainName: GnosisChainSnapshotCfg, networkname.GnosisChainName: GnosisChainSnapshotCfg,
networkname.ChiadoChainName: ChiadoChainSnapshotCfg, networkname.ChiadoChainName: ChiadoChainSnapshotCfg,
@ -138,6 +141,7 @@ var KnownWebseeds = map[string][]string{
networkname.SepoliaChainName: webseedsParse(webseed.Sepolia), networkname.SepoliaChainName: webseedsParse(webseed.Sepolia),
networkname.GoerliChainName: webseedsParse(webseed.Goerli), networkname.GoerliChainName: webseedsParse(webseed.Goerli),
networkname.MumbaiChainName: webseedsParse(webseed.Mumbai), networkname.MumbaiChainName: webseedsParse(webseed.Mumbai),
networkname.AmoyChainName: webseedsParse(webseed.Amoy),
networkname.BorMainnetChainName: webseedsParse(webseed.BorMainnet), networkname.BorMainnetChainName: webseedsParse(webseed.BorMainnet),
networkname.GnosisChainName: webseedsParse(webseed.Gnosis), networkname.GnosisChainName: webseedsParse(webseed.Gnosis),
networkname.ChiadoChainName: webseedsParse(webseed.Chiado), networkname.ChiadoChainName: webseedsParse(webseed.Chiado),

View File

@ -281,6 +281,7 @@ var ChainsWithSnapshots = map[string]struct{}{
networkname.SepoliaChainName: {}, networkname.SepoliaChainName: {},
networkname.GoerliChainName: {}, networkname.GoerliChainName: {},
networkname.MumbaiChainName: {}, networkname.MumbaiChainName: {},
networkname.AmoyChainName: {},
networkname.BorMainnetChainName: {}, networkname.BorMainnetChainName: {},
networkname.GnosisChainName: {}, networkname.GnosisChainName: {},
networkname.ChiadoChainName: {}, networkname.ChiadoChainName: {},

View File

@ -109,6 +109,8 @@ var V5Bootnodes = []string{
"enr:-Ku4QEWzdnVtXc2Q0ZVigfCGggOVB2Vc1ZCPEc6j21NIFLODSJbvNaef1g4PxhPwl_3kax86YPheFUSLXPRs98vvYsoBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpC1MD8qAAAAAP__________gmlkgnY0gmlwhDZBrP2Jc2VjcDI1NmsxoQM6jr8Rb1ktLEsVcKAPa08wCsKUmvoQ8khiOl_SLozf9IN1ZHCCIyg", "enr:-Ku4QEWzdnVtXc2Q0ZVigfCGggOVB2Vc1ZCPEc6j21NIFLODSJbvNaef1g4PxhPwl_3kax86YPheFUSLXPRs98vvYsoBh2F0dG5ldHOIAAAAAAAAAACEZXRoMpC1MD8qAAAAAP__________gmlkgnY0gmlwhDZBrP2Jc2VjcDI1NmsxoQM6jr8Rb1ktLEsVcKAPa08wCsKUmvoQ8khiOl_SLozf9IN1ZHCCIyg",
} }
var AmoyBootnodes = []string{} // Todo: Add BorAmoy bootnodes
var BorMainnetBootnodes = []string{ var BorMainnetBootnodes = []string{
"enode://b8f1cc9c5d4403703fbf377116469667d2b1823c0daf16b7250aa576bacf399e42c3930ccfcb02c5df6879565a2b8931335565f0e8d3f8e72385ecf4a4bf160a@3.36.224.80:30303", "enode://b8f1cc9c5d4403703fbf377116469667d2b1823c0daf16b7250aa576bacf399e42c3930ccfcb02c5df6879565a2b8931335565f0e8d3f8e72385ecf4a4bf160a@3.36.224.80:30303",
"enode://8729e0c825f3d9cad382555f3e46dcff21af323e89025a0e6312df541f4a9e73abfa562d64906f5e59c51fe6f0501b3e61b07979606c56329c020ed739910759@54.194.245.5:30303", "enode://8729e0c825f3d9cad382555f3e46dcff21af323e89025a0e6312df541f4a9e73abfa562d64906f5e59c51fe6f0501b3e61b07979606c56329c020ed739910759@54.194.245.5:30303",
@ -172,6 +174,8 @@ func BootnodeURLsOfChain(chain string) []string {
return GoerliBootnodes return GoerliBootnodes
case networkname.MumbaiChainName: case networkname.MumbaiChainName:
return MumbaiBootnodes return MumbaiBootnodes
case networkname.AmoyChainName:
return AmoyBootnodes
case networkname.BorMainnetChainName: case networkname.BorMainnetChainName:
return BorMainnetBootnodes return BorMainnetBootnodes
case networkname.GnosisChainName: case networkname.GnosisChainName:

View File

@ -0,0 +1,44 @@
{
"ChainName": "amoy",
"chainId": 80002,
"consensus": "bor",
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"muirGlacierBlock": 0,
"berlinBlock": 0,
"londonBlock": 73100,
"burntContract": {
"0": "0x000000000000000000000000000000000000dead",
"73100": "0xeCDD77cE6f146cCf5dab707941d318Bd50eeD2C9"
},
"bor": {
"period": {
"0": 2
},
"producerDelay": {
"0": 4
},
"sprint": {
"0": 16
},
"backupMultiplier": {
"0": 2
},
"stateSyncConfirmationDelay": {
"0": 128
},
"validatorContract": "0x0000000000000000000000000000000000001000",
"stateReceiverContract": "0x0000000000000000000000000000000000001001",
"overrideStateSyncRecords": null,
"jaipurBlock": 73100,
"delhiBlock": 73100,
"indoreBlock": 73100,
"agraBlock": 73100
}
}

View File

@ -55,6 +55,7 @@ var (
SepoliaGenesisHash = libcommon.HexToHash("0x25a5cc106eea7138acab33231d7160d69cb777ee0c2c553fcddf5138993e6dd9") SepoliaGenesisHash = libcommon.HexToHash("0x25a5cc106eea7138acab33231d7160d69cb777ee0c2c553fcddf5138993e6dd9")
GoerliGenesisHash = libcommon.HexToHash("0xbf7e331f7f7c1dd2e05159666b3bf8bc7a8a3a9eb1d518969eab529dd9b88c1a") GoerliGenesisHash = libcommon.HexToHash("0xbf7e331f7f7c1dd2e05159666b3bf8bc7a8a3a9eb1d518969eab529dd9b88c1a")
MumbaiGenesisHash = libcommon.HexToHash("0x7b66506a9ebdbf30d32b43c5f15a3b1216269a1ec3a75aa3182b86176a2b1ca7") MumbaiGenesisHash = libcommon.HexToHash("0x7b66506a9ebdbf30d32b43c5f15a3b1216269a1ec3a75aa3182b86176a2b1ca7")
AmoyGenesisHash = libcommon.HexToHash("0x7202b2b53c5a0836e773e319d18922cc756dd67432f9a1f65352b61f4406c697")
BorMainnetGenesisHash = libcommon.HexToHash("0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b") BorMainnetGenesisHash = libcommon.HexToHash("0xa9c28ce2141b56c474f1dc504bee9b01eb1bd7d1a507580d5519d4437a97de1b")
BorDevnetGenesisHash = libcommon.HexToHash("0x5a06b25b0c6530708ea0b98a3409290e39dce6be7f558493aeb6e4b99a172a87") BorDevnetGenesisHash = libcommon.HexToHash("0x5a06b25b0c6530708ea0b98a3409290e39dce6be7f558493aeb6e4b99a172a87")
GnosisGenesisHash = libcommon.HexToHash("0x4f1dd23188aab3a76b463e4af801b52b1248ef073c648cbdc4c9333d3da79756") GnosisGenesisHash = libcommon.HexToHash("0x4f1dd23188aab3a76b463e4af801b52b1248ef073c648cbdc4c9333d3da79756")
@ -123,6 +124,8 @@ var (
MumbaiChainConfig = readChainSpec("chainspecs/mumbai.json") MumbaiChainConfig = readChainSpec("chainspecs/mumbai.json")
AmoyChainConfig = readChainSpec("chainspecs/amoy.json")
BorMainnetChainConfig = readChainSpec("chainspecs/bor-mainnet.json") BorMainnetChainConfig = readChainSpec("chainspecs/bor-mainnet.json")
BorDevnetChainConfig = readChainSpec("chainspecs/bor-devnet.json") BorDevnetChainConfig = readChainSpec("chainspecs/bor-devnet.json")
@ -205,6 +208,8 @@ func ChainConfigByChainName(chain string) *chain.Config {
return GoerliChainConfig return GoerliChainConfig
case networkname.MumbaiChainName: case networkname.MumbaiChainName:
return MumbaiChainConfig return MumbaiChainConfig
case networkname.AmoyChainName:
return AmoyChainConfig
case networkname.BorMainnetChainName: case networkname.BorMainnetChainName:
return BorMainnetChainConfig return BorMainnetChainConfig
case networkname.BorDevnetChainName: case networkname.BorDevnetChainName:
@ -230,6 +235,8 @@ func GenesisHashByChainName(chain string) *libcommon.Hash {
return &GoerliGenesisHash return &GoerliGenesisHash
case networkname.MumbaiChainName: case networkname.MumbaiChainName:
return &MumbaiGenesisHash return &MumbaiGenesisHash
case networkname.AmoyChainName:
return &AmoyGenesisHash
case networkname.BorMainnetChainName: case networkname.BorMainnetChainName:
return &BorMainnetGenesisHash return &BorMainnetGenesisHash
case networkname.BorDevnetChainName: case networkname.BorDevnetChainName:
@ -255,6 +262,8 @@ func ChainConfigByGenesisHash(genesisHash libcommon.Hash) *chain.Config {
return GoerliChainConfig return GoerliChainConfig
case genesisHash == MumbaiGenesisHash: case genesisHash == MumbaiGenesisHash:
return MumbaiChainConfig return MumbaiChainConfig
case genesisHash == AmoyGenesisHash:
return AmoyChainConfig
case genesisHash == BorMainnetGenesisHash: case genesisHash == BorMainnetGenesisHash:
return BorMainnetChainConfig return BorMainnetChainConfig
case genesisHash == BorDevnetGenesisHash: case genesisHash == BorDevnetGenesisHash:

View File

@ -132,4 +132,9 @@ func TestGetBurntContract(t *testing.T) {
addr = MumbaiChainConfig.GetBurntContract(41874000 + 1) addr = MumbaiChainConfig.GetBurntContract(41874000 + 1)
require.NotNil(t, addr) require.NotNil(t, addr)
assert.Equal(t, common.HexToAddress("0x617b94CCCC2511808A3C9478ebb96f455CF167aA"), *addr) assert.Equal(t, common.HexToAddress("0x617b94CCCC2511808A3C9478ebb96f455CF167aA"), *addr)
// Amoy
addr = AmoyChainConfig.GetBurntContract(0)
require.NotNil(t, addr)
assert.Equal(t, common.HexToAddress("0x000000000000000000000000000000000000dead"), *addr)
} }

View File

@ -78,6 +78,8 @@ func NewNodConfigUrfave(ctx *cli.Context, logger log.Logger) *nodecfg.Config {
logger.Info("Starting Erigon in ephemeral dev mode...") logger.Info("Starting Erigon in ephemeral dev mode...")
case networkname.MumbaiChainName: case networkname.MumbaiChainName:
logger.Info("Starting Erigon on Mumbai testnet...") logger.Info("Starting Erigon on Mumbai testnet...")
case networkname.AmoyChainName:
logger.Info("Starting Erigon on Amoy testnet...")
case networkname.BorMainnetChainName: case networkname.BorMainnetChainName:
logger.Info("Starting Erigon on Bor Mainnet...") logger.Info("Starting Erigon on Bor Mainnet...")
case networkname.BorDevnetChainName: case networkname.BorDevnetChainName:

View File

@ -103,6 +103,36 @@ func TestSetupGenesis(t *testing.T) {
wantHash: params.SepoliaGenesisHash, wantHash: params.SepoliaGenesisHash,
wantConfig: params.SepoliaChainConfig, wantConfig: params.SepoliaChainConfig,
}, },
{
name: "custom block in DB, genesis == bor-mainnet",
fn: func(db kv.RwDB) (*chain.Config, *types.Block, error) {
core.MustCommitGenesis(&customg, db, tmpdir)
return core.CommitGenesisBlock(db, core.BorMainnetGenesisBlock(), tmpdir, logger)
},
wantErr: &types.GenesisMismatchError{Stored: customghash, New: params.BorMainnetGenesisHash},
wantHash: params.BorMainnetGenesisHash,
wantConfig: params.BorMainnetChainConfig,
},
{
name: "custom block in DB, genesis == mumbai",
fn: func(db kv.RwDB) (*chain.Config, *types.Block, error) {
core.MustCommitGenesis(&customg, db, tmpdir)
return core.CommitGenesisBlock(db, core.MumbaiGenesisBlock(), tmpdir, logger)
},
wantErr: &types.GenesisMismatchError{Stored: customghash, New: params.MumbaiGenesisHash},
wantHash: params.MumbaiGenesisHash,
wantConfig: params.MumbaiChainConfig,
},
{
name: "custom block in DB, genesis == amoy",
fn: func(db kv.RwDB) (*chain.Config, *types.Block, error) {
core.MustCommitGenesis(&customg, db, tmpdir)
return core.CommitGenesisBlock(db, core.AmoyGenesisBlock(), tmpdir, logger)
},
wantErr: &types.GenesisMismatchError{Stored: customghash, New: params.AmoyGenesisHash},
wantHash: params.AmoyGenesisHash,
wantConfig: params.AmoyChainConfig,
},
{ {
name: "compatible config in DB", name: "compatible config in DB",
fn: func(db kv.RwDB) (*chain.Config, *types.Block, error) { fn: func(db kv.RwDB) (*chain.Config, *types.Block, error) {