Skip to content

Instantly share code, notes, and snippets.

@hellwolf
Created December 8, 2015 15:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hellwolf/d9e1e019b2cfca61a37d to your computer and use it in GitHub Desktop.
Save hellwolf/d9e1e019b2cfca61a37d to your computer and use it in GitHub Desktop.
using bitcoinjs-lib and test hardended/non-hardened extended keys concepts
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