dcrd/internal/rpcserver/interface.go
Donald Adu-Poku bad849b69d multi: Start blockchain v4 module dev cycle.
This updates the blockchain module version to v4 and
updates import sites.
2020-11-10 16:51:38 -06:00

783 lines
31 KiB
Go

// Copyright (c) 2019 The Decred developers
// Use of this source code is governed by an ISC
// license that can be found in the LICENSE file.
package rpcserver
import (
"context"
"math/big"
"net"
"time"
"github.com/decred/dcrd/addrmgr"
"github.com/decred/dcrd/blockchain/stake/v3"
"github.com/decred/dcrd/blockchain/v4"
"github.com/decred/dcrd/blockchain/v4/indexers"
"github.com/decred/dcrd/chaincfg/chainhash"
"github.com/decred/dcrd/database/v2"
"github.com/decred/dcrd/dcrutil/v3"
"github.com/decred/dcrd/gcs/v2"
"github.com/decred/dcrd/internal/mempool"
"github.com/decred/dcrd/internal/mining"
"github.com/decred/dcrd/peer/v2"
"github.com/decred/dcrd/wire"
)
// Peer represents a peer for use with the RPC server.
//
// The interface contract requires that all of these methods are safe for
// concurrent access.
type Peer interface {
// Addr returns the peer address.
Addr() string
// Connected returns whether or not the peer is currently connected.
Connected() bool
// ID returns the peer id.
ID() int32
// Inbound returns whether the peer is inbound.
Inbound() bool
// StatsSnapshot returns a snapshot of the current peer flags and statistics.
StatsSnapshot() *peer.StatsSnap
// LocalAddr returns the local address of the connection or nil if the peer
// is not currently connected.
LocalAddr() net.Addr
// LastPingNonce returns the last ping nonce of the remote peer.
LastPingNonce() uint64
// IsTxRelayDisabled returns whether or not the peer has disabled
// transaction relay.
IsTxRelayDisabled() bool
// BanScore returns the current integer value that represents how close
// the peer is to being banned.
BanScore() uint32
}
// AddrManager represents an address manager for use with the RPC server.
//
// The interface contract requires that all of these methods are safe for
// concurrent access.
type AddrManager interface {
// LocalAddresses returns a summary of local addresses information for
// the getnetworkinfo rpc.
LocalAddresses() []addrmgr.LocalAddr
}
// ConnManager represents a connection manager for use with the RPC server.
//
// The interface contract requires that all of these methods are safe for
// concurrent access.
type ConnManager interface {
// Connect adds the provided address as a new outbound peer. The
// permanent flag indicates whether or not to make the peer persistent
// and reconnect if the connection is lost. Attempting to connect to an
// already existing peer will return an error.
Connect(addr string, permanent bool) error
// RemoveByID removes the peer associated with the provided id from the
// list of persistent peers. Attempting to remove an id that does not
// exist will return an error.
RemoveByID(id int32) error
// RemoveByAddr removes the peer associated with the provided address
// from the list of persistent peers. Attempting to remove an address
// that does not exist will return an error.
RemoveByAddr(addr string) error
// DisconnectByID disconnects the peer associated with the provided id.
// This applies to both inbound and outbound peers. Attempting to
// remove an id that does not exist will return an error.
DisconnectByID(id int32) error
// DisconnectByAddr disconnects the peer associated with the provided
// address. This applies to both inbound and outbound peers.
// Attempting to remove an address that does not exist will return an
// error.
DisconnectByAddr(addr string) error
// ConnectedCount returns the number of currently connected peers.
ConnectedCount() int32
// NetTotals returns the sum of all bytes received and sent across the
// network for all peers.
NetTotals() (uint64, uint64)
// ConnectedPeers returns an array consisting of all connected peers.
ConnectedPeers() []Peer
// PersistentPeers returns an array consisting of all the persistent
// peers.
PersistentPeers() []Peer
// BroadcastMessage sends the provided message to all currently
// connected peers.
BroadcastMessage(msg wire.Message)
// AddRebroadcastInventory adds the provided inventory to the list of
// inventories to be rebroadcast at random intervals until they show up
// in a block.
AddRebroadcastInventory(iv *wire.InvVect, data interface{})
// RelayTransactions generates and relays inventory vectors for all of
// the passed transactions to all connected peers.
RelayTransactions(txns []*dcrutil.Tx)
// AddedNodeInfo returns information describing persistent (added) nodes.
AddedNodeInfo() []Peer
// Lookup defines the DNS lookup function to be used.
Lookup(host string) ([]net.IP, error)
}
// SyncManager represents a sync manager for use with the RPC server.
//
// The interface contract requires that all of these methods are safe for
// concurrent access.
type SyncManager interface {
// IsCurrent returns whether or not the sync manager believes the chain
// is current as compared to the rest of the network.
IsCurrent() bool
// SubmitBlock submits the provided block to the network after
// processing it locally.
SubmitBlock(block *dcrutil.Block, flags blockchain.BehaviorFlags) (bool, error)
// SyncPeerID returns the id of the current peer being synced with.
SyncPeerID() int32
// LocateBlocks returns the hashes of the blocks after the first known block
// in the locator until the provided stop hash is reached, or up to the
// provided max number of block hashes.
LocateBlocks(locator blockchain.BlockLocator, hashStop *chainhash.Hash,
maxHashes uint32) []chainhash.Hash
// TipGeneration returns the entire generation of blocks stemming from the
// parent of the current tip.
TipGeneration() ([]chainhash.Hash, error)
// SyncHeight returns latest known block being synced to.
SyncHeight() int64
// ProcessTransaction relays the provided transaction validation and
// insertion into the memory pool.
ProcessTransaction(tx *dcrutil.Tx, allowOrphans bool, rateLimit bool,
allowHighFees bool, tag mempool.Tag) ([]*dcrutil.Tx, error)
}
// UtxoEntry represents a utxo entry for use with the RPC server.
//
// The interface contract does NOT require that these methods are safe for
// concurrent access.
type UtxoEntry interface {
// ToUtxoEntry returns the underlying UtxoEntry instance.
ToUtxoEntry() *blockchain.UtxoEntry
// TransactionType returns the type of the transaction the utxo entry
// represents.
TransactionType() stake.TxType
// IsOutputSpent returns whether or not the provided output index has been
// spent based upon the current state of the unspent transaction output view
// the entry was obtained from.
//
// Returns true if the output index references an output that does not exist
// either due to it being invalid or because the output is not part of the view
// due to previously being spent/pruned.
IsOutputSpent(outputIndex uint32) bool
// BlockHeight returns the height of the block containing the transaction the
// utxo entry represents.
BlockHeight() int64
// TxVersion returns the version of the transaction the utxo represents.
TxVersion() uint16
// AmountByIndex returns the amount of the provided output index.
//
// Returns 0 if the output index references an output that does not exist
// either due to it being invalid or because the output is not part of the view
// due to previously being spent/pruned.
AmountByIndex(outputIndex uint32) int64
// ScriptVersionByIndex returns the public key script for the provided output
// index.
//
// Returns 0 if the output index references an output that does not exist
// either due to it being invalid or because the output is not part of the view
// due to previously being spent/pruned.
ScriptVersionByIndex(outputIndex uint32) uint16
// PkScriptByIndex returns the public key script for the provided output index.
//
// Returns nil if the output index references an output that does not exist
// either due to it being invalid or because the output is not part of the view
// due to previously being spent/pruned.
PkScriptByIndex(outputIndex uint32) []byte
// IsCoinBase returns whether or not the transaction the utxo entry represents
// is a coinbase.
IsCoinBase() bool
}
// Chain represents a chain for use with the RPC server.
//
// The interface contract requires that all of these methods are safe for
// concurrent access.
type Chain interface {
// BestSnapshot returns information about the current best chain block and
// related state as of the current point in time. The returned instance must be
// treated as immutable since it is shared by all callers.
BestSnapshot() *blockchain.BestState
// BlockByHash returns the block for the given hash, regardless of whether the
// block is part of the main chain or not.
BlockByHash(hash *chainhash.Hash) (*dcrutil.Block, error)
// BlockByHeight returns the block at the given height in the main chain.
BlockByHeight(height int64) (*dcrutil.Block, error)
// BlockHashByHeight returns the hash of the block at the given height in the
// main chain.
BlockHashByHeight(height int64) (*chainhash.Hash, error)
// BlockHeightByHash returns the height of the block with the given hash in the
// main chain.
BlockHeightByHash(hash *chainhash.Hash) (int64, error)
// CalcNextRequiredStakeDifficulty calculates the required stake difficulty for
// the block after the end of the current best chain based on the active stake
// difficulty retarget rules.
CalcNextRequiredStakeDifficulty() (int64, error)
// CalcWantHeight calculates the height of the final block of the previous
// interval given a block height.
CalcWantHeight(interval, height int64) int64
// ChainTips returns information, in JSON-RPC format, about all of the currently
// known chain tips in the block index.
ChainTips() []blockchain.ChainTipInfo
// ChainWork returns the total work up to and including the block of the
// provided block hash.
ChainWork(hash *chainhash.Hash) (*big.Int, error)
// CheckExpiredTicket returns whether or not a ticket was ever expired.
CheckExpiredTickets(hashes []chainhash.Hash) []bool
// CheckLiveTicket returns whether or not a ticket exists in the live ticket
// treap of the best node.
CheckLiveTicket(hash chainhash.Hash) bool
// CheckLiveTickets returns a slice of bools representing whether each ticket
// exists in the live ticket treap of the best node.
CheckLiveTickets(hashes []chainhash.Hash) []bool
// CheckMissedTickets returns a slice of bools representing whether each ticket
// hash has been missed in the live ticket treap of the best node.
CheckMissedTickets(hashes []chainhash.Hash) []bool
// ConvertUtxosToMinimalOutputs converts the contents of a UTX to a series of
// minimal outputs. It does this so that these can be passed to stake subpackage
// functions, where they will be evaluated for correctness.
ConvertUtxosToMinimalOutputs(entry UtxoEntry) []*stake.MinimalOutput
// CountVoteVersion returns the total number of version votes for the current
// rule change activation interval.
CountVoteVersion(version uint32) (uint32, error)
// EstimateNextStakeDifficulty estimates the next stake difficulty by pretending
// the provided number of tickets will be purchased in the remainder of the
// interval unless the flag to use max tickets is set in which case it will use
// the max possible number of tickets that can be purchased in the remainder of
// the interval.
EstimateNextStakeDifficulty(newTickets int64, useMaxTickets bool) (int64, error)
// FetchUtxoEntry loads and returns the unspent transaction output entry for the
// passed hash from the point of view of the end of the main chain.
//
// NOTE: Requesting a hash for which there is no data must NOT return an error.
// Instead both the entry and the error must be nil. This is done to allow
// pruning of fully spent transactions. In practice this means the caller must
// check if the returned entry is nil before invoking methods on it.
//
// This function is safe for concurrent access however the returned entry (if
// any) is NOT.
FetchUtxoEntry(txHash *chainhash.Hash) (UtxoEntry, error)
// FetchUtxoStats returns statistics on the current utxo set.
FetchUtxoStats() (*blockchain.UtxoStats, error)
// GetStakeVersions returns a cooked array of StakeVersions. We do this in
// order to not bloat memory by returning raw blocks.
GetStakeVersions(hash *chainhash.Hash, count int32) ([]blockchain.StakeVersions, error)
// GetVoteCounts returns the vote counts for the specified version and
// deployment identifier for the current rule change activation interval.
GetVoteCounts(version uint32, deploymentID string) (blockchain.VoteCounts, error)
// GetVoteInfo returns information on consensus deployment agendas
// and their respective states at the provided hash, for the provided
// deployment version.
GetVoteInfo(hash *chainhash.Hash, version uint32) (*blockchain.VoteInfo, error)
// HeaderByHash returns the block header identified by the given hash or an
// error if it doesn't exist. Note that this will return headers from both the
// main chain and any side chains.
HeaderByHash(hash *chainhash.Hash) (wire.BlockHeader, error)
// HeaderByHeight returns the block header at the given height in the main
// chain.
HeaderByHeight(height int64) (wire.BlockHeader, error)
// HeightRange returns a range of block hashes for the given start and end
// heights. It is inclusive of the start height and exclusive of the end
// height. In other words, it is the half open range [startHeight, endHeight).
//
// The end height will be limited to the current main chain height.
HeightRange(startHeight, endHeight int64) ([]chainhash.Hash, error)
// IsCurrent returns whether or not the chain believes it is current. Several
// factors are used to guess, but the key factors that allow the chain to
// believe it is current are:
// - Total amount of cumulative work is more than the minimum known work
// specified by the parameters for the network
// - Latest block has a timestamp newer than 24 hours ago
IsCurrent() bool
// LiveTickets returns all currently live tickets.
LiveTickets() ([]chainhash.Hash, error)
// LocateHeaders returns the headers of the blocks after the first known block
// in the locator until the provided stop hash is reached, or up to a max of
// wire.MaxBlockHeadersPerMsg headers.
//
// In addition, there are two special cases:
//
// - When no locators are provided, the stop hash is treated as a request for
// that header, so it will either return the header for the stop hash itself
// if it is known, or nil if it is unknown
// - When locators are provided, but none of them are known, headers starting
// after the genesis block will be returned
LocateHeaders(locator blockchain.BlockLocator, hashStop *chainhash.Hash) []wire.BlockHeader
// LotteryDataForBlock returns lottery data for a given block in the block
// chain, including side chain blocks.
LotteryDataForBlock(hash *chainhash.Hash) ([]chainhash.Hash, int, [6]byte, error)
// MainChainHasBlock returns whether or not the block with the given hash is in
// the main chain.
MainChainHasBlock(hash *chainhash.Hash) bool
// MaxBlockSize returns the maximum permitted block size for the block AFTER
// the end of the current best chain.
MaxBlockSize() (int64, error)
// MissedTickets returns all currently missed tickets.
MissedTickets() ([]chainhash.Hash, error)
// NextThresholdState returns the current rule change threshold state of the
// given deployment ID for the block AFTER the provided block hash.
NextThresholdState(hash *chainhash.Hash, version uint32, deploymentID string) (blockchain.ThresholdStateTuple, error)
// StateLastChangedHeight returns the height at which the provided consensus
// deployment agenda last changed state. Note that, unlike the
// NextThresholdState function, this function returns the information as of the
// passed block hash.
StateLastChangedHeight(hash *chainhash.Hash, version uint32, deploymentID string) (int64, error)
// TicketPoolValue returns the current value of all the locked funds in the
// ticket pool.
TicketPoolValue() (dcrutil.Amount, error)
// TicketsWithAddress returns a slice of ticket hashes that are currently
// live corresponding to the given address.
TicketsWithAddress(address dcrutil.Address, isTreasuryEnabled bool) ([]chainhash.Hash, error)
// TipGeneration returns the entire generation of blocks stemming from the
// parent of the current tip.
TipGeneration() ([]chainhash.Hash, error)
// TreasuryBalance returns the treasury balance at the provided block.
TreasuryBalance(*chainhash.Hash) (*blockchain.TreasuryBalanceInfo, error)
// IsTreasuryAgendaActive returns whether or not the treasury agenda vote, as
// defined in DCP0006, has passed and is now active for the block AFTER the
// given block.
IsTreasuryAgendaActive(*chainhash.Hash) (bool, error)
// FetchTSpend returns all blocks where the treasury spend tx
// identified by the specified hash can be found.
FetchTSpend(chainhash.Hash) ([]chainhash.Hash, error)
// TSpendCountVotes returns the votes for the specified tspend up to
// the specified block.
TSpendCountVotes(*chainhash.Hash, *dcrutil.Tx) (int64, int64, error)
}
// Clock represents a clock for use with the RPC server. The purpose of this
// interface is to allow an alternative implementation to be used for testing.
//
// The interface contract requires that all of these methods are safe for
// concurrent access.
type Clock interface {
// Now returns the current local time.
Now() time.Time
// Since returns the time elapsed since t.
Since(t time.Time) time.Duration
}
// FeeEstimator provides an interface that tracks historical data for published
// and mined transactions in order to estimate fees to be used in new
// transactions for confirmation within a target block window.
//
// The interface contract requires that all of these methods are safe for
// concurrent access.
type FeeEstimator interface {
// EstimateFee calculates the suggested fee for a transaction to be
// confirmed in at most `targetConfs` blocks after publishing with a
// high degree of certainty.
EstimateFee(targetConfs int32) (dcrutil.Amount, error)
}
// LogManager represents a log manager for use with the RPC server.
//
// The interface contract does NOT require that these methods are safe for
// concurrent access.
type LogManager interface {
// SupportedSubsystems returns a sorted slice of the supported subsystems for
// logging purposes.
SupportedSubsystems() []string
// ParseAndSetDebugLevels attempts to parse the specified debug level and set
// the levels accordingly. An appropriate error must be returned if anything
// is invalid.
ParseAndSetDebugLevels(debugLevel string) error
}
// SanityChecker represents a block sanity checker for use with the RPC server.
//
// The interface contract requires that all of these methods are safe for
// concurrent access.
type SanityChecker interface {
// CheckBlockSanity checks the correctness of the provided block
// per consensus.
CheckBlockSanity(block *dcrutil.Block) error
}
// CPUMiner represents a CPU miner for use with the RPC server. The purpose of
// this interface is to allow an alternative implementation to be used for
// testing.
//
// The interface contract requires that all of these methods are safe for
// concurrent access.
type CPUMiner interface {
// GenerateNBlocks generates the requested number of blocks.
GenerateNBlocks(ctx context.Context, n uint32) ([]*chainhash.Hash, error)
// IsMining returns whether or not the CPU miner has been started and is
// therefore currently mining.
IsMining() bool
// HashesPerSecond returns the number of hashes per second the mining process
// is performing.
HashesPerSecond() float64
// NumWorkers returns the number of workers which are running to solve blocks.
NumWorkers() int32
// SetNumWorkers sets the number of workers to create which solve blocks.
SetNumWorkers(numWorkers int32)
}
// TemplaterSubber represents a block template subscription.
//
// The interface contract requires that all these methods are safe for
// concurrent access.
type TemplateSubber interface {
// C returns a channel that produces a stream of block templates as
// each new template is generated.
C() <-chan *mining.TemplateNtfn
// Stop prevents any future template updates from being delivered and
// unsubscribes the associated subscription.
Stop()
}
// BlockTemplater represents a source of block templates for use with the
// RPC server.
//
// The interface contract requires that all of these methods are safe for
// concurrent access.
type BlockTemplater interface {
// ForceRegen asks the block templater to generate a new template immediately.
ForceRegen()
// Subscribe subscribes a client for block template updates. The returned
// template subscription contains functions to retrieve a channel that produces
// the stream of block templates and to stop the stream when the caller no
// longer wishes to receive new templates.
Subscribe() TemplateSubber
// CurrentTemplate returns the current template associated with the block
// templater along with any associated error.
CurrentTemplate() (*mining.BlockTemplate, error)
// UpdateBlockTime updates the timestamp in the passed header to the current
// time while taking into account the consensus rules.
UpdateBlockTime(header *wire.BlockHeader) error
}
// Filterer provides an interface for retrieving a block's committed filter or
// committed filter header.
//
// The interface contract requires that all of these methods are safe for
// concurrent access.
//
// Deprecated: This will be removed in the next major version. Use FiltererV2
// instead.
type Filterer interface {
// FilterByBlockHash returns the serialized contents of a block's regular or
// extended committed filter.
FilterByBlockHash(h *chainhash.Hash, filterType wire.FilterType) ([]byte, error)
// FilterHeaderByBlockHash returns the serialized contents of a block's regular
// or extended committed filter header.
FilterHeaderByBlockHash(h *chainhash.Hash, filterType wire.FilterType) ([]byte, error)
}
// FiltererV2 provides an interface for retrieving a block's version 2 GCS
// filter.
//
// The interface contract requires that all of these methods are safe for
// concurrent access.
type FiltererV2 interface {
// FilterByBlockHash returns the version 2 GCS filter for the given block hash
// when it exists. This function returns the filters regardless of whether or
// not their associated block is part of the main chain.
//
// An error of type blockchain.NoFilterError must be returned when the filter
// for the given block hash does not exist.
FilterByBlockHash(hash *chainhash.Hash) (*gcs.FilterV2, error)
}
// ExistsAddresser represents a source of exists address methods for the RPC
// server. These methods return whether or not an address or addresses have
// been seen on the blockchain.
//
// The interface contract requires that all of these methods are safe for
// concurrent access.
//
// ExistsAddresser may be nil. The RPC server must check for the presence of an
// ExistsAddresser before calling methods associated with it.
type ExistsAddresser interface {
// ExistsAddress returns whether or not an address has been seen before.
ExistsAddress(addr dcrutil.Address) (bool, error)
// ExistsAddresses returns whether or not each address in a slice of
// addresses has been seen before.
ExistsAddresses(addrs []dcrutil.Address) ([]bool, error)
}
// TxMempooler represents a source of mempool transaction data for the RPC
// server. Methods assume the existence of a main pool and an orphans pool.
//
// The interface contract requires that all of these methods are safe for
// concurrent access.
type TxMempooler interface {
// HaveTransactions returns whether or not the passed transactions
// already exist in the main pool or in the orphan pool.
HaveTransactions(hashes []*chainhash.Hash) []bool
// TxDescs returns a slice of descriptors for all the transactions in
// the pool. The descriptors must be treated as read only.
TxDescs() []*mempool.TxDesc
// VerboseTxDescs returns a slice of verbose descriptors for all the
// transactions in the pool. The descriptors must be treated as read
// only.
VerboseTxDescs() []*mempool.VerboseTxDesc
// Count returns the number of transactions in the main pool. It does
// not include the orphan pool.
Count() int
// FetchTransaction returns the requested transaction from the
// transaction pool. This only fetches from the main transaction pool
// and does not include orphans.
FetchTransaction(txHash *chainhash.Hash) (*dcrutil.Tx, error)
// TSpendHashes returns the hashes of the treasury spend transactions
// currently in the mempool.
TSpendHashes() []chainhash.Hash
}
// AddrIndexer provides an interface for retrieving transactions for a given
// address.
//
// The interface contract requires that all of these methods are safe for
// concurrent access.
type AddrIndexer interface {
// EntriesForAddress returns a slice of details which identify each transaction,
// including a block region, that involves the passed address according to the
// specified number to skip, number requested, and whether or not the results
// should be reversed. It also returns the number actually skipped since it
// could be less in the case where there are not enough entries.
//
// NOTE: These results only include transactions confirmed in blocks. See the
// UnconfirmedTxnsForAddress method for obtaining unconfirmed transactions
// that involve a given address.
EntriesForAddress(dbTx database.Tx, addr dcrutil.Address, numToSkip,
numRequested uint32, reverse bool) ([]indexers.TxIndexEntry, uint32, error)
// UnconfirmedTxnsForAddress returns all transactions currently in the
// unconfirmed (memory-only) address index that involve the passed address.
// Unsupported address types are ignored and will result in no results.
UnconfirmedTxnsForAddress(addr dcrutil.Address) []*dcrutil.Tx
}
// TxIndexer provides an interface for retrieving details for a given
// transaction hash.
//
// The interface contract requires that all of these methods are safe for
// concurrent access.
type TxIndexer interface {
// Entry returns details for the provided transaction hash from the transaction
// index. The block region contained in the result can in turn be used to load
// the raw transaction bytes. When there is no entry for the provided hash, nil
// must be returned for the both the entry and the error.
Entry(hash *chainhash.Hash) (*indexers.TxIndexEntry, error)
}
// NtfnManager provides an interface for processing and sending chain
// notifications.
//
// The interface contract requires that all of these methods are safe for
// concurrent access.
type NtfnManager interface {
// NotifyBlockConnected passes a block newly-connected to the manager
// for processing.
NotifyBlockConnected(block *dcrutil.Block)
// NotifyBlockDisconnected passes a block disconnected to the manager
// for processing.
NotifyBlockDisconnected(block *dcrutil.Block)
// NotifyWork passes new mining work to the manager for
// processing.
NotifyWork(templateNtfn *mining.TemplateNtfn)
// NotifyTSpend passes new tspends to the manager for processing.
NotifyTSpend(tx *dcrutil.Tx)
// NotifyReorganization passes a blockchain reorganization notification to
// the manager for processing.
NotifyReorganization(rd *blockchain.ReorganizationNtfnsData)
// NotifyWinningTickets passes newly winning tickets to the manager for
// processing.
NotifyWinningTickets(wtnd *WinningTicketsNtfnData)
// NotifySpentAndMissedTickets passes ticket spend and missing data for an
// incoming block to the manager for processing.
NotifySpentAndMissedTickets(tnd *blockchain.TicketNotificationsData)
// NotifyNewTickets passes a new ticket data for an incoming block to the
// manager for processing.
NotifyNewTickets(tnd *blockchain.TicketNotificationsData)
// NotifyStakeDifficulty passes a new stake difficulty notification to the
// manager for processing.
NotifyStakeDifficulty(stnd *StakeDifficultyNtfnData)
// NotifyMempoolTx passes a transaction accepted by mempool to the
// manager for processing.
NotifyMempoolTx(tx *dcrutil.Tx, isNew bool)
// NumClients returns the number of clients actively being served.
NumClients() int
// RegisterBlockUpdates requests block update notifications to the passed
// websocket client.
RegisterBlockUpdates(wsc *wsClient)
// UnregisterBlockUpdates removes block update notifications for the passed
// websocket client.
UnregisterBlockUpdates(wsc *wsClient)
// RegisterWorkUpdates requests work update notifications to the passed
// websocket client.
RegisterWorkUpdates(wsc *wsClient)
// UnregisterWorkUpdates removes work update notifications for the passed
// websocket client.
UnregisterWorkUpdates(wsc *wsClient)
// RegisterTSpendUpdates requests tspend update notifications to the passed
// websocket client.
RegisterTSpendUpdates(wsc *wsClient)
// UnregisterTSpendUpdates removes tspend update notifications for the passed
// websocket client.
UnregisterTSpendUpdates(wsc *wsClient)
// RegisterWinningTickets requests winning tickets update notifications
// to the passed websocket client.
RegisterWinningTickets(wsc *wsClient)
// UnregisterWinningTickets removes winning ticket notifications for
// the passed websocket client.
UnregisterWinningTickets(wsc *wsClient)
// RegisterSpentAndMissedTickets requests spent/missed tickets update notifications
// to the passed websocket client.
RegisterSpentAndMissedTickets(wsc *wsClient)
// UnregisterSpentAndMissedTickets removes spent/missed ticket notifications for
// the passed websocket client.
UnregisterSpentAndMissedTickets(wsc *wsClient)
// RegisterNewTickets requests spent/missed tickets update notifications
// to the passed websocket client.
RegisterNewTickets(wsc *wsClient)
// UnregisterNewTickets removes spent/missed ticket notifications for
// the passed websocket client.
UnregisterNewTickets(wsc *wsClient)
// RegisterStakeDifficulty requests stake difficulty notifications
// to the passed websocket client.
RegisterStakeDifficulty(wsc *wsClient)
// UnregisterStakeDifficulty removes stake difficulty notifications for
// the passed websocket client.
UnregisterStakeDifficulty(wsc *wsClient)
// RegisterNewMempoolTxsUpdates requests notifications to the passed websocket
// client when new transactions are added to the memory pool.
RegisterNewMempoolTxsUpdates(wsc *wsClient)
// UnregisterNewMempoolTxsUpdates removes notifications to the passed websocket
// client when new transaction are added to the memory pool.
UnregisterNewMempoolTxsUpdates(wsc *wsClient)
// AddClient adds the passed websocket client to the notification manager.
AddClient(wsc *wsClient)
// RemoveClient removes the passed websocket client and all notifications
// registered for it.
RemoveClient(wsc *wsClient)
// Run starts the goroutines required for the manager to queue and process
// websocket client notifications. It blocks until the provided context is
// cancelled.
Run(ctx context.Context)
}