Copyright | No rights reserved |
---|---|
License | UNLICENSE |
Maintainer | xenog@protonmail.com |
Stability | experimental |
Portability | POSIX |
Safe Haskell | None |
Language | Haskell2010 |
This module provides basic types used for the Bitcoin networking protocol
together with Serialize
instances for efficiently serializing and
de-serializing them.
Synopsis
- newtype Addr = Addr {}
- type NetworkAddressTime = (Word32, NetworkAddress)
- data Alert = Alert {}
- newtype GetData = GetData {
- getDataList :: [InvVector]
- newtype Inv = Inv {}
- data InvVector = InvVector {}
- data InvType
- data NetworkAddress = NetworkAddress {
- naServices :: !Word64
- naAddress :: !SockAddr
- newtype NotFound = NotFound {
- notFoundList :: [InvVector]
- newtype Ping = Ping {}
- newtype Pong = Pong {}
- data Reject = Reject {}
- data RejectCode
- newtype VarInt = VarInt {}
- newtype VarString = VarString {}
- data Version = Version {}
- data MessageCommand
- reject :: MessageCommand -> RejectCode -> ByteString -> Reject
- nodeNone :: Word64
- nodeNetwork :: Word64
- nodeGetUTXO :: Word64
- nodeBloom :: Word64
- nodeWitness :: Word64
- nodeXThin :: Word64
- commandToString :: MessageCommand -> ByteString
- stringToCommand :: ByteString -> Maybe MessageCommand
- putVarInt :: Integral a => a -> Put
- data Message
- = MVersion !Version
- | MVerAck
- | MAddr !Addr
- | MInv !Inv
- | MGetData !GetData
- | MNotFound !NotFound
- | MGetBlocks !GetBlocks
- | MGetHeaders !GetHeaders
- | MTx !Tx
- | MBlock !Block
- | MMerkleBlock !MerkleBlock
- | MHeaders !Headers
- | MGetAddr
- | MFilterLoad !FilterLoad
- | MFilterAdd !FilterAdd
- | MFilterClear
- | MPing !Ping
- | MPong !Pong
- | MAlert !Alert
- | MMempool
- | MReject !Reject
- | MSendHeaders
- data MessageHeader = MessageHeader {
- headMagic :: !Word32
- headCmd :: !MessageCommand
- headPayloadSize :: !Word32
- headChecksum :: !CheckSum32
- msgType :: Message -> MessageCommand
- putMessage :: Network -> Putter Message
- getMessage :: Network -> Get Message
- data BloomFlags
- data BloomFilter = BloomFilter {
- bloomData :: !(Seq Word8)
- bloomHashFuncs :: !Word32
- bloomTweak :: !Word32
- bloomFlags :: !BloomFlags
- newtype FilterLoad = FilterLoad {}
- newtype FilterAdd = FilterAdd {}
- bloomCreate :: Int -> Double -> Word32 -> BloomFlags -> BloomFilter
- bloomInsert :: BloomFilter -> ByteString -> BloomFilter
- bloomContains :: BloomFilter -> ByteString -> Bool
- isBloomValid :: BloomFilter -> Bool
- isBloomEmpty :: BloomFilter -> Bool
- isBloomFull :: BloomFilter -> Bool
- acceptsFilters :: Word64 -> Bool
Network Data Types
Provides information about known nodes in the bitcoin network. An Addr
type is sent inside a Message
as a response to a GetAddr
message.
type NetworkAddressTime = (Word32, NetworkAddress) Source #
Network address with a timestamp.
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.
Alert | |
|
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 of objects
that a node wants. The response to a GetBlock
message will 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 that contains unknown object hashes.
GetData | |
|
Inv
messages are used by nodes to advertise their knowledge of new
objects by publishing a list of hashes to a peer. Inv
messages can be sent
unsolicited or in response to a GetBlocks
message.
Invectory vectors represent hashes identifying objects such as a Block
or
a Tx
. They notify other peers about new data or data they have otherwise
requested.
Data type identifying the type of an inventory vector. SegWit types are
only used in GetData
messages, not Inv
.
InvError | error |
InvTx | transaction |
InvBlock | block |
InvMerkleBlock | filtered block |
InvWitnessTx | segwit transaction |
InvWitnessBlock | segwit block |
InvWitnessMerkleBlock | segwit filtere block |
data NetworkAddress Source #
Data type describing a bitcoin network address. Addresses are stored in IPv6 format. IPv4 addresses are mapped to IPv6 using IPv4 mapped IPv6 addresses: http://en.wikipedia.org/wiki/IPv6#IPv4-mapped_IPv6_addresses.
NetworkAddress | |
|
Instances
Eq NetworkAddress Source # | |
Defined in Network.Haskoin.Network.Common (==) :: NetworkAddress -> NetworkAddress -> Bool # (/=) :: NetworkAddress -> NetworkAddress -> Bool # | |
Show NetworkAddress Source # | |
Defined in Network.Haskoin.Network.Common showsPrec :: Int -> NetworkAddress -> ShowS # show :: NetworkAddress -> String # showList :: [NetworkAddress] -> ShowS # | |
Serialize NetworkAddress Source # | |
Defined in Network.Haskoin.Network.Common put :: Putter NetworkAddress # get :: Get NetworkAddress # |
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.
NotFound | |
|
A Ping
message is sent to bitcoin peers to check if a connection is still
open.
A Pong message is sent as a response to a ping message.
The Reject
message is sent when messages are rejected by a peer.
Reject | |
|
data RejectCode Source #
Rejection code associated to the Reject
message.
RejectMalformed | |
RejectInvalid | |
RejectObsolete | |
RejectDuplicate | |
RejectNonStandard | |
RejectDust | |
RejectInsufficientFee | |
RejectCheckpoint |
Instances
Eq RejectCode Source # | |
Defined in Network.Haskoin.Network.Common (==) :: RejectCode -> RejectCode -> Bool # (/=) :: RejectCode -> RejectCode -> Bool # | |
Read RejectCode Source # | |
Defined in Network.Haskoin.Network.Common readsPrec :: Int -> ReadS RejectCode # readList :: ReadS [RejectCode] # readPrec :: ReadPrec RejectCode # readListPrec :: ReadPrec [RejectCode] # | |
Show RejectCode Source # | |
Defined in Network.Haskoin.Network.Common showsPrec :: Int -> RejectCode -> ShowS # show :: RejectCode -> String # showList :: [RejectCode] -> ShowS # | |
Serialize RejectCode Source # | |
Defined in Network.Haskoin.Network.Common put :: Putter RejectCode # get :: Get RejectCode # |
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 serialization of variable-length strings.
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.
Version | |
|
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.
Instances
Eq MessageCommand Source # | |
Defined in Network.Haskoin.Network.Common (==) :: MessageCommand -> MessageCommand -> Bool # (/=) :: MessageCommand -> MessageCommand -> Bool # | |
Read MessageCommand Source # | |
Defined in Network.Haskoin.Network.Common readsPrec :: Int -> ReadS MessageCommand # readList :: ReadS [MessageCommand] # | |
Show MessageCommand Source # | |
Defined in Network.Haskoin.Network.Common showsPrec :: Int -> MessageCommand -> ShowS # show :: MessageCommand -> String # showList :: [MessageCommand] -> ShowS # | |
IsString MessageCommand Source # | |
Defined in Network.Haskoin.Network.Common fromString :: String -> MessageCommand # | |
Serialize MessageCommand Source # | |
Defined in Network.Haskoin.Network.Common put :: Putter MessageCommand # get :: Get MessageCommand # |
Useful Functions
reject :: MessageCommand -> RejectCode -> ByteString -> Reject Source #
Convenience function to build a Reject
message.
nodeNetwork :: Word64 Source #
Services indicate node is a full node that can serve full blocks.
nodeGetUTXO :: Word64 Source #
Services indicate node allows to request UTXO
set.
nodeWitness :: Word64 Source #
Services indicate SegWit-capable node.
commandToString :: MessageCommand -> ByteString Source #
Convert a MessageCommand
to its string representation.
stringToCommand :: ByteString -> Maybe MessageCommand Source #
Read a MessageCommand
from its string representation.
Network Message
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.
MessageHeader | |
|
Instances
Eq MessageHeader Source # | |
Defined in Network.Haskoin.Network.Message (==) :: MessageHeader -> MessageHeader -> Bool # (/=) :: MessageHeader -> MessageHeader -> Bool # | |
Show MessageHeader Source # | |
Defined in Network.Haskoin.Network.Message showsPrec :: Int -> MessageHeader -> ShowS # show :: MessageHeader -> String # showList :: [MessageHeader] -> ShowS # | |
Serialize MessageHeader Source # | |
Defined in Network.Haskoin.Network.Message put :: Putter MessageHeader # get :: Get MessageHeader # |
msgType :: Message -> MessageCommand Source #
Get MessageCommand
assocated with a message.
Bloom Filters
data BloomFlags Source #
The bloom flags are used to tell the remote peer how to auto-update the provided bloom filter.
BloomUpdateNone | never update |
BloomUpdateAll | auto-update on all outputs |
BloomUpdateP2PubKeyOnly | auto-update on pay-to-pubkey or pay-to-multisig (default) |
Instances
Eq BloomFlags Source # | |
Defined in Network.Haskoin.Network.Bloom (==) :: BloomFlags -> BloomFlags -> Bool # (/=) :: BloomFlags -> BloomFlags -> Bool # | |
Read BloomFlags Source # | |
Defined in Network.Haskoin.Network.Bloom readsPrec :: Int -> ReadS BloomFlags # readList :: ReadS [BloomFlags] # readPrec :: ReadPrec BloomFlags # readListPrec :: ReadPrec [BloomFlags] # | |
Show BloomFlags Source # | |
Defined in Network.Haskoin.Network.Bloom showsPrec :: Int -> BloomFlags -> ShowS # show :: BloomFlags -> String # showList :: [BloomFlags] -> ShowS # | |
Serialize BloomFlags Source # | |
Defined in Network.Haskoin.Network.Bloom put :: Putter BloomFlags # get :: Get BloomFlags # |
data BloomFilter Source #
A bloom filter is a probabilistic data structure that SPV clients send to other peers to filter the set of transactions received from them. Bloom filters can have false positives but not false negatives. Some transactions that pass the filter may not be relevant to the receiving peer. By controlling the false positive rate, SPV nodes can trade off bandwidth versus privacy.
BloomFilter | |
|
Instances
Eq BloomFilter Source # | |
Defined in Network.Haskoin.Network.Bloom (==) :: BloomFilter -> BloomFilter -> Bool # (/=) :: BloomFilter -> BloomFilter -> Bool # | |
Read BloomFilter Source # | |
Defined in Network.Haskoin.Network.Bloom readsPrec :: Int -> ReadS BloomFilter # readList :: ReadS [BloomFilter] # readPrec :: ReadPrec BloomFilter # readListPrec :: ReadPrec [BloomFilter] # | |
Show BloomFilter Source # | |
Defined in Network.Haskoin.Network.Bloom showsPrec :: Int -> BloomFilter -> ShowS # show :: BloomFilter -> String # showList :: [BloomFilter] -> ShowS # | |
Serialize BloomFilter Source # | |
Defined in Network.Haskoin.Network.Bloom put :: Putter BloomFilter # get :: Get BloomFilter # |
newtype FilterLoad Source #
Set a new bloom filter on the peer connection.
Instances
Eq FilterLoad Source # | |
Defined in Network.Haskoin.Network.Bloom (==) :: FilterLoad -> FilterLoad -> Bool # (/=) :: FilterLoad -> FilterLoad -> Bool # | |
Read FilterLoad Source # | |
Defined in Network.Haskoin.Network.Bloom readsPrec :: Int -> ReadS FilterLoad # readList :: ReadS [FilterLoad] # readPrec :: ReadPrec FilterLoad # readListPrec :: ReadPrec [FilterLoad] # | |
Show FilterLoad Source # | |
Defined in Network.Haskoin.Network.Bloom showsPrec :: Int -> FilterLoad -> ShowS # show :: FilterLoad -> String # showList :: [FilterLoad] -> ShowS # | |
Serialize FilterLoad Source # | |
Defined in Network.Haskoin.Network.Bloom put :: Putter FilterLoad # get :: Get FilterLoad # |
Add the given data element to the connections current filter without requiring a completely new one to be set.
:: Int | number of elements |
-> Double | false positive rate |
-> Word32 | random nonce (tweak) for the hash function |
-> BloomFlags | bloom filter flags |
-> BloomFilter | bloom filter |
Build a bloom filter that will provide the given false positive rate when the given number of elements have been inserted.
:: BloomFilter | Original bloom filter |
-> ByteString | New data to insert |
-> BloomFilter | Bloom filter containing the new data |
Insert arbitrary data into a bloom filter. Returns the new bloom filter containing the new data.
:: BloomFilter | Bloom filter |
-> ByteString | Data that will be checked against the given bloom filter |
-> Bool | Returns True if the data matches the filter |
Tests if some arbitrary data matches the filter. This can be either because the data was inserted into the filter or because it is a false positive.
:: BloomFilter | Bloom filter to test |
-> Bool | True if the given filter is valid |
Tests if a given bloom filter is valid.
isBloomEmpty :: BloomFilter -> Bool Source #
Returns True if the filter is empty (all bytes set to 0x00)
isBloomFull :: BloomFilter -> Bool Source #
Returns True if the filter is full (all bytes set to 0xff)
acceptsFilters :: Word64 -> Bool Source #
Does the peer with these version services accept bloom filters?