Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions benchmark/script.js
Original file line number Diff line number Diff line change
@@ -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');
});
24 changes: 20 additions & 4 deletions lib/script/script.js
Original file line number Diff line number Diff line change
Expand Up @@ -248,10 +248,26 @@ Script.prototype.isPublicKeyHashOut = function() {
* @returns {boolean} if this is a pay to public key hash input script
*/
Script.prototype.isPublicKeyHashIn = function() {
return this.chunks.length === 2 &&
this.chunks[0].buf &&
this.chunks[0].buf.length <= 0x49 &&
PublicKey.isValid(this.chunks[1].buf);
if (this.chunks.length === 2) {
var signatureBuf = this.chunks[0].buf;
var pubkeyBuf = 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() {
Expand Down
32 changes: 28 additions & 4 deletions test/script/script.js
Original file line number Diff line number Diff line change
Expand Up @@ -233,26 +233,50 @@ describe('Script', 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);
});

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

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

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

it('should identify this known pubkey', function() {
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() {
Expand Down