From edab2d18a100a84757909d5a18f6b4a78caac3bd Mon Sep 17 00:00:00 2001 From: "Ryan X. Charles" Date: Wed, 2 Apr 2014 12:02:32 -0400 Subject: [PATCH 1/3] add BIP32 example ...and also update BIP32.seed to default to mainnet/livenet. --- BIP32.js | 2 +- examples/BIP32.js | 83 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 examples/BIP32.js diff --git a/BIP32.js b/BIP32.js index 7b70d0b..3360a30 100644 --- a/BIP32.js +++ b/BIP32.js @@ -50,7 +50,7 @@ var BIP32 = function(bytes) { BIP32.seed = function(bytes, network) { if (!network) - return false; + network = 'livenet'; if (!Buffer.isBuffer(bytes)) bytes = new Buffer(bytes, 'hex'); //if not buffer, assume hex diff --git a/examples/BIP32.js b/examples/BIP32.js new file mode 100644 index 0000000..7aa3d86 --- /dev/null +++ b/examples/BIP32.js @@ -0,0 +1,83 @@ +var run = function() { + bitcore = typeof (bitcore) === 'undefined' ? require('../bitcore') : bitcore; + var BIP32 = bitcore.BIP32; + var Address = bitcore.Address; + var networks = bitcore.networks; + var coinUtil = bitcore.util; + var crypto = require('crypto'); + + console.log('BIP32: Hierarchical Deterministic Wallets'); + console.log('https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki\n'); + console.log('1) Make new bip32 from randomly generated new seed'); + + var randomBytes = crypto.randomBytes(256); + var bip32 = BIP32.seed(randomBytes); + console.log('master extended private key: ' + bip32.extendedPrivateKeyString()); + console.log('master extended public key: ' + bip32.extendedPublicKeyString()); + console.log('m/0/3/5 extended private key: ' + bip32.derive('m/0/3/5').extendedPrivateKeyString()); + console.log('m/0/3/5 extended public key: ' + bip32.derive('m/0/3/5').extendedPublicKeyString()); + console.log(); + + console.log('2) Make new bip32 from known seed'); + var knownBytes = coinUtil.sha256('do not use this password as a brain wallet'); + var bip32 = BIP32.seed(knownBytes); + console.log('master extended private key: ' + bip32.extendedPrivateKeyString()); + console.log('master extended public key: ' + bip32.extendedPublicKeyString()); + console.log('m/0/3/5 extended private key: ' + bip32.derive('m/0/3/5').extendedPrivateKeyString()); + console.log('m/0/3/5 extended public key: ' + bip32.derive('m/0/3/5').extendedPublicKeyString()); + console.log(); + + console.log('3) Make new bip32 from known master private key'); + var knownMasterPrivateKey = 'xprv9s21ZrQH143K2LvayFZWVVTomiDKheKWvnupDB8fmjKwxkKG47uvzmFa3vCXoy9fxPJhRYsU19apVfexvMeLpJQuF2XtX1zRF3eao9GqqaQ'; + var bip32 = new BIP32(knownMasterPrivateKey); + console.log('master extended private key: ' + bip32.extendedPrivateKeyString()); + console.log('master extended public key: ' + bip32.extendedPublicKeyString()); + console.log('m/0/3/5 extended private key: ' + bip32.derive('m/0/3/5').extendedPrivateKeyString()); + console.log('m/0/3/5 extended public key: ' + bip32.derive('m/0/3/5').extendedPublicKeyString()); + console.log(); + + console.log('4) Make new bip32 from known master public key'); + var knownMasterPublicKey = 'xpub661MyMwAqRbcGpiFufipqsKKBG1NHNwfJKishAEFNqJ6ryLcKeKyFNEZces7gMWd4XGg4uUhXy8DS64o1oPGUECVHeLq957Txjwagxt475H'; + var bip32 = new BIP32(knownMasterPublicKey); + console.log('master extended private key: cannot derive'); + console.log('master extended public key: ' + bip32.extendedPublicKeyString()); + console.log('m/0/3/5 extended private key: cannot derive'); + console.log('m/0/3/5 extended public key: ' + bip32.derive('m/0/3/5').extendedPublicKeyString()); + console.log(); + + console.log('5) Make new bip32 from knowan derived public key'); + var knownPublicKey = 'xpub6CZei1p2zk68UwkcBDqzRonLHJWAiPZZ58sMgHJAn9fmpmnPayVEAvAs3XvTSUMZ1J8dNaxnv4wnt7YpRKr6BsqeWbW8msqeuuhiSzsQEC3'; + var bip32 = new BIP32(knownPublicKey); + console.log('master extended private key: cannot derive'); + console.log('master extended public key: ' + bip32.extendedPublicKeyString()); + console.log('m/0/3/5 extended private key: cannot derive'); + console.log('m/0/3/5 extended public key: ' + bip32.derive('m/0/3/5').extendedPublicKeyString()); + console.log(); + + console.log('6) Make a bunch of new addresses from known public key'); + var knownPublicKey = 'xpub6CZei1p2zk68UwkcBDqzRonLHJWAiPZZ58sMgHJAn9fmpmnPayVEAvAs3XvTSUMZ1J8dNaxnv4wnt7YpRKr6BsqeWbW8msqeuuhiSzsQEC3'; + var bip32 = new BIP32(knownPublicKey); + console.log('m/0 address: ' + new Address(networks['livenet'].addressVersion, bip32.derive('m/0').eckey.public).toString()); + //console.log('m/1 extended public key: ' + bip32.derive('m/1').extendedPublicKeyString()); + console.log('m/1 address: ' + new Address(networks['livenet'].addressVersion, bip32.derive('m/1').eckey.public).toString()); + //console.log('m/2 extended public key: ' + bip32.derive('m/2').extendedPublicKeyString()); + console.log('m/2 address: ' + new Address(networks['livenet'].addressVersion, bip32.derive('m/2').eckey.public).toString()); + //console.log('m/3 extended public key: ' + bip32.derive('m/3').extendedPublicKeyString()); + console.log('m/3 address: ' + new Address(networks['livenet'].addressVersion, bip32.derive('m/3').eckey.public).toString()); + console.log('...'); + //console.log('m/100 extended public key: ' + bip32.derive('m/100').extendedPublicKeyString()); + console.log('m/100 address: ' + new Address(networks['livenet'].addressVersion, bip32.derive('m/100').eckey.public).toString()); + console.log(); + +}; + + +// This is just for browser & mocha compatibility +if (typeof module !== 'undefined') { + module.exports.run = run; + if (require.main === module) { + run(); + } +} else { + run(); +} From 710be7b1479da3542687ff89d02b8afd5d05af0e Mon Sep 17 00:00:00 2001 From: "Ryan X. Charles" Date: Wed, 2 Apr 2014 12:05:11 -0400 Subject: [PATCH 2/3] add BIP32 example to examples tests --- test/test.examples.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test.examples.js b/test/test.examples.js index 2017691..bd63187 100644 --- a/test/test.examples.js +++ b/test/test.examples.js @@ -7,6 +7,7 @@ var unmute = require('./mute').unmute; var examples = [ 'Address', + 'BIP32', 'PeerManager', 'Rpc', 'SendTx', From 009949735e1d6387823a317939e6ed2e04a4a6be Mon Sep 17 00:00:00 2001 From: "Ryan X. Charles" Date: Wed, 2 Apr 2014 12:26:38 -0400 Subject: [PATCH 3/3] correct typo: "knowan" -> "known" --- examples/BIP32.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/BIP32.js b/examples/BIP32.js index 7aa3d86..825e0ce 100644 --- a/examples/BIP32.js +++ b/examples/BIP32.js @@ -45,7 +45,7 @@ var run = function() { console.log('m/0/3/5 extended public key: ' + bip32.derive('m/0/3/5').extendedPublicKeyString()); console.log(); - console.log('5) Make new bip32 from knowan derived public key'); + console.log('5) Make new bip32 from known derived public key'); var knownPublicKey = 'xpub6CZei1p2zk68UwkcBDqzRonLHJWAiPZZ58sMgHJAn9fmpmnPayVEAvAs3XvTSUMZ1J8dNaxnv4wnt7YpRKr6BsqeWbW8msqeuuhiSzsQEC3'; var bip32 = new BIP32(knownPublicKey); console.log('master extended private key: cannot derive');