zebra/zebra-chain/src/block.rs

65 lines
1.8 KiB
Rust
Raw Normal View History

//! Definitions of block datastructures.
2020-05-26 18:00:58 -07:00
#![allow(clippy::unit_arg)]
mod hash;
mod header;
mod serialize;
#[cfg(test)]
mod tests;
use serde::{Deserialize, Serialize};
use std::sync::Arc;
#[cfg(test)]
use proptest_derive::Arbitrary;
use crate::transaction::Transaction;
2020-02-08 13:19:32 -08:00
use crate::types::BlockHeight;
pub use hash::BlockHeaderHash;
pub use header::BlockHeader;
/// A block in your blockchain.
///
/// A block is a data structure with two fields:
///
/// Block header: a data structure containing the block's metadata
/// Transactions: an array (vector in Rust) of transactions
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
#[cfg_attr(test, derive(Arbitrary))]
2019-09-24 11:16:41 -07:00
pub struct Block {
/// The block header, containing block metadata.
2019-09-24 11:16:41 -07:00
pub header: BlockHeader,
/// The block transactions.
2020-06-05 10:58:01 -07:00
pub transactions: Vec<Arc<Transaction>>,
2019-09-24 11:16:41 -07:00
}
/// The maximum size of a Zcash block, in bytes.
///
/// Post-Sapling, this is also the maximum size of a transaction
/// in the Zcash specification. (But since blocks also contain a
/// block header and transaction count, the maximum size of a
/// transaction in the chain is approximately 1.5 kB smaller.)
const MAX_BLOCK_BYTES: u64 = 2_000_000;
2020-02-08 13:19:32 -08:00
impl Block {
/// Return the block height reported in the coinbase transaction, if any.
pub fn coinbase_height(&self) -> Option<BlockHeight> {
use crate::transaction::TransparentInput;
self.transactions
.get(0)
.and_then(|tx| tx.inputs().next())
.and_then(|input| match input {
TransparentInput::Coinbase { ref height, .. } => Some(*height),
_ => None,
})
}
}
impl<'a> From<&'a Block> for BlockHeaderHash {
fn from(block: &'a Block) -> BlockHeaderHash {
(&block.header).into()
}
}