如何使用 rust-secp256k1 从私钥生成以太坊 public 密钥?
How to generate an Ethereum public key from a private key using rust-secp256k1?
我找到了rust-secp256k1,这似乎是我需要的,但文档中没有示例。
我尝试在我的代码中使用这个 crate:
extern crate secp256k1;
use secp256k1::key::SecretKey;
fn main() {
let context = secp256k1::Secp256k1::without_caps();
let private_key: String = String::from("d500266f7d37f0957564e4ce1a1dcc8bb3408383634774a2f4a94a35f4bc53e0");
let secret_key = SecretKey::new(&context, &mut private_key);
println!("{:?}", secret_key);
}
我收到一个错误:
error[E0277]: the trait bound `std::string::String: secp256k1::rand::Rng` is not satisfied
--> src/main.rs:10:22
|
10 | let secret_key = SecretKey::new(&context, &mut private_key);
| ^^^^^^^^^^^^^^ the trait `secp256k1::rand::Rng` is not implemented for `std::string::String`
|
= note: required by `secp256k1::key::SecretKey::new`
以下代码从私钥生成 public 密钥:
extern crate secp256k1;
extern crate hex;
use secp256k1::key::{SecretKey, PublicKey};
fn main() {
let context = secp256k1::Secp256k1::new();
let private_key: &[u8] = "d500266f7d37f0957564e4ce1a1dcc8bb3408383634774a2f4a94a35f4bc53e0".as_bytes();
let secret_key = SecretKey::from_slice(&hex::decode(private_key).unwrap());
let public_key = PublicKey::from_secret_key(&context, &secret_key.unwrap());
println!("{:?}", public_key.unwrap()); // PublicKey(a423c05d32e3385bb2930e42ebbf104567215761e166c3ae3dd91d9c8bee0adcfc4f9e4ec43998eae8000de6b166014c5921c6d4545675f4f9205e7bc3d4401e)
}
我没有使用 SecretKey::new
,它需要一个随机数生成器作为第二个参数,我需要使用 SecretKey::from_slice
. from_slice
takes a 32-byte key, which I can 到一个兼容的字节片中。
只是添加到已接受的答案中:
您在最后一行打印的 public 密钥不是未压缩 public 密钥的正确形式。要显示需要使用 secp256k1
包中 public 键的方法 serialize_uncompressed
,并删除前导 04
十六进制字节。
有关格式错误的更多信息。
我找到了rust-secp256k1,这似乎是我需要的,但文档中没有示例。
我尝试在我的代码中使用这个 crate:
extern crate secp256k1;
use secp256k1::key::SecretKey;
fn main() {
let context = secp256k1::Secp256k1::without_caps();
let private_key: String = String::from("d500266f7d37f0957564e4ce1a1dcc8bb3408383634774a2f4a94a35f4bc53e0");
let secret_key = SecretKey::new(&context, &mut private_key);
println!("{:?}", secret_key);
}
我收到一个错误:
error[E0277]: the trait bound `std::string::String: secp256k1::rand::Rng` is not satisfied
--> src/main.rs:10:22
|
10 | let secret_key = SecretKey::new(&context, &mut private_key);
| ^^^^^^^^^^^^^^ the trait `secp256k1::rand::Rng` is not implemented for `std::string::String`
|
= note: required by `secp256k1::key::SecretKey::new`
以下代码从私钥生成 public 密钥:
extern crate secp256k1;
extern crate hex;
use secp256k1::key::{SecretKey, PublicKey};
fn main() {
let context = secp256k1::Secp256k1::new();
let private_key: &[u8] = "d500266f7d37f0957564e4ce1a1dcc8bb3408383634774a2f4a94a35f4bc53e0".as_bytes();
let secret_key = SecretKey::from_slice(&hex::decode(private_key).unwrap());
let public_key = PublicKey::from_secret_key(&context, &secret_key.unwrap());
println!("{:?}", public_key.unwrap()); // PublicKey(a423c05d32e3385bb2930e42ebbf104567215761e166c3ae3dd91d9c8bee0adcfc4f9e4ec43998eae8000de6b166014c5921c6d4545675f4f9205e7bc3d4401e)
}
我没有使用 SecretKey::new
,它需要一个随机数生成器作为第二个参数,我需要使用 SecretKey::from_slice
. from_slice
takes a 32-byte key, which I can
只是添加到已接受的答案中:
您在最后一行打印的 public 密钥不是未压缩 public 密钥的正确形式。要显示需要使用 secp256k1
包中 public 键的方法 serialize_uncompressed
,并删除前导 04
十六进制字节。
有关格式错误的更多信息