Merge pull request #2284 from Roasbeef/ctrl-block-error

txscript: add more detail to invalid tapscript merkle proof error
This commit is contained in:
Olaoluwa Osuntokun 2025-06-18 18:23:01 -07:00 committed by GitHub
commit 3afc25bed2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 26 additions and 9 deletions

View file

@ -353,7 +353,10 @@ func VerifyTaprootLeafCommitment(controlBlock *ControlBlock,
expectedWitnessProgram := schnorr.SerializePubKey(taprootKey)
if !bytes.Equal(expectedWitnessProgram, taprootWitnessProgram) {
return scriptError(ErrTaprootMerkleProofInvalid, "")
str := fmt.Sprintf("derived witness program: %x, expected: "+
"%x, using tapscript_root: %x", expectedWitnessProgram,
taprootWitnessProgram, rootHash)
return scriptError(ErrTaprootMerkleProofInvalid, str)
}
// Finally, we'll verify that the parity of the y coordinate of the

View file

@ -293,13 +293,15 @@ func TestTapscriptCommitmentVerification(t *testing.T) {
// make from 0 to 1 leaf
// ensure verifies properly
testCases := []struct {
treeMutateFunc func(*IndexedTapScriptTree)
ctrlBlockMutateFunc func(*ControlBlock)
numLeaves int
valid bool
treeMutateFunc func(*IndexedTapScriptTree)
ctrlBlockMutateFunc func(*ControlBlock)
expectedErr ErrorCode
}{
// A valid merkle proof of a single leaf.
{
@ -322,11 +324,13 @@ func TestTapscriptCommitmentVerification(t *testing.T) {
// An invalid merkle proof, we modify the last byte of one of
// the leaves.
{
numLeaves: 4,
valid: false,
numLeaves: 4,
valid: false,
expectedErr: ErrTaprootMerkleProofInvalid,
treeMutateFunc: func(t *IndexedTapScriptTree) {
for _, leafProof := range t.LeafMerkleProofs {
leafProof.InclusionProof[0] ^= 1
proofLen := len(leafProof.InclusionProof)
leafProof.InclusionProof[proofLen-1] ^= 1
}
},
},
@ -335,8 +339,9 @@ func TestTapscriptCommitmentVerification(t *testing.T) {
// An invalid series of proofs, we modify the control
// block to not match the parity of the final output
// key commitment.
numLeaves: 2,
valid: false,
numLeaves: 2,
valid: false,
expectedErr: ErrTaprootOutputKeyParityMismatch,
ctrlBlockMutateFunc: func(c *ControlBlock) {
c.OutputKeyYIsOdd = !c.OutputKeyYIsOdd
},
@ -391,6 +396,15 @@ func TestTapscriptCommitmentVerification(t *testing.T) {
"valid=%v, got valid=%v", testCase.valid,
valid)
}
if !valid {
if !IsErrorCode(err, testCase.expectedErr) {
t.Fatalf("expected error "+
"code %v, got %v",
testCase.expectedErr,
err)
}
}
}
// TODO(roasbeef): index correctness