From 6953a816a521b9b164b5a10a661cb6cd7acc689f Mon Sep 17 00:00:00 2001 From: James Hiew Date: Mon, 10 Oct 2022 16:44:17 +0100 Subject: [PATCH] Add Ethereum bridge chain parameters + refactor runtime config --- .../ledger.rs} | 5 +++-- apps/src/lib/config/ethereum_bridge/mod.rs | 2 ++ apps/src/lib/config/ethereum_bridge/params.rs | 22 +++++++++++++++++++ apps/src/lib/config/genesis.rs | 3 +++ apps/src/lib/config/mod.rs | 6 ++--- apps/src/lib/node/ledger/mod.rs | 19 +++++++++------- 6 files changed, 44 insertions(+), 13 deletions(-) rename apps/src/lib/config/{ethereum.rs => ethereum_bridge/ledger.rs} (92%) create mode 100644 apps/src/lib/config/ethereum_bridge/mod.rs create mode 100644 apps/src/lib/config/ethereum_bridge/params.rs diff --git a/apps/src/lib/config/ethereum.rs b/apps/src/lib/config/ethereum_bridge/ledger.rs similarity index 92% rename from apps/src/lib/config/ethereum.rs rename to apps/src/lib/config/ethereum_bridge/ledger.rs index d02df901840..6cdb7e17e84 100644 --- a/apps/src/lib/config/ethereum.rs +++ b/apps/src/lib/config/ethereum_bridge/ledger.rs @@ -1,4 +1,4 @@ -//! Configuration settings to do with the Ethereum bridge. +//! Runtime configuration for a validator node #[allow(unused_imports)] use namada::types::ethereum_events::EthereumEvent; use serde::{Deserialize, Serialize}; @@ -28,7 +28,8 @@ pub enum Mode { #[derive(Clone, Debug, Serialize, Deserialize)] pub struct Config { - /// The mode in which to run the Ethereum bridge + /// The mode in which to run the Ethereum node and oracle setup of this + /// validator pub mode: Mode, /// The Ethereum JSON-RPC endpoint that the Ethereum event oracle will use /// to listen for events from the Ethereum bridge smart contracts diff --git a/apps/src/lib/config/ethereum_bridge/mod.rs b/apps/src/lib/config/ethereum_bridge/mod.rs new file mode 100644 index 00000000000..ab72d58b42d --- /dev/null +++ b/apps/src/lib/config/ethereum_bridge/mod.rs @@ -0,0 +1,2 @@ +pub mod ledger; +pub mod params; diff --git a/apps/src/lib/config/ethereum_bridge/params.rs b/apps/src/lib/config/ethereum_bridge/params.rs new file mode 100644 index 00000000000..c36ed9773cb --- /dev/null +++ b/apps/src/lib/config/ethereum_bridge/params.rs @@ -0,0 +1,22 @@ +//! Blockchain-level parameters for the configuration of the Ethereum bridge. +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct Config { + /// Minimum number of confirmations needed to trust an Ethereum branch. + /// This must be at least one. + pub min_confirmations: u64, + /// The addresses of the Ethereum contracts that need to be directly known + /// by validators + pub contract_addresses: Addresses, +} + +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct Addresses { + /// The Ethereum address of the proxy contract e.g. + /// 0x6B175474E89094C44Da98b954EedeAC495271d0F + pub proxy: String, + /// The Ethereum address of the ERC20 contract that represents this chain's + /// native token e.g. 0x6B175474E89094C44Da98b954EedeAC495271d0F + pub native_erc20: String, +} diff --git a/apps/src/lib/config/genesis.rs b/apps/src/lib/config/genesis.rs index 5441ce524fc..debf2d9f9cb 100644 --- a/apps/src/lib/config/genesis.rs +++ b/apps/src/lib/config/genesis.rs @@ -44,6 +44,7 @@ pub mod genesis_config { EstablishedAccount, Genesis, ImplicitAccount, TokenAccount, Validator, }; use crate::cli; + use crate::config::ethereum_bridge; #[derive(Clone, Debug, Deserialize, Serialize)] pub struct HexString(pub String); @@ -121,6 +122,8 @@ pub mod genesis_config { pub gov_params: GovernanceParamsConfig, // Treasury parameters pub treasury_params: TreasuryParamasConfig, + // Ethereum bridge config + pub ethereum_bridge_params: Option, // Wasm definitions pub wasm: HashMap, } diff --git a/apps/src/lib/config/mod.rs b/apps/src/lib/config/mod.rs index 6d3797800e0..bd9484e141a 100644 --- a/apps/src/lib/config/mod.rs +++ b/apps/src/lib/config/mod.rs @@ -1,6 +1,6 @@ //! Node and client configuration -pub mod ethereum; +pub mod ethereum_bridge; pub mod genesis; pub mod global; pub mod utils; @@ -83,7 +83,7 @@ pub struct Ledger { pub chain_id: ChainId, pub shell: Shell, pub tendermint: Tendermint, - pub ethereum: ethereum::Config, + pub ethereum_bridge: ethereum_bridge::ledger::Config, } #[derive(Clone, Debug, Serialize, Deserialize)] @@ -197,7 +197,7 @@ impl Ledger { ), instrumentation_namespace: "anoman_tm".to_string(), }, - ethereum: ethereum::Config::default(), + ethereum_bridge: ethereum_bridge::ledger::Config::default(), } } diff --git a/apps/src/lib/node/ledger/mod.rs b/apps/src/lib/node/ledger/mod.rs index 80fc9ecdb07..32f89bda28b 100644 --- a/apps/src/lib/node/ledger/mod.rs +++ b/apps/src/lib/node/ledger/mod.rs @@ -29,7 +29,7 @@ use tower::ServiceBuilder; use self::abortable::AbortableSpawner; use self::shims::abcipp_shim::AbciService; use crate::config::utils::num_of_threads; -use crate::config::{ethereum, TendermintMode}; +use crate::config::{ethereum_bridge, TendermintMode}; use crate::facade::tendermint_proto::abci::CheckTxType; use crate::facade::tower_abci::{response, split, Server}; use crate::node::ledger::broadcaster::Broadcaster; @@ -623,11 +623,13 @@ async fn start_ethereum_node( return (eth_node, None, oracle); } - let ethereum_url = config.ethereum.oracle_rpc_endpoint.clone(); + let ethereum_url = config.ethereum_bridge.oracle_rpc_endpoint.clone(); // Boot up geth and wait for it to finish syncing - let start_managed_eth_node = - matches!(config.ethereum.mode, ethereum::Mode::Managed); + let start_managed_eth_node = matches!( + config.ethereum_bridge.mode, + ethereum_bridge::ledger::Mode::Managed + ); let (eth_node, abort_sender) = ethereum_node::start(ðereum_url, start_managed_eth_node) .await @@ -665,21 +667,22 @@ async fn start_ethereum_node( // Start the oracle for listening to Ethereum events let (eth_sender, eth_receiver) = mpsc::channel(ORACLE_CHANNEL_BUFFER_SIZE); - let oracle = match config.ethereum.mode { - ethereum::Mode::Managed | ethereum::Mode::Remote => { + let oracle = match config.ethereum_bridge.mode { + ethereum_bridge::ledger::Mode::Managed + | ethereum_bridge::ledger::Mode::Remote => { ethereum_node::oracle::run_oracle( ethereum_url, eth_sender, abort_sender, ) } - ethereum::Mode::EventsEndpoint => { + ethereum_bridge::ledger::Mode::EventsEndpoint => { ethereum_node::test_tools::events_endpoint::serve( eth_sender, abort_sender, ) } - ethereum::Mode::Off => { + ethereum_bridge::ledger::Mode::Off => { ethereum_node::test_tools::mock_oracle::run_oracle( ethereum_url, eth_sender,