### jsonの読み込み
use serde::{Serialize, Deserialize};
use std::fs;
use std::io::prelude::*;
#[derive(Serialize, Deserialize, Debug)]
#[allow(non_snake_case)]
struct Rotator {
Pitch:f32,
Roll:f32,
Yaw:f32,
}
#[derive(Serialize, Deserialize, Debug)]
#[allow(non_snake_case)]
struct CharaParam {
Name: String,
Id: i32,
ItemIdList: Vec<u32>,
RotData:Rotator,
}
fn main(){
let input_fn = fs::read_to_string("src/test_input.json")
.expect("JSON Read Failed.");
let deserialized: Vec<CharaParam> = serde_json::from_str(&input_fn).unwrap();
for data in &deserialized {
println!("{:?}", data);
}
}
### jsonの書き出し
use serde::{Serialize, Deserialize};
use std::fs::File;
use std::io::prelude::*;
#[derive(Serialize, Deserialize, Debug)]
#[allow(non_snake_case)]
struct Rotator {
Pitch:f32,
Roll:f32,
Yaw:f32,
}
#[derive(Serialize, Deserialize, Debug)]
#[allow(non_snake_case)]
struct CharaParam {
Name: String,
Id: i32,
ItemIdList: Vec<u32>,
RotData:Rotator,
}
fn main(){
let chara00 = CharaParam{Name:String::from("Apple"), Id:0x01, ItemIdList:vec![1000, 1001], RotData:Rotator{Pitch:0.0, Roll:0.0, Yaw:32.0} };
let chara01 = CharaParam{Name:String::from("Banana"), Id:0x02, ItemIdList:vec![1002, 1003], RotData:Rotator{Pitch:0.0, Roll:-70.0, Yaw:66.0} };
let mut param_list:Vec<CharaParam> = Vec::new();
param_list.push(chara00);
param_list.push(chara01);
let output_fn = String::from("src/test_output.json");
let result = output_json(&output_fn, param_list);
match result {
Ok(..) => {println!("Json Output Finished. [{}]", output_fn)}
Err(err) => {println!("Error! : {}", err)}
}
}
fn output_json(output_fn: &str, charaparam_list: Vec<CharaParam>) -> std::io::Result<()> {
let serialized: String = serde_json::to_string(&charaparam_list).unwrap();
let mut file = File::create(output_fn)?;
file.write_all(serialized.as_bytes())?;
Ok(())
}
serde_json::to_string(&charaparam_list).unwrap(); でstring型にしていますね。
つまりこういうことかな?
use serde::{Serialize, Deserialize};
use std::io::prelude::*;
use hex_literal::hex;
use k256::{ecdsa::{SigningKey, Signature, signature::Signer, signature::Verifier, VerifyingKey}};
use chrono::{Utc, Local, DateTime, Date};
#[derive(Serialize, Deserialize, Debug)]
struct UnsignedTransaction {
time: String,
sender: String,
receiver: String,
amount: i32,
}
#[derive(Serialize, Deserialize, Debug)]
struct SignedTransaction {
time: String,
sender: String,
receiver: String,
amount: i32,
signature: String,
}
fn hex(bytes: &[u8]) -> String {
bytes.iter().fold("".to_owned(), |s, b| format!("{}{:x}", s, b))
}
fn main(){
let private_key: SigningKey = SigningKey::from_bytes(&hex!(
"DCDFF4B7CA287CC7BD30ECAEF0622265DB4E14054E12954225457C3A6B84F135"
).into()).unwrap();
let public_key: &VerifyingKey = private_key.verifying_key();
let public_key_str = hex(&public_key.to_encoded_point(false).to_bytes());
let public_key_b_str = "4bac6cb0f4ad6397752c3d73b88c5c86e3d88ac695118494a1732e2abd16c76acad3d6586c37c8db7e69c2f812f99275198936957d72c38d71981991124";
let utc_datetime: DateTime<Utc> = Utc::now();
let ut1 = UnsignedTransaction {time: utc_datetime.to_string(), sender: public_key_str.to_string(), receiver: public_key_b_str.to_string(), amount: 10};
println!("{:?}", ut1);
let serialized: String = serde_json::to_string(&ut1).unwrap();
let sig1: Signature = private_key.sign(serialized.as_bytes());
let signed_ut1 = SignedTransaction {time: utc_datetime.to_string(), sender: public_key_str.to_string(), receiver: public_key_b_str.to_string(), amount: 10, signature: sig1.to_string()};
println!("{:?}", signed_ut1);
}
UnsignedTransaction { time: “2024-12-22 00:30:45.843926032 UTC”, sender: “4bac6cb0f4ad6397752c3d73b88c5c86e3d88ac695118494a1732e2abd16c76acad3d6586c37c8db7e69c2f812f99275198936957d72c38d71981991123”, receiver: “4bac6cb0f4ad6397752c3d73b88c5c86e3d88ac695118494a1732e2abd16c76acad3d6586c37c8db7e69c2f812f99275198936957d72c38d71981991124”, amount: 10 }
SignedTransaction { time: “2024-12-22 00:30:45.843926032 UTC”, sender: “4bac6cb0f4ad6397752c3d73b88c5c86e3d88ac695118494a1732e2abd16c76acad3d6586c37c8db7e69c2f812f99275198936957d72c38d71981991123”, receiver: “4bac6cb0f4ad6397752c3d73b88c5c86e3d88ac695118494a1732e2abd16c76acad3d6586c37c8db7e69c2f812f99275198936957d72c38d71981991124”, amount: 10, signature: “301DC132F45B1F8D0734A51E73F6725260B5365FBC9C2C405B9A12C70B97E47842366C2EC589F05AF8715268BC5A954B487F234F5FD3157ADBE8940AF2037B60” }
シリアライズしてバイトにしてsignする。。
しかし、これだとうまくいかん…
let pubkey = signed_ut1.sender;
let sig = signed_ut1.signature;
let verified = pubkey.verify(ut1, &sig).is_ok();
if verified {
println!("文章は改竄されていません。");
} else {
println!("文章が改竄されています。");
}