Wallet

從nodejs中的種子片語生成多個公共比特幣接收地址(HD錢包)

  • June 8, 2020

我想為每個新使用者為我的比特幣錢包生成一個新的接收地址。轉移到所有這些地址的比特幣應該會在我的比特幣錢包中收到。我不想在伺服器上公開我的私鑰或種子。我發現這就是 HD 錢包的工作方式,所以我嘗試了這個。

const bip39 = require('bip39')
const bitcoin = require('bitcoinjs-lib')   //ver 3.0.2

let phrase = 'width humor wheat sad obscure outer ancient grab edit labor record express devote humble recipe occur refuse tooth original fluid learn scheme fuel assault';
let seedBuffer = bip39.mnemonicToSeedSync(phrase)
// <Buffer 85 19 18 81 cf 0e cc f7 9c 5d 61 ......

let masterNode = bitcoin.HDNode.fromSeedBuffer(seedBuffer)
// Deriving the first account based on BIP44
let account0 = masterNode.derivePath("m/44'/0'/0'")

let xpubString = account0.neutered().toBase58()
console.log(xpubString)
let address0FromXpub = bitcoin.HDNode.fromBase58(xpubString)


let address0 = address0FromXpub.derivePath("0/0").keyPair.getAddress()
let address1 = address0FromXpub.derivePath("0/1").keyPair.getAddress()
let address2 = address0FromXpub.derivePath("0/2").keyPair.getAddress()
let address3 = address0FromXpub.derivePath("0/3").keyPair.getAddress()
// address0.toBase58()
console.log("address0",address0)
console.log("address1",address1)
console.log("address2",address2)
console.log("address3",address3)

但我嘗試將比特幣發送到生成的地址,但沒有收到?如果有人可以幫忙。

如果你想在 nodejs 中做比特幣的事情,我推薦使用 bcoin:

回購:https ://github.com/bcoin-org/bcoin

文件、指南:https ://bcoin.io

它有一個完全驗證的全節點實現、SPV 實現和 BIP44 錢包,供 Purse.io 和其他幾個接受比特幣的商家用於這個確切的案例:每個客戶都有一個專用賬戶,錢包可以跟踪每個人的餘額。使用者,每次使用目前接收時生成新地址(la BIP44)

您可以使用僅限手錶的錢包設置您的伺服器以報告傳入的存款,並保持私鑰離線或更安全的本地機器上。

例子:

在安全或離線機器上:

$ bcoin --daemon
$ bwallet-cli mkwallet --witness=true --id=HOT
$ bwallet-cli --if=HOT account get default
{
 "name": "default",
 "initialized": true,
 "witness": false,
 "watchOnly": false,
 ..
 "accountKey": "tpubDD3BFBuLYg2cspeDSWZgo9qv4qYi7KQF5oov8theqbFRUFqXPmsowPqAY1PQqnEdUe5JrFqf8ZGWLwEQEKB5WjJjxgMwcXmFuu1XDrG4RSr",
 ..
}

在“熱”生產伺服器上:

$ bcoin --daemon
$ bwallet-cli mkwallet --id=WATCH --watch-only=true --account-key=tpubDD3BFBuLYg2cspeDSWZgo9qv4qYi7KQF5oov8theqbFRUFqXPmsowPqAY1PQqnEdUe5JrFqf8ZGWLwEQEKB5WjJjxgMwcXmFuu1XDrG4RSr
$ bwallet-cli --id=WATCH address default
{
 "name": "default",
 "account": 0,
 "branch": 0,
 "index": 1,
 "witness": false,
 "nested": false,
 "publicKey": "026f1afcab2942fd932760557943b287957bb8aa6ebe0f8dc64fa25862e23d52a2",
 "script": null,
 "program": null,
 "type": "pubkeyhash",
 "address": "mjdcszSLXHd6awrnM4bgJiFEbTFZdyw7de"
}

…等等

從這裡您可以使用 API 呼叫來創建交易模板並在離線機器上對其進行簽名。

如果您對執行比特幣的替代植入感到不安,您仍然可以在熱伺服器上執行 bitcoind 並在其後面執行 bcoin(即使在 SPV 模式下),將 bitcoind 作為它的--only=對等點,就像比特幣核心防火牆


(編輯)

生成靜態地址

'use strict';

const bcoin = require('bcoin');
const m = bcoin.Mnemonic.fromPhrase(
 'abandon abandon abandon abandon abandon abandon'
 + ' abandon abandon abandon abandon abandon about');
const master = bcoin.HDPrivateKey.fromMnemonic(m);
const key0 = master.derivePath("m'/44'/0'/0'/0/0");
const ring0 = new bcoin.KeyRing({privateKey: key0});
console.log(ring0)

將輸出:

{
 witness: false,
 nested: false,
 publicKey: '03aaeb52dd7494c361049de67cc680e83ebcbbbdbeb13637d92cd845f70308af5e',
 script: null,
 program: null,
 type: 'pubkeyhash',
 address: '1LqBGSKuX5yYUonjxT5qGfpUsXKYYWeabA'
}

您可以使用https://iancoleman.io/bip39/從該助記詞片語中驗證這是地址 0,當然,因為該片語非常不安全,並且被開發人員在主網上測試(嘆氣)使用,因此該地址有幾筆交易:<https://blockstream.info/address/1LqBGSKuX5yYUonjxT5qGfpUsXKYYWeabA>

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