chain: Tweak the version and time test bounds
Use MAX constants for the block header version and time arbitrary test ranges. Reduces the block header time arbitrary test range from 2**32 to 2**32-1 (u32::MAX). (2**32 is an invalid time value, which gets truncated to 0 during serialization.) Also add some comments about DateTime conversions. Part of #477.
This commit is contained in:
parent
3c27c11012
commit
3f5e2695e3
|
@ -145,6 +145,8 @@ impl ZcashSerialize for BlockHeader {
|
||||||
self.previous_block_hash.zcash_serialize(&mut writer)?;
|
self.previous_block_hash.zcash_serialize(&mut writer)?;
|
||||||
writer.write_all(&self.merkle_root_hash.0[..])?;
|
writer.write_all(&self.merkle_root_hash.0[..])?;
|
||||||
writer.write_all(&self.final_sapling_root_hash.0[..])?;
|
writer.write_all(&self.final_sapling_root_hash.0[..])?;
|
||||||
|
// this is a truncating cast, rather than a saturating cast
|
||||||
|
// but u32 times are valid until 2106
|
||||||
writer.write_u32::<LittleEndian>(self.time.timestamp() as u32)?;
|
writer.write_u32::<LittleEndian>(self.time.timestamp() as u32)?;
|
||||||
writer.write_u32::<LittleEndian>(self.bits)?;
|
writer.write_u32::<LittleEndian>(self.bits)?;
|
||||||
writer.write_all(&self.nonce[..])?;
|
writer.write_all(&self.nonce[..])?;
|
||||||
|
@ -190,6 +192,7 @@ impl ZcashDeserialize for BlockHeader {
|
||||||
previous_block_hash: BlockHeaderHash::zcash_deserialize(&mut reader)?,
|
previous_block_hash: BlockHeaderHash::zcash_deserialize(&mut reader)?,
|
||||||
merkle_root_hash: MerkleTreeRootHash(reader.read_32_bytes()?),
|
merkle_root_hash: MerkleTreeRootHash(reader.read_32_bytes()?),
|
||||||
final_sapling_root_hash: SaplingNoteTreeRootHash(reader.read_32_bytes()?),
|
final_sapling_root_hash: SaplingNoteTreeRootHash(reader.read_32_bytes()?),
|
||||||
|
// This can't panic, because all u32 values are valid `Utc.timestamp`s
|
||||||
time: Utc.timestamp(reader.read_u32::<LittleEndian>()? as i64, 0),
|
time: Utc.timestamp(reader.read_u32::<LittleEndian>()? as i64, 0),
|
||||||
bits: reader.read_u32::<LittleEndian>()?,
|
bits: reader.read_u32::<LittleEndian>()?,
|
||||||
nonce: reader.read_32_bytes()?,
|
nonce: reader.read_32_bytes()?,
|
||||||
|
|
|
@ -16,11 +16,13 @@ impl Arbitrary for BlockHeader {
|
||||||
|
|
||||||
fn arbitrary_with(_args: ()) -> Self::Strategy {
|
fn arbitrary_with(_args: ()) -> Self::Strategy {
|
||||||
(
|
(
|
||||||
(4u32..2_147_483_647u32),
|
// version is interpreted as i32 in the spec, so we are limited to i32::MAX here
|
||||||
|
(4u32..(i32::MAX as u32)),
|
||||||
any::<BlockHeaderHash>(),
|
any::<BlockHeaderHash>(),
|
||||||
any::<MerkleTreeRootHash>(),
|
any::<MerkleTreeRootHash>(),
|
||||||
any::<SaplingNoteTreeRootHash>(),
|
any::<SaplingNoteTreeRootHash>(),
|
||||||
(0i64..4_294_967_296i64),
|
// time is interpreted as u32 in the spec, but rust timestamps are i64
|
||||||
|
(0i64..(u32::MAX as i64)),
|
||||||
any::<u32>(),
|
any::<u32>(),
|
||||||
any::<[u8; 32]>(),
|
any::<[u8; 32]>(),
|
||||||
any::<EquihashSolution>(),
|
any::<EquihashSolution>(),
|
||||||
|
|
Loading…
Reference in New Issue