Merge pull request #1291 from braydonf/optimize-script
Optimized performance of script.isPublicKeyHashIn(). Fixes #1289
This commit is contained in:
commit
edfbcb6dd5
|
@ -0,0 +1,70 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var benchmark = require('benchmark');
|
||||||
|
var bitcore = require('..');
|
||||||
|
var async = require('async');
|
||||||
|
var blockData = require('./block-357238.json');
|
||||||
|
|
||||||
|
var maxTime = 10;
|
||||||
|
|
||||||
|
console.log('Benchmarking Script');
|
||||||
|
console.log('---------------------------------------');
|
||||||
|
|
||||||
|
async.series([
|
||||||
|
function(next) {
|
||||||
|
|
||||||
|
var c = 0;
|
||||||
|
var scripts = [];
|
||||||
|
var block = bitcore.Block.fromString(blockData);
|
||||||
|
for (var i = 0; i < block.transactions.length; i++) {
|
||||||
|
var tx = block.transactions[i];
|
||||||
|
for (var j = 0; j < tx.inputs.length; j++) {
|
||||||
|
var input = tx.inputs[j];
|
||||||
|
if (input.script) {
|
||||||
|
scripts.push(input.script);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function isPublicKeyHashIn() {
|
||||||
|
if (c >= scripts.length) {
|
||||||
|
c = 0;
|
||||||
|
}
|
||||||
|
scripts[c].isPublicKeyHashIn();
|
||||||
|
c++;
|
||||||
|
}
|
||||||
|
|
||||||
|
function toAddress() {
|
||||||
|
if (c >= scripts.length) {
|
||||||
|
c = 0;
|
||||||
|
}
|
||||||
|
scripts[c].toAddress();
|
||||||
|
c++;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAddressInfo() {
|
||||||
|
if (c >= scripts.length) {
|
||||||
|
c = 0;
|
||||||
|
}
|
||||||
|
scripts[c].getAddressInfo();
|
||||||
|
c++;
|
||||||
|
}
|
||||||
|
|
||||||
|
var suite = new benchmark.Suite();
|
||||||
|
suite.add('isPublicKeyHashIn', isPublicKeyHashIn, {maxTime: maxTime});
|
||||||
|
suite.add('toAddress', toAddress, {maxTime: maxTime});
|
||||||
|
suite.add('getAddressInfo', getAddressInfo, {maxTime: maxTime});
|
||||||
|
suite
|
||||||
|
.on('cycle', function(event) {
|
||||||
|
console.log(String(event.target));
|
||||||
|
})
|
||||||
|
.on('complete', function() {
|
||||||
|
console.log('Done');
|
||||||
|
console.log('----------------------------------------------------------------------');
|
||||||
|
next();
|
||||||
|
})
|
||||||
|
.run();
|
||||||
|
}
|
||||||
|
], function(err) {
|
||||||
|
console.log('Finished');
|
||||||
|
});
|
|
@ -248,10 +248,26 @@ Script.prototype.isPublicKeyHashOut = function() {
|
||||||
* @returns {boolean} if this is a pay to public key hash input script
|
* @returns {boolean} if this is a pay to public key hash input script
|
||||||
*/
|
*/
|
||||||
Script.prototype.isPublicKeyHashIn = function() {
|
Script.prototype.isPublicKeyHashIn = function() {
|
||||||
return this.chunks.length === 2 &&
|
if (this.chunks.length === 2) {
|
||||||
this.chunks[0].buf &&
|
var signatureBuf = this.chunks[0].buf;
|
||||||
this.chunks[0].buf.length <= 0x49 &&
|
var pubkeyBuf = this.chunks[1].buf;
|
||||||
PublicKey.isValid(this.chunks[1].buf);
|
if (signatureBuf &&
|
||||||
|
signatureBuf.length &&
|
||||||
|
signatureBuf[0] === 0x30 &&
|
||||||
|
pubkeyBuf &&
|
||||||
|
pubkeyBuf.length
|
||||||
|
) {
|
||||||
|
var version = pubkeyBuf[0];
|
||||||
|
if ((version === 0x04 ||
|
||||||
|
version === 0x06 ||
|
||||||
|
version === 0x07) && pubkeyBuf.length === 65) {
|
||||||
|
return true;
|
||||||
|
} else if ((version === 0x03 || version === 0x02) && pubkeyBuf.length === 33) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
Script.prototype.getPublicKeyHash = function() {
|
Script.prototype.getPublicKeyHash = function() {
|
||||||
|
|
|
@ -233,19 +233,27 @@ describe('Script', function() {
|
||||||
|
|
||||||
describe('#isPublicKeyHashIn', function() {
|
describe('#isPublicKeyHashIn', function() {
|
||||||
|
|
||||||
it('should identify this known pubkeyhashin', function() {
|
it('should identify this known pubkeyhashin (uncompressed pubkey version)', function() {
|
||||||
Script('73 0x3046022100bb3c194a30e460d81d34be0a230179c043a656f67e3c5c8bf47eceae7c4042ee0221008bf54ca11b2985285be0fd7a212873d243e6e73f5fad57e8eb14c4f39728b8c601 65 0x04e365859b3c78a8b7c202412b949ebca58e147dba297be29eee53cd3e1d300a6419bc780cc9aec0dc94ed194e91c8f6433f1b781ee00eac0ead2aae1e8e0712c6').isPublicKeyHashIn().should.equal(true);
|
Script('73 0x3046022100bb3c194a30e460d81d34be0a230179c043a656f67e3c5c8bf47eceae7c4042ee0221008bf54ca11b2985285be0fd7a212873d243e6e73f5fad57e8eb14c4f39728b8c601 65 0x04e365859b3c78a8b7c202412b949ebca58e147dba297be29eee53cd3e1d300a6419bc780cc9aec0dc94ed194e91c8f6433f1b781ee00eac0ead2aae1e8e0712c6').isPublicKeyHashIn().should.equal(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should identify this known pubkeyhashin starting with 0x02', function() {
|
it('should identify this known pubkeyhashin (hybrid pubkey version w/06)', function() {
|
||||||
|
Script('73 0x3046022100bb3c194a30e460d81d34be0a230179c043a656f67e3c5c8bf47eceae7c4042ee0221008bf54ca11b2985285be0fd7a212873d243e6e73f5fad57e8eb14c4f39728b8c601 65 0x06e365859b3c78a8b7c202412b949ebca58e147dba297be29eee53cd3e1d300a6419bc780cc9aec0dc94ed194e91c8f6433f1b781ee00eac0ead2aae1e8e0712c6').isPublicKeyHashIn().should.equal(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should identify this known pubkeyhashin (hybrid pubkey version w/07)', function() {
|
||||||
|
Script('73 0x3046022100bb3c194a30e460d81d34be0a230179c043a656f67e3c5c8bf47eceae7c4042ee0221008bf54ca11b2985285be0fd7a212873d243e6e73f5fad57e8eb14c4f39728b8c601 65 0x07e365859b3c78a8b7c202412b949ebca58e147dba297be29eee53cd3e1d300a6419bc780cc9aec0dc94ed194e91c8f6433f1b781ee00eac0ead2aae1e8e0712c6').isPublicKeyHashIn().should.equal(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should identify this known pubkeyhashin (compressed pubkey w/ 0x02)', function() {
|
||||||
Script('73 0x3046022100bb3c194a30e460d81d34be0a230179c043a656f67e3c5c8bf47eceae7c4042ee0221008bf54ca11b2985285be0fd7a212873d243e6e73f5fad57e8eb14c4f39728b8c601 21 0x02aec6b86621e7fef63747fbfd6a6e7d54c8e1052044ef2dd2c5e46656ef1194d4').isPublicKeyHashIn().should.equal(true);
|
Script('73 0x3046022100bb3c194a30e460d81d34be0a230179c043a656f67e3c5c8bf47eceae7c4042ee0221008bf54ca11b2985285be0fd7a212873d243e6e73f5fad57e8eb14c4f39728b8c601 21 0x02aec6b86621e7fef63747fbfd6a6e7d54c8e1052044ef2dd2c5e46656ef1194d4').isPublicKeyHashIn().should.equal(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should identify this known pubkeyhashin starting with 0x03', function() {
|
it('should identify this known pubkeyhashin (compressed pubkey w/ 0x03)', function() {
|
||||||
Script('73 0x3046022100bb3c194a30e460d81d34be0a230179c043a656f67e3c5c8bf47eceae7c4042ee0221008bf54ca11b2985285be0fd7a212873d243e6e73f5fad57e8eb14c4f39728b8c601 21 0x03e724d93c4fda5f1236c525de7ffac6c5f1f72b0f5cdd1fc4b4f5642b6d055fcc').isPublicKeyHashIn().should.equal(true);
|
Script('73 0x3046022100bb3c194a30e460d81d34be0a230179c043a656f67e3c5c8bf47eceae7c4042ee0221008bf54ca11b2985285be0fd7a212873d243e6e73f5fad57e8eb14c4f39728b8c601 21 0x03e724d93c4fda5f1236c525de7ffac6c5f1f72b0f5cdd1fc4b4f5642b6d055fcc').isPublicKeyHashIn().should.equal(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should identify this known non-pubkeyhashin', function() {
|
it('should identify this known non-pubkeyhashin (bad ops length)', function() {
|
||||||
Script('73 0x3046022100bb3c194a30e460d81d34be0a230179c043a656f67e3c5c8bf47eceae7c4042ee0221008bf54ca11b2985285be0fd7a212873d243e6e73f5fad57e8eb14c4f39728b8c601 65 0x04e365859b3c78a8b7c202412b949ebca58e147dba297be29eee53cd3e1d300a6419bc780cc9aec0dc94ed194e91c8f6433f1b781ee00eac0ead2aae1e8e0712c6 OP_CHECKSIG').isPublicKeyHashIn().should.equal(false);
|
Script('73 0x3046022100bb3c194a30e460d81d34be0a230179c043a656f67e3c5c8bf47eceae7c4042ee0221008bf54ca11b2985285be0fd7a212873d243e6e73f5fad57e8eb14c4f39728b8c601 65 0x04e365859b3c78a8b7c202412b949ebca58e147dba297be29eee53cd3e1d300a6419bc780cc9aec0dc94ed194e91c8f6433f1b781ee00eac0ead2aae1e8e0712c6 OP_CHECKSIG').isPublicKeyHashIn().should.equal(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -253,6 +261,22 @@ describe('Script', function() {
|
||||||
Script('70 0x3043021f336721e4343f67c835cbfd465477db09073dc38a936f9c445d573c1c8a7fdf022064b0e3cb6892a9ecf870030e3066bc259e1f24841c9471d97f9be08b73f6530701 33 0x0370b2e1dcaa8f51cb0ead1221dd8cb31721502b3b5b7d4b374d263dfec63a4369').isPublicKeyHashIn().should.equal(true);
|
Script('70 0x3043021f336721e4343f67c835cbfd465477db09073dc38a936f9c445d573c1c8a7fdf022064b0e3cb6892a9ecf870030e3066bc259e1f24841c9471d97f9be08b73f6530701 33 0x0370b2e1dcaa8f51cb0ead1221dd8cb31721502b3b5b7d4b374d263dfec63a4369').isPublicKeyHashIn().should.equal(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should identify this known non-pubkeyhashin (bad version)', function() {
|
||||||
|
Script('70 0x3043021f336721e4343f67c835cbfd465477db09073dc38a936f9c445d573c1c8a7fdf022064b0e3cb6892a9ecf870030e3066bc259e1f24841c9471d97f9be08b73f6530701 33 0x1270b2e1dcaa8f51cb0ead1221dd8cb31721502b3b5b7d4b374d263dfec63a4369').isPublicKeyHashIn().should.equal(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should identify this known non-pubkeyhashin (bad signature version)', function() {
|
||||||
|
Script('70 0x4043021f336721e4343f67c835cbfd465477db09073dc38a936f9c445d573c1c8a7fdf022064b0e3cb6892a9ecf870030e3066bc259e1f24841c9471d97f9be08b73f6530701 33 0x0370b2e1dcaa8f51cb0ead1221dd8cb31721502b3b5b7d4b374d263dfec63a4369').isPublicKeyHashIn().should.equal(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should identify this known non-pubkeyhashin (no public key)', function() {
|
||||||
|
Script('70 0x3043021f336721e4343f67c835cbfd465477db09073dc38a936f9c445d573c1c8a7fdf022064b0e3cb6892a9ecf870030e3066bc259e1f24841c9471d97f9be08b73f6530701 OP_CHECKSIG').isPublicKeyHashIn().should.equal(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should identify this known non-pubkeyhashin (no signature)', function() {
|
||||||
|
Script('OP_DROP OP_CHECKSIG').isPublicKeyHashIn().should.equal(false);
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('#isPublicKeyHashOut', function() {
|
describe('#isPublicKeyHashOut', function() {
|
||||||
|
|
Loading…
Reference in New Issue