diff --git a/examples.md b/examples.md index 8f30031..0a64d69 100755 --- a/examples.md +++ b/examples.md @@ -1,1104 +1,1192 @@ #Address.js - 'use strict'; - - - var run = function() { - // Replace '../bitcore' with 'bitcore' if you use this code elsewhere. - var bitcore = require('../bitcore'); - var Address = bitcore.Address; - - var addrs = [ - '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa', - '1A1zP1eP5QGefi2DMPTfTL5SLmv7Dixxxx', - 'A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa', - '1600 Pennsylvania Ave NW', - ].map(function(addr) { - return new Address(addr); - }); - - addrs.forEach(function(addr) { - var valid = addr.isValid(); - console.log(addr.data + ' is ' + (valid ? '' : 'not ') + 'valid'); - }); - - }; - - module.exports.run = run; - if (require.main === module) { - run(); - } - + +```js + +'use strict'; + +var run = function() { + // Replace '../bitcore' with 'bitcore' if you use this code elsewhere. + var bitcore = require('../bitcore'); + var Address = bitcore.Address; + + var addrs = [ + '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa', + '1A1zP1eP5QGefi2DMPTfTL5SLmv7Dixxxx', + 'A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa', + '1600 Pennsylvania Ave NW', + ].map(function(addr) { + return new Address(addr); + }); + + addrs.forEach(function(addr) { + var valid = addr.isValid(); + console.log(addr.data + ' is ' + (valid ? '' : 'not ') + 'valid'); + }); + +}; + +module.exports.run = run; +if (require.main === module) { + run(); +} + +``` + #Armory.js - var Armory = require('../lib/Armory'); - var Address = require('../lib/Address'); - - // Initial public key can be retrieved from paper backup - - var PublicX = '9df5 23e7 18b9 1f59 a790 2d46 999f 9357 ccf8 7208 24d4 3076 4516 b809 f7ab ce4e'; - var PublicY = '66ba 5d21 4682 0dae 401d 9506 8437 2516 79f9 0c56 4186 cc50 07df c6d0 6989 1ff4'; - var pubkey = '04' + PublicX.split(' ').join('') + PublicY.split(' ').join(''); - - // Chain code can be generated by entering paper backup - // on brainwallet.org/#chains or by using Armory.fromSeed() below - - var chaincode = '84ac14bc4b388b33da099a0b4ee3b507284d99e1476639e36e5ca5e6af86481e'; - - var armory = new Armory(chaincode, pubkey); - - console.log('Deriving public keys for'); - console.log('------------------------'); - console.log('Chain code: %s', chaincode); - console.log('Public key: %s', pubkey); - console.log(''); - - for (var i = 0; i < 5; i++) { - console.log(Address.fromPubKey(armory.pubkey).as('base58')); - armory = armory.next(); - } - - // Derive first public key and chain code from seed - var seed = [ - 'aagh hjfj sihk ietj giik wwai awtd uodh hnji', - 'soss uaku egod utai itos fijj ihgi jhau jtoo' - ]; - - console.log(''); - console.log(''); - console.log('Deriving public keys for'); - console.log('------------------------'); - console.log('Seed: %s', seed.join(' ')); - console.log(''); - - // skip first public key - var a = Armory.fromSeed(seed.join('\n')).next(); - - for (var i = 0; i < 5; i++) { - console.log(Address.fromPubKey(a.pubkey).as('base58')); - a = a.next(); - } - - - var mpk = '045a09a3286873a72f164476bde9d1d8e5c2bc044e35aa47eb6e798e325a86417f7c35b61d9905053533e0b4f2a26eca0330aadf21c638969e45aaace50e4c0c8784ac14bc4b388b33da099a0b4ee3b507284d99e1476639e36e5ca5e6af86481e'; - - console.log(''); - console.log(''); - console.log('Deriving public keys for'); - console.log('------------------------'); - console.log('Master Public Key: %s', mpk); - console.log(''); - - // skip first public key - var b = Armory.fromMasterPublicKey(mpk).next(); - - for (var i = 0; i < 5; i++) { - console.log(Address.fromPubKey(b.pubkey).as('base58')); - b = b.next(); - } - + +```js + +var Armory = require('../lib/Armory'); +var Address = require('../lib/Address'); + +// Initial public key can be retrieved from paper backup + +var PublicX = '9df5 23e7 18b9 1f59 a790 2d46 999f 9357 ccf8 7208 24d4 3076 4516 b809 f7ab ce4e'; +var PublicY = '66ba 5d21 4682 0dae 401d 9506 8437 2516 79f9 0c56 4186 cc50 07df c6d0 6989 1ff4'; +var pubkey = '04' + PublicX.split(' ').join('') + PublicY.split(' ').join(''); + +// Chain code can be generated by entering paper backup +// on brainwallet.org/#chains or by using Armory.fromSeed() below + +var chaincode = '84ac14bc4b388b33da099a0b4ee3b507284d99e1476639e36e5ca5e6af86481e'; + +var armory = new Armory(chaincode, pubkey); + +console.log('Deriving public keys for'); +console.log('------------------------'); +console.log('Chain code: %s', chaincode); +console.log('Public key: %s', pubkey); +console.log(''); + +for (var i = 0; i < 5; i++) { + console.log(Address.fromPubKey(armory.pubkey).as('base58')); + armory = armory.next(); +} + +// Derive first public key and chain code from seed +var seed = [ + 'aagh hjfj sihk ietj giik wwai awtd uodh hnji', + 'soss uaku egod utai itos fijj ihgi jhau jtoo' +]; + +console.log(''); +console.log(''); +console.log('Deriving public keys for'); +console.log('------------------------'); +console.log('Seed: %s', seed.join(' ')); +console.log(''); + +// skip first public key +var a = Armory.fromSeed(seed.join('\n')).next(); + +for (var i = 0; i < 5; i++) { + console.log(Address.fromPubKey(a.pubkey).as('base58')); + a = a.next(); +} + + +var mpk = '045a09a3286873a72f164476bde9d1d8e5c2bc044e35aa47eb6e798e325a86417f7c35b61d9905053533e0b4f2a26eca0330aadf21c638969e45aaace50e4c0c8784ac14bc4b388b33da099a0b4ee3b507284d99e1476639e36e5ca5e6af86481e'; + +console.log(''); +console.log(''); +console.log('Deriving public keys for'); +console.log('------------------------'); +console.log('Master Public Key: %s', mpk); +console.log(''); + +// skip first public key +var b = Armory.fromMasterPublicKey(mpk).next(); + +for (var i = 0; i < 5; i++) { + console.log(Address.fromPubKey(b.pubkey).as('base58')); + b = b.next(); +} + +``` + #ConnectionTor.js - var Peer = require('../lib/Peer'); - var Connection = require('../lib/Connection'); - var dns = require('dns'); - - // get a peer from dns seed - dns.resolve('dnsseed.bluematt.me', function(err, seeds) { - // use the first peer - var peer = new Peer(seeds[0], 8333); - - //Custom peer: - //var peer = new Peer('180.153.139.246', '8888'); - - // create a connection without an existing socket - // but specify a socks5 proxy to create a socket - // that's bound to that proxy in it's place - var connection = new Connection(null, peer, { - proxy: { - host: '127.0.0.1', - port: 9050 - } - }); - - connection.open(); - - connection.on('connect', function(data) { - console.log('connected through socks5!'); - }); - - connection.on('error', function(err) { - console.log('There was an error running this example.'); - console.log('Are you running Tor? Tor must running for this example to work.'); - console.log('If you still get an error, you may need to use a different proxy from here:'); - console.log('http://sockslist.net/'); - //console.log(err); - }); - - }); - + +```js + +var Peer = require('../lib/Peer'); +var Connection = require('../lib/Connection'); +var dns = require('dns'); + +// get a peer from dns seed +dns.resolve('dnsseed.bluematt.me', function(err, seeds) { + // use the first peer + var peer = new Peer(seeds[0], 8333); + + //Custom peer: + //var peer = new Peer('180.153.139.246', '8888'); + + // create a connection without an existing socket + // but specify a socks5 proxy to create a socket + // that's bound to that proxy in it's place + var connection = new Connection(null, peer, { + proxy: { + host: '127.0.0.1', + port: 9050 + } + }); + + connection.open(); + + connection.on('connect', function(data) { + console.log('connected through socks5!'); + }); + + connection.on('error', function(err) { + console.log('There was an error running this example.'); + console.log('Are you running Tor? Tor must running for this example to work.'); + console.log('If you still get an error, you may need to use a different proxy from here:'); + console.log('http://sockslist.net/'); + //console.log(err); + }); + +}); + +``` + #CreateAndSignTx-Multisig.js - var run = function() { - bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore; - var networks = require('../networks'); - var WalletKey = bitcore.WalletKey; - var Builder = bitcore.TransactionBuilder; - var opts = { - network: networks.testnet - }; - - console.log('## Network: ' + opts.network.name); - - var input = {}; - input.addr = "n2hoFVbPrYQf7RJwiRy1tkbuPPqyhAEfbp"; - input.priv = "cS62Ej4SobZnpFQYN1PEEBr2KWf5sgRYYnELtumcG6WVCfxno39V"; - - // Complete with the corresponding UTXO you want to use - var utxos = [{ - address: input.addr, - txid: "39c71ebda371f75f4b854a720eaf9898b237facf3c2b101b58cd4383a44a6adc", - vout: 1, - scriptPubKey: "76a914e867aad8bd361f57c50adc37a0c018692b5b0c9a88ac", - amount: 0.4296, - confirmations: 2 - }]; - - var privs = [ - "cP6JBHuQf7yqeqtdKRd22ibF3VehDv7G6BdzxSNABgrv3jFJUGoN", - "cQfRwF7XLSM5xGUpF8PZvob2MZyULvZPA2j5cat2RKDJrja7FtCZ", - "cUkYub4jtFVYymHh38yMMW36nJB4pXG5Pzd5QjResq79kAndkJcg", - "cMyBgowsyrJRufoKWob73rMQB1PBqDdwFt8z4TJ6APN2HkmX1Ttm", - "cN9yZCom6hAZpHtCp8ovE1zFa7RqDf3Cr4W6AwH2tp59Jjh9JcXu", - ]; - - var pubkeys = [] - privs.forEach(function(p) { - var wk = new WalletKey(opts); - wk.fromObj({ - priv: p - }); - pubkeys.push(bitcore.buffertools.toHex(wk.privKey.public)); - }); - - - var outs = [{ - nreq: 3, - pubkeys: pubkeys, - amount: 0.05 - }]; - var tx = new Builder(opts) - .setUnspent(utxos) - .setOutputs(outs) - .sign([input.priv]) - .build(); - var txHex = tx.serialize().toString('hex'); - console.log('1) SEND TO MULSISIG TX: ', txHex); - console.log('[this example originally generated TXID: e4bc22d8c519d3cf848d710619f8480be56176a4a6548dfbe865ab3886b578b5 on testnet]\n\n\thttp://test.bitcore.io/tx/e4bc22d8c519d3cf848d710619f8480be56176a4a6548dfbe865ab3886b578b5\n\n'); - - - //save scriptPubKey - var scriptPubKey = tx.outs[0].s.toString('hex'); - - /* - * - * REDDEEM TX - */ - var utxos2 = [{ - address: input.addr, - txid: "e4bc22d8c519d3cf848d710619f8480be56176a4a6548dfbe865ab3886b578b5", - vout: 0, - scriptPubKey: scriptPubKey, - amount: 0.05, - confirmations: 2 - }]; - - outs = [{ - address: input.addr, - amount: 0.04 - }]; - var b = new Builder(opts) - .setUnspent(utxos2) - .setOutputs(outs) - .sign(privs); - - - tx = b.build(); - - - var txHex = tx.serialize().toString('hex'); - console.log('2) REDEEM SCRIPT: ', txHex); - console.log('=> Is signed status:', b.isFullySigned(), tx.countInputMissingSignatures(0)); - - console.log('[this example originally generated TXID: 1eb388977b2de99562eb0fbcc661a100eaffed99c53bfcfebe5a087002039b83 on testnet]\n\n\thttp://test.bitcore.io/tx/1eb388977b2de99562eb0fbcc661a100eaffed99c53bfcfebe5a087002039b83'); - - }; - - // This is just for browser & mocha compatibility - if (typeof module !== 'undefined') { - module.exports.run = run; - if (require.main === module) { - run(); - } - } else { - run(); - } - - //// - + +```js + +var run = function() { + bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore; + var networks = require('../networks'); + var WalletKey = bitcore.WalletKey; + var Builder = bitcore.TransactionBuilder; + var opts = { + network: networks.testnet + }; + + console.log('## Network: ' + opts.network.name); + + var input = {}; + input.addr = "n2hoFVbPrYQf7RJwiRy1tkbuPPqyhAEfbp"; + input.priv = "cS62Ej4SobZnpFQYN1PEEBr2KWf5sgRYYnELtumcG6WVCfxno39V"; + + // Complete with the corresponding UTXO you want to use + var utxos = [{ + address: input.addr, + txid: "39c71ebda371f75f4b854a720eaf9898b237facf3c2b101b58cd4383a44a6adc", + vout: 1, + scriptPubKey: "76a914e867aad8bd361f57c50adc37a0c018692b5b0c9a88ac", + amount: 0.4296, + confirmations: 2 + }]; + + var privs = [ + "cP6JBHuQf7yqeqtdKRd22ibF3VehDv7G6BdzxSNABgrv3jFJUGoN", + "cQfRwF7XLSM5xGUpF8PZvob2MZyULvZPA2j5cat2RKDJrja7FtCZ", + "cUkYub4jtFVYymHh38yMMW36nJB4pXG5Pzd5QjResq79kAndkJcg", + "cMyBgowsyrJRufoKWob73rMQB1PBqDdwFt8z4TJ6APN2HkmX1Ttm", + "cN9yZCom6hAZpHtCp8ovE1zFa7RqDf3Cr4W6AwH2tp59Jjh9JcXu", + ]; + + var pubkeys = [] + privs.forEach(function(p) { + var wk = new WalletKey(opts); + wk.fromObj({ + priv: p + }); + pubkeys.push(bitcore.buffertools.toHex(wk.privKey.public)); + }); + + + var outs = [{ + nreq: 3, + pubkeys: pubkeys, + amount: 0.05 + }]; + var tx = new Builder(opts) + .setUnspent(utxos) + .setOutputs(outs) + .sign([input.priv]) + .build(); + var txHex = tx.serialize().toString('hex'); + console.log('1) SEND TO MULSISIG TX: ', txHex); + console.log('[this example originally generated TXID: e4bc22d8c519d3cf848d710619f8480be56176a4a6548dfbe865ab3886b578b5 on testnet]\n\n\thttp://test.bitcore.io/tx/e4bc22d8c519d3cf848d710619f8480be56176a4a6548dfbe865ab3886b578b5\n\n'); + + + //save scriptPubKey + var scriptPubKey = tx.outs[0].s.toString('hex'); + + /* + * + * REDDEEM TX + */ + var utxos2 = [{ + address: input.addr, + txid: "e4bc22d8c519d3cf848d710619f8480be56176a4a6548dfbe865ab3886b578b5", + vout: 0, + scriptPubKey: scriptPubKey, + amount: 0.05, + confirmations: 2 + }]; + + outs = [{ + address: input.addr, + amount: 0.04 + }]; + var b = new Builder(opts) + .setUnspent(utxos2) + .setOutputs(outs) + .sign(privs); + + + tx = b.build(); + + + var txHex = tx.serialize().toString('hex'); + console.log('2) REDEEM SCRIPT: ', txHex); + console.log('=> Is signed status:', b.isFullySigned(), tx.countInputMissingSignatures(0)); + + console.log('[this example originally generated TXID: 1eb388977b2de99562eb0fbcc661a100eaffed99c53bfcfebe5a087002039b83 on testnet]\n\n\thttp://test.bitcore.io/tx/1eb388977b2de99562eb0fbcc661a100eaffed99c53bfcfebe5a087002039b83'); + +}; + +// This is just for browser & mocha compatibility +if (typeof module !== 'undefined') { + module.exports.run = run; + if (require.main === module) { + run(); + } +} else { + run(); +} +//// + +``` + #CreateAndSignTx-PayToPubkeyHash.js - var run = function() { - bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore; - - var priv = 'cTgGUrcro89yUtKeG6gHBAS14r3qp25KwTTxG9d4kEzcFxecuZDm'; - var amt = '0.005'; - var toAddress = 'myuAQcCc1REUgXGsCTiYhZvPPc3XxZ36G1'; - var changeAddressString = 'moDz3jEo9q7CxjBDjmb13sL4SKkgo2AACE'; - - var utxos = [{ - address: "mqSjTad2TKbPcKQ3Jq4kgCkKatyN44UMgZ", - txid: "2ac165fa7a3a2b535d106a0041c7568d03b531e58aeccdd3199d7289ab12cfc1", - vout: 1, - scriptPubKey: "76a9146ce4e1163eb18939b1440c42844d5f0261c0338288ac", - amount: 0.01, - confirmations: 2 - }]; - - console.log('TX Data: BTC:' + amt + ' => ' + toAddress + ', change To:' + changeAddressString); - console.log('Unspends Outputs:', utxos); - - - var outs = [{ - address: toAddress, - amount: amt - }]; - var keys = [priv]; - var opts = { - remainderOut: { - address: changeAddressString - } - }; - var Builder = bitcore.TransactionBuilder; - - var tx = new Builder(opts) - .setUnspent(utxos) - .setOutputs(outs) - .sign(keys) - .build(); - - /* create and signing can be done in multiple steps using: - * - * var builder = new bitcore.TransactionBuilder(opts) - * .setUnspent(utxos) - * .setOutputs(outs); - * - * builder.sign(key1); - * builder.sign(key2); - * ... - * if (builder.isFullySigned()){ - * var tx = builder.build(); - * } - * - * The selected Unspent Outputs for the transaction can be retrieved with: - * - * var selectedUnspent = build.getSelectedUnspent(); - */ - - var txHex = tx.serialize().toString('hex'); - console.log('TX HEX IS: ', txHex); - }; - - // This is just for browser & mocha compatibility - if (typeof module !== 'undefined') { - module.exports.run = run; - if (require.main === module) { - run(); - } - } else { - run(); - } - - //// - + +```js + +var run = function() { + bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore; + + var priv = 'cTgGUrcro89yUtKeG6gHBAS14r3qp25KwTTxG9d4kEzcFxecuZDm'; + var amt = '0.005'; + var toAddress = 'myuAQcCc1REUgXGsCTiYhZvPPc3XxZ36G1'; + var changeAddressString = 'moDz3jEo9q7CxjBDjmb13sL4SKkgo2AACE'; + + var utxos = [{ + address: "mqSjTad2TKbPcKQ3Jq4kgCkKatyN44UMgZ", + txid: "2ac165fa7a3a2b535d106a0041c7568d03b531e58aeccdd3199d7289ab12cfc1", + vout: 1, + scriptPubKey: "76a9146ce4e1163eb18939b1440c42844d5f0261c0338288ac", + amount: 0.01, + confirmations: 2 + }]; + + console.log('TX Data: BTC:' + amt + ' => ' + toAddress + ', change To:' + changeAddressString); + console.log('Unspends Outputs:', utxos); + + + var outs = [{ + address: toAddress, + amount: amt + }]; + var keys = [priv]; + var opts = { + remainderOut: { + address: changeAddressString + } + }; + var Builder = bitcore.TransactionBuilder; + + var tx = new Builder(opts) + .setUnspent(utxos) + .setOutputs(outs) + .sign(keys) + .build(); + + /* create and signing can be done in multiple steps using: + * + * var builder = new bitcore.TransactionBuilder(opts) + * .setUnspent(utxos) + * .setOutputs(outs); + * + * builder.sign(key1); + * builder.sign(key2); + * ... + * if (builder.isFullySigned()){ + * var tx = builder.build(); + * } + * + * The selected Unspent Outputs for the transaction can be retrieved with: + * + * var selectedUnspent = build.getSelectedUnspent(); + */ + + var txHex = tx.serialize().toString('hex'); + console.log('TX HEX IS: ', txHex); +}; + +// This is just for browser & mocha compatibility +if (typeof module !== 'undefined') { + module.exports.run = run; + if (require.main === module) { + run(); + } +} else { + run(); +} +//// + +``` + #CreateAndSignTx-PayToScriptHash.js - var run = function() { - bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore; - var networks = require('../networks'); - var WalletKey = bitcore.WalletKey; - var Script = bitcore.Script; - var Builder = bitcore.TransactionBuilder; - var opts = { - network: networks.testnet - }; - - console.log('## Network: ' + opts.network.name); - - var input = {}; - input.addr = "n2hoFVbPrYQf7RJwiRy1tkbuPPqyhAEfbp"; - input.priv = "cS62Ej4SobZnpFQYN1PEEBr2KWf5sgRYYnELtumcG6WVCfxno39V"; - - // Complete with the corresponding UTXO you want to use - var utxos = [{ - address: "n2hoFVbPrYQf7RJwiRy1tkbuPPqyhAEfbp", - txid: "e4bc22d8c519d3cf848d710619f8480be56176a4a6548dfbe865ab3886b578b5", - vout: 1, - scriptPubKey: "76a914e867aad8bd361f57c50adc37a0c018692b5b0c9a88ac", - amount: 0.3795, - confirmations: 7 - }]; - - var privs = [ - "cMpKwGr5oxEacN95WFKNEq6tTcvi11regFwS3muHvGYVxMPJX8JA", - "cVf32m9MR4vxcPwKNJuPepUe8XrHD2z63eCk76d6njRGyCkXpkSM", - "cQ2sVRFX4jQYMLhWyzz6jTQ2xju51P36968ecXnPhRLKLH677eKR", - "cSw7x9ERcmeWCU3yVBT6Nz7b9JiZ5yjUB7JMhBUv9UM7rSaDpwX9", - "cRQBM8qM4ZXJGP1De4D5RtJm7Q6FNWQSMx7YExxzgn2ehjM3haxW", - ]; - - var pubkeys = [] - privs.forEach(function(p) { - var wk = new WalletKey(opts); - wk.fromObj({ - priv: p - }); - pubkeys.push(bitcore.buffertools.toHex(wk.privKey.public)); - }); - - // multisig p2sh - var opts = { - nreq: 3, - pubkeys: pubkeys - }; - - // p2scriphash p2sh - //var opts = [{address: an_address}]; - - var info = Builder.infoForP2sh(opts, 'testnet'); - var p2shScript = info.scriptBufHex; - var p2shAddress = info.address; - - - var outs = [{ - address: p2shAddress, - amount: 0.05 - }]; - var tx = new Builder(opts) - .setUnspent(utxos) - .setOutputs(outs) - .sign([input.priv]) - .build(); - - var txHex = tx.serialize().toString('hex'); - - - console.log('## p2sh address: ' + p2shAddress); //TODO - console.log('\n1) SEND TO P2SH TX: ', txHex); - console.log('[this example originally generated TXID: c2e50d1c8c581d8c4408378b751633f7eb86687fc5f0502be7b467173f275ae7 on testnet]\n\n\thttp://test.bitcore.io/tx/c2e50d1c8c581d8c4408378b751633f7eb86687fc5f0502be7b467173f275ae7\n\n'); - - //save scriptPubKey - var scriptPubKey = tx.outs[0].s.toString('hex'); - - /* - * - * REDDEEM TX - */ - var utxos2 = [{ - address: p2shAddress, - txid: "c2e50d1c8c581d8c4408378b751633f7eb86687fc5f0502be7b467173f275ae7", - vout: 0, - scriptPubKey: scriptPubKey, - amount: 0.05, - confirmations: 1 - }]; - - outs = [{ - address: input.addr, - amount: 0.04 - }]; - - var hashMap = {}; - hashMap[p2shAddress] = p2shScript; - - var b = new Builder(opts) - .setUnspent(utxos2) - .setHashToScriptMap(hashMap) - .setOutputs(outs) - .sign(privs); - - tx = b.build(); - - - console.log('Builder:'); - console.log('\tSignatures:' + tx.countInputMissingSignatures(0)); - console.log('\t#isFullySigned:' + b.isFullySigned()); - - console.log('TX:'); - console.log('\t #isComplete:' + tx.isComplete()); - - var txHex = tx.serialize().toString('hex'); - console.log('2) REDEEM SCRIPT: ', txHex); - console.log('[this example originally generated TXID: 8284aa3b6f9c71c35ecb1d61d05ae78c8ca1f36940eaa615b50584dfc3d95cb7 on testnet]\n\n\thttp://test.bitcore.io/tx/8284aa3b6f9c71c35ecb1d61d05ae78c8ca1f36940eaa615b50584dfc3d95cb7\n\n'); - - /* - // To send TX with RPC: - var RpcClient = bitcore.RpcClient; - var config = { - protocol: 'http', - user: 'user', - pass: 'pass', - host: '127.0.0.1', - port: '18332', - }; - var rpc = new RpcClient(config); - rpc.sendRawTransaction(txHex, function(err, ret) { - console.log('err', err); //TODO - console.log('ret', ret); //TODO - process.exit(-1); - }); - }; - */ - - }; - - - // This is just for browser & mocha compatibility - if (typeof module !== 'undefined') { - module.exports.run = run; - if (require.main === module) { - run(); - } - } else { - run(); - } - + +```js + +var run = function() { + bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore; + var networks = require('../networks'); + var WalletKey = bitcore.WalletKey; + var Script = bitcore.Script; + var Builder = bitcore.TransactionBuilder; + var opts = { + network: networks.testnet + }; + + console.log('## Network: ' + opts.network.name); + + var input = {}; + input.addr = "n2hoFVbPrYQf7RJwiRy1tkbuPPqyhAEfbp"; + input.priv = "cS62Ej4SobZnpFQYN1PEEBr2KWf5sgRYYnELtumcG6WVCfxno39V"; + + // Complete with the corresponding UTXO you want to use + var utxos = [{ + address: "n2hoFVbPrYQf7RJwiRy1tkbuPPqyhAEfbp", + txid: "e4bc22d8c519d3cf848d710619f8480be56176a4a6548dfbe865ab3886b578b5", + vout: 1, + scriptPubKey: "76a914e867aad8bd361f57c50adc37a0c018692b5b0c9a88ac", + amount: 0.3795, + confirmations: 7 + }]; + + var privs = [ + "cMpKwGr5oxEacN95WFKNEq6tTcvi11regFwS3muHvGYVxMPJX8JA", + "cVf32m9MR4vxcPwKNJuPepUe8XrHD2z63eCk76d6njRGyCkXpkSM", + "cQ2sVRFX4jQYMLhWyzz6jTQ2xju51P36968ecXnPhRLKLH677eKR", + "cSw7x9ERcmeWCU3yVBT6Nz7b9JiZ5yjUB7JMhBUv9UM7rSaDpwX9", + "cRQBM8qM4ZXJGP1De4D5RtJm7Q6FNWQSMx7YExxzgn2ehjM3haxW", + ]; + + var pubkeys = [] + privs.forEach(function(p) { + var wk = new WalletKey(opts); + wk.fromObj({ + priv: p + }); + pubkeys.push(bitcore.buffertools.toHex(wk.privKey.public)); + }); + + // multisig p2sh + var opts = { + nreq: 3, + pubkeys: pubkeys + }; + + // p2scriphash p2sh + //var opts = [{address: an_address}]; + + var info = Builder.infoForP2sh(opts, 'testnet'); + var p2shScript = info.scriptBufHex; + var p2shAddress = info.address; + + + var outs = [{ + address: p2shAddress, + amount: 0.05 + }]; + var tx = new Builder(opts) + .setUnspent(utxos) + .setOutputs(outs) + .sign([input.priv]) + .build(); + + var txHex = tx.serialize().toString('hex'); + + + console.log('## p2sh address: ' + p2shAddress); //TODO + console.log('\n1) SEND TO P2SH TX: ', txHex); + console.log('[this example originally generated TXID: c2e50d1c8c581d8c4408378b751633f7eb86687fc5f0502be7b467173f275ae7 on testnet]\n\n\thttp://test.bitcore.io/tx/c2e50d1c8c581d8c4408378b751633f7eb86687fc5f0502be7b467173f275ae7\n\n'); + + //save scriptPubKey + var scriptPubKey = tx.outs[0].s.toString('hex'); + + /* + * + * REDDEEM TX + */ + var utxos2 = [{ + address: p2shAddress, + txid: "c2e50d1c8c581d8c4408378b751633f7eb86687fc5f0502be7b467173f275ae7", + vout: 0, + scriptPubKey: scriptPubKey, + amount: 0.05, + confirmations: 1 + }]; + + outs = [{ + address: input.addr, + amount: 0.04 + }]; + + var hashMap = {}; + hashMap[p2shAddress] = p2shScript; + + var b = new Builder(opts) + .setUnspent(utxos2) + .setHashToScriptMap(hashMap) + .setOutputs(outs) + .sign(privs); + + tx = b.build(); + + + console.log('Builder:'); + console.log('\tSignatures:' + tx.countInputMissingSignatures(0)); + console.log('\t#isFullySigned:' + b.isFullySigned()); + + console.log('TX:'); + console.log('\t #isComplete:' + tx.isComplete()); + + var txHex = tx.serialize().toString('hex'); + console.log('2) REDEEM SCRIPT: ', txHex); + console.log('[this example originally generated TXID: 8284aa3b6f9c71c35ecb1d61d05ae78c8ca1f36940eaa615b50584dfc3d95cb7 on testnet]\n\n\thttp://test.bitcore.io/tx/8284aa3b6f9c71c35ecb1d61d05ae78c8ca1f36940eaa615b50584dfc3d95cb7\n\n'); + + /* + // To send TX with RPC: + var RpcClient = bitcore.RpcClient; + var config = { + protocol: 'http', + user: 'user', + pass: 'pass', + host: '127.0.0.1', + port: '18332', + }; + var rpc = new RpcClient(config); + rpc.sendRawTransaction(txHex, function(err, ret) { + console.log('err', err); //TODO + console.log('ret', ret); //TODO + process.exit(-1); + }); +}; +*/ + +}; + + +// This is just for browser & mocha compatibility +if (typeof module !== 'undefined') { + module.exports.run = run; + if (require.main === module) { + run(); + } +} else { + run(); +} + +``` + #CreateKey.js - 'use strict'; - - - - var run = function() { - // replace '../bitcore' with 'bitcore' if you use this code elsewhere. - var bitcore = require('../bitcore'); - var networks = require('../networks'); - var WalletKey = bitcore.WalletKey; - - var opts = { - network: networks.testnet - }; - - function print(wk) { - - console.log('\n## Network: ' + wk.network.name); - console.log('\t * Hex Representation'); - console.log('\tPrivate: ' + bitcore.buffertools.toHex(wk.privKey.private)); - console.log('\tPublic : ' + bitcore.buffertools.toHex(wk.privKey.public)); - console.log('\tPublic Compressed : ' + (wk.privKey.compressed ? 'Yes' : 'No')); - - var wkObj = wk.storeObj(); - console.log('\n\t * WalletKey Store Object'); - console.log('\tPrivate: ' + wkObj.priv); - console.log('\tPublic : ' + wkObj.pub); - console.log('\tAddr : ' + wkObj.addr); - }; - - //Generate a new one (compressed public key, compressed WIF flag) - var wk = new WalletKey(opts); - wk.generate(); - print(wk); - - //Generate from private Key WIF. Compressed status taken from WIF. - var wk2 = new WalletKey(opts); - wk2.fromObj({ - priv: 'cMpKwGr5oxEacN95WFKNEq6tTcvi11regFwS3muHvGYVxMPJX8JA' - }); - print(wk2); - - - }; - - module.exports.run = run; - if (require.main === module) { - run(); - } - + +```js + +'use strict'; + +var run = function() { + // replace '../bitcore' with 'bitcore' if you use this code elsewhere. + var bitcore = require('../bitcore'); + var networks = require('../networks'); + var WalletKey = bitcore.WalletKey; + + var opts = { + network: networks.testnet + }; + + function print(wk) { + + console.log('\n## Network: ' + wk.network.name); + console.log('\t * Hex Representation'); + console.log('\tPrivate: ' + bitcore.buffertools.toHex(wk.privKey.private)); + console.log('\tPublic : ' + bitcore.buffertools.toHex(wk.privKey.public)); + console.log('\tPublic Compressed : ' + (wk.privKey.compressed ? 'Yes' : 'No')); + + var wkObj = wk.storeObj(); + console.log('\n\t * WalletKey Store Object'); + console.log('\tPrivate: ' + wkObj.priv); + console.log('\tPublic : ' + wkObj.pub); + console.log('\tAddr : ' + wkObj.addr); + }; + + //Generate a new one (compressed public key, compressed WIF flag) + var wk = new WalletKey(opts); + wk.generate(); + print(wk); + + //Generate from private Key WIF. Compressed status taken from WIF. + var wk2 = new WalletKey(opts); + wk2.fromObj({ + priv: 'cMpKwGr5oxEacN95WFKNEq6tTcvi11regFwS3muHvGYVxMPJX8JA' + }); + print(wk2); + + +}; + +module.exports.run = run; +if (require.main === module) { + run(); +} + +``` + #CreateScript.js - 'use strict'; - - var run = function() { - // replace '../bitcore' with 'bitcore' if you use this code elsewhere. - var bitcore = require('../bitcore'); - var networks = require('../networks'); - var Script = bitcore.Script; - var WalletKey = bitcore.WalletKey; - var buffertools = bitcore.buffertools; - var Address = bitcore.Address; - var util = bitcore.util; - var opts = { - network: networks.testnet - }; - - var p = console.log; - - var wk = new WalletKey(opts); - wk.generate(); - var wkObj = wk.storeObj(); - - var s = Script.createPubKeyOut(wk.privKey.public); - p('\nScript PubKey:'); - p('\tHex : ' + buffertools.toHex(s.buffer)); - p('\tHuman : ' + s.toHumanReadable()); - p('\tKey -------------------------------'); - console.log('\tPrivate: ' + wkObj.priv); - console.log('\tPublic : ' + wkObj.pub); - console.log('\tAddr : ' + wkObj.addr); - - s = Script.createPubKeyHashOut(wk.privKey.public); - p('\nScript PubKeyHash:'); - p('\tHex : ' + buffertools.toHex(s.buffer)); - p('\tHuman : ' + s.toHumanReadable()); - p('\tKey -------------------------------'); - console.log('\tPrivate: ' + wkObj.priv); - console.log('\tPublic : ' + wkObj.pub); - console.log('\tAddr : ' + wkObj.addr); - - var wks = []; - var pubs = []; - for (var i = 0; i < 5; i++) { - wks[i] = new WalletKey(opts); - wks[i].generate(); - pubs.push(wks[i].privKey.public); - } - - s = Script.createMultisig(3, pubs); - p('\nScript MultiSig (3 out of 5 required signatures):'); - p('\tHex : ' + buffertools.toHex(s.buffer)); - p('\tHuman : ' + s.toHumanReadable()); - - for (i = 0; i < 5; i++) { - wkObj = wks[i].storeObj(); - p('\tKey [' + i + '] -------------------------------'); - console.log('\tPrivate: ' + wkObj.priv); - console.log('\tPublic : ' + wkObj.pub); - console.log('\tAddr : ' + wkObj.addr); - } - - var hash = util.sha256ripe160(s.buffer); - - s = Script.createP2SH(hash); - p('\nScript P2SH:'); - p('\tHex : ' + buffertools.toHex(s.buffer)); - p('\tHuman : ' + s.toHumanReadable()); - p('\tScript Hash: ' + buffertools.toHex(hash)); - var a = new Address(networks.livenet.P2SHVersion, hash); - p('\tp2sh Addr: ' + a.toString()); - - }; - - module.exports.run = run; - if (require.main === module) { - run(); - } - + +```js + +'use strict'; + +var run = function() { + // replace '../bitcore' with 'bitcore' if you use this code elsewhere. + var bitcore = require('../bitcore'); + var networks = require('../networks'); + var Script = bitcore.Script; + var WalletKey = bitcore.WalletKey; + var buffertools = bitcore.buffertools; + var Address = bitcore.Address; + var util = bitcore.util; + var opts = { + network: networks.testnet + }; + + var p = console.log; + + var wk = new WalletKey(opts); + wk.generate(); + var wkObj = wk.storeObj(); + + var s = Script.createPubKeyOut(wk.privKey.public); + p('\nScript PubKey:'); + p('\tHex : ' + buffertools.toHex(s.buffer)); + p('\tHuman : ' + s.toHumanReadable()); + p('\tKey -------------------------------'); + console.log('\tPrivate: ' + wkObj.priv); + console.log('\tPublic : ' + wkObj.pub); + console.log('\tAddr : ' + wkObj.addr); + + s = Script.createPubKeyHashOut(wk.privKey.public); + p('\nScript PubKeyHash:'); + p('\tHex : ' + buffertools.toHex(s.buffer)); + p('\tHuman : ' + s.toHumanReadable()); + p('\tKey -------------------------------'); + console.log('\tPrivate: ' + wkObj.priv); + console.log('\tPublic : ' + wkObj.pub); + console.log('\tAddr : ' + wkObj.addr); + + var wks = []; + var pubs = []; + for (var i = 0; i < 5; i++) { + wks[i] = new WalletKey(opts); + wks[i].generate(); + pubs.push(wks[i].privKey.public); + } + + s = Script.createMultisig(3, pubs); + p('\nScript MultiSig (3 out of 5 required signatures):'); + p('\tHex : ' + buffertools.toHex(s.buffer)); + p('\tHuman : ' + s.toHumanReadable()); + + for (i = 0; i < 5; i++) { + wkObj = wks[i].storeObj(); + p('\tKey [' + i + '] -------------------------------'); + console.log('\tPrivate: ' + wkObj.priv); + console.log('\tPublic : ' + wkObj.pub); + console.log('\tAddr : ' + wkObj.addr); + } + + var hash = util.sha256ripe160(s.buffer); + + s = Script.createP2SH(hash); + p('\nScript P2SH:'); + p('\tHex : ' + buffertools.toHex(s.buffer)); + p('\tHuman : ' + s.toHumanReadable()); + p('\tScript Hash: ' + buffertools.toHex(hash)); + var a = new Address(networks.livenet.P2SHVersion, hash); + p('\tp2sh Addr: ' + a.toString()); + +}; + +module.exports.run = run; +if (require.main === module) { + run(); +} + +``` + #ECIES.js - var run = function() { - bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore; - - console.log('ECIES: Elliptic Curve Integrated Encryption Scheme'); - console.log('A way of encrypting with a public key and decrypting with a private key.'); - - var key = bitcore.Key.generateSync(); - console.log('Private key: ' + key.private.toString('hex')); - console.log('Public key: ' + key.public.toString('hex')); - - var message = new Buffer('This is a message to be encrypted'); - console.log('Message: "' + message.toString() + '"'); - - var encrypted = bitcore.ECIES.encrypt(key.public, message); - console.log('Encrypted (with public key): ' + encrypted.toString('hex')); - - var decrypted = bitcore.ECIES.decrypt(key.private, encrypted); - console.log('Decrypted (with private key): "' + decrypted.toString() + '"'); - }; - - - // This is just for browser & mocha compatibility - if (typeof module !== 'undefined') { - module.exports.run = run; - if (require.main === module) { - run(); - } - } else { - run(); - } - + +```js + +var run = function() { + bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore; + + console.log('ECIES: Elliptic Curve Integrated Encryption Scheme'); + console.log('A way of encrypting with a public key and decrypting with a private key.'); + + var key = bitcore.Key.generateSync(); + console.log('Private key: ' + key.private.toString('hex')); + console.log('Public key: ' + key.public.toString('hex')); + + var message = new Buffer('This is a message to be encrypted'); + console.log('Message: "' + message.toString() + '"'); + + var encrypted = bitcore.ECIES.encrypt(key.public, message); + console.log('Encrypted (with public key): ' + encrypted.toString('hex')); + + var decrypted = bitcore.ECIES.decrypt(key.private, encrypted); + console.log('Decrypted (with private key): "' + decrypted.toString() + '"'); +}; + + +// This is just for browser & mocha compatibility +if (typeof module !== 'undefined') { + module.exports.run = run; + if (require.main === module) { + run(); + } +} else { + run(); +} + +``` + #ElectrumMPK.js - var Electrum = require('../lib/Electrum'); - var Address = require('../lib/Address'); - - var mpk = '92eea4d2f5263651db9e3222caded1fd4c89772f79a7c03fb6afc00e9d2c9d2ed9b86c2c95fc1171e49163079dacb7f048b3c509a27a490e1df9e7128362d468'; - - mpk = new Electrum(mpk); - - var key0 = mpk.generatePubKey(0); - var addr0 = Address.fromPubKey(key0); - - console.log(addr0.as('base58')); - + +```js + +var Electrum = require('../lib/Electrum'); +var Address = require('../lib/Address'); + +var mpk = '92eea4d2f5263651db9e3222caded1fd4c89772f79a7c03fb6afc00e9d2c9d2ed9b86c2c95fc1171e49163079dacb7f048b3c509a27a490e1df9e7128362d468'; + +mpk = new Electrum(mpk); + +var key0 = mpk.generatePubKey(0); +var addr0 = Address.fromPubKey(key0); + +console.log(addr0.as('base58')); + +``` + #HierarchicalKey.js - var run = function() { - bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore; - var HierarchicalKey = bitcore.HierarchicalKey; - var Address = bitcore.Address; - var networks = bitcore.networks; - var coinUtil = bitcore.util; - var crypto = require('crypto'); - - console.log('HierarchicalKey: Hierarchical Deterministic Wallets (BIP32)'); - console.log('https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki\n'); - console.log('1) Make new hkey from randomly generated new seed'); - - var randomBytes = crypto.randomBytes(32); - var hkey = HierarchicalKey.seed(randomBytes); - console.log('master extended private key: ' + hkey.extendedPrivateKeyString()); - console.log('master extended public key: ' + hkey.extendedPublicKeyString()); - console.log('m/0/3/5 extended private key: ' + hkey.derive('m/0/3/5').extendedPrivateKeyString()); - console.log('m/0/3/5 extended public key: ' + hkey.derive('m/0/3/5').extendedPublicKeyString()); - console.log(); - - console.log('2) Make new hkey from known seed'); - var knownBytes = coinUtil.sha256('do not use this password as a brain wallet'); - var hkey = HierarchicalKey.seed(knownBytes); - console.log('master extended private key: ' + hkey.extendedPrivateKeyString()); - console.log('master extended public key: ' + hkey.extendedPublicKeyString()); - console.log('m/0/3/5 extended private key: ' + hkey.derive('m/0/3/5').extendedPrivateKeyString()); - console.log('m/0/3/5 extended public key: ' + hkey.derive('m/0/3/5').extendedPublicKeyString()); - console.log(); - - console.log('3) Make new hkey from known master private key'); - var knownMasterPrivateKey = 'xprv9s21ZrQH143K2LvayFZWVVTomiDKheKWvnupDB8fmjKwxkKG47uvzmFa3vCXoy9fxPJhRYsU19apVfexvMeLpJQuF2XtX1zRF3eao9GqqaQ'; - var hkey = new HierarchicalKey(knownMasterPrivateKey); - console.log('master extended private key: ' + hkey.extendedPrivateKeyString()); - console.log('master extended public key: ' + hkey.extendedPublicKeyString()); - console.log('m/0/3/5 extended private key: ' + hkey.derive('m/0/3/5').extendedPrivateKeyString()); - console.log('m/0/3/5 extended public key: ' + hkey.derive('m/0/3/5').extendedPublicKeyString()); - console.log(); - - console.log('4) Make new hkey from known master public key'); - var knownMasterPublicKey = 'xpub661MyMwAqRbcGpiFufipqsKKBG1NHNwfJKishAEFNqJ6ryLcKeKyFNEZces7gMWd4XGg4uUhXy8DS64o1oPGUECVHeLq957Txjwagxt475H'; - var hkey = new HierarchicalKey(knownMasterPublicKey); - console.log('master extended private key: cannot derive'); - console.log('master extended public key: ' + hkey.extendedPublicKeyString()); - console.log('m/0/3/5 extended private key: cannot derive'); - console.log('m/0/3/5 extended public key: ' + hkey.derive('m/0/3/5').extendedPublicKeyString()); - console.log(); - - console.log('5) Make new hkey from known derived public key'); - var knownPublicKey = 'xpub6CZei1p2zk68UwkcBDqzRonLHJWAiPZZ58sMgHJAn9fmpmnPayVEAvAs3XvTSUMZ1J8dNaxnv4wnt7YpRKr6BsqeWbW8msqeuuhiSzsQEC3'; - var hkey = new HierarchicalKey(knownPublicKey); - console.log('master extended private key: cannot derive'); - console.log('master extended public key: ' + hkey.extendedPublicKeyString()); - console.log('m/0/3/5 extended private key: cannot derive'); - console.log('m/0/3/5 extended public key: ' + hkey.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 hkey = new HierarchicalKey(knownPublicKey); - console.log('m/0 address: ' + Address.fromPubKey(hkey.derive('m/0').eckey.public).toString()); - //console.log('m/1 extended public key: ' + hkey.derive('m/1').extendedPublicKeyString()); - console.log('m/1 address: ' + Address.fromPubKey(hkey.derive('m/1').eckey.public).toString()); - //console.log('m/2 extended public key: ' + hkey.derive('m/2').extendedPublicKeyString()); - console.log('m/2 address: ' + Address.fromPubKey(hkey.derive('m/2').eckey.public).toString()); - //console.log('m/3 extended public key: ' + hkey.derive('m/3').extendedPublicKeyString()); - console.log('m/3 address: ' + Address.fromPubKey(hkey.derive('m/3').eckey.public).toString()); - console.log('...'); - //console.log('m/100 extended public key: ' + hkey.derive('m/100').extendedPublicKeyString()); - console.log('m/100 address: ' + Address.fromPubKey(hkey.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(); - } - + +```js + +var run = function() { + bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore; + var HierarchicalKey = bitcore.HierarchicalKey; + var Address = bitcore.Address; + var networks = bitcore.networks; + var coinUtil = bitcore.util; + var crypto = require('crypto'); + + console.log('HierarchicalKey: Hierarchical Deterministic Wallets (BIP32)'); + console.log('https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki\n'); + console.log('1) Make new hkey from randomly generated new seed'); + + var randomBytes = crypto.randomBytes(32); + var hkey = HierarchicalKey.seed(randomBytes); + console.log('master extended private key: ' + hkey.extendedPrivateKeyString()); + console.log('master extended public key: ' + hkey.extendedPublicKeyString()); + console.log('m/0/3/5 extended private key: ' + hkey.derive('m/0/3/5').extendedPrivateKeyString()); + console.log('m/0/3/5 extended public key: ' + hkey.derive('m/0/3/5').extendedPublicKeyString()); + console.log(); + + console.log('2) Make new hkey from known seed'); + var knownBytes = coinUtil.sha256('do not use this password as a brain wallet'); + var hkey = HierarchicalKey.seed(knownBytes); + console.log('master extended private key: ' + hkey.extendedPrivateKeyString()); + console.log('master extended public key: ' + hkey.extendedPublicKeyString()); + console.log('m/0/3/5 extended private key: ' + hkey.derive('m/0/3/5').extendedPrivateKeyString()); + console.log('m/0/3/5 extended public key: ' + hkey.derive('m/0/3/5').extendedPublicKeyString()); + console.log(); + + console.log('3) Make new hkey from known master private key'); + var knownMasterPrivateKey = 'xprv9s21ZrQH143K2LvayFZWVVTomiDKheKWvnupDB8fmjKwxkKG47uvzmFa3vCXoy9fxPJhRYsU19apVfexvMeLpJQuF2XtX1zRF3eao9GqqaQ'; + var hkey = new HierarchicalKey(knownMasterPrivateKey); + console.log('master extended private key: ' + hkey.extendedPrivateKeyString()); + console.log('master extended public key: ' + hkey.extendedPublicKeyString()); + console.log('m/0/3/5 extended private key: ' + hkey.derive('m/0/3/5').extendedPrivateKeyString()); + console.log('m/0/3/5 extended public key: ' + hkey.derive('m/0/3/5').extendedPublicKeyString()); + console.log(); + + console.log('4) Make new hkey from known master public key'); + var knownMasterPublicKey = 'xpub661MyMwAqRbcGpiFufipqsKKBG1NHNwfJKishAEFNqJ6ryLcKeKyFNEZces7gMWd4XGg4uUhXy8DS64o1oPGUECVHeLq957Txjwagxt475H'; + var hkey = new HierarchicalKey(knownMasterPublicKey); + console.log('master extended private key: cannot derive'); + console.log('master extended public key: ' + hkey.extendedPublicKeyString()); + console.log('m/0/3/5 extended private key: cannot derive'); + console.log('m/0/3/5 extended public key: ' + hkey.derive('m/0/3/5').extendedPublicKeyString()); + console.log(); + + console.log('5) Make new hkey from known derived public key'); + var knownPublicKey = 'xpub6CZei1p2zk68UwkcBDqzRonLHJWAiPZZ58sMgHJAn9fmpmnPayVEAvAs3XvTSUMZ1J8dNaxnv4wnt7YpRKr6BsqeWbW8msqeuuhiSzsQEC3'; + var hkey = new HierarchicalKey(knownPublicKey); + console.log('master extended private key: cannot derive'); + console.log('master extended public key: ' + hkey.extendedPublicKeyString()); + console.log('m/0/3/5 extended private key: cannot derive'); + console.log('m/0/3/5 extended public key: ' + hkey.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 hkey = new HierarchicalKey(knownPublicKey); + console.log('m/0 address: ' + Address.fromPubKey(hkey.derive('m/0').eckey.public).toString()); + //console.log('m/1 extended public key: ' + hkey.derive('m/1').extendedPublicKeyString()); + console.log('m/1 address: ' + Address.fromPubKey(hkey.derive('m/1').eckey.public).toString()); + //console.log('m/2 extended public key: ' + hkey.derive('m/2').extendedPublicKeyString()); + console.log('m/2 address: ' + Address.fromPubKey(hkey.derive('m/2').eckey.public).toString()); + //console.log('m/3 extended public key: ' + hkey.derive('m/3').extendedPublicKeyString()); + console.log('m/3 address: ' + Address.fromPubKey(hkey.derive('m/3').eckey.public).toString()); + console.log('...'); + //console.log('m/100 extended public key: ' + hkey.derive('m/100').extendedPublicKeyString()); + console.log('m/100 address: ' + Address.fromPubKey(hkey.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(); +} + +``` + #PayToScriptHashAddress.js - var bitcore = require('../bitcore'); - var Address = bitcore.Address; - var bitcoreUtil = bitcore.util; - var Script = bitcore.Script; - var network = bitcore.networks.livenet; - - - var script = ''; // write down your script here - var s = Script.fromHumanReadable(script); - var hash = bitcoreUtil.sha256ripe160(s.getBuffer()); - var version = network.addressScript; - - var addr = new Address(version, hash); - var addrStr = addr.as('base58'); - - // This outputs the "address" of thescript - console.log(addrStr); - + +```js + +var bitcore = require('../bitcore'); +var Address = bitcore.Address; +var bitcoreUtil = bitcore.util; +var Script = bitcore.Script; +var network = bitcore.networks.livenet; + + +var script = ''; // write down your script here +var s = Script.fromHumanReadable(script); +var hash = bitcoreUtil.sha256ripe160(s.getBuffer()); +var version = network.addressScript; + +var addr = new Address(version, hash); +var addrStr = addr.as('base58'); + +// This outputs the "address" of thescript +console.log(addrStr); + +``` + #PeerDiscovery.js - var PeerManager = require('../lib/PeerManager'); - var peerman = new PeerManager(); - - peerman.discover({ - limit: 12 - }).start(); - + +```js + +var PeerManager = require('../lib/PeerManager'); +var peerman = new PeerManager(); + +peerman.discover({ + limit: 12 +}).start(); + +``` + #PeerManager.js - 'use strict'; - - var run = function() { - // Replace '../bitcore' with 'bitcore' if you use this code elsewhere. - var bitcore = require('../bitcore'); - var Peer = bitcore.Peer; - var PeerManager = bitcore.PeerManager; - - var handleBlock = function(info) { - console.log('** Block Received **'); - console.log(info.message); - }; - - var handleTx = function(info) { - var tx = info.message.tx.getStandardizedObject(); - - console.log('** TX Received **'); - console.log(tx); - }; - - var handleInv = function(info) { - console.log('** Inv **'); - console.log(info.message); - - var invs = info.message.invs; - info.conn.sendGetData(invs); - }; - - var peerman = new PeerManager({ - network: 'testnet' - }); - - peerman.addPeer(new Peer('127.0.0.1', 18333)); - - peerman.on('connection', function(conn) { - conn.on('inv', handleInv); - conn.on('block', handleBlock); - conn.on('tx', handleTx); - }); - - peerman.start(); - }; - - module.exports.run = run; - if (require.main === module) { - run(); - } - + +```js + +'use strict'; + +var run = function() { + // Replace '../bitcore' with 'bitcore' if you use this code elsewhere. + var bitcore = require('../bitcore'); + var Peer = bitcore.Peer; + var PeerManager = bitcore.PeerManager; + + var handleBlock = function(info) { + console.log('** Block Received **'); + console.log(info.message); + }; + + var handleTx = function(info) { + var tx = info.message.tx.getStandardizedObject(); + + console.log('** TX Received **'); + console.log(tx); + }; + + var handleInv = function(info) { + console.log('** Inv **'); + console.log(info.message); + + var invs = info.message.invs; + info.conn.sendGetData(invs); + }; + + var peerman = new PeerManager({ + network: 'testnet' + }); + + peerman.addPeer(new Peer('127.0.0.1', 18333)); + + peerman.on('connection', function(conn) { + conn.on('inv', handleInv); + conn.on('block', handleBlock); + conn.on('tx', handleTx); + }); + + peerman.start(); +}; + +module.exports.run = run; +if (require.main === module) { + run(); +} + +``` + #Rpc.js - 'use strict'; - - var run = function() { - // Replace '../bitcore' with 'bitcore' if you use this code elsewhere. - var bitcore = require('../bitcore'); - var RpcClient = bitcore.RpcClient; - var hash = '0000000000b6288775bbd326bedf324ca8717a15191da58391535408205aada4'; - - var config = { - protocol: 'http', - user: 'user', - pass: 'pass', - host: '127.0.0.1', - port: '18332', - }; - - var rpc = new RpcClient(config); - - rpc.getBlock(hash, function(err, ret) { - if (err) { - console.error('An error occured fetching block', hash); - console.error(err); - return; - } - console.log(ret); - }); - }; - - module.exports.run = run; - if (require.main === module) { - run(); - } - + +```js + +'use strict'; + +var run = function() { + // Replace '../bitcore' with 'bitcore' if you use this code elsewhere. + var bitcore = require('../bitcore'); + var RpcClient = bitcore.RpcClient; + var hash = '0000000000b6288775bbd326bedf324ca8717a15191da58391535408205aada4'; + + var config = { + protocol: 'http', + user: 'user', + pass: 'pass', + host: '127.0.0.1', + port: '18332', + }; + + var rpc = new RpcClient(config); + + rpc.getBlock(hash, function(err, ret) { + if (err) { + console.error('An error occured fetching block', hash); + console.error(err); + return; + } + console.log(ret); + }); +}; + +module.exports.run = run; +if (require.main === module) { + run(); +} + +``` + #Script.js - 'use strict'; - - var run = function() { - // Replace '../bitcore' with 'bitcore' if you use this code elsewhere. - var bitcore = require('../bitcore'); - var Address = bitcore.Address; - var coinUtil = bitcore.util; - var Script = bitcore.Script; - var network = bitcore.networks.testnet; - - var getAddrStr = function(s) { - var addrStrs = []; - var type = s.classify(); - var addr; - - switch (type) { - case Script.TX_PUBKEY: - var chunk = s.captureOne(); - addr = new Address(network.addressVersion, coinUtil.sha256ripe160(chunk)); - addrStrs.push(addr.toString()); - break; - case Script.TX_PUBKEYHASH: - addr = new Address(network.addressVersion, s.captureOne()); - addrStrs.push(addr.toString()); - break; - case Script.TX_SCRIPTHASH: - addr = new Address(network.P2SHVersion, s.captureOne()); - addrStrs.push(addr.toString()); - break; - case Script.TX_MULTISIG: - var chunks = s.capture(); - chunks.forEach(function(chunk) { - var a = new Address(network.addressVersion, coinUtil.sha256ripe160(chunk)); - addrStrs.push(a.toString()); - }); - break; - case Script.TX_UNKNOWN: - console.log('tx type unkown'); - break; - } - return addrStrs; - }; - - var script = 'DUP HASH160 0x14 0x3744841e13b90b4aca16fe793a7f88da3a23cc71 EQUALVERIFY CHECKSIG'; - var s = Script.fromHumanReadable(script); - console.log(getAddrStr(s)[0]); // mkZBYBiq6DNoQEKakpMJegyDbw2YiNQnHT - }; - - module.exports.run = run; - if (require.main === module) { - run(); - } - + +```js + +'use strict'; + +var run = function() { + // Replace '../bitcore' with 'bitcore' if you use this code elsewhere. + var bitcore = require('../bitcore'); + var Address = bitcore.Address; + var coinUtil = bitcore.util; + var Script = bitcore.Script; + var network = bitcore.networks.testnet; + + var getAddrStr = function(s) { + var addrStrs = []; + var type = s.classify(); + var addr; + + switch (type) { + case Script.TX_PUBKEY: + var chunk = s.captureOne(); + addr = new Address(network.addressVersion, coinUtil.sha256ripe160(chunk)); + addrStrs.push(addr.toString()); + break; + case Script.TX_PUBKEYHASH: + addr = new Address(network.addressVersion, s.captureOne()); + addrStrs.push(addr.toString()); + break; + case Script.TX_SCRIPTHASH: + addr = new Address(network.P2SHVersion, s.captureOne()); + addrStrs.push(addr.toString()); + break; + case Script.TX_MULTISIG: + var chunks = s.capture(); + chunks.forEach(function(chunk) { + var a = new Address(network.addressVersion, coinUtil.sha256ripe160(chunk)); + addrStrs.push(a.toString()); + }); + break; + case Script.TX_UNKNOWN: + console.log('tx type unkown'); + break; + } + return addrStrs; + }; + + var script = 'DUP HASH160 0x14 0x3744841e13b90b4aca16fe793a7f88da3a23cc71 EQUALVERIFY CHECKSIG'; + var s = Script.fromHumanReadable(script); + console.log(getAddrStr(s)[0]); // mkZBYBiq6DNoQEKakpMJegyDbw2YiNQnHT +}; + +module.exports.run = run; +if (require.main === module) { + run(); +} + +``` + #SendTx.js - 'use strict'; - - var run = function() { - // Replace '../bitcore' with 'bitcore' if you use this code elsewhere. - var bitcore = require('../bitcore'); - var Peer = bitcore.Peer; - - var TransactionBuilder = bitcore.TransactionBuilder; - var PeerManager = bitcore.PeerManager; - - // Unspent transactions can be found via the insight.bitcore.io or blockchain.info APIs - var unspent = [{ - 'txid': '707108b5ba4f78dc951df4647a03365bf36432ea57fb641676045c5044daaea7', - 'vout': 0, - 'address': 'n3QDC7DzsMmN4mcyp3k7XGPX7zFXXHG387', - 'scriptPubKey': '76a914f00c4a92ee2314ab08ac0283dc8d07d9bf2be32388ac', - 'amount': 0.12345600, - 'confirmations': 43537 - }, { - 'txid': '87a158d32833cb555aea27b6a21af569ccaeb8f9b19691e05f1e6c2b3440bdb3', - 'vout': 1, - 'address': 'mxdrp9s4mVxS9X4RBYiLe99v59V81XA5C3', - 'scriptPubKey': '76a914bbc87986da6b17c7876db4efacf59a95e14f6cf588ac', - 'amount': 0.05749800, - 'confirmations': 43536 - } - - ]; - - // Private keys in WIF format (see TransactionBuilder.js for other options) - var keys = [ - 'cQA75LXhV5JkMT8wkkqjR87SnHK4doh3c21p7PAd5tp8tc1tRBAY', - 'cRz85dz9AiDieRpEwoucfXXQa1jdHHghcv6YnnVVGZ3MQyR1X4u2', - 'cSq7yo4fvsbMyWVN945VUGUWMaSazZPWqBVJZyoGsHmNq6W4HVBV', - 'cPa87VgwZfowGZYaEenoQeJgRfKW6PhZ1R65EHTkN1K19cSvc92G', - 'cPQ9DSbBRLva9av5nqeF5AGrh3dsdW8p2E5jS4P8bDWZAoQTeeKB' - ]; - - var peerman = new PeerManager({ - network: 'testnet' - }); - peerman.addPeer(new Peer('127.0.0.1', 18333)); - - peerman.on('connect', function() { - var conn = peerman.getActiveConnection(); - if (conn) { - // define transaction output - var outs = [{ - address: 'mhNCT9TwZAGF1tLPpZdqfkTmtBkY282YDW', - amount: 0.1337 - }]; - // set change address - var opts = { - remainderOut: { - address: 'n4g2TFaQo8UgedwpkYdcQFF6xE2Ei9Czvy' - } - }; - var tx = new TransactionBuilder(opts) - .setUnspent(unspent) - .setOutputs(outs) - .sign(keys) - .build(); - - /* Create and signing can be done in multiple steps: - * - * var builder = new bitcore.TransactionBuilder(opts) - * .setUnspent(utxos) - * .setOutputs(outs); - * - * // Sign with the first key - * builder.sign(key1); - * var tx = builder.build(); // Partially signed transaction - * - * // Sign with the second key - * builder.sign(key2); - * if (builder.isFullySigned()){ - * var tx = builder.build(); - * } - * - * var selectedUnspent = build.getSelectedUnspent(); // Retrieve selected unspent outputs from the transaction - */ - - var txid = tx.getHash().toString('hex'); - console.log('Created transaction with txid ' + txid); - var raw_tx = tx.serialize().toString('hex'); - console.log('Transaction raw hex dump:'); - console.log('-------------------------------------'); - console.log(raw_tx); - console.log('-------------------------------------'); - // finally, send transaction to the bitcoin network - conn.sendTx(tx); - - // for now, the network won't respond in any case - // (transaction accepted, transaction rejected) - // in the future, we may listen to 'reject' message - // see https://gist.github.com/gavinandresen/7079034 - } - }); - - peerman.start(); - - }; - - module.exports.run = run; - if (require.main === module) { - run(); - } - + +```js + +'use strict'; + +var run = function() { + // Replace '../bitcore' with 'bitcore' if you use this code elsewhere. + var bitcore = require('../bitcore'); + var Peer = bitcore.Peer; + + var TransactionBuilder = bitcore.TransactionBuilder; + var PeerManager = bitcore.PeerManager; + + // Unspent transactions can be found via the insight.bitcore.io or blockchain.info APIs + var unspent = [{ + 'txid': '707108b5ba4f78dc951df4647a03365bf36432ea57fb641676045c5044daaea7', + 'vout': 0, + 'address': 'n3QDC7DzsMmN4mcyp3k7XGPX7zFXXHG387', + 'scriptPubKey': '76a914f00c4a92ee2314ab08ac0283dc8d07d9bf2be32388ac', + 'amount': 0.12345600, + 'confirmations': 43537 + }, { + 'txid': '87a158d32833cb555aea27b6a21af569ccaeb8f9b19691e05f1e6c2b3440bdb3', + 'vout': 1, + 'address': 'mxdrp9s4mVxS9X4RBYiLe99v59V81XA5C3', + 'scriptPubKey': '76a914bbc87986da6b17c7876db4efacf59a95e14f6cf588ac', + 'amount': 0.05749800, + 'confirmations': 43536 + } + + ]; + + // Private keys in WIF format (see TransactionBuilder.js for other options) + var keys = [ + 'cQA75LXhV5JkMT8wkkqjR87SnHK4doh3c21p7PAd5tp8tc1tRBAY', + 'cRz85dz9AiDieRpEwoucfXXQa1jdHHghcv6YnnVVGZ3MQyR1X4u2', + 'cSq7yo4fvsbMyWVN945VUGUWMaSazZPWqBVJZyoGsHmNq6W4HVBV', + 'cPa87VgwZfowGZYaEenoQeJgRfKW6PhZ1R65EHTkN1K19cSvc92G', + 'cPQ9DSbBRLva9av5nqeF5AGrh3dsdW8p2E5jS4P8bDWZAoQTeeKB' + ]; + + var peerman = new PeerManager({ + network: 'testnet' + }); + peerman.addPeer(new Peer('127.0.0.1', 18333)); + + peerman.on('connect', function() { + var conn = peerman.getActiveConnection(); + if (conn) { + // define transaction output + var outs = [{ + address: 'mhNCT9TwZAGF1tLPpZdqfkTmtBkY282YDW', + amount: 0.1337 + }]; + // set change address + var opts = { + remainderOut: { + address: 'n4g2TFaQo8UgedwpkYdcQFF6xE2Ei9Czvy' + } + }; + var tx = new TransactionBuilder(opts) + .setUnspent(unspent) + .setOutputs(outs) + .sign(keys) + .build(); + + /* Create and signing can be done in multiple steps: + * + * var builder = new bitcore.TransactionBuilder(opts) + * .setUnspent(utxos) + * .setOutputs(outs); + * + * // Sign with the first key + * builder.sign(key1); + * var tx = builder.build(); // Partially signed transaction + * + * // Sign with the second key + * builder.sign(key2); + * if (builder.isFullySigned()){ + * var tx = builder.build(); + * } + * + * var selectedUnspent = build.getSelectedUnspent(); // Retrieve selected unspent outputs from the transaction + */ + + var txid = tx.getHash().toString('hex'); + console.log('Created transaction with txid ' + txid); + var raw_tx = tx.serialize().toString('hex'); + console.log('Transaction raw hex dump:'); + console.log('-------------------------------------'); + console.log(raw_tx); + console.log('-------------------------------------'); + // finally, send transaction to the bitcoin network + conn.sendTx(tx); + + // for now, the network will not respond in any case + // (transaction accepted, transaction rejected) + // in the future, we may listen to 'reject' message + // see https://gist.github.com/gavinandresen/7079034 + } + }); + + peerman.start(); + +}; + +module.exports.run = run; +if (require.main === module) { + run(); +} + +``` + #SimpleP2Pmonitor.js - /** - * This is a simple script that will display network messages. - * It users the Peer / Connection classes directly instead of - * relying on PeerManager. - */ - - // replace by require('bitcore') if you use somewhere else - var bitcore = require('../'); - - //bitcore.config.logger = 'debug'; - - var Peer = bitcore.Peer, - Connection = bitcore.Connection; - - var peer = new Peer('127.0.0.1', 8333); - - var socket = peer.createConnection(); - - var con = new Connection(socket, peer); - - con.on('error', function(msg) { - var peer = msg.peer, - err = msg.err; - console.error('Error connecting to peer', peer.host + ':' + peer.port, '(' + err.message + ')'); - }); - - con.on('disconnect', function(msg) { - console.log('disconnect: ', msg); - }); - - con.on('connect', function(msg) { - console.log('Connected to %s', msg.peer.host + ':' + msg.peer.port); - }); - - /* Listen P2P messages */ - - // Make a log function available to all listeners - // The log function is just like console.log except it prefixes - // messages with [host:port] - function listen(event_name, fn) { - con.on(event_name, function(event) { - fn(event, function() { - var args = Array.prototype.slice.call(arguments); - var str = args.shift(); - str = '[%s:%s] ' + str; - args = [str, event.peer.host, event.peer.port].concat(args); - console.log.apply(console, args); - }); - }); - } - - listen('getaddr', function(event, log) { - log('Received message getaddr'); - log(event); - }); - - listen('verack', function(event, log) { - log('Received message verack'); - }); - - listen('version', function(event, log) { - log('Received message version (%s)', event.message.version); - }); - - listen('addr', function(event, log) { - log('Received message addr (%s addresses)', event.message.addrs.length); - }); - - listen('inv', function(event, log) { - log('Received message inv (%s invs)', event.message.count); - console.log(event.message.invs); - }); - + +```js + +/** + * This is a simple script that will display network messages. + * It users the Peer / Connection classes directly instead of + * relying on PeerManager. + */ + +// replace by require('bitcore') if you use somewhere else +var bitcore = require('../'); + +//bitcore.config.logger = 'debug'; + +var Peer = bitcore.Peer, + Connection = bitcore.Connection; + +var peer = new Peer('127.0.0.1', 8333); + +var socket = peer.createConnection(); + +var con = new Connection(socket, peer); + +con.on('error', function(msg) { + var peer = msg.peer, + err = msg.err; + console.error('Error connecting to peer', peer.host + ':' + peer.port, '(' + err.message + ')'); +}); + +con.on('disconnect', function(msg) { + console.log('disconnect: ', msg); +}); + +con.on('connect', function(msg) { + console.log('Connected to %s', msg.peer.host + ':' + msg.peer.port); +}); + +/* Listen P2P messages */ + +// Make a log function available to all listeners +// The log function is just like console.log except it prefixes +// messages with [host:port] +function listen(event_name, fn) { + con.on(event_name, function(event) { + fn(event, function() { + var args = Array.prototype.slice.call(arguments); + var str = args.shift(); + str = '[%s:%s] ' + str; + args = [str, event.peer.host, event.peer.port].concat(args); + console.log.apply(console, args); + }); + }); +} + +listen('getaddr', function(event, log) { + log('Received message getaddr'); + log(event); +}); + +listen('verack', function(event, log) { + log('Received message verack'); +}); + +listen('version', function(event, log) { + log('Received message version (%s)', event.message.version); +}); + +listen('addr', function(event, log) { + log('Received message addr (%s addresses)', event.message.addrs.length); +}); + +listen('inv', function(event, log) { + log('Received message inv (%s invs)', event.message.count); + console.log(event.message.invs); +}); + +``` + #VanityAddress.js - 'use strict'; - - - var run = function() { - // Replace '../bitcore' with 'bitcore' if you use this code elsewhere. - var bitcore = require('../bitcore'); - var Key = bitcore.Key; - var Address = bitcore.Address; - - // config your regular expression - var re = /[0-9]{6}$/; // ends in 6 digits - - var a, k, m; - while (true) { - k = Key.generateSync(); - a = Address.fromKey(k); - m = a.toString().match(re); - if (m) break; - } - console.log('Address: ' + a.toString()); - console.log('Private Key: ' + k.private.toString('hex')); - - }; - - module.exports.run = run; - if (require.main === module) { - run(); - } - + +```js + +'use strict'; + +var run = function() { + // Replace '../bitcore' with 'bitcore' if you use this code elsewhere. + var bitcore = require('../bitcore'); + var Key = bitcore.Key; + var Address = bitcore.Address; + + // config your regular expression + var re = /[0-9]{6}$/; // ends in 6 digits + + var a, k, m; + while (true) { + k = Key.generateSync(); + a = Address.fromKey(k); + m = a.toString().match(re); + if (m) break; + } + console.log('Address: ' + a.toString()); + console.log('Private Key: ' + k.private.toString('hex')); + +}; + +module.exports.run = run; +if (require.main === module) { + run(); +} + +```