bitcoinのIPアドレスリストは、ipアドレスとUnix timeが対になっている
(参考↓)
https://qiita.com/onokatio/items/04f23b7300dec7e287cb
その他にも、ipv4/ipv6や、ping, lastsend, lastrec, id, versionなどの情報も含まれる。
handshake後にpeers.datのファイルに書き込むようにして、ping, pongの箇所は、enumでactive/inactiveのstatusで表現することにした。
use serde::{Serialize, Deserialize};
use std::{io::Write};
use chrono::{Utc,DateTime};
use std::fs::OpenOptions;
#[derive(Serialize, Deserialize, Clone, Debug)]
enum Status {
ACTIVE,
INACTIVE,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
struct Peer {
ip: String,
unixtime: i64,
nodetype: String,
version: String,
status: Status,
}
fn main(){
let utc_datetime: DateTime<Utc> = Utc::now();
println!("{}", utc_datetime.timestamp());
let peer = Peer {ip: "192.168.33.10".to_string(), unixtime: utc_datetime.timestamp(), nodetype: "c".to_string(), version: "1.0.1".to_string(), status: Status::ACTIVE};
println!("{:?}", peer);
let serialized: Vec<u8> = serde_json::to_vec(&peer).unwrap();
let mut file_ref = OpenOptions::new()
.append(true)
.open("./data/peers.dat")
.expect("Unable to open file");
file_ref.write_all(&serialized).expect("write failed");
file_ref.write_all(b"\n").expect("write failed");
}
Running `target/debug/sample`
1740366182
Peer { ip: “192.168.33.10”, unixtime: 1740366182, nodetype: “c”, version: “1.0.1”, status: ACTIVE }
nodeipリストをどうゆう風にするか、ファイルを分割するか、データ型などずっと悩んでいたけど、他のチェーンの設計は参考になりますね。
ちなみに取り出す際↓
fn get_peers() -> Result<Vec<Peer>, Box<dyn std::error::Error>> {
let mut peers: Vec<Peer> = Vec::new();
for result in BufReader::new(File::open("./data/peers.dat")?).lines() {
let line: Peer = serde_json::from_str(&result?).unwrap();
peers.push(line);
}
Ok(peers)
}