From 075f21a46b06cbc67e1675f2144e0a3046a60299 Mon Sep 17 00:00:00 2001 From: kayan Date: Wed, 3 Jul 2024 18:44:43 +0800 Subject: [PATCH 1/4] support any chain_id --- silkworm/core/chain/config.cpp | 23 ++-- silkworm/core/chain/config.hpp | 185 +++++++++++++++------------------ 2 files changed, 97 insertions(+), 111 deletions(-) diff --git a/silkworm/core/chain/config.cpp b/silkworm/core/chain/config.cpp index d82fbb2d..1a68f8ec 100644 --- a/silkworm/core/chain/config.cpp +++ b/silkworm/core/chain/config.cpp @@ -26,14 +26,10 @@ namespace silkworm { -static const std::vector> kKnownChainConfigs{ - {"mainnet", &kMainnetConfig}, - {"goerli", &kGoerliConfig}, - {"sepolia", &kSepoliaConfig}, - {"eosevm-mainnet", &kEOSEVMMainnetConfig}, - {"eosevm-oldtestnet", &kEOSEVMOldTestnetConfig}, - {"eosevm-testnet", &kEOSEVMTestnetConfig}, - {"eosevm-localtestnet", &kEOSEVMLocalTestnetConfig} +static std::vector> kKnownChainConfigs{ + {"mainnet", new ChainConfig(get_kMainnetConfig())}, + {"goerli", new ChainConfig(get_kGoerliConfig())}, + {"sepolia", new ChainConfig(get_kSepoliaConfig())}, }; constexpr const char* kTerminalTotalDifficulty{"terminalTotalDifficulty"}; @@ -265,7 +261,16 @@ std::optional> lookup_known_cha })}; if (it == kKnownChainConfigs.end()) { - return std::nullopt; + ChainConfig *_config = new ChainConfig(get_kEOSEVMConfigTemplate(chain_id)); + kKnownChainConfigs.emplace_back("eosevm", _config); + auto it2{ + as_range::find_if(kKnownChainConfigs, [&chain_id](const std::pair& x) -> bool { + return x.second->chain_id == chain_id; + })}; + if (it2 == kKnownChainConfigs.end()) // should not happen + return std::nullopt; + else + return std::make_pair(it2->first, it2->second); } return std::make_pair(it->first, it->second); } diff --git a/silkworm/core/chain/config.hpp b/silkworm/core/chain/config.hpp index 1a0f3f60..b50ab6c8 100644 --- a/silkworm/core/chain/config.hpp +++ b/silkworm/core/chain/config.hpp @@ -213,114 +213,95 @@ struct ChainConfig { std::ostream& operator<<(std::ostream& out, const ChainConfig& obj); -inline constexpr ChainConfig kEOSEVMMainnetConfig{ - .chain_id = 17777, - .protocol_rule_set = protocol::RuleSetType::kTrust, - ._homestead_block = 0, - ._dao_block = 0, - ._tangerine_whistle_block = 0, - ._spurious_dragon_block = 0, - ._byzantium_block = 0, - ._constantinople_block = 0, - ._petersburg_block = 0, - ._istanbul_block = 0, -}; - -inline constexpr ChainConfig kEOSEVMOldTestnetConfig{ - .chain_id = 15555, - .protocol_rule_set = protocol::RuleSetType::kTrust, - ._homestead_block = 0, - ._dao_block = 0, - ._tangerine_whistle_block = 0, - ._spurious_dragon_block = 0, - ._byzantium_block = 0, - ._constantinople_block = 0, - ._petersburg_block = 0, - ._istanbul_block = 0, -}; - -inline constexpr ChainConfig kEOSEVMTestnetConfig{ - .chain_id = 15557, - .protocol_rule_set = protocol::RuleSetType::kTrust, - ._homestead_block = 0, - ._dao_block = 0, - ._tangerine_whistle_block = 0, - ._spurious_dragon_block = 0, - ._byzantium_block = 0, - ._constantinople_block = 0, - ._petersburg_block = 0, - ._istanbul_block = 0, -}; - -inline constexpr ChainConfig kEOSEVMLocalTestnetConfig{ - .chain_id = 25555, - .protocol_rule_set = protocol::RuleSetType::kTrust, - ._homestead_block = 0, - ._dao_block = 0, - ._tangerine_whistle_block = 0, - ._spurious_dragon_block = 0, - ._byzantium_block = 0, - ._constantinople_block = 0, - ._petersburg_block = 0, - ._istanbul_block = 0, -}; +inline constexpr ChainConfig get_kEOSEVMConfigTemplate(uint64_t _chain_id) { + return ChainConfig{ + .chain_id = _chain_id, + .protocol_rule_set = protocol::RuleSetType::kTrust, + ._homestead_block = 0, + ._dao_block = 0, + ._tangerine_whistle_block = 0, + ._spurious_dragon_block = 0, + ._byzantium_block = 0, + ._constantinople_block = 0, + ._petersburg_block = 0, + ._istanbul_block = 0, + }; +} +#if not defined(ANTELOPE) +inline constexpr ChainConfig kEOSEVMMainnetConfig = get_kEOSEVMConfigTemplate(17777); +#endif inline constexpr evmc::bytes32 kMainnetGenesisHash{0xd4e56740f876aef8c010b86a40d5f56745a118d0906a34e69aec8c0db1cb8fa3_bytes32}; -inline constexpr ChainConfig kMainnetConfig{ - .chain_id = 1, - .protocol_rule_set = protocol::RuleSetType::kEthash, - ._homestead_block = 1'150'000, - ._dao_block = 1'920'000, - ._tangerine_whistle_block = 2'463'000, - ._spurious_dragon_block = 2'675'000, - ._byzantium_block = 4'370'000, - ._constantinople_block = 7'280'000, - ._petersburg_block = 7'280'000, - ._istanbul_block = 9'069'000, - ._muir_glacier_block = 9'200'000, - ._berlin_block = 12'244'000, - ._london_block = 12'965'000, - ._arrow_glacier_block = 13'773'000, - ._gray_glacier_block = 15'050'000, - ._terminal_total_difficulty = intx::from_string("58750000000000000000000"), - ._shanghai_time = 1681338455, -}; +inline constexpr ChainConfig get_kMainnetConfig() { + return ChainConfig{ + .chain_id = 1, + .protocol_rule_set = protocol::RuleSetType::kEthash, + ._homestead_block = 1'150'000, + ._dao_block = 1'920'000, + ._tangerine_whistle_block = 2'463'000, + ._spurious_dragon_block = 2'675'000, + ._byzantium_block = 4'370'000, + ._constantinople_block = 7'280'000, + ._petersburg_block = 7'280'000, + ._istanbul_block = 9'069'000, + ._muir_glacier_block = 9'200'000, + ._berlin_block = 12'244'000, + ._london_block = 12'965'000, + ._arrow_glacier_block = 13'773'000, + ._gray_glacier_block = 15'050'000, + ._terminal_total_difficulty = intx::from_string("58750000000000000000000"), + ._shanghai_time = 1681338455, + }; +} +#if not defined(ANTELOPE) +inline constexpr ChainConfig kMainnetConfig = get_kMainnetConfig(); +#endif inline constexpr evmc::bytes32 kGoerliGenesisHash{0xbf7e331f7f7c1dd2e05159666b3bf8bc7a8a3a9eb1d518969eab529dd9b88c1a_bytes32}; -inline constexpr ChainConfig kGoerliConfig{ - .chain_id = 5, - .protocol_rule_set = protocol::RuleSetType::kClique, - ._homestead_block = 0, - ._tangerine_whistle_block = 0, - ._spurious_dragon_block = 0, - ._byzantium_block = 0, - ._constantinople_block = 0, - ._petersburg_block = 0, - ._istanbul_block = 1'561'651, - ._berlin_block = 4'460'644, - ._london_block = 5'062'605, - ._terminal_total_difficulty = 10790000, - ._shanghai_time = 1678832736, -}; +inline constexpr ChainConfig get_kGoerliConfig() { + return ChainConfig { + .chain_id = 5, + .protocol_rule_set = protocol::RuleSetType::kClique, + ._homestead_block = 0, + ._tangerine_whistle_block = 0, + ._spurious_dragon_block = 0, + ._byzantium_block = 0, + ._constantinople_block = 0, + ._petersburg_block = 0, + ._istanbul_block = 1'561'651, + ._berlin_block = 4'460'644, + ._london_block = 5'062'605, + ._terminal_total_difficulty = 10790000, + ._shanghai_time = 1678832736 + }; +} +#if not defined(ANTELOPE) +inline constexpr ChainConfig kGoerliConfig = get_kGoerliConfig(); +#endif inline constexpr evmc::bytes32 kSepoliaGenesisHash{0x25a5cc106eea7138acab33231d7160d69cb777ee0c2c553fcddf5138993e6dd9_bytes32}; -inline constexpr ChainConfig kSepoliaConfig{ - .chain_id = 11155111, - .protocol_rule_set = protocol::RuleSetType::kEthash, - ._homestead_block = 0, - ._tangerine_whistle_block = 0, - ._spurious_dragon_block = 0, - ._byzantium_block = 0, - ._constantinople_block = 0, - ._petersburg_block = 0, - ._istanbul_block = 0, - ._muir_glacier_block = 0, - ._berlin_block = 0, - ._london_block = 0, - ._terminal_total_difficulty = 17000000000000000, - ._merge_netsplit_block = 1'735'371, - ._shanghai_time = 1677557088, -}; +inline constexpr ChainConfig get_kSepoliaConfig() { + return ChainConfig{ + .chain_id = 11155111, + .protocol_rule_set = protocol::RuleSetType::kEthash, + ._homestead_block = 0, + ._tangerine_whistle_block = 0, + ._spurious_dragon_block = 0, + ._byzantium_block = 0, + ._constantinople_block = 0, + ._petersburg_block = 0, + ._istanbul_block = 0, + ._muir_glacier_block = 0, + ._berlin_block = 0, + ._london_block = 0, + ._terminal_total_difficulty = 17000000000000000, + ._merge_netsplit_block = 1'735'371, + ._shanghai_time = 1677557088 + }; +} +#if not defined(ANTELOPE) +inline constexpr ChainConfig kSepoliaConfig = get_kSepoliaConfig(); +#endif //! \brief Looks up a known chain config provided its chain ID std::optional> lookup_known_chain(uint64_t chain_id) noexcept; From f54cfffa27db54eb00c9050826790d834c321982 Mon Sep 17 00:00:00 2001 From: kayan Date: Wed, 3 Jul 2024 23:47:27 +0800 Subject: [PATCH 2/4] chain id lookup --- silkworm/core/chain/config.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/silkworm/core/chain/config.cpp b/silkworm/core/chain/config.cpp index 1a68f8ec..d1260c32 100644 --- a/silkworm/core/chain/config.cpp +++ b/silkworm/core/chain/config.cpp @@ -261,6 +261,8 @@ std::optional> lookup_known_cha })}; if (it == kKnownChainConfigs.end()) { + if (chain_id == 0) return std::nullopt; + ChainConfig *_config = new ChainConfig(get_kEOSEVMConfigTemplate(chain_id)); kKnownChainConfigs.emplace_back("eosevm", _config); auto it2{ From d6220b5de60eb46b612e1b89c62661b6585870d1 Mon Sep 17 00:00:00 2001 From: kayan Date: Thu, 4 Jul 2024 10:04:15 +0800 Subject: [PATCH 3/4] fix test case --- silkworm/core/chain/config.cpp | 8 +++++++- silkworm/core/chain/config_test.cpp | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/silkworm/core/chain/config.cpp b/silkworm/core/chain/config.cpp index d1260c32..b6beee88 100644 --- a/silkworm/core/chain/config.cpp +++ b/silkworm/core/chain/config.cpp @@ -27,9 +27,15 @@ namespace silkworm { static std::vector> kKnownChainConfigs{ +#if defined(ANTELOPE) {"mainnet", new ChainConfig(get_kMainnetConfig())}, {"goerli", new ChainConfig(get_kGoerliConfig())}, - {"sepolia", new ChainConfig(get_kSepoliaConfig())}, + {"sepolia", new ChainConfig(get_kSepoliaConfig())} +#else + {"mainnet", &kMainnetConfig}, + {"goerli", &kGoerliConfig}, + {"sepolia", &kSepoliaConfig} +#endif }; constexpr const char* kTerminalTotalDifficulty{"terminalTotalDifficulty"}; diff --git a/silkworm/core/chain/config_test.cpp b/silkworm/core/chain/config_test.cpp index 5ff3b916..f0cad657 100644 --- a/silkworm/core/chain/config_test.cpp +++ b/silkworm/core/chain/config_test.cpp @@ -30,7 +30,7 @@ TEST_CASE("Config lookup") { CHECK(lookup_known_chain(0u).has_value() == false); CHECK(lookup_known_chain(1u)->second == &kMainnetConfig); CHECK(lookup_known_chain(kSepoliaConfig.chain_id)->second == &kSepoliaConfig); - CHECK(lookup_known_chain(12345u).has_value() == false); +// CHECK(lookup_known_chain(12345u).has_value() == false); CHECK(lookup_known_chain("mainnet")->second == &kMainnetConfig); CHECK(lookup_known_chain("goErli")->second == &kGoerliConfig); CHECK(lookup_known_chain("Sepolia")->second == &kSepoliaConfig); From 13cd90a6b7a2c4ff539ecdbf2ffe3b74b7287bd2 Mon Sep 17 00:00:00 2001 From: Kayan <37097018+taokayan@users.noreply.github.com> Date: Fri, 5 Jul 2024 12:28:48 +0800 Subject: [PATCH 4/4] Update config.cpp --- silkworm/core/chain/config.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/silkworm/core/chain/config.cpp b/silkworm/core/chain/config.cpp index b6beee88..2feba2b3 100644 --- a/silkworm/core/chain/config.cpp +++ b/silkworm/core/chain/config.cpp @@ -27,11 +27,7 @@ namespace silkworm { static std::vector> kKnownChainConfigs{ -#if defined(ANTELOPE) - {"mainnet", new ChainConfig(get_kMainnetConfig())}, - {"goerli", new ChainConfig(get_kGoerliConfig())}, - {"sepolia", new ChainConfig(get_kSepoliaConfig())} -#else +#if not defined(ANTELOPE) {"mainnet", &kMainnetConfig}, {"goerli", &kGoerliConfig}, {"sepolia", &kSepoliaConfig}