fix and test if statements. fix comparisons.

This commit is contained in:
Christopher Jeffrey 2015-12-09 14:35:23 -08:00
parent 690fe7163a
commit 72d9a93773
2 changed files with 60 additions and 17 deletions

View File

@ -136,7 +136,7 @@ script._next = function(to, s, pc) {
var o = s[pc];
if (o === 'if_' || o === 'notif')
depth++;
else if (o === 'else')
else if (o === 'else_')
depth--;
else if (o === 'endif')
depth--;
@ -144,7 +144,7 @@ script._next = function(to, s, pc) {
break;
if (depth === 0 && o === to)
return pc;
if (o === 'else')
if (o === 'else_')
depth++;
pc++;
}
@ -157,7 +157,6 @@ script.execute = function execute(s, stack, tx, index) {
if (s.length > 10000)
return false;
var input = tx.inputs[index];
var lastSep = -1;
stack.alt = stack.alt || [];
@ -193,7 +192,7 @@ script.execute = function execute(s, stack, tx, index) {
if (stack.length < 1)
return false;
var v = stack.pop();
val = new bn(v).cmp(0) !== 0;
val = new bn(v).cmpn(0) !== 0;
if (o === 'notif')
val = !val;
var if_ = pc;
@ -213,10 +212,12 @@ script.execute = function execute(s, stack, tx, index) {
} else {
if (endif === -1)
return false;
if (else_ === -1)
if (else_ === -1) {
s.splice(if_, (endif - if_) + 1);
else
} else {
s.splice(endif, 1);
s.splice(if_, (else_ - if_) + 1);
}
}
// Subtract one since we removed the if/notif opcode
pc--;
@ -231,7 +232,7 @@ script.execute = function execute(s, stack, tx, index) {
case 'verify': {
if (stack.length === 0)
return false;
if (new bn(stack[stack.length - 1]).cmp(0) === 0)
if (new bn(stack[stack.length - 1]).cmpn(0) === 0)
return false;
break;
}
@ -253,7 +254,7 @@ script.execute = function execute(s, stack, tx, index) {
case 'ifdup': {
if (stack.length === 0)
return false;
if (new bn(stack[stack.length - 1]).cmp(0) !== 0)
if (new bn(stack[stack.length - 1]).cmpn(0) !== 0)
stack.push(new bn(stack[stack.length - 1]).toArray());
break;
}
@ -411,14 +412,14 @@ script.execute = function execute(s, stack, tx, index) {
n = n.neg();
break;
case 'abs':
if (n.cmp(0) < 0)
if (n.cmpn(0) < 0)
n = n.neg();
break;
case 'not':
n = n.cmp(0) === 0;
n = n.cmpn(0) === 0;
break;
case 'noteq0':
n = n.cmp(0) !== 0;
n = n.cmpn(0) !== 0;
break;
default:
return false;
@ -466,10 +467,10 @@ script.execute = function execute(s, stack, tx, index) {
n = n1.sub(n2);
break;
case 'booland':
n = n1.cmp(0) !== 0 && n2.cmp(0) !== 0;
n = n1.cmpn(0) !== 0 && n2.cmpn(0) !== 0;
break;
case 'boolor':
n = n1.cmp(0) !== 0 || n2.cmp(0) !== 0;
n = n1.cmpn(0) !== 0 || n2.cmpn(0) !== 0;
break;
case 'numeq':
n = n1.cmp(n2) === 0;
@ -501,7 +502,7 @@ script.execute = function execute(s, stack, tx, index) {
default:
return false;
}
var res = n.cmp(0) !== 0;
var res = n.cmpn(0) !== 0;
if (o === 'numeqverify') {
if (!res)
return false;
@ -517,7 +518,7 @@ script.execute = function execute(s, stack, tx, index) {
var n2 = new bn(stack.pop());
var n1 = new bn(stack.pop());
var val = n2.cmp(n1) <= 0 && n1.cmp(n3) < 0;
stack.push(val.cmp(0) !== 0 ? [ 1 ] : []);
stack.push(val.cmpn(0) !== 0 ? [ 1 ] : []);
break;
}
@ -665,7 +666,7 @@ script.execute = function execute(s, stack, tx, index) {
// input: [[], sig1, sig2, 1]
// prev_out: [[lock], 'checklocktimeverify', 'drop',
// 'dup', 'hash160', pubkey, 'equalverify', 'checksig']
if (stack.length === 0)
if (!tx || stack.length === 0)
return false;
var lock = new bn(stack[stack.length - 1]).toNumber();
@ -684,7 +685,7 @@ script.execute = function execute(s, stack, tx, index) {
if (lock > tx.lock)
return false;
if (input.seq === 0xffffffff)
if (!tx.inputs[index] || tx.inputs[index].seq === 0xffffffff)
return false;
break;

View File

@ -44,4 +44,46 @@ describe('Script', function() {
var decoded = bcoin.script.decode(encoded);
assert(bcoin.script.isNullData(decoded))
})
it('should handle if statements correctly', function () {
var inputScript = [1, 2];
var prevOutScript = [2, 'eq', 'if_', 3, 'else_', 4, 'endif', 5];
var stack = [];
bcoin.script.execute(inputScript, stack);
var res = bcoin.script.execute(prevOutScript, stack);
assert(res);
assert.deepEqual(stack.slice(), [[1], [3], [5]]);
var inputScript = [1, 2];
var prevOutScript = [9, 'eq', 'if_', 3, 'else_', 4, 'endif', 5];
var stack = [];
bcoin.script.execute(inputScript, stack);
var res = bcoin.script.execute(prevOutScript, stack);
assert(res);
assert.deepEqual(stack.slice(), [[1], [4], [5]]);
var inputScript = [1, 2];
var prevOutScript = [2, 'eq', 'if_', 3, 'endif', 5];
var stack = [];
bcoin.script.execute(inputScript, stack);
var res = bcoin.script.execute(prevOutScript, stack);
assert(res);
assert.deepEqual(stack.slice(), [[1], [3], [5]]);
var inputScript = [1, 2];
var prevOutScript = [9, 'eq', 'if_', 3, 'endif', 5];
var stack = [];
bcoin.script.execute(inputScript, stack);
var res = bcoin.script.execute(prevOutScript, stack);
assert(res);
assert.deepEqual(stack.slice(), [[1], [5]]);
var inputScript = [1, 2];
var prevOutScript = [9, 'eq', 'notif', 3, 'endif', 5];
var stack = [];
bcoin.script.execute(inputScript, stack);
var res = bcoin.script.execute(prevOutScript, stack);
assert(res);
assert.deepEqual(stack.slice(), [[1], [3], [5]]);
})
});