From bac455cdd2326897b3e56539081cdd19212504e9 Mon Sep 17 00:00:00 2001 From: "Owain G. Ainsworth" <oga@conformal.com> Date: Thu, 20 Jun 2013 00:30:34 +0100 Subject: [PATCH] Fix reversed test bug with the max operations handling We were counting the number of push ops instead of the number of non push ops. Add tests that found this (checking tha the max operations check fires). --- opcode.go | 2 +- opcode_test.go | 419 ++++++++++++++++++++++++++++++++++++++++++++++ test_coverage.txt | 68 ++++---- 3 files changed, 454 insertions(+), 35 deletions(-) diff --git a/opcode.go b/opcode.go index 613b8361..613fd74f 100644 --- a/opcode.go +++ b/opcode.go @@ -654,7 +654,7 @@ func (pop *parsedOpcode) exec(s *Script) error { // *sigh* bitcoind pretty much mandates that we violate layering here. // Any opcode that isn't just adding data to the stack counts here // as an operation. - if pop.opcode.value < OP_16 { + if pop.opcode.value > OP_16 { s.numOps++ if s.numOps > MaxOpsPerScript { return StackErrTooManyOperations diff --git a/opcode_test.go b/opcode_test.go index 3970b10d..dbbecd30 100644 --- a/opcode_test.go +++ b/opcode_test.go @@ -2400,6 +2400,425 @@ var detailedTests = []detailedTest{ expectedReturn: btcscript.StackErrVerifyFailed, disassembly: "OP_1 304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901 OP_1 OP_1 OP_1 OP_CHECKMULTISIGVERIFY", }, + { + // 201 operations + one push, should just fit limits + name: "max operations", + script: []byte{btcscript.OP_1, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + }, + after: [][]byte{{1}, {1}}, + disassembly: "OP_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{btcscript.OP_1, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + btcscript.OP_DUP, + btcscript.OP_DROP, + }, + expectedReturn: btcscript.StackErrTooManyOperations, + disassembly: "OP_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", + }, { name: "OP_CAT disabled", script: []byte{btcscript.OP_CAT}, diff --git a/test_coverage.txt b/test_coverage.txt index 83ce72b9..cd1b94d6 100644 --- a/test_coverage.txt +++ b/test_coverage.txt @@ -2,55 +2,56 @@ github.com/conformal/btcscript/stack.go asInt 100.00% (18/18) github.com/conformal/btcscript/stack.go fromInt 100.00% (14/14) github.com/conformal/btcscript/opcode.go opcodeWithin 100.00% (13/13) +github.com/conformal/btcscript/opcode.go parsedOpcode.bytes 100.00% (12/12) github.com/conformal/btcscript/stack.go Stack.nipN 100.00% (12/12) github.com/conformal/btcscript/opcode.go parsedOpcode.print 100.00% (12/12) -github.com/conformal/btcscript/opcode.go parsedOpcode.bytes 100.00% (12/12) -github.com/conformal/btcscript/opcode.go opcodeNotIf 100.00% (11/11) github.com/conformal/btcscript/opcode.go opcodeIf 100.00% (11/11) +github.com/conformal/btcscript/opcode.go opcodeNotIf 100.00% (11/11) +github.com/conformal/btcscript/opcode.go opcodeLessThanOrEqual 100.00% (10/10) github.com/conformal/btcscript/opcode.go opcodeGreaterThan 100.00% (10/10) github.com/conformal/btcscript/opcode.go opcodeLessThan 100.00% (10/10) github.com/conformal/btcscript/opcode.go opcodeNumNotEqual 100.00% (10/10) github.com/conformal/btcscript/opcode.go opcodeBoolOr 100.00% (10/10) github.com/conformal/btcscript/opcode.go opcodeBoolAnd 100.00% (10/10) -github.com/conformal/btcscript/opcode.go opcodeMin 100.00% (10/10) github.com/conformal/btcscript/opcode.go opcodeNumEqual 100.00% (10/10) -github.com/conformal/btcscript/stack.go Stack.Tuck 100.00% (10/10) github.com/conformal/btcscript/opcode.go opcodeMax 100.00% (10/10) +github.com/conformal/btcscript/stack.go Stack.Tuck 100.00% (10/10) +github.com/conformal/btcscript/opcode.go opcodeMin 100.00% (10/10) github.com/conformal/btcscript/opcode.go opcodeGreaterThanOrEqual 100.00% (10/10) -github.com/conformal/btcscript/opcode.go opcodeLessThanOrEqual 100.00% (10/10) -github.com/conformal/btcscript/stack.go Stack.OverN 100.00% (9/9) -github.com/conformal/btcscript/script.go DisasmString 100.00% (9/9) github.com/conformal/btcscript/stack.go Stack.RotN 100.00% (9/9) +github.com/conformal/btcscript/script.go DisasmString 100.00% (9/9) github.com/conformal/btcscript/stack.go Stack.SwapN 100.00% (9/9) +github.com/conformal/btcscript/stack.go Stack.OverN 100.00% (9/9) github.com/conformal/btcscript/opcode.go opcodeEqual 100.00% (8/8) +github.com/conformal/btcscript/opcode.go opcodeAdd 100.00% (8/8) github.com/conformal/btcscript/opcode.go opcodeSub 100.00% (8/8) github.com/conformal/btcscript/stack.go Stack.DupN 100.00% (8/8) -github.com/conformal/btcscript/opcode.go opcodeAdd 100.00% (8/8) github.com/conformal/btcscript/opcode.go opcodePick 100.00% (7/7) -github.com/conformal/btcscript/opcode.go opcodeRoll 100.00% (7/7) -github.com/conformal/btcscript/stack.go Stack.DropN 100.00% (7/7) github.com/conformal/btcscript/opcode.go opcodeNot 100.00% (7/7) +github.com/conformal/btcscript/stack.go Stack.DropN 100.00% (7/7) github.com/conformal/btcscript/opcode.go opcode0NotEqual 100.00% (7/7) -github.com/conformal/btcscript/opcode.go parsedOpcode.conditional 100.00% (6/6) -github.com/conformal/btcscript/opcode.go opcodeIfDup 100.00% (6/6) -github.com/conformal/btcscript/opcode.go opcodeVerify 100.00% (6/6) +github.com/conformal/btcscript/opcode.go opcodeRoll 100.00% (7/7) github.com/conformal/btcscript/opcode.go opcodeElse 100.00% (6/6) -github.com/conformal/btcscript/opcode.go opcodeHash160 100.00% (5/5) +github.com/conformal/btcscript/opcode.go opcodeIfDup 100.00% (6/6) +github.com/conformal/btcscript/opcode.go parsedOpcode.conditional 100.00% (6/6) +github.com/conformal/btcscript/opcode.go opcodeVerify 100.00% (6/6) +github.com/conformal/btcscript/opcode.go opcodeHash256 100.00% (5/5) github.com/conformal/btcscript/script.go removeOpcode 100.00% (5/5) github.com/conformal/btcscript/script.go removeOpcodeByData 100.00% (5/5) github.com/conformal/btcscript/stack.go Stack.PickN 100.00% (5/5) -github.com/conformal/btcscript/opcode.go opcodeAbs 100.00% (5/5) -github.com/conformal/btcscript/opcode.go opcodeHash256 100.00% (5/5) +github.com/conformal/btcscript/opcode.go parsedOpcode.exec 100.00% (5/5) +github.com/conformal/btcscript/stack.go Stack.RollN 100.00% (5/5) github.com/conformal/btcscript/opcode.go opcodeToAltStack 100.00% (5/5) github.com/conformal/btcscript/opcode.go opcodeFromAltStack 100.00% (5/5) +github.com/conformal/btcscript/opcode.go opcodeSha256 100.00% (5/5) github.com/conformal/btcscript/opcode.go opcodeRipemd160 100.00% (5/5) github.com/conformal/btcscript/opcode.go opcodeNegate 100.00% (5/5) -github.com/conformal/btcscript/opcode.go opcodeSha256 100.00% (5/5) -github.com/conformal/btcscript/opcode.go opcodeSize 100.00% (5/5) +github.com/conformal/btcscript/opcode.go opcodeHash160 100.00% (5/5) +github.com/conformal/btcscript/opcode.go opcodeAbs 100.00% (5/5) github.com/conformal/btcscript/script.go Script.validPC 100.00% (5/5) github.com/conformal/btcscript/opcode.go opcode1Add 100.00% (5/5) github.com/conformal/btcscript/opcode.go opcode1Sub 100.00% (5/5) -github.com/conformal/btcscript/stack.go Stack.RollN 100.00% (5/5) +github.com/conformal/btcscript/opcode.go opcodeSize 100.00% (5/5) github.com/conformal/btcscript/stack.go Stack.PeekBool 100.00% (4/4) github.com/conformal/btcscript/opcode.go opcodeEndif 100.00% (4/4) github.com/conformal/btcscript/opcode.go opcodeEqualVerify 100.00% (4/4) @@ -65,38 +66,35 @@ github.com/conformal/btcscript/script.go unparseScript 100.00% (4/4) github.com/conformal/btcscript/script.go Script.curPC 100.00% (4/4) github.com/conformal/btcscript/script.go Script.DisasmPC 100.00% (4/4) github.com/conformal/btcscript/script.go getStack 100.00% (4/4) -github.com/conformal/btcscript/address.go ScriptType.String 100.00% (3/3) github.com/conformal/btcscript/stack.go fromBool 100.00% (3/3) -github.com/conformal/btcscript/script.go scriptUInt32 100.00% (3/3) -github.com/conformal/btcscript/script.go scriptUInt8 100.00% (3/3) -github.com/conformal/btcscript/script.go setStack 100.00% (3/3) +github.com/conformal/btcscript/address.go ScriptType.String 100.00% (3/3) github.com/conformal/btcscript/script.go scriptUInt16 100.00% (3/3) +github.com/conformal/btcscript/script.go setStack 100.00% (3/3) +github.com/conformal/btcscript/script.go scriptUInt8 100.00% (3/3) +github.com/conformal/btcscript/script.go scriptUInt32 100.00% (3/3) github.com/conformal/btcscript/stack.go Stack.NipN 100.00% (2/2) github.com/conformal/btcscript/stack.go Stack.Depth 100.00% (2/2) github.com/conformal/btcscript/opcode.go calcHash 100.00% (2/2) -github.com/conformal/btcscript/opcode.go opcodeFalse 100.00% (2/2) github.com/conformal/btcscript/opcode.go opcodeDepth 100.00% (2/2) -github.com/conformal/btcscript/opcode.go opcode1Negate 100.00% (2/2) github.com/conformal/btcscript/opcode.go opcodeN 100.00% (2/2) github.com/conformal/btcscript/opcode.go opcodeCodeSeparator 100.00% (2/2) +github.com/conformal/btcscript/opcode.go opcode1Negate 100.00% (2/2) +github.com/conformal/btcscript/opcode.go opcodeFalse 100.00% (2/2) github.com/conformal/btcscript/opcode.go opcodePushData 100.00% (2/2) -github.com/conformal/btcscript/opcode.go opcode2Rot 100.00% (1/1) +github.com/conformal/btcscript/opcode.go opcodeNop 100.00% (1/1) github.com/conformal/btcscript/opcode.go opcode3Dup 100.00% (1/1) -github.com/conformal/btcscript/opcode.go opcode2Dup 100.00% (1/1) github.com/conformal/btcscript/opcode.go calcHash160 100.00% (1/1) +github.com/conformal/btcscript/opcode.go opcode2Dup 100.00% (1/1) github.com/conformal/btcscript/opcode.go opcode2Drop 100.00% (1/1) github.com/conformal/btcscript/opcode.go opcodeReturn 100.00% (1/1) -github.com/conformal/btcscript/opcode.go opcodeNop 100.00% (1/1) github.com/conformal/btcscript/stack.go Stack.PushByteArray 100.00% (1/1) github.com/conformal/btcscript/stack.go Stack.PushInt 100.00% (1/1) +github.com/conformal/btcscript/opcode.go opcode2Over 100.00% (1/1) github.com/conformal/btcscript/stack.go Stack.PopByteArray 100.00% (1/1) github.com/conformal/btcscript/opcode.go opcodeInvalid 100.00% (1/1) github.com/conformal/btcscript/opcode.go opcodeReserved 100.00% (1/1) github.com/conformal/btcscript/opcode.go opcodeDisabled 100.00% (1/1) -github.com/conformal/btcscript/script.go isPubkey 100.00% (1/1) github.com/conformal/btcscript/opcode.go init 100.00% (1/1) -github.com/conformal/btcscript/script.go Script.subScript 100.00% (1/1) -github.com/conformal/btcscript/log.go UseLogger 100.00% (1/1) github.com/conformal/btcscript/script.go Script.SetStack 100.00% (1/1) github.com/conformal/btcscript/script.go isPubkeyHash 100.00% (1/1) github.com/conformal/btcscript/script.go isScriptHash 100.00% (1/1) @@ -113,10 +111,13 @@ github.com/conformal/btcscript/opcode.go opcodeNip 100.00% (1/1) github.com/conformal/btcscript/opcode.go opcodeDup 100.00% (1/1) github.com/conformal/btcscript/opcode.go opcodeDrop 100.00% (1/1) github.com/conformal/btcscript/opcode.go opcode2Swap 100.00% (1/1) +github.com/conformal/btcscript/opcode.go opcode2Rot 100.00% (1/1) github.com/conformal/btcscript/script.go Script.GetStack 100.00% (1/1) github.com/conformal/btcscript/log.go newLogClosure 100.00% (1/1) -github.com/conformal/btcscript/opcode.go opcode2Over 100.00% (1/1) +github.com/conformal/btcscript/script.go isPubkey 100.00% (1/1) github.com/conformal/btcscript/stack.go Stack.PushBool 100.00% (1/1) +github.com/conformal/btcscript/script.go Script.subScript 100.00% (1/1) +github.com/conformal/btcscript/log.go UseLogger 100.00% (1/1) github.com/conformal/btcscript/opcode.go opcodeCheckMultiSig 96.43% (54/56) github.com/conformal/btcscript/opcode.go opcodeCheckSig 96.15% (25/26) github.com/conformal/btcscript/script.go NewScript 95.24% (20/21) @@ -125,7 +126,6 @@ github.com/conformal/btcscript/script.go parseScript 93.75% (30/32) github.com/conformal/btcscript/script.go Script.Step 91.89% (34/37) github.com/conformal/btcscript/script.go typeOfScript 83.33% (5/6) github.com/conformal/btcscript/script.go Script.DisasmScript 80.00% (4/5) -github.com/conformal/btcscript/opcode.go parsedOpcode.exec 80.00% (4/5) github.com/conformal/btcscript/script.go isPushOnly 75.00% (3/4) github.com/conformal/btcscript/opcode.go opcodeCheckSigVerify 75.00% (3/4) github.com/conformal/btcscript/script.go Script.calcScriptHash 71.43% (25/35) @@ -135,5 +135,5 @@ github.com/conformal/btcscript/opcode.go opcodeSha1 60.00% (3/5) github.com/conformal/btcscript/script.go Script.Execute 44.44% (8/18) github.com/conformal/btcscript/log.go SetLogWriter 0.00% (0/7) github.com/conformal/btcscript/log.go logClosure.String 0.00% (0/1) -github.com/conformal/btcscript -------------------------- 93.76% (841/897) +github.com/conformal/btcscript -------------------------- 93.87% (842/897)