生成 ETH 公私钥与地址 | Rust & Blockchain

这篇文章主要介绍了生成 ETH 公私钥与地址 | Rust & Blockchain ,文中通过代码以及文档配合进行讲解,很详细,它对在座的每个人的研究和工作具有很经典的参考价值。 如果需要,让我们与区块链资料网一起学习。

https://www.interchains.cc/23024.html

生成 ETH 公私钥与地址 | Rust & Blockchain是很好的区块链资料,他说明了区块链当中的经典原理,可以给我们提供资料,生成 ETH 公私钥与地址 | Rust & Blockchain学习起来其实是很简单的,

不多的几个较为抽象的概念也很容易理解,之所以很多人感觉生成 ETH 公私钥与地址 | Rust & Blockchain比较复杂,一方面是因为大多数的文档没有做到由浅入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难

生成 ETH 公私钥与地址 | Rust & Blockchain

用 Rust实现以太坊eth公私钥与地址的生成

本篇是 Rust 学习笔记的第二篇。在第一篇里,我们魔改出了一个 Encoder,现在我们继续延续我们的魔改之路,挑战一个难度+1的Repo:

Rust library for generating cryptocurrency wallets

https://github.com/AleoHQ/wagyu

魔改目标 0x1:

抽取 Repo 中以太坊eth私钥、公钥、地址生成的部分,打印到控制台中。

但在魔改之前,笔者首先要对上一篇文章稍作补充,总结一下上篇文章中所涉及的知识点。

上篇文章中所涉及的知识点

  • 变量的赋值
  • format!函数(连接字符串)
  • 库的添加与使用,以wasm-logger为例
  • trunk 与 yew 结合,让Rust程序 wasm 化,使其在浏览器中可访问

跑一遍 wagyu

首先要验证这个库符合我们的需求,所以按照 Repo 中的 Readme,采用源码的方式跑一遍。

# Download the source code git clone https://github.com/AleoHQ/wagyu cd wagyu  # Build in release mode $ cargo build --release ./target/release/wagyu

成功:

生成 ETH 公私钥与地址 | Rust & Blockchain

在这个过程里,我们学习到了 cargo 的更多用法:

$ cargo run # 直接执行 $ cargo build # build 出 debug 版本,可执行文件在 ./target/debug 目录下 $ cargo build --release # build 出 正式版本(release version),可执行文件在 ./target/release 下

研究 wagyu 代码

首先喵一眼目录结构:

. ├── AUTHORS ├── Cargo.lock ├── Cargo.toml ├── LICENSE-APACHE ├── LICENSE-MIT ├── README.md ├── bitcoin ├── ethereum ├── model ├── monero ├── target ├── zcash └── wagyu       ├── cli       │   ├── bitcoin.rs       │   ├── ethereum.rs       │   ├── mod.rs       │   ├── monero.rs       │   ├── parameters       │   └── zcash.rs       ├── lib.rs       └── main.rs 

我们可以看到,主入口是wagyu

wagyumain.rs中,会对cli目录下的子模块进行调用,进而对和cli平级的子模块进行调用。

其代码如下:

fn main() -> Result<(), CLIError> {     let arguments = App::new("wagyu")         .version("v0.6.3")         .about("Generate a wallet for Bitcoin, Ethereum, Monero, and Zcash")         .author("Aleo <[email protected]>")         .settings(&[             AppSettings::ColoredHelp,             AppSettings::DisableHelpSubcommand,             AppSettings::DisableVersion,             AppSettings::SubcommandRequiredElseHelp,         ])         .subcommands(vec![             BitcoinCLI::new(),             EthereumCLI::new(),             MoneroCLI::new(),             ZcashCLI::new(),         ])         .set_term_width(0)         .get_matches();      match arguments.subcommand() {         ("bitcoin", Some(arguments)) => BitcoinCLI::print(BitcoinCLI::parse(arguments)?),         ("ethereum", Some(arguments)) => EthereumCLI::print(EthereumCLI::parse(arguments)?),         ("monero", Some(arguments)) => MoneroCLI::print(MoneroCLI::parse(arguments)?),         ("zcash", Some(arguments)) => ZcashCLI::print(ZcashCLI::parse(arguments)?),         _ => unreachable!(),     } }

我们再进入wagyu > cli > ethereum.rs目录下,发现里面有个简单的函数:

    pub fn new<R: Rng>(rng: &mut R) -> Result<Self, CLIError> {         let private_key = EthereumPrivateKey::new(rng)?;         let public_key = private_key.to_public_key();         let address = public_key.to_address(&EthereumFormat::Standard)?;         Ok(Self {             private_key: Some(private_key.to_string()),             public_key: Some(public_key.to_string()),             address: Some(address.to_string()),             ..Default::default()         })     }

很好,就拿这个改造了!

复制必要文件到新项目

  1. 新建项目
$ cargo new hello-crypto-rust

或者直接把上一个项目复制一份。

  1. wagyuCargo.toml中的必要内容复制过来
[dependencies] log = "0.4" pretty_env_logger = "0.3"  wagyu-ethereum = { path = "./ethereum", version = "0.6.3" } wagyu-model = { path = "./model", version = "0.6.3" }  arrayvec = { version = "0.5.1" } base58 = { version = "0.1" } clap = { version = "~2.33.1" } colored = { version = "1.9" } digest = { version = "0.9.0" } either = { version = "1.5.3" } failure = { version = "0.1.8" } hex = { version = "0.4.2" } lazy_static = { version = "1.4.0" } rand = { version = "0.7" } rand_core = { version = "0.5.1" } safemem = { version = "0.3.3" } serde = { version = "1.0", features = ["derive"] } serde_json = { version = "1.0" } tiny-keccak = { version = "1.4" }  [profile.release] opt-level = 3 lto = "thin" incremental = true  [profile.bench] opt-level = 3 debug = false rpath = false lto = "thin" incremental = true debug-assertions = false  [profile.dev] opt-level = 0  [profile.test] opt-level = 3 incremental = true debug-assertions = true debug = true
  1. ethereummodel两个文件夹复制到hello-crypto-rust目录下

此时的文件目录是这个样子的:

. ├── Cargo.lock ├── Cargo.toml ├── ethereum ├── model ├── src └── target

补充代码

  1. 补充lib.rs文件

src目录下新建lib.rs文件,内容:

pub extern crate wagyu_ethereum as ethereum; pub extern crate wagyu_model as model; extern crate pretty_env_logger;

作用是加载外部 crate,更详细的说明可见:

https://wiki.jikexueyuan.com/project/rust-primer/module/module.html

  1. 编写main.rs文件。

首先引用必要的外部模块:

use rand::{rngs::StdRng}; use rand_core::SeedableRng; use hello_crypto_rust::ethereum::{EthereumPrivateKey, EthereumFormat}; use hello_crypto_rust::model::{PrivateKey, PrivateKeyError, AddressError, PublicKeyError, PublicKey};  #[macro_use] extern crate log;

然后我们编写主函数:

fn main(){     pretty_env_logger::init();  // 初始化 pretty_env_logger 模块     new(); //调用new函数 }

new()函数:

pub fn new() -> Result<EthereumPrivateKey, CreateError> {     let rng = &mut StdRng::from_entropy();     let private_key = EthereumPrivateKey::new(rng)?;     info!("priv: {}", private_key.to_string());     let public_key = private_key.to_public_key();     info!("pub: {}", public_key.to_string());     let address = public_key.to_address(&EthereumFormat::Standard)?;     info!("addr: {}", address.to_string());     Ok(private_key) }

我们这里使用了相对于println!更高级的输出方式,通过log输出。

这里有个关键的语法糖——?,用于错误处理。

把 result 用 match 连接起来会显得很难看;幸运的是,? 运算符可以把这种逻辑变得 干净漂亮。? 运算符用在返回值为 Result 的表达式后面,它等同于这样一个匹配 表达式:其中 Err(err) 分支展开成提前返回的 return Err(err),而 Ok(ok) 分支展开成 ok 表达式。

—— https://rustwiki.org/zh-CN/rust-by-example/std/result/question_mark.html

两个等价的函数,一个使用了?,一个没有:

fn not_use_question_mark() {     let a = 10;                                                   // 把这里改成 9 就会报错.     let half = halves_if_even(a);     let half = match half {         Ok(item) => item,         Err(e) => panic!(e),     };     assert_eq!(half, 5); }  fn use_question_mark<'a >() -> Result<i32, &'a str> {              // 这里必须要返回Result     let a = 10;     let half = halves_if_even(a)?;                     // 因为?要求其所在的函数必须要返回Result     assert_eq!(half, 5);     Ok(half)                                                                    }

然后,我们定义一下枚举类型CreateError,里面会囊括AddressErrorPrivateKeyErrorPublicKeyError

pub enum CreateError {     AddressError(AddressError),     PrivateKeyError(PrivateKeyError),     PublicKeyError(PublicKeyError) }  impl From<AddressError> for CreateError {     fn from(error: AddressError) -> Self {         CreateError::AddressError(error)     } }  impl From<PrivateKeyError> for CreateError {     fn from(error: PrivateKeyError) -> Self {         CreateError::PrivateKeyError(error)     } }  impl From<PublicKeyError> for CreateError {     fn from(error: PublicKeyError) -> Self {         CreateError::PublicKeyError(error)     } }

Try It!

实现成功:

生成 ETH 公私钥与地址 | Rust & Blockchain

本篇所涉及的知识点

  • cargo 的更多用法
  • lib.rs的用法
  • 函数与函数返回值
  • pretty_env_logger的用法
  • 枚举类型,以CreateError为例

本系列所有源码:

https://github.com/leeduckgo/RustStudy


生成 ETH 公私钥与地址 | Rust & Blockchain

部分转自网络,侵权联系删除www.interchains.cchttps://www.interchains.cc/23024.html

区块链毕设网(www.interchains.cc)全网最靠谱的原创区块链毕设代做网站 部分资料来自网络,侵权联系删除! 最全最大的区块链源码站 ! QQ3039046426
区块链知识分享网, 以太坊dapp资源网, 区块链教程, fabric教程下载, 区块链书籍下载, 区块链资料下载, 区块链视频教程下载, 区块链基础教程, 区块链入门教程, 区块链资源 » 生成 ETH 公私钥与地址 | Rust & Blockchain

提供最优质的资源集合

立即查看 了解详情