From 8ef68dcc6e51e733af9d7ce9e962879d66f0ad49 Mon Sep 17 00:00:00 2001 From: Dave Collins Date: Mon, 27 Apr 2015 22:35:50 -0500 Subject: [PATCH] txscript: Cleanup and improve opcode tests. - Remove all redundant opcode tests in favor of the JSON-based tests in the data directory. - Remove duplicate stack nip test - Add new tests to data/script_invalid.json to exercise additional negative error paths - Remove old unneeded pubkey trace code from opcodeCheckSig - Simplify and improve the disassembly print function - Add new tests to directly test all individual opcode disassembly - Add new tests to directly test opcode disabled function which does not get invoked during ordinary execution - Improve test coverage of opcode.go --- txscript/data/script_invalid.json | 14 +- txscript/opcode.go | 49 +- txscript/opcode_test.go | 4607 +---------------------------- txscript/stack_test.go | 10 - 4 files changed, 198 insertions(+), 4482 deletions(-) diff --git a/txscript/data/script_invalid.json b/txscript/data/script_invalid.json index f4a04308..5879b1c2 100644 --- a/txscript/data/script_invalid.json +++ b/txscript/data/script_invalid.json @@ -141,6 +141,8 @@ ["2 2 0 IF LSHIFT ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "LSHIFT disabled"], ["2 2 0 IF RSHIFT ELSE 1 ENDIF", "NOP", "P2SH,STRICTENC", "RSHIFT disabled"], +["", "EQUAL NOT", "P2SH,STRICTENC", "EQUAL must error when there are no stack items"], +["0", "EQUAL NOT", "P2SH,STRICTENC", "EQUAL must error when there are not 2 stack items"], ["0 1","EQUAL", "P2SH,STRICTENC"], ["1 1 ADD", "0 EQUAL", "P2SH,STRICTENC"], ["11 1 ADD 12 SUB", "11 EQUAL", "P2SH,STRICTENC"], @@ -368,6 +370,16 @@ ["NOP", "HASH160 1", "P2SH,STRICTENC"], ["NOP", "HASH256 1", "P2SH,STRICTENC"], +["Increase CHECKSIG and CHECKMULTISIG negative test coverage"], +["", "CHECKSIG NOT", "STRICTENC", "CHECKSIG must error when there are no stack items"], +["0", "CHECKSIG NOT", "STRICTENC", "CHECKSIG must error when there are not 2 stack items"], +["", "CHECKMULTISIG NOT", "STRICTENC", "CHECKMULTISIG must error when there are no stack items"], +["", "-1 CHECKMULTISIG NOT", "STRICTENC", "CHECKMULTISIG must error when the specified number of pubkeys is negative"], +["", "1 CHECKMULTISIG NOT", "STRICTENC", "CHECKMULTISIG must error when there are not enough pubkeys on the stack"], +["", "-1 0 CHECKMULTISIG NOT", "STRICTENC", "CHECKMULTISIG must error when the specified number of signatures is negative"], +["", "1 'pk1' 1 CHECKMULTISIG NOT", "STRICTENC", "CHECKMULTISIG must error when there are not enough signatures on the stack"], +["", "'dummy' 'sig1' 1 'pk1' 1 CHECKMULTISIG IF 1 ENDIF", "", "CHECKMULTISIG must push false to stack when signature is invalid when NOT in strict enc mode"], + ["", "0 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG 0 0 CHECKMULTISIG", "P2SH,STRICTENC", @@ -426,7 +438,7 @@ ["0x4d 0xFF00 0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "DROP 1", "MINIMALDATA", "PUSHDATA2 of 255 bytes minimally represented by PUSHDATA1"], -["0x4f 0x00100000 0x11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "DROP 1", "MINIMALDATA", +["0x4e 0x00010000 0x11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", "DROP 1", "MINIMALDATA", "PUSHDATA4 of 256 bytes minimally represented by PUSHDATA2"], diff --git a/txscript/opcode.go b/txscript/opcode.go index 203a48d2..be3eb253 100644 --- a/txscript/opcode.go +++ b/txscript/opcode.go @@ -8,7 +8,6 @@ import ( "bytes" "crypto/sha1" "encoding/binary" - "encoding/hex" "fmt" "hash" "math/big" @@ -729,27 +728,32 @@ func (pop *parsedOpcode) print(oneline bool) string { if replName, ok := opcodeOnelineRepls[opcodeName]; ok { opcodeName = replName } + + // Nothing more to do for non-data push opcodes. + if pop.opcode.length == 1 { + return opcodeName + } + + return fmt.Sprintf("%x", pop.data) } - retString := opcodeName + // Nothing more to do for non-data push opcodes. if pop.opcode.length == 1 { - return retString + return opcodeName } - if oneline { - retString = "" + + // Add length for the OP_PUSHDATA# opcodes. + retString := opcodeName + switch pop.opcode.length { + case -1: + retString += fmt.Sprintf(" 0x%02x", len(pop.data)) + case -2: + retString += fmt.Sprintf(" 0x%04x", len(pop.data)) + case -4: + retString += fmt.Sprintf(" 0x%08x", len(pop.data)) } - if !oneline && pop.opcode.length < 0 { - //add length to the end of retString - retString += fmt.Sprintf(" 0x%0*x", 2*-pop.opcode.length, - len(pop.data)) - } - for _, val := range pop.data { - if !oneline { - retString += " " - } - retString += fmt.Sprintf("%02x", val) - } - return retString + + return fmt.Sprintf("%s 0x%02x", retString, pop.data) } func (pop *parsedOpcode) bytes() ([]byte, error) { @@ -1561,17 +1565,6 @@ func opcodeCheckSig(op *parsedOpcode, vm *Engine) error { return nil } - log.Tracef("%v", newLogClosure(func() string { - return fmt.Sprintf("op_checksig\n"+ - "pubKey:\n%v"+ - "pubKey.X: %v\n"+ - "pubKey.Y: %v\n"+ - "signature.R: %v\n"+ - "signature.S: %v\n"+ - "checkScriptHash:\n%v", - hex.Dump(pkStr), pubKey.X, pubKey.Y, - signature.R, signature.S, hex.Dump(hash)) - })) ok := signature.Verify(hash, pubKey) vm.dstack.PushBool(ok) return nil diff --git a/txscript/opcode_test.go b/txscript/opcode_test.go index b5da7957..a3558594 100644 --- a/txscript/opcode_test.go +++ b/txscript/opcode_test.go @@ -2,4464 +2,185 @@ // Use of this source code is governed by an ISC // license that can be found in the LICENSE file. -package txscript_test +package txscript import ( "bytes" + "fmt" + "strconv" + "strings" "testing" - - "github.com/btcsuite/btcd/txscript" - "github.com/btcsuite/btcd/wire" ) -// TestScripts tests script execution for a wide variety of opcodes. All tests -// against a fake transaction with a single input and output. -func TestScripts(t *testing.T) { +// TestOpcodeDisabled tests the opcodeDisabled function manually because all +// disabled opcodes result in a script execution failure when executed normally, +// so the function is not called under normal circumstances. +func TestOpcodeDisabled(t *testing.T) { t.Parallel() - tests := []struct { - script []byte - strictSigs bool - shouldPass bool - shouldFail error - }{ - // does nothing, but doesn't put a true on the stack, should fail - {script: []byte{txscript.OP_NOP}, shouldPass: false}, - // should just put true on the stack, thus passes. - {script: []byte{txscript.OP_TRUE}, shouldPass: true}, - // should just put false on the stack, thus fails. - {script: []byte{txscript.OP_FALSE}, shouldPass: false}, - // tests OP_VERIFY (true). true is needed since else stack is empty. - {script: []byte{txscript.OP_TRUE, txscript.OP_VERIFY, - txscript.OP_TRUE}, shouldPass: true}, - // tests OP_VERIFY (false), will error out. - {script: []byte{txscript.OP_FALSE, txscript.OP_VERIFY, - txscript.OP_TRUE}, shouldPass: false}, - // tests OP_VERIFY with empty stack (errors) - {script: []byte{txscript.OP_VERIFY}, shouldPass: false}, - // test OP_RETURN immediately fails the script (empty stack) - {script: []byte{txscript.OP_RETURN}, shouldPass: false}, - // test OP_RETURN immediately fails the script (full stack) - {script: []byte{txscript.OP_TRUE, txscript.OP_RETURN}, - shouldPass: false}, - // tests numequal with a trivial example (passing) - {script: []byte{txscript.OP_TRUE, txscript.OP_TRUE, - txscript.OP_NUMEQUAL}, shouldPass: true}, - // tests numequal with a trivial example (failing) - {script: []byte{txscript.OP_TRUE, txscript.OP_FALSE, - txscript.OP_NUMEQUAL}, shouldPass: false}, - // tests numequal with insufficient arguments (1/2) - {script: []byte{txscript.OP_TRUE, txscript.OP_NUMEQUAL}, - shouldPass: false}, - // tests numequal with insufficient arguments (0/2) - {script: []byte{txscript.OP_NUMEQUAL}, shouldPass: false}, - // tests numnotequal with a trivial example (passing) - {script: []byte{txscript.OP_TRUE, txscript.OP_FALSE, - txscript.OP_NUMNOTEQUAL}, shouldPass: true}, - // tests numnotequal with a trivial example (failing) - {script: []byte{txscript.OP_TRUE, txscript.OP_TRUE, - txscript.OP_NUMNOTEQUAL}, shouldPass: false}, - // tests numnotequal with insufficient arguments (1/2) - {script: []byte{txscript.OP_TRUE, txscript.OP_NUMNOTEQUAL}, - shouldPass: false}, - // tests numnotequal with insufficient arguments (0/2) - {script: []byte{txscript.OP_NUMNOTEQUAL}, shouldPass: false}, - // test numequal_verify with a trivial example (passing) - {script: []byte{txscript.OP_TRUE, txscript.OP_TRUE, - txscript.OP_NUMEQUALVERIFY, txscript.OP_TRUE}, - shouldPass: true}, - // test numequal_verify with a trivial example (failing) - {script: []byte{txscript.OP_TRUE, txscript.OP_FALSE, - txscript.OP_NUMEQUALVERIFY, txscript.OP_TRUE}, - shouldPass: false}, - // test OP_1ADD by adding 1 to 0 - {script: []byte{txscript.OP_FALSE, txscript.OP_1ADD}, - shouldPass: true}, - // test OP_1ADD without args (should error) - {script: []byte{txscript.OP_1ADD}, shouldPass: false}, - // test OP_1NEGATE by adding 1 to -1 - {script: []byte{txscript.OP_1NEGATE, txscript.OP_1ADD}, - shouldPass: false}, - // test OP_1NEGATE by adding negating -1 - {script: []byte{txscript.OP_1NEGATE, txscript.OP_NEGATE}, - shouldPass: true}, - // test OP_NEGATE by adding 1 to -1 - {script: []byte{txscript.OP_TRUE, txscript.OP_NEGATE, - txscript.OP_1ADD}, shouldPass: false}, - // test OP_NEGATE with no args - {script: []byte{txscript.OP_NEGATE}, shouldPass: false}, - // test OP_1SUB -> 1 - 1 = 0 - {script: []byte{txscript.OP_TRUE, txscript.OP_1SUB}, - shouldPass: false}, - // test OP_1SUB -> negate(0 -1) = 1 - {script: []byte{txscript.OP_FALSE, txscript.OP_1SUB, - txscript.OP_NEGATE}, shouldPass: true}, - // test OP_1SUB with empty stack - {script: []byte{txscript.OP_1SUB}, shouldPass: false}, - // OP_DEPTH with empty stack, means 0 on stack at end - {script: []byte{txscript.OP_DEPTH}, shouldPass: false}, - // 1 +1 -1 = 1. tests depth + add - {script: []byte{txscript.OP_TRUE, txscript.OP_DEPTH, txscript.OP_ADD, - txscript.OP_1SUB}, shouldPass: true}, - // 1 +1 -1 = 0 . tests dept + add - {script: []byte{txscript.OP_TRUE, txscript.OP_DEPTH, - txscript.OP_ADD, txscript.OP_1SUB, txscript.OP_1SUB}, - shouldPass: false}, - // OP_ADD with only one thing on stack should error - {script: []byte{txscript.OP_TRUE, txscript.OP_ADD}, - shouldPass: false}, - // OP_ADD with nothing on stack should error - {script: []byte{txscript.OP_ADD}, shouldPass: false}, - // OP_SUB: 1-1=0 - {script: []byte{txscript.OP_TRUE, txscript.OP_TRUE, - txscript.OP_SUB}, shouldPass: false}, - // OP_SUB: 1+1-1=1 - {script: []byte{txscript.OP_TRUE, txscript.OP_TRUE, txscript.OP_TRUE, - txscript.OP_ADD, txscript.OP_SUB}, shouldPass: true}, - // OP_SUB with only one thing on stack should error - {script: []byte{txscript.OP_TRUE, txscript.OP_SUB}, - shouldPass: false}, - // OP_SUB with nothing on stack should error - {script: []byte{txscript.OP_SUB}, shouldPass: false}, - // OP_LESSTHAN 1 < 1 == false - {script: []byte{txscript.OP_TRUE, txscript.OP_TRUE, - txscript.OP_LESSTHAN}, shouldPass: false}, - // OP_LESSTHAN 1 < 0 == false - {script: []byte{txscript.OP_TRUE, txscript.OP_FALSE, - txscript.OP_LESSTHAN}, shouldPass: false}, - // OP_LESSTHAN 0 < 1 == true - {script: []byte{txscript.OP_FALSE, txscript.OP_TRUE, - txscript.OP_LESSTHAN}, shouldPass: true}, - // OP_LESSTHAN only one arg - {script: []byte{txscript.OP_TRUE, txscript.OP_LESSTHAN}, - shouldPass: false}, - // OP_LESSTHAN no args - {script: []byte{txscript.OP_LESSTHAN}, shouldPass: false}, - - // OP_LESSTHANOREQUAL 1 <= 1 == true - {script: []byte{txscript.OP_TRUE, txscript.OP_TRUE, - txscript.OP_LESSTHANOREQUAL}, shouldPass: true}, - // OP_LESSTHANOREQUAL 1 <= 0 == false - {script: []byte{txscript.OP_TRUE, txscript.OP_FALSE, - txscript.OP_LESSTHANOREQUAL}, shouldPass: false}, - // OP_LESSTHANOREQUAL 0 <= 1 == true - {script: []byte{txscript.OP_FALSE, txscript.OP_TRUE, - txscript.OP_LESSTHANOREQUAL}, shouldPass: true}, - // OP_LESSTHANOREQUAL only one arg - {script: []byte{txscript.OP_TRUE, txscript.OP_LESSTHANOREQUAL}, - shouldPass: false}, - // OP_LESSTHANOREQUAL no args - {script: []byte{txscript.OP_LESSTHANOREQUAL}, shouldPass: false}, - - // OP_GREATERTHAN 1 > 1 == false - {script: []byte{txscript.OP_TRUE, txscript.OP_TRUE, - txscript.OP_GREATERTHAN}, shouldPass: false}, - // OP_GREATERTHAN 1 > 0 == true - {script: []byte{txscript.OP_TRUE, txscript.OP_FALSE, - txscript.OP_GREATERTHAN}, shouldPass: true}, - // OP_GREATERTHAN 0 > 1 == false - {script: []byte{txscript.OP_FALSE, txscript.OP_TRUE, - txscript.OP_GREATERTHAN}, shouldPass: false}, - // OP_GREATERTHAN only one arg - {script: []byte{txscript.OP_TRUE, txscript.OP_GREATERTHAN}, - shouldPass: false}, - // OP_GREATERTHAN no args - {script: []byte{txscript.OP_GREATERTHAN}, shouldPass: false}, - - // OP_GREATERTHANOREQUAL 1 >= 1 == true - {script: []byte{txscript.OP_TRUE, txscript.OP_TRUE, - txscript.OP_GREATERTHANOREQUAL}, shouldPass: true}, - // OP_GREATERTHANOREQUAL 1 >= 0 == false - {script: []byte{txscript.OP_TRUE, txscript.OP_FALSE, - txscript.OP_GREATERTHANOREQUAL}, shouldPass: true}, - // OP_GREATERTHANOREQUAL 0 >= 1 == true - {script: []byte{txscript.OP_FALSE, txscript.OP_TRUE, - txscript.OP_GREATERTHANOREQUAL}, shouldPass: false}, - // OP_GREATERTHANOREQUAL only one arg - {script: []byte{txscript.OP_TRUE, txscript.OP_GREATERTHANOREQUAL}, - shouldPass: false}, - // OP_GREATERTHANOREQUAL no args - {script: []byte{txscript.OP_GREATERTHANOREQUAL}, shouldPass: false}, - - // OP_MIN basic functionality -> min(0,1) = 0 = min(1,0) - {script: []byte{txscript.OP_TRUE, txscript.OP_FALSE, - txscript.OP_MIN}, shouldPass: false}, - {script: []byte{txscript.OP_FALSE, txscript.OP_TRUE, - txscript.OP_MIN}, shouldPass: false}, - // OP_MIN -> 1 arg errors - {script: []byte{txscript.OP_TRUE, txscript.OP_MIN}, - shouldPass: false}, - // OP_MIN -> 0 arg errors - {script: []byte{txscript.OP_MIN}, shouldPass: false}, - // OP_MAX basic functionality -> max(0,1) = 1 = max(1,0) - {script: []byte{txscript.OP_TRUE, txscript.OP_FALSE, - txscript.OP_MAX}, shouldPass: true}, - {script: []byte{txscript.OP_FALSE, txscript.OP_TRUE, - txscript.OP_MAX}, shouldPass: true}, - // OP_MAX -> 1 arg errors - {script: []byte{txscript.OP_TRUE, txscript.OP_MAX}, - shouldPass: false}, - // OP_MAX -> 0 arg errors - {script: []byte{txscript.OP_MAX}, shouldPass: false}, - - // By this point we know a number of operations appear to be working - // correctly. we can use them to test the other number pushing - // operations - {script: []byte{txscript.OP_TRUE, txscript.OP_1ADD, txscript.OP_2, - txscript.OP_EQUAL}, shouldPass: true}, - {script: []byte{txscript.OP_2, txscript.OP_1ADD, txscript.OP_3, - txscript.OP_EQUAL}, shouldPass: true}, - {script: []byte{txscript.OP_3, txscript.OP_1ADD, txscript.OP_4, - txscript.OP_EQUAL}, shouldPass: true}, - {script: []byte{txscript.OP_4, txscript.OP_1ADD, txscript.OP_5, - txscript.OP_EQUAL}, shouldPass: true}, - {script: []byte{txscript.OP_5, txscript.OP_1ADD, txscript.OP_6, - txscript.OP_EQUAL}, shouldPass: true}, - {script: []byte{txscript.OP_6, txscript.OP_1ADD, txscript.OP_7, - txscript.OP_EQUAL}, shouldPass: true}, - {script: []byte{txscript.OP_7, txscript.OP_1ADD, txscript.OP_8, - txscript.OP_EQUAL}, shouldPass: true}, - {script: []byte{txscript.OP_8, txscript.OP_1ADD, txscript.OP_9, - txscript.OP_EQUAL}, shouldPass: true}, - {script: []byte{txscript.OP_9, txscript.OP_1ADD, txscript.OP_10, - txscript.OP_EQUAL}, shouldPass: true}, - {script: []byte{txscript.OP_10, txscript.OP_1ADD, txscript.OP_11, - txscript.OP_EQUAL}, shouldPass: true}, - {script: []byte{txscript.OP_11, txscript.OP_1ADD, txscript.OP_12, - txscript.OP_EQUAL}, shouldPass: true}, - {script: []byte{txscript.OP_12, txscript.OP_1ADD, txscript.OP_13, - txscript.OP_EQUAL}, shouldPass: true}, - {script: []byte{txscript.OP_13, txscript.OP_1ADD, txscript.OP_14, - txscript.OP_EQUAL}, shouldPass: true}, - {script: []byte{txscript.OP_14, txscript.OP_1ADD, txscript.OP_15, - txscript.OP_EQUAL}, shouldPass: true}, - {script: []byte{txscript.OP_15, txscript.OP_1ADD, txscript.OP_16, - txscript.OP_EQUAL}, shouldPass: true}, - - // Test OP_WITHIN x, min, max - // 0 <= 1 < 2 - {script: []byte{txscript.OP_TRUE, txscript.OP_FALSE, txscript.OP_2, - txscript.OP_WITHIN}, shouldPass: true}, - // 1 <= 0 < 2 FAIL - {script: []byte{txscript.OP_FALSE, txscript.OP_TRUE, txscript.OP_2, - txscript.OP_WITHIN}, shouldPass: false}, - // 1 <= 1 < 2 - {script: []byte{txscript.OP_TRUE, txscript.OP_TRUE, txscript.OP_2, - txscript.OP_WITHIN}, shouldPass: true}, - // 1 <= 2 < 2 FAIL - {script: []byte{txscript.OP_2, txscript.OP_TRUE, txscript.OP_2, - txscript.OP_WITHIN}, shouldPass: false}, - // only two arguments - {script: []byte{txscript.OP_TRUE, txscript.OP_FALSE, - txscript.OP_WITHIN}, shouldPass: false}, - // only one argument - {script: []byte{txscript.OP_TRUE, txscript.OP_WITHIN}, - shouldPass: false}, - // no arguments - {script: []byte{txscript.OP_WITHIN}, shouldPass: false}, - - // OP_BOOLAND - // 1 && 1 == 1 - {script: []byte{txscript.OP_TRUE, txscript.OP_TRUE, - txscript.OP_BOOLAND}, shouldPass: true}, - // 1 && 0 == 0 - {script: []byte{txscript.OP_TRUE, txscript.OP_FALSE, - txscript.OP_BOOLAND}, shouldPass: false}, - // 0 && 1 == 0 - {script: []byte{txscript.OP_FALSE, txscript.OP_TRUE, - txscript.OP_BOOLAND}, shouldPass: false}, - // 0 && 0 == 0 - {script: []byte{txscript.OP_FALSE, txscript.OP_FALSE, - txscript.OP_BOOLAND}, shouldPass: false}, - // 0 && - boom - {script: []byte{txscript.OP_TRUE, txscript.OP_BOOLAND}, - shouldPass: false}, - // && - boom - {script: []byte{txscript.OP_BOOLAND}, shouldPass: false}, - - // OP_BOOLOR - // 1 || 1 == 1 - {script: []byte{txscript.OP_TRUE, txscript.OP_TRUE, - txscript.OP_BOOLOR}, shouldPass: true}, - // 1 || 0 == 1 - {script: []byte{txscript.OP_TRUE, txscript.OP_FALSE, - txscript.OP_BOOLOR}, shouldPass: true}, - // 0 || 1 == 1 - {script: []byte{txscript.OP_FALSE, txscript.OP_TRUE, - txscript.OP_BOOLOR}, shouldPass: true}, - // 0 || 0 == 0 - {script: []byte{txscript.OP_FALSE, txscript.OP_FALSE, - txscript.OP_BOOLOR}, shouldPass: false}, - // 0 && - boom - {script: []byte{txscript.OP_TRUE, txscript.OP_BOOLOR}, - shouldPass: false}, - // && - boom - {script: []byte{txscript.OP_BOOLOR}, shouldPass: false}, - - // OP_0NOTEQUAL - // 1 with input != 0 XXX check output is actually 1. - {script: []byte{txscript.OP_TRUE, txscript.OP_0NOTEQUAL}, - shouldPass: true}, - {script: []byte{txscript.OP_2, txscript.OP_0NOTEQUAL}, - shouldPass: true}, - {script: []byte{txscript.OP_3, txscript.OP_0NOTEQUAL}, - shouldPass: true}, - {script: []byte{txscript.OP_4, txscript.OP_0NOTEQUAL}, - shouldPass: true}, - {script: []byte{txscript.OP_5, txscript.OP_0NOTEQUAL}, - shouldPass: true}, - {script: []byte{txscript.OP_6, txscript.OP_0NOTEQUAL}, - shouldPass: true}, - {script: []byte{txscript.OP_7, txscript.OP_0NOTEQUAL}, - shouldPass: true}, - {script: []byte{txscript.OP_8, txscript.OP_0NOTEQUAL}, - shouldPass: true}, - {script: []byte{txscript.OP_9, txscript.OP_0NOTEQUAL}, - shouldPass: true}, - {script: []byte{txscript.OP_10, txscript.OP_0NOTEQUAL}, - shouldPass: true}, - {script: []byte{txscript.OP_11, txscript.OP_0NOTEQUAL}, - shouldPass: true}, - {script: []byte{txscript.OP_12, txscript.OP_0NOTEQUAL}, - shouldPass: true}, - {script: []byte{txscript.OP_13, txscript.OP_0NOTEQUAL}, - shouldPass: true}, - {script: []byte{txscript.OP_14, txscript.OP_0NOTEQUAL}, - shouldPass: true}, - {script: []byte{txscript.OP_15, txscript.OP_0NOTEQUAL}, - shouldPass: true}, - {script: []byte{txscript.OP_16, txscript.OP_0NOTEQUAL}, - shouldPass: true}, - {script: []byte{txscript.OP_FALSE, txscript.OP_0NOTEQUAL}, shouldPass: false}, - // No arguments also blows up - {script: []byte{txscript.OP_0NOTEQUAL}, shouldPass: false}, - - // OP_NOT: 1 i input is 0, else 0 - {script: []byte{txscript.OP_TRUE, txscript.OP_NOT}, shouldPass: false}, - {script: []byte{txscript.OP_2, txscript.OP_NOT}, shouldPass: false}, - {script: []byte{txscript.OP_3, txscript.OP_NOT}, shouldPass: false}, - {script: []byte{txscript.OP_4, txscript.OP_NOT}, shouldPass: false}, - {script: []byte{txscript.OP_5, txscript.OP_NOT}, shouldPass: false}, - {script: []byte{txscript.OP_6, txscript.OP_NOT}, shouldPass: false}, - {script: []byte{txscript.OP_7, txscript.OP_NOT}, shouldPass: false}, - {script: []byte{txscript.OP_8, txscript.OP_NOT}, shouldPass: false}, - {script: []byte{txscript.OP_9, txscript.OP_NOT}, shouldPass: false}, - {script: []byte{txscript.OP_10, txscript.OP_NOT}, shouldPass: false}, - {script: []byte{txscript.OP_11, txscript.OP_NOT}, shouldPass: false}, - {script: []byte{txscript.OP_12, txscript.OP_NOT}, shouldPass: false}, - {script: []byte{txscript.OP_13, txscript.OP_NOT}, shouldPass: false}, - {script: []byte{txscript.OP_14, txscript.OP_NOT}, shouldPass: false}, - {script: []byte{txscript.OP_15, txscript.OP_NOT}, shouldPass: false}, - {script: []byte{txscript.OP_16, txscript.OP_NOT}, shouldPass: false}, - // check negative numbers too - {script: []byte{txscript.OP_TRUE, txscript.OP_NEGATE, - txscript.OP_NOT}, shouldPass: false}, - {script: []byte{txscript.OP_FALSE, txscript.OP_NOT}, - shouldPass: true}, - // No arguments also blows up - {script: []byte{txscript.OP_NOT}, shouldPass: false}, - - // Conditional Execution - {script: []byte{txscript.OP_0, txscript.OP_IF, txscript.OP_0, txscript.OP_ELSE, txscript.OP_2, txscript.OP_ENDIF}, shouldPass: true}, - {script: []byte{txscript.OP_1, txscript.OP_IF, txscript.OP_0, txscript.OP_ELSE, txscript.OP_2, txscript.OP_ENDIF}, shouldPass: false}, - {script: []byte{txscript.OP_1, txscript.OP_NOTIF, txscript.OP_0, txscript.OP_ELSE, txscript.OP_2, txscript.OP_ENDIF}, shouldPass: true}, - {script: []byte{txscript.OP_0, txscript.OP_NOTIF, txscript.OP_0, txscript.OP_ELSE, txscript.OP_2, txscript.OP_ENDIF}, shouldPass: false}, - {script: []byte{txscript.OP_0, txscript.OP_IF, txscript.OP_0, txscript.OP_ELSE, txscript.OP_2}, shouldFail: txscript.ErrStackMissingEndif}, - {script: []byte{txscript.OP_1, txscript.OP_NOTIF, txscript.OP_0, txscript.OP_ELSE, txscript.OP_2}, shouldFail: txscript.ErrStackMissingEndif}, - {script: []byte{txscript.OP_1, txscript.OP_1, txscript.OP_IF, txscript.OP_IF, txscript.OP_1, txscript.OP_ELSE, txscript.OP_0, txscript.OP_ENDIF, txscript.OP_ENDIF}, shouldPass: true}, - {script: []byte{txscript.OP_1, txscript.OP_IF, txscript.OP_IF, txscript.OP_1, txscript.OP_ELSE, txscript.OP_0, txscript.OP_ENDIF, txscript.OP_ENDIF}, shouldFail: txscript.ErrStackUnderflow}, - {script: []byte{txscript.OP_0, txscript.OP_IF, txscript.OP_IF, txscript.OP_0, txscript.OP_ELSE, txscript.OP_0, txscript.OP_ENDIF, txscript.OP_ELSE, txscript.OP_1, txscript.OP_ENDIF}, shouldPass: true}, - {script: []byte{txscript.OP_0, txscript.OP_IF, txscript.OP_NOTIF, txscript.OP_0, txscript.OP_ELSE, txscript.OP_0, txscript.OP_ENDIF, txscript.OP_ELSE, txscript.OP_1, txscript.OP_ENDIF}, shouldPass: true}, - {script: []byte{txscript.OP_NOTIF, txscript.OP_0, txscript.OP_ENDIF}, shouldFail: txscript.ErrStackUnderflow}, - {script: []byte{txscript.OP_ELSE, txscript.OP_0, txscript.OP_ENDIF}, shouldFail: txscript.ErrStackNoIf}, - {script: []byte{txscript.OP_ENDIF}, shouldFail: txscript.ErrStackNoIf}, - /* up here because error from sig parsing is undefined. */ - {script: []byte{txscript.OP_1, txscript.OP_1, txscript.OP_DATA_65, - 0x04, 0xae, 0x1a, 0x62, 0xfe, 0x09, 0xc5, 0xf5, 0x1b, 0x13, - 0x90, 0x5f, 0x07, 0xf0, 0x6b, 0x99, 0xa2, 0xf7, 0x15, 0x9b, - 0x22, 0x25, 0xf3, 0x74, 0xcd, 0x37, 0x8d, 0x71, 0x30, 0x2f, - 0xa2, 0x84, 0x14, 0xe7, 0xaa, 0xb3, 0x73, 0x97, 0xf5, 0x54, - 0xa7, 0xdf, 0x5f, 0x14, 0x2c, 0x21, 0xc1, 0xb7, 0x30, 0x3b, - 0x8a, 0x06, 0x26, 0xf1, 0xba, 0xde, 0xd5, 0xc7, 0x2a, 0x70, - 0x4f, 0x7e, 0x6c, 0xd8, 0x4c, - txscript.OP_1, txscript.OP_CHECKMULTISIG}, - shouldPass: false}, - {script: []byte{txscript.OP_1, txscript.OP_1, txscript.OP_DATA_65, - 0x04, 0xae, 0x1a, 0x62, 0xfe, 0x09, 0xc5, 0xf5, 0x1b, 0x13, - 0x90, 0x5f, 0x07, 0xf0, 0x6b, 0x99, 0xa2, 0xf7, 0x15, 0x9b, - 0x22, 0x25, 0xf3, 0x74, 0xcd, 0x37, 0x8d, 0x71, 0x30, 0x2f, - 0xa2, 0x84, 0x14, 0xe7, 0xaa, 0xb3, 0x73, 0x97, 0xf5, 0x54, - 0xa7, 0xdf, 0x5f, 0x14, 0x2c, 0x21, 0xc1, 0xb7, 0x30, 0x3b, - 0x8a, 0x06, 0x26, 0xf1, 0xba, 0xde, 0xd5, 0xc7, 0x2a, 0x70, - 0x4f, 0x7e, 0x6c, 0xd8, 0x4c, - txscript.OP_1, txscript.OP_CHECKMULTISIG}, - strictSigs: true, - shouldPass: false}, - /* up here because no defined error case. */ - {script: []byte{txscript.OP_1, txscript.OP_1, txscript.OP_DATA_65, - 0x04, 0xae, 0x1a, 0x62, 0xfe, 0x09, 0xc5, 0xf5, 0x1b, 0x13, - 0x90, 0x5f, 0x07, 0xf0, 0x6b, 0x99, 0xa2, 0xf7, 0x15, 0x9b, - 0x22, 0x25, 0xf3, 0x74, 0xcd, 0x37, 0x8d, 0x71, 0x30, 0x2f, - 0xa2, 0x84, 0x14, 0xe7, 0xaa, 0xb3, 0x73, 0x97, 0xf5, 0x54, - 0xa7, 0xdf, 0x5f, 0x14, 0x2c, 0x21, 0xc1, 0xb7, 0x30, 0x3b, - 0x8a, 0x06, 0x26, 0xf1, 0xba, 0xde, 0xd5, 0xc7, 0x2a, 0x70, - 0x4f, 0x7e, 0x6c, 0xd8, 0x4c, - txscript.OP_1, txscript.OP_CHECKMULTISIGVERIFY}, - shouldPass: false}, - - // Invalid Opcodes - {script: []byte{186}, shouldPass: false}, - {script: []byte{187}, shouldPass: false}, - {script: []byte{188}, shouldPass: false}, - {script: []byte{189}, shouldPass: false}, - {script: []byte{190}, shouldPass: false}, - {script: []byte{191}, shouldPass: false}, - {script: []byte{192}, shouldPass: false}, - {script: []byte{193}, shouldPass: false}, - {script: []byte{194}, shouldPass: false}, - {script: []byte{195}, shouldPass: false}, - {script: []byte{195}, shouldPass: false}, - {script: []byte{196}, shouldPass: false}, - {script: []byte{197}, shouldPass: false}, - {script: []byte{198}, shouldPass: false}, - {script: []byte{199}, shouldPass: false}, - {script: []byte{200}, shouldPass: false}, - {script: []byte{201}, shouldPass: false}, - {script: []byte{202}, shouldPass: false}, - {script: []byte{203}, shouldPass: false}, - {script: []byte{204}, shouldPass: false}, - {script: []byte{205}, shouldPass: false}, - {script: []byte{206}, shouldPass: false}, - {script: []byte{207}, shouldPass: false}, - {script: []byte{208}, shouldPass: false}, - {script: []byte{209}, shouldPass: false}, - {script: []byte{210}, shouldPass: false}, - {script: []byte{211}, shouldPass: false}, - {script: []byte{212}, shouldPass: false}, - {script: []byte{213}, shouldPass: false}, - {script: []byte{214}, shouldPass: false}, - {script: []byte{215}, shouldPass: false}, - {script: []byte{216}, shouldPass: false}, - {script: []byte{217}, shouldPass: false}, - {script: []byte{218}, shouldPass: false}, - {script: []byte{219}, shouldPass: false}, - {script: []byte{220}, shouldPass: false}, - {script: []byte{221}, shouldPass: false}, - {script: []byte{222}, shouldPass: false}, - {script: []byte{223}, shouldPass: false}, - {script: []byte{224}, shouldPass: false}, - {script: []byte{225}, shouldPass: false}, - {script: []byte{226}, shouldPass: false}, - {script: []byte{227}, shouldPass: false}, - {script: []byte{228}, shouldPass: false}, - {script: []byte{229}, shouldPass: false}, - {script: []byte{230}, shouldPass: false}, - {script: []byte{231}, shouldPass: false}, - {script: []byte{232}, shouldPass: false}, - {script: []byte{233}, shouldPass: false}, - {script: []byte{234}, shouldPass: false}, - {script: []byte{235}, shouldPass: false}, - {script: []byte{236}, shouldPass: false}, - {script: []byte{237}, shouldPass: false}, - {script: []byte{238}, shouldPass: false}, - {script: []byte{239}, shouldPass: false}, - {script: []byte{240}, shouldPass: false}, - {script: []byte{241}, shouldPass: false}, - {script: []byte{242}, shouldPass: false}, - {script: []byte{243}, shouldPass: false}, - {script: []byte{244}, shouldPass: false}, - {script: []byte{245}, shouldPass: false}, - {script: []byte{246}, shouldPass: false}, - {script: []byte{247}, shouldPass: false}, - {script: []byte{248}, shouldPass: false}, - {script: []byte{249}, shouldPass: false}, - {script: []byte{250}, shouldPass: false}, - {script: []byte{251}, shouldPass: false}, - {script: []byte{252}, shouldPass: false}, + tests := []byte{OP_CAT, OP_SUBSTR, OP_LEFT, OP_RIGHT, OP_INVERT, + OP_AND, OP_OR, OP_2MUL, OP_2DIV, OP_MUL, OP_DIV, OP_MOD, + OP_LSHIFT, OP_RSHIFT, } - - // Mock up fake tx used during script execution. - mockTx := &wire.MsgTx{ - Version: 1, - TxIn: []*wire.TxIn{ - { - PreviousOutPoint: wire.OutPoint{ - Hash: wire.ShaHash{}, - Index: 0xffffffff, - }, - SignatureScript: []byte{txscript.OP_NOP}, - Sequence: 0xffffffff, - }, - }, - TxOut: []*wire.TxOut{ - { - Value: 0x12a05f200, - PkScript: []byte{}, - }, - }, - LockTime: 0, + for _, opcodeVal := range tests { + pop := parsedOpcode{opcode: &opcodeArray[opcodeVal], data: nil} + if err := opcodeDisabled(&pop, nil); err != ErrStackOpDisabled { + t.Errorf("opcodeDisabled: unexpected error - got %v, "+ + "want %v", err, ErrStackOpDisabled) + return + } } +} - for i, test := range tests { - // Parse and execute the test script. - var flags txscript.ScriptFlags - if test.strictSigs { - flags = txscript.ScriptVerifyDERSignatures - } - mockTx.TxOut[0].PkScript = test.script - vm, err := txscript.NewEngine(test.script, mockTx, 0, flags) - if err == nil { - err = vm.Execute() +// TestOpcodeDisasm tests the print function for all opcodes in both the oneline +// and full modes to ensure it provides the expected disassembly. +func TestOpcodeDisasm(t *testing.T) { + t.Parallel() + + // First, test the oneline disassembly. + + // The expected strings for the data push opcodes are replaced in the + // test loops below since they involve repeating bytes. Also, the + // OP_NOP# and OP_UNKNOWN# are replaced below too, since it's easier + // than manually listing them here. + oneBytes := []byte{0x01} + oneStr := "01" + expectedStrings := [256]string{0x00: "0", 0x4f: "-1", + 0x50: "OP_RESERVED", 0x61: "OP_NOP", 0x62: "OP_VER", + 0x63: "OP_IF", 0x64: "OP_NOTIF", 0x65: "OP_VERIF", + 0x66: "OP_VERNOTIF", 0x67: "OP_ELSE", 0x68: "OP_ENDIF", + 0x69: "OP_VERIFY", 0x6a: "OP_RETURN", 0x6b: "OP_TOALTSTACK", + 0x6c: "OP_FROMALTSTACK", 0x6d: "OP_2DROP", 0x6e: "OP_2DUP", + 0x6f: "OP_3DUP", 0x70: "OP_2OVER", 0x71: "OP_2ROT", + 0x72: "OP_2SWAP", 0x73: "OP_IFDUP", 0x74: "OP_DEPTH", + 0x75: "OP_DROP", 0x76: "OP_DUP", 0x77: "OP_NIP", + 0x78: "OP_OVER", 0x79: "OP_PICK", 0x7a: "OP_ROLL", + 0x7b: "OP_ROT", 0x7c: "OP_SWAP", 0x7d: "OP_TUCK", + 0x7e: "OP_CAT", 0x7f: "OP_SUBSTR", 0x80: "OP_LEFT", + 0x81: "OP_RIGHT", 0x82: "OP_SIZE", 0x83: "OP_INVERT", + 0x84: "OP_AND", 0x85: "OP_OR", 0x86: "OP_XOR", + 0x87: "OP_EQUAL", 0x88: "OP_EQUALVERIFY", 0x89: "OP_RESERVED1", + 0x8a: "OP_RESERVED2", 0x8b: "OP_1ADD", 0x8c: "OP_1SUB", + 0x8d: "OP_2MUL", 0x8e: "OP_2DIV", 0x8f: "OP_NEGATE", + 0x90: "OP_ABS", 0x91: "OP_NOT", 0x92: "OP_0NOTEQUAL", + 0x93: "OP_ADD", 0x94: "OP_SUB", 0x95: "OP_MUL", 0x96: "OP_DIV", + 0x97: "OP_MOD", 0x98: "OP_LSHIFT", 0x99: "OP_RSHIFT", + 0x9a: "OP_BOOLAND", 0x9b: "OP_BOOLOR", 0x9c: "OP_NUMEQUAL", + 0x9d: "OP_NUMEQUALVERIFY", 0x9e: "OP_NUMNOTEQUAL", + 0x9f: "OP_LESSTHAN", 0xa0: "OP_GREATERTHAN", + 0xa1: "OP_LESSTHANOREQUAL", 0xa2: "OP_GREATERTHANOREQUAL", + 0xa3: "OP_MIN", 0xa4: "OP_MAX", 0xa5: "OP_WITHIN", + 0xa6: "OP_RIPEMD160", 0xa7: "OP_SHA1", 0xa8: "OP_SHA256", + 0xa9: "OP_HASH160", 0xaa: "OP_HASH256", 0xab: "OP_CODESEPARATOR", + 0xac: "OP_CHECKSIG", 0xad: "OP_CHECKSIGVERIFY", + 0xae: "OP_CHECKMULTISIG", 0xaf: "OP_CHECKMULTISIGVERIFY", + 0xf9: "OP_SMALLDATA", 0xfa: "OP_SMALLINTEGER", + 0xfb: "OP_PUBKEYS", 0xfd: "OP_PUBKEYHASH", 0xfe: "OP_PUBKEY", + 0xff: "OP_INVALIDOPCODE", + } + for opcodeVal, expectedStr := range expectedStrings { + var data []byte + switch { + // OP_DATA_1 through OP_DATA_65 display the pushed data. + case opcodeVal >= 0x01 && opcodeVal < 0x4c: + data = bytes.Repeat(oneBytes, opcodeVal) + expectedStr = strings.Repeat(oneStr, opcodeVal) + + // OP_PUSHDATA1. + case opcodeVal == 0x4c: + data = bytes.Repeat(oneBytes, 1) + expectedStr = strings.Repeat(oneStr, 1) + + // OP_PUSHDATA2. + case opcodeVal == 0x4d: + data = bytes.Repeat(oneBytes, 2) + expectedStr = strings.Repeat(oneStr, 2) + + // OP_PUSHDATA4. + case opcodeVal == 0x4e: + data = bytes.Repeat(oneBytes, 3) + expectedStr = strings.Repeat(oneStr, 3) + + // OP_1 through OP_16 display the numbers themselves. + case opcodeVal >= 0x51 && opcodeVal <= 0x60: + val := byte(opcodeVal - (0x51 - 1)) + data = []byte{val} + expectedStr = strconv.Itoa(int(val)) + + // OP_NOP1 through OP_NOP10. + case opcodeVal >= 0xb0 && opcodeVal <= 0xb9: + val := byte(opcodeVal - (0xb0 - 1)) + expectedStr = "OP_NOP" + strconv.Itoa(int(val)) + + // OP_UNKNOWN#. + case opcodeVal >= 0xba && opcodeVal <= 0xf8 || opcodeVal == 0xfc: + expectedStr = "OP_UNKNOWN" + strconv.Itoa(int(opcodeVal)) } - if test.shouldFail != nil { - if err == nil { - t.Errorf("test %d passed should fail with %v", - i, test.shouldFail) - continue - } else if test.shouldFail != err { - t.Errorf("test %d failed with wrong error "+ - "[%v], expected [%v]", i, err, - test.shouldFail) - continue - } - } - if test.shouldPass && err != nil { - t.Errorf("test %d failed: %v", i, err) + pop := parsedOpcode{opcode: &opcodeArray[opcodeVal], data: data} + gotStr := pop.print(true) + if gotStr != expectedStr { + t.Errorf("pop.print (opcode %x): Unexpected disasm "+ + "string - got %v, want %v", opcodeVal, gotStr, + expectedStr) continue - } else if !test.shouldPass && err == nil { - t.Errorf("test %d passed, should fail", i) + } + } + + // Now, replace the relevant fields and test the full disassembly. + expectedStrings[0x00] = "OP_0" + expectedStrings[0x4f] = "OP_1NEGATE" + for opcodeVal, expectedStr := range expectedStrings { + var data []byte + switch { + // OP_DATA_1 through OP_DATA_65 display the opcode followed by + // the pushed data. + case opcodeVal >= 0x01 && opcodeVal < 0x4c: + data = bytes.Repeat(oneBytes, opcodeVal) + expectedStr = fmt.Sprintf("OP_DATA_%d 0x%s", opcodeVal, + strings.Repeat(oneStr, opcodeVal)) + + // OP_PUSHDATA1. + case opcodeVal == 0x4c: + data = bytes.Repeat(oneBytes, 1) + expectedStr = fmt.Sprintf("OP_PUSHDATA1 0x%02x 0x%s", + len(data), strings.Repeat(oneStr, 1)) + + // OP_PUSHDATA2. + case opcodeVal == 0x4d: + data = bytes.Repeat(oneBytes, 2) + expectedStr = fmt.Sprintf("OP_PUSHDATA2 0x%04x 0x%s", + len(data), strings.Repeat(oneStr, 2)) + + // OP_PUSHDATA4. + case opcodeVal == 0x4e: + data = bytes.Repeat(oneBytes, 3) + expectedStr = fmt.Sprintf("OP_PUSHDATA4 0x%08x 0x%s", + len(data), strings.Repeat(oneStr, 3)) + + // OP_1 through OP_16. + case opcodeVal >= 0x51 && opcodeVal <= 0x60: + val := byte(opcodeVal - (0x51 - 1)) + data = []byte{val} + expectedStr = "OP_" + strconv.Itoa(int(val)) + + // OP_NOP1 through OP_NOP10. + case opcodeVal >= 0xb0 && opcodeVal <= 0xb9: + val := byte(opcodeVal - (0xb0 - 1)) + expectedStr = "OP_NOP" + strconv.Itoa(int(val)) + + // OP_UNKNOWN#. + case opcodeVal >= 0xba && opcodeVal <= 0xf8 || opcodeVal == 0xfc: + expectedStr = "OP_UNKNOWN" + strconv.Itoa(int(opcodeVal)) + } + + pop := parsedOpcode{opcode: &opcodeArray[opcodeVal], data: data} + gotStr := pop.print(false) + if gotStr != expectedStr { + t.Errorf("pop.print (opcode %x): Unexpected disasm "+ + "string - got %v, want %v", opcodeVal, gotStr, + expectedStr) continue } } } - -// Detailed tests for opcodes, we inspect machine state before and after the -// opcode and check that it has the effect on the state that we expect. -type detailedTest struct { - name string - before [][]byte - altbefore [][]byte - script []byte - expectedReturn error - after [][]byte - altafter [][]byte - disassembly string - disassemblyerr error - nSigOps int // should have same return as disassembly error - nPreciseSigOps int // should have same return as disassembly error -} - -var detailedTests = []detailedTest{ - { - name: "noop", - before: [][]byte{{1}, {2}, {3}, {4}, {5}}, - script: []byte{txscript.OP_NOP}, - after: [][]byte{{1}, {2}, {3}, {4}, {5}}, - disassembly: "OP_NOP", - }, - { - name: "dup", - before: [][]byte{{1}}, - script: []byte{txscript.OP_DUP}, - after: [][]byte{{1}, {1}}, - disassembly: "OP_DUP", - }, - { - name: "dup2", - before: [][]byte{{1}, {2}}, - script: []byte{txscript.OP_2DUP}, - after: [][]byte{{1}, {2}, {1}, {2}}, - disassembly: "OP_2DUP", - }, - { - name: "dup3", - before: [][]byte{{1}, {2}, {3}}, - script: []byte{txscript.OP_3DUP}, - after: [][]byte{{1}, {2}, {3}, {1}, {2}, {3}}, - disassembly: "OP_3DUP", - }, - { - name: "dup too much", - before: [][]byte{}, - script: []byte{txscript.OP_DUP}, - expectedReturn: txscript.ErrStackUnderflow, - after: [][]byte{}, - disassembly: "OP_DUP", - }, - { - name: "2dup too much", - before: [][]byte{{1}}, - script: []byte{txscript.OP_2DUP}, - expectedReturn: txscript.ErrStackUnderflow, - after: [][]byte{}, - disassembly: "OP_2DUP", - }, - { - name: "2dup way too much", - before: [][]byte{}, - script: []byte{txscript.OP_2DUP}, - expectedReturn: txscript.ErrStackUnderflow, - after: [][]byte{}, - disassembly: "OP_2DUP", - }, - { - name: "3dup too much", - before: [][]byte{{1}, {2}}, - script: []byte{txscript.OP_3DUP}, - expectedReturn: txscript.ErrStackUnderflow, - after: [][]byte{}, - disassembly: "OP_3DUP", - }, - { - name: "3dup kinda too much", - before: [][]byte{{1}}, - script: []byte{txscript.OP_3DUP}, - expectedReturn: txscript.ErrStackUnderflow, - after: [][]byte{}, - disassembly: "OP_3DUP", - }, - { - name: "3dup way too much", - before: [][]byte{}, - script: []byte{txscript.OP_3DUP}, - expectedReturn: txscript.ErrStackUnderflow, - after: [][]byte{}, - disassembly: "OP_3DUP", - }, - { - name: "Nip", - before: [][]byte{{1}, {2}, {3}}, - script: []byte{txscript.OP_NIP}, - after: [][]byte{{1}, {3}}, - disassembly: "OP_NIP", - }, - { - name: "Nip too much", - before: [][]byte{{1}}, - script: []byte{txscript.OP_NIP}, - expectedReturn: txscript.ErrStackUnderflow, - after: [][]byte{{2}, {3}}, - disassembly: "OP_NIP", - }, - { - name: "keep on tucking", - before: [][]byte{{1}, {2}, {3}}, - script: []byte{txscript.OP_TUCK}, - after: [][]byte{{1}, {3}, {2}, {3}}, - disassembly: "OP_TUCK", - }, - { - name: "a little tucked up", - before: [][]byte{{1}}, // too few arguments for tuck - script: []byte{txscript.OP_TUCK}, - expectedReturn: txscript.ErrStackUnderflow, - after: [][]byte{}, - disassembly: "OP_TUCK", - }, - { - name: "all tucked up", - before: [][]byte{}, // too few arguments for tuck - script: []byte{txscript.OP_TUCK}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_TUCK", - }, - { - name: "drop 1", - before: [][]byte{{1}, {2}, {3}, {4}}, - script: []byte{txscript.OP_DROP}, - after: [][]byte{{1}, {2}, {3}}, - disassembly: "OP_DROP", - }, - { - name: "drop 2", - before: [][]byte{{1}, {2}, {3}, {4}}, - script: []byte{txscript.OP_2DROP}, - after: [][]byte{{1}, {2}}, - disassembly: "OP_2DROP", - }, - { - name: "drop too much", - before: [][]byte{}, - script: []byte{txscript.OP_DROP}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_DROP", - }, - { - name: "2drop too much", - before: [][]byte{{1}}, - script: []byte{txscript.OP_2DROP}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_2DROP", - }, - { - name: "2drop far too much", - before: [][]byte{}, - script: []byte{txscript.OP_2DROP}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_2DROP", - }, - { - name: "Rot1", - before: [][]byte{{1}, {2}, {3}, {4}}, - script: []byte{txscript.OP_ROT}, - after: [][]byte{{1}, {3}, {4}, {2}}, - disassembly: "OP_ROT", - }, - { - name: "Rot2", - before: [][]byte{{1}, {2}, {3}, {4}, {5}, {6}}, - script: []byte{txscript.OP_2ROT}, - after: [][]byte{{3}, {4}, {5}, {6}, {1}, {2}}, - disassembly: "OP_2ROT", - }, - { - name: "Rot too little", - before: [][]byte{{1}, {2}}, - script: []byte{txscript.OP_ROT}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_ROT", - }, - { - name: "Swap1", - before: [][]byte{{1}, {2}, {3}, {4}}, - script: []byte{txscript.OP_SWAP}, - after: [][]byte{{1}, {2}, {4}, {3}}, - disassembly: "OP_SWAP", - }, - { - name: "Swap2", - before: [][]byte{{1}, {2}, {3}, {4}}, - script: []byte{txscript.OP_2SWAP}, - after: [][]byte{{3}, {4}, {1}, {2}}, - disassembly: "OP_2SWAP", - }, - { - name: "Swap too little", - before: [][]byte{{1}}, - script: []byte{txscript.OP_SWAP}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_SWAP", - }, - { - name: "Over1", - before: [][]byte{{1}, {2}, {3}, {4}}, - script: []byte{txscript.OP_OVER}, - after: [][]byte{{1}, {2}, {3}, {4}, {3}}, - disassembly: "OP_OVER", - }, - { - name: "Over2", - before: [][]byte{{1}, {2}, {3}, {4}}, - script: []byte{txscript.OP_2OVER}, - after: [][]byte{{1}, {2}, {3}, {4}, {1}, {2}}, - disassembly: "OP_2OVER", - }, - { - name: "Over too little", - before: [][]byte{{1}}, - script: []byte{txscript.OP_OVER}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_OVER", - }, - { - name: "Pick1", - before: [][]byte{{1}, {2}, {3}, {4}, {1}}, - script: []byte{txscript.OP_PICK}, - after: [][]byte{{1}, {2}, {3}, {4}, {3}}, - disassembly: "OP_PICK", - }, - { - name: "Pick2", - before: [][]byte{{1}, {2}, {3}, {4}, {2}}, - script: []byte{txscript.OP_PICK}, - after: [][]byte{{1}, {2}, {3}, {4}, {2}}, - disassembly: "OP_PICK", - }, - { - name: "Pick too little", - before: [][]byte{{1}, {1}}, - script: []byte{txscript.OP_PICK}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_PICK", - }, - { - name: "Pick nothing", - before: [][]byte{{}}, - script: []byte{txscript.OP_PICK}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_PICK", - }, - { - name: "Pick no args", - before: [][]byte{}, - script: []byte{txscript.OP_PICK}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_PICK", - }, - { - name: "Pick stupid numbers", - before: [][]byte{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, - script: []byte{txscript.OP_PICK}, - expectedReturn: txscript.ErrStackNumberTooBig, - disassembly: "OP_PICK", - }, - { - name: "Roll1", - before: [][]byte{{1}, {2}, {3}, {4}, {1}}, - script: []byte{txscript.OP_ROLL}, - after: [][]byte{{1}, {2}, {4}, {3}}, - disassembly: "OP_ROLL", - }, - { - name: "Roll2", - before: [][]byte{{1}, {2}, {3}, {4}, {2}}, - script: []byte{txscript.OP_ROLL}, - after: [][]byte{{1}, {3}, {4}, {2}}, - disassembly: "OP_ROLL", - }, - { - name: "Roll too little", - before: [][]byte{{1}, {1}}, - script: []byte{txscript.OP_ROLL}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_ROLL", - }, - { - name: "Roll nothing ", - before: [][]byte{{1}}, - script: []byte{txscript.OP_ROLL}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_ROLL", - }, - { - name: "Roll no args ", - before: [][]byte{}, - script: []byte{txscript.OP_ROLL}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_ROLL", - }, - { - name: "Roll stupid numbers", - before: [][]byte{{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}, - script: []byte{txscript.OP_ROLL}, - expectedReturn: txscript.ErrStackNumberTooBig, - disassembly: "OP_ROLL", - }, - { - name: "ifdup (positive)", - before: [][]byte{{1}}, - script: []byte{txscript.OP_IFDUP}, - after: [][]byte{{1}, {1}}, - disassembly: "OP_IFDUP", - }, - { - name: "ifdup (negative)", - before: [][]byte{{0}}, - script: []byte{txscript.OP_IFDUP}, - after: [][]byte{{0}}, - disassembly: "OP_IFDUP", - }, - { - name: "ifdup (empty)", - before: [][]byte{}, - script: []byte{txscript.OP_IFDUP}, - expectedReturn: txscript.ErrStackUnderflow, - after: [][]byte{{0}}, - disassembly: "OP_IFDUP", - }, - { - // alt stack is purged at the end of execution - name: "toaltstack", - before: [][]byte{{1}}, - altbefore: [][]byte{}, - script: []byte{txscript.OP_TOALTSTACK}, - after: [][]byte{}, - altafter: [][]byte{}, - disassembly: "OP_TOALTSTACK", - }, - { - name: "toaltastack (empty)", - before: [][]byte{}, - altbefore: [][]byte{}, - script: []byte{txscript.OP_TOALTSTACK}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_TOALTSTACK", - }, - { - name: "fromaltastack", - before: [][]byte{}, - altbefore: [][]byte{{1}}, - script: []byte{txscript.OP_FROMALTSTACK}, - after: [][]byte{{1}}, - altafter: [][]byte{}, - disassembly: "OP_FROMALTSTACK", - }, - { - name: "fromaltastack (empty)", - before: [][]byte{}, - altbefore: [][]byte{}, - script: []byte{txscript.OP_FROMALTSTACK}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_FROMALTSTACK", - }, - { - name: "op_size (1)", - before: [][]byte{{1}}, - script: []byte{txscript.OP_SIZE}, - after: [][]byte{{1}, {1}}, - disassembly: "OP_SIZE", - }, - { - name: "op_size (5)", - before: [][]byte{{1, 2, 3, 4, 5}}, - script: []byte{txscript.OP_SIZE}, - after: [][]byte{{1, 2, 3, 4, 5}, {5}}, - disassembly: "OP_SIZE", - }, - { - name: "op_size (0)", - before: [][]byte{{}}, - script: []byte{txscript.OP_SIZE}, - // pushInt(0) actually gives an empty array, still counts as 0 - after: [][]byte{{}, {}}, - disassembly: "OP_SIZE", - }, - { - name: "op_size (invalid)", - before: [][]byte{}, - script: []byte{txscript.OP_SIZE}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_SIZE", - }, - { - name: "OP_EQUAL (valid)", - before: [][]byte{{1, 2, 3, 4}, {1, 2, 3, 4}}, - script: []byte{txscript.OP_EQUAL}, - after: [][]byte{{1}}, - disassembly: "OP_EQUAL", - }, - { - name: "OP_EQUAL (invalid)", - before: [][]byte{{1, 2, 3, 4}, {1, 2, 3, 3}}, - script: []byte{txscript.OP_EQUAL}, - after: [][]byte{{0}}, - disassembly: "OP_EQUAL", - }, - { - name: "OP_EQUAL (one arg)", - before: [][]byte{{1, 2, 3, 4}}, - script: []byte{txscript.OP_EQUAL}, - expectedReturn: txscript.ErrStackUnderflow, - after: [][]byte{{0}}, - disassembly: "OP_EQUAL", - }, - { - name: "OP_EQUAL (no arg)", - before: [][]byte{}, - script: []byte{txscript.OP_EQUAL}, - expectedReturn: txscript.ErrStackUnderflow, - after: [][]byte{{0}}, - disassembly: "OP_EQUAL", - }, - { - name: "OP_EQUALVERIFY (valid)", - before: [][]byte{{1, 2, 3, 4}, {1, 2, 3, 4}}, - script: []byte{txscript.OP_EQUALVERIFY}, - after: [][]byte{}, - disassembly: "OP_EQUALVERIFY", - }, - { - name: "OP_EQUALVERIFY (invalid)", - before: [][]byte{{1, 2, 3, 4}, {1, 2, 3, 3}}, - script: []byte{txscript.OP_EQUALVERIFY}, - expectedReturn: txscript.ErrStackVerifyFailed, - after: [][]byte{}, - disassembly: "OP_EQUALVERIFY", - }, - { - name: "OP_EQUALVERIFY (one arg)", - before: [][]byte{{1, 2, 3, 4}}, - script: []byte{txscript.OP_EQUALVERIFY}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_EQUALVERIFY", - }, - { - name: "OP_EQUALVERIFY (no arg)", - before: [][]byte{}, - script: []byte{txscript.OP_EQUALVERIFY}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_EQUALVERIFY", - }, - { - name: "OP_1NEGATE", - before: [][]byte{}, - script: []byte{txscript.OP_1NEGATE}, - after: [][]byte{{0x81}}, - disassembly: "-1", - }, - { - name: "add one to minus one", - before: [][]byte{}, - script: []byte{txscript.OP_1NEGATE, txscript.OP_1ADD}, - after: [][]byte{{}}, // 0 - disassembly: "-1 OP_1ADD", - }, - { - name: "OP_ABS (positive)", - before: [][]byte{{1}}, - script: []byte{txscript.OP_ABS}, - after: [][]byte{{1}}, - disassembly: "OP_ABS", - }, - { - name: "OP_ABS (negative)", - before: [][]byte{{0x81}}, - script: []byte{txscript.OP_ABS}, - after: [][]byte{{1}}, - disassembly: "OP_ABS", - }, - { - name: "OP_ABS (empty)", - before: [][]byte{}, - script: []byte{txscript.OP_ABS}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_ABS", - }, - { - name: "op_data_1", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_1, 1}, - after: [][]byte{{1}}, - disassembly: "01", - }, - { - name: "op_data_2", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_2, 1, 2}, - after: [][]byte{{1, 2}}, - disassembly: "0102", - }, - { - name: "op_data_3", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_3, 1, 2, 3}, - after: [][]byte{{1, 2, 3}}, - disassembly: "010203", - }, - { - name: "op_data_4", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_4, 1, 2, 3, 4}, - after: [][]byte{{1, 2, 3, 4}}, - disassembly: "01020304", - }, - { - name: "op_data_5", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_5, 1, 2, 3, 4, 5}, - after: [][]byte{{1, 2, 3, 4, 5}}, - disassembly: "0102030405", - }, - { - name: "op_data_6", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_6, 1, 2, 3, 4, 5, 6}, - after: [][]byte{{1, 2, 3, 4, 5, 6}}, - disassembly: "010203040506", - }, - { - name: "op_data_7", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_7, 1, 2, 3, 4, 5, 6, 7}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7}}, - disassembly: "01020304050607", - }, - { - name: "op_data_8", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_8, 1, 2, 3, 4, 5, 6, 7, 8}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8}}, - disassembly: "0102030405060708", - }, - { - name: "op_data_9", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_9, 1, 2, 3, 4, 5, 6, 7, 8, 9}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9}}, - disassembly: "010203040506070809", - }, - { - name: "op_data_10", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}, - disassembly: "0102030405060708090a", - }, - { - name: "op_data_11", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_11, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}}, - disassembly: "0102030405060708090a0b", - }, - { - name: "op_data_12", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_12, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}}, - disassembly: "0102030405060708090a0b0c", - }, - { - name: "op_data_13", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_13, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}}, - disassembly: "0102030405060708090a0b0c0d", - }, - { - name: "op_data_14", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_14, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}}, - disassembly: "0102030405060708090a0b0c0d0e", - }, - { - name: "op_data_15", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_15, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15}}, - disassembly: "0102030405060708090a0b0c0d0e0f", - }, - { - name: "op_data_16", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_16, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16}}, - disassembly: "0102030405060708090a0b0c0d0e0f10", - }, - { - name: "op_data_17", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_17, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17}}, - disassembly: "0102030405060708090a0b0c0d0e0f1011", - }, - { - name: "op_data_18", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_18, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112", - }, - { - name: "op_data_19", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_19, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19}}, - disassembly: "0102030405060708090a0b0c0d0e0f10111213", - }, - { - name: "op_data_20", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_20, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20}}, - disassembly: "0102030405060708090a0b0c0d0e0f1011121314", - }, - { - name: "op_data_21", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_21, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415", - }, - { - name: "op_data_22", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_22, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22}}, - disassembly: "0102030405060708090a0b0c0d0e0f10111213141516", - }, - { - name: "op_data_23", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_23, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23}}, - disassembly: "0102030405060708090a0b0c0d0e0f1011121314151617", - }, - { - name: "op_data_24", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_24, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718", - }, - { - name: "op_data_25", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_25, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25}}, - disassembly: "0102030405060708090a0b0c0d0e0f10111213141516171819", - }, - { - name: "op_data_26", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_26, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a", - }, - { - name: "op_data_27", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_27, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b", - }, - { - name: "op_data_28", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_28, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c", - }, - { - name: "op_data_29", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_29, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d", - }, - { - name: "op_data_30", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_30, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e", - }, - { - name: "op_data_31", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_31, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f", - }, - { - name: "op_data_32", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_32, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20", - }, - { - name: "op_data_33", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_33, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021", - }, - { - name: "op_data_34", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_34, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122", - }, - { - name: "op_data_35", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_35, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223", - }, - { - name: "op_data_36", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_36, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324", - }, - { - name: "op_data_37", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_37, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425", - }, - { - name: "op_data_38", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_38, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526", - }, - { - name: "op_data_39", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_39, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324252627", - }, - { - name: "op_data_40", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_40, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728", - }, - { - name: "op_data_41", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_41, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526272829", - }, - { - name: "op_data_42", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_42, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a", - }, - { - name: "op_data_43", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_43, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b", - }, - { - name: "op_data_44", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_44, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c", - }, - { - name: "op_data_45", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_45, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d", - }, - { - name: "op_data_46", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_46, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e", - }, - { - name: "op_data_47", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_47, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f", - }, - { - name: "op_data_48", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_48, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30", - }, - { - name: "op_data_49", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_49, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031", - }, - { - name: "op_data_50", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_50, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132", - }, - { - name: "op_data_51", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_51, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233", - }, - { - name: "op_data_52", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_52, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334", - }, - { - name: "op_data_53", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_53, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435", - }, - { - name: "op_data_54", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_54, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233343536", - }, - { - name: "op_data_55", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_55, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637", - }, - { - name: "op_data_56", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_56, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738", - }, - { - name: "op_data_57", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_57, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233343536373839", - }, - { - name: "op_data_58", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_58, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a", - }, - { - name: "op_data_59", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_59, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b", - }, - { - name: "op_data_60", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_60, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c", - }, - { - name: "op_data_61", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_61, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d", - }, - { - name: "op_data_62", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_62, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e", - }, - { - name: "op_data_63", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_63, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f", - }, - { - name: "op_data_64", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_64, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40", - }, - { - name: "op_data_65", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_65, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041", - }, - { - name: "op_data_66", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_66, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142", - }, - { - name: "op_data_67", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_67, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414243", - }, - { - name: "op_data_68", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_68, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041424344", - }, - { - name: "op_data_69", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_69, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445", - }, - { - name: "op_data_70", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_70, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414243444546", - }, - { - name: "op_data_71", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_71, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041424344454647", - }, - { - name: "op_data_72", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_72, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748", - }, - { - name: "op_data_73", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_73, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414243444546474849", - }, - { - name: "op_data_74", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_74, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - }}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a", - }, - { - name: "op_data_75", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_75, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, - 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, - 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 70, 71, 72, 73, 74, 75}, - after: [][]byte{{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, - 75}}, - disassembly: "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b", - }, - { - name: "op_data too short", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_2, 1}, - expectedReturn: txscript.ErrStackShortScript, - disassemblyerr: txscript.ErrStackShortScript, - }, - { - name: "op_pushdata_1", - before: [][]byte{}, - script: []byte{txscript.OP_PUSHDATA1, 1, 2}, - after: [][]byte{{2}}, - disassembly: "02", - }, - { - name: "op_pushdata_1 too short", - script: []byte{txscript.OP_PUSHDATA1, 1}, - expectedReturn: txscript.ErrStackShortScript, - disassemblyerr: txscript.ErrStackShortScript, - }, - { - name: "op_pushdata_2", - before: [][]byte{}, - script: []byte{txscript.OP_PUSHDATA2, 2, 0, 2, 4}, - after: [][]byte{{2, 4}}, - disassembly: "0204", - }, - { - name: "op_pushdata_2 too short", - script: []byte{txscript.OP_PUSHDATA2, 2, 0}, - expectedReturn: txscript.ErrStackShortScript, - disassemblyerr: txscript.ErrStackShortScript, - }, - { - name: "op_pushdata_4", - before: [][]byte{}, - script: []byte{txscript.OP_PUSHDATA4, 4, 0, 0, 0, 2, 4, 8, 16}, - after: [][]byte{{2, 4, 8, 16}}, - disassembly: "02040810", - }, - { - name: "op_pushdata_4 too short", - script: []byte{txscript.OP_PUSHDATA4, 4, 0, 0, 0}, - expectedReturn: txscript.ErrStackShortScript, - disassemblyerr: txscript.ErrStackShortScript, - }, - // XXX also pushdata cases where the pushed data isn't long enough, - // no real error type defined for that as of yet. - - { - name: "OP_SHA1 no args", - before: [][]byte{}, - script: []byte{txscript.OP_SHA1}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_SHA1", - }, - { - name: "OP_SHA1", - before: [][]byte{{0x01, 0x02, 0x03, 0x04, 0x05, 0x06}}, - script: []byte{txscript.OP_SHA1}, - after: [][]byte{{0x5d, 0x21, 0x1b, 0xad, 0x8f, 0x4e, - 0xe7, 0x0e, 0x16, 0xc7, 0xd3, 0x43, 0xa8, 0x38, 0xfc, - 0x34, 0x4a, 0x1e, 0xd9, 0x61}}, - disassembly: "OP_SHA1", - }, - { - name: "OP_SHA256 no args", - before: [][]byte{}, - script: []byte{txscript.OP_SHA256}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_SHA256", - }, - { - name: "OP_RIPEMD160 no args", - before: [][]byte{}, - script: []byte{txscript.OP_RIPEMD160}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_RIPEMD160", - }, - // data taken from transaction - // 4cbb6924e5f9788d7fcf0a1ce8c175bf9befa43eb5e23386b69bc4dce49da71c - // in block 103307 - // First do it in component parts to make sure the sha256 and ripemd160 - // opcodes work - { - name: "op_hash160 the hard way", - before: [][]byte{{0x04, 0x0f, 0xa4, 0x92, 0xe3, 0x59, 0xde, 0xe8, 0x4b, - 0x53, 0xfe, 0xc5, 0xe9, 0x18, 0xb7, 0xfd, 0x62, 0x1e, - 0xb7, 0xe5, 0x63, 0x38, 0xc5, 0xfb, 0xff, 0x71, 0xd9, - 0x1d, 0x17, 0x22, 0xda, 0x58, 0xf1, 0x0f, 0x9e, 0x8f, - 0x41, 0x2f, 0x39, 0x9c, 0xb3, 0x06, 0x70, 0xa7, 0x27, - 0xe9, 0x91, 0x94, 0xaa, 0x69, 0x27, 0xaf, 0xf2, 0x54, - 0x16, 0xec, 0x48, 0x9d, 0x45, 0x3a, 0x80, 0x7e, 0x03, - 0xc0, 0x83}}, - script: []byte{txscript.OP_SHA256, txscript.OP_RIPEMD160}, - after: [][]byte{{0x8b, 0xfa, 0x5c, 0x1f, 0x68, 0x5f, 0x13, 0x86, 0x3e, - 0x74, 0x2e, 0x1b, 0xaf, 0x15, 0xf1, 0x71, 0xad, 0x49, - 0x8b, 0x8f}}, - disassembly: "OP_SHA256 OP_RIPEMD160", - }, - // Then test it the ``normal'' way. - { - name: "op_hash160", - before: [][]byte{{0x04, 0x0f, 0xa4, 0x92, 0xe3, 0x59, 0xde, 0xe8, 0x4b, - 0x53, 0xfe, 0xc5, 0xe9, 0x18, 0xb7, 0xfd, 0x62, 0x1e, - 0xb7, 0xe5, 0x63, 0x38, 0xc5, 0xfb, 0xff, 0x71, 0xd9, - 0x1d, 0x17, 0x22, 0xda, 0x58, 0xf1, 0x0f, 0x9e, 0x8f, - 0x41, 0x2f, 0x39, 0x9c, 0xb3, 0x06, 0x70, 0xa7, 0x27, - 0xe9, 0x91, 0x94, 0xaa, 0x69, 0x27, 0xaf, 0xf2, 0x54, - 0x16, 0xec, 0x48, 0x9d, 0x45, 0x3a, 0x80, 0x7e, 0x03, - 0xc0, 0x83}}, - script: []byte{txscript.OP_HASH160}, - after: [][]byte{{0x8b, 0xfa, 0x5c, 0x1f, 0x68, 0x5f, 0x13, 0x86, 0x3e, - 0x74, 0x2e, 0x1b, 0xaf, 0x15, 0xf1, 0x71, 0xad, 0x49, - 0x8b, 0x8f}}, - disassembly: "OP_HASH160", - }, - // now with pushing. (mostly to check the disassembly) - { - name: "op_hash160 full script", - before: [][]byte{}, - script: []byte{txscript.OP_DATA_65, - 0x04, 0x0f, 0xa4, 0x92, 0xe3, 0x59, 0xde, 0xe8, 0x4b, - 0x53, 0xfe, 0xc5, 0xe9, 0x18, 0xb7, 0xfd, 0x62, 0x1e, - 0xb7, 0xe5, 0x63, 0x38, 0xc5, 0xfb, 0xff, 0x71, 0xd9, - 0x1d, 0x17, 0x22, 0xda, 0x58, 0xf1, 0x0f, 0x9e, 0x8f, - 0x41, 0x2f, 0x39, 0x9c, 0xb3, 0x06, 0x70, 0xa7, 0x27, - 0xe9, 0x91, 0x94, 0xaa, 0x69, 0x27, 0xaf, 0xf2, 0x54, - 0x16, 0xec, 0x48, 0x9d, 0x45, 0x3a, 0x80, 0x7e, 0x03, - 0xc0, 0x83, - txscript.OP_HASH160, txscript.OP_DATA_20, - 0x8b, 0xfa, 0x5c, 0x1f, 0x68, 0x5f, 0x13, 0x86, 0x3e, - 0x74, 0x2e, 0x1b, 0xaf, 0x15, 0xf1, 0x71, 0xad, 0x49, - 0x8b, 0x8f, - txscript.OP_EQUALVERIFY}, - after: [][]byte{}, - disassembly: "040fa492e359dee84b53fec5e918b7fd621eb7e56338c5fbff71d91d1722da58f10f9e8f412f399cb30670a727e99194aa6927aff25416ec489d453a807e03c083 OP_HASH160 8bfa5c1f685f13863e742e1baf15f171ad498b8f OP_EQUALVERIFY", - }, - { - name: "op_hash160 no args", - script: []byte{txscript.OP_HASH160}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_HASH160", - }, - // hash256 test taken from spend of: - // 09f691b2263260e71f363d1db51ff3100d285956a40cc0e4f8c8c2c4a80559b1 - { - name: "op_hash256", - before: [][]byte{{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x3b, 0xa3, 0xed, 0xfd, 0x7a, 0x7b, 0x12, 0xb2, - 0x7a, 0xc7, 0x2c, 0x3e, 0x67, 0x76, 0x8f, 0x61, 0x7f, - 0xc8, 0x1b, 0xc3, 0x88, 0x8a, 0x51, 0x32, 0x3a, 0x9f, - 0xb8, 0xaa, 0x4b, 0x1e, 0x5e, 0x4a, 0x29, 0xab, 0x5f, - 0x49, 0xff, 0xff, 0x00, 0x1d, 0x1d, 0xac, 0x2b, 0x7c}}, - script: []byte{txscript.OP_HASH256}, - after: [][]byte{{0x6f, 0xe2, 0x8c, 0x0a, 0xb6, 0xf1, 0xb3, 0x72, 0xc1, - 0xa6, 0xa2, 0x46, 0xae, 0x63, 0xf7, 0x4f, 0x93, 0x1e, - 0x83, 0x65, 0xe1, 0x5a, 0x08, 0x9c, 0x68, 0xd6, 0x19, - 0x00, 0x00, 0x00, 0x00, 0x00}}, - disassembly: "OP_HASH256", - }, - { - name: "OP_HASH256 no args", - script: []byte{txscript.OP_HASH256}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_HASH256", - }, - // We need a more involved setup to test OP_CHECKSIG and - // OP_CHECKMULTISIG (see script_test.go) but we can test it with - // invalid arguments here quite easily. - { - name: "OP_CHECKSIG one arg", - script: []byte{txscript.OP_1, txscript.OP_CHECKSIG}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "1 OP_CHECKSIG", - nSigOps: 1, - nPreciseSigOps: 1, - }, - { - name: "OP_CHECKSIG no arg", - script: []byte{txscript.OP_CHECKSIG}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_CHECKSIG", - nSigOps: 1, - nPreciseSigOps: 1, - }, - { - name: "OP_CHECKSIGVERIFY one arg", - script: []byte{txscript.OP_1, - txscript.OP_CHECKSIGVERIFY}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "1 OP_CHECKSIGVERIFY", - nSigOps: 1, - nPreciseSigOps: 1, - }, - { - name: "OP_CHECKSIGVERIFY no arg", - script: []byte{txscript.OP_CHECKSIGVERIFY}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_CHECKSIGVERIFY", - nSigOps: 1, - nPreciseSigOps: 1, - }, - { - name: "OP_CHECKMULTISIG no args", - script: []byte{txscript.OP_CHECKMULTISIG}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_CHECKMULTISIG", - nSigOps: 20, - nPreciseSigOps: 20, - }, - { - name: "OP_CHECKMULTISIG huge number", - script: []byte{txscript.OP_PUSHDATA1, - 0x9, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, - txscript.OP_CHECKMULTISIG}, - expectedReturn: txscript.ErrStackNumberTooBig, - disassembly: "010203040506070809 OP_CHECKMULTISIG", - nSigOps: 20, - nPreciseSigOps: 20, - }, - { - name: "OP_CHECKMULTISIG too many keys", - script: []byte{txscript.OP_DATA_1, 21, - txscript.OP_CHECKMULTISIG}, - expectedReturn: txscript.ErrStackTooManyPubkeys, - disassembly: "15 OP_CHECKMULTISIG", - nSigOps: 20, - nPreciseSigOps: 20, - }, - { - name: "OP_CHECKMULTISIG lying about pubkeys", - script: []byte{txscript.OP_1, - txscript.OP_CHECKMULTISIG}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "1 OP_CHECKMULTISIG", - nSigOps: 20, - nPreciseSigOps: 1, - }, - { - // pubkey comes from blockchain - name: "OP_CHECKMULTISIG no sigs", - script: []byte{ - txscript.OP_DATA_65, - 0x04, 0xae, 0x1a, 0x62, 0xfe, 0x09, 0xc5, 0xf5, 0x1b, - 0x13, 0x90, 0x5f, 0x07, 0xf0, 0x6b, 0x99, 0xa2, 0xf7, - 0x15, 0x9b, 0x22, 0x25, 0xf3, 0x74, 0xcd, 0x37, 0x8d, - 0x71, 0x30, 0x2f, 0xa2, 0x84, 0x14, 0xe7, 0xaa, 0xb3, - 0x73, 0x97, 0xf5, 0x54, 0xa7, 0xdf, 0x5f, 0x14, 0x2c, - 0x21, 0xc1, 0xb7, 0x30, 0x3b, 0x8a, 0x06, 0x26, 0xf1, - 0xba, 0xde, 0xd5, 0xc7, 0x2a, 0x70, 0x4f, 0x7e, 0x6c, - 0xd8, 0x4c, - txscript.OP_1, - txscript.OP_CHECKMULTISIG}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "04ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84c 1 OP_CHECKMULTISIG", - nSigOps: 20, - nPreciseSigOps: 1, - }, - { - // pubkey comes from blockchain - name: "OP_CHECKMULTISIG sigs huge no", - script: []byte{ - txscript.OP_PUSHDATA1, - 0x9, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, - txscript.OP_DATA_65, - 0x04, 0xae, 0x1a, 0x62, 0xfe, 0x09, 0xc5, 0xf5, 0x1b, - 0x13, 0x90, 0x5f, 0x07, 0xf0, 0x6b, 0x99, 0xa2, 0xf7, - 0x15, 0x9b, 0x22, 0x25, 0xf3, 0x74, 0xcd, 0x37, 0x8d, - 0x71, 0x30, 0x2f, 0xa2, 0x84, 0x14, 0xe7, 0xaa, 0xb3, - 0x73, 0x97, 0xf5, 0x54, 0xa7, 0xdf, 0x5f, 0x14, 0x2c, - 0x21, 0xc1, 0xb7, 0x30, 0x3b, 0x8a, 0x06, 0x26, 0xf1, - 0xba, 0xde, 0xd5, 0xc7, 0x2a, 0x70, 0x4f, 0x7e, 0x6c, - 0xd8, 0x4c, - txscript.OP_1, - txscript.OP_CHECKMULTISIG}, - expectedReturn: txscript.ErrStackNumberTooBig, - disassembly: "010203040506070809 04ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84c 1 OP_CHECKMULTISIG", - nSigOps: 20, - nPreciseSigOps: 1, - }, - { - name: "OP_CHECKMULTISIG too few sigs", - script: []byte{txscript.OP_1, - txscript.OP_DATA_65, - 0x04, 0xae, 0x1a, 0x62, 0xfe, 0x09, 0xc5, 0xf5, 0x1b, - 0x13, 0x90, 0x5f, 0x07, 0xf0, 0x6b, 0x99, 0xa2, 0xf7, - 0x15, 0x9b, 0x22, 0x25, 0xf3, 0x74, 0xcd, 0x37, 0x8d, - 0x71, 0x30, 0x2f, 0xa2, 0x84, 0x14, 0xe7, 0xaa, 0xb3, - 0x73, 0x97, 0xf5, 0x54, 0xa7, 0xdf, 0x5f, 0x14, 0x2c, - 0x21, 0xc1, 0xb7, 0x30, 0x3b, 0x8a, 0x06, 0x26, 0xf1, - 0xba, 0xde, 0xd5, 0xc7, 0x2a, 0x70, 0x4f, 0x7e, 0x6c, - 0xd8, 0x4c, - txscript.OP_1, - txscript.OP_CHECKMULTISIG}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "1 04ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84c 1 OP_CHECKMULTISIG", - nSigOps: 20, - nPreciseSigOps: 1, - }, - { - // pubkey and sig comes from blockchain, are unrelated - name: "OP_CHECKMULTISIG won't verify", - script: []byte{txscript.OP_1, - txscript.OP_DATA_71, - 0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69, 0x32, - 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1, 0xa2, - 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6, 0x24, - 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd, 0x41, - 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca, 0x07, - 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90, 0x9d, - 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22, 0x08, - 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09, 0x01, - txscript.OP_1, - txscript.OP_DATA_65, - 0x04, 0xae, 0x1a, 0x62, 0xfe, 0x09, 0xc5, 0xf5, 0x1b, - 0x13, 0x90, 0x5f, 0x07, 0xf0, 0x6b, 0x99, 0xa2, 0xf7, - 0x15, 0x9b, 0x22, 0x25, 0xf3, 0x74, 0xcd, 0x37, 0x8d, - 0x71, 0x30, 0x2f, 0xa2, 0x84, 0x14, 0xe7, 0xaa, 0xb3, - 0x73, 0x97, 0xf5, 0x54, 0xa7, 0xdf, 0x5f, 0x14, 0x2c, - 0x21, 0xc1, 0xb7, 0x30, 0x3b, 0x8a, 0x06, 0x26, 0xf1, - 0xba, 0xde, 0xd5, 0xc7, 0x2a, 0x70, 0x4f, 0x7e, 0x6c, - 0xd8, 0x4c, - txscript.OP_1, - txscript.OP_CHECKMULTISIG}, - after: [][]byte{{0}}, - disassembly: "1 304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901 1 04ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84c 1 OP_CHECKMULTISIG", - nSigOps: 20, - nPreciseSigOps: 1, - }, - { - // invalid pubkey means that it fails to validate, not an - // error. There are pubkeys in the blockchain that don't - // parse with any validity. - name: "OP_CHECKMULTISIG sigs bad pubkey", - script: []byte{txscript.OP_1, - txscript.OP_DATA_71, - 0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69, 0x32, - 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1, 0xa2, - 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6, 0x24, - 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd, 0x41, - 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca, 0x07, - 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90, 0x9d, - 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22, 0x08, - 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09, 0x01, - txscript.OP_1, - txscript.OP_1, txscript.OP_1, - txscript.OP_CHECKMULTISIG}, - after: [][]byte{{0}}, - disassembly: "1 304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901 1 1 1 OP_CHECKMULTISIG", - nSigOps: 20, - nPreciseSigOps: 1, - }, - // XXX(oga) Test multisig when extra arg is missing. needs valid sig. - // disabled opcodes - { - name: "OP_CHECKMULTISIGVERIFY no args", - script: []byte{txscript.OP_CHECKMULTISIGVERIFY}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "OP_CHECKMULTISIGVERIFY", - nSigOps: 20, - nPreciseSigOps: 20, - }, - { - name: "OP_CHECKMULTISIGVERIFY huge number", - script: []byte{txscript.OP_PUSHDATA1, - 0x9, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, - txscript.OP_CHECKMULTISIGVERIFY}, - expectedReturn: txscript.ErrStackNumberTooBig, - disassembly: "010203040506070809 OP_CHECKMULTISIGVERIFY", - nSigOps: 20, - nPreciseSigOps: 20, - }, - { - name: "OP_CHECKMULTISIGVERIFY too many keys", - script: []byte{txscript.OP_DATA_1, 21, - txscript.OP_CHECKMULTISIGVERIFY}, - expectedReturn: txscript.ErrStackTooManyPubkeys, - disassembly: "15 OP_CHECKMULTISIGVERIFY", - nSigOps: 20, - nPreciseSigOps: 20, - }, - { - name: "OP_CHECKMULTISIGVERIFY lying about pubkeys", - script: []byte{txscript.OP_1, - txscript.OP_CHECKMULTISIGVERIFY}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "1 OP_CHECKMULTISIGVERIFY", - nSigOps: 20, - nPreciseSigOps: 1, - }, - { - // pubkey comes from blockchain - name: "OP_CHECKMULTISIGVERIFY no sigs", - script: []byte{ - txscript.OP_DATA_65, - 0x04, 0xae, 0x1a, 0x62, 0xfe, 0x09, 0xc5, 0xf5, 0x1b, - 0x13, 0x90, 0x5f, 0x07, 0xf0, 0x6b, 0x99, 0xa2, 0xf7, - 0x15, 0x9b, 0x22, 0x25, 0xf3, 0x74, 0xcd, 0x37, 0x8d, - 0x71, 0x30, 0x2f, 0xa2, 0x84, 0x14, 0xe7, 0xaa, 0xb3, - 0x73, 0x97, 0xf5, 0x54, 0xa7, 0xdf, 0x5f, 0x14, 0x2c, - 0x21, 0xc1, 0xb7, 0x30, 0x3b, 0x8a, 0x06, 0x26, 0xf1, - 0xba, 0xde, 0xd5, 0xc7, 0x2a, 0x70, 0x4f, 0x7e, 0x6c, - 0xd8, 0x4c, - txscript.OP_1, - txscript.OP_CHECKMULTISIGVERIFY}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "04ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84c 1 OP_CHECKMULTISIGVERIFY", - nSigOps: 20, - nPreciseSigOps: 1, - }, - { - name: "OP_CHECKMULTISIGVERIFY sigs huge no", - script: []byte{ - txscript.OP_PUSHDATA1, - 0x9, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, - txscript.OP_DATA_65, - 0x04, 0xae, 0x1a, 0x62, 0xfe, 0x09, 0xc5, 0xf5, 0x1b, - 0x13, 0x90, 0x5f, 0x07, 0xf0, 0x6b, 0x99, 0xa2, 0xf7, - 0x15, 0x9b, 0x22, 0x25, 0xf3, 0x74, 0xcd, 0x37, 0x8d, - 0x71, 0x30, 0x2f, 0xa2, 0x84, 0x14, 0xe7, 0xaa, 0xb3, - 0x73, 0x97, 0xf5, 0x54, 0xa7, 0xdf, 0x5f, 0x14, 0x2c, - 0x21, 0xc1, 0xb7, 0x30, 0x3b, 0x8a, 0x06, 0x26, 0xf1, - 0xba, 0xde, 0xd5, 0xc7, 0x2a, 0x70, 0x4f, 0x7e, 0x6c, - 0xd8, 0x4c, - txscript.OP_1, - txscript.OP_CHECKMULTISIGVERIFY}, - expectedReturn: txscript.ErrStackNumberTooBig, - disassembly: "010203040506070809 04ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84c 1 OP_CHECKMULTISIGVERIFY", - nSigOps: 20, - nPreciseSigOps: 1, - }, - { - name: "OP_CHECKMULTISIGVERIFY too few sigs", - script: []byte{txscript.OP_1, - txscript.OP_DATA_65, - 0x04, 0xae, 0x1a, 0x62, 0xfe, 0x09, 0xc5, 0xf5, 0x1b, - 0x13, 0x90, 0x5f, 0x07, 0xf0, 0x6b, 0x99, 0xa2, 0xf7, - 0x15, 0x9b, 0x22, 0x25, 0xf3, 0x74, 0xcd, 0x37, 0x8d, - 0x71, 0x30, 0x2f, 0xa2, 0x84, 0x14, 0xe7, 0xaa, 0xb3, - 0x73, 0x97, 0xf5, 0x54, 0xa7, 0xdf, 0x5f, 0x14, 0x2c, - 0x21, 0xc1, 0xb7, 0x30, 0x3b, 0x8a, 0x06, 0x26, 0xf1, - 0xba, 0xde, 0xd5, 0xc7, 0x2a, 0x70, 0x4f, 0x7e, 0x6c, - 0xd8, 0x4c, - txscript.OP_1, - txscript.OP_CHECKMULTISIGVERIFY}, - expectedReturn: txscript.ErrStackUnderflow, - disassembly: "1 04ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84c 1 OP_CHECKMULTISIGVERIFY", - nSigOps: 20, - nPreciseSigOps: 1, - }, - { - // pubkey and sig comes from blockchain, are unrelated - name: "OP_CHECKMULTISIGVERIFY won't verify", - script: []byte{txscript.OP_1, - txscript.OP_DATA_71, - 0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69, 0x32, - 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1, 0xa2, - 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6, 0x24, - 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd, 0x41, - 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca, 0x07, - 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90, 0x9d, - 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22, 0x08, - 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09, 0x01, - txscript.OP_1, - txscript.OP_DATA_65, - 0x04, 0xae, 0x1a, 0x62, 0xfe, 0x09, 0xc5, 0xf5, 0x1b, - 0x13, 0x90, 0x5f, 0x07, 0xf0, 0x6b, 0x99, 0xa2, 0xf7, - 0x15, 0x9b, 0x22, 0x25, 0xf3, 0x74, 0xcd, 0x37, 0x8d, - 0x71, 0x30, 0x2f, 0xa2, 0x84, 0x14, 0xe7, 0xaa, 0xb3, - 0x73, 0x97, 0xf5, 0x54, 0xa7, 0xdf, 0x5f, 0x14, 0x2c, - 0x21, 0xc1, 0xb7, 0x30, 0x3b, 0x8a, 0x06, 0x26, 0xf1, - 0xba, 0xde, 0xd5, 0xc7, 0x2a, 0x70, 0x4f, 0x7e, 0x6c, - 0xd8, 0x4c, - txscript.OP_1, - txscript.OP_CHECKMULTISIGVERIFY}, - expectedReturn: txscript.ErrStackVerifyFailed, - disassembly: "1 304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901 1 04ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84c 1 OP_CHECKMULTISIGVERIFY", - nSigOps: 20, - nPreciseSigOps: 1, - }, - { - // invalid pubkey means that it fails to validate, not an - // error. There are pubkeys in the blockchain that don't - // parse with any validity. - name: "OP_CHECKMULTISIGVERIFY sigs bad pubkey", - script: []byte{txscript.OP_1, - txscript.OP_DATA_71, - 0x30, 0x44, 0x02, 0x20, 0x4e, 0x45, 0xe1, 0x69, 0x32, - 0xb8, 0xaf, 0x51, 0x49, 0x61, 0xa1, 0xd3, 0xa1, 0xa2, - 0x5f, 0xdf, 0x3f, 0x4f, 0x77, 0x32, 0xe9, 0xd6, 0x24, - 0xc6, 0xc6, 0x15, 0x48, 0xab, 0x5f, 0xb8, 0xcd, 0x41, - 0x02, 0x20, 0x18, 0x15, 0x22, 0xec, 0x8e, 0xca, 0x07, - 0xde, 0x48, 0x60, 0xa4, 0xac, 0xdd, 0x12, 0x90, 0x9d, - 0x83, 0x1c, 0xc5, 0x6c, 0xbb, 0xac, 0x46, 0x22, 0x08, - 0x22, 0x21, 0xa8, 0x76, 0x8d, 0x1d, 0x09, 0x01, - txscript.OP_1, - txscript.OP_1, txscript.OP_1, - txscript.OP_CHECKMULTISIGVERIFY}, - expectedReturn: txscript.ErrStackVerifyFailed, - disassembly: "1 304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901 1 1 1 OP_CHECKMULTISIGVERIFY", - nSigOps: 20, - nPreciseSigOps: 1, - }, - { - // 201 operations + one push, should just fit limits - name: "max operations", - script: []byte{txscript.OP_1, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - }, - after: [][]byte{{1}, {1}}, - disassembly: "1 OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP", - }, - { - // 202 operations + one push - name: "too many operations", - script: []byte{txscript.OP_1, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - }, - expectedReturn: txscript.ErrStackTooManyOperations, - disassembly: "1 OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP", - }, - { - // 202 operations + one push - name: "too many operations multisig", - script: []byte{txscript.OP_1, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_DUP, - txscript.OP_DROP, - txscript.OP_1, - txscript.OP_1, - txscript.OP_1, - txscript.OP_1, - txscript.OP_2, - txscript.OP_CHECKMULTISIG, - }, - expectedReturn: txscript.ErrStackTooManyOperations, - disassembly: "1 OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP OP_DUP OP_DROP 1 1 1 1 2 OP_CHECKMULTISIG", - nSigOps: 20, - nPreciseSigOps: 2, - }, - { - name: "push largest", - // 521 bytes - before: [][]byte{}, - script: []byte{txscript.OP_PUSHDATA2, 0x08, 0x02, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, - after: [][]byte{{ - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}}, - disassembly: "01020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607080901020304050607", - }, - { - name: "push too large", - // 521 bytes - script: []byte{txscript.OP_PUSHDATA2, 0x09, 0x02, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}, - expectedReturn: txscript.ErrStackElementTooBig, - // element too big is a parse error. - disassembly: "0102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708090102030405060708", - }, - { - name: "OP_CAT disabled", - script: []byte{txscript.OP_CAT}, - expectedReturn: txscript.ErrStackOpDisabled, - disassembly: "OP_CAT", - }, - { - name: "OP_SUBSTR disabled", - script: []byte{txscript.OP_SUBSTR}, - expectedReturn: txscript.ErrStackOpDisabled, - disassembly: "OP_SUBSTR", - }, - { - name: "OP_LEFT disabled", - script: []byte{txscript.OP_LEFT}, - expectedReturn: txscript.ErrStackOpDisabled, - disassembly: "OP_LEFT", - }, - { - name: "OP_RIGHT disabled", - script: []byte{txscript.OP_RIGHT}, - expectedReturn: txscript.ErrStackOpDisabled, - disassembly: "OP_RIGHT", - }, - { - name: "OP_INVERT disabled", - script: []byte{txscript.OP_INVERT}, - expectedReturn: txscript.ErrStackOpDisabled, - disassembly: "OP_INVERT", - }, - { - name: "OP_AND disabled", - script: []byte{txscript.OP_AND}, - expectedReturn: txscript.ErrStackOpDisabled, - disassembly: "OP_AND", - }, - { - name: "OP_OR disabled", - script: []byte{txscript.OP_OR}, - expectedReturn: txscript.ErrStackOpDisabled, - disassembly: "OP_OR", - }, - { - name: "OP_XOR disabled", - script: []byte{txscript.OP_XOR}, - expectedReturn: txscript.ErrStackOpDisabled, - disassembly: "OP_XOR", - }, - { - name: "OP_2MUL disabled", - script: []byte{txscript.OP_2MUL}, - expectedReturn: txscript.ErrStackOpDisabled, - disassembly: "OP_2MUL", - }, - { - name: "OP_2DIV disabled", - script: []byte{txscript.OP_2DIV}, - expectedReturn: txscript.ErrStackOpDisabled, - disassembly: "OP_2DIV", - }, - { - name: "OP_2DIV disabled", - script: []byte{txscript.OP_2DIV}, - expectedReturn: txscript.ErrStackOpDisabled, - disassembly: "OP_2DIV", - }, - { - name: "OP_MUL disabled", - script: []byte{txscript.OP_MUL}, - expectedReturn: txscript.ErrStackOpDisabled, - disassembly: "OP_MUL", - }, - { - name: "OP_DIV disabled", - script: []byte{txscript.OP_DIV}, - expectedReturn: txscript.ErrStackOpDisabled, - disassembly: "OP_DIV", - }, - { - name: "OP_MOD disabled", - script: []byte{txscript.OP_MOD}, - expectedReturn: txscript.ErrStackOpDisabled, - disassembly: "OP_MOD", - }, - { - name: "OP_LSHIFT disabled", - script: []byte{txscript.OP_LSHIFT}, - expectedReturn: txscript.ErrStackOpDisabled, - disassembly: "OP_LSHIFT", - }, - { - name: "OP_RSHIFT disabled", - script: []byte{txscript.OP_RSHIFT}, - expectedReturn: txscript.ErrStackOpDisabled, - disassembly: "OP_RSHIFT", - }, - // Reserved opcodes - { - name: "OP_RESERVED reserved", - script: []byte{txscript.OP_RESERVED}, - expectedReturn: txscript.ErrStackReservedOpcode, - disassembly: "OP_RESERVED", - }, - { - name: "OP_VER reserved", - script: []byte{txscript.OP_VER}, - expectedReturn: txscript.ErrStackReservedOpcode, - disassembly: "OP_VER", - }, - { - name: "OP_VERIF reserved", - script: []byte{txscript.OP_VERIF}, - expectedReturn: txscript.ErrStackReservedOpcode, - disassembly: "OP_VERIF", - }, - { - name: "OP_VERNOTIF reserved", - script: []byte{txscript.OP_VERNOTIF}, - expectedReturn: txscript.ErrStackReservedOpcode, - disassembly: "OP_VERNOTIF", - }, - { - name: "OP_RESERVED1 reserved", - script: []byte{txscript.OP_RESERVED1}, - expectedReturn: txscript.ErrStackReservedOpcode, - disassembly: "OP_RESERVED1", - }, - { - name: "OP_RESERVED2 reserved", - script: []byte{txscript.OP_RESERVED2}, - expectedReturn: txscript.ErrStackReservedOpcode, - disassembly: "OP_RESERVED2", - }, - // Invalid Opcodes - { - name: "invalid opcode 186", - script: []byte{txscript.OP_UNKNOWN186}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN186", - }, - { - name: "invalid opcode 187", - script: []byte{txscript.OP_UNKNOWN187}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN187", - }, - { - name: "invalid opcode 188", - script: []byte{txscript.OP_UNKNOWN188}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN188", - }, - { - name: "invalid opcode 189", - script: []byte{txscript.OP_UNKNOWN189}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN189", - }, - { - name: "invalid opcode 190", - script: []byte{txscript.OP_UNKNOWN190}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN190", - }, - { - name: "invalid opcode 191", - script: []byte{txscript.OP_UNKNOWN191}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN191", - }, - { - name: "invalid opcode 192", - script: []byte{txscript.OP_UNKNOWN192}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN192", - }, - { - name: "invalid opcode 193", - script: []byte{txscript.OP_UNKNOWN193}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN193", - }, - { - name: "invalid opcode 194", - script: []byte{txscript.OP_UNKNOWN194}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN194", - }, - { - name: "invalid opcode 195", - script: []byte{txscript.OP_UNKNOWN195}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN195", - }, - { - name: "invalid opcode 196", - script: []byte{txscript.OP_UNKNOWN196}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN196", - }, - { - name: "invalid opcode 197", - script: []byte{txscript.OP_UNKNOWN197}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN197", - }, - { - name: "invalid opcode 198", - script: []byte{txscript.OP_UNKNOWN198}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN198", - }, - { - name: "invalid opcode 199", - script: []byte{txscript.OP_UNKNOWN199}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN199", - }, - { - name: "invalid opcode 200", - script: []byte{txscript.OP_UNKNOWN200}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN200", - }, - { - name: "invalid opcode 201", - script: []byte{txscript.OP_UNKNOWN201}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN201", - }, - { - name: "invalid opcode 202", - script: []byte{txscript.OP_UNKNOWN202}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN202", - }, - { - name: "invalid opcode 203", - script: []byte{txscript.OP_UNKNOWN203}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN203", - }, - { - name: "invalid opcode 204", - script: []byte{txscript.OP_UNKNOWN204}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN204", - }, - { - name: "invalid opcode 205", - script: []byte{txscript.OP_UNKNOWN205}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN205", - }, - { - name: "invalid opcode 206", - script: []byte{txscript.OP_UNKNOWN206}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN206", - }, - { - name: "invalid opcode 207", - script: []byte{txscript.OP_UNKNOWN207}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN207", - }, - { - name: "invalid opcode 208", - script: []byte{txscript.OP_UNKNOWN208}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN208", - }, - { - name: "invalid opcode 209", - script: []byte{txscript.OP_UNKNOWN209}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN209", - }, - { - name: "invalid opcode 210", - script: []byte{txscript.OP_UNKNOWN210}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN210", - }, - { - name: "invalid opcode 211", - script: []byte{txscript.OP_UNKNOWN211}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN211", - }, - { - name: "invalid opcode 212", - script: []byte{txscript.OP_UNKNOWN212}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN212", - }, - { - name: "invalid opcode 213", - script: []byte{txscript.OP_UNKNOWN213}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN213", - }, - { - name: "invalid opcode 214", - script: []byte{txscript.OP_UNKNOWN214}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN214", - }, - { - name: "invalid opcode 215", - script: []byte{txscript.OP_UNKNOWN215}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN215", - }, - { - name: "invalid opcode 216", - script: []byte{txscript.OP_UNKNOWN216}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN216", - }, - { - name: "invalid opcode 217", - script: []byte{txscript.OP_UNKNOWN217}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN217", - }, - { - name: "invalid opcode 218", - script: []byte{txscript.OP_UNKNOWN218}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN218", - }, - { - name: "invalid opcode 219", - script: []byte{txscript.OP_UNKNOWN219}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN219", - }, - { - name: "invalid opcode 220", - script: []byte{txscript.OP_UNKNOWN220}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN220", - }, - { - name: "invalid opcode 221", - script: []byte{txscript.OP_UNKNOWN221}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN221", - }, - { - name: "invalid opcode 222", - script: []byte{txscript.OP_UNKNOWN222}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN222", - }, - { - name: "invalid opcode 223", - script: []byte{txscript.OP_UNKNOWN223}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN223", - }, - { - name: "invalid opcode 224", - script: []byte{txscript.OP_UNKNOWN224}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN224", - }, - { - name: "invalid opcode 225", - script: []byte{txscript.OP_UNKNOWN225}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN225", - }, - { - name: "invalid opcode 226", - script: []byte{txscript.OP_UNKNOWN226}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN226", - }, - { - name: "invalid opcode 227", - script: []byte{txscript.OP_UNKNOWN227}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN227", - }, - { - name: "invalid opcode 228", - script: []byte{txscript.OP_UNKNOWN228}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN228", - }, - { - name: "invalid opcode 229", - script: []byte{txscript.OP_UNKNOWN229}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN229", - }, - { - name: "invalid opcode 230", - script: []byte{txscript.OP_UNKNOWN230}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN230", - }, - { - name: "invalid opcode 231", - script: []byte{txscript.OP_UNKNOWN231}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN231", - }, - { - name: "invalid opcode 232", - script: []byte{txscript.OP_UNKNOWN232}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN232", - }, - { - name: "invalid opcode 233", - script: []byte{txscript.OP_UNKNOWN233}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN233", - }, - { - name: "invalid opcode 234", - script: []byte{txscript.OP_UNKNOWN234}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN234", - }, - { - name: "invalid opcode 235", - script: []byte{txscript.OP_UNKNOWN235}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN235", - }, - { - name: "invalid opcode 236", - script: []byte{txscript.OP_UNKNOWN236}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN236", - }, - { - name: "invalid opcode 237", - script: []byte{txscript.OP_UNKNOWN237}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN237", - }, - { - name: "invalid opcode 238", - script: []byte{txscript.OP_UNKNOWN238}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN238", - }, - { - name: "invalid opcode 239", - script: []byte{txscript.OP_UNKNOWN239}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN239", - }, - { - name: "invalid opcode 240", - script: []byte{txscript.OP_UNKNOWN240}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN240", - }, - { - name: "invalid opcode 241", - script: []byte{txscript.OP_UNKNOWN241}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN241", - }, - { - name: "invalid opcode 242", - script: []byte{txscript.OP_UNKNOWN242}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN242", - }, - { - name: "invalid opcode 243", - script: []byte{txscript.OP_UNKNOWN243}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN243", - }, - { - name: "invalid opcode 244", - script: []byte{txscript.OP_UNKNOWN244}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN244", - }, - { - name: "invalid opcode 245", - script: []byte{txscript.OP_UNKNOWN245}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN245", - }, - { - name: "invalid opcode 246", - script: []byte{txscript.OP_UNKNOWN246}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN246", - }, - { - name: "invalid opcode 247", - script: []byte{txscript.OP_UNKNOWN247}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN247", - }, - { - name: "invalid opcode 248", - script: []byte{txscript.OP_UNKNOWN248}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN248", - }, - { - name: "invalid opcode OP_SMALLDATA", - script: []byte{txscript.OP_SMALLDATA}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_SMALLDATA", - }, - { - name: "invalid opcode OP_SMALLINTEGER", - script: []byte{txscript.OP_SMALLINTEGER}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_SMALLINTEGER", - }, - { - name: "invalid opcode OP_PUBKEYS", - script: []byte{txscript.OP_PUBKEYS}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_PUBKEYS", - }, - { - name: "invalid opcode 252", - script: []byte{txscript.OP_UNKNOWN252}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_UNKNOWN252", - }, - { - name: "invalid opcode OP_PUBKEYHASH", - script: []byte{txscript.OP_PUBKEYHASH}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_PUBKEYHASH", - }, - { - name: "invalid opcode OP_PUBKEY", - script: []byte{txscript.OP_PUBKEY}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_PUBKEY", - }, - { - name: "invalid opcode OP_INVALIDOPCODE", - script: []byte{txscript.OP_INVALIDOPCODE}, - expectedReturn: txscript.ErrStackInvalidOpcode, - disassembly: "OP_INVALIDOPCODE", - }, - - { - name: "invalid opcode 186 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN186, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN186 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 187 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN187, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN187 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 188 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN188, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN188 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 189 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN189, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN189 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 190 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN190, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN190 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 191 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN191, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN191 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 192 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN192, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN192 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 193 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN193, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN193 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 194 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN194, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN194 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 195 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN195, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN195 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 196 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN196, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN196 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 197 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN197, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN197 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 198 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN198, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN198 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 199 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN199, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN199 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 200 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN200, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN200 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 201 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN201, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN201 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 202 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN202, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN202 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 203 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN203, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN203 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 204 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN204, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN204 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 205 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN205, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN205 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 206 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN206, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN206 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 207 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN207, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN207 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 208 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN208, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN208 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 209 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN209, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN209 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 210 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN210, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN210 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 211 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN211, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN211 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 212 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN212, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN212 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 213 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN213, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN213 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 214 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN214, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN214 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 215 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN215, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN215 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 216 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN216, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN216 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 217 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN217, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN217 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 218 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN218, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN218 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 219 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN219, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN219 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 220 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN220, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN220 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 221 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN221, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN221 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 222 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN222, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN222 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 223 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN223, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN223 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 224 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN224, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN224 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 225 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN225, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN225 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 226 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN226, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN226 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 227 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN227, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN227 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 228 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN228, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN228 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 229 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN229, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN229 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 230 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN230, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN230 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 231 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN231, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN231 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 232 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN232, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN232 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 233 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN233, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN233 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 234 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN234, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN234 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 235 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN235, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN235 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 236 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN236, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN236 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 237 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN237, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN237 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 238 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN238, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN238 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 239 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN239, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN239 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 240 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN240, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN240 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 241 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN241, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN241 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 242 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN242, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN242 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 243 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN243, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN243 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 244 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN244, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN244 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 245 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN245, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN245 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 246 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN246, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN246 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 247 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN247, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN247 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 248 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN248, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN248 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode OP_SMALLDATA if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_SMALLDATA, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_SMALLDATA OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode OP_SMALLINTEGER if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_SMALLINTEGER, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_SMALLINTEGER OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode OP_PUBKEYS if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_PUBKEYS, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_PUBKEYS OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode 252 if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_UNKNOWN252, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_UNKNOWN252 OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode OP_PUBKEYHASH if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_PUBKEYHASH, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_PUBKEYHASH OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode OP_PUBKEY if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_PUBKEY, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_PUBKEY OP_ELSE 1 OP_ENDIF", - }, - { - name: "invalid opcode OP_INVALIDOPCODE if noexec", - script: []byte{txscript.OP_FALSE, txscript.OP_IF, txscript.OP_INVALIDOPCODE, txscript.OP_ELSE, txscript.OP_TRUE, txscript.OP_ENDIF}, - after: [][]byte{{0x01}}, - disassembly: "0 OP_IF OP_INVALIDOPCODE OP_ELSE 1 OP_ENDIF", - }, -} - -func stacksEqual(a, b [][]byte) bool { - if len(a) != len(b) { - return false - } - - for i := range a { - if !bytes.Equal(a[i], b[i]) { - return false - } - } - return true -} - -func testOpcode(t *testing.T, test *detailedTest) { - // mock up fake tx. - tx := &wire.MsgTx{ - Version: 1, - TxIn: []*wire.TxIn{ - { - PreviousOutPoint: wire.OutPoint{ - Hash: wire.ShaHash{}, - Index: 0xffffffff, - }, - SignatureScript: []byte{}, - Sequence: 0xffffffff, - }, - }, - TxOut: []*wire.TxOut{ - { - Value: 0x12a05f200, - PkScript: []byte{}, - }, - }, - LockTime: 0, - } - - tx.TxOut[0].PkScript = test.script - - vm, err := txscript.NewEngine(tx.TxOut[0].PkScript, tx, 0, 0) - if err != nil { - if err != test.expectedReturn { - t.Errorf("Error return not expected %s: %v %v", - test.name, test.expectedReturn, err) - return - } - return - } - vm.SetStack(test.before) - vm.SetAltStack(test.altbefore) - - // test disassembly engine. - // pc is at start of script 1, so check that DisasmScript matches - // DisasmPc. Only run this if we have a disassembly for the test. - // sine one of them have invalid instruction sequences and won't - // disassemble. - var disScript, disPC string - if test.disassembly != "" { - dis0, err := vm.DisasmScript(0) - if err != nil { - t.Errorf("%s: failed to disassemble script0: %v", - test.name, err) - } - if dis0 != "" { - t.Errorf("%s: disassembly of empty script gave \"%s\"", - test.name, dis0) - } - disScript, err = vm.DisasmScript(1) - if err != nil { - t.Errorf("%s: failed to disassemble script: %v", - test.name, err) - } - _, err = vm.DisasmScript(2) - if err != txscript.ErrStackInvalidIndex { - t.Errorf("%s: got unexpected error for invalid "+ - "disassembly index: \"%v\"", test.name, err) - } - } - - done := false - for !done { - if test.disassembly != "" { - disCurPC, err := vm.DisasmPC() - if err != nil { - t.Errorf("failed to disassemble pc for %s: %v", - test.name, err) - } - disPC += disCurPC + "\n" - } - - done, err = vm.Step() - if err != nil { - if err != test.expectedReturn { - t.Errorf("Error return not expected %s: %v %v", - test.name, test.expectedReturn, err) - return - } - return - } - } - if err != test.expectedReturn { - t.Errorf("Error return not expected %s: %v %v", - test.name, test.expectedReturn, err) - } - - if test.disassembly != "" { - if disScript != disPC { - t.Errorf("script disassembly doesn't match pc "+ - "disassembly for %s: pc: \"%s\" script: \"%s\"", - test.name, disScript, disPC) - } - } - - after := vm.GetStack() - if !stacksEqual(after, test.after) { - t.Errorf("Stacks not equal after %s:\ngot:\n%vexp:\n%v", - test.name, after, test.after) - } - altafter := vm.GetAltStack() - if !stacksEqual(altafter, test.altafter) { - t.Errorf("AltStacks not equal after %s:\n got:\n%vexp:\n%v", - test.name, altafter, test.altafter) - } -} - -func TestOpcodes(t *testing.T) { - t.Parallel() - - for i := range detailedTests { - testOpcode(t, &detailedTests[i]) - } -} - -func testDisasmString(t *testing.T, test *detailedTest) { - // mock up fake tx. - dis, err := txscript.DisasmString(test.script) - if err != nil { - if err != test.disassemblyerr { - t.Errorf("%s: disassembly got error %v expected %v", test.name, - err, test.disassemblyerr) - } - return - } - if test.disassemblyerr != nil { - t.Errorf("%s: expected error %v, got %s", test.name, - test.disassemblyerr, dis) - return - } - if dis != test.disassembly { - t.Errorf("Disassembly for %s doesn't match expected "+ - "got: \"%s\" expected: \"%s\"", test.name, dis, - test.disassembly) - } -} - -func TestDisasmStrings(t *testing.T) { - t.Parallel() - - for i := range detailedTests { - testDisasmString(t, &detailedTests[i]) - } -} - -// A basic test of GetSigOpCount for most opcodes, we do this by -// running the same test for every one of the detailed tests. Since -// disassembly errors are always parse errors, and so are -// sigops count errors we use the same error code. -// While this isn't as precise as using full transaction scripts, this gives -// us coverage over a wider range of opcodes. -func TestSigOps(t *testing.T) { - t.Parallel() - - for _, test := range detailedTests { - count := txscript.GetSigOpCount(test.script) - if count != test.nSigOps { - t.Errorf("%s: expected count of %d, got %d", test.name, - test.nSigOps, count) - - } - } -} - -// A basic test of GetPreciseSigOpCount for most opcodes, we do this by -// running the same test for every one of the detailed tests with a fake -// sigscript. Since disassembly errors are always parse errors, and so are -// sigops count errors we use the same error code. -// While this isn't as precise as using full transaction scripts, this gives -// us coverage over a wider range of opcodes. See script_test.go for tests -// using real transactions to provide a bit more coverage. -func TestPreciseSigOps(t *testing.T) { - t.Parallel() - - for _, test := range detailedTests { - count := txscript.GetPreciseSigOpCount( - []byte{txscript.OP_1}, test.script, false) - if count != test.nPreciseSigOps { - t.Errorf("%s: expected count of %d, got %d", test.name, - test.nPreciseSigOps, count) - - } - } -} diff --git a/txscript/stack_test.go b/txscript/stack_test.go index 96edd5e5..269f3605 100644 --- a/txscript/stack_test.go +++ b/txscript/stack_test.go @@ -605,16 +605,6 @@ func TestStack(t *testing.T) { ErrStackUnderflow, [][]byte{{2}, {3}}, }, - { - "Nip too much", - [][]byte{{1}, {2}, {3}}, - func(s *stack) error { - // bite off more than we can chew - return s.NipN(3) - }, - ErrStackUnderflow, - [][]byte{{2}, {3}}, - }, { "keep on tucking", [][]byte{{1}, {2}, {3}},