diff --git a/config.yaml.example b/config.yaml.example index 7f60f17..14b6d17 100644 --- a/config.yaml.example +++ b/config.yaml.example @@ -19,6 +19,8 @@ blockchain: api_url: 'http://127.0.0.1:8546' explorer_url: null signing_key: 'ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80' + chain_sync_step: 100 + chain_reorg_max_depth: 0 ipfs_api_url: 'http://127.0.0.1:5001' ipfs_gateway_url: 'http://127.0.0.1:8001' diff --git a/contrib/mitra_config.yaml b/contrib/mitra_config.yaml index fb35bf1..c9d7e91 100644 --- a/contrib/mitra_config.yaml +++ b/contrib/mitra_config.yaml @@ -36,6 +36,8 @@ registrations_open: false # api_url: 'http://127.0.0.1:8545' # explorer_url: null # signing_key: null +# chain_sync_step: 1000 +# chain_reorg_max_depth: 10 # IPFS integration #ipfs_api_url: 'http://127.0.0.1:5001' diff --git a/src/config.rs b/src/config.rs index e6dac98..95faecc 100644 --- a/src/config.rs +++ b/src/config.rs @@ -74,11 +74,9 @@ fn parse_env() -> EnvConfig { } } -fn default_log_level() -> LogLevel { LogLevel::Info } +fn default_chain_sync_step() -> u64 { 1000 } -fn default_login_message() -> String { "Do not sign this message on other sites!".to_string() } - -fn default_post_character_limit() -> usize { 2000 } +fn default_chain_reorg_max_depth() -> u64 { 10 } #[derive(Clone, Deserialize)] pub struct BlockchainConfig { @@ -93,6 +91,11 @@ pub struct BlockchainConfig { pub explorer_url: Option, // Instance private key pub signing_key: String, + + #[serde(default = "default_chain_sync_step")] + pub chain_sync_step: u64, + #[serde(default = "default_chain_reorg_max_depth")] + pub chain_reorg_max_depth: u64, } impl BlockchainConfig { @@ -105,6 +108,12 @@ impl BlockchainConfig { } } +fn default_log_level() -> LogLevel { LogLevel::Info } + +fn default_login_message() -> String { "Do not sign this message on other sites!".to_string() } + +fn default_post_character_limit() -> usize { 2000 } + #[derive(Clone, Deserialize)] pub struct Config { #[serde(skip)] diff --git a/src/ethereum/contracts.rs b/src/ethereum/contracts.rs index 54c8864..afdd414 100644 --- a/src/ethereum/contracts.rs +++ b/src/ethereum/contracts.rs @@ -175,10 +175,11 @@ pub async fn get_contracts( }; let current_block = get_current_block_number(&web3, storage_dir).await?; - log::info!("current block is {}", current_block); let sync_state = SyncState::new( current_block, sync_targets, + config.chain_sync_step, + config.chain_reorg_max_depth, storage_dir, ); diff --git a/src/ethereum/nft.rs b/src/ethereum/nft.rs index e8291f6..0eb1469 100644 --- a/src/ethereum/nft.rs +++ b/src/ethereum/nft.rs @@ -23,7 +23,7 @@ use crate::models::posts::queries::{ }; use super::errors::EthereumError; use super::signatures::{sign_contract_call, CallArgs, SignatureData}; -use super::sync::{save_current_block_number, SyncState}; +use super::sync::SyncState; use super::utils::parse_address; const TOKEN_WAIT_TIME: i64 = 10; // in minutes @@ -123,9 +123,7 @@ pub async fn process_nft_events( }; }; - if sync_state.update(&contract.address(), to_block) { - save_current_block_number(&sync_state.storage_dir, sync_state.current_block)?; - }; + sync_state.update(&contract.address(), to_block)?; Ok(()) } diff --git a/src/ethereum/subscriptions.rs b/src/ethereum/subscriptions.rs index 80c64a2..ee5fe75 100644 --- a/src/ethereum/subscriptions.rs +++ b/src/ethereum/subscriptions.rs @@ -45,7 +45,7 @@ use super::signatures::{ CallArgs, SignatureData, }; -use super::sync::{save_current_block_number, SyncState}; +use super::sync::SyncState; use super::utils::{address_to_string, parse_address}; const ETHEREUM: Currency = Currency::Ethereum; @@ -240,9 +240,7 @@ pub async fn check_subscriptions( }; }; - if sync_state.update(&contract.address(), to_block) { - save_current_block_number(&sync_state.storage_dir, sync_state.current_block)?; - }; + sync_state.update(&contract.address(), to_block)?; Ok(()) } diff --git a/src/ethereum/sync.rs b/src/ethereum/sync.rs index a156b44..65a99e4 100644 --- a/src/ethereum/sync.rs +++ b/src/ethereum/sync.rs @@ -7,8 +7,6 @@ use crate::utils::files::write_file; use super::errors::EthereumError; const BLOCK_NUMBER_FILE_NAME: &str = "current_block"; -const CHAIN_REORG_MAX_DEPTH: u64 = 100; -const CHAIN_SYNC_STEP: u64 = 1000; pub fn save_current_block_number( storage_dir: &Path, @@ -56,16 +54,21 @@ pub async fn get_current_block_number( pub struct SyncState { pub current_block: u64, contracts: HashMap, + sync_step: u64, + reorg_max_depth: u64, - pub storage_dir: PathBuf, + storage_dir: PathBuf, } impl SyncState { pub fn new( current_block: u64, contracts: Vec
, + sync_step: u64, + reorg_max_depth: u64, storage_dir: &Path, ) -> Self { + log::info!("current block is {}", current_block); let mut contract_map = HashMap::new(); for address in contracts { contract_map.insert(address, current_block); @@ -73,6 +76,8 @@ impl SyncState { Self { current_block, contracts: contract_map, + sync_step, + reorg_max_depth, storage_dir: storage_dir.to_path_buf(), } } @@ -80,8 +85,8 @@ impl SyncState { pub fn get_scan_range(&self, contract_address: &Address) -> (u64, u64) { let current_block = self.contracts[contract_address]; // Take reorgs into account - let safe_current_block = current_block.saturating_sub(CHAIN_REORG_MAX_DEPTH); - (safe_current_block, safe_current_block + CHAIN_SYNC_STEP) + let safe_current_block = current_block.saturating_sub(self.reorg_max_depth); + (safe_current_block, safe_current_block + self.sync_step) } pub fn is_out_of_sync(&self, contract_address: &Address) -> bool { @@ -97,15 +102,15 @@ impl SyncState { &mut self, contract_address: &Address, block_number: u64, - ) -> bool { + ) -> Result<(), EthereumError> { self.contracts.insert(*contract_address, block_number); if let Some(min_value) = self.contracts.values().min().copied() { if min_value > self.current_block { self.current_block = min_value; + save_current_block_number(&self.storage_dir, self.current_block)?; log::info!("synced to block {}", self.current_block); - return true; }; }; - false + Ok(()) } }