Document consensus rules for version group IDs (#2719)

* Document consensus rules for version group IDs

* Remove spaces at end of lines

Co-authored-by: Conrado Gouvea <conrado@zfnd.org>
This commit is contained in:
teor 2021-09-02 03:44:46 +10:00 committed by GitHub
parent cdfc380d2b
commit dcc0dcd26c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 23 additions and 1 deletions

View File

@ -529,7 +529,12 @@ impl ZcashDeserialize for Transaction {
(header & LOW_31_BITS, header >> 31 != 0) (header & LOW_31_BITS, header >> 31 != 0)
}; };
// The overwintered flag MUST NOT be set for version 1 and 2 transactions. // Consensus rules:
// > The transaction version number MUST be greater than or equal to 1.
// >
// > The overwintered flag MUST NOT be set for version 1 and 2 transactions.
//
// https://zips.z.cash/protocol/protocol.pdf#txnconsensus
match (version, overwintered) { match (version, overwintered) {
(1, false) => Ok(Transaction::V1 { (1, false) => Ok(Transaction::V1 {
inputs: Vec::zcash_deserialize(&mut reader)?, inputs: Vec::zcash_deserialize(&mut reader)?,
@ -548,6 +553,10 @@ impl ZcashDeserialize for Transaction {
} }
(3, true) => { (3, true) => {
let id = reader.read_u32::<LittleEndian>()?; let id = reader.read_u32::<LittleEndian>()?;
// Consensus rule:
// > [Overwinter only, pre-Sapling] The transaction version number MUST be 3, and the version group ID MUST be 0x03C48270.
//
// https://zips.z.cash/protocol/protocol.pdf#txnconsensus
if id != OVERWINTER_VERSION_GROUP_ID { if id != OVERWINTER_VERSION_GROUP_ID {
return Err(SerializationError::Parse( return Err(SerializationError::Parse(
"expected OVERWINTER_VERSION_GROUP_ID", "expected OVERWINTER_VERSION_GROUP_ID",
@ -565,6 +574,13 @@ impl ZcashDeserialize for Transaction {
} }
(4, true) => { (4, true) => {
let id = reader.read_u32::<LittleEndian>()?; let id = reader.read_u32::<LittleEndian>()?;
// Consensus rules:
// > [Sapling to Canopy inclusive, pre-NU5] The transaction version number MUST be 4, and the version group ID MUST be 0x892F2085.
// >
// > [NU5 onward] The transaction version number MUST be 4 or 5.
// > If the transaction version number is 4 then the version group ID MUST be 0x892F2085.
//
// https://zips.z.cash/protocol/protocol.pdf#txnconsensus
if id != SAPLING_VERSION_GROUP_ID { if id != SAPLING_VERSION_GROUP_ID {
return Err(SerializationError::Parse( return Err(SerializationError::Parse(
"expected SAPLING_VERSION_GROUP_ID", "expected SAPLING_VERSION_GROUP_ID",
@ -636,6 +652,12 @@ impl ZcashDeserialize for Transaction {
} }
(5, true) => { (5, true) => {
// header // header
//
// Consensus rule:
// > [NU5 onward] The transaction version number MUST be 4 or 5. ...
// > If the transaction version number is 5 then the version group ID MUST be 0x26A7270A.
//
// https://zips.z.cash/protocol/protocol.pdf#txnconsensus
let id = reader.read_u32::<LittleEndian>()?; let id = reader.read_u32::<LittleEndian>()?;
if id != TX_V5_VERSION_GROUP_ID { if id != TX_V5_VERSION_GROUP_ID {
return Err(SerializationError::Parse("expected TX_V5_VERSION_GROUP_ID")); return Err(SerializationError::Parse("expected TX_V5_VERSION_GROUP_ID"));