Created
December 8, 2015 15:35
-
-
Save hellwolf/d9e1e019b2cfca61a37d to your computer and use it in GitHub Desktop.
using bitcoinjs-lib and test hardended/non-hardened extended keys concepts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var bitcoin = require('bitcoinjs-lib'); | |
var network = bitcoin.networks.bitcoin; | |
var privateSeed = 'f9b64acde29b65ea8909f33380a7e87dc5f07b9437891cb8a0ef0e6fedc775e7fab0c846d45afb226c08d373f55a21c025410ee5a168a57000a8db9e8e3a29cb'; | |
console.log("privateSeed", privateSeed); | |
var master = bitcoin.HDNode.fromSeedHex(privateSeed, network); | |
// derive hardened node and its neutered version | |
var hardenedNode = deriveAccount(master, 0); | |
var hardenedNeutered = hardenedNode.neutered(); | |
var hardenedBase58 = hardenedNeutered.toBase58(); | |
console.log("hardenedBase58", hardenedBase58); | |
hardenedNode.deriveHardened(0); // hardened node can derive hardened child node | |
console.log("account.deriveHardened succeed"); | |
// storing neutered account on server, | |
// using which server can use to generate new addresses | |
var hardenedNode2 = bitcoin.HDNode.fromBase58(hardenedBase58, network); | |
console.log("hardenedNode2.toBase58", hardenedNode2.toBase58()); | |
try { | |
// neutered hardened node cannot derive hardened child node | |
hardenedNode2.deriveHardened(0); | |
console.error("! account2.deriveHardened should not succeed"); | |
} catch(e) { | |
console.log("account2.deriveHardened throws"); | |
} | |
var addressNode = hardenedNode2.derive(0).derive(1); | |
console.log("addressNode.toBase58", addressNode.toBase58()); | |
var address = addressNode.keyPair.getAddress(); | |
console.log("addresss", address); | |
// owner with privateSeed can recreate node with private key if node path | |
// is known | |
var addressNode2 = deriveAddress(master, 0, 1); | |
console.log("addressNode2.toBase58", addressNode2.toBase58()); | |
var address2 = addressNode2.keyPair.getAddress(); | |
console.log("addresss2", address2); | |
console.log("addressNode2.keyPair.d", addressNode2.keyPair.d.toString()); | |
// m/44'/0'/accountIndex'/0/1 <--- stored by the server | |
function deriveAccount(master, accountIndex) { | |
var node = master; | |
// BIP0044: | |
// purpose' | |
node = node.deriveHardened(44); | |
// coin_type' | |
node = node.deriveHardened(0); | |
// account' | |
node = node.deriveHardened(accountIndex); | |
return node; | |
} | |
function deriveAddress(master, accountIndex, addressIndex) { | |
var node = deriveAccount(master, accountIndex); | |
node = node.derive(0); | |
// address_index | |
node = node.derive(addressIndex); | |
return node; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment