//test.rs // // 测试在Rust侧生成钱包密钥对,转换成C侧的数据结构。 // 测试钱包在C侧调用接口存储和重新读出钱包密钥 // use std::ffi::{CStr, CString}; use std::os::raw::c_char; use rustwallet::{new_wallet, get_address, restore_wallet, reset_wallet, free_cwallet, sign, sign_for_tran, CWallet, generate_sec_key}; macro_rules! print_cchar{ ($p1:expr) => ( let s = CStr::from_ptr($p1); let ps = s.to_str().unwrap(); println!("{}=> {}", stringify!($p1), ps) ); ($p1:expr, $p2:expr) => ( let s = CStr::from_ptr($p2); let ps = s.to_str().unwrap(); println!("{}{}", $p1, ps) ) } macro_rules! cchar_to_str{ ($p1:expr) => { { let s = CStr::from_ptr($p1); let ps = s.to_str().unwrap(); ps } } } macro_rules! str_to_cchar { ($p1:expr) => { { let msgkey = CString::new($p1).unwrap(); let c_msgkey: *mut c_char = msgkey.into_raw(); c_msgkey } }; } fn main() { unsafe { let msg = "099c9c3da391df6e7e82141888db5cca"; let wallet: CWallet = new_wallet(str_to_cchar!(msg)); println!("---- generated a wallet to be used on C-side ----"); print_wallet(&wallet); let address = get_address(&wallet); print_cchar!(address); let address_str = cchar_to_str!(address); println!("address: {}", address_str); let sign_str = sign_for_tran(&wallet,str_to_cchar!("cc0dac9a2bd7125bbe9130b83053494860f7a444868a45a9c00a865631ba8894")); print_cchar!(sign_str); let s_key = generate_sec_key(&wallet); print_cchar!(s_key); let key0 = "aadcabedb89a41db4c815bd149d3e7a1ff04247947efd5768666ba5f5e2df2e2"; let key1 = "5b5d60194aa6588db9c52182a50d4657d918af3a9ff681207243957bac94791a"; let key2 = ""; let tmp_cwallet = CWallet{ msg_key: str_to_cchar!(msg), master_key: str_to_cchar!(key0), second_key: str_to_cchar!(key1), backup_key: str_to_cchar!("") }; let address2 = get_address(&tmp_cwallet); print_cchar!(address2); let tmp_cwallet2 = restore_wallet(&tmp_cwallet); let address3 = get_address(&tmp_cwallet2); print_cchar!(address3); let sign_str = sign(&tmp_cwallet2,str_to_cchar!("111")); print_cchar!(sign_str); let cwallet3 = reset_wallet(&tmp_cwallet2); print_wallet(&cwallet3); let sign_str2 = sign(&cwallet3, str_to_cchar!("111")); print_cchar!(sign_str2); // print_wallet(&tmp_cwallet2); // println!("---- saving the wallet to wallet.json ----"); // save_wallet(&wallet); // println!("---- saved! ----"); // println!("---- fetching the saved wallet to be exposed to C-side ----"); // let fetched = fetch_cwallet(); // print_wallet(&fetched); // sign(); // let sign_str = "111"; // let cstr = std::ffi::CString::new(sign_str).unwrap(); // sss_sign(cstr.into_raw()); // // free_cwallet(wallet); // 对应 generate_cwallet() // free_cwallet(fetched); // 对应 fetch_wallet() } } unsafe fn print_wallet(cwallet: &CWallet) { print_cchar!("msg=> ", cwallet.msg_key); print_cchar!("master key=> ", cwallet.master_key); print_cchar!("second key=> ", cwallet.second_key); print_cchar!("backup key=> ", cwallet.backup_key); }