fix and test if statements. fix comparisons.
This commit is contained in:
parent
690fe7163a
commit
72d9a93773
@ -136,7 +136,7 @@ script._next = function(to, s, pc) {
|
|||||||
var o = s[pc];
|
var o = s[pc];
|
||||||
if (o === 'if_' || o === 'notif')
|
if (o === 'if_' || o === 'notif')
|
||||||
depth++;
|
depth++;
|
||||||
else if (o === 'else')
|
else if (o === 'else_')
|
||||||
depth--;
|
depth--;
|
||||||
else if (o === 'endif')
|
else if (o === 'endif')
|
||||||
depth--;
|
depth--;
|
||||||
@ -144,7 +144,7 @@ script._next = function(to, s, pc) {
|
|||||||
break;
|
break;
|
||||||
if (depth === 0 && o === to)
|
if (depth === 0 && o === to)
|
||||||
return pc;
|
return pc;
|
||||||
if (o === 'else')
|
if (o === 'else_')
|
||||||
depth++;
|
depth++;
|
||||||
pc++;
|
pc++;
|
||||||
}
|
}
|
||||||
@ -157,7 +157,6 @@ script.execute = function execute(s, stack, tx, index) {
|
|||||||
if (s.length > 10000)
|
if (s.length > 10000)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
var input = tx.inputs[index];
|
|
||||||
var lastSep = -1;
|
var lastSep = -1;
|
||||||
|
|
||||||
stack.alt = stack.alt || [];
|
stack.alt = stack.alt || [];
|
||||||
@ -193,7 +192,7 @@ script.execute = function execute(s, stack, tx, index) {
|
|||||||
if (stack.length < 1)
|
if (stack.length < 1)
|
||||||
return false;
|
return false;
|
||||||
var v = stack.pop();
|
var v = stack.pop();
|
||||||
val = new bn(v).cmp(0) !== 0;
|
val = new bn(v).cmpn(0) !== 0;
|
||||||
if (o === 'notif')
|
if (o === 'notif')
|
||||||
val = !val;
|
val = !val;
|
||||||
var if_ = pc;
|
var if_ = pc;
|
||||||
@ -213,10 +212,12 @@ script.execute = function execute(s, stack, tx, index) {
|
|||||||
} else {
|
} else {
|
||||||
if (endif === -1)
|
if (endif === -1)
|
||||||
return false;
|
return false;
|
||||||
if (else_ === -1)
|
if (else_ === -1) {
|
||||||
s.splice(if_, (endif - if_) + 1);
|
s.splice(if_, (endif - if_) + 1);
|
||||||
else
|
} else {
|
||||||
|
s.splice(endif, 1);
|
||||||
s.splice(if_, (else_ - if_) + 1);
|
s.splice(if_, (else_ - if_) + 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Subtract one since we removed the if/notif opcode
|
// Subtract one since we removed the if/notif opcode
|
||||||
pc--;
|
pc--;
|
||||||
@ -231,7 +232,7 @@ script.execute = function execute(s, stack, tx, index) {
|
|||||||
case 'verify': {
|
case 'verify': {
|
||||||
if (stack.length === 0)
|
if (stack.length === 0)
|
||||||
return false;
|
return false;
|
||||||
if (new bn(stack[stack.length - 1]).cmp(0) === 0)
|
if (new bn(stack[stack.length - 1]).cmpn(0) === 0)
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -253,7 +254,7 @@ script.execute = function execute(s, stack, tx, index) {
|
|||||||
case 'ifdup': {
|
case 'ifdup': {
|
||||||
if (stack.length === 0)
|
if (stack.length === 0)
|
||||||
return false;
|
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());
|
stack.push(new bn(stack[stack.length - 1]).toArray());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -411,14 +412,14 @@ script.execute = function execute(s, stack, tx, index) {
|
|||||||
n = n.neg();
|
n = n.neg();
|
||||||
break;
|
break;
|
||||||
case 'abs':
|
case 'abs':
|
||||||
if (n.cmp(0) < 0)
|
if (n.cmpn(0) < 0)
|
||||||
n = n.neg();
|
n = n.neg();
|
||||||
break;
|
break;
|
||||||
case 'not':
|
case 'not':
|
||||||
n = n.cmp(0) === 0;
|
n = n.cmpn(0) === 0;
|
||||||
break;
|
break;
|
||||||
case 'noteq0':
|
case 'noteq0':
|
||||||
n = n.cmp(0) !== 0;
|
n = n.cmpn(0) !== 0;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
@ -466,10 +467,10 @@ script.execute = function execute(s, stack, tx, index) {
|
|||||||
n = n1.sub(n2);
|
n = n1.sub(n2);
|
||||||
break;
|
break;
|
||||||
case 'booland':
|
case 'booland':
|
||||||
n = n1.cmp(0) !== 0 && n2.cmp(0) !== 0;
|
n = n1.cmpn(0) !== 0 && n2.cmpn(0) !== 0;
|
||||||
break;
|
break;
|
||||||
case 'boolor':
|
case 'boolor':
|
||||||
n = n1.cmp(0) !== 0 || n2.cmp(0) !== 0;
|
n = n1.cmpn(0) !== 0 || n2.cmpn(0) !== 0;
|
||||||
break;
|
break;
|
||||||
case 'numeq':
|
case 'numeq':
|
||||||
n = n1.cmp(n2) === 0;
|
n = n1.cmp(n2) === 0;
|
||||||
@ -501,7 +502,7 @@ script.execute = function execute(s, stack, tx, index) {
|
|||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
var res = n.cmp(0) !== 0;
|
var res = n.cmpn(0) !== 0;
|
||||||
if (o === 'numeqverify') {
|
if (o === 'numeqverify') {
|
||||||
if (!res)
|
if (!res)
|
||||||
return false;
|
return false;
|
||||||
@ -517,7 +518,7 @@ script.execute = function execute(s, stack, tx, index) {
|
|||||||
var n2 = new bn(stack.pop());
|
var n2 = new bn(stack.pop());
|
||||||
var n1 = new bn(stack.pop());
|
var n1 = new bn(stack.pop());
|
||||||
var val = n2.cmp(n1) <= 0 && n1.cmp(n3) < 0;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -665,7 +666,7 @@ script.execute = function execute(s, stack, tx, index) {
|
|||||||
// input: [[], sig1, sig2, 1]
|
// input: [[], sig1, sig2, 1]
|
||||||
// prev_out: [[lock], 'checklocktimeverify', 'drop',
|
// prev_out: [[lock], 'checklocktimeverify', 'drop',
|
||||||
// 'dup', 'hash160', pubkey, 'equalverify', 'checksig']
|
// 'dup', 'hash160', pubkey, 'equalverify', 'checksig']
|
||||||
if (stack.length === 0)
|
if (!tx || stack.length === 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
var lock = new bn(stack[stack.length - 1]).toNumber();
|
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)
|
if (lock > tx.lock)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (input.seq === 0xffffffff)
|
if (!tx.inputs[index] || tx.inputs[index].seq === 0xffffffff)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -44,4 +44,46 @@ describe('Script', function() {
|
|||||||
var decoded = bcoin.script.decode(encoded);
|
var decoded = bcoin.script.decode(encoded);
|
||||||
assert(bcoin.script.isNullData(decoded))
|
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]]);
|
||||||
|
})
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user