|
package client
|
|
|
|
/*
|
|
The client package provides a general purpose interface (Client) for connecting
|
|
to a tendermint node, as well as higher-level functionality.
|
|
|
|
The main implementation for production code is client.HTTP, which
|
|
connects via http to the jsonrpc interface of the tendermint node.
|
|
|
|
For connecting to a node running in the same process (eg. when
|
|
compiling the abci app in the same process), you can use the client.Local
|
|
implementation.
|
|
|
|
For mocking out server responses during testing to see behavior for
|
|
arbitrary return values, use the mock package.
|
|
|
|
In addition to the Client interface, which should be used externally
|
|
for maximum flexibility and testability, and two implementations,
|
|
this package also provides helper functions that work on any Client
|
|
implementation.
|
|
*/
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/tendermint/tendermint/libs/bytes"
|
|
"github.com/tendermint/tendermint/rpc/coretypes"
|
|
"github.com/tendermint/tendermint/types"
|
|
)
|
|
|
|
//go:generate ../../scripts/mockery_generate.sh Client
|
|
|
|
// Client describes the interface of Tendermint RPC client implementations.
|
|
type Client interface {
|
|
// Start the client, which will run until the context terminates.
|
|
// An error from Start indicates the client could not start.
|
|
Start(context.Context) error
|
|
|
|
// These embedded interfaces define the callable methods of the service.
|
|
|
|
ABCIClient
|
|
EventsClient
|
|
EvidenceClient
|
|
HistoryClient
|
|
MempoolClient
|
|
NetworkClient
|
|
SignClient
|
|
StatusClient
|
|
SubscriptionClient
|
|
}
|
|
|
|
// ABCIClient groups together the functionality that principally affects the
|
|
// ABCI app.
|
|
//
|
|
// In many cases this will be all we want, so we can accept an interface which
|
|
// is easier to mock.
|
|
type ABCIClient interface {
|
|
// Reading from abci app
|
|
ABCIInfo(context.Context) (*coretypes.ResultABCIInfo, error)
|
|
ABCIQuery(ctx context.Context, path string, data bytes.HexBytes) (*coretypes.ResultABCIQuery, error)
|
|
ABCIQueryWithOptions(ctx context.Context, path string, data bytes.HexBytes,
|
|
opts ABCIQueryOptions) (*coretypes.ResultABCIQuery, error)
|
|
|
|
// Writing to abci app
|
|
BroadcastTxCommit(context.Context, types.Tx) (*coretypes.ResultBroadcastTxCommit, error)
|
|
BroadcastTxAsync(context.Context, types.Tx) (*coretypes.ResultBroadcastTx, error)
|
|
BroadcastTxSync(context.Context, types.Tx) (*coretypes.ResultBroadcastTx, error)
|
|
}
|
|
|
|
// SignClient groups together the functionality needed to get valid signatures
|
|
// and prove anything about the chain.
|
|
type SignClient interface {
|
|
Block(ctx context.Context, height *int64) (*coretypes.ResultBlock, error)
|
|
BlockByHash(ctx context.Context, hash bytes.HexBytes) (*coretypes.ResultBlock, error)
|
|
BlockResults(ctx context.Context, height *int64) (*coretypes.ResultBlockResults, error)
|
|
Header(ctx context.Context, height *int64) (*coretypes.ResultHeader, error)
|
|
HeaderByHash(ctx context.Context, hash bytes.HexBytes) (*coretypes.ResultHeader, error)
|
|
Commit(ctx context.Context, height *int64) (*coretypes.ResultCommit, error)
|
|
Validators(ctx context.Context, height *int64, page, perPage *int) (*coretypes.ResultValidators, error)
|
|
Tx(ctx context.Context, hash bytes.HexBytes, prove bool) (*coretypes.ResultTx, error)
|
|
|
|
// TxSearch defines a method to search for a paginated set of transactions by
|
|
// DeliverTx event search criteria.
|
|
TxSearch(
|
|
ctx context.Context,
|
|
query string,
|
|
prove bool,
|
|
page, perPage *int,
|
|
orderBy string,
|
|
) (*coretypes.ResultTxSearch, error)
|
|
|
|
// BlockSearch defines a method to search for a paginated set of blocks by
|
|
// BeginBlock and EndBlock event search criteria.
|
|
BlockSearch(
|
|
ctx context.Context,
|
|
query string,
|
|
page, perPage *int,
|
|
orderBy string,
|
|
) (*coretypes.ResultBlockSearch, error)
|
|
}
|
|
|
|
// HistoryClient provides access to data from genesis to now in large chunks.
|
|
type HistoryClient interface {
|
|
Genesis(context.Context) (*coretypes.ResultGenesis, error)
|
|
GenesisChunked(context.Context, uint) (*coretypes.ResultGenesisChunk, error)
|
|
BlockchainInfo(ctx context.Context, minHeight, maxHeight int64) (*coretypes.ResultBlockchainInfo, error)
|
|
}
|
|
|
|
// StatusClient provides access to general chain info.
|
|
type StatusClient interface {
|
|
Status(context.Context) (*coretypes.ResultStatus, error)
|
|
}
|
|
|
|
// NetworkClient is general info about the network state. May not be needed
|
|
// usually.
|
|
type NetworkClient interface {
|
|
NetInfo(context.Context) (*coretypes.ResultNetInfo, error)
|
|
DumpConsensusState(context.Context) (*coretypes.ResultDumpConsensusState, error)
|
|
ConsensusState(context.Context) (*coretypes.ResultConsensusState, error)
|
|
ConsensusParams(ctx context.Context, height *int64) (*coretypes.ResultConsensusParams, error)
|
|
Health(context.Context) (*coretypes.ResultHealth, error)
|
|
}
|
|
|
|
// EventsClient exposes the methods to retrieve events from the consensus engine.
|
|
type EventsClient interface {
|
|
// Events fetches a batch of events from the server matching the given query
|
|
// and time range.
|
|
Events(ctx context.Context, req *coretypes.RequestEvents) (*coretypes.ResultEvents, error)
|
|
}
|
|
|
|
// TODO(creachadair): This interface should be removed once the streaming event
|
|
// interface is removed in Tendermint v0.37.
|
|
type SubscriptionClient interface {
|
|
// Subscribe issues a subscription request for the given subscriber ID and
|
|
// query. This method does not block: If subscription fails, it reports an
|
|
// error, and if subscription succeeds it returns a channel that delivers
|
|
// matching events until the subscription is stopped. The channel is never
|
|
// closed; the client is responsible for knowing when no further data will
|
|
// be sent.
|
|
//
|
|
// The context only governs the initial subscription, it does not control
|
|
// the lifetime of the channel. To cancel a subscription call Unsubscribe or
|
|
// UnsubscribeAll.
|
|
//
|
|
// Deprecated: This method will be removed in Tendermint v0.37, use Events
|
|
// instead.
|
|
Subscribe(ctx context.Context, subscriber, query string, outCapacity ...int) (out <-chan coretypes.ResultEvent, err error)
|
|
|
|
// Unsubscribe unsubscribes given subscriber from query.
|
|
//
|
|
// Deprecated: This method will be removed in Tendermint v0.37, use Events
|
|
// instead.
|
|
Unsubscribe(ctx context.Context, subscriber, query string) error
|
|
|
|
// UnsubscribeAll unsubscribes given subscriber from all the queries.
|
|
//
|
|
// Deprecated: This method will be removed in Tendermint v0.37, use Events
|
|
// instead.
|
|
UnsubscribeAll(ctx context.Context, subscriber string) error
|
|
}
|
|
|
|
// MempoolClient shows us data about current mempool state.
|
|
type MempoolClient interface {
|
|
UnconfirmedTxs(ctx context.Context, page, perPage *int) (*coretypes.ResultUnconfirmedTxs, error)
|
|
NumUnconfirmedTxs(context.Context) (*coretypes.ResultUnconfirmedTxs, error)
|
|
CheckTx(context.Context, types.Tx) (*coretypes.ResultCheckTx, error)
|
|
RemoveTx(context.Context, types.TxKey) error
|
|
}
|
|
|
|
// EvidenceClient is used for submitting an evidence of the malicious
|
|
// behavior.
|
|
type EvidenceClient interface {
|
|
BroadcastEvidence(context.Context, types.Evidence) (*coretypes.ResultBroadcastEvidence, error)
|
|
}
|
|
|
|
// RemoteClient is a Client, which can also return the remote network address.
|
|
type RemoteClient interface {
|
|
Client
|
|
|
|
// Remote returns the remote network address in a string form.
|
|
Remote() string
|
|
}
|