您现在的位置:kastop>> Kas信息 Kaspa网络>>正文内容

Kastop:从助記詞到生成Kaspa标准地址的步驟与算法

在加密貨幣領域,從助記詞生成最終的區塊鏈地址(如 Kaspa 地址)是一個標準化的過程,涉及多個步驟和算法,包括 BIP-39(助記詞到種子)、BIP-32(種子到私鑰和公鑰的派生)以及 Bech32(地址編碼)。本文將詳細介紹這一過程的每一步,並比較 Rust 的 kaspa-bip32 庫、C# 的 NBitcoin 庫以及 BouncyCastle 庫在實現上的異同。



1. 從助記詞到種子(BIP-39)


步驟


  • 輸入:助記詞(例如 "invite solution truth lava unaware quality finish oak arena verb fuel beach")和密碼(本例中為空字符串 "")。


  • 算法

    • 將助記詞轉換為二進位熵(通常由助記詞的單詞對應 BIP-39 詞庫)。


    • 使用 PBKDF2(基於 HMAC-SHA512)進行 2048 次迭代,密鑰為助記詞字節,鹽為 "mnemonic" + passphrase。


    • 輸出 512 位(64 字節)的種子。



  • 輸出:種子,例如 0fae1ce0f7976b478f60bbc82d0652adc5cb0a1273ebc2740c5886970051dfb5f64897dce0314e895f1ef0b54fc8faed64733c421dd72a9ef6e38ffaee442b78。


Rust (kaspa-bip32)


  • 使用 Mnemonic::new 和 to_seed 方法,直接生成種子。


  • 實現符合 BIP-39 標準,簡單高效。


NBitcoin


  • 使用 Mnemonic 類的 DeriveSeed 方法,支援多語言詞庫,與 Rust 結果一致。


  • API 封裝完善,易用性高。


BouncyCastle


  • 使用 Pkcs5S2ParametersGenerator 實現 PBKDF2,需手動指定迭代次數(2048)和鹽。


  • 初始版本可能因參數配置錯誤(如鹽處理)導致種子不一致,修正後與 Rust/NBitcoin 一致。


異同


  • 三者最終都能生成正確種子,但 Rust 和 NBitcoin 開箱即用,BouncyCastle 需手動配置 PBKDF2,可能引入人為錯誤。



2. 從種子到根私鑰和鏈碼(BIP-32)


步驟


  • 輸入:64 字節種子。


  • 算法

    • 使用 HMAC-SHA512,密鑰為 "Bitcoin seed",數據為種子。


    • 輸出 64 字節結果:前 32 字節為根私鑰,後 32 字節為鏈碼。



  • 輸出

    • 根私鑰:59b5ca9b0bffa7d2ba4a03a905828c2f5c5a63345b1f03f25c4229f15c9b0904


    • 鏈碼:(例如 e8f32e723decf405...,具體值依實現而定)。



Rust (kaspa-bip32)


  • 使用 ExtendedPrivateKey::new 直接從種子生成根私鑰和鏈碼。


  • 內部實現簡單,符合 BIP-32。


NBitcoin


  • 使用 ExtKey 的構造函數,通過 Key 和種子生成根私鑰和鏈碼。


  • 提供更高層次的封裝,自動處理字節序。


BouncyCastle


  • 使用 HMac 和 Sha512Digest,手動實現 HMAC-SHA512。


  • 需自行分割 64 字節輸出為私鑰和鏈碼,實現較低層次。


異同


  • Rust 和 NBitcoin 的實現更抽象,隱藏了 HMAC 細節;BouncyCastle 需手動處理,靈活性高但易出錯。三者結果一致。



3. 從根私鑰到子私鑰(BIP-32 派生)


步驟


  • 輸入:父私鑰、父鏈碼、派生路徑(例如 m/44'/111111'/0'/0/0)。


  • 算法

    • 數據:[parentPubKey || index](37 字節)。


    • 子私鑰和鏈碼計算類似。


    • 數據:[0x00 || parentKey || index](37 字節)。


    • 使用 HMAC-SHA512,密鑰為父鏈碼,生成 64 字節輸出。


    • 子私鑰:IL + parentKey (mod n),其中 IL 是 HMAC 前 32 字節,n 是 secp256k1 曲線的階。


    • 子鏈碼:HMAC 後 32 字節。


    • 硬化派生(索引 >= 2^31):


    • 非硬化派生(索引 < 2^31):



  • 輸出

    • 示例:m/44' 的子私鑰 1ffbd33d548f98814d9162e555249f5f5ca885d1183ebdb97e8e218d662343fa。



Rust (kaspa-bip32)


  • 使用 derive_child 方法,支援硬化和非硬化派生。


  • 內部實現模 n 加法,自動處理邊界情況。


NBitcoin


  • 使用 ExtKey.Derive 方法,通過 KeyPath 指定路徑。


  • 同樣實現模 n 加法,結果與 Rust 一致。


BouncyCastle


  • 原程式碼:簡單相加,未考慮模 n,導致錯誤。


  • 修正後:使用 BigInteger 實現模 n 加法,與 Rust/NBitcoin 一致。


異同


  • Rust 和 NBitcoin 內置模 n 運算,確保結果正確;BouncyCastle 需手動實現,初始版本遺漏此步驟,修正後一致。



4. 從子私鑰到公鑰(ECDSA secp256k1)


步驟


  • 輸入:子私鑰(32 字節)。


  • 算法

    • 使用 secp256k1 曲線,計算 pubKey = G * privKey,其中 G 是生成點。


    • 輸出壓縮格式公鑰(33 字節,帶前綴 02 或 03)。



  • 輸出:例如 0390c918a7b04298b1dc182150eb11a68bb201b990eb415a04928a53b4d96c2a30。


Rust (kaspa-bip32)


  • 使用 secp256k1 庫的 public_key 方法生成壓縮公鑰。


  • 高效且標準化。


NBitcoin


  • 使用 Key.PubKey 生成壓縮公鑰。


  • 封裝簡單,結果與 Rust 一致。


BouncyCastle


  • 使用 ECDomainParameters 和 Multiply 方法,手動計算公鑰。


  • 需自行指定 secp256k1 參數,實現正確且與 Rust/NBitcoin 一致。


異同


  • 三者結果相同,但 Rust 和 NBitcoin 更簡化,BouncyCastle 需手動配置曲線參數。



5. 從公鑰到 Kaspa 地址(Bech32m)


步驟


  • 輸入:公鑰(33 字節)。


  • 算法

    • 構造 Payload:[version=0, x_coord],其中 x_coord 是公鑰後 32 字節(共 33 字節)。


    • 將 8 位數據轉為 5 位數據(convert8to5)。


    • 計算校驗碼:使用 Bech32m 的 polymod,輸入為 prefix + [0] + data5 + [0; 8]。


    • 拼接 HRP(kaspa)和 5 位數據,映射到字符集 qpzry9x8gf2tvdw0s3jn54khce6mua7l。



  • 輸出:Kaspa 地址,例如 kaspa:qzgvjx98kppf3vwurqs4p6c3569myqdejr45zksyj2998dxeds4rq7xdwnq74。


Rust (kaspa-bip32)


  • 使用手動實現的 bech32_encode,符合 Bech32m。


  • Data5 為 53 字節,校驗碼正確。


NBitcoin


  • 未直接支援 Kaspa 的 Bech32m,需手動實現。


  • 本文使用自定義 Bech32 編碼,與 Rust 一致。


BouncyCastle


  • 同樣需手動實現 Bech32m,與 Rust 的邏輯一致。


  • 修正後的版本生成正確地址。


異同


  • Rust 提供基礎實現,NBitcoin 和 BouncyCastle 需自定義 Bech32m。三者最終結果一致。



總結與異同比較


異同點


  1. 種子生成

    • Rust/NBitcoin: 內置 BIP-39,開箱即用。


    • BouncyCastle: 需手動配置 PBKDF2,易出錯但靈活。



  2. 根私鑰生成

    • Rust/NBitcoin: 封裝 HMAC-SHA512,直接生成。


    • BouncyCastle: 手動實現,需確保分割正確。



  3. 子私鑰派生

    • Rust/NBitcoin: 內置模 n 加法,標準化。


    • BouncyCastle: 需使用 BigInteger 實現模 n 加法,初始版本遺漏此步。



  4. 公鑰生成

    • Rust/NBitcoin: 內置 secp256k1 計算,簡單高效。


    • BouncyCastle: 需手動配置曲線,結果一致。



  5. Bech32 編碼

    • Rust: 提供基礎實現。


    • NBitcoin/BouncyCastle: 需自定義,邏輯一致。



結論


Rust 的 kaspa-bip32 和 C# 的 NBitcoin 提供了更高層次的封裝,適合快速開發;而 BouncyCastle 更低層次,需手動實現關鍵步驟,靈活性高但易出錯。通過修正 BouncyCastle 的派生邏輯(模 n 加法),三者最終都能生成一致的 Kaspa 地址。本文的 BouncyCastle 實現現已與 Rust 和 NBitcoin 對齊,成功生成目標地址 kaspa:qzgvjx98...。



感动 同情 无聊 愤怒 搞笑 难过 高兴 路过
【字体: 】【收藏】【打印文章】 【 打赏 】 【查看评论

相关文章

    没有相关内容