Block and BlockHeader types
This commit is contained in:
parent
fe95ad3824
commit
00494d4963
|
@ -7,6 +7,7 @@ edition = "2018"
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
sha2 = "0.8"
|
|
||||||
byteorder = "1.3"
|
byteorder = "1.3"
|
||||||
failure = "0.1"
|
chrono = "0.4"
|
||||||
|
failure = "0.1"
|
||||||
|
sha2 = "0.8"
|
||||||
|
|
|
@ -1,6 +1,66 @@
|
||||||
//! Definitions of block datastructures.
|
//! Definitions of block datastructures.
|
||||||
|
|
||||||
/// A block in your blockchain.
|
use crate::transaction::Transaction;
|
||||||
pub struct Block {}
|
use chrono::{DateTime, Utc};
|
||||||
|
|
||||||
impl Block {}
|
/// Block header
|
||||||
|
pub struct BlockHeader {
|
||||||
|
/// A SHA-256d hash in internal byte order of the previous block’s
|
||||||
|
/// header. This ensures no previous block can be changed without
|
||||||
|
/// also changing this block’s header .
|
||||||
|
previous_block_hash: [u8; 32],
|
||||||
|
|
||||||
|
/// A SHA-256d hash in internal byte order. The merkle root is
|
||||||
|
/// derived from the hashes of all transactions included in this
|
||||||
|
/// block, ensuring that none of those transactions can be modied
|
||||||
|
/// without modifying the header.
|
||||||
|
merkle_root_hash: [u8; 32],
|
||||||
|
|
||||||
|
/// [Sapling onward] The root LEBS2OSP256(rt) of the Sapling note
|
||||||
|
/// commitment tree corresponding to the nal Sapling treestate of
|
||||||
|
/// this block.
|
||||||
|
// TODO: replace type with custom SaplingRoot or similar type
|
||||||
|
// hash_final_sapling_root: [u8; 32],
|
||||||
|
|
||||||
|
/// The block timestamp is a Unix epoch time (UTC) when the miner
|
||||||
|
/// started hashing the header (according to the miner).
|
||||||
|
time: DateTime<Utc>,
|
||||||
|
|
||||||
|
/// An encoded version of the target threshold this block’s header
|
||||||
|
/// hash must be less than or equal to, in the same nBits format
|
||||||
|
/// used by Bitcoin.
|
||||||
|
///
|
||||||
|
/// For a block at block height height, bits MUST be equal to
|
||||||
|
/// ThresholdBits(height).
|
||||||
|
///
|
||||||
|
/// [Bitcoin-nBits](https://bitcoin.org/en/developer-reference#target-nbits)
|
||||||
|
// pzec has their own wrapper around u32 for this field:
|
||||||
|
// https://github.com/ZcashFoundation/zebra/blob/master/zebra-primitives/src/compact.rs
|
||||||
|
bits: u32,
|
||||||
|
|
||||||
|
/// An arbitrary field that miners can change to modify the header
|
||||||
|
/// hash in order to produce a hash less than or equal to the
|
||||||
|
/// target threshold.
|
||||||
|
nonce: [u8; 32],
|
||||||
|
|
||||||
|
/// The Equihash solution.
|
||||||
|
// The solution size when serialized should be in bytes ('always 1344').
|
||||||
|
solution: [u8; 1344],
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BlockHeader {
|
||||||
|
/// Get the SHA-256d hash in internal byte order of this block header.
|
||||||
|
pub fn hash(&self) -> [u8; 32] {
|
||||||
|
unimplemented!();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A block in your blockchain.
|
||||||
|
pub struct Block {
|
||||||
|
/// First 80 bytes of the block as defined by the encoding used by
|
||||||
|
/// "block" messages
|
||||||
|
pub header: BlockHeader,
|
||||||
|
|
||||||
|
///
|
||||||
|
pub transactions: Vec<Transaction>,
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue