remove old examples

This commit is contained in:
Eric Martindale 2014-10-02 22:35:59 -04:00
parent be95a3f3a7
commit 7c3f1d80d1
36 changed files with 0 additions and 2566 deletions

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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);
});
});

View File

@ -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();
}
////

View File

@ -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();
}
////

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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'));

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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);
```

View File

@ -1 +0,0 @@
../../browser/bundle.js

View File

@ -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);
}());

View File

@ -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>

View File

@ -1,3 +0,0 @@
#!/usr/bin/env node
module.exports = require('./server');

View File

@ -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;

View File

@ -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;
}

View File

@ -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);

View File

@ -1,6 +0,0 @@
var PeerManager = require('../lib/PeerManager');
var peerman = new PeerManager();
peerman.discover({
limit: 12
}).start();

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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);
});

View File

@ -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();
}

View File

@ -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());
});

View File

@ -1 +0,0 @@
Run `node browser/build.js -a` in the repository's root directory before using those examples.

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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));

View File

@ -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.");
}