Read blockchain sync step and max reorg depth from config

This commit is contained in:
silverpill 2022-07-16 22:44:15 +00:00
parent 672ff5f0ac
commit 3a28219405
7 changed files with 36 additions and 21 deletions

View file

@ -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'

View file

@ -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'

View file

@ -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<String>,
// 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)]

View file

@ -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,
);

View file

@ -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(())
}

View file

@ -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(())
}

View file

@ -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<Address, u64>,
sync_step: u64,
reorg_max_depth: u64,
pub storage_dir: PathBuf,
storage_dir: PathBuf,
}
impl SyncState {
pub fn new(
current_block: u64,
contracts: Vec<Address>,
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(())
}
}