<p>See @Pieter Wuille's comment, currently all witness programs with versions other than <code>0</code> will be rejected as non-standard. See <a href="https://github.com/bitcoin/bitcoin/blob/master/src/script/interpreter.cpp#L1447" rel="nofollow noreferrer">interpreter.cpp L1447</a></p>

<p><strike><strong>Edit:</strong> As of <code>v0.16.2</code>, it appears that all version bytes will at least enter the mempool, provided the rules for version <code>0x0</code> (if used) are followed. See <a href="https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki#witness-program" rel="nofollow noreferrer">BIP 141 - Witness Program</a>, <a href="https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki#restrictions-on-public-key-type" rel="nofollow noreferrer">BIP 143 - Restrictions on Public Key Type</a> and <a href="https://github.com/bitcoin/bitcoin/blob/0.16/src/policy/policy.cpp#L232" rel="nofollow noreferrer">policy.cpp#L232</a></strike></p>

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

CC BY-SA 4.0
2018-08-13T17:12:32.883Z
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).
Pieter Wuille
CC BY-SA 4.0
2018-08-13T18:37:25.617Z
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
Pieter Wuille
CC BY-SA 4.0
2018-08-13T16:43:38.233Z
2018-08-13T20:41:48.293Z
2018-08-13T20:41:48.293Z
JBaczuk
<p>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?</p>

CC BY-SA 4.0
2018-08-13T16:28:50.303Z
what's the difference between "considered valid" and considered standard in this context?
JBaczuk
<segregated-witness><non-standard-transaction>
Are higher versions of segregated witness script non-standard?
Wapac
# Are higher versions of segregated witness script non-standard?

(Asked by: username_0 on 2018-08-13)

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?

**Tags:** segregated-witness, non-standard-transaction

> **Comments:**
> **username_1**: what's the difference between "considered valid" and considered standard in this context?  

---

## 1 answers

### Answer by username_1 on 2018-08-13. Score: 1

See @username_2's comment, currently all witness programs with versions other than `0` will be rejected as non-standard. See [interpreter.cpp L1447](https://github.com/bitcoin/bitcoin/blob/master/src/script/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](https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki#witness-program), [BIP 143 - Restrictions on Public Key Type](https://github.com/bitcoin/bips/blob/master/bip-0143.mediawiki#restrictions-on-public-key-type) and [policy.cpp#L232](https://github.com/bitcoin/bitcoin/blob/0.16/src/policy/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."

> **Comments:**
> **username_2**: 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).  
> **username_2**: 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  

---

