add if/notif/else/endif opcodes.
This commit is contained in:
parent
d1ac6e914d
commit
a0a391e89e
@ -130,7 +130,30 @@ script.verify = function verify(hash, sig, pub) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
script._next = function(to, s, pc) {
|
||||||
|
var depth = 0;
|
||||||
|
while (s[pc]) {
|
||||||
|
var o = s[pc];
|
||||||
|
if (o === 'if_' || o === 'notif')
|
||||||
|
depth++;
|
||||||
|
else if (o === 'else')
|
||||||
|
depth--;
|
||||||
|
else if (o === 'endif')
|
||||||
|
depth--;
|
||||||
|
if (depth < 0)
|
||||||
|
break;
|
||||||
|
if (depth === 0 && o === to)
|
||||||
|
return pc;
|
||||||
|
if (o === 'else')
|
||||||
|
depth++;
|
||||||
|
pc++;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
};
|
||||||
|
|
||||||
script.execute = function execute(s, stack, tx, index) {
|
script.execute = function execute(s, stack, tx, index) {
|
||||||
|
s = s.slice();
|
||||||
|
|
||||||
if (s.length > 10000)
|
if (s.length > 10000)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -153,6 +176,47 @@ script.execute = function execute(s, stack, tx, index) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (o) {
|
switch (o) {
|
||||||
|
case 'if_':
|
||||||
|
case 'notif': {
|
||||||
|
var val = false;
|
||||||
|
if (stack.length < 1)
|
||||||
|
return false;
|
||||||
|
var v = stack.pop();
|
||||||
|
val = new bn(v).cmp(0) !== 0;
|
||||||
|
if (o === 'notif')
|
||||||
|
val = !val;
|
||||||
|
var if_ = pc;
|
||||||
|
var else_ = script._next('else_', s, pc);
|
||||||
|
var endif = script._next('endif', s, pc);
|
||||||
|
// Splice out the statement blocks we don't need
|
||||||
|
if (val) {
|
||||||
|
if (endif === -1)
|
||||||
|
return false;
|
||||||
|
if (else_ === -1) {
|
||||||
|
s.splice(endif, 1);
|
||||||
|
s.splice(if_, 1);
|
||||||
|
} else {
|
||||||
|
s.splice(else_, (endif - else_) + 1);
|
||||||
|
s.splice(if_, 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (endif === -1)
|
||||||
|
return false;
|
||||||
|
if (else_ === -1)
|
||||||
|
s.splice(if_, (endif - if_) + 1);
|
||||||
|
else
|
||||||
|
s.splice(if_, (else_ - if_) + 1);
|
||||||
|
}
|
||||||
|
// Subtract one since we removed the if/notif opcode
|
||||||
|
pc--;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 'else_': {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
case 'endif': {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
case 'dup': {
|
case 'dup': {
|
||||||
if (stack.length === 0)
|
if (stack.length === 0)
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user