Private-Key
具有 BIP44 的 HD 錢包 - 僅知道 xpub 派生公鑰的解決方法
我的目標:我不想需要私鑰來分層派生新地址。
當然,首先我可以創建一批地址,給定一個私鑰。但是一旦我超過了那個批次,我將再次需要私鑰來生成更多地址。
我想派生只知道公鑰的地址。我知道這對於 BIP39 是可能的,但理解這可能涉及安全問題,即。如果攻擊者偶然發現了 xpub 和 xprv,他們可以獲取任意數量的地址,並能夠使用它們簽署交易。
嘗試使用 BIP44 從 HD 公鑰派生會導致異常,指出強化路徑需要 HD 私鑰。但是,我找到了一種解決方法,但我擔心它是作弊的,並且可能會犧牲 BIP44 中路徑硬化的好處。
這是一個例子:
// It starts off with a `userCode` that represents a BIP39 Mnemonic code. const codeUser = new Mnemonic('select scout crash enforce riot rival spring whale hollow radar rule sentence') // Convert to HD private key... const hdUserPrivateKey = codeUser.toHDPrivateKey() console.log(hdUserPrivateKey.hdPublicKey.toString()) // Gives: `xpub661MyMwAqRbcEngoXGfFNahZ5FzSDGqY8pWKTqo6vtXxK15otDNLXJmbeHV7DUjvPc7CAFhYp6hzBiTanr8rgoHPHf6NSgZAyejK5bk8MiW` // But we won't use it... // Instead, I can then derive a BIP44 without the `change`, `address_index` segments from `hdUserPrivateKey`... console.log(hdUserPrivateKey.deriveChild(`m/44'/0'/0'`).hdPublicKey.toString()) // Gives: `xpub6CsrEMgU2f8uEGfFMvsPjKB9ekHuZiesLqSHLwCJuNFkP2uJGm7WjTo2gy95S4KEBc4etdodNQXAvn5Vsf4kupJQ1DKR4DMfcHwKdhQ3k6h` // This is the xpub I can use to derive addresses without requiring the initial private key. // So knowing this, I can build a HD public key given that xpub... const hdPublicKey = Mnemonic.bitcore.HDPublicKey('xpub6CsrEMgU2f8uEGfFMvsPjKB9ekHuZiesLqSHLwCJuNFkP2uJGm7WjTo2gy95S4KEBc4etdodNQXAvn5Vsf4kupJQ1DKR4DMfcHwKdhQ3k6h') const derivative = 0 // We can derive from it this path, but what is this path defined as? Are we back in BIP39 territory now? const publicKey = hdPublicKey.deriveChild(`m/0/${derivative}`).publicKey const address = new Mnemonic.bitcore.Address(publicKey) console.log(address.toString()) // 12XyHwtmoq5w4VQ5mzcu6BQzdLqCLxUv5e
…當然,我可以
derivative
根據我希望從公鑰創建新地址的次數遞增。每當我想簽署交易…
const codeUser = new Mnemonic('select scout crash enforce riot rival spring whale hollow radar rule sentence') const hdUserPrivateKey = codeUser.toHDPrivateKey() const derivative = 0 // BIP 44 derivation path for private key... const privateKey = hdUserPrivateKey.deriveChild(`m/44'/0'/0'/0/${derivative}`).privateKey
這種方法有效還是我在迴避 BIP44 標準?
事實上,這是 BIP 44 的預期方法和用途。
目的是通過強化派生派生到賬戶級別。然後導出那個xpub,導入到其他導出接收地址和更改地址的軟體中。簽署交易時,帶有私鑰的錢包可以推導出整個路徑,以獲取簽名所需的各個子私鑰。