🦀

RustでECDSA公開鍵からETHアドレスを生成

2024/05/13に公開

はじめに

2024年4月からブロックチェーン公開講座を受講しています。今までなんとなく漠然と理解していたことを知識として体系的に整理できて、とてもありがたい講座です。

5月7日(火)の第5回は『イーサリアム』ではECDSA公開鍵からEthereumのアドレスを生成する方法についても学びましたので、復習のためRustで試してみました。

あくまでもRustとBlockchainの学習を目的として書いたものですので、実運用では信頼できるライブラリをお使いください。

アルゴリズム

  1. ECDSA公開鍵(512bit)をKeccak256でハッシュ化する
  2. 1の末尾20bytesを取り出しHEX文字列化する
  3. 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