fix conflicts
This commit is contained in:
commit
dc8d23dba5
|
@ -1,5 +1,6 @@
|
|||
build/
|
||||
browser/bundle.js
|
||||
browser/vendor-bundle.js
|
||||
browser/testdata.js
|
||||
node_modules/
|
||||
*.swp
|
||||
|
|
|
@ -9,6 +9,7 @@ function Address() {
|
|||
Address.parent = parent;
|
||||
parent.applyEncodingsTo(Address);
|
||||
|
||||
|
||||
Address.prototype.validate = function() {
|
||||
this.doAsBinary(function() {
|
||||
Address.super(this, 'validate', arguments);
|
||||
|
@ -16,4 +17,9 @@ Address.prototype.validate = function() {
|
|||
});
|
||||
};
|
||||
|
||||
Address.prototype.isValid = function() {
|
||||
var answer = Address.super(this, 'isValid', arguments);
|
||||
return answer;
|
||||
};
|
||||
|
||||
module.exports = require('soop')(Address);
|
||||
|
|
|
@ -16,7 +16,7 @@ module.exports = function(grunt) {
|
|||
stdout: true,
|
||||
stderr: true
|
||||
},
|
||||
command: 'node ./browser/browserify.js',
|
||||
command: 'node ./browser/browserify.js -a',
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
|
@ -25,7 +25,7 @@ module.exports = function(grunt) {
|
|||
tasks: ['markdown']
|
||||
},
|
||||
scripts: {
|
||||
files: ['**/*.js', '**/*.html', '!**/node_modules/**', '!browser/bundle.js', '!browser/testdata.js'],
|
||||
files: ['**/*.js', '**/*.html', '!**/node_modules/**', '!browser/bundle.js', '!browser/testdata.js', '!browser/vendor-bundle.js'],
|
||||
tasks: ['shell'],
|
||||
},
|
||||
},
|
||||
|
|
7
Key.js
7
Key.js
|
@ -5,7 +5,7 @@ if (process.versions) {
|
|||
module.exports = require('bindings')('KeyModule');
|
||||
} else {
|
||||
// pure js version
|
||||
var ECKey = require('./browser/bitcoinjs-lib.js').ECKey;
|
||||
var ECKey = require('./browser/vendor-bundle.js').ECKey;
|
||||
var buffertools = require('buffertools');
|
||||
|
||||
var bufferToArray = function(buffer) {
|
||||
|
@ -89,10 +89,11 @@ if (process.versions) {
|
|||
}
|
||||
|
||||
var eck = new ECKey();
|
||||
eck.setPub( bufferToArray(self.public));
|
||||
eck.setPub(bufferToArray(self.public));
|
||||
eck.setCompressed(self.compressed);
|
||||
var sigA = bufferToArray(sig);
|
||||
return eck.verify(hash,sigA);
|
||||
var ret = eck.verify(hash,sigA);
|
||||
return ret;
|
||||
};
|
||||
|
||||
|
||||
|
|
67
README.md
67
README.md
|
@ -31,26 +31,19 @@ Validating a Bitcoin address:
|
|||
```js
|
||||
var Address = require('bitcore/Address');
|
||||
|
||||
var addrStrings = [
|
||||
"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
|
||||
"1A1zP1eP5QGefi2DMPTfTL5SLmv7Dixxxx",
|
||||
"A1zP1eP5QGefi2DMPTfTL5SLmv7Dixxxx",
|
||||
"1600 Pennsylvania Ave NW",
|
||||
var addrs = [
|
||||
'1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa',
|
||||
'1A1zP1eP5QGefi2DMPTfTL5SLmv7Dixxxx',
|
||||
'A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa',
|
||||
'1600 Pennsylvania Ave NW',
|
||||
].map(function(addr) {
|
||||
return new Address(addr);
|
||||
});
|
||||
|
||||
addrStrings.forEach(function(addr) {
|
||||
|
||||
try {
|
||||
addr.validate();
|
||||
console.log(addr.data + ": is valid");
|
||||
} catch(e) {
|
||||
console.log(addr.data + ": is not a valid address. " + e);
|
||||
}
|
||||
|
||||
addrs.forEach(function(addr) {
|
||||
var valid = addr.isValid();
|
||||
console.log(addr.data + ' is ' + (valid ? '' : 'not ') + 'valid');
|
||||
});
|
||||
|
||||
```
|
||||
## Monitoring Blocks and Transactions
|
||||
For this example you need a running bitcoind instance with RPC enabled.
|
||||
|
@ -264,13 +257,49 @@ Bitcore is still under heavy development and not quite ready for "drop-in" produ
|
|||
Bitcore needs some developer love. Please send pull requests for bug fixes, code optimization, and ideas for improvement.
|
||||
|
||||
#Browser support
|
||||
Work to enable Bitcore for use in the browser is ongoing. To build bitcore for the browser:
|
||||
## Building the browser bundle
|
||||
To build bitcore full bundle for the browser:
|
||||
(this is automatically executed after you run `npm install`)
|
||||
|
||||
```
|
||||
npm install -g grunt-cli
|
||||
grunt shell
|
||||
node browser/browserify.js -a
|
||||
```
|
||||
This will generate a `browser/bundle.js` file which you can include
|
||||
in your HTML to use bitcore in the browser.
|
||||
|
||||
##
|
||||
|
||||
##Example browser usage
|
||||
|
||||
From example/simple.html
|
||||
```
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<body>
|
||||
<script src="../browser/bundle.js"></script>
|
||||
<script>
|
||||
var bitcore = require('bitcore');
|
||||
var Address = bitcore.Address;
|
||||
var a = new Address('1KerhGhLn3SYBEQwby7VyVMWf16fXQUj5d');
|
||||
console.log('1KerhGhLn3SYBEQwby7VyVMWf16fXQUj5d is valid? '+a.isValid());
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
You can check a usage example at examples/example.html
|
||||
You can check a more complex usage example at examples/example.html
|
||||
|
||||
## Generating a customized browser bundle
|
||||
To generate a customized bitcore bundle, you can specify
|
||||
which submodules you want to include in it with the -s option:
|
||||
|
||||
```
|
||||
node browser/browserify.js -s Transaction,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.
|
||||
|
||||
|
||||
#License
|
||||
|
|
|
@ -1,2 +0,0 @@
|
|||
Bitcoin = {};
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -1 +0,0 @@
|
|||
if ('undefined' === typeof window) window = this;
|
|
@ -10,7 +10,33 @@
|
|||
var fs = require('fs');
|
||||
var browserify = require('browserify');
|
||||
var browserPack = require('browser-pack');
|
||||
var program = require('commander');
|
||||
|
||||
// concat browser vendor files
|
||||
var exec = require('child_process').exec;
|
||||
var sys = require('sys');
|
||||
var puts = function(error, stdout, stderr) {
|
||||
if (error) console.log(error);
|
||||
sys.puts(stdout);
|
||||
sys.puts(stderr);
|
||||
};
|
||||
|
||||
exec('cd browser; sh concat.sh', puts);
|
||||
|
||||
var list = function(val) {
|
||||
return val.split(',');
|
||||
};
|
||||
|
||||
program
|
||||
.version('0.0.1')
|
||||
.option('-a, --includeall', 'Include all submodules.')
|
||||
.option('-s, --submodules <items>', 'Include the listed comma-separated submodules.', list)
|
||||
.parse(process.argv);
|
||||
|
||||
if (!program.includeall && (!program.submodules || program.submodules.length === 0)) {
|
||||
console.log('Must use either -s or -a option. For more info use the --help option');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
var pack = function (params) {
|
||||
var preludePath = 'node_modules/soop/example/custom_prelude.js';
|
||||
|
@ -64,9 +90,11 @@ b.require('./util/log');
|
|||
b.require('./util/util');
|
||||
b.require('./util/EncodedData');
|
||||
b.require('./util/VersionedData');
|
||||
b.add('./browser/bignum_config.js');
|
||||
modules.forEach(function(m) {
|
||||
b.require('./' + m + '.js' ,{expose: './'+m} );
|
||||
if (program.includeall || program.submodules.indexOf(m) > -1) {
|
||||
console.log('Including '+m+' in the browser bundle');
|
||||
b.require('./' + m + '.js' , {expose: './'+m} );
|
||||
}
|
||||
});
|
||||
b.require('soop');
|
||||
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
#! /bin/bash
|
||||
|
||||
cat browser.js crypto.js ripemd160.js bitcoin.js navigator-adapter.js jsbn.js jsbn2.js prng4.js util.js rng.js ec.js sec.js ecdsa.js eckey.js > bitcoinjs-lib.js
|
||||
cd vendor/
|
||||
cat browser-adapter.js crypto.js ripemd160.js jsbn.js jsbn2.js prng4.js util.js rng.js ec.js sec.js ecdsa.js eckey.js > vendor-bundle.js
|
||||
mv vendor-bundle.js ../
|
||||
cd ../
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
|
||||
|
||||
if ('undefined' === typeof window) window = this;
|
||||
Bitcoin = {};
|
||||
if (typeof navigator === 'undefined') {
|
||||
var navigator = {};
|
||||
navigator.appName = 'NodeJS';
|
||||
|
||||
}
|
|
@ -41,24 +41,34 @@ ECPointFp.prototype.getEncoded = function (compressed) {
|
|||
return enc;
|
||||
};
|
||||
|
||||
ECPointFp.decodeFrom = function (curve, enc) {
|
||||
ECPointFp.decodeFrom = function (ecparams, enc) {
|
||||
var type = enc[0];
|
||||
var dataLen = enc.length-1;
|
||||
|
||||
// Extract x and y as byte arrays
|
||||
var xBa = enc.slice(1, 1 + dataLen/2);
|
||||
var yBa = enc.slice(1 + dataLen/2, 1 + dataLen);
|
||||
|
||||
// Prepend zero byte to prevent interpretation as negative integer
|
||||
xBa.unshift(0);
|
||||
yBa.unshift(0);
|
||||
|
||||
// Convert to BigIntegers
|
||||
var x = new BigInteger(xBa);
|
||||
var y = new BigInteger(yBa);
|
||||
if (type === 4) {
|
||||
var xBa = enc.slice(1, 1 + dataLen/2),
|
||||
yBa = enc.slice(1 + dataLen/2, 1 + dataLen),
|
||||
x = BigInteger.fromByteArrayUnsigned(xBa),
|
||||
y = BigInteger.fromByteArrayUnsigned(yBa);
|
||||
}
|
||||
else {
|
||||
var xBa = enc.slice(1),
|
||||
x = BigInteger.fromByteArrayUnsigned(xBa),
|
||||
p = ecparams.getQ(),
|
||||
xCubedPlus7 = x.multiply(x).multiply(x).add(new BigInteger('7')).mod(p),
|
||||
pPlus1Over4 = p.add(new BigInteger('1'))
|
||||
.divide(new BigInteger('4')),
|
||||
y = xCubedPlus7.modPow(pPlus1Over4,p);
|
||||
if (y.mod(new BigInteger('2')).toString() != ''+(type % 2)) {
|
||||
y = p.subtract(y)
|
||||
}
|
||||
}
|
||||
|
||||
// Return point
|
||||
return new ECPointFp(curve, curve.fromBigInteger(x), curve.fromBigInteger(y));
|
||||
return new ECPointFp(ecparams,
|
||||
ecparams.fromBigInteger(x),
|
||||
ecparams.fromBigInteger(y));
|
||||
};
|
||||
|
||||
ECPointFp.prototype.add2D = function (b) {
|
|
@ -29,5 +29,17 @@ f+(((m|~n)^p)+c[2]):64>b?f+((m&p|n&~p)+c[3]):f+((m^(n|~p))+c[4]),f|=0,f=f<<k[b]|
|
|||
e[a>>>5]|=128<<24-a%32;e[(a+64>>>9<<4)+14]=(b<<8|b>>>24)&16711935|(b<<24|b>>>8)&4278255360;g.sigBytes=4*(e.length+1);this._process();g=this._hash;e=g.words;for(b=0;5>b;b++)a=e[b],e[b]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;return g},clone:function(){var e=l.clone.call(this);e._hash=this._hash.clone();return e}});j.RIPEMD160=l._createHelper(k);j.HmacRIPEMD160=l._createHmacHelper(k)})(Math);
|
||||
|
||||
|
||||
module.exports.RIPEMD160 = CryptoJS.RIPEMD160;
|
||||
module.exports.WordArray = CryptoJS.lib.WordArray;
|
||||
module.exports.ripemd160 = function(bytes) {
|
||||
if (!Buffer.isBuffer(bytes)) {
|
||||
throw new Error('arg should be a buffer');
|
||||
}
|
||||
var w = new CryptoJS.lib.WordArray.init(Crypto.util.bytesToWords(bytes), bytes.length);
|
||||
var wordArray = CryptoJS.RIPEMD160(w);
|
||||
var words = wordArray.words;
|
||||
var answer = [];
|
||||
for (var b = 0; b < words.length * 32; b += 8) {
|
||||
answer.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF);
|
||||
}
|
||||
return answer;
|
||||
};
|
||||
|
|
@ -4,22 +4,16 @@
|
|||
|
||||
var Address = require('../Address');
|
||||
|
||||
var addrStrings = [
|
||||
"1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa",
|
||||
"1A1zP1eP5QGefi2DMPTfTL5SLmv7Dixxxx",
|
||||
"A1zP1eP5QGefi2DMPTfTL5SLmv7Dixxxx",
|
||||
"1600 Pennsylvania Ave NW",
|
||||
var addrs = [
|
||||
'1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa',
|
||||
'1A1zP1eP5QGefi2DMPTfTL5SLmv7Dixxxx',
|
||||
'A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa',
|
||||
'1600 Pennsylvania Ave NW',
|
||||
].map(function(addr) {
|
||||
return new Address(addr);
|
||||
});
|
||||
|
||||
addrStrings.forEach(function(addr) {
|
||||
|
||||
try {
|
||||
addr.validate();
|
||||
console.log(addr.data + ": is valid");
|
||||
} catch(e) {
|
||||
console.log(addr.data + ": is not a valid address. " + e);
|
||||
}
|
||||
|
||||
addrs.forEach(function(addr) {
|
||||
var valid = addr.isValid();
|
||||
console.log(addr.data + ' is ' + (valid ? '' : 'not ') + 'valid');
|
||||
});
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<body>
|
||||
<script src="../browser/bundle.js"></script>
|
||||
<script>
|
||||
var bitcore = require('bitcore');
|
||||
var Address = bitcore.Address;
|
||||
var a = new Address('1KerhGhLn3SYBEQwby7VyVMWf16fXQUj5d');
|
||||
console.log('1KerhGhLn3SYBEQwby7VyVMWf16fXQUj5d is valid? '+a.isValid());
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -36,12 +36,14 @@
|
|||
"currency",
|
||||
"virtual"
|
||||
],
|
||||
"main": "bitcore.js",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/bitpay/bitcore.git"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "mocha test -R spec"
|
||||
"test": "mocha test -R spec",
|
||||
"postinstall": "node ./browser/browserify.js -a"
|
||||
},
|
||||
"dependencies": {
|
||||
"soop": "git://github.com/bitpay/soop.git",
|
||||
|
@ -66,7 +68,8 @@
|
|||
"browserify-buffertools": "~1.0.2",
|
||||
"chai": "~1.9.0",
|
||||
"brfs": "~1.0.0",
|
||||
"async": "~0.2.10"
|
||||
"async": "~0.2.10",
|
||||
"commander": "~2.1.0"
|
||||
},
|
||||
"license": "MIT"
|
||||
}
|
||||
|
|
|
@ -38,6 +38,8 @@
|
|||
<script src="test.VersionedData.js"></script>
|
||||
<script src="test.Wallet.js"></script>
|
||||
<script src="test.WalletKey.js"></script>
|
||||
<!--
|
||||
-->
|
||||
<script>
|
||||
mocha.run();
|
||||
</script>
|
||||
|
|
|
@ -20,17 +20,31 @@ describe('Address', function() {
|
|||
var a = new Address('1KfyjCgBSMsLqiCbakfSdeoBUqMqLUiu3T');
|
||||
should.exist(a);
|
||||
});
|
||||
it('should validate correctly', function() {
|
||||
var a = new Address('1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa');
|
||||
var m = new Address('32QBdjycLwbDTuGafUwaU5p5GxzSLPYoF6');
|
||||
var b = new Address('11111111111111111111111111122222234');
|
||||
a.validate.bind(a).should.not.throw(Error);
|
||||
m.validate.bind(m).should.not.throw(Error);
|
||||
b.validate.bind(b).should.throw(Error);
|
||||
var data = [
|
||||
['1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa', true],
|
||||
['11111111111111111111111111122222234', false], // totally invalid
|
||||
['32QBdjycLwbDTuGafUwaU5p5GxzSLPYoF6', true],
|
||||
['1Q1pE5vPGEEMqRcVRMbtBK842Y6Pzo6nK9', true],
|
||||
['1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i', true],
|
||||
['1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW600', false], // bad checksum
|
||||
['1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW620', false], // bad checksum
|
||||
['1ANNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i', false], // data changed, original checksum.
|
||||
['1A Na15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i', false], // invalid chars
|
||||
['1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62j', false], // checksums don't match.
|
||||
['1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62!', false], // bad char (!)
|
||||
['1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62iz', false], // too long Bitcoin address
|
||||
['1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62izz', false],// too long Bitcoin address
|
||||
['2cFupjhnEsSn59qHXstmK2ffpLv2', false], // valid base58 invalid data
|
||||
];
|
||||
data.forEach(function(datum) {
|
||||
var address = datum[0];
|
||||
var result = datum[1];
|
||||
it('should validate correctly ' + address, function() {
|
||||
var a = new Address(address);
|
||||
var s = a.toString();
|
||||
|
||||
a.isValid().should.equal(result);
|
||||
s.should.equal(a.toString()); // check that validation doesn't change data
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -4,10 +4,10 @@ var bignum = require('bignum');
|
|||
var Binary = require('binary');
|
||||
var Put = require('bufferput');
|
||||
var buffertools = require('buffertools');
|
||||
var bjs;
|
||||
var browser;
|
||||
if (!process.versions) {
|
||||
// browser version
|
||||
bjs = require('../browser/bitcoinjs-lib.js');
|
||||
browser = require('../browser/vendor-bundle.js');
|
||||
}
|
||||
|
||||
|
||||
|
@ -21,7 +21,7 @@ var ripe160 = exports.ripe160 = function (data) {
|
|||
}
|
||||
|
||||
if (!process.versions) {
|
||||
var result = bjs.ripemd160(data);
|
||||
var result = browser.ripemd160(data);
|
||||
return new Buffer(result, 'hex');
|
||||
}
|
||||
return new Buffer(crypto.createHash('rmd160').update(data).digest('binary'), 'binary');
|
||||
|
|
Loading…
Reference in New Issue