From e83590f5285d67fb1897cd3d475431ab6d79dc38 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Fri, 7 Mar 2014 14:43:29 -0300 Subject: [PATCH] fix Script parsing for some cases, setup ScriptInterpreter tests --- Script.js | 24 ++++++- ScriptInterpreter.js | 120 ++++++++++++++++----------------- test/data/script_valid.json | 10 +-- test/test.Script.js | 4 -- test/test.ScriptInterpreter.js | 22 ++++++ test/testdata.js | 1 + 6 files changed, 110 insertions(+), 71 deletions(-) diff --git a/Script.js b/Script.js index 322b4e6..01e5da6 100644 --- a/Script.js +++ b/Script.js @@ -271,17 +271,33 @@ function spec(b) { for (var i = 0; i < split.length; i++) { var word = split[i]; if (word.length > 2 && word.substring(0, 2) === '0x') { + // raw hex value + //console.log('hex value'); chunks.push(new Buffer(word.substring(2, word.length), 'hex')); } else { var opcode = Opcode.map['OP_' + word]; if (opcode) { + // op code in string form + //console.log('opcode'); chunks.push(opcode); } else { var integer = parseInt(word); if (!isNaN(integer)) { - //console.log(integer+' bits=\t'+integer.toString(2).replace('-','').length); + // integer + //console.log('integer'); var data = util.intToBuffer(integer); chunks.push(data); + } else if (word[0] === '\'' && word[word.length-1] === '\'') { + // string + //console.log('string'); + word = word.substring(1,word.length-1); + var hex = ''; + for(var c=0;c keysCount) { - success = false; - } + // If there are more signatures than keys left, then too many + // signatures have failed + if (sigsCount > keysCount) { + success = false; + } } checkMultiSigStep.call(this); - } catch (e) { + } catch (e) { cb(e); - } - }.bind(this)); + } + }.bind(this)); } else { this.stack.push(new Buffer([success ? 1 : 0])); if (opcode === OP_CHECKMULTISIGVERIFY) { @@ -763,7 +763,7 @@ function spec(b) { } } catch (e) { log.debug("Script aborted: " + - (e.message ? e : e)); + (e.message ? e.message : e)); cb(e); } } @@ -774,14 +774,14 @@ function spec(b) { var self = this; self.eval(scriptSig, tx, n, hashType, function(e) { - if (e) { + if (e) { callback(e) return; - } + } - self.eval(scriptPubkey, tx, n, hashType, callback); - }); - }; + self.eval(scriptPubkey, tx, n, hashType, callback); + }); + }; /** * Get the top element of the stack. @@ -821,7 +821,7 @@ function spec(b) { } var s = this.stack, - l = s.length; + l = s.length; var tmp = s[l - a]; s[l - a] = s[l - b]; @@ -836,16 +836,16 @@ function spec(b) { */ ScriptInterpreter.prototype.getPrimitiveStack = function getPrimitiveStack() { return this.stack.map(function(entry) { - if (entry.length > 2) { + if (entry.length > 2) { return buffertools.toHex(entry.slice(0)); - } - var num = castBigint(entry); - if (num.cmp(-128) >= 0 && num.cmp(127) <= 0) { + } + var num = castBigint(entry); + if (num.cmp(-128) >= 0 && num.cmp(127) <= 0) { return num.toNumber(); - } else { + } else { return buffertools.toHex(entry.slice(0)); - } - }); + } + }); }; var castBool = ScriptInterpreter.castBool = function castBool(v) { diff --git a/test/data/script_valid.json b/test/data/script_valid.json index ae3390f..e4c181c 100644 --- a/test/data/script_valid.json +++ b/test/data/script_valid.json @@ -1,8 +1,8 @@ [ ["0x01 0x0b", "11 EQUAL", "push 1 byte"], -["0x02 0x417a", "0x417a EQUAL"], +["0x02 0x417a", "'Az' EQUAL"], ["0x4b 0x417a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a", - "0x417a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a7a EQUAL", "push 75 bytes"], + "'Azzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz' EQUAL", "push 75 bytes"], ["0x4c 0x01 0x07","7 EQUAL", "0x4c is OP_PUSHDATA1"], ["0x4d 0x0100 0x08","8 EQUAL", "0x4d is OP_PUSHDATA2"], @@ -11,7 +11,7 @@ ["0x4c 0x00","0 EQUAL"], ["0x4d 0x0000","0 EQUAL"], ["0x4e 0x00000000","0 EQUAL"], -["0x4f 0x03e8 ADD","0x03e7 EQUAL"], +["0x4f 1000 ADD","999 EQUAL"], ["0", "IF 0x50 ENDIF 1", "0x50 is reserved (ok if not executed)"], ["0x51", "0x5f ADD 0x60 EQUAL", "0x51 through 0x60 push 1 through 16 onto stack"], ["1","NOP"], @@ -53,8 +53,8 @@ ["1 1", "VERIFY"], -["10 0 11 TOALTSTACK DROP FROMALTSTACK", "ADD 0x15 EQUAL"], -["0x676176696e5f7761735f68657265 TOALTSTACK 11 FROMALTSTACK", "0x676176696e5f7761735f68657265 EQUALVERIFY 11 EQUAL"], +["10 0 11 TOALTSTACK DROP FROMALTSTACK", "ADD 21 EQUAL"], +["'gavin_was_here' TOALTSTACK 11 FROMALTSTACK", "'gavin_was_here' EQUALVERIFY 11 EQUAL"], ["0 IFDUP", "DEPTH 1 EQUALVERIFY 0 EQUAL"], ["1 IFDUP", "DEPTH 2 EQUALVERIFY 1 EQUALVERIFY 1 EQUAL"], diff --git a/test/test.Script.js b/test/test.Script.js index 52294fd..00a2187 100644 --- a/test/test.Script.js +++ b/test/test.Script.js @@ -84,8 +84,6 @@ describe('Script', function() { }); }); - - test_data.dataScriptValid.forEach(function(datum) { if (datum.length < 2) throw new Error('Invalid test data'); var human = datum[0] + ' ' + datum[1]; @@ -93,8 +91,6 @@ describe('Script', function() { var h2 = Script.fromStringContent(human).getStringContent(false, null); Script.fromStringContent(h2).getStringContent(false, null).should.equal(h2); }); - - }); }); diff --git a/test/test.ScriptInterpreter.js b/test/test.ScriptInterpreter.js index 909a427..3a27e3c 100644 --- a/test/test.ScriptInterpreter.js +++ b/test/test.ScriptInterpreter.js @@ -4,8 +4,10 @@ var chai = require('chai'); var bitcore = require('../bitcore'); var should = chai.should(); +var test_data = require('./testdata'); var ScriptInterpreterModule = bitcore.ScriptInterpreter; +var Script = bitcore.Script.class(); var ScriptInterpreter; describe('ScriptInterpreter', function() { @@ -20,6 +22,26 @@ describe('ScriptInterpreter', function() { var si = new ScriptInterpreter(); should.exist(si); }); + var i = 0; + test_data.dataScriptValid.forEach(function(datum) { + if (datum.length < 2) throw new Error('Invalid test data'); + var scriptSig = datum[0]; // script inputs + var scriptPubKey = datum[1]; // output script + var human = scriptSig + ' ' + scriptPubKey; + it('should validate script ' + human, function(done) { + i++; + console.log(i + ' ' + human); + ScriptInterpreter.verify(Script.fromStringContent(scriptSig), + Script.fromStringContent(scriptPubKey), + null, 0, 0, // tx, output index, and hashtype + function (err, result) { + should.not.exist(err); + result.should.equal(true); + done(); + } + ); + }); + }); }); diff --git a/test/testdata.js b/test/testdata.js index 9d62e9d..66700dc 100644 --- a/test/testdata.js +++ b/test/testdata.js @@ -17,3 +17,4 @@ module.exports.dataTxValid = dataTxValid; module.exports.dataTxInvalid = dataTxInvalid; module.exports.dataScriptValid = dataScriptValid; module.exports.dataScriptInvalid = dataScriptInvalid; +module.exports.dataScriptAll = dataScriptValid.concat(dataScriptInvalid);