Discourage NOPs reserved for soft-fork upgrades

NOP1 through NOP10 are reserved for future soft-fork upgrades.  When
such an upgrade occurs, the NOP argument will then require verification.
Rejecting transactions that contain these NOPs into the mempool will
discourage those transactions from being mined elsewhere and ensure
btcd will never mine such transactions.  This prevents now
invalid scripts (according to the majority of hashing power) even if the
client has not yet upgraded.

Non-executed upgradable NOPs are still allowed as they will still be
valid post-upgrade.

Mimics Bitcoin Core commit 03914234b3c9c35d66b51d580fe727a0707394ca
This commit is contained in:
David Hill 2014-12-23 12:15:41 -05:00
parent af5cbe4b4f
commit f513518b4f
6 changed files with 251 additions and 199 deletions

View file

@ -154,6 +154,22 @@
["1","NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10 2 EQUAL", "P2SH,STRICTENC"], ["1","NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10 2 EQUAL", "P2SH,STRICTENC"],
["'NOP_1_to_10' NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10","'NOP_1_to_11' EQUAL", "P2SH,STRICTENC"], ["'NOP_1_to_10' NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10","'NOP_1_to_11' EQUAL", "P2SH,STRICTENC"],
["Ensure 100% coverage of discouraged NOPS"],
["1", "NOP1", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
["1", "NOP2", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
["1", "NOP3", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
["1", "NOP4", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
["1", "NOP5", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
["1", "NOP6", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
["1", "NOP7", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
["1", "NOP8", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
["1", "NOP9", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
["1", "NOP10", "P2SH,DISCOURAGE_UPGRADABLE_NOPS"],
["NOP10", "1", "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "Discouraged NOP10 in scriptSig"],
["1 0x01 0xb9", "HASH160 0x14 0x15727299b05b45fdaf9ac9ecf7565cfe27c3e567 EQUAL", "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "Discouraged NOP10 in redeemScript"],
["0x50","1", "P2SH,STRICTENC", "opcode 0x50 is reserved"], ["0x50","1", "P2SH,STRICTENC", "opcode 0x50 is reserved"],
["1", "IF 0xba ELSE 1 ENDIF", "P2SH,STRICTENC", "opcodes above NOP10 invalid if executed"], ["1", "IF 0xba ELSE 1 ENDIF", "P2SH,STRICTENC", "opcodes above NOP10 invalid if executed"],
["1", "IF 0xbb ELSE 1 ENDIF", "P2SH,STRICTENC"], ["1", "IF 0xbb ELSE 1 ENDIF", "P2SH,STRICTENC"],

View file

@ -226,6 +226,10 @@
["1","NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10 1 EQUAL", "P2SH,STRICTENC"], ["1","NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10 1 EQUAL", "P2SH,STRICTENC"],
["'NOP_1_to_10' NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10","'NOP_1_to_10' EQUAL", "P2SH,STRICTENC"], ["'NOP_1_to_10' NOP1 NOP2 NOP3 NOP4 NOP5 NOP6 NOP7 NOP8 NOP9 NOP10","'NOP_1_to_10' EQUAL", "P2SH,STRICTENC"],
["1", "NOP", "P2SH,STRICTENC,DISCOURAGE_UPGRADABLE_NOPS", "Discourage NOPx flag allows OP_NOP"],
["0", "IF NOP10 ENDIF 1", "P2SH,STRICTENC,DISCOURAGE_UPGRADABLE_NOPS", "Discouraged NOPs are allowed if not executed"],
["0", "IF 0xba ELSE 1 ENDIF", "P2SH,STRICTENC", "opcodes above NOP10 invalid if executed"], ["0", "IF 0xba ELSE 1 ENDIF", "P2SH,STRICTENC", "opcodes above NOP10 invalid if executed"],
["0", "IF 0xbb ELSE 1 ENDIF", "P2SH,STRICTENC"], ["0", "IF 0xbb ELSE 1 ENDIF", "P2SH,STRICTENC"],
["0", "IF 0xbc ELSE 1 ENDIF", "P2SH,STRICTENC"], ["0", "IF 0xbc ELSE 1 ENDIF", "P2SH,STRICTENC"],

View file

@ -3806,15 +3806,19 @@ func TestBitcoindInvalidTests(t *testing.T) {
var tests [][]string var tests [][]string
err = json.Unmarshal(file, &tests) err = json.Unmarshal(file, &tests)
if err != nil { if err != nil {
t.Errorf("TestBitcoindInvalidTests couldn't Unmarshal: %v\n", t.Errorf("TestBitcoindInvalidTests couldn't Unmarshal: %v",
err) err)
return return
} }
tx := btcwire.NewMsgTx() tx := btcwire.NewMsgTx()
for x, test := range tests { for x, test := range tests {
// Skip comments
if len(test) == 1 {
continue
}
name, err := testName(test) name, err := testName(test)
if err != nil { if err != nil {
t.Errorf("TestBitcoindInvalidTests: invalid test #%d\n", t.Errorf("TestBitcoindInvalidTests: invalid test #%d",
x) x)
continue continue
} }
@ -3857,15 +3861,19 @@ func TestBitcoindValidTests(t *testing.T) {
var tests [][]string var tests [][]string
err = json.Unmarshal(file, &tests) err = json.Unmarshal(file, &tests)
if err != nil { if err != nil {
t.Errorf("TestBitcoindValidTests couldn't Unmarshal: %v\n", t.Errorf("TestBitcoindValidTests couldn't Unmarshal: %v",
err) err)
return return
} }
tx := btcwire.NewMsgTx() tx := btcwire.NewMsgTx()
for x, test := range tests { for x, test := range tests {
// Skip comments
if len(test) == 1 {
continue
}
name, err := testName(test) name, err := testName(test)
if err != nil { if err != nil {
t.Errorf("TestBitcoindValidTests: invalid test #%d\n", t.Errorf("TestBitcoindValidTests: invalid test #%d",
x) x)
continue continue
} }
@ -4195,6 +4203,8 @@ func parseScriptFlags(flagStr string) (ScriptFlags, error) {
sFlags := strings.Split(flagStr, ",") sFlags := strings.Split(flagStr, ",")
for _, flag := range sFlags { for _, flag := range sFlags {
switch flag { switch flag {
case "DISCOURAGE_UPGRADABLE_NOPS":
flags |= ScriptDiscourageUpgradableNops
case "NONE": case "NONE":
// Nothing. // Nothing.
case "NULLDUMMY": case "NULLDUMMY":

View file

@ -1085,7 +1085,13 @@ func opcodeN(op *parsedOpcode, s *Script) error {
} }
func opcodeNop(op *parsedOpcode, s *Script) error { func opcodeNop(op *parsedOpcode, s *Script) error {
// This page left intentionally blank switch op.opcode.value {
case OP_NOP1, OP_NOP2, OP_NOP3, OP_NOP4, OP_NOP5,
OP_NOP6, OP_NOP7, OP_NOP8, OP_NOP9, OP_NOP10:
if s.discourageUpgradableNops {
return fmt.Errorf("%s reserved for soft-fork upgrades", opcodemap[op.opcode.value].name)
}
}
return nil return nil
} }

View file

@ -208,6 +208,7 @@ type Script struct {
bip16 bool // treat execution as pay-to-script-hash bip16 bool // treat execution as pay-to-script-hash
der bool // enforce DER encoding der bool // enforce DER encoding
strictMultiSig bool // verify multisig stack item is zero length strictMultiSig bool // verify multisig stack item is zero length
discourageUpgradableNops bool // NOP1 to NOP10 are reserved for future soft-fork upgrades
savedFirstStack [][]byte // stack from first script for bip16 scripts savedFirstStack [][]byte // stack from first script for bip16 scripts
} }
@ -513,6 +514,14 @@ const (
// ScriptStrictMultiSig defines whether to verify the stack item // ScriptStrictMultiSig defines whether to verify the stack item
// used by CHECKMULTISIG is zero length. // used by CHECKMULTISIG is zero length.
ScriptStrictMultiSig ScriptStrictMultiSig
// ScriptDiscourageUpgradableNops defines whether to verify that
// NOP1 through NOP10 are reserved for future soft-fork upgrades. This
// flag must not be used for consensus critical code nor applied to
// blocks as this flag is only for stricter standard transaction
// checks. This flag is only applied when the above opcodes are
// executed.
ScriptDiscourageUpgradableNops
) )
// NewScript returns a new script engine for the provided tx and input idx with // NewScript returns a new script engine for the provided tx and input idx with
@ -558,6 +567,9 @@ func NewScript(scriptSig []byte, scriptPubKey []byte, txidx int, tx *btcwire.Msg
if flags&ScriptStrictMultiSig == ScriptStrictMultiSig { if flags&ScriptStrictMultiSig == ScriptStrictMultiSig {
m.strictMultiSig = true m.strictMultiSig = true
} }
if flags&ScriptDiscourageUpgradableNops == ScriptDiscourageUpgradableNops {
m.discourageUpgradableNops = true
}
m.tx = *tx m.tx = *tx
m.txidx = txidx m.txidx = txidx

View file

@ -1,182 +1,186 @@
github.com/conformal/btcscript/script.go calcScriptHash 100.00% (39/39) github.com/btcsuite/btcscript/script.go calcScriptHash 100.00% (39/39)
github.com/conformal/btcscript/script.go Script.Step 100.00% (37/37) github.com/btcsuite/btcscript/script.go Script.Step 100.00% (37/37)
github.com/conformal/btcscript/script.go parseScriptTemplate 100.00% (29/29) github.com/btcsuite/btcscript/script.go parseScriptTemplate 100.00% (29/29)
github.com/conformal/btcscript/opcode.go opcodeCheckSig 100.00% (29/29) github.com/btcsuite/btcscript/opcode.go opcodeCheckSig 100.00% (29/29)
github.com/conformal/btcscript/address.go ExtractPkScriptAddrs 100.00% (27/27) github.com/btcsuite/btcscript/script.go NewScript 100.00% (27/27)
github.com/conformal/btcscript/script.go NewScript 100.00% (25/25) github.com/btcsuite/btcscript/address.go ExtractPkScriptAddrs 100.00% (27/27)
github.com/conformal/btcscript/script.go CalcScriptInfo 100.00% (25/25) github.com/btcsuite/btcscript/scriptbuilder.go ScriptBuilder.addData 100.00% (25/25)
github.com/conformal/btcscript/stack.go asInt 100.00% (23/23) github.com/btcsuite/btcscript/script.go CalcScriptInfo 100.00% (25/25)
github.com/conformal/btcscript/opcode.go parsedOpcode.bytes 100.00% (23/23) github.com/btcsuite/btcscript/stack.go asInt 100.00% (23/23)
github.com/conformal/btcscript/scriptbuilder.go ScriptBuilder.AddData 100.00% (22/22) github.com/btcsuite/btcscript/opcode.go parsedOpcode.bytes 100.00% (23/23)
github.com/conformal/btcscript/opcode.go parsedOpcode.disabled 100.00% (17/17) github.com/btcsuite/btcscript/opcode.go parsedOpcode.disabled 100.00% (17/17)
github.com/conformal/btcscript/opcode.go parsedOpcode.print 100.00% (16/16) github.com/btcsuite/btcscript/opcode.go parsedOpcode.print 100.00% (16/16)
github.com/conformal/btcscript/stack.go Stack.nipN 100.00% (15/15) github.com/btcsuite/btcscript/stack.go Stack.nipN 100.00% (15/15)
github.com/conformal/btcscript/stack.go fromInt 100.00% (14/14) github.com/btcsuite/btcscript/scriptbuilder.go canonicalDataSize 100.00% (14/14)
github.com/conformal/btcscript/opcode.go parsedOpcode.exec 100.00% (13/13) github.com/btcsuite/btcscript/stack.go fromInt 100.00% (14/14)
github.com/conformal/btcscript/script.go GetPreciseSigOpCount 100.00% (13/13) github.com/btcsuite/btcscript/opcode.go opcodeWithin 100.00% (13/13)
github.com/conformal/btcscript/opcode.go opcodeWithin 100.00% (13/13) github.com/btcsuite/btcscript/scriptbuilder.go ScriptBuilder.AddUint64 100.00% (13/13)
github.com/conformal/btcscript/script.go isMultiSig 100.00% (13/13) github.com/btcsuite/btcscript/opcode.go parsedOpcode.exec 100.00% (13/13)
github.com/conformal/btcscript/opcode.go opcodeIf 100.00% (11/11) github.com/btcsuite/btcscript/script.go isMultiSig 100.00% (13/13)
github.com/conformal/btcscript/opcode.go opcodeNotIf 100.00% (11/11) github.com/btcsuite/btcscript/scriptbuilder.go ScriptBuilder.AddInt64 100.00% (13/13)
github.com/conformal/btcscript/script.go PayToAddrScript 100.00% (11/11) github.com/btcsuite/btcscript/scriptbuilder.go ScriptBuilder.AddData 100.00% (13/13)
github.com/conformal/btcscript/script.go typeOfScript 100.00% (11/11) github.com/btcsuite/btcscript/script.go GetPreciseSigOpCount 100.00% (13/13)
github.com/conformal/btcscript/opcode.go opcodeMin 100.00% (10/10) github.com/btcsuite/btcscript/opcode.go opcodeNotIf 100.00% (11/11)
github.com/conformal/btcscript/log.go SetLogWriter 100.00% (10/10) github.com/btcsuite/btcscript/script.go typeOfScript 100.00% (11/11)
github.com/conformal/btcscript/opcode.go opcodeBoolAnd 100.00% (10/10) github.com/btcsuite/btcscript/opcode.go opcodeIf 100.00% (11/11)
github.com/conformal/btcscript/opcode.go opcodeBoolOr 100.00% (10/10) github.com/btcsuite/btcscript/script.go PayToAddrScript 100.00% (11/11)
github.com/conformal/btcscript/opcode.go opcodeNumEqual 100.00% (10/10) github.com/btcsuite/btcscript/opcode.go opcodeLessThanOrEqual 100.00% (10/10)
github.com/conformal/btcscript/opcode.go opcodeNumNotEqual 100.00% (10/10) github.com/btcsuite/btcscript/opcode.go opcodeGreaterThanOrEqual 100.00% (10/10)
github.com/conformal/btcscript/opcode.go opcodeLessThan 100.00% (10/10) github.com/btcsuite/btcscript/script.go PushedData 100.00% (10/10)
github.com/conformal/btcscript/opcode.go opcodeGreaterThan 100.00% (10/10) github.com/btcsuite/btcscript/opcode.go opcodeGreaterThan 100.00% (10/10)
github.com/conformal/btcscript/opcode.go opcodeLessThanOrEqual 100.00% (10/10) github.com/btcsuite/btcscript/opcode.go opcodeMin 100.00% (10/10)
github.com/conformal/btcscript/opcode.go opcodeGreaterThanOrEqual 100.00% (10/10) github.com/btcsuite/btcscript/opcode.go opcodeNumNotEqual 100.00% (10/10)
github.com/conformal/btcscript/opcode.go opcodeMax 100.00% (10/10) github.com/btcsuite/btcscript/stack.go Stack.Tuck 100.00% (10/10)
github.com/conformal/btcscript/script.go getSigOpCount 100.00% (10/10) github.com/btcsuite/btcscript/script.go getSigOpCount 100.00% (10/10)
github.com/conformal/btcscript/script.go PushedData 100.00% (10/10) github.com/btcsuite/btcscript/log.go SetLogWriter 100.00% (10/10)
github.com/conformal/btcscript/stack.go Stack.Tuck 100.00% (10/10) github.com/btcsuite/btcscript/opcode.go opcodeNumEqual 100.00% (10/10)
github.com/conformal/btcscript/stack.go Stack.OverN 100.00% (9/9) github.com/btcsuite/btcscript/opcode.go opcodeMax 100.00% (10/10)
github.com/conformal/btcscript/script.go SignatureScript 100.00% (9/9) github.com/btcsuite/btcscript/opcode.go opcodeBoolOr 100.00% (10/10)
github.com/conformal/btcscript/script.go Script.CheckErrorCondition 100.00% (9/9) github.com/btcsuite/btcscript/opcode.go opcodeBoolAnd 100.00% (10/10)
github.com/conformal/btcscript/stack.go Stack.SwapN 100.00% (9/9) github.com/btcsuite/btcscript/opcode.go opcodeLessThan 100.00% (10/10)
github.com/conformal/btcscript/stack.go Stack.RotN 100.00% (9/9) github.com/btcsuite/btcscript/script.go DisasmString 100.00% (9/9)
github.com/conformal/btcscript/script.go DisasmString 100.00% (9/9) github.com/btcsuite/btcscript/stack.go Stack.OverN 100.00% (9/9)
github.com/conformal/btcscript/opcode.go opcodeEqual 100.00% (8/8) github.com/btcsuite/btcscript/stack.go Stack.SwapN 100.00% (9/9)
github.com/conformal/btcscript/stack.go Stack.DupN 100.00% (8/8) github.com/btcsuite/btcscript/script.go SignatureScript 100.00% (9/9)
github.com/conformal/btcscript/script.go MultiSigScript 100.00% (8/8) github.com/btcsuite/btcscript/stack.go Stack.RotN 100.00% (9/9)
github.com/conformal/btcscript/opcode.go opcodeAdd 100.00% (8/8) github.com/btcsuite/btcscript/script.go Script.CheckErrorCondition 100.00% (9/9)
github.com/conformal/btcscript/script.go CalcMultiSigStats 100.00% (8/8) github.com/btcsuite/btcscript/script.go Script.Execute 100.00% (8/8)
github.com/conformal/btcscript/opcode.go opcodeSub 100.00% (8/8) github.com/btcsuite/btcscript/opcode.go opcodeEqual 100.00% (8/8)
github.com/conformal/btcscript/script.go Script.Execute 100.00% (8/8) github.com/btcsuite/btcscript/script.go MultiSigScript 100.00% (8/8)
github.com/conformal/btcscript/opcode.go opcode0NotEqual 100.00% (7/7) github.com/btcsuite/btcscript/script.go CalcMultiSigStats 100.00% (8/8)
github.com/conformal/btcscript/script.go HasCanonicalPushes 100.00% (7/7) github.com/btcsuite/btcscript/scriptbuilder.go ScriptBuilder.AddOp 100.00% (8/8)
github.com/conformal/btcscript/scriptbuilder.go ScriptBuilder.AddUint64 100.00% (7/7) github.com/btcsuite/btcscript/opcode.go opcodeAdd 100.00% (8/8)
github.com/conformal/btcscript/scriptbuilder.go ScriptBuilder.AddInt64 100.00% (7/7) github.com/btcsuite/btcscript/opcode.go opcodeSub 100.00% (8/8)
github.com/conformal/btcscript/stack.go Stack.DropN 100.00% (7/7) github.com/btcsuite/btcscript/stack.go Stack.DupN 100.00% (8/8)
github.com/conformal/btcscript/opcode.go opcodeNot 100.00% (7/7) github.com/btcsuite/btcscript/opcode.go opcodeNot 100.00% (7/7)
github.com/conformal/btcscript/opcode.go opcodeVerify 100.00% (6/6) github.com/btcsuite/btcscript/stack.go Stack.DropN 100.00% (7/7)
github.com/conformal/btcscript/opcode.go opcodeEndif 100.00% (6/6) github.com/btcsuite/btcscript/opcode.go opcodeNop 100.00% (7/7)
github.com/conformal/btcscript/opcode.go opcodeElse 100.00% (6/6) github.com/btcsuite/btcscript/opcode.go opcode0NotEqual 100.00% (7/7)
github.com/conformal/btcscript/opcode.go opcodeIfDup 100.00% (6/6) github.com/btcsuite/btcscript/script.go HasCanonicalPushes 100.00% (7/7)
github.com/conformal/btcscript/opcode.go parsedOpcode.conditional 100.00% (6/6) github.com/btcsuite/btcscript/opcode.go opcodeElse 100.00% (6/6)
github.com/conformal/btcscript/opcode.go opcode1Add 100.00% (5/5) github.com/btcsuite/btcscript/opcode.go parsedOpcode.conditional 100.00% (6/6)
github.com/conformal/btcscript/opcode.go opcodeToAltStack 100.00% (5/5) github.com/btcsuite/btcscript/opcode.go opcodeIfDup 100.00% (6/6)
github.com/conformal/btcscript/stack.go Stack.PickN 100.00% (5/5) github.com/btcsuite/btcscript/opcode.go opcodeVerify 100.00% (6/6)
github.com/conformal/btcscript/script.go Script.validPC 100.00% (5/5) github.com/btcsuite/btcscript/opcode.go opcodeEndif 100.00% (6/6)
github.com/conformal/btcscript/opcode.go opcodeFromAltStack 100.00% (5/5) github.com/btcsuite/btcscript/script.go removeOpcode 100.00% (5/5)
github.com/conformal/btcscript/opcode.go opcodeSize 100.00% (5/5) github.com/btcsuite/btcscript/opcode.go opcodeToAltStack 100.00% (5/5)
github.com/conformal/btcscript/stack.go Stack.RollN 100.00% (5/5) github.com/btcsuite/btcscript/opcode.go opcodeFromAltStack 100.00% (5/5)
github.com/conformal/btcscript/opcode.go opcodeSha256 100.00% (5/5) github.com/btcsuite/btcscript/opcode.go opcodePick 100.00% (5/5)
github.com/conformal/btcscript/opcode.go opcodeRoll 100.00% (5/5) github.com/btcsuite/btcscript/opcode.go opcodeRoll 100.00% (5/5)
github.com/conformal/btcscript/opcode.go opcodeAbs 100.00% (5/5) github.com/btcsuite/btcscript/opcode.go opcodeSize 100.00% (5/5)
github.com/conformal/btcscript/script.go removeOpcodeByData 100.00% (5/5) github.com/btcsuite/btcscript/opcode.go opcode1Add 100.00% (5/5)
github.com/conformal/btcscript/script.go removeOpcode 100.00% (5/5) github.com/btcsuite/btcscript/opcode.go opcode1Sub 100.00% (5/5)
github.com/conformal/btcscript/opcode.go opcodeRipemd160 100.00% (5/5) github.com/btcsuite/btcscript/opcode.go opcodeNegate 100.00% (5/5)
github.com/conformal/btcscript/opcode.go opcodeSha1 100.00% (5/5) github.com/btcsuite/btcscript/opcode.go opcodeAbs 100.00% (5/5)
github.com/conformal/btcscript/opcode.go opcodePick 100.00% (5/5) github.com/btcsuite/btcscript/opcode.go opcodeRipemd160 100.00% (5/5)
github.com/conformal/btcscript/opcode.go opcodeHash160 100.00% (5/5) github.com/btcsuite/btcscript/opcode.go opcodeSha1 100.00% (5/5)
github.com/conformal/btcscript/opcode.go opcodeHash256 100.00% (5/5) github.com/btcsuite/btcscript/opcode.go opcodeSha256 100.00% (5/5)
github.com/conformal/btcscript/script.go Script.DisasmScript 100.00% (5/5) github.com/btcsuite/btcscript/opcode.go opcodeHash160 100.00% (5/5)
github.com/conformal/btcscript/opcode.go opcodeNegate 100.00% (5/5) github.com/btcsuite/btcscript/opcode.go opcodeHash256 100.00% (5/5)
github.com/conformal/btcscript/opcode.go opcode1Sub 100.00% (5/5) github.com/btcsuite/btcscript/script.go Script.validPC 100.00% (5/5)
github.com/conformal/btcscript/script.go Script.curPC 100.00% (4/4) github.com/btcsuite/btcscript/script.go Script.DisasmScript 100.00% (5/5)
github.com/conformal/btcscript/opcode.go opcodeEqualVerify 100.00% (4/4) github.com/btcsuite/btcscript/script.go removeOpcodeByData 100.00% (5/5)
github.com/conformal/btcscript/opcode.go opcodeNumEqualVerify 100.00% (4/4) github.com/btcsuite/btcscript/stack.go Stack.PickN 100.00% (5/5)
github.com/conformal/btcscript/opcode.go opcodeCheckSigVerify 100.00% (4/4) github.com/btcsuite/btcscript/stack.go Stack.RollN 100.00% (5/5)
github.com/conformal/btcscript/opcode.go opcodeCheckMultiSigVerify 100.00% (4/4) github.com/btcsuite/btcscript/script.go Script.curPC 100.00% (4/4)
github.com/conformal/btcscript/script.go IsPayToScriptHash 100.00% (4/4) github.com/btcsuite/btcscript/opcode.go opcodeCheckMultiSigVerify 100.00% (4/4)
github.com/conformal/btcscript/script.go isNullData 100.00% (4/4) github.com/btcsuite/btcscript/opcode.go opcodeCheckSigVerify 100.00% (4/4)
github.com/conformal/btcscript/script.go isPushOnly 100.00% (4/4) github.com/btcsuite/btcscript/opcode.go parsedOpcode.alwaysIllegal 100.00% (4/4)
github.com/conformal/btcscript/script.go IsPushOnlyScript 100.00% (4/4) github.com/btcsuite/btcscript/script.go IsPayToScriptHash 100.00% (4/4)
github.com/conformal/btcscript/script.go GetScriptClass 100.00% (4/4) github.com/btcsuite/btcscript/stack.go Stack.PeekBool 100.00% (4/4)
github.com/conformal/btcscript/script.go Script.DisasmPC 100.00% (4/4) github.com/btcsuite/btcscript/script.go isNullData 100.00% (4/4)
github.com/conformal/btcscript/script.go getStack 100.00% (4/4) github.com/btcsuite/btcscript/stack.go Stack.PeekInt 100.00% (4/4)
github.com/conformal/btcscript/opcode.go parsedOpcode.alwaysIllegal 100.00% (4/4) github.com/btcsuite/btcscript/script.go IsPushOnlyScript 100.00% (4/4)
github.com/conformal/btcscript/script.go @1322:17 100.00% (4/4) github.com/btcsuite/btcscript/stack.go Stack.PeekByteArray 100.00% (4/4)
github.com/conformal/btcscript/stack.go asBool 100.00% (4/4) github.com/btcsuite/btcscript/stack.go Stack.PopBool 100.00% (4/4)
github.com/conformal/btcscript/stack.go Stack.PopInt 100.00% (4/4) github.com/btcsuite/btcscript/script.go GetScriptClass 100.00% (4/4)
github.com/conformal/btcscript/stack.go Stack.PopBool 100.00% (4/4) github.com/btcsuite/btcscript/opcode.go opcodeNumEqualVerify 100.00% (4/4)
github.com/conformal/btcscript/stack.go Stack.PeekByteArray 100.00% (4/4) github.com/btcsuite/btcscript/stack.go Stack.PopInt 100.00% (4/4)
github.com/conformal/btcscript/stack.go Stack.PeekInt 100.00% (4/4) github.com/btcsuite/btcscript/opcode.go opcodeEqualVerify 100.00% (4/4)
github.com/conformal/btcscript/stack.go Stack.PeekBool 100.00% (4/4) github.com/btcsuite/btcscript/stack.go asBool 100.00% (4/4)
github.com/conformal/btcscript/stack.go fromBool 100.00% (3/3) github.com/btcsuite/btcscript/script.go getStack 100.00% (4/4)
github.com/conformal/btcscript/script.go ScriptClass.String 100.00% (3/3) github.com/btcsuite/btcscript/script.go @1338:17 100.00% (4/4)
github.com/conformal/btcscript/script.go isSmallInt 100.00% (3/3) github.com/btcsuite/btcscript/script.go isPushOnly 100.00% (4/4)
github.com/conformal/btcscript/script.go setStack 100.00% (3/3) github.com/btcsuite/btcscript/script.go Script.DisasmPC 100.00% (4/4)
github.com/conformal/btcscript/script.go asSmallInt 100.00% (3/3) github.com/btcsuite/btcscript/script.go ScriptClass.String 100.00% (3/3)
github.com/conformal/btcscript/opcode.go opcodePushData 100.00% (2/2) github.com/btcsuite/btcscript/script.go setStack 100.00% (3/3)
github.com/conformal/btcscript/opcode.go calcHash 100.00% (2/2) github.com/btcsuite/btcscript/script.go isSmallInt 100.00% (3/3)
github.com/conformal/btcscript/opcode.go opcodeN 100.00% (2/2) github.com/btcsuite/btcscript/script.go asSmallInt 100.00% (3/3)
github.com/conformal/btcscript/stack.go Stack.NipN 100.00% (2/2) github.com/btcsuite/btcscript/scriptbuilder.go ScriptBuilder.AddFullData 100.00% (3/3)
github.com/conformal/btcscript/scriptbuilder.go ScriptBuilder.AddOp 100.00% (2/2) github.com/btcsuite/btcscript/scriptbuilder.go ScriptBuilder.Reset 100.00% (3/3)
github.com/conformal/btcscript/opcode.go opcodeCodeSeparator 100.00% (2/2) github.com/btcsuite/btcscript/stack.go fromBool 100.00% (3/3)
github.com/conformal/btcscript/opcode.go opcodeDepth 100.00% (2/2) github.com/btcsuite/btcscript/stack.go Stack.NipN 100.00% (2/2)
github.com/conformal/btcscript/scriptbuilder.go ScriptBuilder.Reset 100.00% (2/2) github.com/btcsuite/btcscript/opcode.go opcodeCodeSeparator 100.00% (2/2)
github.com/conformal/btcscript/opcode.go opcode1Negate 100.00% (2/2) github.com/btcsuite/btcscript/opcode.go calcHash 100.00% (2/2)
github.com/conformal/btcscript/opcode.go opcodeFalse 100.00% (2/2) github.com/btcsuite/btcscript/opcode.go opcodeFalse 100.00% (2/2)
github.com/conformal/btcscript/script.go GetSigOpCount 100.00% (2/2) github.com/btcsuite/btcscript/opcode.go opcodePushData 100.00% (2/2)
github.com/conformal/btcscript/stack.go Stack.Depth 100.00% (2/2) github.com/btcsuite/btcscript/opcode.go opcode1Negate 100.00% (2/2)
github.com/conformal/btcscript/script.go KeyClosure.GetKey 100.00% (1/1) github.com/btcsuite/btcscript/script.go GetSigOpCount 100.00% (2/2)
github.com/conformal/btcscript/stack.go Stack.PushBool 100.00% (1/1) github.com/btcsuite/btcscript/stack.go Stack.Depth 100.00% (2/2)
github.com/conformal/btcscript/opcode.go opcodeDup 100.00% (1/1) github.com/btcsuite/btcscript/opcode.go opcodeDepth 100.00% (2/2)
github.com/conformal/btcscript/script.go Script.disasm 100.00% (1/1) github.com/btcsuite/btcscript/opcode.go opcodeN 100.00% (2/2)
github.com/conformal/btcscript/script.go Script.subScript 100.00% (1/1) github.com/btcsuite/btcscript/script.go Script.SetAltStack 100.00% (1/1)
github.com/conformal/btcscript/opcode.go calcHash160 100.00% (1/1) github.com/btcsuite/btcscript/opcode.go opcodeDrop 100.00% (1/1)
github.com/conformal/btcscript/opcode.go opcodeNop 100.00% (1/1) github.com/btcsuite/btcscript/script.go payToPubKeyHashScript 100.00% (1/1)
github.com/conformal/btcscript/opcode.go opcodeReturn 100.00% (1/1) github.com/btcsuite/btcscript/script.go payToScriptHashScript 100.00% (1/1)
github.com/conformal/btcscript/opcode.go opcodeReserved 100.00% (1/1) github.com/btcsuite/btcscript/script.go payToPubKeyScript 100.00% (1/1)
github.com/conformal/btcscript/script.go Script.GetStack 100.00% (1/1) github.com/btcsuite/btcscript/opcode.go opcode2Swap 100.00% (1/1)
github.com/conformal/btcscript/script.go Script.SetStack 100.00% (1/1) github.com/btcsuite/btcscript/opcode.go opcode2Rot 100.00% (1/1)
github.com/conformal/btcscript/script.go Script.GetAltStack 100.00% (1/1) github.com/btcsuite/btcscript/opcode.go opcode2Over 100.00% (1/1)
github.com/conformal/btcscript/script.go Script.SetAltStack 100.00% (1/1) github.com/btcsuite/btcscript/scriptbuilder.go ErrScriptNotCanonical.Error 100.00% (1/1)
github.com/conformal/btcscript/opcode.go opcodeDrop 100.00% (1/1) github.com/btcsuite/btcscript/script.go KeyClosure.GetKey 100.00% (1/1)
github.com/conformal/btcscript/script.go payToPubKeyHashScript 100.00% (1/1) github.com/btcsuite/btcscript/script.go ScriptClosure.GetScript 100.00% (1/1)
github.com/conformal/btcscript/script.go payToScriptHashScript 100.00% (1/1) github.com/btcsuite/btcscript/script.go Script.disasm 100.00% (1/1)
github.com/conformal/btcscript/script.go payToPubKeyScript 100.00% (1/1) github.com/btcsuite/btcscript/script.go Script.subScript 100.00% (1/1)
github.com/conformal/btcscript/opcode.go init 100.00% (1/1) github.com/btcsuite/btcscript/opcode.go opcodeSwap 100.00% (1/1)
github.com/conformal/btcscript/scriptbuilder.go NewScriptBuilder 100.00% (1/1) github.com/btcsuite/btcscript/opcode.go opcodeNip 100.00% (1/1)
github.com/conformal/btcscript/log.go UseLogger 100.00% (1/1) github.com/btcsuite/btcscript/opcode.go opcodeDup 100.00% (1/1)
github.com/conformal/btcscript/log.go DisableLog 100.00% (1/1) github.com/btcsuite/btcscript/opcode.go opcodeTuck 100.00% (1/1)
github.com/conformal/btcscript/opcode.go opcode2Drop 100.00% (1/1) github.com/btcsuite/btcscript/log.go UseLogger 100.00% (1/1)
github.com/conformal/btcscript/stack.go Stack.PushByteArray 100.00% (1/1) github.com/btcsuite/btcscript/script.go Script.GetStack 100.00% (1/1)
github.com/conformal/btcscript/stack.go Stack.PushInt 100.00% (1/1) github.com/btcsuite/btcscript/script.go Script.SetStack 100.00% (1/1)
github.com/conformal/btcscript/opcode.go opcode2Dup 100.00% (1/1) github.com/btcsuite/btcscript/script.go Script.GetAltStack 100.00% (1/1)
github.com/conformal/btcscript/opcode.go opcode3Dup 100.00% (1/1) github.com/btcsuite/btcscript/opcode.go opcodeInvalid 100.00% (1/1)
github.com/conformal/btcscript/script.go isPubkey 100.00% (1/1) github.com/btcsuite/btcscript/script.go isPubkey 100.00% (1/1)
github.com/conformal/btcscript/script.go isPubkeyHash 100.00% (1/1) github.com/btcsuite/btcscript/scriptbuilder.go NewScriptBuilder 100.00% (1/1)
github.com/conformal/btcscript/script.go isScriptHash 100.00% (1/1) github.com/btcsuite/btcscript/opcode.go opcodeReserved 100.00% (1/1)
github.com/conformal/btcscript/opcode.go opcode2Over 100.00% (1/1) github.com/btcsuite/btcscript/opcode.go opcode2Dup 100.00% (1/1)
github.com/conformal/btcscript/opcode.go opcode2Rot 100.00% (1/1) github.com/btcsuite/btcscript/stack.go Stack.PushByteArray 100.00% (1/1)
github.com/conformal/btcscript/stack.go Stack.PopByteArray 100.00% (1/1) github.com/btcsuite/btcscript/stack.go Stack.PushInt 100.00% (1/1)
github.com/conformal/btcscript/opcode.go opcodeOver 100.00% (1/1) github.com/btcsuite/btcscript/stack.go Stack.PopByteArray 100.00% (1/1)
github.com/conformal/btcscript/opcode.go opcodeNip 100.00% (1/1) github.com/btcsuite/btcscript/script.go parseScript 100.00% (1/1)
github.com/conformal/btcscript/script.go parseScript 100.00% (1/1) github.com/btcsuite/btcscript/opcode.go calcHash160 100.00% (1/1)
github.com/conformal/btcscript/opcode.go opcodeInvalid 100.00% (1/1) github.com/btcsuite/btcscript/script.go isScriptHash 100.00% (1/1)
github.com/conformal/btcscript/script.go ScriptClosure.GetScript 100.00% (1/1) github.com/btcsuite/btcscript/opcode.go init 100.00% (1/1)
github.com/conformal/btcscript/log.go newLogClosure 100.00% (1/1) github.com/btcsuite/btcscript/log.go newLogClosure 100.00% (1/1)
github.com/conformal/btcscript/opcode.go opcode2Swap 100.00% (1/1) github.com/btcsuite/btcscript/opcode.go opcodeOver 100.00% (1/1)
github.com/conformal/btcscript/log.go init 100.00% (1/1) github.com/btcsuite/btcscript/opcode.go opcodeRot 100.00% (1/1)
github.com/conformal/btcscript/opcode.go opcodeTuck 100.00% (1/1) github.com/btcsuite/btcscript/log.go DisableLog 100.00% (1/1)
github.com/conformal/btcscript/opcode.go opcodeSwap 100.00% (1/1) github.com/btcsuite/btcscript/log.go init 100.00% (1/1)
github.com/conformal/btcscript/opcode.go opcodeRot 100.00% (1/1) github.com/btcsuite/btcscript/stack.go Stack.PushBool 100.00% (1/1)
github.com/conformal/btcscript/scriptbuilder.go ScriptBuilder.Script 100.00% (1/1) github.com/btcsuite/btcscript/opcode.go opcode3Dup 100.00% (1/1)
github.com/conformal/btcscript/opcode.go opcodeCheckMultiSig 98.48% (65/66) github.com/btcsuite/btcscript/script.go isPubkeyHash 100.00% (1/1)
github.com/conformal/btcscript/script.go mergeScripts 95.00% (19/20) github.com/btcsuite/btcscript/opcode.go opcode2Drop 100.00% (1/1)
github.com/conformal/btcscript/script.go canonicalPush 92.86% (13/14) github.com/btcsuite/btcscript/scriptbuilder.go ScriptBuilder.Script 100.00% (1/1)
github.com/conformal/btcscript/script.go signMultiSig 92.86% (13/14) github.com/btcsuite/btcscript/opcode.go opcodeReturn 100.00% (1/1)
github.com/conformal/btcscript/script.go mergeMultiSig 88.10% (37/42) github.com/btcsuite/btcscript/opcode.go opcodeCheckMultiSig 98.48% (65/66)
github.com/conformal/btcscript/script.go signTxOutput 87.50% (7/8) github.com/btcsuite/btcscript/script.go mergeScripts 95.24% (20/21)
github.com/conformal/btcscript/script.go unparseScript 85.71% (6/7) github.com/btcsuite/btcscript/script.go signMultiSig 93.33% (14/15)
github.com/conformal/btcscript/script.go expectedInputs 85.71% (6/7) github.com/btcsuite/btcscript/script.go canonicalPush 92.86% (13/14)
github.com/conformal/btcscript/script.go SignTxOutput 80.00% (12/15) github.com/btcsuite/btcscript/script.go mergeMultiSig 88.37% (38/43)
github.com/conformal/btcscript/script.go p2pkSignatureScript 75.00% (3/4) github.com/btcsuite/btcscript/script.go RawTxInSignature 87.50% (7/8)
github.com/conformal/btcscript/script.go sign 69.23% (18/26) github.com/btcsuite/btcscript/script.go expectedInputs 85.71% (6/7)
github.com/conformal/btcscript/script.go @586:34 0.00% (0/6) github.com/btcsuite/btcscript/script.go unparseScript 85.71% (6/7)
github.com/conformal/btcscript/stack.go Stack.String 0.00% (0/4) github.com/btcsuite/btcscript/script.go SignTxOutput 80.00% (12/15)
github.com/conformal/btcscript/script.go @574:34 0.00% (0/4) github.com/btcsuite/btcscript/script.go p2pkSignatureScript 75.00% (3/4)
github.com/conformal/btcscript/script.go @619:34 0.00% (0/3) github.com/btcsuite/btcscript/script.go sign 69.23% (18/26)
github.com/conformal/btcscript/opcode.go opcodeDisabled 0.00% (0/1) github.com/btcsuite/btcscript/script.go @598:34 0.00% (0/6)
github.com/conformal/btcscript/opcode.go @1804:33 0.00% (0/1) github.com/btcsuite/btcscript/script.go @586:34 0.00% (0/4)
github.com/conformal/btcscript/log.go logClosure.String 0.00% (0/1) github.com/btcsuite/btcscript/stack.go Stack.String 0.00% (0/4)
github.com/conformal/btcscript -------------------------- 96.52% (1221/1265) github.com/btcsuite/btcscript/script.go @631:34 0.00% (0/3)
github.com/btcsuite/btcscript/log.go logClosure.String 0.00% (0/1)
github.com/btcsuite/btcscript/opcode.go @1815:33 0.00% (0/1)
github.com/btcsuite/btcscript/opcode.go opcodeDisabled 0.00% (0/1)
github.com/btcsuite/btcscript --------------------------- 96.69% (1285/1329)