🦀
RustでECDSA公開鍵からETHアドレスを生成
はじめに
2024年4月からブロックチェーン公開講座を受講しています。今までなんとなく漠然と理解していたことを知識として体系的に整理できて、とてもありがたい講座です。
5月7日(火)の第5回は『イーサリアム』ではECDSA公開鍵からEthereumのアドレスを生成する方法についても学びましたので、復習のためRustで試してみました。
あくまでもRustとBlockchainの学習を目的として書いたものですので、実運用では信頼できるライブラリをお使いください。
アルゴリズム
- ECDSA公開鍵(512bit)をKeccak256でハッシュ化する
- 1の末尾20bytesを取り出しHEX文字列化する
- 2の先頭に0xを付与する
プロジェクトの作成
$ cargo new study
$ cd study
依存パッケージの追加
$ cargo add hex_literal sha3
src/main.rsの編集
src/main.rs
use hex_literal::hex;
use sha3::{Digest, Keccak256};
fn get_eth_address(public_key: &[u8; 64]) -> String {
let mut hasher = Keccak256::new();
hasher.update(public_key);
let hashed = hasher.finalize();
format!("0x{}",
hashed
.iter().skip(12)
.map(|n| format!("{:02x}", n))
.collect::<String>())
}
fn main() {
// Public key
let public_key = &hex!(
"6e145ccef1033dea239875dd00dfb4fee6e3348b84985c92f103444683bae07b83b5c38e5e2b0c8529d7fa3f64d46daa1ece2d9ac14cab9477d042c84c32ccd0"
);
let address = get_eth_address(public_key);
println!("ETH address: {}", address);
}
※ECDSA公開鍵(512bit)は、ブロックチェーン公開講座の資料に記載されているものと同じ値を使用しています。
プログラムの実行
$ cargo run
Compiling study v0.1.0 (/home/toshio/workspace/rustcrypto/rust_crypto_03_eth_address)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.17s
Running `target/debug/study`
ETH address: 0x001d3f1ef827552ae1114027bd3ecf1f086ba0f9
講座の公開資料と同じETHアドレスを取得することができました。
Discussion