offchainreporting

package
v1.10.17 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 18, 2021 License: MIT Imports: 51 Imported by: 0

Documentation

Index

Constants

View Source
const ConfigOverriderPollInterval = 30 * time.Second
View Source
const InitialHibernationStatus = false

InitialHibernationStatus - hibernation state set until the first successful update from the chain

Variables

View Source
var (
	OCRContractConfigSet            = getEventTopic("ConfigSet")
	OCRContractLatestRoundRequested = getEventTopic("RoundRequested")
)

Functions

func IsLaterThan

func IsLaterThan(incoming gethTypes.Log, existing gethTypes.Log) bool

IsLaterThan returns true if the first log was emitted "after" the second log from the blockchain's point of view

func NewDB

func NewDB(sqldb *sql.DB, oracleSpecID int32) *db

NewDB returns a new DB scoped to this oracleSpecID

func NewLocalConfig added in v1.10.17

func ValidatedOracleSpecToml

func ValidatedOracleSpecToml(chainSet evm.ChainSet, tomlString string) (job.Job, error)

ValidatedOracleSpecToml validates an oracle spec that came from TOML

Types

type ArbitrumBlockTranslator

type ArbitrumBlockTranslator struct {
	// contains filtered or unexported fields
}

ArbitrumBlockTranslator uses Arbitrum's special L1BlockNumber to optimise log lookups Performance matters here hence aggressive use of the cache We want to minimise fetches because calling eth_getBlockByNumber is relatively expensive

func NewArbitrumBlockTranslator

func NewArbitrumBlockTranslator(ethClient eth.Client, lggr logger.Logger) *ArbitrumBlockTranslator

NewArbitrumBlockTranslator returns a concrete ArbitrumBlockTranslator

func (*ArbitrumBlockTranslator) BinarySearch

func (a *ArbitrumBlockTranslator) BinarySearch(ctx context.Context, targetL1 int64) (l2lowerBound *big.Int, l2upperBound *big.Int, err error)

BinarySearch uses both cache and RPC calls to find the smallest possible range of L2 block numbers that encompasses the given L1 block number

Imagine as a virtual array of L1 block numbers indexed by L2 block numbers L1 values are likely duplicated so it looks something like [42, 42, 42, 42, 42, 155, 155, 155, 430, 430, 430, 430, 430, ...] Theoretical max difference between L1 values is typically about 5, "worst case" is 6545 but can be arbtrarily high if sequencer is broken The returned range of L2s from leftmost thru rightmost represent all possible L2s that correspond to the L1 value we are looking for nil can be returned as a rightmost value if the range has no upper bound

func (*ArbitrumBlockTranslator) NumberToQueryRange

func (a *ArbitrumBlockTranslator) NumberToQueryRange(ctx context.Context, changedInL1Block uint64) (fromBlock *big.Int, toBlock *big.Int)

NumberToQueryRange implements BlockTranslator interface

type BlockTranslator

type BlockTranslator interface {
	NumberToQueryRange(ctx context.Context, changedInL1Block uint64) (fromBlock *big.Int, toBlock *big.Int)
}

BlockTranslator converts emitted block numbers (from block.number) into a block number range suitable for query in FilterLogs

func NewBlockTranslator

func NewBlockTranslator(cfg Config, client eth.Client, lggr logger.Logger) BlockTranslator

NewBlockTranslator returns the block translator for the given chain

type Config added in v1.10.17

type Config interface {
	DefaultChainID() *big.Int
	Dev() bool
	EvmGasLimitDefault() uint64
	JobPipelineResultWriteQueueDepth() uint64
	OCRBlockchainTimeout() time.Duration
	OCRContractConfirmations() uint16
	OCRContractPollInterval() time.Duration
	OCRContractSubscribeInterval() time.Duration
	OCRContractTransmitterTransmitTimeout() time.Duration
	OCRDatabaseTimeout() time.Duration
	OCRDefaultTransactionQueueDepth() uint32
	OCRKeyBundleID() (string, error)
	OCRObservationGracePeriod() time.Duration
	OCRObservationTimeout() time.Duration
	OCRTraceLogging() bool
	OCRTransmitterAddress() (ethkey.EIP55Address, error)
	P2PBootstrapPeers() ([]string, error)
	P2PPeerID() p2pkey.PeerID
	P2PV2Bootstrappers() []ocrtypes.BootstrapperLocator
	FlagsContractAddress() string
	ChainType() chains.ChainType
}

type ConfigOverriderImpl

type ConfigOverriderImpl struct {
	utils.StartStopOnce

	DeltaCFromAddress time.Duration
	// contains filtered or unexported fields
}

func NewConfigOverriderImpl

func NewConfigOverriderImpl(
	logger logger.Logger,
	contractAddress ethkey.EIP55Address,
	flags *ContractFlags,
	pollTicker utils.TickerBase,
) (*ConfigOverriderImpl, error)

func (*ConfigOverriderImpl) Close

func (c *ConfigOverriderImpl) Close() error

func (*ConfigOverriderImpl) ConfigOverride

func (c *ConfigOverriderImpl) ConfigOverride() *ocrtypes.ConfigOverride

func (*ConfigOverriderImpl) Start

func (c *ConfigOverriderImpl) Start() error

type ContractFlags

type ContractFlags struct {
	flags_wrapper.FlagsInterface
}

ContractFlags wraps the a contract

func NewFlags

func NewFlags(addrHex string, ethClient eth.Client) (*ContractFlags, error)

NewFlags constructs a new Flags from a flags contract address

func (*ContractFlags) Contract

Contract returns the flags contract

func (*ContractFlags) ContractExists

func (f *ContractFlags) ContractExists() bool

ContractExists returns whether a flag contract exists

func (*ContractFlags) IsLowered

func (f *ContractFlags) IsLowered(contractAddr common.Address) (bool, error)

IsLowered determines whether the flag is lowered for a given contract. If a contract does not exist, it is considered to be lowered

type Delegate

type Delegate struct {
	// contains filtered or unexported fields
}

func NewDelegate

func NewDelegate(
	db *gorm.DB,
	jobORM job.ORM,
	keyStore keystore.Master,
	pipelineRunner pipeline.Runner,
	peerWrapper *SingletonPeerWrapper,
	monitoringEndpointGen telemetry.MonitoringEndpointGenerator,
	chainSet evm.ChainSet,
	lggr logger.Logger,
) *Delegate

func (Delegate) AfterJobCreated

func (Delegate) AfterJobCreated(spec job.Job)

func (Delegate) BeforeJobDeleted

func (Delegate) BeforeJobDeleted(spec job.Job)

func (Delegate) JobType

func (d Delegate) JobType() job.Type

func (Delegate) ServicesForSpec

func (d Delegate) ServicesForSpec(jobSpec job.Job) (services []job.Service, err error)

type DiscovererDatabase

type DiscovererDatabase struct {
	// contains filtered or unexported fields
}

func NewDiscovererDatabase

func NewDiscovererDatabase(db *sql.DB, peerID p2ppeer.ID) *DiscovererDatabase

func (*DiscovererDatabase) ReadAnnouncements

func (d *DiscovererDatabase) ReadAnnouncements(ctx context.Context, peerIDs []string) (map[string][]byte, error)

ReadAnnouncements returns one serialized announcement (if available) for each of the peerIDs in the form of a map keyed by each announcement's corresponding peer ID.

func (*DiscovererDatabase) StoreAnnouncement

func (d *DiscovererDatabase) StoreAnnouncement(ctx context.Context, peerID string, ann []byte) error

StoreAnnouncement has key-value-store semantics and stores a peerID (key) and an associated serialized announcement (value).

type NetworkingConfig

type NetworkingConfig interface {
	OCRBootstrapCheckInterval() time.Duration
	OCRDHTLookupInterval() int
	OCRIncomingMessageBufferSize() int
	OCRNewStreamTimeout() time.Duration
	OCROutgoingMessageBufferSize() int
	OCRTraceLogging() bool
	P2PAnnounceIP() net.IP
	P2PAnnouncePort() uint16
	P2PBootstrapPeers() ([]string, error)
	P2PDHTAnnouncementCounterUserPrefix() uint32
	P2PListenIP() net.IP
	P2PListenPort() uint16
	P2PNetworkingStack() ocrnetworking.NetworkingStack
	P2PPeerID() p2pkey.PeerID
	P2PPeerstoreWriteInterval() time.Duration
	P2PV2AnnounceAddresses() []string
	P2PV2Bootstrappers() []ocrtypes.BootstrapperLocator
	P2PV2DeltaDial() models.Duration
	P2PV2DeltaReconcile() models.Duration
	P2PV2ListenAddresses() []string
}

type OCRContractConfigSubscription

type OCRContractConfigSubscription OCRContractTracker

OCRContractConfigSubscription only exists to comply with the ContractConfigSubscription interface, it's just a simple shell around OCRContractTracker that defines two methods

func (*OCRContractConfigSubscription) Close

func (sub *OCRContractConfigSubscription) Close()

Close is a no-op since Subscribing/Unsubscribing is handled in the Start/Close methods of the OCRContractTracker

func (*OCRContractConfigSubscription) Configs

Configs complies with ContractConfigSubscription interface

type OCRContractTracker

type OCRContractTracker struct {
	utils.StartStopOnce
	// contains filtered or unexported fields
}

OCRContractTracker complies with ContractConfigTracker interface and handles log events related to the contract more generally

func NewOCRContractTracker

func NewOCRContractTracker(
	contract *offchain_aggregator_wrapper.OffchainAggregator,
	contractFilterer *offchainaggregator.OffchainAggregatorFilterer,
	contractCaller *offchainaggregator.OffchainAggregatorCaller,
	ethClient eth.Client,
	logBroadcaster log.Broadcaster,
	jobID int32,
	logger logger.Logger,
	gdb *gorm.DB,
	db OCRContractTrackerDB,
	cfg Config,
	headBroadcaster httypes.HeadBroadcaster,
) (o *OCRContractTracker)

NewOCRContractTracker makes a new OCRContractTracker

func (*OCRContractTracker) Close

func (t *OCRContractTracker) Close() error

Close should be called after teardown of the OCR job relying on this tracker

func (*OCRContractTracker) ConfigFromLogs

func (t *OCRContractTracker) ConfigFromLogs(ctx context.Context, changedInBlock uint64) (c ocrtypes.ContractConfig, err error)

ConfigFromLogs queries the eth node for logs for this contract

func (*OCRContractTracker) HandleLog

func (t *OCRContractTracker) HandleLog(lb log.Broadcast)

HandleLog complies with LogListener interface It is not thread safe

func (*OCRContractTracker) JobID

func (t *OCRContractTracker) JobID() int32

JobID complies with LogListener interface

func (*OCRContractTracker) LatestBlockHeight

func (t *OCRContractTracker) LatestBlockHeight(ctx context.Context) (blockheight uint64, err error)

LatestBlockHeight queries the eth node for the most recent header

func (*OCRContractTracker) LatestConfigDetails

func (t *OCRContractTracker) LatestConfigDetails(ctx context.Context) (changedInBlock uint64, configDigest ocrtypes.ConfigDigest, err error)

LatestConfigDetails queries the eth node

func (*OCRContractTracker) LatestRoundRequested

func (t *OCRContractTracker) LatestRoundRequested(_ context.Context, lookback time.Duration) (configDigest ocrtypes.ConfigDigest, epoch uint32, round uint8, err error)

LatestRoundRequested returns the configDigest, epoch, and round from the latest RoundRequested event emitted by the contract. LatestRoundRequested may or may not return a result if the latest such event was emitted in a block b such that b.timestamp < tip.timestamp - lookback.

If no event is found, LatestRoundRequested should return zero values, not an error. An error should only be returned if an actual error occurred during execution, e.g. because there was an error querying the blockchain or the database.

As an optimization, this function may also return zero values, if no RoundRequested event has been emitted after the latest NewTransmission event.

func (*OCRContractTracker) OnNewLongestChain

func (t *OCRContractTracker) OnNewLongestChain(_ context.Context, h eth.Head)

OnNewLongestChain conformed to HeadTrackable and updates latestBlockHeight

func (*OCRContractTracker) Start

func (t *OCRContractTracker) Start() error

Start must be called before logs can be delivered It ought to be called before starting OCR

func (*OCRContractTracker) SubscribeToNewConfigs

SubscribeToNewConfigs returns the tracker aliased as a ContractConfigSubscription

type OCRContractTrackerDB

type OCRContractTrackerDB interface {
	SaveLatestRoundRequested(tx *sql.Tx, rr offchainaggregator.OffchainAggregatorRoundRequested) error
	LoadLatestRoundRequested() (rr offchainaggregator.OffchainAggregatorRoundRequested, err error)
}

type OCRContractTransmitter

type OCRContractTransmitter struct {
	// contains filtered or unexported fields
}

func NewOCRContractTransmitter

func NewOCRContractTransmitter(
	address gethCommon.Address,
	contractCaller *offchainaggregator.OffchainAggregatorCaller,
	contractABI abi.ABI,
	transmitter Transmitter,
	logBroadcaster log.Broadcaster,
	tracker *OCRContractTracker,
	chainID *big.Int,
) *OCRContractTransmitter

func (*OCRContractTransmitter) ChainID

func (oc *OCRContractTransmitter) ChainID() *big.Int

func (*OCRContractTransmitter) FromAddress

func (oc *OCRContractTransmitter) FromAddress() gethCommon.Address

func (*OCRContractTransmitter) LatestRoundRequested

func (oc *OCRContractTransmitter) LatestRoundRequested(ctx context.Context, lookback time.Duration) (configDigest ocrtypes.ConfigDigest, epoch uint32, round uint8, err error)

LatestRoundRequested returns the configDigest, epoch, and round from the latest RoundRequested event emitted by the contract. LatestRoundRequested may or may not return a result if the latest such event was emitted in a block b such that b.timestamp < tip.timestamp - lookback.

If no event is found, LatestRoundRequested should return zero values, not an error. An error should only be returned if an actual error occurred during execution, e.g. because there was an error querying the blockchain or the database.

As an optimization, this function may also return zero values, if no RoundRequested event has been emitted after the latest NewTransmission event.

func (*OCRContractTransmitter) LatestTransmissionDetails

func (oc *OCRContractTransmitter) LatestTransmissionDetails(ctx context.Context) (configDigest ocrtypes.ConfigDigest, epoch uint32, round uint8, latestAnswer ocrtypes.Observation, latestTimestamp time.Time, err error)

func (*OCRContractTransmitter) Transmit

func (oc *OCRContractTransmitter) Transmit(ctx context.Context, report []byte, rs, ss [][32]byte, vs [32]byte) error

type P2PPeer

type P2PPeer struct {
	ID        string
	Addr      string
	PeerID    string
	CreatedAt time.Time
	UpdatedAt time.Time
}

func (P2PPeer) TableName

func (P2PPeer) TableName() string

type Pstorewrapper

type Pstorewrapper struct {
	utils.StartStopOnce
	Peerstore p2ppeerstore.Peerstore
	// contains filtered or unexported fields
}

func NewPeerstoreWrapper

func NewPeerstoreWrapper(db *gorm.DB, writeInterval time.Duration, peerID p2pkey.PeerID) (*Pstorewrapper, error)

NewPeerstoreWrapper creates a new database-backed peerstore wrapper scoped to the given jobID Multiple peerstore wrappers should not be instantiated with the same jobID

func (*Pstorewrapper) Close

func (p *Pstorewrapper) Close() error

func (*Pstorewrapper) Start

func (p *Pstorewrapper) Start() error

func (*Pstorewrapper) WriteToDB

func (p *Pstorewrapper) WriteToDB() error

type RunResultSaver

type RunResultSaver struct {
	utils.StartStopOnce
	// contains filtered or unexported fields
}

func NewResultRunSaver

func NewResultRunSaver(db *sqlx.DB, runResults <-chan pipeline.Run, pipelineRunner pipeline.Runner, done chan struct{},
	logger logger.Logger,
) *RunResultSaver

func (*RunResultSaver) Close

func (r *RunResultSaver) Close() error

func (*RunResultSaver) Start

func (r *RunResultSaver) Start() error

type SingletonPeerWrapper

type SingletonPeerWrapper struct {
	PeerID p2pkey.PeerID
	Peer   peer

	utils.StartStopOnce
	// contains filtered or unexported fields
}

SingletonPeerWrapper manages all libocr peers for the application

func NewSingletonPeerWrapper

func NewSingletonPeerWrapper(keyStore keystore.Master, config NetworkingConfig, db *gorm.DB) *SingletonPeerWrapper

NewSingletonPeerWrapper creates a new peer based on the p2p keys in the keystore It currently only supports one peerID/key It should be fairly easy to modify it to support multiple peerIDs/keys using e.g. a map

func (*SingletonPeerWrapper) Close

func (p *SingletonPeerWrapper) Close() error

Close closes the peer and peerstore

func (*SingletonPeerWrapper) IsStarted

func (p *SingletonPeerWrapper) IsStarted() bool

func (*SingletonPeerWrapper) Start

func (p *SingletonPeerWrapper) Start() error

type Transmitter

type Transmitter interface {
	CreateEthTransaction(ctx context.Context, toAddress gethCommon.Address, payload []byte) error
	FromAddress() gethCommon.Address
}

func NewTransmitter

func NewTransmitter(txm txManager, db *gorm.DB, fromAddress common.Address, gasLimit uint64, strategy bulletprooftxmanager.TxStrategy) Transmitter

NewTransmitter creates a new eth transmitter

type ValidationConfig

type ValidationConfig interface {
	ChainID() *big.Int
	Dev() bool
	OCRBlockchainTimeout() time.Duration
	OCRContractConfirmations() uint16
	OCRContractPollInterval() time.Duration
	OCRContractSubscribeInterval() time.Duration
	OCRContractTransmitterTransmitTimeout() time.Duration
	OCRDatabaseTimeout() time.Duration
	OCRObservationTimeout() time.Duration
	OCRObservationGracePeriod() time.Duration
	ChainType() chains.ChainType
}

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL