ロジック
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);
}
うん、これは特に問題ないですね。