增加替换ehereumjs-util.signature.ecsign签名的方法

This commit is contained in:
fitchgc 2022-10-31 07:11:26 +00:00
parent 1b1228fa28
commit e2de3e296c
3 changed files with 40 additions and 10 deletions

View File

@ -6,7 +6,7 @@
use std::ffi::{CStr, CString}; use std::ffi::{CStr, CString};
use std::os::raw::c_char; 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{ macro_rules! print_cchar{
($p1:expr) => ( ($p1:expr) => (
@ -47,22 +47,26 @@ macro_rules! str_to_cchar {
fn main() { fn main() {
unsafe { unsafe {
let msg = "111"; let msg = "099c9c3da391df6e7e82141888db5cca";
let wallet: CWallet = new_wallet(str_to_cchar!(msg)); let wallet: CWallet = new_wallet(str_to_cchar!(msg));
println!("---- generated a wallet to be used on C-side ----"); println!("---- generated a wallet to be used on C-side ----");
print_wallet(&wallet); print_wallet(&wallet);
let address = get_address(&wallet); let address = get_address(&wallet);
print_cchar!(address); print_cchar!(address);
// let address_str = cchar_to_str!(address); let address_str = cchar_to_str!(address);
// println!("address: {}", address_str); println!("address: {}", address_str);
let key0 = "3da2dfc54de71230f639f37de61d8f8c4699f75e783dc54353146a4b73250366"; let sign_str = sign_for_tran(&wallet,str_to_cchar!("cc0dac9a2bd7125bbe9130b83053494860f7a444868a45a9c00a865631ba8894"));
let key1 = "a1a3ed90e41a37096f07957b9888ffa7a74406f3a3e8c77686d92f2ba7c22d58"; print_cchar!(sign_str);
let key2 = "27216cbe70021d5d1d018da5ab548b8b45dee4fd9ec0b33ab1dd264cf2ff249f";
let key0 = "aadcabedb89a41db4c815bd149d3e7a1ff04247947efd5768666ba5f5e2df2e2";
let key1 = "5b5d60194aa6588db9c52182a50d4657d918af3a9ff681207243957bac94791a";
let key2 = "";
let tmp_cwallet = CWallet{ let tmp_cwallet = CWallet{
msg_key: str_to_cchar!(msg), msg_key: str_to_cchar!(msg),
master_key: str_to_cchar!(key0), master_key: str_to_cchar!(key0),
second_key: str_to_cchar!(""), second_key: str_to_cchar!(key1),
backup_key: str_to_cchar!(key2) backup_key: str_to_cchar!("")
}; };
let address2 = get_address(&tmp_cwallet); let address2 = get_address(&tmp_cwallet);
print_cchar!(address2); print_cchar!(address2);

View File

@ -140,6 +140,19 @@ pub unsafe extern "C" fn sign(cw: &CWallet, msg: *const c_char) -> *mut c_char{
str_to_cchar!(r) 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 { unsafe fn convert_to_cwallet(rwallet: Wallet) -> CWallet {
// 转换Rust字符串数据为C的字符串并移交ownership // 转换Rust字符串数据为C的字符串并移交ownership

View File

@ -228,7 +228,6 @@ impl Wallet {
let message = msg.as_ref(); let message = msg.as_ref();
let message_hash = hash_message(message.as_ref()); let message_hash = hash_message(message.as_ref());
println!("secret key: {:?}", &secret_key); println!("secret key: {:?}", &secret_key);
let message_to_hash = Message::from_slice(message_hash.as_ref()).unwrap(); let message_to_hash = Message::from_slice(message_hash.as_ref()).unwrap();
let (recovery_id, signature) = secp let (recovery_id, signature) = secp
.sign_ecdsa_recoverable(&message_to_hash, &secret_key) .sign_ecdsa_recoverable(&message_to_hash, &secret_key)
@ -244,4 +243,18 @@ impl Wallet {
Ok(s) Ok(s)
} }
pub fn sign_for_tran<S>(&self, msg: S) -> Result<String>
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)
}
} }