Compare commits
55 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
51c53b16ce | ||
|
|
29b11b1896 | ||
|
|
e20df21449 | ||
|
|
dc3f653fe2 | ||
|
|
a868ec0ef4 | ||
|
|
e2952b6e3a | ||
|
|
0d238f1165 | ||
|
|
28bb0f4cfc | ||
|
|
684c306833 | ||
|
|
722e2efeae | ||
|
|
100de8a9ba | ||
|
|
5d2d5ef024 | ||
|
|
0d58557cac | ||
|
|
26fb622cbe | ||
|
|
2ff90b7ab9 | ||
|
|
b1a7a9907c | ||
|
|
38b69f4bfc | ||
|
|
cd69983c31 | ||
|
|
bac81ce88e | ||
|
|
fe4bbf3d72 | ||
|
|
3e43d79b6e | ||
|
|
4984d81284 | ||
|
|
8c423d5cf1 | ||
|
|
9640cba354 | ||
|
|
ebbf6b4ef7 | ||
|
|
8b451f2bb5 | ||
|
|
b18ee9a49d | ||
|
|
f76b184e48 | ||
|
|
5986e9b887 | ||
|
|
9096fc4928 | ||
|
|
f21cb1d8b0 | ||
|
|
bf54f79856 | ||
|
|
21c5cff10d | ||
|
|
c996f08040 | ||
|
|
b5219c7805 | ||
|
|
c9c49da658 | ||
|
|
e154c205b3 | ||
|
|
c380e4698a | ||
|
|
50d36d5b30 | ||
|
|
66b11a565f | ||
|
|
acd86fdc43 | ||
|
|
586c8c0e20 | ||
|
|
f28d500b76 | ||
|
|
2fe70f9f52 | ||
|
|
c730eb5b3f | ||
|
|
df8e219a89 | ||
|
|
b0d1121165 | ||
|
|
fdea02e9a6 | ||
|
|
212fa1498e | ||
|
|
7f03d154dd | ||
|
|
98056209a9 | ||
|
|
693f2aac7b | ||
|
|
ba9ff424c2 | ||
|
|
29dcf56262 | ||
|
|
36c164cb30 |
@ -1 +1 @@
|
||||
repo_token: lBB0wwrjIH3RkwvTjkv8g5r4aUjcIUreC
|
||||
repo_token: 92KyB69bPowWlcfgXqc24kE5Qt60cCPba
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@ -11,3 +11,4 @@ coverage
|
||||
.DS_Store
|
||||
docs
|
||||
browser/bitcore-dev.js
|
||||
browser/testdata.js
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- '0.10'
|
||||
- '0.10.35'
|
||||
notifications:
|
||||
hipchat:
|
||||
rooms:
|
||||
|
||||
@ -104,7 +104,7 @@ node browser/build.js -a
|
||||
To generate a customized bitcore bundle, you can specify which submodules you want to include in it with the -s option:
|
||||
|
||||
```
|
||||
node browser/build.js -s Transaction,Address
|
||||
node browser/build.js -s lib/Transaction,lib/Address
|
||||
```
|
||||
|
||||
This will generate a `browser/bundle.js` containing only the Transaction and Address class, with all their dependencies. Use this option if you are not using the whole bitcore library, to optimize the bundle size, script loading time, and general resource usage.
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
5960
browser/testdata.js
5960
browser/testdata.js
File diff suppressed because one or more lines are too long
191
examples.md
191
examples.md
@ -1,4 +1,7 @@
|
||||
#Address.js
|
||||
|
||||
```js
|
||||
|
||||
'use strict';
|
||||
|
||||
|
||||
@ -27,8 +30,12 @@
|
||||
if (require.main === module) {
|
||||
run();
|
||||
}
|
||||
```
|
||||
|
||||
#Armory.js
|
||||
|
||||
```js
|
||||
|
||||
var Armory = require('../lib/Armory');
|
||||
var Address = require('../lib/Address');
|
||||
|
||||
@ -94,8 +101,12 @@
|
||||
console.log(Address.fromPubKey(b.pubkey).as('base58'));
|
||||
b = b.next();
|
||||
}
|
||||
```
|
||||
|
||||
#ConnectionTor.js
|
||||
|
||||
```js
|
||||
|
||||
var Peer = require('../lib/Peer');
|
||||
var Connection = require('../lib/Connection');
|
||||
var dns = require('dns');
|
||||
@ -133,8 +144,12 @@
|
||||
});
|
||||
|
||||
});
|
||||
```
|
||||
|
||||
#CreateAndSignTx-Multisig.js
|
||||
|
||||
```js
|
||||
|
||||
var run = function() {
|
||||
bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore;
|
||||
var networks = require('../networks');
|
||||
@ -155,6 +170,7 @@
|
||||
address: input.addr,
|
||||
txid: "39c71ebda371f75f4b854a720eaf9898b237facf3c2b101b58cd4383a44a6adc",
|
||||
vout: 1,
|
||||
ts: 1396288753,
|
||||
scriptPubKey: "76a914e867aad8bd361f57c50adc37a0c018692b5b0c9a88ac",
|
||||
amount: 0.4296,
|
||||
confirmations: 2
|
||||
@ -204,6 +220,7 @@
|
||||
address: input.addr,
|
||||
txid: "e4bc22d8c519d3cf848d710619f8480be56176a4a6548dfbe865ab3886b578b5",
|
||||
vout: 0,
|
||||
ts: 1396288753,
|
||||
scriptPubKey: scriptPubKey,
|
||||
amount: 0.05,
|
||||
confirmations: 2
|
||||
@ -241,8 +258,12 @@
|
||||
}
|
||||
|
||||
////
|
||||
```
|
||||
|
||||
#CreateAndSignTx-PayToPubkeyHash.js
|
||||
|
||||
```js
|
||||
|
||||
var run = function() {
|
||||
bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore;
|
||||
|
||||
@ -255,6 +276,7 @@
|
||||
address: "mqSjTad2TKbPcKQ3Jq4kgCkKatyN44UMgZ",
|
||||
txid: "2ac165fa7a3a2b535d106a0041c7568d03b531e58aeccdd3199d7289ab12cfc1",
|
||||
vout: 1,
|
||||
ts: 1394719301,
|
||||
scriptPubKey: "76a9146ce4e1163eb18939b1440c42844d5f0261c0338288ac",
|
||||
amount: 0.01,
|
||||
confirmations: 2
|
||||
@ -315,8 +337,12 @@
|
||||
}
|
||||
|
||||
////
|
||||
```
|
||||
|
||||
#CreateAndSignTx-PayToScriptHash.js
|
||||
|
||||
```js
|
||||
|
||||
var run = function() {
|
||||
bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore;
|
||||
var networks = require('../networks');
|
||||
@ -338,6 +364,7 @@
|
||||
address: "n2hoFVbPrYQf7RJwiRy1tkbuPPqyhAEfbp",
|
||||
txid: "e4bc22d8c519d3cf848d710619f8480be56176a4a6548dfbe865ab3886b578b5",
|
||||
vout: 1,
|
||||
ts: 1396290442,
|
||||
scriptPubKey: "76a914e867aad8bd361f57c50adc37a0c018692b5b0c9a88ac",
|
||||
amount: 0.3795,
|
||||
confirmations: 7
|
||||
@ -402,6 +429,7 @@
|
||||
address: p2shAddress,
|
||||
txid: "c2e50d1c8c581d8c4408378b751633f7eb86687fc5f0502be7b467173f275ae7",
|
||||
vout: 0,
|
||||
ts: 1396375187,
|
||||
scriptPubKey: scriptPubKey,
|
||||
amount: 0.05,
|
||||
confirmations: 1
|
||||
@ -466,8 +494,12 @@
|
||||
} else {
|
||||
run();
|
||||
}
|
||||
```
|
||||
|
||||
#CreateKey.js
|
||||
|
||||
```js
|
||||
|
||||
'use strict';
|
||||
|
||||
|
||||
@ -516,8 +548,12 @@
|
||||
if (require.main === module) {
|
||||
run();
|
||||
}
|
||||
```
|
||||
|
||||
#CreateScript.js
|
||||
|
||||
```js
|
||||
|
||||
'use strict';
|
||||
|
||||
var run = function() {
|
||||
@ -594,8 +630,12 @@
|
||||
if (require.main === module) {
|
||||
run();
|
||||
}
|
||||
```
|
||||
|
||||
#ECIES.js
|
||||
|
||||
```js
|
||||
|
||||
var run = function() {
|
||||
bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore;
|
||||
|
||||
@ -626,8 +666,12 @@
|
||||
} else {
|
||||
run();
|
||||
}
|
||||
```
|
||||
|
||||
#ElectrumMPK.js
|
||||
|
||||
```js
|
||||
|
||||
var Electrum = require('../lib/Electrum');
|
||||
var Address = require('../lib/Address');
|
||||
|
||||
@ -639,8 +683,12 @@
|
||||
var addr0 = Address.fromPubKey(key0);
|
||||
|
||||
console.log(addr0.as('base58'));
|
||||
```
|
||||
|
||||
#HierarchicalKey.js
|
||||
|
||||
```js
|
||||
|
||||
var run = function() {
|
||||
bitcore = typeof(bitcore) === 'undefined' ? require('../bitcore') : bitcore;
|
||||
var HierarchicalKey = bitcore.HierarchicalKey;
|
||||
@ -724,8 +772,73 @@
|
||||
} else {
|
||||
run();
|
||||
}
|
||||
```
|
||||
|
||||
#NetworkMonitor.js
|
||||
|
||||
```js
|
||||
|
||||
'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();
|
||||
}
|
||||
```
|
||||
|
||||
#Opreturn.js
|
||||
|
||||
```js
|
||||
|
||||
'use strict';
|
||||
|
||||
var run = function() {
|
||||
// Replace '../bitcore' with 'bitcore' if you use this code elsewhere.
|
||||
var bitcore = require('../bitcore');
|
||||
var Address = bitcore.Address;
|
||||
var coinUtil = bitcore.util;
|
||||
var Script = bitcore.Script;
|
||||
var network = bitcore.networks.testnet;
|
||||
|
||||
var 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();
|
||||
}
|
||||
```
|
||||
|
||||
#PayToScriptHashAddress.js
|
||||
|
||||
```js
|
||||
|
||||
var bitcore = require('../bitcore');
|
||||
var Address = bitcore.Address;
|
||||
var bitcoreUtil = bitcore.util;
|
||||
@ -743,16 +856,24 @@
|
||||
|
||||
// This outputs the "address" of thescript
|
||||
console.log(addrStr);
|
||||
```
|
||||
|
||||
#PeerDiscovery.js
|
||||
|
||||
```js
|
||||
|
||||
var PeerManager = require('../lib/PeerManager');
|
||||
var peerman = new PeerManager();
|
||||
|
||||
peerman.discover({
|
||||
limit: 12
|
||||
}).start();
|
||||
```
|
||||
|
||||
#PeerManager.js
|
||||
|
||||
```js
|
||||
|
||||
'use strict';
|
||||
|
||||
var run = function() {
|
||||
@ -800,8 +921,12 @@
|
||||
if (require.main === module) {
|
||||
run();
|
||||
}
|
||||
```
|
||||
|
||||
#Rpc.js
|
||||
|
||||
```js
|
||||
|
||||
'use strict';
|
||||
|
||||
var run = function() {
|
||||
@ -834,8 +959,12 @@
|
||||
if (require.main === module) {
|
||||
run();
|
||||
}
|
||||
```
|
||||
|
||||
#Script.js
|
||||
|
||||
```js
|
||||
|
||||
'use strict';
|
||||
|
||||
var run = function() {
|
||||
@ -888,8 +1017,60 @@
|
||||
if (require.main === module) {
|
||||
run();
|
||||
}
|
||||
```
|
||||
|
||||
#ScriptInterpreter.js
|
||||
|
||||
```js
|
||||
|
||||
'use strict';
|
||||
|
||||
var run = function() {
|
||||
// Replace '../bitcore' with 'bitcore' if you use this code elsewhere.
|
||||
var bitcore = require('../bitcore');
|
||||
var Address = bitcore.Address;
|
||||
var coinUtil = bitcore.util;
|
||||
var Script = bitcore.Script;
|
||||
var 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();
|
||||
}
|
||||
```
|
||||
|
||||
#SendTx.js
|
||||
|
||||
```js
|
||||
|
||||
'use strict';
|
||||
|
||||
var run = function() {
|
||||
@ -997,8 +1178,12 @@
|
||||
if (require.main === module) {
|
||||
run();
|
||||
}
|
||||
```
|
||||
|
||||
#SimpleP2Pmonitor.js
|
||||
|
||||
```js
|
||||
|
||||
/**
|
||||
* This is a simple script that will display network messages.
|
||||
* It users the Peer / Connection classes directly instead of
|
||||
@ -1071,8 +1256,12 @@
|
||||
log('Received message inv (%s invs)', event.message.count);
|
||||
console.log(event.message.invs);
|
||||
});
|
||||
```
|
||||
|
||||
#VanityAddress.js
|
||||
|
||||
```js
|
||||
|
||||
'use strict';
|
||||
|
||||
|
||||
@ -1101,4 +1290,4 @@
|
||||
if (require.main === module) {
|
||||
run();
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
22
examples/browser/ECIES.html
Normal file
22
examples/browser/ECIES.html
Normal file
@ -0,0 +1,22 @@
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<script src="../../browser/bundle.js"></script>
|
||||
<script type="text/javascript">
|
||||
var bitcore = require('bitcore');
|
||||
var Buffer = bitcore.Buffer;
|
||||
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 encrypt');
|
||||
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() + '"');
|
||||
</script>
|
||||
</head>
|
||||
|
||||
</html>
|
||||
@ -9,7 +9,7 @@ var format = es.through(
|
||||
if (file.isStream()) return this.emit('error', new Error('Streaming not supported'));
|
||||
|
||||
//add indentation
|
||||
var contents = "\t" + file.contents.toString("utf8").split("\n").join("\n\t");
|
||||
var contents = "\n```js\n\n" + file.contents.toString("utf8").split("\n").join("\n") + "```\n";
|
||||
//add header
|
||||
contents = ["#", path.basename(file.path), "\n", contents].join("");
|
||||
file.contents = new Buffer(contents, "utf8");
|
||||
|
||||
@ -189,7 +189,13 @@ Address.fromPubkeyHashScriptSig = function(scriptSig, network) {
|
||||
//extract an address from scriptSig
|
||||
Address.fromScriptSig = function(scriptSig, network) {
|
||||
if (typeof scriptSig === 'string') {
|
||||
scriptSig = new Script(new Buffer(scriptSig, 'hex'));
|
||||
try {
|
||||
var scriptSigBuf = new Buffer(scriptSig, 'hex')
|
||||
} catch(err) {
|
||||
// Error: Invalid public key
|
||||
return null;
|
||||
}
|
||||
scriptSig = new Script(scriptSigBuf);
|
||||
}
|
||||
if (!network)
|
||||
network = 'livenet';
|
||||
|
||||
@ -1,8 +1,6 @@
|
||||
var util = require('../util');
|
||||
var Script = require('./Script');
|
||||
var Bignum = require('bignum');
|
||||
var Binary = require('binary');
|
||||
var Step = require('step');
|
||||
var buffertools = require('buffertools');
|
||||
var Transaction = require('./Transaction');
|
||||
var TransactionIn = Transaction.In;
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
var Net = require('net');
|
||||
var Binary = require('binary');
|
||||
var Put = require('bufferput');
|
||||
var buffertools = require('buffertools');
|
||||
|
||||
function Peer(host, port, services) {
|
||||
@ -45,7 +45,7 @@ Peer.prototype.toString = function() {
|
||||
};
|
||||
|
||||
Peer.prototype.toBuffer = function() {
|
||||
var put = Binary.put();
|
||||
var put = new Put();
|
||||
put.word32le(this.lastSeen);
|
||||
put.word64le(this.services);
|
||||
put.put(this.getHostAsBuffer());
|
||||
|
||||
@ -15,6 +15,7 @@ function RpcClient(opts) {
|
||||
this.protocol = (opts.protocol == 'http') ? http : https;
|
||||
this.batchedCalls = null;
|
||||
this.disableAgent = opts.disableAgent || false;
|
||||
this.rejectUnauthorized = opts.rejectUnauthorized || false;
|
||||
}
|
||||
|
||||
RpcClient.prototype.batch = function(batchCallback, resultCallback) {
|
||||
@ -33,6 +34,7 @@ var callspec = {
|
||||
decodeRawTransaction: '',
|
||||
dumpPrivKey: '',
|
||||
encryptWallet: '',
|
||||
estimateFee: 'int',
|
||||
getAccount: '',
|
||||
getAccountAddress: 'str',
|
||||
getAddedNodeInfo: '',
|
||||
@ -163,6 +165,7 @@ function rpc(request, callback) {
|
||||
path: '/',
|
||||
method: 'POST',
|
||||
port: self.port,
|
||||
rejectUnauthorized: self.rejectUnauthorized,
|
||||
agent: self.disableAgent ? false : undefined,
|
||||
};
|
||||
if (self.httpOptions) {
|
||||
@ -204,7 +207,7 @@ function rpc(request, callback) {
|
||||
});
|
||||
});
|
||||
req.on('error', function(e) {
|
||||
var err = new Error('Could not connect to bitcoin via RPC: ' + e.message);
|
||||
var err = new Error('Could not connect to bitcoin via RPC at host: ' + self.host + ' port: ' + self.port + ' Error: ' + e.message);
|
||||
log.err(err);
|
||||
callback(err);
|
||||
});
|
||||
|
||||
@ -7,7 +7,6 @@ var util = require('../util');
|
||||
var bignum = require('bignum');
|
||||
var Put = require('bufferput');
|
||||
var Parser = require('../util/BinaryParser');
|
||||
var Step = require('step');
|
||||
var buffertools = require('buffertools');
|
||||
var error = require('../util/error');
|
||||
var WalletKey = require('./WalletKey');
|
||||
@ -633,14 +632,19 @@ Transaction.prototype.getReceivingAddresses = function(networkName) {
|
||||
ret = [];
|
||||
for (var i = 0; i<this.outs.length; i++) {
|
||||
var o = this.outs[i];
|
||||
var addr = Address.fromScriptPubKey(o.getScript(), networkName)[0].toString();
|
||||
ret.push(addr);
|
||||
var addrs = Address.fromScriptPubKey(o.getScript(), networkName);
|
||||
if (typeof addrs[0] !== 'undefined') {
|
||||
ret.push(addrs[0].toString());
|
||||
} else {
|
||||
ret.push(null);
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
};
|
||||
|
||||
Transaction.prototype.getSendingAddresses = function(networkName) {
|
||||
var ret = [];
|
||||
if (!networkName) networkName = 'livenet';
|
||||
var ret = [];
|
||||
for (var i = 0; i<this.ins.length; i++) {
|
||||
var input = this.ins[i];
|
||||
var scriptSig = input.getScript();
|
||||
|
||||
@ -744,8 +744,9 @@ fnToSign[Script.TX_SCRIPTHASH] = TransactionBuilder.prototype._signScriptHash;
|
||||
// sign
|
||||
// ----
|
||||
// Signs a transaction.
|
||||
// `keys`: an array of strings representing private keys to sign the
|
||||
// transaction in WIF private key format OR bitcore's `WalletKey` objects
|
||||
// `keys`: an array of strings representing private keys to sign the transaction in WIF private key format
|
||||
// OR bitcore's `WalletKey` objects
|
||||
// OR string representing private keys to sign the transaction in WIF private key format separated by commas
|
||||
//
|
||||
// If multiple keys are given, each will be tested against the transaction's
|
||||
// scriptPubKeys. Only the valid private keys will be used to sign.
|
||||
@ -756,6 +757,7 @@ fnToSign[Script.TX_SCRIPTHASH] = TransactionBuilder.prototype._signScriptHash;
|
||||
//
|
||||
//
|
||||
TransactionBuilder.prototype.sign = function(keys) {
|
||||
if (typeof keys === "string") keys = keys.split(',');
|
||||
if (!(keys instanceof Array))
|
||||
throw new Error('parameter should be an array');
|
||||
|
||||
@ -819,10 +821,12 @@ TransactionBuilder.prototype.build = function() {
|
||||
//
|
||||
TransactionBuilder.prototype.toObj = function() {
|
||||
|
||||
var utxos = this.selectedUtxos && this.selectedUtxos[0] ? this.selectedUtxos : JSON.parse(this.vanilla.utxos);
|
||||
|
||||
var ret = {
|
||||
version: TOOBJ_VERSION,
|
||||
outs: JSON.parse(this.vanilla.outs),
|
||||
utxos: JSON.parse(this.vanilla.utxos),
|
||||
utxos: utxos,
|
||||
opts: JSON.parse(this.vanilla.opts),
|
||||
scriptSig: this.vanilla.scriptSig,
|
||||
};
|
||||
|
||||
@ -23,8 +23,6 @@ bnjs.fromBuffer = function(buf, opts) {
|
||||
buf = nbuf;
|
||||
}
|
||||
var hex = buf.toString('hex');
|
||||
if (hex.length % 2)
|
||||
hex = "0" + hex;
|
||||
var bn = new bnjs(hex, 16);
|
||||
return bn;
|
||||
};
|
||||
@ -32,9 +30,7 @@ bnjs.fromBuffer = function(buf, opts) {
|
||||
bnjs.prototype.toBuffer = function(opts) {
|
||||
var buf;
|
||||
if (opts && opts.size) {
|
||||
var hex = this.toString(16);
|
||||
if (hex.length % 2)
|
||||
hex = "0" + hex;
|
||||
var hex = this.toString(16, 2);
|
||||
var natlen = hex.length/2;
|
||||
buf = new Buffer(hex, 'hex');
|
||||
|
||||
@ -56,9 +52,7 @@ bnjs.prototype.toBuffer = function(opts) {
|
||||
}
|
||||
}
|
||||
else {
|
||||
var hex = this.toString(16);
|
||||
if (hex.length % 2)
|
||||
hex = "0" + hex;
|
||||
var hex = this.toString(16, 2);
|
||||
buf = new Buffer(hex, 'hex');
|
||||
}
|
||||
|
||||
|
||||
@ -160,6 +160,12 @@ Key.sign = function(hash, priv, k) {
|
||||
var Q = Point.multiply(G, k);
|
||||
var r = Q.x.mod(n);
|
||||
var s = k.invm(n).mul(e.add(d.mul(r))).mod(n);
|
||||
//enforce low s
|
||||
//see BIP 62, "low S values in signatures"
|
||||
var n_half = bignum.fromBuffer(new Buffer("7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0", 'hex'), {size: 32});
|
||||
if (s.cmp(n_half) > 0) {
|
||||
s = new bignum(n).sub(s);
|
||||
}
|
||||
} while (r.cmp(new bignum(0)) <= 0 || s.cmp(new bignum(0)) <= 0);
|
||||
|
||||
return {r: r, s: s};
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
var bignum = require('bignum');
|
||||
var Point = require('../Point');
|
||||
var SecureRandom = require('../SecureRandom');
|
||||
var bignum = require('bignum');
|
||||
|
||||
73
package.json
73
package.json
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "bitcore",
|
||||
"description": "Bitcoin Library",
|
||||
"version": "0.1.36",
|
||||
"version": "0.1.41",
|
||||
"author": {
|
||||
"name": "Stephen Pair",
|
||||
"email": "stephen@bitpay.com"
|
||||
@ -30,6 +30,10 @@
|
||||
{
|
||||
"name": "Gordon Hall",
|
||||
"email": "gordon@bitpay.com"
|
||||
},
|
||||
{
|
||||
"name": "Esteban Ordano",
|
||||
"email": "eordano@gmail.com"
|
||||
}
|
||||
],
|
||||
"keywords": [
|
||||
@ -49,44 +53,27 @@
|
||||
"install": "node-gyp rebuild",
|
||||
"test": "node browser/build.js -a && node_modules/.bin/istanbul cover ./node_modules/mocha/bin/_mocha --report lcovonly -- -R spec && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js",
|
||||
"coverage": "./node_modules/.bin/istanbul cover ./node_modules/.bin/_mocha -- --reporter spec test",
|
||||
"prepublish": "node browser/build.js -m"
|
||||
"prepublish": "node browser/build.js -a"
|
||||
},
|
||||
"dependencies": {
|
||||
"grunt-browserify": "~2.0.0",
|
||||
"grunt-contrib-watch": "~0.5.3",
|
||||
"grunt-markdown": "~0.5.0",
|
||||
"grunt-mocha-test": "~0.8.2",
|
||||
"grunt-shell": "~0.6.4",
|
||||
"protobufjs": "=3.0.0",
|
||||
"coveralls": "^2.10.0",
|
||||
"istanbul": "~0.2.6",
|
||||
"commander": "~2.2.0",
|
||||
"mocha": ">=1.15.1",
|
||||
"sjcl": "=1.0.1",
|
||||
"hash.js": "=0.3.1",
|
||||
"bn.js": "=0.13.3",
|
||||
"jsrsasign": "=0.0.3",
|
||||
"elliptic": "=0.15.7",
|
||||
"asn1.js": "0.4.1",
|
||||
"async": "~0.2.10",
|
||||
"bignum": "^0.9.0",
|
||||
"binary": "^0.3.0",
|
||||
"bindings": "=1.1.1",
|
||||
"bn.js": "=1.0.0",
|
||||
"brfs": "=1.0.0",
|
||||
"browserify-buffertools": "git://github.com/maraoz/browserify-buffertools.git",
|
||||
"bufferput": "git://github.com/bitpay/node-bufferput.git",
|
||||
"bignum": "=0.6.2",
|
||||
"binary": "=0.3.0",
|
||||
"step": "=0.0.4",
|
||||
"buffers": "=0.1.1",
|
||||
"buffertools": "=2.1.2",
|
||||
"browserify": "=3.40.0",
|
||||
"browser-pack": "=2.0.1",
|
||||
"browserify-buffertools": "git://github.com/maraoz/browserify-buffertools.git",
|
||||
"socks5-client": "~0.3.6",
|
||||
"brfs": "=1.0.0",
|
||||
"chai": "=1.9.1",
|
||||
"uglifyify": "=1.2.3",
|
||||
"async": "~0.2.10",
|
||||
"event-stream": "~3.1.5",
|
||||
"gulp-concat": "~2.2.0",
|
||||
"gulp": "~3.8.2",
|
||||
"elliptic": "=1.0.0",
|
||||
"hash.js": "=0.3.2",
|
||||
"jsrsasign": "=0.0.3",
|
||||
"preconditions": "^1.0.7",
|
||||
"asn1.js": "0.4.1"
|
||||
"protobufjs": "=3.0.0",
|
||||
"sjcl": "=1.0.1",
|
||||
"socks5-client": "~0.3.6"
|
||||
},
|
||||
"testling": {
|
||||
"harness": "mocha-bdd",
|
||||
@ -104,6 +91,7 @@
|
||||
},
|
||||
"browser": {
|
||||
"bignum": "./lib/browser/Bignum.js",
|
||||
"buffertools": "browserify-buffertools",
|
||||
"./lib/Key.js": "./lib/browser/Key.js",
|
||||
"./lib/Point.js": "./lib/browser/Point.js",
|
||||
"./lib/ECIES.js": "./lib/browser/ECIES.js",
|
||||
@ -112,12 +100,27 @@
|
||||
},
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=0.10"
|
||||
"node": ">=0.10 <0.10.36"
|
||||
},
|
||||
"devDependencies": {
|
||||
"sinon": "^1.10.3",
|
||||
"browserify": "=3.40.0",
|
||||
"chai": "=1.9.1",
|
||||
"commander": "~2.2.0",
|
||||
"coveralls": "^2.10.0",
|
||||
"event-stream": "~3.1.5",
|
||||
"express": "4.6.1",
|
||||
"grunt-browserify": "~2.0.0",
|
||||
"grunt-contrib-watch": "~0.5.3",
|
||||
"grunt-markdown": "~0.5.0",
|
||||
"grunt-mocha-test": "~0.8.2",
|
||||
"grunt-shell": "~0.6.4",
|
||||
"gulp": "~3.8.2",
|
||||
"gulp-concat": "~2.2.0",
|
||||
"istanbul": "~0.2.6",
|
||||
"mocha": ">=1.15.1",
|
||||
"optimist": "0.6.1",
|
||||
"request": "2.39.0",
|
||||
"optimist": "0.6.1"
|
||||
"sinon": "^1.10.3",
|
||||
"uglifyify": "=1.2.3"
|
||||
}
|
||||
}
|
||||
|
||||
@ -934,8 +934,8 @@ describe('TransactionBuilder', function() {
|
||||
it('should check sign parameters', function() {
|
||||
var b = getP2shBuilder(1);
|
||||
(function() {
|
||||
b.sign(testdata.dataUnspentSign.keyStringsP2sh[0])
|
||||
}).should.throw('array');
|
||||
b.sign(testdata.dataUnspentSign.keyStringsP2sh[0]);
|
||||
}).should.not.throw('array');
|
||||
});
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user