Copyright | No rights reserved |
---|---|
License | UNLICENSE |
Maintainer | xenog@protonmail.com |
Stability | experimental |
Portability | POSIX |
Safe Haskell | None |
Language | Haskell2010 |
Common functions used by Haskoin Node.
Synopsis
- type HostPort = (Host, Port)
- type Host = String
- type Port = Int
- data OnlinePeer = OnlinePeer {
- onlinePeerAddress :: !SockAddr
- onlinePeerVerAck :: !Bool
- onlinePeerConnected :: !Bool
- onlinePeerVersion :: !(Maybe Version)
- onlinePeerAsync :: !(Async ())
- onlinePeerMailbox :: !Peer
- onlinePeerNonce :: !Word64
- onlinePeerPing :: !(Maybe (UTCTime, Word64))
- onlinePeerPings :: ![NominalDiffTime]
- type Peer = Mailbox PeerMessage
- type Chain = Mailbox ChainMessage
- type Manager = Mailbox ManagerMessage
- data NodeConfig = NodeConfig {
- nodeConfMaxPeers :: !Int
- nodeConfDB :: !DB
- nodeConfPeers :: ![HostPort]
- nodeConfDiscover :: !Bool
- nodeConfNetAddr :: !NetworkAddress
- nodeConfNet :: !Network
- nodeConfEvents :: !(Listen NodeEvent)
- nodeConfTimeout :: !Int
- data ManagerConfig = ManagerConfig {
- mgrConfMaxPeers :: !Int
- mgrConfDB :: !DB
- mgrConfPeers :: ![HostPort]
- mgrConfDiscover :: !Bool
- mgrConfNetAddr :: !NetworkAddress
- mgrConfNetwork :: !Network
- mgrConfEvents :: !(Listen PeerEvent)
- mgrConfTimeout :: !Int
- data ManagerMessage
- data ChainConfig = ChainConfig {
- chainConfDB :: !DB
- chainConfNetwork :: !Network
- chainConfEvents :: !(Listen ChainEvent)
- chainConfTimeout :: !Int
- data ChainMessage
- = ChainGetBest !(Listen BlockNode)
- | ChainHeaders !Peer ![BlockHeader]
- | ChainGetAncestor !BlockHeight !BlockNode !(Listen (Maybe BlockNode))
- | ChainGetSplit !BlockNode !BlockNode !(Listen BlockNode)
- | ChainGetBlock !BlockHash !(Listen (Maybe BlockNode))
- | ChainIsSynced !(Listen Bool)
- | ChainPing
- | ChainPeerConnected !Peer !SockAddr
- | ChainPeerDisconnected !Peer !SockAddr
- data ChainEvent
- data NodeEvent
- data PeerConfig = PeerConfig {}
- data PeerException
- data PeerEvent
- data PeerMessage
- toSockAddr :: MonadUnliftIO m => HostPort -> m [SockAddr]
- fromSockAddr :: MonadUnliftIO m => SockAddr -> m (Maybe HostPort)
- myVersion :: Word32
- managerPeerMessage :: MonadIO m => Peer -> Message -> Manager -> m ()
- managerGetPeers :: MonadIO m => Manager -> m [OnlinePeer]
- managerGetPeer :: MonadIO m => Peer -> Manager -> m (Maybe OnlinePeer)
- killPeer :: MonadIO m => PeerException -> Peer -> m ()
- managerCheck :: MonadIO m => Peer -> Manager -> m ()
- managerConnect :: MonadIO m => Manager -> m ()
- managerSetBest :: MonadIO m => BlockHeight -> Manager -> m ()
- sendMessage :: MonadIO m => Message -> Peer -> m ()
- peerGetPublisher :: MonadUnliftIO m => Int -> Peer -> m (Maybe (Publisher Message))
- peerGetBlocks :: MonadUnliftIO m => Network -> Int -> Peer -> [BlockHash] -> m (Maybe [Block])
- peerGetTxs :: MonadUnliftIO m => Network -> Int -> Peer -> [TxHash] -> m (Maybe [Tx])
- peerGetData :: MonadUnliftIO m => Int -> Peer -> GetData -> m (Maybe [Either Tx Block])
- peerPing :: MonadUnliftIO m => Int -> Peer -> m Bool
- buildVersion :: Network -> Word64 -> BlockHeight -> NetworkAddress -> NetworkAddress -> Word64 -> Version
- chainGetBlock :: MonadIO m => BlockHash -> Chain -> m (Maybe BlockNode)
- chainGetBest :: MonadIO m => Chain -> m BlockNode
- chainGetAncestor :: MonadIO m => BlockHeight -> BlockNode -> Chain -> m (Maybe BlockNode)
- chainGetParents :: MonadIO m => BlockHeight -> BlockNode -> Chain -> m [BlockNode]
- chainGetSplitBlock :: MonadIO m => BlockNode -> BlockNode -> Chain -> m BlockNode
- chainPeerConnected :: MonadIO m => Peer -> SockAddr -> Chain -> m ()
- chainPeerDisconnected :: MonadIO m => Peer -> SockAddr -> Chain -> m ()
- chainBlockMain :: MonadIO m => BlockHash -> Chain -> m Bool
- chainIsSynced :: MonadIO m => Chain -> m Bool
- chainHeaders :: MonadIO m => Peer -> [BlockHeader] -> Chain -> m ()
- withConnection :: MonadUnliftIO m => SockAddr -> (AppData -> m a) -> m a
- median :: Fractional a => [a] -> Maybe a
Documentation
data OnlinePeer Source #
Data structure representing an online peer.
OnlinePeer | |
|
Instances
Eq OnlinePeer Source # | |
Defined in Network.Haskoin.Node.Common (==) :: OnlinePeer -> OnlinePeer -> Bool # (/=) :: OnlinePeer -> OnlinePeer -> Bool # | |
Ord OnlinePeer Source # | |
Defined in Network.Haskoin.Node.Common compare :: OnlinePeer -> OnlinePeer -> Ordering # (<) :: OnlinePeer -> OnlinePeer -> Bool # (<=) :: OnlinePeer -> OnlinePeer -> Bool # (>) :: OnlinePeer -> OnlinePeer -> Bool # (>=) :: OnlinePeer -> OnlinePeer -> Bool # max :: OnlinePeer -> OnlinePeer -> OnlinePeer # min :: OnlinePeer -> OnlinePeer -> OnlinePeer # |
type Peer = Mailbox PeerMessage Source #
Mailbox for a peer.
type Chain = Mailbox ChainMessage Source #
Mailbox for chain header syncing process.
type Manager = Mailbox ManagerMessage Source #
Mailbox for peer manager process.
data NodeConfig Source #
General node configuration.
NodeConfig | |
|
data ManagerConfig Source #
Peer manager configuration.
ManagerConfig | |
|
data ManagerMessage Source #
Messages that can be sent to the peer manager.
ManagerConnect | try to connect to peers |
ManagerGetPeers !(Listen [OnlinePeer]) | get all connected peers |
ManagerGetOnlinePeer !Peer !(Listen (Maybe OnlinePeer)) | get a peer information |
ManagerPurgePeers | delete all known peers |
ManagerCheckPeer !Peer | check this peer |
ManagerPeerMessage !Peer !Message | peer got a message that is forwarded to manager |
ManagerPeerDied !Child !(Maybe SomeException) | child died |
ManagerBestBlock !BlockHeight | set this as our best block |
data ChainConfig Source #
Configuration for chain syncing process.
ChainConfig | |
|
data ChainMessage Source #
Messages that can be sent to the chain process.
ChainGetBest !(Listen BlockNode) | get best block known |
ChainHeaders !Peer ![BlockHeader] | |
ChainGetAncestor !BlockHeight !BlockNode !(Listen (Maybe BlockNode)) | get ancestor for |
ChainGetSplit !BlockNode !BlockNode !(Listen BlockNode) | get highest common node |
ChainGetBlock !BlockHash !(Listen (Maybe BlockNode)) | get a block header |
ChainIsSynced !(Listen Bool) | is chain in sync with network? |
ChainPing | internal message for process housekeeping |
ChainPeerConnected !Peer !SockAddr | internal message to notify that a peer has connected |
ChainPeerDisconnected !Peer !SockAddr | internal message to notify that a peer has disconnected |
data ChainEvent Source #
Events originating from chain syncing process.
ChainBestBlock !BlockNode | chain has new best block |
ChainSynced !BlockNode | chain is in sync with the network |
Instances
Eq ChainEvent Source # | |
Defined in Network.Haskoin.Node.Common (==) :: ChainEvent -> ChainEvent -> Bool # (/=) :: ChainEvent -> ChainEvent -> Bool # | |
Show ChainEvent Source # | |
Defined in Network.Haskoin.Node.Common showsPrec :: Int -> ChainEvent -> ShowS # show :: ChainEvent -> String # showList :: [ChainEvent] -> ShowS # |
Chain and peer events generated by the node.
ChainEvent !ChainEvent | events from the chain syncing process |
PeerEvent !PeerEvent | events from peers and peer manager |
data PeerConfig Source #
Configuration for a particular peer.
PeerConfig | |
|
data PeerException Source #
Reasons why a peer may stop working.
PeerMisbehaving !String | peer is being a naughty boy |
DuplicateVersion | peer sent an extra version message |
DecodeHeaderError | incoming message headers could not be decoded |
CannotDecodePayload | incoming message payload could not be decoded |
PeerIsMyself | nonce for peer matches ours |
PayloadTooLarge !Word32 | message payload too large |
PeerAddressInvalid | peer address not valid |
PeerSentBadHeaders | peer sent wrong headers |
NotNetworkPeer | peer cannot serve block chain data |
PeerNoSegWit | peer has no segwit support |
PeerTimeout | request to peer timed out |
PurgingPeer | peers are being purged |
UnknownPeer | peer is unknown |
Instances
Eq PeerException Source # | |
Defined in Network.Haskoin.Node.Common (==) :: PeerException -> PeerException -> Bool # (/=) :: PeerException -> PeerException -> Bool # | |
Show PeerException Source # | |
Defined in Network.Haskoin.Node.Common showsPrec :: Int -> PeerException -> ShowS # show :: PeerException -> String # showList :: [PeerException] -> ShowS # | |
Exception PeerException Source # | |
Defined in Network.Haskoin.Node.Common |
Events originating from peers and the peer manager.
PeerConnected !Peer !SockAddr | new peer connected |
PeerDisconnected !Peer !SockAddr | peer disconnected |
PeerMessage !Peer !Message | peer sent a message |
data PeerMessage Source #
Incoming messages that a peer accepts.
toSockAddr :: MonadUnliftIO m => HostPort -> m [SockAddr] Source #
Resolve a host and port to a list of SockAddr
. May make use DNS resolver.
fromSockAddr :: MonadUnliftIO m => SockAddr -> m (Maybe HostPort) Source #
Convert a SockAddr
to a a numeric host and port.
managerPeerMessage :: MonadIO m => Peer -> Message -> Manager -> m () Source #
Internal function used by peer to send a message to the peer manager.
managerGetPeers :: MonadIO m => Manager -> m [OnlinePeer] Source #
Get list of connected peers from manager.
managerGetPeer :: MonadIO m => Peer -> Manager -> m (Maybe OnlinePeer) Source #
Get information for an online peer from manager.
killPeer :: MonadIO m => PeerException -> Peer -> m () Source #
Kill a peer with the provided exception.
managerCheck :: MonadIO m => Peer -> Manager -> m () Source #
Internal function used by manager to check peers periodically.
managerConnect :: MonadIO m => Manager -> m () Source #
Internal function used to ask manager to connect to a new peer.
managerSetBest :: MonadIO m => BlockHeight -> Manager -> m () Source #
Set the best block that the manager knows about.
peerGetPublisher :: MonadUnliftIO m => Int -> Peer -> m (Maybe (Publisher Message)) Source #
Get a publisher associated to a peer. Must provide timeout as peer may disconnect and become unresponsive.
peerGetBlocks :: MonadUnliftIO m => Network -> Int -> Peer -> [BlockHash] -> m (Maybe [Block]) Source #
Request full blocks from peer. Will return Nothing
if the list of blocks
returned by the peer is incomplete, comes out of order, or a timeout is
reached.
peerGetTxs :: MonadUnliftIO m => Network -> Int -> Peer -> [TxHash] -> m (Maybe [Tx]) Source #
Request transactions from peer. Will return Nothing
if the list of
transactions returned by the peer is incomplete, comes out of order, or a
timeout is reached.
peerGetData :: MonadUnliftIO m => Int -> Peer -> GetData -> m (Maybe [Either Tx Block]) Source #
Request transactions and/or blocks from peer. Return maybe if any single inventory fails to be retrieved, if they come out of order, or if timeout is reached.
peerPing :: MonadUnliftIO m => Int -> Peer -> m Bool Source #
Ping a peer and await response. Return False
if response not received
before timeout.
buildVersion :: Network -> Word64 -> BlockHeight -> NetworkAddress -> NetworkAddress -> Word64 -> Version Source #
Create version data structure.
chainGetBlock :: MonadIO m => BlockHash -> Chain -> m (Maybe BlockNode) Source #
Get a block header from Chain
process.
chainGetAncestor :: MonadIO m => BlockHeight -> BlockNode -> Chain -> m (Maybe BlockNode) Source #
Get ancestor of BlockNode
at BlockHeight
from chain process.
chainGetParents :: MonadIO m => BlockHeight -> BlockNode -> Chain -> m [BlockNode] Source #
Get parents of BlockNode
starting at BlockHeight
from chain process.
chainGetSplitBlock :: MonadIO m => BlockNode -> BlockNode -> Chain -> m BlockNode Source #
Get last common block from chain process.
chainPeerConnected :: MonadIO m => Peer -> SockAddr -> Chain -> m () Source #
Notify chain that a new peer is connected.
chainPeerDisconnected :: MonadIO m => Peer -> SockAddr -> Chain -> m () Source #
Notify chain that a peer has disconnected.
chainBlockMain :: MonadIO m => BlockHash -> Chain -> m Bool Source #
Is given BlockHash
in the main chain?
chainHeaders :: MonadIO m => Peer -> [BlockHeader] -> Chain -> m () Source #
Peer sends a bunch of headers to the chain process.
withConnection :: MonadUnliftIO m => SockAddr -> (AppData -> m a) -> m a Source #
Connect to a socket via TCP.
median :: Fractional a => [a] -> Maybe a Source #
Calculate the median value from a list. The list must not be empty.