bitcoin-block-0.13.1: src/Data/Bitcoin/Block.hs
module Data.Bitcoin.Block ( decode
, encode
, headerHash
, module Data.Bitcoin.Block.Types) where
import Control.Lens ((^.))
import qualified Data.Binary as B (encode)
import qualified Data.ByteString as BS (reverse)
import qualified Data.ByteString.Lazy as BSL (toStrict)
import qualified Crypto.Hash.SHA256 as Sha256
import qualified Data.HexString as HS
import Data.Bitcoin.Block.Types
-- | Decodes a hex representation of a transaction into a 'Block' object.
decode :: HS.HexString -- ^ The hexadecimal representation of the transaction
-> Block -- ^ The decoded 'Transaction' object
decode = HS.toBinary
-- | Encodes a 'Block' object into a hex representation.
encode :: Block -- ^ The 'Transaction' we would like to encode to hex
-> HS.HexString -- ^ The hexadecimal representation of the transaction
encode = HS.fromBinary
-- | Calculates the transaction id of a 'Transaction' as a 'HS.HexString' so it
-- can be used in RPC interfaces.
headerHash :: Block -> HS.HexString
headerHash block =
-- Bitcoin uses a "double sha256", also known as sha256d as its hash algo
let sha256d = Sha256.hash . Sha256.hash
bytes = BSL.toStrict . B.encode
in HS.fromBytes . BS.reverse . sha256d . bytes $ (block ^. blockHeader)