– PoWの難易度の自動調整を追加する
L originの難易度があり、マイニングの経過した時間により難易度を上げたり下げたりする
5秒以上かかったらdifficultyを下げ、1秒以下ならdifficultyを上げる。
use serde::{Serialize, Deserialize}; use chrono::{Utc, Local, DateTime, Date}; use sha2::{Digest, Sha256}; use rand::Rng; use std::{thread, time}; use floating_duration::TimeAsFloat; #[derive(Debug, Serialize, Clone, Deserialize)] struct Block { time: String, transactions: Vec<String>, hash: String, nonce: String, } unsafe fn pow() { let now = time::Instant::now(); let previous_hash = "b9b9ee9ffc95fa4956b63b6043a99d0a8f04e0e52e687fc1958d3c6dff885f01"; let mut num = rand::thread_rng().gen_range(0..1000000); let mut hash_num = format!("{}{}", previous_hash, num.to_string()); let mut header = Sha256::digest(hash_num); let mut target: String = (&hex::encode(header)[..4]).to_string(); let mut cnt = 1; println!("count: {} {:x}", cnt, header); let str: String = "0".to_string(); let difficulty_str = str.repeat(difficulty.try_into().unwrap()); let n:usize = difficulty as usize; while target != difficulty_str { println!("count: {} {:x}", cnt, header); num = rand::thread_rng().gen_range(0..1000000); hash_num = format!("{}{}", previous_hash, num.to_string()); header = Sha256::digest(hash_num); target = (&hex::encode(header)[..n]).to_string(); cnt += 1; } println!("count: {} {:x}", cnt, header); println!("{:?}", now.elapsed()); let t = vec!["sender".to_string(), "receiver".to_string(), "amount".to_string()]; let utc_datetime: DateTime<Utc> = Utc::now(); let b = Block{time:utc_datetime.to_string(), transactions: t, hash: hex::encode(header).to_string(), nonce:num.to_string()}; println!("{:?}", b); println!("difficulty is {}", difficulty); if now.elapsed().as_fractional_secs() >= 5.0 { difficulty -= 1; } else if now.elapsed().as_fractional_secs() < 1.0 { difficulty += 1; } } static mut difficulty: u32 = 4; fn main(){ unsafe {pow()}; unsafe {pow()}; unsafe {pow()}; }
$ cargo run
…
count: 393498 5c3b6663fe657641be5f6732ab2762fcc762aa9ffa598d6ee94dad59a4c4b9ca
count: 393499 000000215ec2fa2c01340818563a8397e50514204dcdca7f0addeeb7ff053e95
9.333024984s
Block { time: “2025-01-09 22:49:40.884851370 UTC”, transactions: [“sender”, “receiver”, “amount”], hash: “000000215ec2fa2c01340818563a8397e50514204dcdca7f0addeeb7ff053e95”, nonce: “175647” }
difficulty is 5
最初、difficultyが4だったのが、difficultyが5に変化しているのがわかります。
unsafeはあまり使いたくないですね。