ロジック
1. blockからトランザクションデータを抽出する
2. トランザクションデータのsendに自分のアドレスがあればamountからマイナス
3. トランザクションデータのreceiverに自分のアドレスがあればamountをプラス
4. 2・3をループで回して、合計値をウォレットのGUIで表示
// gui表示 async fn handle_balance()-> axum::response::Html<String> { let balance = balance().unwrap(); let tera = tera::Tera::new("templates/*").unwrap(); let mut context = tera::Context::new(); context.insert("title", "Index page"); context.insert("balance", &balance); let output = tera.render("balance.html", &context); axum::response::Html(output.unwrap()) } // balance計算 fn balance()-> Result<i32, Box<dyn std::error::Error>>{ // アドレスの読み込み let contents = std::fs::read_to_string("secret.pem") .expect("something went wrong reading the file"); let secret_pem = contents.trim(); let secret_key = secret_pem.parse::<SecretKey>().unwrap(); let private_key_serialized = hex::encode(&secret_key.to_bytes()); let public_key = secret_key.public_key(); let address = new_address(&public_key); let mut balance: i32 = 0; for result in BufReader::new(File::open("blocks.txt")?).lines() { let l = result?; let param:Block = serde_json::from_str(&l).unwrap(); for transaction in param.transactions { if transaction.receiver == address { balance += transaction.amount; } else if transaction.sender == address{ balance -= transaction.amount; } } } println!("balance is {}", balance); return Ok(balance); }
うん、これは特に問題ないですね。