diff --git a/src/wallet/wallet_impl.rs b/src/wallet/wallet_impl.rs index 5aee84b..d3937f4 100644 --- a/src/wallet/wallet_impl.rs +++ b/src/wallet/wallet_impl.rs @@ -12,8 +12,7 @@ use std::str; use std::str::FromStr; use std::{fs::OpenOptions, io::BufReader}; use tiny_keccak::keccak256; -use web3::signing::{hash_message, Key, SecretKeyRef}; -use web3::types::Address; +use web3::types::{Address, H256}; pub fn generate_keypair() -> (SecretKey, PublicKey) { let secp = Secp256k1::new(); @@ -29,6 +28,18 @@ pub fn public_key_address(public_key: &PublicKey) -> Address { Address::from_slice(&hash[12..]) } +pub fn hash_message(message: S) -> H256 +where + S: AsRef<[u8]>, +{ + let message = message.as_ref(); + + let mut eth_message = format!("\x19Ethereum Signed Message:\n{}", message.len()).into_bytes(); + eth_message.extend_from_slice(message); + + keccak256(ð_message).into() +} + #[derive(Serialize, Deserialize, Debug)] pub struct Wallet { pub secret_key: String, @@ -112,41 +123,30 @@ impl Wallet { let message = msg.as_ref(); let message_hash = hash_message(message.as_ref()); let pk = SecretKey::from_str(&self.secret_key).expect("32 bytes, within curve order"); - println!("secret key: {:?}", pk); + // println!("secret key: {:?}", pk); - let key = SecretKeyRef::new(&pk); - let signature = key - .sign(message_hash.as_bytes(), None) - .expect("hash is non-zero 32-bytes; qed"); - let v = signature - .v - .try_into() - .expect("signature recovery in electrum notation always fits in a u8"); + // let key = SecretKeyRef::new(&pk); + // let signature = key + // .sign(message_hash.as_bytes(), None) + // .expect("hash is non-zero 32-bytes; qed"); + // let v = signature + // .v + // .try_into() + // .expect("signature recovery in electrum notation always fits in a u8"); - // let signature_bytes = Bytes({ - // let mut bytes = Vec::with_capacity(65); - // bytes.extend_from_slice(signature.r.as_bytes()); - // bytes.extend_from_slice(signature.s.as_bytes()); - // bytes.push(v); - // bytes - // }); + // let mut bytes = Vec::with_capacity(65); + // bytes.extend_from_slice(signature.r.as_bytes()); + // bytes.extend_from_slice(signature.s.as_bytes()); + // bytes.push(v); - let mut bytes = Vec::with_capacity(65); - bytes.extend_from_slice(signature.r.as_bytes()); - bytes.extend_from_slice(signature.s.as_bytes()); - bytes.push(v); - - let str_sign = hex::encode(bytes); - println!("web3 sign: {:?}", str_sign); + // let str_sign = hex::encode(bytes); + // println!("web3 sign: {:?}", str_sign); let message_to_hash = Message::from_slice(message_hash.as_ref()).unwrap(); let (recovery_id, signature) = secp .sign_ecdsa_recoverable(&message_to_hash, &pk) .serialize_compact(); - // let mut s = String::with_capacity(2 * 65); - // for i in signature { - // write!(s, "{:02x}", i).unwrap(); - // } + let mut s = hex::encode(signature); let standard_v = recovery_id.to_i32() as u64 + 27; let rv: u8 = standard_v