Substrate 通過助記詞轉(zhuǎn)換Public key、SS58 Address、AccountId的常見方式

簡(jiǎn)介

  • 某些情況下我們獲取到用戶提交的助記詞mnemonic后,需要轉(zhuǎn)換成公鑰信息進(jìn)行保存等操作,本文來簡(jiǎn)單介紹轉(zhuǎn)換的方式。
  • 注意這里的代碼是不支持 no-std的。

引入的類庫(kù)

  • 這里面我直接復(fù)制我測(cè)試代碼中的引用,有些是多余的,暫時(shí)不做篩選。
use frame_support::sp_runtime::{MultiSignature, CryptoTypeId};
use frame_support::sp_runtime::app_crypto::{Public, Pair, sr25519, ed25519, Ss58Codec, CryptoTypePublicPair};
use frame_support::sp_runtime::traits::{Verify, IdentifyAccount};
use frame_support::pallet_prelude::Encode;
use sp_core::hexdisplay::HexDisplay;
use sp_runtime::AccountId32;

獲取 ed25519 也就是GRANDPA的公鑰信息

  • 獲取公鑰
// 首先拿到 account_id 的Vec<u8>數(shù)組
let account_id = ed25519::Pair::from_string("助記詞...", None)
            .expect("Seed error of ed25519.").public().to_vec();
// 實(shí)際上公鑰就是通過這個(gè)數(shù)組的數(shù)據(jù)轉(zhuǎn)成16進(jìn)制而成的。
let account_id = sp_core::hexdisplay::HexDisplay::from(&account_id);
println!("用戶公鑰 = {:?}", &account_id);

  • 獲取SS58Address
// 其實(shí)這個(gè)更簡(jiǎn)單。
account_id = ed25519::Pair::from_string("助記詞...", None)
            .expect("Seed error of ed25519.").public().to_ss58check()
println!("用戶SS58格式地址 = {:?}", &account_id);

獲取 sr25519 也就是Babe,以及Aura,和我們常用的公鑰信息

  • 獲取公鑰
// 首先拿到 account_id 的Vec<u8>數(shù)組
let account_id = sr25519::Pair::from_string("助記詞...", None)
            .expect("Seed error of sr25519.").public().to_vec();
// 實(shí)際上公鑰就是通過這個(gè)數(shù)組的數(shù)據(jù)轉(zhuǎn)成16進(jìn)制而成的。
let account_id = sp_core::hexdisplay::HexDisplay::from(&account_id);
println!("用戶公鑰 = {:?}", &account_id);

  • 獲取SS58Address
// 其實(shí)這個(gè)更簡(jiǎn)單。
account_id = sr25519::Pair::from_string("助記詞...", None)
            .expect("Seed error of ed25519.").public().to_ss58check()
println!("用戶SS58格式地址 = {:?}", &account_id);

改進(jìn)

  • 通過觀察可以看到 sr25519、ed25519代碼的處理方式幾乎一樣,那樣的話我們就可以找一些共同點(diǎn),從而抽象出一個(gè)公用函數(shù)。
  • sr25519和ed25519都定義一個(gè)結(jié)構(gòu)體Public,比如上面的 Pair::from_string 接口這個(gè)Public結(jié)構(gòu)體就都做了實(shí)現(xiàn),尤其Public 中的 CryptoType 是他們必須實(shí)現(xiàn)的借口,所以直接可以通過這個(gè)trait定義一個(gè)泛型方法:
  • Public中包含重要的CryptoType借口

抽象出公用方法

  • 如下代碼就是我的實(shí)現(xiàn)舉例:
fn extract_hex_of_public<TPublic: Public>(raw_data: &str) // -> HexDisplay
    where
        AccountPublic: From<<TPublic::Pair as Pair>::Public>,
{
    let account_id = TPublic::Pair::from_string(raw_data, None).expect("Seed error").public();
    let account_id: AccountId32 = AccountPublic::from(account_id).into_account();
    let account_u8: [u8; 32] = account_id.into();
    let account_id = sp_core::hexdisplay::HexDisplay::from(&account_u8);

    println!(" extract_hex_of_public = {:?}", account_id);
}

結(jié)束

  • 感謝閱讀。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容