module Data.Bitcoin.Block.Types where
import Data.Binary (Binary, get, put)
import Data.Binary.Get (getByteString, getWord32le)
import Data.Binary.Put (putByteString, putWord32le)
import Control.Lens.TH (makeLenses)
import Control.Monad (forM_, replicateM)
import qualified Data.ByteString as BS
import qualified Data.HexString as HS
import Data.LargeWord (Word256)
import Data.Word (Word32)
import qualified Data.Bitcoin.Transaction as Btc (Coinbase, Transaction (..))
import Data.Bitcoin.Types (BlockHash, VarInt (..))
data BlockHeader = BlockHeader {
_blockVersion :: Word32,
_prevBlock :: BlockHash,
_merkleRoot :: Word256,
_blockTimestamp :: Word32,
_blockBits :: Word32,
_bhNonce :: Word32
} deriving (Eq, Show)
makeLenses ''BlockHeader
instance Binary BlockHeader where
get = do
v <- getWord32le
p <- getByteString 32
m <- get
bt <- getWord32le
bb <- getWord32le
n <- getWord32le
return $ BlockHeader v ((HS.fromBytes . BS.reverse) p) m bt bb n
put (BlockHeader v p m bt bb n) = do
putWord32le v
putByteString ((BS.reverse . HS.toBytes) p)
put m
putWord32le bt
putWord32le bb
putWord32le n
data Block = Block {
_blockHeader :: BlockHeader,
_blockCoinbaseTx :: Btc.Coinbase,
_blockTxns :: [Btc.Transaction]
} deriving (Eq, Show)
makeLenses ''Block
instance Binary Block where
get = do
header <- get
(VarInt c) <- get
cb <- get
txs <- replicateM (fromIntegral (c1)) get
return $ Block header cb txs
put (Block h cb txs) = do
put h
put $ VarInt $ fromIntegral $ length txs + 1
put cb
forM_ txs put