Private-Key

具有 BIP44 的 HD 錢包 - 僅知道 xpub 派生公鑰的解決方法

  • January 22, 2021

我的目標:我不想需要私鑰來分層派生新地址。

當然,首先我可以創建一批地址,給定一個私鑰。但是一旦我超過了那個批次,我將再次需要私鑰來生成更多地址。

我想派生只知道公鑰的地址。我知道這對於 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,導入到其他導出接收地址和更改地址的軟體中。簽署交易時,帶有私鑰的錢包可以推導出整個路徑,以獲取簽名所需的各個子私鑰。

引用自:https://bitcoin.stackexchange.com/questions/101730