使用自己实现的hash_message
This commit is contained in:
parent
dd6b3b60c4
commit
b0cd7fbc18
@ -12,8 +12,7 @@ use std::str;
|
|||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use std::{fs::OpenOptions, io::BufReader};
|
use std::{fs::OpenOptions, io::BufReader};
|
||||||
use tiny_keccak::keccak256;
|
use tiny_keccak::keccak256;
|
||||||
use web3::signing::{hash_message, Key, SecretKeyRef};
|
use web3::types::{Address, H256};
|
||||||
use web3::types::Address;
|
|
||||||
|
|
||||||
pub fn generate_keypair() -> (SecretKey, PublicKey) {
|
pub fn generate_keypair() -> (SecretKey, PublicKey) {
|
||||||
let secp = Secp256k1::new();
|
let secp = Secp256k1::new();
|
||||||
@ -29,6 +28,18 @@ pub fn public_key_address(public_key: &PublicKey) -> Address {
|
|||||||
Address::from_slice(&hash[12..])
|
Address::from_slice(&hash[12..])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn hash_message<S>(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)]
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
pub struct Wallet {
|
pub struct Wallet {
|
||||||
pub secret_key: String,
|
pub secret_key: String,
|
||||||
@ -112,41 +123,30 @@ 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());
|
||||||
let pk = SecretKey::from_str(&self.secret_key).expect("32 bytes, within curve order");
|
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 key = SecretKeyRef::new(&pk);
|
||||||
let signature = key
|
// let signature = key
|
||||||
.sign(message_hash.as_bytes(), None)
|
// .sign(message_hash.as_bytes(), None)
|
||||||
.expect("hash is non-zero 32-bytes; qed");
|
// .expect("hash is non-zero 32-bytes; qed");
|
||||||
let v = signature
|
// let v = signature
|
||||||
.v
|
// .v
|
||||||
.try_into()
|
// .try_into()
|
||||||
.expect("signature recovery in electrum notation always fits in a u8");
|
// .expect("signature recovery in electrum notation always fits in a u8");
|
||||||
|
|
||||||
// let signature_bytes = Bytes({
|
// let mut bytes = Vec::with_capacity(65);
|
||||||
// let mut bytes = Vec::with_capacity(65);
|
// bytes.extend_from_slice(signature.r.as_bytes());
|
||||||
// bytes.extend_from_slice(signature.r.as_bytes());
|
// bytes.extend_from_slice(signature.s.as_bytes());
|
||||||
// bytes.extend_from_slice(signature.s.as_bytes());
|
// bytes.push(v);
|
||||||
// bytes.push(v);
|
|
||||||
// bytes
|
|
||||||
// });
|
|
||||||
|
|
||||||
let mut bytes = Vec::with_capacity(65);
|
// let str_sign = hex::encode(bytes);
|
||||||
bytes.extend_from_slice(signature.r.as_bytes());
|
// println!("web3 sign: {:?}", str_sign);
|
||||||
bytes.extend_from_slice(signature.s.as_bytes());
|
|
||||||
bytes.push(v);
|
|
||||||
|
|
||||||
let str_sign = hex::encode(bytes);
|
|
||||||
println!("web3 sign: {:?}", str_sign);
|
|
||||||
|
|
||||||
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, &pk)
|
.sign_ecdsa_recoverable(&message_to_hash, &pk)
|
||||||
.serialize_compact();
|
.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 mut s = hex::encode(signature);
|
||||||
let standard_v = recovery_id.to_i32() as u64 + 27;
|
let standard_v = recovery_id.to_i32() as u64 + 27;
|
||||||
let rv: u8 = standard_v
|
let rv: u8 = standard_v
|
||||||
|
Loading…
x
Reference in New Issue
Block a user