diff --git a/examples/test.rs b/examples/test.rs index 9265f4e..e40a6e3 100644 --- a/examples/test.rs +++ b/examples/test.rs @@ -6,7 +6,7 @@ use std::ffi::{CStr, CString}; use std::os::raw::c_char; -use rustwallet::{new_wallet, get_address, restore_wallet, reset_wallet, free_cwallet, sign, CWallet}; +use rustwallet::{new_wallet, get_address, restore_wallet, reset_wallet, free_cwallet, sign, sign_for_tran, CWallet}; macro_rules! print_cchar{ ($p1:expr) => ( @@ -47,22 +47,26 @@ macro_rules! str_to_cchar { fn main() { unsafe { - let msg = "111"; + 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 key0 = "3da2dfc54de71230f639f37de61d8f8c4699f75e783dc54353146a4b73250366"; - let key1 = "a1a3ed90e41a37096f07957b9888ffa7a74406f3a3e8c77686d92f2ba7c22d58"; - let key2 = "27216cbe70021d5d1d018da5ab548b8b45dee4fd9ec0b33ab1dd264cf2ff249f"; + 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 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!(""), - backup_key: str_to_cchar!(key2) + second_key: str_to_cchar!(key1), + backup_key: str_to_cchar!("") }; let address2 = get_address(&tmp_cwallet); print_cchar!(address2); diff --git a/src/lib.rs b/src/lib.rs index 28c420e..940ba2d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -140,6 +140,19 @@ pub unsafe extern "C" fn sign(cw: &CWallet, msg: *const c_char) -> *mut c_char{ str_to_cchar!(r) } +#[no_mangle] +pub unsafe extern "C" fn sign_for_tran(cw: &CWallet, msg: *const c_char) -> *mut c_char{ + let rwallet = convert_to_rwallet(cw); + println!("rwallet: {:?}", rwallet); + let msg_str = cchar_to_str!(msg); + let signature = rwallet.sign_for_tran(msg_str); + let r = match signature { + Ok(v) => v, + Err(err) => panic!("Problem sign: {:?}", err), + }; + str_to_cchar!(r) +} + unsafe fn convert_to_cwallet(rwallet: Wallet) -> CWallet { // 转换Rust字符串数据为C的字符串并移交ownership diff --git a/src/wallet/wallet_impl.rs b/src/wallet/wallet_impl.rs index 9cd168a..7a547e1 100644 --- a/src/wallet/wallet_impl.rs +++ b/src/wallet/wallet_impl.rs @@ -228,7 +228,6 @@ impl Wallet { let message = msg.as_ref(); let message_hash = hash_message(message.as_ref()); println!("secret key: {:?}", &secret_key); - let message_to_hash = Message::from_slice(message_hash.as_ref()).unwrap(); let (recovery_id, signature) = secp .sign_ecdsa_recoverable(&message_to_hash, &secret_key) @@ -244,4 +243,18 @@ impl Wallet { Ok(s) } + pub fn sign_for_tran(&self, msg: S) -> Result + where + S: AsRef<[u8]>, + { + let secp = Secp256k1::new(); + let secret_key = self.get_secret_key(); + let hex_str = hex::decode(msg).unwrap(); + let message_to_hash = Message::from_slice(&hex_str).unwrap(); + let (_recovery_id, signature) = secp + .sign_ecdsa_recoverable(&message_to_hash, &secret_key) + .serialize_compact(); + let s = hex::encode(signature); + Ok(s) + } }