Eric Martindale
10 years ago
36 changed files with 0 additions and 2566 deletions
@ -1,28 +0,0 @@ |
|||
'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(); |
|||
} |
@ -1,65 +0,0 @@ |
|||
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(); |
|||
} |
@ -1,37 +0,0 @@ |
|||
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);
|
|||
}); |
|||
|
|||
}); |
@ -1,108 +0,0 @@ |
|||
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, |
|||
ts: 1396288753, |
|||
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, |
|||
ts: 1396288753, |
|||
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(); |
|||
} |
|||
|
|||
////
|
@ -1,73 +0,0 @@ |
|||
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, |
|||
ts: 1394719301, |
|||
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(); |
|||
} |
|||
|
|||
////
|
@ -1,151 +0,0 @@ |
|||
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, |
|||
ts: 1396290442, |
|||
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, |
|||
ts: 1396375187, |
|||
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(); |
|||
} |
@ -1,48 +0,0 @@ |
|||
'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(); |
|||
} |
@ -1,76 +0,0 @@ |
|||
'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(); |
|||
} |
@ -1,30 +0,0 @@ |
|||
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(); |
|||
} |
@ -1,11 +0,0 @@ |
|||
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')); |
@ -1,83 +0,0 @@ |
|||
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(); |
|||
} |
@ -1,29 +0,0 @@ |
|||
'use strict'; |
|||
|
|||
var run = function() { |
|||
// Replace '../bitcore' with 'bitcore' if you use this code elsewhere.
|
|||
var bitcore = require('../bitcore'); |
|||
var NetworkMonitor = bitcore.NetworkMonitor; |
|||
|
|||
var config = { |
|||
networkName: 'testnet', |
|||
host: 'localhost', |
|||
port: 18333 |
|||
}; |
|||
|
|||
|
|||
var nm = new NetworkMonitor.create(config); |
|||
// monitor incoming transactions to http://tpfaucet.appspot.com/ donation address
|
|||
nm.incoming('msj42CCGruhRsFrGATiUuh25dtxYtnpbTx', function(tx) { |
|||
console.log('Donation to tpfaucet! '+JSON.stringify(tx.getStandardizedObject())); |
|||
}); |
|||
|
|||
// connect to bitcoin network and start listening
|
|||
nm.start(); |
|||
|
|||
}; |
|||
|
|||
module.exports.run = run; |
|||
if (require.main === module) { |
|||
run(); |
|||
} |
@ -1,20 +0,0 @@ |
|||
'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 script = 'OP_RETURN 58434c524e4748530000000000000000000000010000000005f5e100'; |
|||
var s = Script.fromHumanReadable(script); |
|||
var result = (s.classify() == Script.TX_RETURN) |
|||
console.log("Is op_return:", result); |
|||
}; |
|||
|
|||
module.exports.run = run; |
|||
if (require.main === module) { |
|||
run(); |
|||
} |
@ -1,74 +0,0 @@ |
|||
# Running the Payment Protocol Demo |
|||
|
|||
## Node |
|||
|
|||
The node payment protocol demonstration will run automatically via: |
|||
|
|||
``` bash |
|||
$ node examples/PayPro |
|||
``` |
|||
|
|||
You will see the server and customer logs output in the terminal. |
|||
|
|||
## Browser |
|||
|
|||
To run our payment protocol demonstration in the browser, you may run: |
|||
|
|||
``` bash |
|||
$ node examples/PayPro/server.js -b -p 8080 |
|||
``` |
|||
|
|||
This will start the payment protocol demonstration server in browser mode, |
|||
which serves outputs in the payment protocol request (don't worry, it doesn't |
|||
ask for *too* many testnet coins). |
|||
|
|||
Once the server is started, you can visit it in your browser: |
|||
|
|||
``` bash |
|||
$ chromium https://localhost:8080/ |
|||
``` |
|||
|
|||
You will see a simple checkout page to buy some imaginary products. Once you |
|||
press checkout, you will see all the server and client logs in the browser as |
|||
well as the terminal. |
|||
|
|||
If you're connected to enough peers, your transaction will be broadcast |
|||
throughout the bitcoin testnet network and hopefully ACKed by your peers. |
|||
|
|||
## Logs |
|||
|
|||
Your logs may ultimately look something like this: |
|||
|
|||
``` |
|||
Customer: Our payment was acknowledged! |
|||
Customer: Message from Merchant: Thank you for your payment! |
|||
Customer: Payment sent successfully. |
|||
``` |
|||
|
|||
## Changing the server address contained in outputs |
|||
|
|||
If you want to alter the address or public key the testnet coins get sent to by |
|||
the payment server, you can pass in the `--pubkey` or `--address` options. |
|||
`address` has to be a testnet address, whereas `pubkey` is a hex encoded public |
|||
key. The `--privkey` option is also available in the standard bitcoind privkey |
|||
format. |
|||
|
|||
## Other Options |
|||
|
|||
If you you're not connected to enough peers to broadcast your transaction (by |
|||
default, this example only connects to the core seed peers), you can enable |
|||
peer discovery in bitcore by passing the `--discovery` (`-d`) argument onto the |
|||
server command line. |
|||
|
|||
If you don't want to actually broadcast your transaction and want to keep your |
|||
testnet coins, you can pass `--no-tx` on the server command line. |
|||
|
|||
If you don't want the tests to run automatically and simply host the payment |
|||
server, simply pass `--browser` (`-b`) as mentioned above. |
|||
|
|||
## Using the example in a modular manner |
|||
|
|||
``` js |
|||
var server = require('bitcore/examples/PayPro'); |
|||
server.listen(8080); |
|||
``` |
@ -1 +0,0 @@ |
|||
../../browser/bundle.js |
@ -1,515 +0,0 @@ |
|||
/** |
|||
* Payment-Customer - A Payment Protocol demonstration. |
|||
* This file will run in node or the browser. |
|||
* Copyright (c) 2014, BitPay |
|||
* https://github.com/bitpay/bitcore
|
|||
*/ |
|||
|
|||
;(function() { |
|||
|
|||
/** |
|||
* Global |
|||
*/ |
|||
|
|||
var window = this; |
|||
var global = this; |
|||
|
|||
/** |
|||
* Platform |
|||
*/ |
|||
|
|||
var isNode = !!(typeof process === 'object' && process && process.versions.node); |
|||
|
|||
// Disable strictSSL
|
|||
if (isNode) { |
|||
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; |
|||
} |
|||
|
|||
/** |
|||
* Dependencies |
|||
*/ |
|||
|
|||
var bitcore = isNode |
|||
? require('../../') |
|||
: require('bitcore'); |
|||
var PayPro = bitcore.PayPro; |
|||
var Transaction = bitcore.Transaction; |
|||
var TransactionBuilder = bitcore.TransactionBuilder; |
|||
|
|||
/** |
|||
* Variables |
|||
*/ |
|||
|
|||
var port = 8080; |
|||
|
|||
if (isNode) { |
|||
var argv = require('optimist').argv; |
|||
if (argv.p || argv.port) { |
|||
port = +argv.p || +argv.port; |
|||
} |
|||
} else { |
|||
port = +window.location.port || 443; |
|||
} |
|||
|
|||
var merchant = isNode |
|||
? parseMerchantURI(argv.m || argv.u || argv._[0]) |
|||
: parseMerchantURI(window.merchantURI); |
|||
|
|||
/** |
|||
* Send Payment |
|||
*/ |
|||
|
|||
if (isNode) { |
|||
var Buffer = global.Buffer; |
|||
} else { |
|||
var Buffer = bitcore.Buffer; |
|||
} |
|||
|
|||
function request(options, callback) { |
|||
if (typeof options === 'string') { |
|||
options = { uri: options }; |
|||
} |
|||
|
|||
options.method = options.method || 'GET'; |
|||
options.headers = options.headers || {}; |
|||
|
|||
if (!isNode) { |
|||
var xhr = new XMLHttpRequest(); |
|||
xhr.open(options.method, options.uri, true); |
|||
|
|||
Object.keys(options.headers).forEach(function(key) { |
|||
var val = options.headers[key]; |
|||
if (key === 'Content-Length') return; |
|||
if (key === 'Content-Transfer-Encoding') return; |
|||
xhr.setRequestHeader(key, val); |
|||
}); |
|||
|
|||
// For older browsers:
|
|||
// xhr.overrideMimeType('text/plain; charset=x-user-defined');
|
|||
|
|||
// Newer browsers:
|
|||
xhr.responseType = 'arraybuffer'; |
|||
|
|||
xhr.onload = function(event) { |
|||
var response = xhr.response; |
|||
var buf = new Uint8Array(response); |
|||
return callback(null, xhr, buf); |
|||
}; |
|||
|
|||
if (options.body) { |
|||
xhr.send(options.body); |
|||
} else { |
|||
xhr.send(null); |
|||
} |
|||
|
|||
return; |
|||
} |
|||
|
|||
return require('request')(options, callback); |
|||
} |
|||
|
|||
function sendPayment(msg, callback) { |
|||
if (arguments.length === 1) { |
|||
callback = msg; |
|||
msg = null; |
|||
} |
|||
|
|||
return request({ |
|||
method: 'GET', |
|||
uri: 'https://localhost:' + port + '/-/request', |
|||
headers: { |
|||
'Accept': PayPro.PAYMENT_REQUEST_CONTENT_TYPE |
|||
+ ', ' + PayPro.PAYMENT_ACK_CONTENT_TYPE, |
|||
'Content-Type': 'application/octet-stream', |
|||
'Content-Length': 0 |
|||
}, |
|||
encoding: null |
|||
}, function(err, res, body) { |
|||
if (err) return callback(err); |
|||
|
|||
body = PayPro.PaymentRequest.decode(body); |
|||
|
|||
var pr = new PayPro(); |
|||
pr = pr.makePaymentRequest(body); |
|||
|
|||
var ver = pr.get('payment_details_version'); |
|||
var pki_type = pr.get('pki_type'); |
|||
var pki_data = pr.get('pki_data'); |
|||
var details = pr.get('serialized_payment_details'); |
|||
var sig = pr.get('signature'); |
|||
|
|||
// Verify Signature
|
|||
var verified = pr.verify(); |
|||
|
|||
if (!verified) { |
|||
return callback(new Error('Server sent a bad signature.')); |
|||
} |
|||
|
|||
details = PayPro.PaymentDetails.decode(details); |
|||
var pd = new PayPro(); |
|||
pd = pd.makePaymentDetails(details); |
|||
var network = pd.get('network'); |
|||
var outputs = pd.get('outputs'); |
|||
var time = pd.get('time'); |
|||
var expires = pd.get('expires'); |
|||
var memo = pd.get('memo'); |
|||
var payment_url = pd.get('payment_url'); |
|||
var merchant_data = pd.get('merchant_data'); |
|||
|
|||
print('You are currently on this BTC network:'); |
|||
print(network); |
|||
print('The server sent you a message:'); |
|||
print(memo); |
|||
|
|||
var refund_outputs = []; |
|||
|
|||
var rpo = new PayPro(); |
|||
rpo = rpo.makeOutput(); |
|||
rpo.set('amount', 0); |
|||
rpo.set('script', new Buffer([ |
|||
118, // OP_DUP
|
|||
169, // OP_HASH160
|
|||
76, // OP_PUSHDATA1
|
|||
20, // number of bytes
|
|||
0xcf, |
|||
0xbe, |
|||
0x41, |
|||
0xf4, |
|||
0xa5, |
|||
0x18, |
|||
0xed, |
|||
0xc2, |
|||
0x5a, |
|||
0xf7, |
|||
0x1b, |
|||
0xaf, |
|||
0xc7, |
|||
0x2f, |
|||
0xb6, |
|||
0x1b, |
|||
0xfc, |
|||
0xfc, |
|||
0x4f, |
|||
0xcd, |
|||
136, // OP_EQUALVERIFY
|
|||
172 // OP_CHECKSIG
|
|||
])); |
|||
|
|||
refund_outputs.push(rpo.message); |
|||
|
|||
// We send this to the serve after receiving a PaymentRequest
|
|||
var pay = new PayPro(); |
|||
pay = pay.makePayment(); |
|||
pay.set('merchant_data', merchant_data); |
|||
pay.set('transactions', [createTX(outputs)]); |
|||
pay.set('refund_to', refund_outputs); |
|||
|
|||
msg = msg || 'Hi server, I would like to give you some money.'; |
|||
|
|||
if (isNode && argv.memo) { |
|||
msg = argv.memo; |
|||
} |
|||
|
|||
pay.set('memo', msg); |
|||
pay = pay.serialize(); |
|||
|
|||
return request({ |
|||
method: 'POST', |
|||
uri: payment_url, |
|||
headers: { |
|||
// BIP-71
|
|||
'Accept': PayPro.PAYMENT_REQUEST_CONTENT_TYPE |
|||
+ ', ' + PayPro.PAYMENT_ACK_CONTENT_TYPE, |
|||
'Content-Type': PayPro.PAYMENT_CONTENT_TYPE, |
|||
'Content-Length': pay.length + '', |
|||
'Content-Transfer-Encoding': 'binary' |
|||
}, |
|||
body: pay, |
|||
encoding: null |
|||
}, function(err, res, body) { |
|||
if (err) return callback(err); |
|||
body = PayPro.PaymentACK.decode(body); |
|||
var ack = new PayPro(); |
|||
ack = ack.makePaymentACK(body); |
|||
var payment = ack.get('payment'); |
|||
var memo = ack.get('memo'); |
|||
print('Our payment was acknowledged!'); |
|||
print('Message from Merchant: %s', memo); |
|||
payment = PayPro.Payment.decode(payment); |
|||
var pay = new PayPro(); |
|||
payment = pay.makePayment(payment); |
|||
print(payment); |
|||
var tx = payment.message.transactions[0]; |
|||
if (tx.buffer) { |
|||
tx.buffer = tx.buffer.slice(tx.offset, tx.limit); |
|||
var ptx = new bitcore.Transaction(); |
|||
|
|||
var parser = new bitcore.BinaryParser(tx.buffer); |
|||
ptx.parse(parser); |
|||
// ptx.parse(tx.buffer);
|
|||
|
|||
tx = ptx; |
|||
} |
|||
var txid = tx.getHash().toString('hex'); |
|||
print('First payment txid: %s', txid); |
|||
return callback(); |
|||
}); |
|||
}); |
|||
} |
|||
|
|||
/** |
|||
* Helpers |
|||
*/ |
|||
|
|||
// URI Spec
|
|||
// A backwards-compatible request:
|
|||
// bitcoin:mq7se9wy2egettFxPbmn99cK8v5AFq55Lx?amount=0.11&r=https://merchant.com/pay.php?h%3D2a8628fc2fbe
|
|||
// Non-backwards-compatible equivalent:
|
|||
// bitcoin:?r=https://merchant.com/pay.php?h%3D2a8628fc2fbe
|
|||
function parseMerchantURI(uri) { |
|||
uri = uri || 'bitcoin:?r=https://localhost:' + port + '/-/request'; |
|||
var query, id; |
|||
if (uri.indexOf('bitcoin:') !== 0) { |
|||
throw new Error('Not a Bitcoin URI.'); |
|||
} |
|||
if (~uri.indexOf(':?')) { |
|||
query = uri.split(':?')[1]; |
|||
} else { |
|||
// Legacy URI
|
|||
uri = uri.substring('bitcoin:'.length); |
|||
uri = uri.split('?'); |
|||
id = uri[0]; |
|||
query = uri[1]; |
|||
} |
|||
query = parseQS(query); |
|||
if (!query.r) { |
|||
throw new Error('No uri.'); |
|||
} |
|||
if (id) { |
|||
query.id = id; |
|||
} |
|||
return query; |
|||
} |
|||
|
|||
function parseQS(query) { |
|||
var out = {}; |
|||
var parts = query.split('&'); |
|||
parts.forEach(function(part) { |
|||
var parts = part.split('='); |
|||
var key = parts[0]; |
|||
var value = parts[1]; |
|||
out[key] = value; |
|||
}); |
|||
return out; |
|||
} |
|||
|
|||
function createTX(outputs) { |
|||
// Addresses
|
|||
var addrs = [ |
|||
'mzTQ66VKcybz9BD1LAqEwMFp9NrBGS82sY', |
|||
'mmu9k3KzsDMEm9JxmJmZaLhovAoRKW3zr4', |
|||
'myqss64GNZuWuFyg5LTaoTCyWEpKH56Fgz' |
|||
]; |
|||
|
|||
// Private keys in WIF format (see TransactionBuilder.js for other options)
|
|||
var keys = [ |
|||
'cVvr5YmWVAkVeZWAawd2djwXM4QvNuwMdCw1vFQZBM1SPFrtE8W8', |
|||
'cPyx1hXbe3cGQcHZbW3GNSshCYZCriidQ7afR2EBsV6ReiYhSkNF' |
|||
// 'cUB9quDzq1Bj7pocenmofzNQnb1wJNZ5V3cua6pWKzNL1eQtaDqQ'
|
|||
]; |
|||
|
|||
var unspent = [{ |
|||
// http://blockexplorer.com/testnet/rawtx/1fcfe898cc2612f8b222bd3b4ac8d68bf95d43df8367b71978c184dea35bde22
|
|||
'txid': '1fcfe898cc2612f8b222bd3b4ac8d68bf95d43df8367b71978c184dea35bde22', |
|||
'vout': 1, |
|||
'address': addrs[0], |
|||
'scriptPubKey': '76a94c14cfbe41f4a518edc25af71bafc72fb61bfcfc4fcd88ac', |
|||
'amount': 1.60000000, |
|||
'confirmations': 9 |
|||
}, |
|||
|
|||
{ |
|||
// http://blockexplorer.com/testnet/rawtx/0624c0c794447b0d2343ae3d20382983f41b915bb115a834419e679b2b13b804
|
|||
'txid': '0624c0c794447b0d2343ae3d20382983f41b915bb115a834419e679b2b13b804', |
|||
'vout': 1, |
|||
'address': addrs[1], |
|||
'scriptPubKey': '76a94c14460376539c219c5e3274d86f16b40e806b37817688ac', |
|||
'amount': 1.60000000, |
|||
'confirmations': 9 |
|||
}]; |
|||
|
|||
// set change address
|
|||
var opts = { |
|||
remainderOut: { |
|||
address: addrs[0] |
|||
} |
|||
}; |
|||
|
|||
var outs = []; |
|||
outputs.forEach(function(output) { |
|||
var amount = output.get('amount'); |
|||
var script = { |
|||
offset: output.get('script').offset, |
|||
limit: output.get('script').limit, |
|||
buffer: new Buffer(new Uint8Array( |
|||
output.get('script').buffer)) |
|||
}; |
|||
|
|||
// big endian
|
|||
var v = new Buffer(8); |
|||
v[0] = (amount.high >> 24) & 0xff; |
|||
v[1] = (amount.high >> 16) & 0xff; |
|||
v[2] = (amount.high >> 8) & 0xff; |
|||
v[3] = (amount.high >> 0) & 0xff; |
|||
v[4] = (amount.low >> 24) & 0xff; |
|||
v[5] = (amount.low >> 16) & 0xff; |
|||
v[6] = (amount.low >> 8) & 0xff; |
|||
v[7] = (amount.low >> 0) & 0xff; |
|||
|
|||
var s = script.buffer.slice(script.offset, script.limit); |
|||
var addr = bitcore.Address.fromScriptPubKey(new bitcore.Script(s), 'testnet'); |
|||
|
|||
outs.push({ |
|||
address: addr.toString(), |
|||
amountSatStr: bitcore.Bignum.fromBuffer(v, { |
|||
// XXX for some reason, endian is ALWAYS 'big'
|
|||
// in node (in the browser it behaves correctly)
|
|||
endian: 'big', |
|||
size: 1 |
|||
}).toString(10) |
|||
}); |
|||
}); |
|||
|
|||
var b = new bitcore.TransactionBuilder(opts) |
|||
.setUnspent(unspent) |
|||
.setOutputs(outs); |
|||
|
|||
outputs.forEach(function(output, i) { |
|||
var script = { |
|||
offset: output.get('script').offset, |
|||
limit: output.get('script').limit, |
|||
buffer: new Buffer(new Uint8Array( |
|||
output.get('script').buffer)) |
|||
}; |
|||
var s = script.buffer.slice(script.offset, script.limit); |
|||
b.tx.outs[i].s = s; |
|||
}); |
|||
|
|||
b = b.sign(keys); |
|||
|
|||
var tx = b.build(); |
|||
|
|||
print(''); |
|||
print('Customer created transaction:'); |
|||
print(tx.getStandardizedObject()); |
|||
print(''); |
|||
|
|||
return tx.serialize(); |
|||
} |
|||
|
|||
/** |
|||
* Helpers |
|||
*/ |
|||
|
|||
function clientLog(args, isError) { |
|||
var log = document.getElementById('log'); |
|||
var msg = args[0]; |
|||
if (typeof msg !== 'string') { |
|||
msg = JSON.stringify(msg, null, 2); |
|||
if (isError) msg = '<span style="color:red;">' + msg + '</span>'; |
|||
log.innerHTML += msg + '\n'; |
|||
return; |
|||
} |
|||
var i = 0; |
|||
msg = msg.replace(/%[sdji]/g, function(ch) { |
|||
i++; |
|||
if (ch === 'j' || typeof args[i] !== 'string') { |
|||
return JSON.stringify(args[i]); |
|||
} |
|||
return args[i]; |
|||
}); |
|||
if (isError) msg = '<span style="color:red;">' + msg + '</span>'; |
|||
log.innerHTML += msg + '\n'; |
|||
} |
|||
|
|||
function print() { |
|||
var args = Array.prototype.slice.call(arguments); |
|||
if (!isNode) { |
|||
return clientLog(args, false); |
|||
} |
|||
var util = require('util'); |
|||
if (typeof args[0] !== 'string') { |
|||
args[0] = util.inspect(args[0], null, 20, true); |
|||
console.log('\x1b[32mCustomer:\x1b[m'); |
|||
console.log(args[0]); |
|||
return; |
|||
} |
|||
if (!args[0]) return process.stdout.write('\n'); |
|||
var msg = '\x1b[32mCustomer:\x1b[m ' |
|||
+ util.format.apply(util.format, args); |
|||
return process.stdout.write(msg + '\n'); |
|||
} |
|||
|
|||
function error() { |
|||
var args = Array.prototype.slice.call(arguments); |
|||
if (!isNode) { |
|||
return clientLog(args, true); |
|||
} |
|||
var util = require('util'); |
|||
if (typeof args[0] !== 'string') { |
|||
args[0] = util.inspect(args[0], null, 20, true); |
|||
console.log('\x1b[32mCustomer:\x1b[m'); |
|||
console.log(args[0]); |
|||
return; |
|||
} |
|||
if (!args[0]) return process.stderr.write('\n'); |
|||
var msg = '\x1b[32mCustomer:\x1b[m \x1b[31m' |
|||
+ util.format.apply(util.format, args) + '\x1b[m'; |
|||
return process.stderr.write(msg + '\n'); |
|||
} |
|||
|
|||
/** |
|||
* Execute |
|||
*/ |
|||
|
|||
if (isNode) { |
|||
if (!module.parent) { |
|||
sendPayment(function(err) { |
|||
if (err) return error(err.message); |
|||
print('Payment sent successfully.'); |
|||
}); |
|||
} else { |
|||
var customer = sendPayment; |
|||
customer.sendPayment = sendPayment; |
|||
customer.print = print; |
|||
customer.error = error; |
|||
module.exports = customer; |
|||
} |
|||
} else { |
|||
var customer = sendPayment; |
|||
customer.sendPayment = sendPayment; |
|||
customer.print = print; |
|||
customer.error = error; |
|||
window.customer = window.sendPayment = customer; |
|||
window.onload = function() { |
|||
var form = document.getElementsByTagName('form')[0]; |
|||
var memo = document.querySelector('input[name="memo"]'); |
|||
var loader = document.getElementById('load'); |
|||
loader.style.display = 'none'; |
|||
form.onsubmit = function() { |
|||
form.style.display = 'none'; |
|||
loader.style.display = 'block'; |
|||
form.onsubmit = function() { return false; }; |
|||
customer.sendPayment(memo.value || null, function(err) { |
|||
loader.style.display = 'none'; |
|||
if (err) return error(err.message); |
|||
print('Payment sent successfully.'); |
|||
}); |
|||
return false; |
|||
}; |
|||
}; |
|||
} |
|||
|
|||
}).call(function() { |
|||
return this || (typeof window !== 'undefined' ? window : global); |
|||
}()); |
@ -1,28 +0,0 @@ |
|||
<!doctype html> |
|||
<title>Payment Protocol</title> |
|||
<link rel="stylesheet" href="/style.css"> |
|||
|
|||
<h1>Payment Protocol</h1> |
|||
|
|||
<p> |
|||
<a href="https://github.com/bitcoin/bips/blob/master/bip-0070.mediawiki"><strong>BIP-70</strong></a> |
|||
is here! |
|||
</p> |
|||
|
|||
<form method="POST" action="/-/request"> |
|||
<ul> |
|||
<li>BitPay T-Shirt: <strong>0.00002000 BTC</strong></li> |
|||
<li>BitPay Mug: <strong>0.00001000 BTC</strong></li> |
|||
</ul> |
|||
<p>These items will cost you a total of <strong>0.00003000 BTC</strong>.</p> |
|||
<p>Would you like to checkout?</p> |
|||
<input type="text" name="memo" placeholder="Message to merchant..." value=""> |
|||
<input type="submit" value="Checkout"> |
|||
</form> |
|||
|
|||
<p id="load">Loading...</p> |
|||
|
|||
<pre id="log"></pre> |
|||
|
|||
<script src="./bitcore.js"></script> |
|||
<script src="./customer.js"></script> |
@ -1,3 +0,0 @@ |
|||
#!/usr/bin/env node
|
|||
|
|||
module.exports = require('./server'); |
@ -1,438 +0,0 @@ |
|||
#!/bin/bash
|
|||
|
|||
/** |
|||
* Payment-Server - A Payment Protocol demonstration. |
|||
* Copyright (c) 2014, BitPay |
|||
* https://github.com/bitpay/bitcore
|
|||
*/ |
|||
|
|||
/** |
|||
* Modules |
|||
*/ |
|||
|
|||
var https = require('https'); |
|||
var fs = require('fs'); |
|||
var path = require('path'); |
|||
var qs = require('querystring'); |
|||
var crypto = require('crypto'); |
|||
var assert = require('assert'); |
|||
|
|||
// Disable strictSSL
|
|||
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; |
|||
|
|||
/** |
|||
* Dependencies |
|||
*/ |
|||
|
|||
var argv = require('optimist').argv; |
|||
var express = require('express'); |
|||
var bitcore = require('../../'); |
|||
|
|||
var PayPro = bitcore.PayPro; |
|||
var Transaction = bitcore.Transaction; |
|||
var TransactionBuilder = bitcore.TransactionBuilder; |
|||
|
|||
/** |
|||
* Variables |
|||
*/ |
|||
|
|||
var x509 = { |
|||
priv: fs.readFileSync(__dirname + '/../../test/data/x509.key'), |
|||
pub: fs.readFileSync(__dirname + '/../../test/data/x509.pub'), |
|||
der: fs.readFileSync(__dirname + '/../../test/data/x509.der'), |
|||
pem: fs.readFileSync(__dirname + '/../../test/data/x509.crt') |
|||
}; |
|||
|
|||
var server = https.createServer({ |
|||
key: fs.readFileSync(__dirname + '/../../test/data/x509.key'), |
|||
cert: fs.readFileSync(__dirname + '/../../test/data/x509.crt') |
|||
}); |
|||
|
|||
server.options = argv; |
|||
|
|||
server.setOptions = function(options) { |
|||
server.options = argv = options; |
|||
}; |
|||
|
|||
var app = express(); |
|||
|
|||
/** |
|||
* Ignore Cache Headers |
|||
* Allow CORS |
|||
* Accept Payments |
|||
*/ |
|||
|
|||
app.use(function(req, res, next) { |
|||
var setHeader = res.setHeader; |
|||
|
|||
res.setHeader = function(name) { |
|||
switch (name) { |
|||
case 'Cache-Control': |
|||
case 'Last-Modified': |
|||
case 'ETag': |
|||
return; |
|||
} |
|||
return setHeader.apply(res, arguments); |
|||
}; |
|||
|
|||
res.setHeader('Access-Control-Allow-Origin', '*'); |
|||
res.setHeader('Access-Control-Allow-Methods', 'GET,POST,OPTIONS'); |
|||
res.setHeader('Access-Control-Allow-Headers', [ |
|||
'Host', |
|||
'Connection', |
|||
'Content-Length', |
|||
'Accept', |
|||
'Origin', |
|||
'User-Agent', |
|||
'Content-Type', |
|||
'Accept-Encoding', |
|||
'Accept-Language' |
|||
].join(',')); |
|||
|
|||
res.setHeader('Accept', PayPro.PAYMENT_CONTENT_TYPE); |
|||
|
|||
return next(); |
|||
}); |
|||
|
|||
/** |
|||
* Body Parser |
|||
*/ |
|||
|
|||
app.use('/-/pay', function(req, res, next) { |
|||
var buf = []; |
|||
|
|||
req.on('error', function(err) { |
|||
error('Request Error: %s', err.message); |
|||
try { |
|||
req.socket.destroy(); |
|||
} catch (e) { |
|||
; |
|||
} |
|||
}); |
|||
|
|||
req.on('data', function(data) { |
|||
buf.push(data); |
|||
}); |
|||
|
|||
req.on('end', function(data) { |
|||
if (data) buf.push(data); |
|||
buf = Buffer.concat(buf, buf.length); |
|||
req.paymentData = buf; |
|||
return next(); |
|||
}) |
|||
}); |
|||
|
|||
/** |
|||
* Router |
|||
*/ |
|||
|
|||
// Not used in express 4.x
|
|||
// app.use(app.router);
|
|||
|
|||
/** |
|||
* Receive "I want to pay" |
|||
*/ |
|||
|
|||
app.uid = 0; |
|||
|
|||
app.get('/-/request', function(req, res, next) { |
|||
print('Received payment "request" from %s.', req.socket.remoteAddress); |
|||
|
|||
var outputs = []; |
|||
|
|||
[2000, 1000, 10000].forEach(function(value) { |
|||
var po = new PayPro(); |
|||
po = po.makeOutput(); |
|||
|
|||
// number of satoshis to be paid
|
|||
po.set('amount', value); |
|||
|
|||
// a TxOut script where the payment should be sent. similar to OP_CHECKSIG
|
|||
|
|||
// Instead of creating it ourselves:
|
|||
// if (!argv.pubkey && !argv.privkey && !argv.address) {
|
|||
// //argv.pubkey = '3730febcba04bad0cd476cfb820f9c37d7466fd9';
|
|||
// argv.pubkey = 'd96f46d7379c0f82fb6c47cdd0ba04babcfe3037'
|
|||
// }
|
|||
|
|||
if (argv.pubkey || argv.privkey || argv.address) { |
|||
var pubKey; |
|||
if (argv.pubkey) { |
|||
pubKey = new Buffer(argv.pubkey, 'hex'); |
|||
} else if (argv.privkey) { |
|||
pubKey = bitcore.Key.recoverPubKey(new Buffer(argv.privkey)).toCompressedPubKey(); |
|||
} else if (argv.address) { |
|||
pubKey = bitcore.Base58Check.decode(new Buffer(argv.address)); |
|||
} |
|||
var address = bitcore.Address.fromPubKey(pubKey, 'testnet'); |
|||
var scriptPubKey = address.getScriptPubKey(); |
|||
assert.equal(scriptPubKey.isPubkeyHash(), true); |
|||
po.set('script', scriptPubKey.getBuffer()); |
|||
} else { |
|||
po.set('script', new Buffer([ |
|||
118, // OP_DUP
|
|||
169, // OP_HASH160
|
|||
76, // OP_PUSHDATA1
|
|||
20, // number of bytes
|
|||
55, |
|||
48, |
|||
254, |
|||
188, |
|||
186, |
|||
4, |
|||
186, |
|||
208, |
|||
205, |
|||
71, |
|||
108, |
|||
251, |
|||
130, |
|||
15, |
|||
156, |
|||
55, |
|||
215, |
|||
70, |
|||
111, |
|||
217, |
|||
136, // OP_EQUALVERIFY
|
|||
172 // OP_CHECKSIG
|
|||
])); |
|||
} |
|||
|
|||
outputs.push(po.message); |
|||
}); |
|||
|
|||
/** |
|||
* Payment Details |
|||
*/ |
|||
|
|||
var mdata = new Buffer([0]); |
|||
app.uid++; |
|||
if (app.uid > 0xffff) { |
|||
throw new Error('UIDs bigger than 0xffff not supported.'); |
|||
} else if (app.uid > 0xff) { |
|||
mdata = new Buffer([(app.uid >> 8) & 0xff, (app.uid >> 0) & 0xff]) |
|||
} else { |
|||
mdata = new Buffer([0, app.uid]) |
|||
} |
|||
var now = Date.now() / 1000 | 0; |
|||
var pd = new PayPro(); |
|||
pd = pd.makePaymentDetails(); |
|||
pd.set('network', 'test'); |
|||
pd.set('outputs', outputs); |
|||
pd.set('time', now); |
|||
pd.set('expires', now + 60 * 60 * 24); |
|||
pd.set('memo', 'Hello, this is the server, we would like some money.'); |
|||
var port = +req.headers.host.split(':')[1] || server.port; |
|||
pd.set('payment_url', 'https://localhost:' + port + '/-/pay'); |
|||
pd.set('merchant_data', mdata); |
|||
|
|||
/* |
|||
* PaymentRequest |
|||
*/ |
|||
|
|||
var cr = new PayPro(); |
|||
cr = cr.makeX509Certificates(); |
|||
cr.set('certificate', [x509.der]); |
|||
|
|||
// We send the PaymentRequest to the customer
|
|||
var pr = new PayPro(); |
|||
pr = pr.makePaymentRequest(); |
|||
pr.set('payment_details_version', 1); |
|||
pr.set('pki_type', 'x509+sha256'); |
|||
pr.set('pki_data', cr.serialize()); |
|||
pr.set('serialized_payment_details', pd.serialize()); |
|||
pr.sign(x509.priv); |
|||
|
|||
pr = pr.serialize(); |
|||
|
|||
// BIP-71 - set the content-type
|
|||
res.setHeader('Content-Type', PayPro.PAYMENT_REQUEST_CONTENT_TYPE); |
|||
res.setHeader('Content-Length', pr.length + ''); |
|||
res.setHeader('Content-Transfer-Encoding', 'binary'); |
|||
|
|||
res.send(pr); |
|||
}); |
|||
|
|||
/** |
|||
* Receive Payment |
|||
*/ |
|||
|
|||
app.post('/-/pay', function(req, res, next) { |
|||
var body = req.paymentData; |
|||
|
|||
print('Received Payment Message Body:'); |
|||
print(body.toString('hex')); |
|||
|
|||
body = PayPro.Payment.decode(body); |
|||
|
|||
var pay = new PayPro(); |
|||
pay = pay.makePayment(body); |
|||
var merchant_data = pay.get('merchant_data'); |
|||
var transactions = pay.get('transactions'); |
|||
var refund_to = pay.get('refund_to'); |
|||
var memo = pay.get('memo'); |
|||
|
|||
print('Received Payment from %s.', req.socket.remoteAddress); |
|||
print('Customer Message: %s', memo); |
|||
print('Payment Message:'); |
|||
print(pay); |
|||
|
|||
// We send this to the customer after receiving a Payment
|
|||
// Then we propogate the transaction through bitcoin network
|
|||
var ack = new PayPro(); |
|||
ack = ack.makePaymentACK(); |
|||
ack.set('payment', pay.message); |
|||
ack.set('memo', 'Thank you for your payment!'); |
|||
|
|||
ack = ack.serialize(); |
|||
|
|||
// BIP-71 - set the content-type
|
|||
res.setHeader('Content-Type', PayPro.PAYMENT_ACK_CONTENT_TYPE); |
|||
res.setHeader('Content-Length', ack.length + ''); |
|||
res.setHeader('Content-Transfer-Encoding', 'binary'); |
|||
|
|||
transactions = transactions.map(function(tx) { |
|||
tx.buffer = tx.buffer.slice(tx.offset, tx.limit); |
|||
var ptx = new bitcore.Transaction(); |
|||
ptx.parse(tx.buffer); |
|||
return ptx; |
|||
}); |
|||
|
|||
if (!argv['no-tx']) { |
|||
(function retry() { |
|||
var timeout = setTimeout(function() { |
|||
if (conn) { |
|||
transactions.forEach(function(tx) { |
|||
var id = tx.getHash().toString('hex'); |
|||
print(''); |
|||
print('Sending transaction with txid: %s', id); |
|||
print(tx.getStandardizedObject()); |
|||
|
|||
print('Broadcasting transaction...'); |
|||
|
|||
var pending = 1; |
|||
peerman.on('ack', function listener() { |
|||
if (!--pending) { |
|||
peerman.removeListener('ack', listener); |
|||
clearTimeout(timeout); |
|||
print('Transaction sent to peer successfully.'); |
|||
res.send(ack); |
|||
} |
|||
}); |
|||
conn.sendTx(tx); |
|||
}); |
|||
} else { |
|||
print('No BTC network connection. Retrying...'); |
|||
conn = peerman.getActiveConnection(); |
|||
retry(); |
|||
} |
|||
}, 1000); |
|||
})(); |
|||
} else { |
|||
print('Broadcasting transaction...'); |
|||
res.send(ack); |
|||
} |
|||
}); |
|||
|
|||
/** |
|||
* Bitcoin |
|||
*/ |
|||
|
|||
var conn; |
|||
|
|||
var peerman = new bitcore.PeerManager({ |
|||
network: 'testnet' |
|||
}); |
|||
|
|||
peerman.peerDiscovery = argv.d || argv.discovery || false; |
|||
|
|||
peerman.addPeer(new bitcore.Peer('testnet-seed.alexykot.me', 18333)); |
|||
peerman.addPeer(new bitcore.Peer('testnet-seed.bitcoin.petertodd.org', 18333)); |
|||
peerman.addPeer(new bitcore.Peer('testnet-seed.bluematt.me', 18333)); |
|||
|
|||
peerman.on('connect', function() { |
|||
conn = peerman.getActiveConnection(); |
|||
}); |
|||
|
|||
peerman.start(); |
|||
|
|||
/** |
|||
* File Access |
|||
*/ |
|||
|
|||
app.use(express.static(__dirname)); |
|||
|
|||
/** |
|||
* Helpers |
|||
*/ |
|||
|
|||
var log = require('../../util/log'); |
|||
|
|||
log.err = error; |
|||
log.debug = error; |
|||
log.info = print; |
|||
|
|||
var util = require('util'); |
|||
|
|||
function print() { |
|||
var args = Array.prototype.slice.call(arguments); |
|||
if (typeof args[0] !== 'string') { |
|||
args[0] = util.inspect(args[0], null, 20, true); |
|||
console.log('\x1b[34mServer:\x1b[m'); |
|||
console.log(args[0]); |
|||
return; |
|||
} |
|||
if (!args[0]) return process.stdout.write('\n'); |
|||
var msg = '\x1b[34mServer:\x1b[m ' |
|||
+ util.format.apply(util.format, args); |
|||
return process.stdout.write(msg + '\n'); |
|||
} |
|||
|
|||
function error() { |
|||
var args = Array.prototype.slice.call(arguments); |
|||
if (typeof args[0] !== 'string') { |
|||
args[0] = util.inspect(args[0], null, 20, true); |
|||
console.log('\x1b[34mServer:\x1b[m'); |
|||
console.log(args[0]); |
|||
return; |
|||
} |
|||
if (!args[0]) return process.stderr.write('\n'); |
|||
var msg = '\x1b[34mServer:\x1b[m \x1b[31m' |
|||
+ util.format.apply(util.format, args) |
|||
+ '\x1b[m'; |
|||
return process.stderr.write(msg + '\n'); |
|||
} |
|||
|
|||
/** |
|||
* Start Server |
|||
*/ |
|||
|
|||
server.on('request', app); |
|||
server.app = app; |
|||
server.port = 8080; |
|||
server.isNode = true; |
|||
|
|||
setTimeout(function() { |
|||
server.port = argv.p = argv.port = +argv.p || +argv.port || 8080; |
|||
server.isNode = !argv.b && !argv.browser; |
|||
if (argv.s || argv.server || argv.l || argv.listen) { |
|||
server.listen(server.port, function(addr) { |
|||
print('Listening on port %s.', server.port); |
|||
}); |
|||
return; |
|||
} |
|||
if (!module.parent || path.basename(module.parent.filename) === 'index.js') { |
|||
server.listen(server.port, function(addr) { |
|||
print('Listening on port %s.', server.port); |
|||
if (!server.isNode) return; |
|||
var customer = require('./customer'); |
|||
customer.sendPayment(function(err) { |
|||
if (err) return error(err.message); |
|||
customer.print('Payment sent successfully.'); |
|||
}); |
|||
}); |
|||
} |
|||
}, 1); |
|||
|
|||
module.exports = server; |
@ -1,66 +0,0 @@ |
|||
/** |
|||
* Stylesheet for Payment Protocol |
|||
*/ |
|||
|
|||
/** |
|||
* Raleway |
|||
*/ |
|||
|
|||
@font-face { |
|||
font-family: 'Raleway'; |
|||
font-style: normal; |
|||
font-weight: 400; |
|||
src: local('Raleway'), url(http://themes.googleusercontent.com/static/fonts/raleway/v7/cIFypx4yrWPDz3zOxk7hIQLUuEpTyoUstqEm5AMlJo4.woff) format('woff'); |
|||
} |
|||
|
|||
/** |
|||
* Ubuntu |
|||
*/ |
|||
|
|||
@font-face { |
|||
font-family: 'Ubuntu'; |
|||
font-style: normal; |
|||
font-weight: 400; |
|||
src: local('Ubuntu'), url(https://themes.googleusercontent.com/static/fonts/ubuntu/v5/lhhB5ZCwEkBRbHMSnYuKyA.ttf) format('truetype'); |
|||
} |
|||
|
|||
article, aside, details, figcaption, figure, footer, header, hgroup, nav, section, summary { |
|||
display: block |
|||
} |
|||
|
|||
html { |
|||
width: 840px; |
|||
font-family: "Raleway", "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", "Helvetica", "Verdana", sans-serif; |
|||
font-size: 22px; |
|||
line-height: 30px; |
|||
-webkit-font-smoothing: antialiased; |
|||
text-rendering: optimizeLegibility; |
|||
color: #000; |
|||
background-image: -webkit-gradient( linear, 0 0, 0 100%, color-stop(0, rgba(0, 0, 0, 0.15)), color-stop(0.2, transparent), color-stop(0.8, transparent), color-stop(1, rgba(0, 0, 0, 0.15))); |
|||
background-image: -moz-linear-gradient( -90deg, rgba(0, 0, 0, 0.15) 0%, transparent 20%, transparent 80%, rgba(0, 0, 0, 0.15) 100%); |
|||
background-attachment: fixed; |
|||
background-color: #c1d3e3; |
|||
} |
|||
|
|||
input { |
|||
display: block; |
|||
margin: 0 0 20px 0; |
|||
font-family: "Raleway", "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", "Helvetica", "Verdana", sans-serif; |
|||
font-size: 22px; |
|||
line-height: 30px; |
|||
-webkit-font-smoothing: antialiased; |
|||
text-rendering: optimizeLegibility; |
|||
color: #000; |
|||
} |
|||
|
|||
body { |
|||
padding: 20px; |
|||
text-shadow: rgba(0, 0, 0, 0.025) 0 -1px 0, rgba(255, 255, 255, 0.2) 0 1px 0; |
|||
} |
|||
|
|||
h1 { |
|||
width: 350px; |
|||
color: #000; |
|||
font: 60px/1.0 "Ubuntu", "Helvetica", "Verdana", "Arial", sans-serif; |
|||
margin-left: 20px; |
|||
} |
@ -1,17 +0,0 @@ |
|||
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); |
@ -1,6 +0,0 @@ |
|||
var PeerManager = require('../lib/PeerManager'); |
|||
var peerman = new PeerManager(); |
|||
|
|||
peerman.discover({ |
|||
limit: 12 |
|||
}).start(); |
@ -1,47 +0,0 @@ |
|||
'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(); |
|||
} |
@ -1,32 +0,0 @@ |
|||
'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(); |
|||
} |
@ -1,52 +0,0 @@ |
|||
'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(); |
|||
} |
@ -1,42 +0,0 @@ |
|||
'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 ScriptInterpreter = bitcore.ScriptInterpreter; |
|||
var network = bitcore.networks.testnet; |
|||
|
|||
|
|||
// using "static" method
|
|||
var scriptPubKeyHR = '0x14 0x3744841e13b90b4aca16fe793a7f88da3a23cc71 EQUAL'; |
|||
var scriptPubKey = Script.fromHumanReadable(scriptPubKeyHR); |
|||
|
|||
var scriptSigHR = '0x14 0x3744841e13b90b4aca16fe793a7f88da3a23cc71'; |
|||
var scriptSig = Script.fromHumanReadable(scriptSigHR); |
|||
|
|||
ScriptInterpreter.verifyFull(scriptSig, scriptPubKey, undefined, undefined, |
|||
undefined, undefined, function(err, result) { |
|||
console.log('script verified successfully? ', result) |
|||
}); |
|||
|
|||
// using an instance
|
|||
scriptPubKeyHR = '0x26 0x554e5a49500370e53982a1d5201829562c5d9eebf256eb755b92c9b1449afd99f9f8c3265631 DROP HASH256 0x20 0x34b4f6042e1bcfc6182ee2727a3d0069a9071385bc07b318f57e77a28ffa13ac EQUAL'; |
|||
scriptPubKey = Script.fromHumanReadable(scriptPubKeyHR); |
|||
|
|||
scriptSigHR = '0x41 0x0470e53982a1d5201829562c5d9eebf256eb755b92c9b1449afd99f9f8c3265631142f3bf6954e3bec4bdad1a1a197bf90904a1e6f06c209eb477e2fde00d26691'; |
|||
scriptSig = Script.fromHumanReadable(scriptSigHR); |
|||
|
|||
var si = new ScriptInterpreter(); |
|||
si.verifyFull(scriptSig, scriptPubKey, undefined, undefined, |
|||
undefined, function(err, result) { |
|||
console.log('script verified successfully? ', result) |
|||
}); |
|||
}; |
|||
|
|||
module.exports.run = run; |
|||
if (require.main === module) { |
|||
run(); |
|||
} |
@ -1,107 +0,0 @@ |
|||
'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(); |
|||
} |
@ -1,72 +0,0 @@ |
|||
/** |
|||
* 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); |
|||
}); |
@ -1,28 +0,0 @@ |
|||
'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(); |
|||
} |
@ -1,25 +0,0 @@ |
|||
var Block = require('../lib/block'); |
|||
var BufferReader = require('../lib/bufferreader'); |
|||
var BufferWriter = require('../lib/bufferwriter'); |
|||
|
|||
//This example will parse the blocks in a block file.
|
|||
//To use, pipe in a blk*****.dat file. e.g.:
|
|||
//cat blk00000.dat | node blockreader.js
|
|||
|
|||
var head = null; |
|||
|
|||
process.stdin.on('readable', function() { |
|||
if (!head) { |
|||
head = process.stdin.read(8); |
|||
if (!head) |
|||
return; |
|||
} |
|||
var body = process.stdin.read(head.slice(4).readUInt32LE(0)); |
|||
if (!body) |
|||
return; |
|||
var blockbuf = BufferWriter().write(head).write(body).concat(); |
|||
var block = Block().fromBuffer(blockbuf); |
|||
console.log(block.toJSON()); |
|||
head = null; |
|||
process.stdin.unshift(process.stdin.read()); |
|||
}); |
@ -1 +0,0 @@ |
|||
Run `node browser/build.js -a` in the repository's root directory before using those examples. |
@ -1,58 +0,0 @@ |
|||
<!DOCTYPE html> |
|||
<html> |
|||
<head> |
|||
<style> |
|||
textarea { |
|||
width: 400px; |
|||
height: 100px; |
|||
} |
|||
</style> |
|||
</head> |
|||
<body> |
|||
<script src="../../browser/bundle.js"></script> |
|||
Enter you paper wallet seed:<br> |
|||
<textarea id="seed">aagh hjfj sihk ietj giik wwai awtd uodh hnji |
|||
soss uaku egod utai itos fijj ihgi jhau jtoo</textarea> |
|||
<br> |
|||
<input type="submit" onclick="updateResult()" value="Generate"> |
|||
<div id="result"></div> |
|||
<pre id="console"></pre> |
|||
<script> |
|||
var bitcore = require('bitcore'), |
|||
Address = bitcore.Address, |
|||
Armory = bitcore.Armory; |
|||
|
|||
var logs = document.getElementById('console'); |
|||
function log (msg) { |
|||
logs.insertAdjacentHTML('beforeend', msg + '\n'); |
|||
} |
|||
function clear_log () { |
|||
logs.innerHTML = ''; |
|||
} |
|||
|
|||
function getSeed() { |
|||
return document.getElementById('seed').value; |
|||
} |
|||
|
|||
function updateResult () { |
|||
clear_log(); |
|||
var seed = getSeed(); |
|||
|
|||
var a = Armory.fromSeed(seed); |
|||
log('Armory MPK: '); |
|||
log(''); |
|||
log(''); |
|||
log('<textarea>' + a.pubkey.toString('hex') + '' + a.chaincode.toString('hex') + '</textarea>'); |
|||
log(''); |
|||
log(''); |
|||
log('Some wallet addresses:'); |
|||
for (var i = 0; i < 5; i++) { |
|||
log(Address.fromPubKey(a.pubkey).as('base58')); |
|||
a = a.next(); |
|||
} |
|||
} |
|||
|
|||
updateResult(); |
|||
</script> |
|||
</body> |
|||
</html> |
@ -1,98 +0,0 @@ |
|||
<!DOCTYPE html> |
|||
<html> |
|||
<head> |
|||
<title>Bitcore browser examples</title> |
|||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|||
</head> |
|||
<body> |
|||
<pre> |
|||
<div id='content'></div> |
|||
</pre> |
|||
<script src="../../browser/bundle.js"></script> |
|||
|
|||
<script type="text/javascript"> |
|||
var Address = require('bitcore').Address; |
|||
|
|||
var print = function (s,s2,s3) { |
|||
var div = document.getElementById('content'); |
|||
div.innerHTML += s + (s2||'') + (s3||'') + '<br />'; |
|||
}; |
|||
|
|||
print('<hr> <h1>Address</h1>' ); |
|||
var addrStrings = [ |
|||
"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa", |
|||
"1A1zP1eP5QGefi2DMPTfTL5SLmv7Dixxxx", |
|||
"A1zP1eP5QGefi2DMPTfTL5SLmv7Dixxxx", |
|||
"1600 Pennsylvania Ave NW", |
|||
].map(function(addr) { |
|||
return new Address(addr); |
|||
}); |
|||
|
|||
addrStrings.forEach(function(addr) { |
|||
|
|||
try { |
|||
addr.validate(); |
|||
print(addr.data + ": is a valid address"); |
|||
} catch(e) { |
|||
print(addr.data + ": is not a valid address."); |
|||
} |
|||
|
|||
}); |
|||
print('<hr> <h1>Key</h1>' ); |
|||
/* |
|||
Using bitcore root module |
|||
*/ |
|||
var bitcore = require('bitcore'); |
|||
var Key = bitcore.Key; |
|||
var k = bitcore.Key.generateSync(); |
|||
k.private = new bitcore.Buffer('8d76eb9ddfa64fd29f4c541eac2b03ffdd1810dd19b01a10593fdb08f6be25f5','hex'); |
|||
k.regenerateSync(); |
|||
print ('Generate Key Pair:'); |
|||
print ('Private:' + bitcore.buffertools.toHex(k.private)); |
|||
print ('Public:' + bitcore.buffertools.toHex(k.public)); |
|||
|
|||
print('<hr> <h1>Util</h1>' ); |
|||
var coinUtil = bitcore.util; |
|||
|
|||
var pk = '03d95e184cce34c3cfa58e9a277a09a7c5ed1b2a8134ea1e52887bc66fa3f47071' |
|||
|
|||
var pubKeyHash = coinUtil.sha256(pk); |
|||
print(bitcore.buffertools.toHex(pubKeyHash)); |
|||
pubKeyHash = coinUtil.sha256ripe160(pk); |
|||
print(bitcore.buffertools.toHex(pubKeyHash)); |
|||
|
|||
|
|||
var Buffer = bitcore.Buffer; |
|||
|
|||
pubKeyHash = coinUtil.ripe160(new bitcore.Buffer('hola')); |
|||
print(bitcore.buffertools.toHex(pubKeyHash)); |
|||
|
|||
var bu = new Buffer('a5c756101065ac5b8f689139e6d856fa99e54b5000b6428b43729d334cc9277d', 'hex'); |
|||
print(bitcore.buffertools.toHex(bu)); |
|||
|
|||
var pubKeyHash2 = coinUtil.ripe160(bu); |
|||
print(bitcore.buffertools.toHex(pubKeyHash2)); |
|||
|
|||
|
|||
print('<hr><h1>WalletKey </h1>'); |
|||
var WalletKey = bitcore.WalletKey; |
|||
var networks = bitcore.networks; |
|||
|
|||
|
|||
var priv = 'L4cEVwoNDeYdCQfFJAGkGKPnE2TmqLEuBn4znQChD2ojjQRJVKpU'; |
|||
var s = new WalletKey({ |
|||
network: networks.livenet |
|||
}); |
|||
s.fromObj({ priv: priv}); |
|||
var o = s.storeObj(); |
|||
print("Private: " + o.priv); |
|||
print("Public: " + o.pub); |
|||
print("Addr: " + o.addr); |
|||
|
|||
print('<hr><h1>TransactionBuilder</h1>'); |
|||
console.log = print; |
|||
</script> |
|||
<script src="../CreateAndSignTx-PayToPubkeyHash.js"></script> |
|||
</body> |
|||
</html> |
@ -1,13 +0,0 @@ |
|||
<!DOCTYPE html> |
|||
<html> |
|||
<body> |
|||
<script src="../../browser/bundle.js"></script> |
|||
<pre id="console"></pre> |
|||
<script> |
|||
var bitcore = require('bitcore'); |
|||
var Address = bitcore.Address; |
|||
var a = new Address('1KerhGhLn3SYBEQwby7VyVMWf16fXQUj5d'); |
|||
document.getElementById('console').innerHTML = '1KerhGhLn3SYBEQwby7VyVMWf16fXQUj5d is valid? '+a.isValid(); |
|||
</script> |
|||
</body> |
|||
</html> |
@ -1,21 +0,0 @@ |
|||
var ECDSA = require('../lib/ecdsa'); |
|||
var Keypair = require('../lib/keypair'); |
|||
var Hash = require('../lib/hash'); |
|||
|
|||
//ECDSA is the signature algorithm used in bitcoin
|
|||
|
|||
//start with a keypair that you will use for signing
|
|||
var keypair = Keypair().fromRandom(); |
|||
|
|||
//a message to be signed (normally you would have the hash of a transaction)
|
|||
var messagebuf = new Buffer('This is a message I would like to sign'); |
|||
|
|||
//calculate a 32 byte hash for use in ECDSA. one way to do that is sha256.
|
|||
var hashbuf = Hash.sha256(messagebuf); |
|||
|
|||
var sig = ECDSA.sign(hashbuf, keypair); |
|||
|
|||
//Anyone with the public key can verify
|
|||
var pubkey = keypair.pubkey; |
|||
console.log('Valid signature? ' + ECDSA.verify(hashbuf, sig, pubkey)); |
|||
|
@ -1,63 +0,0 @@ |
|||
var Pubkey = require('../lib/pubkey'); |
|||
var Address = require('../lib/address'); |
|||
var Stealthkey = require('../lib/expmt/stealthkey'); |
|||
var StealthAddress = require('../lib/expmt/stealthaddress'); |
|||
var StealthMessage = require('../lib/expmt/stealthmessage'); |
|||
var Keypair = require('../lib/keypair') |
|||
|
|||
//First, the person receiving must make a stealth key.
|
|||
|
|||
var sk = Stealthkey().fromRandom(); |
|||
|
|||
//It has an associated stealth address.
|
|||
|
|||
var sa = StealthAddress().fromStealthkey(sk); |
|||
|
|||
console.log('Stealth address: ' + sa); |
|||
|
|||
//Now make a message.
|
|||
|
|||
var messagebuf = new Buffer('Hello there. Only you know this message is to you, and only you know what it says.'); |
|||
|
|||
//Encrypt the message with the stealth address.
|
|||
|
|||
var encbuf = StealthMessage.encrypt(messagebuf, sa); |
|||
|
|||
console.log('Hex of the encrypted message: ' + encbuf.toString('hex')); |
|||
|
|||
//Note that the first 20 bytes are a pubkeyhash, which may be interpreted as a bitcoin address.
|
|||
//This address has never been seen before in public.
|
|||
|
|||
var address = Address().set({hashbuf: encbuf.slice(0, 20)}); |
|||
|
|||
console.log('The randomly generated address the message is to: ' + address); |
|||
|
|||
//And the next 33 bytes are a nonce public key, which the message is "from".
|
|||
//It has never been seen before in public.
|
|||
|
|||
var pubkey = Pubkey().fromDER(encbuf.slice(20, 20 + 33)); |
|||
|
|||
console.log('Nonce public key: ' + pubkey); |
|||
|
|||
//The owner of the stealth key can check to see if it is for them.
|
|||
|
|||
console.log('Is the message for me? ' + (StealthMessage.isForMe(encbuf, sk) ? "yes" : "no")); |
|||
|
|||
//The owner can decrypt it.
|
|||
|
|||
var messagebuf2 = StealthMessage.decrypt(encbuf, sk); |
|||
|
|||
console.log('Decrypted message: ' + messagebuf2.toString()); |
|||
|
|||
//If you do not have the payload privkey, you can still use isForMe.
|
|||
sk.payloadKeypair.privkey = undefined; |
|||
|
|||
console.log('Without payload privkey, is the message for me? ' + (StealthMessage.isForMe(encbuf, sk) ? "yes" : "no")); |
|||
|
|||
//...but not decrypt
|
|||
|
|||
try { |
|||
StealthMessage.decrypt(encbuf, sk); |
|||
} catch (e) { |
|||
console.log("...but without the payload privkey, I can't decrypt."); |
|||
} |
Loading…
Reference in new issue