reworks shred::merkle::Shred{Code,Data}::get_chained_merkle_root_offset (#802)

Shred{Code,Data}::get_chained_merkle_root_offset is only applicable to
"chained" Merkle shreds however the code or API does not enforce this.

The commit explicitly checks for "chained" variant in
Shred{Code,Data}::get_chained_merkle_root_offset.
This commit is contained in:
behzad nouri 2024-04-17 16:32:41 +00:00 committed by GitHub
parent 349eb7f925
commit aa0922d684
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 23 additions and 22 deletions

View File

@ -733,28 +733,19 @@ pub mod layout {
pub(crate) fn get_chained_merkle_root(shred: &[u8]) -> Option<Hash> {
let offset = match get_shred_variant(shred).ok()? {
ShredVariant::LegacyCode | ShredVariant::LegacyData => None,
ShredVariant::LegacyCode | ShredVariant::LegacyData => return None,
ShredVariant::MerkleCode {
proof_size,
chained: true,
chained,
resigned,
} => merkle::ShredCode::get_chained_merkle_root_offset(proof_size, resigned).ok(),
} => merkle::ShredCode::get_chained_merkle_root_offset(proof_size, chained, resigned),
ShredVariant::MerkleData {
proof_size,
chained: true,
chained,
resigned,
} => merkle::ShredData::get_chained_merkle_root_offset(proof_size, resigned).ok(),
ShredVariant::MerkleCode {
proof_size: _,
chained: false,
resigned: _,
} => None,
ShredVariant::MerkleData {
proof_size: _,
chained: false,
resigned: _,
} => None,
}?;
} => merkle::ShredData::get_chained_merkle_root_offset(proof_size, chained, resigned),
}
.ok()?;
shred
.get(offset..offset + SIZE_OF_MERKLE_ROOT)
.map(Hash::new)

View File

@ -189,20 +189,25 @@ impl ShredData {
fn chained_merkle_root_offset(&self) -> Result<usize, Error> {
let ShredVariant::MerkleData {
proof_size,
chained: true,
chained,
resigned,
} = self.common_header.shred_variant
else {
return Err(Error::InvalidShredVariant);
};
Self::get_chained_merkle_root_offset(proof_size, resigned)
Self::get_chained_merkle_root_offset(proof_size, chained, resigned)
}
pub(super) fn get_chained_merkle_root_offset(
proof_size: u8,
chained: bool,
resigned: bool,
) -> Result<usize, Error> {
Ok(Self::SIZE_OF_HEADERS + Self::capacity(proof_size, /*chained:*/ true, resigned)?)
if !chained {
return Err(Error::InvalidShredVariant);
}
debug_assert!(chained);
Ok(Self::SIZE_OF_HEADERS + Self::capacity(proof_size, chained, resigned)?)
}
pub(super) fn chained_merkle_root(&self) -> Result<Hash, Error> {
@ -375,20 +380,25 @@ impl ShredCode {
fn chained_merkle_root_offset(&self) -> Result<usize, Error> {
let ShredVariant::MerkleCode {
proof_size,
chained: true,
chained,
resigned,
} = self.common_header.shred_variant
else {
return Err(Error::InvalidShredVariant);
};
Self::get_chained_merkle_root_offset(proof_size, resigned)
Self::get_chained_merkle_root_offset(proof_size, chained, resigned)
}
pub(super) fn get_chained_merkle_root_offset(
proof_size: u8,
chained: bool,
resigned: bool,
) -> Result<usize, Error> {
Ok(Self::SIZE_OF_HEADERS + Self::capacity(proof_size, /*chained:*/ true, resigned)?)
if !chained {
return Err(Error::InvalidShredVariant);
}
debug_assert!(chained);
Ok(Self::SIZE_OF_HEADERS + Self::capacity(proof_size, chained, resigned)?)
}
pub(super) fn chained_merkle_root(&self) -> Result<Hash, Error> {