txscript: convert all new segwit error types to ErrorCode's
This commit is contained in:
parent
80dd96ac5d
commit
ff6cb25e89
4 changed files with 101 additions and 60 deletions
|
@ -259,7 +259,7 @@ func (vm *Engine) verifyWitnessProgram(witness [][]byte) error {
|
|||
if len(witness) != 2 {
|
||||
err := fmt.Sprintf("should have exactly two "+
|
||||
"items in witness, instead have %v", len(witness))
|
||||
return scriptError(ErrWitnessScriptMismatch, err)
|
||||
return scriptError(ErrWitnessProgramMismatch, err)
|
||||
}
|
||||
|
||||
// Now we'll resume execution as if it were a regular
|
||||
|
@ -280,7 +280,6 @@ func (vm *Engine) verifyWitnessProgram(witness [][]byte) error {
|
|||
vm.SetStack(witness)
|
||||
|
||||
case payToWitnessScriptHashDataSize: // P2WSH
|
||||
|
||||
// Additionally, The witness stack MUST NOT be empty at
|
||||
// this point.
|
||||
if len(witness) == 0 {
|
||||
|
@ -303,7 +302,7 @@ func (vm *Engine) verifyWitnessProgram(witness [][]byte) error {
|
|||
// the witness stack matches the witness program.
|
||||
witnessHash := sha256.Sum256(witnessScript)
|
||||
if !bytes.Equal(witnessHash[:], vm.witnessProgram) {
|
||||
return scriptError(ErrWitnessScriptMismatch,
|
||||
return scriptError(ErrWitnessProgramMismatch,
|
||||
"witness program hash mismatch")
|
||||
}
|
||||
|
||||
|
@ -330,8 +329,9 @@ func (vm *Engine) verifyWitnessProgram(witness [][]byte) error {
|
|||
return scriptError(ErrWitnessProgramWrongLength, errStr)
|
||||
}
|
||||
} else if vm.hasFlag(ScriptVerifyDiscourageUpgradeableWitnessProgram) {
|
||||
return fmt.Errorf("new witness program versions invalid: %v",
|
||||
vm.witnessVersion)
|
||||
errStr := fmt.Sprintf("new witness program versions "+
|
||||
"invalid: %v", vm.witnessProgram)
|
||||
return scriptError(ErrDiscourageUpgradableWitnessProgram, errStr)
|
||||
} else {
|
||||
// If we encounter an unknown witness program version and we
|
||||
// aren't discouraging future unknown witness based soft-forks,
|
||||
|
|
|
@ -209,6 +209,15 @@ const (
|
|||
// operations.
|
||||
ErrNullFail
|
||||
|
||||
// ErrWitnessMalleated is returned if ScriptVerifyWitness is set and a
|
||||
// native p2wsh program is encountered which has a non-empty sigScript.
|
||||
ErrWitnessMalleated
|
||||
|
||||
// ErrWitnessMalleatedP2SH is returned if ScriptVerifyWitness if set
|
||||
// and the validation logic for nested p2sh encounters a sigScript
|
||||
// which isn't *exactyl* a datapush of the witness program.
|
||||
ErrWitnessMalleatedP2SH
|
||||
|
||||
// -------------------------------
|
||||
// Failures related to soft forks.
|
||||
// -------------------------------
|
||||
|
@ -227,34 +236,46 @@ const (
|
|||
// reached.
|
||||
ErrUnsatisfiedLockTime
|
||||
|
||||
// ErrMinimalIf is returned if ScriptVerifyWitness is set and the
|
||||
// operand of an OP_IF/OP_NOF_IF are not either an empty vector or
|
||||
// [0x01].
|
||||
ErrMinimalIf
|
||||
|
||||
// ErrDiscourageUpgradableWitnessProgram is returned if
|
||||
// ScriptVerifyWitness is set and the versino of an executing witness
|
||||
// program is outside the set of currently defined witness program
|
||||
// vesions.
|
||||
ErrDiscourageUpgradableWitnessProgram
|
||||
|
||||
// ----------------------------------------
|
||||
// Failures related to segregated witness.
|
||||
// ----------------------------------------
|
||||
|
||||
// ErrWitnessProgramEmpty is returned if ScriptVerifyWitness is set and
|
||||
// the witness stack itself is empty.
|
||||
ErrWitnessProgramEmpty
|
||||
|
||||
// ErrWitnessScriptMismatch is returned if ScriptVerifyWitness is set
|
||||
// ErrWitnessProgramMismatch is returned if ScriptVerifyWitness is set
|
||||
// and the witness itself for a p2wkh witness program isn't *exactly* 2
|
||||
// items.
|
||||
ErrWitnessScriptMismatch
|
||||
// items or if the witness for a p2wsh isn't the sha255 of the witness
|
||||
// script.
|
||||
ErrWitnessProgramMismatch
|
||||
|
||||
// ErrWitnessProgramWrongLength is returned if ScriptVerifyWitness is
|
||||
// set and the length of the witness program violates the length as
|
||||
// dictated by the current witness version.
|
||||
ErrWitnessProgramWrongLength
|
||||
|
||||
// ErrWitnessMalleated is returned if ScriptVerifyWitness is set and a
|
||||
// native p2wsh program is encountered which has a non-empty sigScript.
|
||||
ErrWitnessMalleated
|
||||
|
||||
// ErrWitnessMalleatedP2SH is returned if ScriptVerifyWitness if set
|
||||
// and the validation logic for nested p2sh encounters a sigScript
|
||||
// which isn't *exactyl* a datapush of the witness program.
|
||||
ErrWitnessMalleatedP2SH
|
||||
|
||||
// ErrWitnessUnexpected is returned if ScriptVerifyWitness is set and a
|
||||
// transaction includes witness data but doesn't spend an which is a
|
||||
// witness program (nested or native).
|
||||
ErrWitnessUnexpected
|
||||
|
||||
// ErrWitnessPubKeyType is returned if ScriptVerifyWitness is set and
|
||||
// the public key used in either a check-sig or check-multi-sig isn't
|
||||
// serialized in a compressed format.
|
||||
ErrWitnessPubKeyType
|
||||
|
||||
// numErrorCodes is the maximum error code number used in tests. This
|
||||
// entry MUST be the last entry in the enum.
|
||||
numErrorCodes
|
||||
|
@ -262,47 +283,56 @@ const (
|
|||
|
||||
// Map of ErrorCode values back to their constant names for pretty printing.
|
||||
var errorCodeStrings = map[ErrorCode]string{
|
||||
ErrInternal: "ErrInternal",
|
||||
ErrInvalidFlags: "ErrInvalidFlags",
|
||||
ErrInvalidIndex: "ErrInvalidIndex",
|
||||
ErrUnsupportedAddress: "ErrUnsupportedAddress",
|
||||
ErrNotMultisigScript: "ErrNotMultisigScript",
|
||||
ErrTooManyRequiredSigs: "ErrTooManyRequiredSigs",
|
||||
ErrTooMuchNullData: "ErrTooMuchNullData",
|
||||
ErrEarlyReturn: "ErrEarlyReturn",
|
||||
ErrEmptyStack: "ErrEmptyStack",
|
||||
ErrEvalFalse: "ErrEvalFalse",
|
||||
ErrScriptUnfinished: "ErrScriptUnfinished",
|
||||
ErrInvalidProgramCounter: "ErrInvalidProgramCounter",
|
||||
ErrScriptTooBig: "ErrScriptTooBig",
|
||||
ErrElementTooBig: "ErrElementTooBig",
|
||||
ErrTooManyOperations: "ErrTooManyOperations",
|
||||
ErrStackOverflow: "ErrStackOverflow",
|
||||
ErrInvalidPubKeyCount: "ErrInvalidPubKeyCount",
|
||||
ErrInvalidSignatureCount: "ErrInvalidSignatureCount",
|
||||
ErrNumberTooBig: "ErrNumberTooBig",
|
||||
ErrVerify: "ErrVerify",
|
||||
ErrEqualVerify: "ErrEqualVerify",
|
||||
ErrNumEqualVerify: "ErrNumEqualVerify",
|
||||
ErrCheckSigVerify: "ErrCheckSigVerify",
|
||||
ErrCheckMultiSigVerify: "ErrCheckMultiSigVerify",
|
||||
ErrDisabledOpcode: "ErrDisabledOpcode",
|
||||
ErrReservedOpcode: "ErrReservedOpcode",
|
||||
ErrMalformedPush: "ErrMalformedPush",
|
||||
ErrInvalidStackOperation: "ErrInvalidStackOperation",
|
||||
ErrUnbalancedConditional: "ErrUnbalancedConditional",
|
||||
ErrMinimalData: "ErrMinimalData",
|
||||
ErrInvalidSigHashType: "ErrInvalidSigHashType",
|
||||
ErrSigDER: "ErrSigDER",
|
||||
ErrSigHighS: "ErrSigHighS",
|
||||
ErrNotPushOnly: "ErrNotPushOnly",
|
||||
ErrSigNullDummy: "ErrSigNullDummy",
|
||||
ErrPubKeyType: "ErrPubKeyType",
|
||||
ErrCleanStack: "ErrCleanStack",
|
||||
ErrNullFail: "ErrNullFail",
|
||||
ErrDiscourageUpgradableNOPs: "ErrDiscourageUpgradableNOPs",
|
||||
ErrNegativeLockTime: "ErrNegativeLockTime",
|
||||
ErrUnsatisfiedLockTime: "ErrUnsatisfiedLockTime",
|
||||
ErrInternal: "ErrInternal",
|
||||
ErrInvalidFlags: "ErrInvalidFlags",
|
||||
ErrInvalidIndex: "ErrInvalidIndex",
|
||||
ErrUnsupportedAddress: "ErrUnsupportedAddress",
|
||||
ErrNotMultisigScript: "ErrNotMultisigScript",
|
||||
ErrTooManyRequiredSigs: "ErrTooManyRequiredSigs",
|
||||
ErrTooMuchNullData: "ErrTooMuchNullData",
|
||||
ErrEarlyReturn: "ErrEarlyReturn",
|
||||
ErrEmptyStack: "ErrEmptyStack",
|
||||
ErrEvalFalse: "ErrEvalFalse",
|
||||
ErrScriptUnfinished: "ErrScriptUnfinished",
|
||||
ErrInvalidProgramCounter: "ErrInvalidProgramCounter",
|
||||
ErrScriptTooBig: "ErrScriptTooBig",
|
||||
ErrElementTooBig: "ErrElementTooBig",
|
||||
ErrTooManyOperations: "ErrTooManyOperations",
|
||||
ErrStackOverflow: "ErrStackOverflow",
|
||||
ErrInvalidPubKeyCount: "ErrInvalidPubKeyCount",
|
||||
ErrInvalidSignatureCount: "ErrInvalidSignatureCount",
|
||||
ErrNumberTooBig: "ErrNumberTooBig",
|
||||
ErrVerify: "ErrVerify",
|
||||
ErrEqualVerify: "ErrEqualVerify",
|
||||
ErrNumEqualVerify: "ErrNumEqualVerify",
|
||||
ErrCheckSigVerify: "ErrCheckSigVerify",
|
||||
ErrCheckMultiSigVerify: "ErrCheckMultiSigVerify",
|
||||
ErrDisabledOpcode: "ErrDisabledOpcode",
|
||||
ErrReservedOpcode: "ErrReservedOpcode",
|
||||
ErrMalformedPush: "ErrMalformedPush",
|
||||
ErrInvalidStackOperation: "ErrInvalidStackOperation",
|
||||
ErrUnbalancedConditional: "ErrUnbalancedConditional",
|
||||
ErrMinimalData: "ErrMinimalData",
|
||||
ErrInvalidSigHashType: "ErrInvalidSigHashType",
|
||||
ErrSigDER: "ErrSigDER",
|
||||
ErrSigHighS: "ErrSigHighS",
|
||||
ErrNotPushOnly: "ErrNotPushOnly",
|
||||
ErrSigNullDummy: "ErrSigNullDummy",
|
||||
ErrPubKeyType: "ErrPubKeyType",
|
||||
ErrCleanStack: "ErrCleanStack",
|
||||
ErrNullFail: "ErrNullFail",
|
||||
ErrDiscourageUpgradableNOPs: "ErrDiscourageUpgradableNOPs",
|
||||
ErrNegativeLockTime: "ErrNegativeLockTime",
|
||||
ErrUnsatisfiedLockTime: "ErrUnsatisfiedLockTime",
|
||||
ErrWitnessProgramEmpty: "ErrWitnessProgramEmpty",
|
||||
ErrWitnessProgramMismatch: "ErrWitnessProgramMismatch",
|
||||
ErrWitnessProgramWrongLength: "ErrWitnessProgramWrongLength",
|
||||
ErrWitnessMalleated: "ErrWitnessMalleated",
|
||||
ErrWitnessMalleatedP2SH: "ErrWitnessMalleatedP2SH",
|
||||
ErrWitnessUnexpected: "ErrWitnessUnexpected",
|
||||
ErrMinimalIf: "ErrMinimalIf",
|
||||
ErrWitnessPubKeyType: "ErrWitnessPubKeyType",
|
||||
ErrDiscourageUpgradableWitnessProgram: "ErrDiscourageUpgradableWitnessProgram",
|
||||
}
|
||||
|
||||
// String returns the ErrorCode as a human-readable name.
|
||||
|
|
|
@ -57,6 +57,15 @@ func TestErrorCodeStringer(t *testing.T) {
|
|||
{ErrDiscourageUpgradableNOPs, "ErrDiscourageUpgradableNOPs"},
|
||||
{ErrNegativeLockTime, "ErrNegativeLockTime"},
|
||||
{ErrUnsatisfiedLockTime, "ErrUnsatisfiedLockTime"},
|
||||
{ErrWitnessProgramEmpty, "ErrWitnessProgramEmpty"},
|
||||
{ErrWitnessProgramMismatch, "ErrWitnessProgramMismatch"},
|
||||
{ErrWitnessProgramWrongLength, "ErrWitnessProgramWrongLength"},
|
||||
{ErrWitnessMalleated, "ErrWitnessMalleated"},
|
||||
{ErrWitnessMalleatedP2SH, "ErrWitnessMalleatedP2SH"},
|
||||
{ErrWitnessUnexpected, "ErrWitnessUnexpected"},
|
||||
{ErrMinimalIf, "ErrMinimalIf"},
|
||||
{ErrWitnessPubKeyType, "ErrWitnessPubKeyType"},
|
||||
{ErrDiscourageUpgradableWitnessProgram, "ErrDiscourageUpgradableWitnessProgram"},
|
||||
{0xffff, "Unknown ErrorCode (65535)"},
|
||||
}
|
||||
|
||||
|
|
|
@ -446,12 +446,14 @@ func PayToAddrScript(addr btcutil.Address) ([]byte, error) {
|
|||
|
||||
case *btcutil.AddressWitnessPubKeyHash:
|
||||
if addr == nil {
|
||||
return nil, ErrUnsupportedAddress
|
||||
return nil, scriptError(ErrUnsupportedAddress,
|
||||
nilAddrErrStr)
|
||||
}
|
||||
return payToWitnessPubKeyHashScript(addr.ScriptAddress())
|
||||
case *btcutil.AddressWitnessScriptHash:
|
||||
if addr == nil {
|
||||
return nil, ErrUnsupportedAddress
|
||||
return nil, scriptError(ErrUnsupportedAddress,
|
||||
nilAddrErrStr)
|
||||
}
|
||||
return payToWitnessScriptHashScript(addr.ScriptAddress())
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue