diff --git a/README.md b/README.md index 79328b3a39a52503e47a7a4ed55cb370a5060e44..46fcbc702283736cf65a59b9f2564cc716976df3 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,9 @@ Options: - (optional) `rpc_url` Node RPC url e.g. http://127.0.0.1:8545 - (optional) `chain_id` Chain id e.g. 636363 +- (optional) `desired_vdf_duration` Desired VDF duration = mining duration e.g. 60secs + +Example: `cargo run mine http://127.0.0.1:8545' 636363 60` ## Env vars diff --git a/src/main.rs b/src/main.rs index 4a7478d3add1ef14dc6bef2d268841f516cc46df..ccfe39dad5862cce133bd5b815a0317a9e273526 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) { @@ -218,8 +220,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); @@ -445,13 +445,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. diff --git a/src/utils/mobility_data.rs b/src/utils/mobility_data.rs index 6334d0dbe0273d3118ec4feeadd2685fc894f842..051c0b5c6226fb31afa36e7c37a1e48739117bbd 100644 --- a/src/utils/mobility_data.rs +++ b/src/utils/mobility_data.rs @@ -125,15 +125,20 @@ pub fn compute_stretched_relative_start_time( } /// Provide differents fake quantities depending on mobility e.g. BIKE that will be use for rewards calculation +/// Coefficients per km from https://nosgestesclimat.fr/actions/plus/transport/voiture-5km pub fn quantify_mobility(service: String) -> U256 { + let base_quantity = U256::from(1000000 * 12); // default network difficulty * mean vdf difficulty per sec + + // U256::from(1_000_000_000_000_000_000_000_000_000_u128); if service == "BIKE_SHARING" { - U256::from(1000000000000000000_u128) + // 0.129/0.0001 = 1290 + base_quantity.saturating_mul(U256::from(1290_u128)) } else if service == "BIKE_RENTAL" { - U256::from(500000000000000000_u128) + base_quantity.saturating_mul(U256::from(1290_u128)) } else if service == "PUBLIC_TRANSPORT" { - U256::from(10000000000000000_u128) + base_quantity.saturating_mul(U256::from(1_u128)) } else { - U256::from(1) + base_quantity } } @@ -301,6 +306,6 @@ id,user_id,network,service,label,created_at,validation_datetime,from_coord,from_ // ACT let result = quantify_mobility(String::from("BIKE_SHARING")); // ASSERT - assert_eq!(U256::from(1000000000000000000_u128), result); + assert_eq!(U256::from(15480000000_u128), result); } }