diff --git a/src/main.rs b/src/main.rs index c399ab5e2bdd858462c08d34329eb31c8f67260a..d081a6307d837e0f3e7f88f3190bd2505cba39fc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -86,6 +86,8 @@ struct MineParams { rpc_url: Option<String>, // Chain ID chain_id: Option<u64>, + /// Desired VDF mean duration in seconds + desired_vdf_duration: Option<u64>, } async fn init() -> (u64, String) { @@ -217,8 +219,6 @@ async fn main() -> Result<(), anyhow::Error> { if params.chain_id.clone().is_some() { chain_id = params.chain_id.unwrap(); } - // println!("Processing {:?}", params.file); - // csv::Reader::from_path(path) let records = read_csv(csv::Reader::from_path(params.file.clone())?); if let Err(err) = records { error!("error running example: {}", err); @@ -444,13 +444,26 @@ async fn main() -> Result<(), anyhow::Error> { let miner_addr = wallet.address(); info!("Mining with 0x{:02x} ...", miner_addr); - let behavior = get_miner_behavior(wallet, chain_id, miner_addr); - // SEND IT let provider = Provider::<Http>::try_from(rpc_url.clone()).unwrap(); + let latest_block = provider.get_block(BlockNumber::Latest).await; + let network_difficulty = Some( + ethnum::U256::from_str(&latest_block.unwrap().unwrap().difficulty.to_string()) + .unwrap(), + ); + + let behavior = get_miner_behavior( + wallet, + chain_id, + miner_addr, + network_difficulty, + params.desired_vdf_duration, + ); + debug!( "Miner behavior: {:?}", serde_json::to_string(&behavior.clone()) ); + // SEND IT let block = provider .request::<[Behavior; 1], Block>("emc_mine", [behavior]) .await diff --git a/src/utils/miner.rs b/src/utils/miner.rs index 48d6eaa5c95ad06551b18164496fcf167f728759..4afe05246f9c91bc27f7a58df4e2dd93844dbc29 100644 --- a/src/utils/miner.rs +++ b/src/utils/miner.rs @@ -13,17 +13,40 @@ use ethers::{ use ethnum::U256; /// Get a RPC Behavior for miner with default values, ready to send. -pub fn get_miner_behavior(wallet: LocalWallet, chain_id: u64, to: Address) -> Behavior { +pub fn get_miner_behavior( + wallet: LocalWallet, + chain_id: u64, + to: Address, + network_difficulty: Option<U256>, + desired_vdf_duration: Option<u64>, +) -> Behavior { let now = SystemTime::now() .duration_since(SystemTime::UNIX_EPOCH) .unwrap() .as_secs(); + // const VDF_DIFFICULTY_FOR_10_MIN: u64 = 72; + // Mean VDF difficulty per sec = 72/600 on current machine (Macbook M1) and a hash maxed to 1 day. + // for a network difficulty of 1000000 + const MEAN_VDF_DIFFICULTY_PER_SEC: u64 = 12; + + let quantity = match network_difficulty { + Some(net_dif) => match desired_vdf_duration { + Some(vdf_dur) => net_dif + .saturating_mul(U256::from(MEAN_VDF_DIFFICULTY_PER_SEC * vdf_dur)) + .saturating_div(U256::from(1000000_u128)), + _ => net_dif + .saturating_mul(U256::from(MEAN_VDF_DIFFICULTY_PER_SEC * 60)) + .saturating_div(U256::from(1000000_u128)), + }, + // default 1 min + _ => U256::from(MEAN_VDF_DIFFICULTY_PER_SEC * 60), + }; let behavior_msg = BehaviorMessage{ chain_id: U64::from(chain_id), to:Some(to), timestamp: U64::from(now), - quantity: U256::from(210000_u64), + quantity, input: Bytes::from("0x015d8eb90000000000000000000000000000000000000000000000000000000000878c1c00000000000000000000000000000000000000000000000000000000644662bc0000000000000000000000000000000000000000000000000000001ee24fba17b7e19cc10812911dfa8a438e0a81a9933f843aa5b528899b8d9e221b649ae0df00000000000000000000000000000000000000000000000000000000000000060000000000000000000000007431310e026b69bfc676c0013e12a1a11411eec9000000000000000000000000000000000000000000000000000000000000083400000000000000000000000000000000000000000000000000000000000f4240") }; // let behavior = wallet.