Documentation
¶
Index ¶
- func NewRelayMiner(ctx context.Context, deps depinject.Config) (*relayMiner, error)
- type MinedRelay
- type MinedRelaysObservable
- type Miner
- type MinerOption
- type RelayMeter
- type RelayServer
- type RelayerProxy
- type RelayerProxyOption
- type RelayerSessionsManager
- type RelayerSessionsManagerOption
- type RelaysObservable
- type SessionTree
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func NewRelayMiner ¶
NewRelayMiner creates a new Relayer instance with the given dependencies. It injects the dependencies into the Relayer instance and returns it.
Required dependencies:
- RelayerProxy
- Miner
- RelayerSessionsManager
Types ¶
type MinedRelay ¶
MinedRelay is a wrapper around a relay that has been serialized and hashed.
type MinedRelaysObservable ¶
type MinedRelaysObservable observable.Observable[*MinedRelay]
MinedRelaysObservable is an observable which is notified with MinedRelay values.
TODO_HACK: The purpose of this type is to work around gomock's lack of support for generic types. For the same reason, this type cannot be an alias (i.e. MinedRelaysObservable = observable.Observable[*MinedRelay]).
type Miner ¶
type Miner interface {
MinedRelays(
ctx context.Context,
servedRelayObs RelaysObservable,
) (minedRelaysObs MinedRelaysObservable)
}
Miner is responsible for observing servedRelayObs, hashing and checking the difficulty of each, finally publishing those with sufficient difficulty to minedRelayObs as they are applicable for relay volume.
type MinerOption ¶
type MinerOption func(Miner)
type RelayMeter ¶ added in v0.0.11
type RelayMeter interface {
// Start starts the relay meter.
Start(ctx context.Context) error
// AccumulateRelayReward adds the relay reward from the incoming request to session's accumulator.
// The relay cost is added optimistically, assuming that the relay WILL be volume / reward applicable.
//
// The reason why optimistic AccumulateRelayReward + SetNonApplicableRelayReward is used instead of
// a simpler AccumulateVolumeApplicableRelayReward is that when the relay is first seen
// we don't know if it will be volume / reward applicable until it is served.
//
// To rate limit or not the current relay, we need to always optimistically account all relays as being
// volume / reward applicable.
AccumulateRelayReward(ctx context.Context, relayRequestMeta servicetypes.RelayRequestMetadata) error
// SetNonApplicableRelayReward updates the relay meter for the given relay request as
// non-applicable between a single Application and a single Supplier for a single session.
// The volume / reward applicability of the relay is unknown to the relay miner
// until the relay is served and the relay response signed.
SetNonApplicableRelayReward(ctx context.Context, relayRequestMeta servicetypes.RelayRequestMetadata) error
}
RelayMeter is an interface that keeps track of the amount of stake consumed between a single onchain Application and a single onchain Supplier over the course of a single session. It enables the RelayMiner to rate limit the number of requests handled offchain as a function of the optimistic onchain rate limits.
type RelayServer ¶
type RelayServer interface {
// Start starts the service server and returns an error if it fails.
Start(ctx context.Context) error
// Stop terminates the service server and returns an error if it fails.
Stop(ctx context.Context) error
}
RelayServer is the interface of the advertised relay servers provided by the RelayerProxy.
type RelayerProxy ¶
type RelayerProxy interface {
// Start starts all advertised relay servers and returns an error if any of them fail to start.
Start(ctx context.Context) error
// Stop stops all advertised relay servers and returns an error if any of them fail.
Stop(ctx context.Context) error
// ServedRelays returns an observable that notifies the miner about the relays that have been served.
// A served relay is one whose RelayRequest's signature and session have been verified,
// and its RelayResponse has been signed and successfully sent to the client.
ServedRelays() RelaysObservable
// VerifyRelayRequest is a shared method used by RelayServers to check the
// relay request signature and session validity.
// TODO_TECHDEBT(@red-0ne): This method should be moved out of the RelayerProxy interface
// that should not be responsible for verifying relay requests.
VerifyRelayRequest(
ctx context.Context,
relayRequest *servicetypes.RelayRequest,
serviceId string,
) error
// SignRelayResponse is a shared method used by RelayServers to sign
// and append the signature to the RelayResponse.
// TODO_TECHDEBT(@red-0ne): This method should be moved out of the RelayerProxy interface
// that should not be responsible for signing relay responses.
SignRelayResponse(relayResponse *servicetypes.RelayResponse, supplierOperatorAddr string) error
}
RelayerProxy is the interface for the proxy that serves relays to the application. It is responsible for starting and stopping all supported RelayServers. While handling requests and responding in a closed loop, it also notifies the miner about the relays that have been served.
type RelayerProxyOption ¶
type RelayerProxyOption func(RelayerProxy)
type RelayerSessionsManager ¶
type RelayerSessionsManager interface {
// InsertRelays receives an observable of relays that should be included
// in their respective session's SMST (tree).
InsertRelays(minedRelaysObs MinedRelaysObservable)
// Start iterates over the session trees at the end of each, respective, session.
// The session trees are piped through a series of map operations which progress
// them through the claim/proof lifecycle, broadcasting transactions to the
// network as necessary.
Start(ctx context.Context)
// Stop unsubscribes all observables from the InsertRelays observable which
// will close downstream observables as they drain.
//
// TODO_TECHDEBT: Either add a mechanism to wait for draining to complete
// and/or ensure that the state at each pipeline stage is persisted to disk
// and exit as early as possible.
Stop()
}
RelayerSessionsManager is responsible for managing the relayer's session lifecycles. It handles the creation and retrieval of SMSTs (trees) for a given session, as well as the respective and subsequent claim creation and proof submission. This is largely accomplished by pipelining observables of relays and sessions through a series of map operations.
TODO_TECHDEBT: add architecture diagrams covering observable flows throughout the relayer package.
type RelayerSessionsManagerOption ¶
type RelayerSessionsManagerOption func(RelayerSessionsManager)
type RelaysObservable ¶
type RelaysObservable observable.Observable[*servicetypes.Relay]
RelaysObservable is an observable which is notified with Relay values.
TODO_HACK: The purpose of this type is to work around gomock's lack of support for generic types. For the same reason, this type cannot be an alias (i.e. RelaysObservable = observable.Observable[*servicetypes.Relay]).
type SessionTree ¶
type SessionTree interface {
// GetSessionHeader returns the header of the session corresponding to the SMST.
GetSessionHeader() *sessiontypes.SessionHeader
// Update is a wrapper for the SMST's Update function. It updates the SMST with
// the given key, value, and weight.
// This function should be called when a Relay has been successfully served.
Update(key, value []byte, weight uint64) error
// ProveClosest is a wrapper for the SMST's ProveClosest function. It returns the
// proof for the given path.
// This function should be called several blocks after a session has been claimed and needs to be proven.
ProveClosest(path []byte) (proof *smt.SparseCompactMerkleClosestProof, err error)
// GetClaimRoot returns the root hash of the SMST needed for creating the claim.
GetClaimRoot() []byte
// GetProofBz returns the proof created by ProveClosest needed for submitting
// a proof in byte format.
GetProofBz() []byte
// Flush gets the root hash of the SMST needed for submitting the claim;
// then commits the entire tree to disk and stops the KVStore.
// It should be called before submitting the claim on-chain. This function frees up
// the in-memory resources used by the SMST that are no longer needed while waiting
// for the proof submission window to open.
Flush() (SMSTRoot []byte, err error)
// TODO_DISCUSS: This function should not be part of the interface as it is an optimization
// aiming to free up KVStore resources after the proof is no longer needed.
// Delete deletes the SMST from the KVStore.
// WARNING: This function should be called only after the proof has been successfully
// submitted on-chain and the servicer has confirmed that it has been rewarded.
Delete() error
// StartClaiming marks the session tree as being picked up for claiming,
// so it won't be picked up by the relayer again.
// It returns an error if it has already been marked as such.
StartClaiming() error
// GetSupplierOperatorAddress returns the supplier operator address building this tree.
GetSupplierOperatorAddress() *cosmostypes.AccAddress
// GetTrieSpec returns the trie spec of the SMST.
GetTrieSpec() smt.TrieSpec
}
SessionTree is an interface that wraps an SMST (Sparse Merkle State Trie) and its corresponding session.