Merge pull request #712 from maraoz/refactor/script

Refactor Script and other small stuff
This commit is contained in:
Esteban Ordano 2014-12-11 16:24:15 -03:00
commit 0a0895a987
8 changed files with 1635 additions and 128 deletions

View File

@ -23,6 +23,7 @@ bitcore.util = {};
bitcore.util.bitcoin = require('./lib/util/bitcoin');
bitcore.util.buffer = require('./lib/util/buffer');
bitcore.util.js = require('./lib/util/js');
bitcore.util.preconditions = require('./lib/util/preconditions');
// transport
bitcore.transport = {};
@ -55,11 +56,5 @@ bitcore.deps.bs58 = require('bs58');
bitcore.deps.Buffer = Buffer;
bitcore.deps.elliptic = require('elliptic');
//bitcore.scriptexec = require('lib/scriptexec');
//bitcore.tx = require('lib/tx');
//bitcore.txpartial = require('lib/txpartial');
//bitcore.bip70 = require('lib/bip70');
// Internal usage, exposed for testing/advanced tweaking
bitcore._HDKeyCache = require('./lib/hdkeycache');

View File

@ -1,6 +1,7 @@
'use strict';
var _ = require('lodash');
var $ = require('./util/preconditions');
function Opcode(num) {
if (!(this instanceof Opcode)) {
@ -19,11 +20,13 @@ function Opcode(num) {
}
Opcode.prototype.set = function(obj) {
$.checkArgument(_.isObject(obj));
this.num = typeof obj.num !== 'undefined' ? obj.num : this.num;
return this;
};
Opcode.prototype.fromNumber = function(num) {
$.checkArgument(_.isNumber(num));
this.num = num;
return this;
};
@ -33,9 +36,11 @@ Opcode.prototype.toNumber = function() {
};
Opcode.prototype.fromString = function(str) {
$.checkArgument(_.isString(str));
var num = Opcode.map[str];
if (typeof num === 'undefined')
if (typeof num === 'undefined') {
throw new Error('Invalid opcodestr');
}
this.num = num;
return this;
};
@ -49,9 +54,7 @@ Opcode.prototype.toString = function() {
};
Opcode.smallInt = function(n) {
if (!(n >= 0 && n <= 16)) {
throw new Error('Invalid Argument: n must be between 0 and 16');
}
$.checkArgument(n >= 0 && n <= 16, 'Invalid Argument: n must be between 0 and 16');
if (n === 0) {
return Opcode('OP_0');
}

View File

@ -55,14 +55,14 @@ Script.fromBuffer = function(buffer) {
var opcodenum = br.readUInt8();
var len, buf;
if (opcodenum > 0 && opcodenum < Opcode.map.OP_PUSHDATA1) {
if (opcodenum > 0 && opcodenum < Opcode.OP_PUSHDATA1) {
len = opcodenum;
script.chunks.push({
buf: br.read(len),
len: len,
opcodenum: opcodenum
});
} else if (opcodenum === Opcode.map.OP_PUSHDATA1) {
} else if (opcodenum === Opcode.OP_PUSHDATA1) {
len = br.readUInt8();
buf = br.read(len);
script.chunks.push({
@ -70,7 +70,7 @@ Script.fromBuffer = function(buffer) {
len: len,
opcodenum: opcodenum
});
} else if (opcodenum === Opcode.map.OP_PUSHDATA2) {
} else if (opcodenum === Opcode.OP_PUSHDATA2) {
len = br.readUInt16LE();
buf = br.read(len);
script.chunks.push({
@ -78,7 +78,7 @@ Script.fromBuffer = function(buffer) {
len: len,
opcodenum: opcodenum
});
} else if (opcodenum === Opcode.map.OP_PUSHDATA4) {
} else if (opcodenum === Opcode.OP_PUSHDATA4) {
len = br.readUInt32LE();
buf = br.read(len);
script.chunks.push({
@ -87,7 +87,9 @@ Script.fromBuffer = function(buffer) {
opcodenum: opcodenum
});
} else {
script.chunks.push(opcodenum);
script.chunks.push({
opcodenum: opcodenum
});
}
}
@ -99,22 +101,18 @@ Script.prototype.toBuffer = function() {
for (var i = 0; i < this.chunks.length; i++) {
var chunk = this.chunks[i];
var opcodenum;
if (typeof chunk === 'number') {
opcodenum = chunk;
bw.writeUInt8(opcodenum);
} else {
opcodenum = chunk.opcodenum;
bw.writeUInt8(chunk.opcodenum);
if (opcodenum < Opcode.map.OP_PUSHDATA1) {
var opcodenum = chunk.opcodenum;
bw.writeUInt8(chunk.opcodenum);
if (chunk.buf) {
if (opcodenum < Opcode.OP_PUSHDATA1) {
bw.write(chunk.buf);
} else if (opcodenum === Opcode.map.OP_PUSHDATA1) {
} else if (opcodenum === Opcode.OP_PUSHDATA1) {
bw.writeUInt8(chunk.len);
bw.write(chunk.buf);
} else if (opcodenum === Opcode.map.OP_PUSHDATA2) {
} else if (opcodenum === Opcode.OP_PUSHDATA2) {
bw.writeUInt16LE(chunk.len);
bw.write(chunk.buf);
} else if (opcodenum === Opcode.map.OP_PUSHDATA4) {
} else if (opcodenum === Opcode.OP_PUSHDATA4) {
bw.writeUInt32LE(chunk.len);
bw.write(chunk.buf);
}
@ -140,7 +138,7 @@ Script.fromString = function(str) {
if (typeof opcodenum === 'undefined') {
opcodenum = parseInt(token);
if (opcodenum > 0 && opcodenum < Opcode.map.OP_PUSHDATA1) {
if (opcodenum > 0 && opcodenum < Opcode.OP_PUSHDATA1) {
script.chunks.push({
buf: new Buffer(tokens[i + 1].slice(2), 'hex'),
len: opcodenum,
@ -150,9 +148,9 @@ Script.fromString = function(str) {
} else {
throw new Error('Invalid script: ' + JSON.stringify(str));
}
} else if (opcodenum === Opcode.map.OP_PUSHDATA1 ||
opcodenum === Opcode.map.OP_PUSHDATA2 ||
opcodenum === Opcode.map.OP_PUSHDATA4) {
} else if (opcodenum === Opcode.OP_PUSHDATA1 ||
opcodenum === Opcode.OP_PUSHDATA2 ||
opcodenum === Opcode.OP_PUSHDATA4) {
if (tokens[i + 2].slice(0, 2) !== '0x') {
throw new Error('Pushdata data must start with 0x');
}
@ -163,7 +161,9 @@ Script.fromString = function(str) {
});
i = i + 3;
} else {
script.chunks.push(opcodenum);
script.chunks.push({
opcodenum: opcodenum
});
i = i + 1;
}
}
@ -175,23 +175,25 @@ Script.prototype.toString = function() {
for (var i = 0; i < this.chunks.length; i++) {
var chunk = this.chunks[i];
var opcodenum;
if (typeof chunk === 'number') {
opcodenum = chunk;
str = str + Opcode(opcodenum).toString() + ' ';
} else {
opcodenum = chunk.opcodenum;
if (opcodenum === Opcode.map.OP_PUSHDATA1 ||
opcodenum === Opcode.map.OP_PUSHDATA2 ||
opcodenum === Opcode.map.OP_PUSHDATA4) {
str = str + Opcode(opcodenum).toString() + ' ';
var opcodenum = chunk.opcodenum;
if (!chunk.buf) {
if (typeof Opcode.reverseMap[opcodenum] !== 'undefined') {
str = str + ' ' + Opcode(opcodenum).toString();
} else {
str = str + ' ' + '0x' + opcodenum.toString(16);
}
str = str + chunk.len + ' ';
str = str + '0x' + chunk.buf.toString('hex') + ' ';
} else {
if (opcodenum === Opcode.OP_PUSHDATA1 ||
opcodenum === Opcode.OP_PUSHDATA2 ||
opcodenum === Opcode.OP_PUSHDATA4) {
str = str + ' ' + Opcode(opcodenum).toString();
}
str = str + ' ' + chunk.len;
str = str + ' ' + '0x' + chunk.buf.toString('hex');
}
}
return str.substr(0, str.length - 1);
return str.substr(1);
};
// script classification methods
@ -200,23 +202,23 @@ Script.prototype.toString = function() {
* @returns true if this is a pay to pubkey hash output script
*/
Script.prototype.isPublicKeyHashOut = function() {
return this.chunks[0] === Opcode('OP_DUP').toNumber() &&
this.chunks[1] === Opcode('OP_HASH160').toNumber() &&
return !!(this.chunks.length === 5 &&
this.chunks[0].opcodenum === Opcode.OP_DUP &&
this.chunks[1].opcodenum === Opcode.OP_HASH160 &&
this.chunks[2].buf &&
this.chunks[3] === Opcode('OP_EQUALVERIFY').toNumber() &&
this.chunks[4] === Opcode('OP_CHECKSIG').toNumber();
this.chunks[3].opcodenum === Opcode.OP_EQUALVERIFY &&
this.chunks[4].opcodenum === Opcode.OP_CHECKSIG);
};
/**
* @returns true if this is a pay to public key hash input script
*/
Script.prototype.isPublicKeyHashIn = function() {
return !!(this.chunks.length === 2 &&
return this.chunks.length === 2 &&
this.chunks[0].buf &&
this.chunks[0].buf.length >= 0x47 &&
this.chunks[0].buf.length <= 0x49 &&
this.chunks[1].buf &&
PublicKey.isValid(this.chunks[1].buf));
PublicKey.isValid(this.chunks[1].buf);
};
/**
@ -226,7 +228,7 @@ Script.prototype.isPublicKeyOut = function() {
return this.chunks.length === 2 &&
bufferUtil.isBuffer(this.chunks[0].buf) &&
PublicKey.isValid(this.chunks[0].buf) &&
this.chunks[1] === Opcode('OP_CHECKSIG').toNumber();
this.chunks[1].opcodenum === Opcode.OP_CHECKSIG;
};
/**
@ -244,10 +246,10 @@ Script.prototype.isPublicKeyIn = function() {
*/
Script.prototype.isScriptHashOut = function() {
return this.chunks.length === 3 &&
this.chunks[0] === Opcode('OP_HASH160').toNumber() &&
this.chunks[0].opcodenum === Opcode.OP_HASH160 &&
this.chunks[1].buf &&
this.chunks[1].buf.length === 20 &&
this.chunks[2] === Opcode('OP_EQUAL').toNumber();
this.chunks[2].opcodenum === Opcode.OP_EQUAL;
};
/**
@ -276,20 +278,21 @@ Script.prototype.isScriptHashIn = function() {
*/
Script.prototype.isMultisigOut = function() {
return (this.chunks.length > 3 &&
Opcode.isSmallIntOp(this.chunks[0]) &&
Opcode.isSmallIntOp(this.chunks[0].opcodenum) &&
this.chunks.slice(1, this.chunks.length - 2).every(function(obj) {
return obj.buf && bufferUtil.isBuffer(obj.buf);
}) &&
Opcode.isSmallIntOp(this.chunks[this.chunks.length - 2]) &&
this.chunks[this.chunks.length - 1] === Opcode.map.OP_CHECKMULTISIG);
Opcode.isSmallIntOp(this.chunks[this.chunks.length - 2].opcodenum) &&
this.chunks[this.chunks.length - 1].opcodenum === Opcode.OP_CHECKMULTISIG);
};
/**
* @returns true if this is a mutlsig input script
* @returns true if this is a multisig input script
*/
Script.prototype.isMultisigIn = function() {
return this.chunks[0] === 0 &&
return this.chunks.length >= 2 &&
this.chunks[0].opcodenum === 0 &&
this.chunks.slice(1, this.chunks.length).every(function(obj) {
return obj.buf &&
bufferUtil.isBuffer(obj.buf) &&
@ -301,12 +304,13 @@ Script.prototype.isMultisigIn = function() {
* @returns true if this is an OP_RETURN data script
*/
Script.prototype.isDataOut = function() {
return (this.chunks[0] === Opcode('OP_RETURN').toNumber() &&
return this.chunks.length >= 1 &&
this.chunks[0].opcodenum === Opcode.OP_RETURN &&
(this.chunks.length === 1 ||
(this.chunks.length === 2 &&
this.chunks[1].buf &&
this.chunks[1].buf.length <= 40 &&
this.chunks[1].length === this.chunks.len)));
this.chunks[1].length === this.chunks.len));
};
/**
@ -315,8 +319,7 @@ Script.prototype.isDataOut = function() {
*/
Script.prototype.isPushOnly = function() {
return _.every(this.chunks, function(chunk) {
var opcodenum = chunk.opcodenum;
return !_.isUndefined(opcodenum) || chunk <= Opcode.map.OP_16;
return chunk.opcodenum <= Opcode.OP_16;
});
};
@ -424,7 +427,9 @@ Script.prototype._addOpcode = function(opcode, prepend) {
} else {
op = Opcode(opcode).toNumber();
}
this._insertAtPosition(op, prepend);
this._insertAtPosition({
opcodenum: op
}, prepend);
return this;
};
@ -433,14 +438,14 @@ Script.prototype._addBuffer = function(buf, prepend) {
var len = buf.length;
if (len === 0) {
return;
} else if (len > 0 && len < Opcode.map.OP_PUSHDATA1) {
} else if (len > 0 && len < Opcode.OP_PUSHDATA1) {
opcodenum = len;
} else if (len < Math.pow(2, 8)) {
opcodenum = Opcode.map.OP_PUSHDATA1;
opcodenum = Opcode.OP_PUSHDATA1;
} else if (len < Math.pow(2, 16)) {
opcodenum = Opcode.map.OP_PUSHDATA2;
opcodenum = Opcode.OP_PUSHDATA2;
} else if (len < Math.pow(2, 32)) {
opcodenum = Opcode.map.OP_PUSHDATA4;
opcodenum = Opcode.OP_PUSHDATA4;
} else {
throw new Error('You can\'t push that much data');
}
@ -455,7 +460,7 @@ Script.prototype._addBuffer = function(buf, prepend) {
Script.prototype.removeCodeseparators = function() {
var chunks = [];
for (var i = 0; i < this.chunks.length; i++) {
if (this.chunks[i] !== Opcode.OP_CODESEPARATOR) {
if (this.chunks[i].opcodenum !== Opcode.OP_CODESEPARATOR) {
chunks.push(this.chunks[i]);
}
}
@ -470,7 +475,7 @@ Script.prototype.removeCodeseparators = function() {
* requiring m of those public keys to spend
* @param {PublicKey[]} pubkeys - list of all public keys controlling the output
* @param {number} m - amount of required signatures to spend the output
* @param {Object} [opts] - Several options:
* @param {Object} [opts] - Several options:
* - noSorting: defaults to false, if true, don't sort the given
* public keys before creating the script
*/
@ -489,7 +494,7 @@ Script.buildMultisigOut = function(pubkeys, m, opts) {
s.add(pubkey.toBuffer());
}
s.add(Opcode.smallInt(pubkeys.length));
s.add(Opcode('OP_CHECKMULTISIG'));
s.add(Opcode.OP_CHECKMULTISIG);
return s;
};
@ -505,11 +510,11 @@ Script.buildPublicKeyHashOut = function(to) {
to = new Address(to);
}
var s = new Script();
s.add(Opcode('OP_DUP'))
.add(Opcode('OP_HASH160'))
s.add(Opcode.OP_DUP)
.add(Opcode.OP_HASH160)
.add(to.hashBuffer)
.add(Opcode('OP_EQUALVERIFY'))
.add(Opcode('OP_CHECKSIG'));
.add(Opcode.OP_EQUALVERIFY)
.add(Opcode.OP_CHECKSIG);
return s;
};
@ -520,7 +525,7 @@ Script.buildPublicKeyHashOut = function(to) {
Script.buildPublicKeyOut = function(pubkey) {
var s = new Script();
s.add(pubkey.toBuffer())
.add(Opcode('OP_CHECKSIG'));
.add(Opcode.OP_CHECKSIG);
return s;
};
@ -533,7 +538,7 @@ Script.buildDataOut = function(data) {
data = new Buffer(data);
}
var s = new Script();
s.add(Opcode('OP_RETURN'))
s.add(Opcode.OP_RETURN)
.add(data);
return s;
};
@ -544,9 +549,9 @@ Script.buildDataOut = function(data) {
*/
Script.buildScriptHashOut = function(script) {
var s = new Script();
s.add(Opcode('OP_HASH160'))
s.add(Opcode.OP_HASH160)
.add(Hash.sha256ripemd160(script.toBuffer()))
.add(Opcode('OP_EQUAL'));
.add(Opcode.OP_EQUAL);
return s;
};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -25,52 +25,61 @@ describe('Opcode', function() {
});
describe('#fromNumber', function() {
it('should work for 0', function() {
Opcode().fromNumber(0).num.should.equal(0);
});
it('should fail for non-number', function() {
Opcode().fromNumber.bind(null, 'a string').should.throw('Invalid Argument');
});
});
describe('#set', function() {
it('should work for object', function() {
Opcode().set({
num: 42
}).num.should.equal(42);
});
it('should fail for non-object', function() {
Opcode().set.bind(null, 'non-object').should.throw('Invalid Argument');
});
});
describe('#toNumber', function() {
it('should work for 0', function() {
Opcode().fromNumber(0).toNumber().should.equal(0);
});
});
describe('#fromString', function() {
it('should work for OP_0', function() {
Opcode().fromString('OP_0').num.should.equal(0);
});
it('should fail for invalid string', function() {
Opcode().fromString.bind(null, 'OP_SATOSHI').should.throw('Invalid opcodestr');
Opcode().fromString.bind(null, 'BANANA').should.throw('Invalid opcodestr');
});
it('should fail for non-string', function() {
Opcode().fromString.bind(null, 123).should.throw('Invalid Argument');
});
});
describe('#toString', function() {
it('should work for OP_0', function() {
Opcode().fromString('OP_0').toString().should.equal('OP_0');
});
});
describe('@map', function() {
it('should have a map containing 116 elements', function() {
_.size(Opcode.map).should.equal(116);
});
});
describe('@reverseMap', function() {
it('should exist and have op 185', function() {
should.exist(Opcode.reverseMap);
Opcode.reverseMap[185].should.equal('OP_NOP10');
});
});
var smallints = [
Opcode('OP_0'),

View File

@ -22,7 +22,7 @@ describe('Script', function() {
buf[0] = Opcode('OP_0').toNumber();
var script = Script.fromBuffer(buf);
script.chunks.length.should.equal(1);
script.chunks[0].should.equal(buf[0]);
script.chunks[0].opcodenum.should.equal(buf[0]);
});
it('should parse this buffer containing another OP code', function() {
@ -30,7 +30,7 @@ describe('Script', function() {
buf[0] = Opcode('OP_CHECKMULTISIG').toNumber();
var script = Script.fromBuffer(buf);
script.chunks.length.should.equal(1);
script.chunks[0].should.equal(buf[0]);
script.chunks[0].opcodenum.should.equal(buf[0]);
});
it('should parse this buffer containing three bytes of data', function() {
@ -75,9 +75,9 @@ describe('Script', function() {
buf[buf.length - 1] = Opcode('OP_0').toNumber();
var script = Script.fromBuffer(buf);
script.chunks.length.should.equal(3);
script.chunks[0].should.equal(buf[0]);
script.chunks[0].opcodenum.should.equal(buf[0]);
script.chunks[1].buf.toString('hex').should.equal('010203');
script.chunks[2].should.equal(buf[buf.length - 1]);
script.chunks[2].opcodenum.should.equal(buf[buf.length - 1]);
});
});
@ -89,7 +89,7 @@ describe('Script', function() {
buf[0] = Opcode('OP_0').toNumber();
var script = Script.fromBuffer(buf);
script.chunks.length.should.equal(1);
script.chunks[0].should.equal(buf[0]);
script.chunks[0].opcodenum.should.equal(buf[0]);
script.toBuffer().toString('hex').should.equal(buf.toString('hex'));
});
@ -98,7 +98,7 @@ describe('Script', function() {
buf[0] = Opcode('OP_CHECKMULTISIG').toNumber();
var script = Script.fromBuffer(buf);
script.chunks.length.should.equal(1);
script.chunks[0].should.equal(buf[0]);
script.chunks[0].opcodenum.should.equal(buf[0]);
script.toBuffer().toString('hex').should.equal(buf.toString('hex'));
});
@ -148,9 +148,9 @@ describe('Script', function() {
buf[buf.length - 1] = Opcode('OP_0').toNumber();
var script = Script.fromBuffer(buf);
script.chunks.length.should.equal(3);
script.chunks[0].should.equal(buf[0]);
script.chunks[0].opcodenum.should.equal(buf[0]);
script.chunks[1].buf.toString('hex').should.equal('010203');
script.chunks[2].should.equal(buf[buf.length - 1]);
script.chunks[2].opcodenum.should.equal(buf[buf.length - 1]);
script.toBuffer().toString('hex').should.equal(buf.toString('hex'));
});
@ -182,9 +182,9 @@ describe('Script', function() {
buf[buf.length - 1] = Opcode('OP_0').toNumber();
var script = Script.fromBuffer(buf);
script.chunks.length.should.equal(3);
script.chunks[0].should.equal(buf[0]);
script.chunks[0].opcodenum.should.equal(buf[0]);
script.chunks[1].buf.toString('hex').should.equal('010203');
script.chunks[2].should.equal(buf[buf.length - 1]);
script.chunks[2].opcodenum.should.equal(buf[buf.length - 1]);
script.toString().toString('hex').should.equal('OP_0 OP_PUSHDATA4 3 0x010203 OP_0');
});
@ -242,31 +242,6 @@ describe('Script', function() {
});
describe('#isScripthashIn', function() {
it('should identify this known scripthashin', function() {
Script('OP_0 73 0x30460221008ca148504190c10eea7f5f9c283c719a37be58c3ad617928011a1bb9570901d2022100ced371a23e86af6f55ff4ce705c57d2721a09c4d192ca39d82c4239825f75a9801 72 0x30450220357011fd3b3ad2b8f2f2d01e05dc6108b51d2a245b4ef40c112d6004596f0475022100a8208c93a39e0c366b983f9a80bfaf89237fcd64ca543568badd2d18ee2e1d7501 OP_PUSHDATA1 105 0x5221024c02dff2f0b8263a562a69ec875b2c95ffad860f428acf2f9e8c6492bd067d362103546324a1351a6b601c623b463e33b6103ca444707d5b278ece1692f1aa7724a42103b1ad3b328429450069cc3f9fa80d537ee66ba1120e93f3f185a5bf686fb51e0a53ae').isScriptHashIn().should.equal(true);
});
it('should identify this known non-scripthashin', function() {
Script('20 0000000000000000000000000000000000000000 OP_CHECKSIG').isScriptHashIn().should.equal(false);
});
});
describe('#isScripthashOut', function() {
it('should identify this known pubkeyhashout as pubkeyhashout', function() {
Script('OP_HASH160 20 0x0000000000000000000000000000000000000000 OP_EQUAL').isScriptHashOut().should.equal(true);
});
it('should identify these known non-pubkeyhashout as not pubkeyhashout', function() {
Script('OP_HASH160 20 0x0000000000000000000000000000000000000000 OP_EQUAL OP_EQUAL').isScriptHashOut().should.equal(false);
Script('OP_HASH160 21 0x000000000000000000000000000000000000000000 OP_EQUAL').isScriptHashOut().should.equal(false);
});
});
describe('#isMultisigOut', function() {
it('should identify known multisig out 1', function() {
Script('OP_2 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 OP_2 OP_CHECKMULTISIG').isMultisigOut().should.equal(true);
@ -301,6 +276,32 @@ describe('Script', function() {
});
});
describe('#isScriptHashIn', function() {
it('should identify this known scripthashin', function() {
var sstr = 'OP_0 73 0x30460221008ca148504190c10eea7f5f9c283c719a37be58c3ad617928011a1bb9570901d2022100ced371a23e86af6f55ff4ce705c57d2721a09c4d192ca39d82c4239825f75a9801 72 0x30450220357011fd3b3ad2b8f2f2d01e05dc6108b51d2a245b4ef40c112d6004596f0475022100a8208c93a39e0c366b983f9a80bfaf89237fcd64ca543568badd2d18ee2e1d7501 OP_PUSHDATA1 105 0x5221024c02dff2f0b8263a562a69ec875b2c95ffad860f428acf2f9e8c6492bd067d362103546324a1351a6b601c623b463e33b6103ca444707d5b278ece1692f1aa7724a42103b1ad3b328429450069cc3f9fa80d537ee66ba1120e93f3f185a5bf686fb51e0a53ae';
var s = Script(sstr);
s.toString().should.equal(sstr);
s.isScriptHashIn().should.equal(true);
});
it('should identify this known non-scripthashin', function() {
Script('20 0000000000000000000000000000000000000000 OP_CHECKSIG').isScriptHashIn().should.equal(false);
});
});
describe('#isScripthashOut', function() {
it('should identify this known pubkeyhashout as pubkeyhashout', function() {
Script('OP_HASH160 20 0x0000000000000000000000000000000000000000 OP_EQUAL').isScriptHashOut().should.equal(true);
});
it('should identify these known non-pubkeyhashout as not pubkeyhashout', function() {
Script('OP_HASH160 20 0x0000000000000000000000000000000000000000 OP_EQUAL OP_EQUAL').isScriptHashOut().should.equal(false);
Script('OP_HASH160 21 0x000000000000000000000000000000000000000000 OP_EQUAL').isScriptHashOut().should.equal(false);
});
});
describe('#isPushOnly', function() {
it('should know these scripts are or aren\'t push only', function() {
Script('OP_NOP 1 0x01').isPushOnly().should.equal(false);

View File

@ -2,9 +2,10 @@
var should = require('chai').should();
var errors = require('../../lib/errors');
var $ = require('../../lib/util/preconditions');
var PrivateKey = require('../../lib/privatekey');
var bitcore = require('../..');
var errors = bitcore.errors;
var $ = bitcore.util.preconditions;
var PrivateKey = bitcore.PrivateKey;
describe('preconditions', function() {