Documentation
¶
Index ¶
- Constants
- Variables
- func ChannelEquals(a, b llotypes.ChannelDefinition) bool
- type ChannelDefinitionCache
- type ChannelDefinitionWithID
- type ChannelHash
- type Config
- type DSOpts
- type DataSource
- type ErrUnreportableChannel
- type JSONOnchainConfigCodec
- type JSONReportCodec
- type LLOChannelDefinitionProto
- func (*LLOChannelDefinitionProto) Descriptor() ([]byte, []int)deprecated
- func (x *LLOChannelDefinitionProto) GetChainSelector() uint64
- func (x *LLOChannelDefinitionProto) GetReportFormat() uint32
- func (x *LLOChannelDefinitionProto) GetStreamIDs() []uint32
- func (*LLOChannelDefinitionProto) ProtoMessage()
- func (x *LLOChannelDefinitionProto) ProtoReflect() protoreflect.Message
- func (x *LLOChannelDefinitionProto) Reset()
- func (x *LLOChannelDefinitionProto) String() string
- type LLOChannelIDAndDefinitionProto
- func (*LLOChannelIDAndDefinitionProto) Descriptor() ([]byte, []int)deprecated
- func (x *LLOChannelIDAndDefinitionProto) GetChannelDefinition() *LLOChannelDefinitionProto
- func (x *LLOChannelIDAndDefinitionProto) GetChannelID() uint32
- func (*LLOChannelIDAndDefinitionProto) ProtoMessage()
- func (x *LLOChannelIDAndDefinitionProto) ProtoReflect() protoreflect.Message
- func (x *LLOChannelIDAndDefinitionProto) Reset()
- func (x *LLOChannelIDAndDefinitionProto) String() string
- type LLOChannelIDAndValidAfterSecondsProto
- func (*LLOChannelIDAndValidAfterSecondsProto) Descriptor() ([]byte, []int)deprecated
- func (x *LLOChannelIDAndValidAfterSecondsProto) GetChannelID() uint32
- func (x *LLOChannelIDAndValidAfterSecondsProto) GetValidAfterSeconds() uint32
- func (*LLOChannelIDAndValidAfterSecondsProto) ProtoMessage()
- func (x *LLOChannelIDAndValidAfterSecondsProto) ProtoReflect() protoreflect.Message
- func (x *LLOChannelIDAndValidAfterSecondsProto) Reset()
- func (x *LLOChannelIDAndValidAfterSecondsProto) String() string
- type LLOObservationProto
- func (*LLOObservationProto) Descriptor() ([]byte, []int)deprecated
- func (x *LLOObservationProto) GetAttestedPredecessorRetirement() []byte
- func (x *LLOObservationProto) GetRemoveChannelIDs() []uint32
- func (x *LLOObservationProto) GetShouldRetire() bool
- func (x *LLOObservationProto) GetStreamValues() map[uint32][]byte
- func (x *LLOObservationProto) GetUnixTimestampNanoseconds() int64
- func (x *LLOObservationProto) GetUpdateChannelDefinitions() map[uint32]*LLOChannelDefinitionProto
- func (*LLOObservationProto) ProtoMessage()
- func (x *LLOObservationProto) ProtoReflect() protoreflect.Message
- func (x *LLOObservationProto) Reset()
- func (x *LLOObservationProto) String() string
- type LLOOffchainConfigProto
- func (*LLOOffchainConfigProto) Descriptor() ([]byte, []int)deprecated
- func (x *LLOOffchainConfigProto) GetPredecessorConfigDigest() []byte
- func (*LLOOffchainConfigProto) ProtoMessage()
- func (x *LLOOffchainConfigProto) ProtoReflect() protoreflect.Message
- func (x *LLOOffchainConfigProto) Reset()
- func (x *LLOOffchainConfigProto) String() string
- type LLOOutcomeProto
- func (*LLOOutcomeProto) Descriptor() ([]byte, []int)deprecated
- func (x *LLOOutcomeProto) GetChannelDefinitions() []*LLOChannelIDAndDefinitionProto
- func (x *LLOOutcomeProto) GetLifeCycleStage() string
- func (x *LLOOutcomeProto) GetObservationsTimestampNanoseconds() int64
- func (x *LLOOutcomeProto) GetStreamMedians() []*LLOStreamIDAndValue
- func (x *LLOOutcomeProto) GetValidAfterSeconds() []*LLOChannelIDAndValidAfterSecondsProto
- func (*LLOOutcomeProto) ProtoMessage()
- func (x *LLOOutcomeProto) ProtoReflect() protoreflect.Message
- func (x *LLOOutcomeProto) Reset()
- func (x *LLOOutcomeProto) String() string
- type LLOStreamIDAndValue
- func (*LLOStreamIDAndValue) Descriptor() ([]byte, []int)deprecated
- func (x *LLOStreamIDAndValue) GetStreamID() uint32
- func (x *LLOStreamIDAndValue) GetValue() []byte
- func (*LLOStreamIDAndValue) ProtoMessage()
- func (x *LLOStreamIDAndValue) ProtoReflect() protoreflect.Message
- func (x *LLOStreamIDAndValue) Reset()
- func (x *LLOStreamIDAndValue) String() string
- type LLOStreamObservationProto
- func (*LLOStreamObservationProto) Descriptor() ([]byte, []int)deprecated
- func (x *LLOStreamObservationProto) GetValid() bool
- func (x *LLOStreamObservationProto) GetValue() []byte
- func (*LLOStreamObservationProto) ProtoMessage()
- func (x *LLOStreamObservationProto) ProtoReflect() protoreflect.Message
- func (x *LLOStreamObservationProto) Reset()
- func (x *LLOStreamObservationProto) String() string
- type Observation
- type ObservationCodec
- type OffchainConfig
- type OnchainConfig
- type OnchainConfigCodec
- type Outcome
- type OutcomeCodec
- type Plugin
- func (p *Plugin) Close() error
- func (p *Plugin) Observation(ctx context.Context, outctx ocr3types.OutcomeContext, query types.Query) (types.Observation, error)
- func (p *Plugin) ObservationQuorum(outctx ocr3types.OutcomeContext, query types.Query) (ocr3types.Quorum, error)
- func (p *Plugin) Outcome(outctx ocr3types.OutcomeContext, query types.Query, ...) (ocr3types.Outcome, error)
- func (p *Plugin) Query(ctx context.Context, outctx ocr3types.OutcomeContext) (types.Query, error)
- func (p *Plugin) Reports(seqNr uint64, rawOutcome ocr3types.Outcome) ([]ocr3types.ReportWithInfo[llotypes.ReportInfo], error)
- func (p *Plugin) ShouldAcceptAttestedReport(context.Context, uint64, ocr3types.ReportWithInfo[llotypes.ReportInfo]) (bool, error)
- func (p *Plugin) ShouldTransmitAcceptedReport(context.Context, uint64, ocr3types.ReportWithInfo[llotypes.ReportInfo]) (bool, error)
- func (p *Plugin) ValidateObservation(outctx ocr3types.OutcomeContext, query types.Query, ...) error
- type PluginFactory
- type PredecessorRetirementReportCache
- type Report
- type ReportCodec
- type RetirementReport
- type ShouldRetireCache
- type StreamValues
- type Transmitter
Constants ¶
const ( // Maximum amount of channels that can be added per round (if more than // this needs to be added, it will be added in batches until everything is // up-to-date) MaxObservationRemoveChannelIDsLength = 5 // Maximum amount of channels that can be removed per round (if more than // this needs to be removed, it will be removed in batches until everything // is up-to-date) MaxObservationUpdateChannelDefinitionsLength = 5 // Maximum number of streams that can be observed per round // TODO: This needs to be implemented on the Observation side so we don't // even generate an observation that fails this MaxObservationStreamValuesLength = 10_000 // MaxOutcomeChannelDefinitionsLength is the maximum number of channels that // can be supported // TODO: This needs to be implemented on the Observation side so we don't // even generate an observation that fails this MaxOutcomeChannelDefinitionsLength = 10_000 )
Additional limits so we can more effectively bound the size of observations NOTE: These are hardcoded because these exact values are relied upon as a property of coming to consensus, it's too dangerous to make these configurable on a per-node basis. It may be possible to add them to the OffchainConfig if they need to be changed dynamically and in a backwards-compatible way.
const ( LifeCycleStageStaging llotypes.LifeCycleStage = "staging" LifeCycleStageProduction llotypes.LifeCycleStage = "production" LifeCycleStageRetired llotypes.LifeCycleStage = "retired" )
Protocol instances start in either the staging or production stage. They may later be retired and "hand over" their work to another protocol instance that will move from the staging to the production stage.
Variables ¶
var File_llo_offchain_config_proto protoreflect.FileDescriptor
var File_plugin_codecs_proto protoreflect.FileDescriptor
Functions ¶
Types ¶
type ChannelDefinitionCache ¶
type ChannelDefinitionCache interface {
Definitions() llotypes.ChannelDefinitions
}
type ChannelDefinitionWithID ¶
type ChannelDefinitionWithID struct {
llotypes.ChannelDefinition
ChannelID llotypes.ChannelID
}
type ChannelHash ¶
type ChannelHash [32]byte
func MakeChannelHash ¶
func MakeChannelHash(cd ChannelDefinitionWithID) ChannelHash
MakeChannelHash is used for mapping ChannelDefinitionWithIDs
type Config ¶
type Config struct {
// Enables additional logging that might be expensive, e.g. logging entire
// channel definitions on every round or other very large structs
VerboseLogging bool
}
type DataSource ¶
type DataSource interface {
// For each known streamID, Observe should set the observed value in the
// passed streamValues.
// If an observation fails, or the stream is unknown, no value should be
// set.
Observe(ctx context.Context, streamValues StreamValues, opts DSOpts) error
}
type ErrUnreportableChannel ¶
func (*ErrUnreportableChannel) Error ¶
func (e *ErrUnreportableChannel) Error() string
func (*ErrUnreportableChannel) String ¶
func (e *ErrUnreportableChannel) String() string
func (*ErrUnreportableChannel) Unwrap ¶
func (e *ErrUnreportableChannel) Unwrap() error
type JSONOnchainConfigCodec ¶
type JSONOnchainConfigCodec struct{}
TODO: Replace this with protobuf, if it is actually used for something
func (*JSONOnchainConfigCodec) Decode ¶
func (c *JSONOnchainConfigCodec) Decode([]byte) (OnchainConfig, error)
func (*JSONOnchainConfigCodec) Encode ¶
func (c *JSONOnchainConfigCodec) Encode(OnchainConfig) ([]byte, error)
type JSONReportCodec ¶
type JSONReportCodec struct{}
type LLOChannelDefinitionProto ¶
type LLOChannelDefinitionProto struct {
ReportFormat uint32 `protobuf:"varint,1,opt,name=reportFormat,proto3" json:"reportFormat,omitempty"`
ChainSelector uint64 `protobuf:"varint,2,opt,name=chainSelector,proto3" json:"chainSelector,omitempty"`
StreamIDs []uint32 `protobuf:"varint,3,rep,packed,name=streamIDs,proto3" json:"streamIDs,omitempty"`
// contains filtered or unexported fields
}
func (*LLOChannelDefinitionProto) Descriptor
deprecated
func (*LLOChannelDefinitionProto) Descriptor() ([]byte, []int)
Deprecated: Use LLOChannelDefinitionProto.ProtoReflect.Descriptor instead.
func (*LLOChannelDefinitionProto) GetChainSelector ¶
func (x *LLOChannelDefinitionProto) GetChainSelector() uint64
func (*LLOChannelDefinitionProto) GetReportFormat ¶
func (x *LLOChannelDefinitionProto) GetReportFormat() uint32
func (*LLOChannelDefinitionProto) GetStreamIDs ¶
func (x *LLOChannelDefinitionProto) GetStreamIDs() []uint32
func (*LLOChannelDefinitionProto) ProtoMessage ¶
func (*LLOChannelDefinitionProto) ProtoMessage()
func (*LLOChannelDefinitionProto) ProtoReflect ¶
func (x *LLOChannelDefinitionProto) ProtoReflect() protoreflect.Message
func (*LLOChannelDefinitionProto) Reset ¶
func (x *LLOChannelDefinitionProto) Reset()
func (*LLOChannelDefinitionProto) String ¶
func (x *LLOChannelDefinitionProto) String() string
type LLOChannelIDAndDefinitionProto ¶
type LLOChannelIDAndDefinitionProto struct {
ChannelID uint32 `protobuf:"varint,1,opt,name=channelID,proto3" json:"channelID,omitempty"`
ChannelDefinition *LLOChannelDefinitionProto `protobuf:"bytes,2,opt,name=channelDefinition,proto3" json:"channelDefinition,omitempty"`
// contains filtered or unexported fields
}
func (*LLOChannelIDAndDefinitionProto) Descriptor
deprecated
func (*LLOChannelIDAndDefinitionProto) Descriptor() ([]byte, []int)
Deprecated: Use LLOChannelIDAndDefinitionProto.ProtoReflect.Descriptor instead.
func (*LLOChannelIDAndDefinitionProto) GetChannelDefinition ¶
func (x *LLOChannelIDAndDefinitionProto) GetChannelDefinition() *LLOChannelDefinitionProto
func (*LLOChannelIDAndDefinitionProto) GetChannelID ¶
func (x *LLOChannelIDAndDefinitionProto) GetChannelID() uint32
func (*LLOChannelIDAndDefinitionProto) ProtoMessage ¶
func (*LLOChannelIDAndDefinitionProto) ProtoMessage()
func (*LLOChannelIDAndDefinitionProto) ProtoReflect ¶
func (x *LLOChannelIDAndDefinitionProto) ProtoReflect() protoreflect.Message
func (*LLOChannelIDAndDefinitionProto) Reset ¶
func (x *LLOChannelIDAndDefinitionProto) Reset()
func (*LLOChannelIDAndDefinitionProto) String ¶
func (x *LLOChannelIDAndDefinitionProto) String() string
type LLOChannelIDAndValidAfterSecondsProto ¶
type LLOChannelIDAndValidAfterSecondsProto struct {
ChannelID uint32 `protobuf:"varint,1,opt,name=channelID,proto3" json:"channelID,omitempty"`
ValidAfterSeconds uint32 `protobuf:"varint,2,opt,name=validAfterSeconds,proto3" json:"validAfterSeconds,omitempty"`
// contains filtered or unexported fields
}
func (*LLOChannelIDAndValidAfterSecondsProto) Descriptor
deprecated
func (*LLOChannelIDAndValidAfterSecondsProto) Descriptor() ([]byte, []int)
Deprecated: Use LLOChannelIDAndValidAfterSecondsProto.ProtoReflect.Descriptor instead.
func (*LLOChannelIDAndValidAfterSecondsProto) GetChannelID ¶
func (x *LLOChannelIDAndValidAfterSecondsProto) GetChannelID() uint32
func (*LLOChannelIDAndValidAfterSecondsProto) GetValidAfterSeconds ¶
func (x *LLOChannelIDAndValidAfterSecondsProto) GetValidAfterSeconds() uint32
func (*LLOChannelIDAndValidAfterSecondsProto) ProtoMessage ¶
func (*LLOChannelIDAndValidAfterSecondsProto) ProtoMessage()
func (*LLOChannelIDAndValidAfterSecondsProto) ProtoReflect ¶
func (x *LLOChannelIDAndValidAfterSecondsProto) ProtoReflect() protoreflect.Message
func (*LLOChannelIDAndValidAfterSecondsProto) Reset ¶
func (x *LLOChannelIDAndValidAfterSecondsProto) Reset()
func (*LLOChannelIDAndValidAfterSecondsProto) String ¶
func (x *LLOChannelIDAndValidAfterSecondsProto) String() string
type LLOObservationProto ¶
type LLOObservationProto struct {
AttestedPredecessorRetirement []byte `protobuf:"bytes,1,opt,name=attestedPredecessorRetirement,proto3" json:"attestedPredecessorRetirement,omitempty"`
ShouldRetire bool `protobuf:"varint,2,opt,name=shouldRetire,proto3" json:"shouldRetire,omitempty"`
UnixTimestampNanoseconds int64 `protobuf:"varint,3,opt,name=unixTimestampNanoseconds,proto3" json:"unixTimestampNanoseconds,omitempty"`
RemoveChannelIDs []uint32 `protobuf:"varint,4,rep,packed,name=removeChannelIDs,proto3" json:"removeChannelIDs,omitempty"`
UpdateChannelDefinitions map[uint32]*LLOChannelDefinitionProto `` /* 190-byte string literal not displayed */
StreamValues map[uint32][]byte `` /* 166-byte string literal not displayed */
// contains filtered or unexported fields
}
WARNING Use extreme caution making changes in this file All changes MUST be backwards compatible If the format changes in a backwards incompatible way, active DONs can become stuck permanently
func (*LLOObservationProto) Descriptor
deprecated
func (*LLOObservationProto) Descriptor() ([]byte, []int)
Deprecated: Use LLOObservationProto.ProtoReflect.Descriptor instead.
func (*LLOObservationProto) GetAttestedPredecessorRetirement ¶
func (x *LLOObservationProto) GetAttestedPredecessorRetirement() []byte
func (*LLOObservationProto) GetRemoveChannelIDs ¶
func (x *LLOObservationProto) GetRemoveChannelIDs() []uint32
func (*LLOObservationProto) GetShouldRetire ¶
func (x *LLOObservationProto) GetShouldRetire() bool
func (*LLOObservationProto) GetStreamValues ¶
func (x *LLOObservationProto) GetStreamValues() map[uint32][]byte
func (*LLOObservationProto) GetUnixTimestampNanoseconds ¶
func (x *LLOObservationProto) GetUnixTimestampNanoseconds() int64
func (*LLOObservationProto) GetUpdateChannelDefinitions ¶
func (x *LLOObservationProto) GetUpdateChannelDefinitions() map[uint32]*LLOChannelDefinitionProto
func (*LLOObservationProto) ProtoMessage ¶
func (*LLOObservationProto) ProtoMessage()
func (*LLOObservationProto) ProtoReflect ¶
func (x *LLOObservationProto) ProtoReflect() protoreflect.Message
func (*LLOObservationProto) Reset ¶
func (x *LLOObservationProto) Reset()
func (*LLOObservationProto) String ¶
func (x *LLOObservationProto) String() string
type LLOOffchainConfigProto ¶
type LLOOffchainConfigProto struct {
PredecessorConfigDigest []byte `protobuf:"bytes,1,opt,name=predecessorConfigDigest,proto3" json:"predecessorConfigDigest,omitempty"`
// contains filtered or unexported fields
}
func (*LLOOffchainConfigProto) Descriptor
deprecated
func (*LLOOffchainConfigProto) Descriptor() ([]byte, []int)
Deprecated: Use LLOOffchainConfigProto.ProtoReflect.Descriptor instead.
func (*LLOOffchainConfigProto) GetPredecessorConfigDigest ¶
func (x *LLOOffchainConfigProto) GetPredecessorConfigDigest() []byte
func (*LLOOffchainConfigProto) ProtoMessage ¶
func (*LLOOffchainConfigProto) ProtoMessage()
func (*LLOOffchainConfigProto) ProtoReflect ¶
func (x *LLOOffchainConfigProto) ProtoReflect() protoreflect.Message
func (*LLOOffchainConfigProto) Reset ¶
func (x *LLOOffchainConfigProto) Reset()
func (*LLOOffchainConfigProto) String ¶
func (x *LLOOffchainConfigProto) String() string
type LLOOutcomeProto ¶
type LLOOutcomeProto struct {
LifeCycleStage string `protobuf:"bytes,1,opt,name=lifeCycleStage,proto3" json:"lifeCycleStage,omitempty"`
ObservationsTimestampNanoseconds int64 `protobuf:"varint,2,opt,name=ObservationsTimestampNanoseconds,proto3" json:"ObservationsTimestampNanoseconds,omitempty"`
ChannelDefinitions []*LLOChannelIDAndDefinitionProto `protobuf:"bytes,3,rep,name=channelDefinitions,proto3" json:"channelDefinitions,omitempty"`
ValidAfterSeconds []*LLOChannelIDAndValidAfterSecondsProto `protobuf:"bytes,4,rep,name=validAfterSeconds,proto3" json:"validAfterSeconds,omitempty"`
StreamMedians []*LLOStreamIDAndValue `protobuf:"bytes,5,rep,name=streamMedians,proto3" json:"streamMedians,omitempty"`
// contains filtered or unexported fields
}
NOTE: Use of repeated tuple instead of maps for more reliable determinstic serialization
func (*LLOOutcomeProto) Descriptor
deprecated
func (*LLOOutcomeProto) Descriptor() ([]byte, []int)
Deprecated: Use LLOOutcomeProto.ProtoReflect.Descriptor instead.
func (*LLOOutcomeProto) GetChannelDefinitions ¶
func (x *LLOOutcomeProto) GetChannelDefinitions() []*LLOChannelIDAndDefinitionProto
func (*LLOOutcomeProto) GetLifeCycleStage ¶
func (x *LLOOutcomeProto) GetLifeCycleStage() string
func (*LLOOutcomeProto) GetObservationsTimestampNanoseconds ¶
func (x *LLOOutcomeProto) GetObservationsTimestampNanoseconds() int64
func (*LLOOutcomeProto) GetStreamMedians ¶
func (x *LLOOutcomeProto) GetStreamMedians() []*LLOStreamIDAndValue
func (*LLOOutcomeProto) GetValidAfterSeconds ¶
func (x *LLOOutcomeProto) GetValidAfterSeconds() []*LLOChannelIDAndValidAfterSecondsProto
func (*LLOOutcomeProto) ProtoMessage ¶
func (*LLOOutcomeProto) ProtoMessage()
func (*LLOOutcomeProto) ProtoReflect ¶
func (x *LLOOutcomeProto) ProtoReflect() protoreflect.Message
func (*LLOOutcomeProto) Reset ¶
func (x *LLOOutcomeProto) Reset()
func (*LLOOutcomeProto) String ¶
func (x *LLOOutcomeProto) String() string
type LLOStreamIDAndValue ¶
type LLOStreamIDAndValue struct {
StreamID uint32 `protobuf:"varint,1,opt,name=streamID,proto3" json:"streamID,omitempty"`
Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
// contains filtered or unexported fields
}
func (*LLOStreamIDAndValue) Descriptor
deprecated
func (*LLOStreamIDAndValue) Descriptor() ([]byte, []int)
Deprecated: Use LLOStreamIDAndValue.ProtoReflect.Descriptor instead.
func (*LLOStreamIDAndValue) GetStreamID ¶
func (x *LLOStreamIDAndValue) GetStreamID() uint32
func (*LLOStreamIDAndValue) GetValue ¶
func (x *LLOStreamIDAndValue) GetValue() []byte
func (*LLOStreamIDAndValue) ProtoMessage ¶
func (*LLOStreamIDAndValue) ProtoMessage()
func (*LLOStreamIDAndValue) ProtoReflect ¶
func (x *LLOStreamIDAndValue) ProtoReflect() protoreflect.Message
func (*LLOStreamIDAndValue) Reset ¶
func (x *LLOStreamIDAndValue) Reset()
func (*LLOStreamIDAndValue) String ¶
func (x *LLOStreamIDAndValue) String() string
type LLOStreamObservationProto ¶
type LLOStreamObservationProto struct {
Valid bool `protobuf:"varint,1,opt,name=valid,proto3" json:"valid,omitempty"`
Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
// contains filtered or unexported fields
}
func (*LLOStreamObservationProto) Descriptor
deprecated
func (*LLOStreamObservationProto) Descriptor() ([]byte, []int)
Deprecated: Use LLOStreamObservationProto.ProtoReflect.Descriptor instead.
func (*LLOStreamObservationProto) GetValid ¶
func (x *LLOStreamObservationProto) GetValid() bool
func (*LLOStreamObservationProto) GetValue ¶
func (x *LLOStreamObservationProto) GetValue() []byte
func (*LLOStreamObservationProto) ProtoMessage ¶
func (*LLOStreamObservationProto) ProtoMessage()
func (*LLOStreamObservationProto) ProtoReflect ¶
func (x *LLOStreamObservationProto) ProtoReflect() protoreflect.Message
func (*LLOStreamObservationProto) Reset ¶
func (x *LLOStreamObservationProto) Reset()
func (*LLOStreamObservationProto) String ¶
func (x *LLOStreamObservationProto) String() string
type Observation ¶
type Observation struct {
// Attested (i.e. signed by f+1 oracles) retirement report from predecessor
// protocol instance
AttestedPredecessorRetirement []byte
// Should this protocol instance be retired?
ShouldRetire bool
// Timestamp from when observation is made
UnixTimestampNanoseconds int64
// Votes to remove/add channels. Subject to MAX_OBSERVATION_*_LENGTH limits
RemoveChannelIDs map[llotypes.ChannelID]struct{}
// Votes to add or replace channel definitions
UpdateChannelDefinitions llotypes.ChannelDefinitions
// Observed (numeric) stream values. Subject to
// MaxObservationStreamValuesLength limit
StreamValues StreamValues
}
type ObservationCodec ¶
type ObservationCodec interface {
Encode(obs Observation) (types.Observation, error)
Decode(encoded types.Observation) (obs Observation, err error)
}
type OffchainConfig ¶
type OffchainConfig struct {
// We use the offchainconfig of the plugin to tell the plugin the
// configdigest of its predecessor protocol instance.
//
// NOTE: Set here:
// https://github.com/smartcontractkit/mercury-v1-sketch/blob/f52c0f823788f86c1aeaa9ba1eee32a85b981535/onchain/src/ConfigurationStore.sol#L13
// TODO: This needs to be implemented alongside staging/production
// switchover support: https://smartcontract-it.atlassian.net/browse/MERC-3386
PredecessorConfigDigest *types.ConfigDigest
}
func DecodeOffchainConfig ¶
func DecodeOffchainConfig(b []byte) (o OffchainConfig, err error)
func (OffchainConfig) Encode ¶
func (c OffchainConfig) Encode() ([]byte, error)
type OnchainConfig ¶
type OnchainConfig struct{}
type OnchainConfigCodec ¶
type OnchainConfigCodec interface {
Encode(OnchainConfig) ([]byte, error)
Decode([]byte) (OnchainConfig, error)
}
type Outcome ¶
type Outcome struct {
// LifeCycleStage the protocol is in
LifeCycleStage llotypes.LifeCycleStage
// ObservationsTimestampNanoseconds is the median timestamp from the
// latest set of observations
ObservationsTimestampNanoseconds int64
// ChannelDefinitions defines the set & structure of channels for which we
// generate reports
ChannelDefinitions llotypes.ChannelDefinitions
// Latest ValidAfterSeconds value for each channel, reports for each channel
// span from ValidAfterSeconds to ObservationTimestampSeconds
ValidAfterSeconds map[llotypes.ChannelID]uint32
// StreamMedians is the median observed value for each stream
// QUESTION: Can we use arbitrary types here to allow for other types or
// consensus methods?
StreamMedians map[llotypes.StreamID]*big.Int
}
func (*Outcome) IsReportable ¶
func (out *Outcome) IsReportable(channelID llotypes.ChannelID) *ErrUnreportableChannel
Indicates whether a report can be generated for the given channel. Returns nil if channel is reportable TODO: Test this function
func (*Outcome) ObservationsTimestampSeconds ¶
The Outcome's ObservationsTimestamp rounded down to seconds precision
func (*Outcome) ReportableChannels ¶
func (out *Outcome) ReportableChannels() (reportable []llotypes.ChannelID, unreportable []*ErrUnreportableChannel)
List of reportable channels (according to IsReportable), sorted according to a canonical ordering TODO: test this
type OutcomeCodec ¶
type Plugin ¶
type Plugin struct {
Config Config
PredecessorConfigDigest *types.ConfigDigest
ConfigDigest types.ConfigDigest
PredecessorRetirementReportCache PredecessorRetirementReportCache
ShouldRetireCache ShouldRetireCache
ChannelDefinitionCache ChannelDefinitionCache
DataSource DataSource
Logger logger.Logger
F int
ObservationCodec ObservationCodec
OutcomeCodec OutcomeCodec
Codecs map[llotypes.ReportFormat]ReportCodec
}
func (*Plugin) Observation ¶
func (p *Plugin) Observation(ctx context.Context, outctx ocr3types.OutcomeContext, query types.Query) (types.Observation, error)
Observation gets an observation from the underlying data source. Returns a value or an error.
You may assume that the outctx.SeqNr is increasing monotonically (though *not* strictly) across the lifetime of a protocol instance and that outctx.previousOutcome contains the consensus outcome with sequence number (outctx.SeqNr-1).
Should return a serialized Observation struct.
func (*Plugin) ObservationQuorum ¶
func (p *Plugin) ObservationQuorum(outctx ocr3types.OutcomeContext, query types.Query) (ocr3types.Quorum, error)
ObservationQuorum returns the minimum number of valid (according to ValidateObservation) observations needed to construct an outcome.
This function should be pure. Don't do anything slow in here.
This is an advanced feature. The "default" approach (what OCR1 & OCR2 did) is to have an empty ValidateObservation function and return QuorumTwoFPlusOne from this function.
func (*Plugin) Outcome ¶
func (p *Plugin) Outcome(outctx ocr3types.OutcomeContext, query types.Query, aos []types.AttributedObservation) (ocr3types.Outcome, error)
Generates an outcome for a seqNr, typically based on the previous outcome, the current query, and the current set of attributed observations.
This function should be pure. Don't do anything slow in here.
You may assume that the outctx.SeqNr is increasing monotonically (though *not* strictly) across the lifetime of a protocol instance and that outctx.previousOutcome contains the consensus outcome with sequence number (outctx.SeqNr-1).
libocr guarantees that this will always be called with at least 2f+1 AttributedObservations
func (*Plugin) Query ¶
Query creates a Query that is sent from the leader to all follower nodes as part of the request for an observation. Be careful! A malicious leader could equivocate (i.e. send different queries to different followers.) Many applications will likely be better off always using an empty query if the oracles don't need to coordinate on what to observe (e.g. in case of a price feed) or the underlying data source offers an (eventually) consistent view to different oracles (e.g. in case of observing a blockchain).
You may assume that the outctx.SeqNr is increasing monotonically (though *not* strictly) across the lifetime of a protocol instance and that outctx.previousOutcome contains the consensus outcome with sequence number (outctx.SeqNr-1).
func (*Plugin) Reports ¶
func (p *Plugin) Reports(seqNr uint64, rawOutcome ocr3types.Outcome) ([]ocr3types.ReportWithInfo[llotypes.ReportInfo], error)
Generates a (possibly empty) list of reports from an outcome. Each report will be signed and possibly be transmitted to the contract. (Depending on ShouldAcceptAttestedReport & ShouldTransmitAcceptedReport)
This function should be pure. Don't do anything slow in here.
This is likely to change in the future. It will likely be returning a list of report batches, where each batch goes into its own Merkle tree.
You may assume that the outctx.SeqNr is increasing monotonically (though *not* strictly) across the lifetime of a protocol instance and that outctx.previousOutcome contains the consensus outcome with sequence number (outctx.SeqNr-1).
func (*Plugin) ShouldAcceptAttestedReport ¶
func (p *Plugin) ShouldAcceptAttestedReport(context.Context, uint64, ocr3types.ReportWithInfo[llotypes.ReportInfo]) (bool, error)
func (*Plugin) ShouldTransmitAcceptedReport ¶
func (p *Plugin) ShouldTransmitAcceptedReport(context.Context, uint64, ocr3types.ReportWithInfo[llotypes.ReportInfo]) (bool, error)
func (*Plugin) ValidateObservation ¶
func (p *Plugin) ValidateObservation(outctx ocr3types.OutcomeContext, query types.Query, ao types.AttributedObservation) error
Should return an error if an observation isn't well-formed. Non-well-formed observations will be discarded by the protocol. This is called for each observation, don't do anything slow in here.
You may assume that the outctx.SeqNr is increasing monotonically (though *not* strictly) across the lifetime of a protocol instance and that outctx.previousOutcome contains the consensus outcome with sequence number (outctx.SeqNr-1).
type PluginFactory ¶
type PluginFactory struct {
Config Config
PredecessorRetirementReportCache PredecessorRetirementReportCache
ShouldRetireCache ShouldRetireCache
ChannelDefinitionCache ChannelDefinitionCache
DataSource DataSource
Logger logger.Logger
Codecs map[llotypes.ReportFormat]ReportCodec
}
func NewPluginFactory ¶
func NewPluginFactory(cfg Config, prrc PredecessorRetirementReportCache, src ShouldRetireCache, cdc ChannelDefinitionCache, ds DataSource, lggr logger.Logger, codecs map[llotypes.ReportFormat]ReportCodec) *PluginFactory
func (*PluginFactory) NewReportingPlugin ¶
func (f *PluginFactory) NewReportingPlugin(cfg ocr3types.ReportingPluginConfig) (ocr3types.ReportingPlugin[llotypes.ReportInfo], ocr3types.ReportingPluginInfo, error)
type PredecessorRetirementReportCache ¶
type PredecessorRetirementReportCache interface {
AttestedRetirementReport(predecessorConfigDigest ocr2types.ConfigDigest) ([]byte, error)
CheckAttestedRetirementReport(predecessorConfigDigest ocr2types.ConfigDigest, attestedRetirementReport []byte) (RetirementReport, error)
}
The predecessor protocol instance stores its attested retirement report in this cache (locally, offchain), so it can be fetched by the successor protocol instance.
PredecessorRetirementReportCache is populated by the old protocol instance writing to it and the new protocol instance reading from it.
The sketch envisions it being implemented as a single object that is shared between different protocol instances.
func NewPredecessorRetirementReportCache ¶
func NewPredecessorRetirementReportCache() PredecessorRetirementReportCache
TODO: This ought to be DB-persisted https://smartcontract-it.atlassian.net/browse/MERC-3386
type Report ¶
type Report struct {
ConfigDigest types.ConfigDigest
// Chain the report is destined for
ChainSelector uint64
// OCR sequence number of this report
SeqNr uint64
// Channel that is being reported on
ChannelID llotypes.ChannelID
// Report is valid for ValidAfterSeconds < block.time <= ValidUntilSeconds
ValidAfterSeconds uint32
ValidUntilSeconds uint32
// Here we only encode big.Ints, but in principle there's nothing stopping
// us from also supporting non-numeric data or smaller values etc...
Values []*big.Int
// The contract onchain will only validate non-specimen reports. A staging
// protocol instance will generate specimen reports so we can validate it
// works properly without any risk of misreports landing on chain.
Specimen bool
}
type ReportCodec ¶
type RetirementReport ¶
type ShouldRetireCache ¶
type ShouldRetireCache interface {
// Should the protocol instance retire according to the configuration
// contract?
// See: https://github.com/smartcontractkit/mercury-v1-sketch/blob/main/onchain/src/ConfigurationStore.sol#L18
ShouldRetire() (bool, error)
}
func NewShouldRetireCache ¶
func NewShouldRetireCache() ShouldRetireCache
TODO: https://smartcontract-it.atlassian.net/browse/MERC-3386
type StreamValues ¶
Values for a set of streams, e.g. "eth-usd", "link-usd", "eur-chf" etc StreamIDs are uint32 TODO: generalize from *big.Int to anything https://smartcontract-it.atlassian.net/browse/MERC-3525 TODO: Consider renaming to StreamDataPoints? Or StreamObservations?
type Transmitter ¶
type Transmitter interface {
// NOTE: Mercury doesn't actually transmit on-chain, so there is no
// "contract" involved with the transmitter.
// - Transmit should be implemented and send to Mercury server
// - FromAccount() should return CSA public key
ocr3types.ContractTransmitter[llotypes.ReportInfo]
}