Safe Haskell | None |
---|
Network.Haskoin.Protocol
Description
This package provides all of the basic types used for the Bitcoin networking protocol together with Data.Binary instances for efficiently serializing and de-serializing them. More information on the bitcoin protocol is available here: http://en.bitcoin.it/wiki/Protocol_specification
- data Block = Block {
- blockHeader :: !BlockHeader
- blockCoinbaseTx :: !CoinbaseTx
- blockTxns :: ![Tx]
- data GetBlocks = GetBlocks {
- getBlocksVersion :: !Word32
- getBlocksLocator :: !BlockLocator
- getBlocksHashStop :: !Hash256
- data BlockHeader = BlockHeader {
- blockVersion :: !Word32
- prevBlock :: !Hash256
- merkleRoot :: !Hash256
- blockTimestamp :: !Word32
- blockBits :: !Word32
- bhNonce :: !Word32
- data GetHeaders = GetHeaders {
- getHeadersVersion :: !Word32
- getHeadersBL :: !BlockLocator
- getHeadersHashStop :: !Hash256
- data Headers = Headers {
- headersList :: ![BlockHeaderCount]
- type BlockHeaderCount = (BlockHeader, VarInt)
- data GetData = GetData {
- getDataList :: ![InvVector]
- data Inv = Inv {}
- data InvVector = InvVector {}
- data InvType
- data NotFound = NotFound {
- notFoundList :: ![InvVector]
- data Script = Script {}
- data ScriptOp
- = OP_PUSHDATA ByteString
- | OP_0
- | OP_1NEGATE
- | OP_1
- | OP_2
- | OP_3
- | OP_4
- | OP_5
- | OP_6
- | OP_7
- | OP_8
- | OP_9
- | OP_10
- | OP_11
- | OP_12
- | OP_13
- | OP_14
- | OP_15
- | OP_16
- | OP_VERIFY
- | OP_DUP
- | OP_EQUAL
- | OP_EQUALVERIFY
- | OP_HASH160
- | OP_CHECKSIG
- | OP_CHECKMULTISIG
- | OP_PUBKEY PubKey
- | OP_INVALIDOPCODE Word8
- getScriptOps :: Get [ScriptOp]
- putScriptOps :: [ScriptOp] -> Put
- decodeScriptOps :: ByteString -> Either String Script
- encodeScriptOps :: Script -> ByteString
- data Tx = Tx {}
- txid :: Tx -> Hash256
- data CoinbaseTx = CoinbaseTx {
- cbVersion :: !Word32
- cbData :: !ByteString
- cbOut :: ![TxOut]
- cbLockTime :: !Word32
- data TxIn = TxIn {
- prevOutput :: !OutPoint
- scriptInput :: !Script
- txInSequence :: !Word32
- data TxOut = TxOut {
- outValue :: !Word64
- scriptOutput :: !Script
- data OutPoint = OutPoint {
- outPointHash :: !Hash256
- outPointIndex :: !Word32
- encodeTxid :: Hash256 -> String
- decodeTxid :: String -> Maybe Hash256
- newtype VarInt = VarInt {}
- newtype VarString = VarString {}
- data NetworkAddress = NetworkAddress {}
- data Addr = Addr {
- addrList :: ![NetworkAddressTime]
- type NetworkAddressTime = (Word32, NetworkAddress)
- data Version = Version {}
- newtype Ping = Ping {}
- newtype Pong = Pong {}
- data Alert = Alert {}
- data Message
- data MessageHeader = MessageHeader {
- headMagic :: !Word32
- headCmd :: !MessageCommand
- headPayloadSize :: !Word32
- headChecksum :: !CheckSum32
- data MessageCommand
- = MCVersion
- | MCVerAck
- | MCAddr
- | MCInv
- | MCGetData
- | MCNotFound
- | MCGetBlocks
- | MCGetHeaders
- | MCTx
- | MCBlock
- | MCHeaders
- | MCGetAddr
- | MCPing
- | MCPong
- | MCAlert
Blocks
Data type describing a block in the bitcoin protocol. Blocks are sent in
response to GetData
messages that are requesting information from a
block hash.
Constructors
Block | |
Fields
|
Data type representing a GetBlocks message request. It is used in the
bitcoin protocol to retrieve blocks from a peer by providing it a
BlockLocator
object. The BlockLocator
is a sparse list of block hashes
from the caller node with the purpose of informing the receiving node
about the state of the caller's blockchain. The receiver node will detect
a wrong branch in the caller's main chain and send the caller appropriate
Blocks
. The response to a GetBlocks
message is an Inv
message
containing the list of block hashes pertaining to the request.
Constructors
GetBlocks | |
Fields
|
Block Headers
data BlockHeader Source
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
.
Constructors
BlockHeader | |
Fields
|
data GetHeaders Source
Similar to the GetBlocks
message type but for retrieving block headers
only. The response to a GetHeaders
request is a Headers
message
containing a list of block headers pertaining to the request. A maximum of
2000 block headers can be returned. GetHeaders
is used by thin (SPV)
clients to exclude block contents when synchronizing the blockchain.
Constructors
GetHeaders | |
Fields
|
Instances
The Headers
type is used to return a list of block headers in
response to a GetHeaders
message.
Constructors
Headers | |
Fields
|
type BlockHeaderCount = (BlockHeader, VarInt)Source
BlockHeader
type with a transaction count as VarInt
Requesting data
The GetData
type is used to retrieve information on a specific object
(Block
or Tx
) identified by the objects hash. The payload of a GetData
request is a list of InvVector
which represent all the hashes for which a
node wants to request information. The response to a GetBlock
message
wille be either a Block
or a Tx
message depending on the type of the
object referenced by the hash. Usually, GetData
messages are sent after a
node receives an Inv
message to obtain information on unknown object
hashes.
Constructors
GetData | |
Fields
|
Invectory vectors represent hashes identifying objects such as a Block
or a Tx
. They are sent inside messages to notify other peers about
new data or data they have requested.
Constructors
InvVector | |
Data type identifying the type of an inventory vector.
A NotFound
message is returned as a response to a GetData
message
whe one of the requested objects could not be retrieved. This could happen,
for example, if a tranasaction was requested and was not available in the
memory pool of the receiving node.
Constructors
NotFound | |
Fields
|
Scripts
More informations on scripts is available here: http://en.bitcoin.it/wiki/Script
Data type representing a transaction script. Scripts are defined as lists
of script operators ScriptOp
. Scripts are used to:
- Define the spending conditions in the output of a transaction
- Provide the spending signatures in the input of a transaction
Data type representing all of the operators allowed inside a Script
.
putScriptOps :: [ScriptOp] -> PutSource
decodeScriptOps :: ByteString -> Either String ScriptSource
Decode a Script
from a ByteString by omiting the length of the script.
This is used to produce scripthash addresses.
encodeScriptOps :: Script -> ByteStringSource
Encode a Script
into a ByteString by omiting the length of the script.
This is used to produce scripthash addresses.
Transactions
Data type representing a bitcoin transaction
Constructors
Tx | |
data CoinbaseTx Source
Data type representing the coinbase transaction of a Block
. Coinbase
transactions are special types of transactions which are created by miners
when they find a new block. Coinbase transactions have no inputs. They have
outputs sending the newly generated bitcoins together with all the block's
fees to a bitcoin address (usually the miners address). Data can be embedded
in a Coinbase transaction which can be chosen by the miner of a block. This
data also typically contains some randomness which is used, together with
the nonce, to find a partial hash collision on the block's hash.
Constructors
CoinbaseTx | |
Fields
|
Instances
Data type representing a transaction input.
Constructors
TxIn | |
Fields
|
Data type representing a transaction output.
Constructors
TxOut | |
Fields
|
The OutPoint is used inside a transaction input to reference the previous transaction output that it is spending.
Constructors
OutPoint | |
Fields
|
encodeTxid :: Hash256 -> StringSource
Encodes a transaction hash as little endian in HEX format. This is mostly used for displaying transaction ids. Internally, these ids are handled as big endian but are transformed to little endian when displaying them.
decodeTxid :: String -> Maybe Hash256Source
Decodes a little endian transaction hash in HEX format.
Network types
Data type representing a variable length integer. The VarInt
type
usually precedes an array or a string that can vary in length.
Data type for variable length strings. Variable length strings are
serialized as a VarInt
followed by a bytestring.
Constructors
VarString | |
Fields |
data NetworkAddress Source
Data type describing a bitcoin network address. Addresses are stored in
IPv6. IPv4 addresses are mapped to IPv6 using IPv4 mapped IPv6 addresses:
http://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses. Sometimes,
timestamps are sent together with the NetworkAddress
such as in the Addr
data type.
Constructors
NetworkAddress | |
Provides information on known nodes in the bitcoin network. An Addr
type is sent inside a Message
as a response to a GetAddr
message.
Constructors
Addr | |
Fields
|
type NetworkAddressTime = (Word32, NetworkAddress)Source
Network address with a timestamp
When a bitcoin node creates an outgoing connection to another node,
the first message it will send is a Version
message. The other node
will similarly respond with it's own Version
message.
Constructors
Version | |
Fields
|
A Ping message is sent to bitcoin peers to check if a TCP/IP connection is still valid.
Constructors
Ping | |
A Pong message is sent as a response to a ping message.
Constructors
Pong | |
Data type describing signed messages that can be sent between bitcoin nodes to display important notifications to end users about the health of the network.
Constructors
Alert | |
Fields
|
Messages
The Message
type is used to identify all the valid messages that can be
sent between bitcoin peers. Only values of type Message
will be accepted
by other bitcoin peers as bitcoin protocol messages need to be correctly
serialized with message headers. Serializing a Message
value will
include the MessageHeader
with the correct checksum value automatically.
No need to add the MessageHeader
separately.
data MessageHeader Source
Data type representing the header of a Message
. All messages sent between
nodes contain a message header.
Constructors
MessageHeader | |
Fields
|
data MessageCommand Source
A MessageCommand
is included in a MessageHeader
in order to identify
the type of message present in the payload. This allows the message
de-serialization code to know how to decode a particular message payload.
Every valid Message
constructor has a corresponding MessageCommand
constructor.