From 00494d4963ad393a271d1fada55fe04c6b0293a3 Mon Sep 17 00:00:00 2001 From: Deirdre Connolly Date: Tue, 24 Sep 2019 14:16:41 -0400 Subject: [PATCH] Block and BlockHeader types --- zebra-chain/Cargo.toml | 5 +-- zebra-chain/src/block.rs | 66 ++++++++++++++++++++++++++++++++++++++-- 2 files changed, 66 insertions(+), 5 deletions(-) diff --git a/zebra-chain/Cargo.toml b/zebra-chain/Cargo.toml index a319a2f02..7587a6be7 100644 --- a/zebra-chain/Cargo.toml +++ b/zebra-chain/Cargo.toml @@ -7,6 +7,7 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -sha2 = "0.8" byteorder = "1.3" -failure = "0.1" \ No newline at end of file +chrono = "0.4" +failure = "0.1" +sha2 = "0.8" diff --git a/zebra-chain/src/block.rs b/zebra-chain/src/block.rs index 6fca28c4e..1c26afdfe 100644 --- a/zebra-chain/src/block.rs +++ b/zebra-chain/src/block.rs @@ -1,6 +1,66 @@ //! Definitions of block datastructures. -/// A block in your blockchain. -pub struct Block {} +use crate::transaction::Transaction; +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, + + /// 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, +}