haskoin-protocol-0.0.1: Network/Haskoin/Protocol/BlockHeader.hs
module Network.Haskoin.Protocol.BlockHeader ( BlockHeader(..) ) where
import Control.Applicative ((<$>),(<*>))
import Data.Word (Word32)
import Data.Binary (Binary, get, put)
import Data.Binary.Get (getWord32le)
import Data.Binary.Put (putWord32le)
import Network.Haskoin.Crypto (Hash256)
-- | Data type recording information on a 'Block'. The hash of a block is
-- defined as the hash of this data structure. The block mining process
-- involves finding a partial hash collision by varying the nonce in the
-- 'BlockHeader' and/or additional randomness in the 'CoinbaseTx' of this
-- 'Block'. Variations in the 'CoinbaseTx' will result in different merkle
-- roots in the 'BlockHeader'.
data BlockHeader =
BlockHeader {
-- | Block version information, based on the version of the
-- software creating this block.
blockVersion :: !Word32
-- | Hash of the previous block (parent) referenced by this
-- block.
, prevBlock :: !Hash256
-- | Root of the merkle tree of all transactions pertaining
-- to this block.
, merkleRoot :: !Hash256
-- | Unix timestamp recording when this block was created
, blockTimestamp :: !Word32
-- | The difficulty target being used for this block
, blockBits :: !Word32
-- | A random nonce used to generate this block. Additional
-- randomness is included in the coinbase transaction of
-- this block.
, bhNonce :: !Word32
} deriving (Eq, Show)
instance Binary BlockHeader where
get = BlockHeader <$> getWord32le
<*> get
<*> get
<*> getWord32le
<*> getWord32le
<*> getWord32le
put (BlockHeader v p m bt bb n) = do
putWord32le v
put p
put m
putWord32le bt
putWord32le bb
putWord32le n