package vm
import (
- "math"
-
"github.com/holiman/uint256"
"github.com/bytom/bytom/math/checked"
return vm.pushBigInt(n.Rsh(n, 1), true)
}
-func opNegate(vm *virtualMachine) error {
- err := vm.applyCost(2)
- if err != nil {
- return err
- }
- n, err := vm.popInt64(true)
- if err != nil {
- return err
- }
- res, ok := checked.NegateInt64(n)
- if !ok {
- return ErrRange
- }
- return vm.pushInt64(res, true)
-}
-
-func opAbs(vm *virtualMachine) error {
- err := vm.applyCost(2)
- if err != nil {
- return err
- }
- n, err := vm.popInt64(true)
- if err != nil {
- return err
- }
- if n == math.MinInt64 {
- return ErrRange
- }
- if n < 0 {
- n = -n
- }
- return vm.pushInt64(n, true)
-}
-
func opNot(vm *virtualMachine) error {
err := vm.applyCost(2)
if err != nil {
dataStack: [][]byte{{1}},
},
}, {
- op: OP_NEGATE,
- startVM: &virtualMachine{
- runLimit: 50000,
- dataStack: [][]byte{{2}},
- },
- wantVM: &virtualMachine{
- runLimit: 49998,
- deferredCost: 7,
- dataStack: [][]byte{Int64Bytes(-2)},
- },
- }, {
- op: OP_ABS,
- startVM: &virtualMachine{
- runLimit: 50000,
- dataStack: [][]byte{{2}},
- },
- wantVM: &virtualMachine{
- runLimit: 49998,
- dataStack: [][]byte{{2}},
- },
- }, {
- op: OP_ABS,
- startVM: &virtualMachine{
- runLimit: 50000,
- dataStack: [][]byte{Int64Bytes(-2)},
- },
- wantVM: &virtualMachine{
- runLimit: 49998,
- deferredCost: -7,
- dataStack: [][]byte{{2}},
- },
- }, {
op: OP_NOT,
startVM: &virtualMachine{
runLimit: 50000,
}}
numops := []Op{
- OP_1ADD, OP_1SUB, OP_2MUL, OP_2DIV, OP_NEGATE, OP_ABS, OP_NOT, OP_0NOTEQUAL,
+ OP_1ADD, OP_1SUB, OP_2MUL, OP_2DIV, OP_NOT, OP_0NOTEQUAL,
OP_ADD, OP_SUB, OP_MUL, OP_DIV, OP_MOD, OP_LSHIFT, OP_RSHIFT, OP_BOOLAND,
OP_BOOLOR, OP_NUMEQUAL, OP_NUMEQUALVERIFY, OP_NUMNOTEQUAL, OP_LESSTHAN,
OP_LESSTHANOREQUAL, OP_GREATERTHAN, OP_GREATERTHANOREQUAL, OP_MIN, OP_MAX, OP_WITHIN,
OP_1SUB Op = 0x8c
OP_2MUL Op = 0x8d
OP_2DIV Op = 0x8e
- OP_NEGATE Op = 0x8f
- OP_ABS Op = 0x90
OP_NOT Op = 0x91
OP_0NOTEQUAL Op = 0x92
OP_ADD Op = 0x93
OP_1SUB: {OP_1SUB, "1SUB", op1Sub},
OP_2MUL: {OP_2MUL, "2MUL", op2Mul},
OP_2DIV: {OP_2DIV, "2DIV", op2Div},
- OP_NEGATE: {OP_NEGATE, "NEGATE", opNegate},
- OP_ABS: {OP_ABS, "ABS", opAbs},
OP_NOT: {OP_NOT, "NOT", opNot},
OP_0NOTEQUAL: {OP_0NOTEQUAL, "0NOTEQUAL", op0NotEqual},
OP_ADD: {OP_ADD, "ADD", opAdd},
{1, op1Sub},
{1, op2Mul},
{1, op2Div},
- {1, opNegate},
- {1, opAbs},
{1, opNot},
{1, op0NotEqual},
{2, opAdd},
{"2DIV -1 NUMEQUAL", [][]byte{Int64Bytes(-1)}, true},
{"2DIV -1 NUMEQUAL", [][]byte{Int64Bytes(-2)}, true},
- {"ABS 1 NUMEQUAL", [][]byte{Int64Bytes(1)}, false},
- {"ABS 1 NUMEQUAL", [][]byte{Int64Bytes(-1)}, false},
- {"ABS 0 NUMEQUAL", [][]byte{Int64Bytes(0)}, false},
-
{"0NOTEQUAL", [][]byte{Int64Bytes(1)}, false},
{"0NOTEQUAL NOT", [][]byte{Int64Bytes(0)}, false},