My understanding is that only version 0 is defined but other versions are considered valid to allow extensions using soft forks, but are they non-standard at the moment?

  • what's the difference between "considered valid" and considered standard in this context?
    – JBaczuk
    Aug 13, 2018 at 16:28

1 Answer 1


See @Pieter Wuille's comment, currently all witness programs with versions other than 0 will be rejected as non-standard. See interpreter.cpp L1447

Edit: As of v0.16.2, it appears that all version bytes will at least enter the mempool, provided the rules for version 0x0 (if used) are followed. See BIP 141 - Witness Program, BIP 143 - Restrictions on Public Key Type and policy.cpp#L232

Currently, versions bytes higher than 0 will cause the VerifyWitnessProgram function to always return true (for future softfork compatibility). Currently version bytes 1-16 are reserved for future use, but, "for any version byte from 0 to 16, the script must fail if the witness program has a CastToBool value of zero."

  • 1
    Non-standard in this context means that such transactions won't be relayed, enter the mempool, or be mined by common software (despite being valid in blocks, if put there by a miner). Aug 13, 2018 at 17:12
  • This is not correct, I'm afraid. The standardness policy consists of various pieces of code, and the most important one is through a verify flag that rejects opcodes/templates intended for future extensions. For mempool acceptable this flag is used, and it will cause script validation for any non-0 witness version Aug 13, 2018 at 18:37

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.