BIP375: correctly detect SegWit v2+ witness programs - #2253
Merged
Conversation
Contributor
Author
|
@andrewtoth @theStack Hi, Could you please review this PR at your convenience? Thank you very much. |
jonatack
approved these changes
Aug 17, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Update the BIP375 validator to reject actual SegWit v2–v16 witness programs instead of every scriptPubKey beginning with
OP_2throughOP_16.Problem
The input eligibility check currently determines whether an input spends a SegWit v2+ output by inspecting only the first byte of its scriptPubKey:
However, an OP_2–OP_16 prefix alone does not make a scriptPubKey a witness program.
A witness program must consist of a version opcode followed by a direct push of 2–40 bytes, with the push length matching the remaining script length.
Consequently, a scriptPubKey containing only OP_2 (0x52) is incorrectly classified as a SegWit v2 witness program and rejected by the validator.
Testing
Before the fix, the new regression vector failed:
41 passed, 1 failed
After the fix, all BIP375 validation vectors pass:
42 passed, 0 failed