Skip to content

Commit

Permalink
Merge branch 'develop' into tt-1981-use-chainlink-cli
Browse files Browse the repository at this point in the history
  • Loading branch information
Tofel committed Jan 31, 2025
2 parents 6198c67 + fe48a3a commit d2c68bd
Showing 42 changed files with 1,744 additions and 255 deletions.
5 changes: 5 additions & 0 deletions .changeset/serious-suns-flow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"chainlink": patch
---

Only show OCR info-level logs with VerboseLogging #internal
2 changes: 1 addition & 1 deletion GNUmakefile
Original file line number Diff line number Diff line change
@@ -111,7 +111,7 @@ abigen: ## Build & install abigen.
.PHONY: generate
generate: abigen codecgen mockery protoc gomods ## Execute all go:generate commands.
## Updating PATH makes sure that go:generate uses the version of protoc installed by the protoc make command.
export PATH=$(HOME)/.local/bin:$(PATH); gomods -w go generate -x ./...
export PATH="$(HOME)/.local/bin:$(PATH)"; gomods -w go generate -x ./...
find . -type f -name .mockery.yaml -execdir mockery \; ## Execute mockery for all .mockery.yaml files

.PHONY: rm-mocked
2 changes: 1 addition & 1 deletion ccip/config/evm/fallback.toml
Original file line number Diff line number Diff line change
@@ -67,7 +67,7 @@ CacheTimeout = '10s'
[HeadTracker]
HistoryDepth = 100
MaxBufferSize = 3
SamplingInterval = '1s'
SamplingInterval = '5s'
FinalityTagBypass = true
MaxAllowedFinalityDepth = 10000
PersistenceEnabled = true
2 changes: 1 addition & 1 deletion core/capabilities/launcher.go
Original file line number Diff line number Diff line change
@@ -329,7 +329,7 @@ func (w *launcher) addRemoteCapabilities(ctx context.Context, myDON registrysync
return fmt.Errorf("failed to add action shim: %w", err)
}
case capabilities.CapabilityTypeConsensus:
w.lggr.Warn("no remote client configured for capability type consensus, skipping configuration")
// nothing to do; we don't support remote consensus capabilities for now
case capabilities.CapabilityTypeTarget:
newTargetFn := func(info capabilities.CapabilityInfo) (capabilityService, error) {
client := executable.NewClient(
4 changes: 2 additions & 2 deletions core/scripts/go.mod
Original file line number Diff line number Diff line change
@@ -317,9 +317,9 @@ require (
github.com/smartcontractkit/chain-selectors v1.0.37 // indirect
github.com/smartcontractkit/chainlink-ccip v0.0.0-20250130101703-5ba045c38d49 // indirect
github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250103152858-8973fd0c912b // indirect
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20250121210000-2a9675d7a1b4 // indirect
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20250130125138-3df261e09ddc // indirect
github.com/smartcontractkit/chainlink-feeds v0.1.1 // indirect
github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250121195549-294ec6a40b92 // indirect
github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250124205858-500edf2db981 // indirect
github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250121205514-f73e2f86c23b // indirect
github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 // indirect
github.com/smartcontractkit/chainlink-protos/orchestrator v0.4.0 // indirect
8 changes: 4 additions & 4 deletions core/scripts/go.sum
Original file line number Diff line number Diff line change
@@ -1335,14 +1335,14 @@ github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250103152858-8
github.com/smartcontractkit/chainlink-ccip/chains/solana v0.0.0-20250103152858-8973fd0c912b/go.mod h1:Bmwq4lNb5tE47sydN0TKetcLEGbgl+VxHEWp4S0LI60=
github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130104613-82e554262f7d h1:ez+JYyIJ7pUR0/OnnU3AIKaC0Re85qB2fkA1NfiAnuA=
github.com/smartcontractkit/chainlink-common v0.4.2-0.20250130104613-82e554262f7d/go.mod h1:Z2e1ynSJ4pg83b4Qldbmryc5lmnrI3ojOdg1FUloa68=
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20250121210000-2a9675d7a1b4 h1:w7w42ml8MOxdoyAZ9+og0342UkiH3deRM1V0Pj5JR5g=
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20250121210000-2a9675d7a1b4/go.mod h1:wtdAmAUMooLavbrTA7PgHg40lyDlKesxI/RR+5Xcz18=
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20250130125138-3df261e09ddc h1:WZERXv2hTYRA0NpWg79ci/ZZSxucmvkty39iUOV8d7I=
github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20250130125138-3df261e09ddc/go.mod h1:2iGmU7fkVsy21Sw8D+OhtYekHLUlJKHzwePKcxIx3Ac=
github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5 h1:CvDfgWoLoYPapOumE/UZCplfCu5oNmy9BuH+6V6+fJ8=
github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20250128203428-08031923fbe5/go.mod h1:pDZagSGjs9U+l4YIFhveDznMHqxuuz+5vRxvVgpbdr8=
github.com/smartcontractkit/chainlink-feeds v0.1.1 h1:JzvUOM/OgGQA1sOqTXXl52R6AnNt+Wg64sVG+XSA49c=
github.com/smartcontractkit/chainlink-feeds v0.1.1/go.mod h1:55EZ94HlKCfAsUiKUTNI7QlE/3d3IwTlsU3YNa/nBb4=
github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250121195549-294ec6a40b92 h1:lJi0dWfgNJl4Um5KzeZZPVBi//CPDfzzeVmv4Z2OGNY=
github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250121195549-294ec6a40b92/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g=
github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250124205858-500edf2db981 h1:svbNog045hGmbE3q10y3ijV55IgaqZMqvSnWGCa0d5w=
github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250124205858-500edf2db981/go.mod h1:tHem58EihQh63kR2LlAOKDAs9Vbghf1dJKZRGy6LG8g=
github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250121205514-f73e2f86c23b h1:TO1pwFeQKDOmv3loFiLJvYhtymuTgQUw9WgtwK1rueg=
github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250121205514-f73e2f86c23b/go.mod h1:4JqpgFy01LaqG1yM2iFTzwX3ZgcAvW9WdstBZQgPHzU=
github.com/smartcontractkit/chainlink-protos/job-distributor v0.6.0 h1:0ewLMbAz3rZrovdRUCgd028yOXX8KigB4FndAUdI2kM=
2 changes: 1 addition & 1 deletion core/services/llo/delegate.go
Original file line number Diff line number Diff line change
@@ -135,7 +135,7 @@ func (d *delegate) Start(ctx context.Context) error {
case 1:
lggr = logger.With(lggr, "instanceType", "Green")
}
ocrLogger := logger.NewOCRWrapper(NewSuppressedLogger(lggr, d.cfg.ReportingPluginConfig.VerboseLogging), d.cfg.TraceLogging, func(msg string) {
ocrLogger := logger.NewOCRWrapper(NewSuppressedLogger(lggr, d.cfg.TraceLogging, d.cfg.ReportingPluginConfig.VerboseLogging), d.cfg.TraceLogging, func(msg string) {
// NOTE: Some OCR loggers include a DB-persist here
// We do not DB persist errors in LLO, since they could be quite voluminous and ought to be present in logs anyway.
// This is a performance optimization
24 changes: 13 additions & 11 deletions core/services/llo/suppressed_logger.go
Original file line number Diff line number Diff line change
@@ -2,50 +2,52 @@ package llo

import "github.com/smartcontractkit/chainlink-common/pkg/logger"

// Suppressed logger swallows debug/info unless the verbose flag is turned on
// Suppressed logger swallows debug and/or info levels
// Useful for OCR to calm down its verbosity

var _ logger.Logger = &SuppressedLogger{}

func NewSuppressedLogger(lggr logger.Logger, verbose bool) logger.Logger {
func NewSuppressedLogger(lggr logger.Logger, debug, info bool) logger.Logger {
return &SuppressedLogger{
Logger: lggr,
Verbose: verbose,
Logger: lggr,
DebugLevel: debug,
InfoLevel: info,
}
}

type SuppressedLogger struct {
logger.Logger
Verbose bool
DebugLevel bool
InfoLevel bool
}

func (s *SuppressedLogger) Debug(args ...interface{}) {
if s.Verbose {
if s.DebugLevel {
s.Logger.Debug(args...)
}
}
func (s *SuppressedLogger) Info(args ...interface{}) {
if s.Verbose {
if s.InfoLevel {
s.Logger.Info(args...)
}
}
func (s *SuppressedLogger) Debugf(format string, values ...interface{}) {
if s.Verbose {
if s.DebugLevel {
s.Logger.Debugf(format, values...)
}
}
func (s *SuppressedLogger) Infof(format string, values ...interface{}) {
if s.Verbose {
if s.InfoLevel {
s.Logger.Infof(format, values...)
}
}
func (s *SuppressedLogger) Debugw(msg string, keysAndValues ...interface{}) {
if s.Verbose {
if s.DebugLevel {
s.Logger.Debugw(msg, keysAndValues...)
}
}
func (s *SuppressedLogger) Infow(msg string, keysAndValues ...interface{}) {
if s.Verbose {
if s.InfoLevel {
s.Logger.Infow(msg, keysAndValues...)
}
}
4 changes: 2 additions & 2 deletions core/services/ocr2/delegate.go
Original file line number Diff line number Diff line change
@@ -885,7 +885,7 @@ func (d *Delegate) newServicesMercury(
lc.ContractConfigTrackerPollInterval = 1 * time.Second // This is the fastest that libocr supports. See: https://github.com/smartcontractkit/offchain-reporting/pull/520

// Disable OCR debug+info logging for legacy mercury jobs unless tracelogging is enabled, because its simply too verbose (150 jobs => ~50k logs per second)
ocrLogger := ocrcommon.NewOCRWrapper(llo.NewSuppressedLogger(lggr, d.cfg.OCR2().TraceLogging()), d.cfg.OCR2().TraceLogging(), func(ctx context.Context, msg string) {
ocrLogger := ocrcommon.NewOCRWrapper(llo.NewSuppressedLogger(lggr, d.cfg.OCR2().TraceLogging(), d.cfg.OCR2().TraceLogging()), d.cfg.OCR2().TraceLogging(), func(ctx context.Context, msg string) {
lggr.ErrorIf(d.jobORM.RecordError(ctx, jb.ID, msg), "unable to record error")
})

@@ -946,7 +946,6 @@ func (d *Delegate) newServicesLLO(
ocrDB *db,
lc ocrtypes.LocalConfig,
) ([]job.ServiceCtx, error) {
lggr = logger.Sugared(lggr.Named("LLO"))
spec := jb.OCR2OracleSpec
transmitterID := spec.TransmitterID.String
if len(transmitterID) != 64 {
@@ -985,6 +984,7 @@ func (d *Delegate) newServicesLLO(
if err = json.Unmarshal(spec.PluginConfig.Bytes(), &pluginCfg); err != nil {
return nil, err
}
lggr = logger.Sugared(lggr.Named("LLO").With("donID", pluginCfg.DonID, "channelDefinitionsContractAddress", pluginCfg.ChannelDefinitionsContractAddress))

// Handle key bundle IDs explicitly specified in job spec
kbm := make(map[llotypes.ReportFormat]llo.Key)
4 changes: 2 additions & 2 deletions core/services/relay/evm/evm.go
Original file line number Diff line number Diff line change
@@ -209,7 +209,7 @@ func NewRelayer(ctx context.Context, lggr logger.Logger, chain legacyevm.Chain,
if err != nil {
return nil, fmt.Errorf("cannot create evm relayer: %w", err)
}
sugared := logger.Sugared(lggr).Named("Relayer")
sugared := logger.Sugared(lggr).Named("Relayer").With("evmChainID", chain.ID())
mercuryORM := mercury.NewORM(opts.DS)
cdcFactory := sync.OnceValues(func() (llo.ChannelDefinitionCacheFactory, error) {
chainSelector, err := chainselectors.SelectorFromChainId(chain.ID().Uint64())
@@ -836,7 +836,7 @@ func (r *Relayer) NewConfigProvider(ctx context.Context, args commontypes.RelayA
// performance hit no matter how minor.
configProvider, err = newLLOConfigProvider(ctx, lggr, r.chain, &llo.NullRetirementReportCache{}, relayOpts)
case "ocr3-capability":
configProvider, err = newOCR3CapabilityConfigProvider(ctx, r.lggr, r.chain, relayOpts)
configProvider, err = newOCR3CapabilityConfigProvider(ctx, lggr, r.chain, relayOpts)
default:
return nil, fmt.Errorf("unrecognized provider type: %q", args.ProviderType)
}
67 changes: 45 additions & 22 deletions core/services/relay/evm/llo/config_poller.go
Original file line number Diff line number Diff line change
@@ -4,10 +4,12 @@ import (
"bytes"
"context"
"database/sql"
"encoding/hex"
"fmt"
"math"
"math/big"
"strconv"
"sync"

"github.com/ethereum/go-ethereum/common"
"github.com/pkg/errors"
@@ -60,7 +62,8 @@ type configPoller struct {
donIDTopic [32]byte
filterExprs []query.Expression

fromBlock uint64
fromBlock int64
mu sync.RWMutex

instanceType InstanceType
}
@@ -100,7 +103,7 @@ func newConfigPoller(lggr logger.Logger, lp LogPoller, cc ConfigCache, addr comm
donIDTopic: DonIDToBytes32(donID),
filterExprs: exprs,
instanceType: instanceType,
fromBlock: fromBlock,
fromBlock: int64(fromBlock),
}
cp.Service, cp.eng = services.Config{
Name: "LLOConfigPoller",
@@ -115,11 +118,32 @@ func (cp *configPoller) Notify() <-chan struct{} {

// LatestConfigDetails returns the latest config details from the logs
func (cp *configPoller) LatestConfigDetails(ctx context.Context) (changedInBlock uint64, configDigest ocrtypes.ConfigDigest, err error) {
latestConfig, log, err := cp.latestConfig(ctx, int64(cp.fromBlock), math.MaxInt64) // #nosec G115
latestConfig, log, err := cp.latestConfig(ctx, cp.readFromBlock(), math.MaxInt64)
if err != nil {
return 0, ocrtypes.ConfigDigest{}, fmt.Errorf("failed to get latest config: %w", err)
}
return uint64(log.BlockNumber), latestConfig.ConfigDigest, nil
// Slight optimization, since we only care about the latest log, we can
// avoid re-scanning from the original fromBlock every time by setting
// fromBlock to the latest seen log here.
//
// This should always be safe even if LatestConfigDetails is called
// concurrently.
cp.setFromBlock(log.BlockNumber)
return uint64(log.BlockNumber), latestConfig.ConfigDigest, nil // #nosec G115 // log.BlockNumber will never be negative
}

func (cp *configPoller) readFromBlock() int64 {
cp.mu.RLock()
defer cp.mu.RUnlock()
return cp.fromBlock
}

func (cp *configPoller) setFromBlock(fromBlock int64) {
cp.mu.Lock()
defer cp.mu.Unlock()
if fromBlock > cp.fromBlock {
cp.fromBlock = fromBlock
}
}

func (cp *configPoller) latestConfig(ctx context.Context, fromBlock, toBlock int64) (latestConfig FullConfigFromLog, latestLog logpoller.Log, err error) {
@@ -150,7 +174,7 @@ func (cp *configPoller) latestConfig(ctx context.Context, fromBlock, toBlock int
}

if err = cp.cc.StoreConfig(ctx, event.ConfigDigest, event.Signers, event.F); err != nil {
cp.eng.SugaredLogger.Errorf("failed to store production config: %v", err)
cp.eng.Errorf("failed to store production config: %v", err)
}

isProduction := (cp.instanceType != InstanceTypeBlue) == event.IsGreenProduction
@@ -168,7 +192,7 @@ func (cp *configPoller) latestConfig(ctx context.Context, fromBlock, toBlock int
}

if err = cp.cc.StoreConfig(ctx, event.ConfigDigest, event.Signers, event.F); err != nil {
cp.eng.SugaredLogger.Errorf("failed to store staging config: %v", err)
cp.eng.Errorf("failed to store staging config: %v", err)
}

isProduction := (cp.instanceType != InstanceTypeBlue) == event.IsGreenProduction
@@ -190,10 +214,11 @@ func (cp *configPoller) latestConfig(ctx context.Context, fromBlock, toBlock int

// LatestConfig returns the latest config from the logs starting from a certain block
func (cp *configPoller) LatestConfig(ctx context.Context, changedInBlock uint64) (ocrtypes.ContractConfig, error) {
cfg, _, err := cp.latestConfig(ctx, int64(changedInBlock), math.MaxInt64) // #nosec G115
cfg, latestLog, err := cp.latestConfig(ctx, int64(changedInBlock), math.MaxInt64) // #nosec G115
if err != nil {
return ocrtypes.ContractConfig{}, fmt.Errorf("failed to get latest config: %w", err)
}
cp.eng.Infow("LatestConfig fetched", "config", cfg.ContractConfig, "txHash", latestLog.TxHash, "blockNumber", latestLog.BlockNumber, "blockHash", latestLog.BlockHash, "logIndex", latestLog.LogIndex, "instanceType", cp.instanceType, "donID", cp.donID, "changedInBlock", changedInBlock)
return cfg.ContractConfig, nil
}

@@ -206,7 +231,7 @@ func (cp *configPoller) LatestBlockHeight(ctx context.Context) (blockHeight uint
}
return 0, err
}
return uint64(latest.BlockNumber), nil
return uint64(latest.BlockNumber), nil // #nosec G115 // latest.BlockNumber will never be negative
}

func (cp *configPoller) InstanceType() InstanceType {
@@ -220,14 +245,13 @@ type FullConfigFromLog struct {
}

func FullConfigFromProductionConfigSet(unpacked configurator.ConfiguratorProductionConfigSet) (FullConfigFromLog, error) {
var transmitAccounts []ocrtypes.Account
for _, addr := range unpacked.OffchainTransmitters {
transmitAccounts = append(transmitAccounts, ocrtypes.Account(fmt.Sprintf("%x", addr)))
transmitAccounts := make([]ocrtypes.Account, len(unpacked.OffchainTransmitters))
for i, addr := range unpacked.OffchainTransmitters {
transmitAccounts[i] = ocrtypes.Account(hex.EncodeToString(addr[:]))
}
var signers []ocrtypes.OnchainPublicKey
for _, addr := range unpacked.Signers {
addr := addr
signers = append(signers, addr)
signers := make([]ocrtypes.OnchainPublicKey, len(unpacked.Signers))
for i, addr := range unpacked.Signers {
signers[i] = addr
}

donIDBig := common.Hash(unpacked.ConfigId).Big()
@@ -252,14 +276,13 @@ func FullConfigFromProductionConfigSet(unpacked configurator.ConfiguratorProduct
}

func FullConfigFromStagingConfigSet(unpacked configurator.ConfiguratorStagingConfigSet) (FullConfigFromLog, error) {
var transmitAccounts []ocrtypes.Account
for _, addr := range unpacked.OffchainTransmitters {
transmitAccounts = append(transmitAccounts, ocrtypes.Account(fmt.Sprintf("%x", addr)))
transmitAccounts := make([]ocrtypes.Account, len(unpacked.OffchainTransmitters))
for i, addr := range unpacked.OffchainTransmitters {
transmitAccounts[i] = ocrtypes.Account(hex.EncodeToString(addr[:]))
}
var signers []ocrtypes.OnchainPublicKey
for _, addr := range unpacked.Signers {
addr := addr
signers = append(signers, addr)
signers := make([]ocrtypes.OnchainPublicKey, len(unpacked.Signers))
for i, addr := range unpacked.Signers {
signers[i] = addr
}

donIDBig := common.Hash(unpacked.ConfigId).Big()
2 changes: 1 addition & 1 deletion core/services/relay/evm/write_target_test.go
Original file line number Diff line number Diff line change
@@ -264,12 +264,12 @@ func TestEvmWrite(t *testing.T) {
testChain := evmmocks.NewChain(t)
testCfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, s *chainlink.Secrets) {
c.EVM[0].Workflow.FromAddress = nil

forwarderA := testutils.NewAddress()
forwarderAddr, err2 := evmtypes.NewEIP55Address(forwarderA.Hex())
require.NoError(t, err2)
c.EVM[0].Workflow.ForwarderAddress = &forwarderAddr
})
testChain.On("ID").Return(big.NewInt(11155111))
testChain.On("Config").Return(evmtest.NewChainScopedConfig(t, testCfg))
capabilityRegistry := evmcapabilities.NewRegistry(lggr)

Loading

0 comments on commit d2c68bd

Please sign in to comment.