Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Justfile
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,6 @@ fmt: ensure-golangci-lint
mod-tidy-all: ensure-gomods
gomods tidy
./tools/bin/modgraph.sh > go.md

sh:
cd ./build/devenv && go run ./cmd/ccv sh
13 changes: 13 additions & 0 deletions build/devenv/cmd/ccv/ccv.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,17 @@ const (
var rootCmd = &cobra.Command{
Use: "ccv",
Short: "A CCV local environment tool",
PersistentPreRunE: func(cmd *cobra.Command, args []string) error {
debug, err := cmd.Flags().GetBool("debug")
if err != nil {
return err
}
if debug {
framework.L.Info().Msg("Debug mode enabled, setting CTF_CLNODE_DLV=true")
os.Setenv("CTF_CLNODE_DLV", "true")
}
return nil
},
}

var restartCmd = &cobra.Command{
Expand Down Expand Up @@ -498,6 +509,8 @@ var sendCmd = &cobra.Command{
}

func init() {
rootCmd.PersistentFlags().BoolP("debug", "d", false, "Enable running services with dlv to allow remote debugging.")

// Blockscout, on-chain debug
bsCmd.PersistentFlags().StringP("url", "u", "http://host.docker.internal:8555", "EVM RPC node URL (default to dst chain on 8555")
bsCmd.PersistentFlags().StringP("chain-id", "c", "2337", "RPC's Chain ID")
Expand Down
5 changes: 4 additions & 1 deletion build/devenv/env-single-node-rebuild.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,7 @@

[nodesets.node_specs.node]
docker_ctx = "../../../chainlink"
docker_file = "plugins/chainlink.Dockerfile"
docker_file = "plugins/chainlink.Dockerfile"

[nodesets.node_specs.node.env_vars]
CL_EVM_CMD=""
6 changes: 6 additions & 0 deletions common/evm/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Common EVM Module

This directory contains logic required for EVM services.

In addition to service implementations for the Verifier and Executor, there
is launcher code to start services on the CLL node.
19 changes: 19 additions & 0 deletions common/evm/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package evm

import "github.com/smartcontractkit/chainlink-ccv/protocol"

// CCVConfig holds the configuration needed to configure the CCV services.
type CCVConfig struct {
IndexerAddress string

CommitteeAggregatorAddress string

ChainConfigs map[protocol.ChainSelector]ChainConfig
}

// ChainConfig holds chain specific configurations.
type ChainConfig struct {
CCVAggregatorAddress string
CCVProxyAddress string
CCVCommitteeAddress string
}
75 changes: 75 additions & 0 deletions common/evm/start_committee_verifier.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package evm

import (
"context"
"time"

"github.com/smartcontractkit/chainlink-ccv/common/storageaccess"
"github.com/smartcontractkit/chainlink-ccv/protocol"
"github.com/smartcontractkit/chainlink-ccv/verifier"
"github.com/smartcontractkit/chainlink-ccv/verifier/commit"
"github.com/smartcontractkit/chainlink-ccv/verifier/pkg/reader"
"github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/chainlink-evm/pkg/chains/legacyevm"
)

// StartCCVComitteeVerifier starts the Committee Verifier with evm chains.
func StartCCVComitteeVerifier(
ctx context.Context,
lggr logger.Logger,
cfg CCVConfig,
relayers map[protocol.ChainSelector]legacyevm.Chain,
) {
// Initialize chain components.
sourceReader := make(map[protocol.ChainSelector]verifier.SourceReader)
for sel, chain := range relayers {
if _, ok := cfg.ChainConfigs[sel]; !ok {
lggr.Warnw("No config for chain, skipping.", "chainID", sel)
continue
}

// TODO: Add checkpoint manager -- optional?
sourceReader[sel] = reader.NewEVMSourceReader(
chain.Client(),
cfg.ChainConfigs[sel].CCVProxyAddress,
sel,
nil,
logger.With(lggr, "component", "SourceReader", "chainID", sel))
}

cv, err := commit.NewCommitVerifier(
verifier.CoordinatorConfig{},
nil,
logger.With(lggr, "component", "CommitVerifier"),
nil,
)
if err != nil {
lggr.Errorw("Failed to create commit verifier.", "error", err)
return
}

verifierCoordinator, err := verifier.NewVerificationCoordinator(
verifier.WithLogger(logger.With(lggr, "component", "VerifierCoordinator")),
verifier.WithSourceReaders(sourceReader),
verifier.WithConfig(verifier.CoordinatorConfig{VerifierID: "rubber-ducky"}),
verifier.WithVerifier(cv),
verifier.WithStorage(storageaccess.NewInMemoryOffchainStorage(
logger.With(lggr, "component", "StorageAccessor"))),
)
if err != nil {
lggr.Errorw("Failed to create verification coordinator.", "error", err)
return
}

lggr.Infow("Starting verifier")
err = verifierCoordinator.Start(ctx)
if err != nil {
lggr.Errorw("Failed to start verification coordinator.", "error", err)
return
}

for {
lggr.Infow("verifier health", "HealthCheck()", verifierCoordinator.HealthReport())
time.Sleep(10 * time.Second)
}
}
78 changes: 78 additions & 0 deletions common/evm/start_executor.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package evm

import (
"context"
"time"

"github.com/smartcontractkit/chainlink-ccv/executor"
"github.com/smartcontractkit/chainlink-ccv/executor/pkg/ccvstreamer"
"github.com/smartcontractkit/chainlink-ccv/executor/pkg/contracttransmitter"
"github.com/smartcontractkit/chainlink-ccv/executor/pkg/destinationreader"
"github.com/smartcontractkit/chainlink-ccv/executor/pkg/leaderelector"
"github.com/smartcontractkit/chainlink-ccv/protocol"
"github.com/smartcontractkit/chainlink-common/pkg/logger"
"github.com/smartcontractkit/chainlink-evm/pkg/chains/legacyevm"

x "github.com/smartcontractkit/chainlink-ccv/executor/pkg/executor"
)

// StartCCVExecutor starts an executor with evm chains.
func StartCCVExecutor(
ctx context.Context,
lggr logger.Logger,
cfg CCVConfig,
relayers map[protocol.ChainSelector]legacyevm.Chain,
) {
transmitters := make(map[protocol.ChainSelector]executor.ContractTransmitter)
destReaders := make(map[protocol.ChainSelector]executor.DestinationReader)

for sel, chain := range relayers {
if _, ok := cfg.ChainConfigs[sel]; !ok {
lggr.Warnw("No config for chain, skipping.", "chainID", sel)
continue
}

transmitters[sel] = contracttransmitter.NewEVMContractTransmitterFromTxm(
logger.With(lggr, "component", "ContractTransmitter"),
uint64(sel),
chain.TxManager())

destReaders[sel] = destinationreader.NewEvmDestinationReader(
logger.With(lggr, "component", "DestinationReader"),
uint64(sel),
chain.Client(),
cfg.ChainConfigs[sel].CCVAggregatorAddress)
}

ex := x.NewChainlinkExecutor(
logger.With(lggr, "component", "Executor"),
transmitters,
destReaders)

// TODO: in memory storage reader??
// TODO: indexer or aggregator reader.
strm := ccvstreamer.NewOffchainStorageStreamer(
nil, 1*time.Second, 1*time.Second)

exec, err := executor.NewCoordinator(
executor.WithLogger(logger.With(lggr, "component", "Coordinator")),
executor.WithExecutor(ex),
executor.WithLeaderElector(&leaderelector.RandomDelayLeader{}),
executor.WithCCVResultStreamer(strm),
)
if err != nil {
lggr.Errorw("Failed to create execution coordinator.", "error", err)
return
}

err = exec.Start(ctx)
if err != nil {
lggr.Errorw("Failed to start execution coordinator.", "error", err)
return
}

for {
lggr.Info("Executor is running:", exec.HealthReport())
time.Sleep(10 * time.Second)
}
}
54 changes: 49 additions & 5 deletions common/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,16 @@ module github.com/smartcontractkit/chainlink-ccv/common

go 1.24.6

replace github.com/smartcontractkit/chainlink-ccv/verifier => ../verifier

replace github.com/smartcontractkit/chainlink-ccv/executor => ../executor

replace github.com/smartcontractkit/chainlink-ccv/protocol => ../protocol

require (
github.com/smartcontractkit/chainlink-ccv/executor v0.0.0-20251003135849-403255766628
github.com/smartcontractkit/chainlink-ccv/protocol v0.0.0-20251003135849-403255766628
github.com/smartcontractkit/chainlink-ccv/verifier v0.0.0-20251003135849-403255766628
github.com/smartcontractkit/chainlink-common v0.9.5
github.com/smartcontractkit/chainlink-evm v0.3.3
github.com/smartcontractkit/chainlink-protos/chainlink-ccv/go v0.0.0-20250924193316-7b87b14901ab
Expand All @@ -14,56 +20,79 @@ require (
)

require (
github.com/DataDog/zstd v1.5.6-0.20230824185856-869dae002e5e // indirect
github.com/DataDog/zstd v1.5.6 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/VictoriaMetrics/fastcache v1.12.2 // indirect
github.com/XSAM/otelsql v0.37.0 // indirect
github.com/bahlo/generic-list-go v0.2.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bits-and-blooms/bitset v1.20.0 // indirect
github.com/buger/jsonparser v1.1.1 // indirect
github.com/cenkalti/backoff/v5 v5.0.2 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/cloudevents/sdk-go/binding/format/protobuf/v2 v2.16.1 // indirect
github.com/cloudevents/sdk-go/v2 v2.16.1 // indirect
github.com/cockroachdb/errors v1.11.3 // indirect
github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect
github.com/cockroachdb/fifo v0.0.0-20240816210425-c5d0cb0b6fc0 // indirect
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
github.com/cockroachdb/pebble v1.1.5 // indirect
github.com/cockroachdb/redact v1.1.5 // indirect
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
github.com/consensys/gnark-crypto v0.18.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect
github.com/crate-crypto/go-eth-kzg v1.3.0 // indirect
github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/deckarep/golang-set/v2 v2.6.0 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect
github.com/emicklei/dot v1.6.2 // indirect
github.com/ethereum/c-kzg-4844/v2 v2.1.0 // indirect
github.com/ethereum/go-ethereum v1.16.2 // indirect
github.com/ethereum/go-verkle v0.2.2 // indirect
github.com/fatih/color v1.18.0 // indirect
github.com/fbsobreira/gotron-sdk v0.0.0-00010101000000-000000000000 // indirect
github.com/ferranbt/fastssz v0.1.4 // indirect
github.com/fsnotify/fsnotify v1.8.0 // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
github.com/getsentry/sentry-go v0.27.0 // indirect
github.com/go-json-experiment/json v0.0.0-20250223041408-d3c622f1b874 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-ole/go-ole v1.3.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.26.0 // indirect
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
github.com/gofrs/flock v0.12.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v1.0.0 // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect
github.com/hashicorp/go-bexpr v0.1.10 // indirect
github.com/hashicorp/go-hclog v1.6.3 // indirect
github.com/hashicorp/go-plugin v1.6.3 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/hashicorp/yamux v0.1.2 // indirect
github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect
github.com/holiman/bloomfilter/v2 v2.0.3 // indirect
github.com/holiman/uint256 v1.3.2 // indirect
github.com/huin/goupnp v1.3.0 // indirect
github.com/invopop/jsonschema v0.13.0 // indirect
github.com/jackc/chunkreader/v2 v2.0.1 // indirect
github.com/jackc/pgconn v1.14.3 // indirect
github.com/jackc/pgio v1.0.0 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgproto3/v2 v2.3.3 // indirect
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
github.com/jackc/pgtype v1.14.4 // indirect
github.com/jackc/pgx/v4 v4.18.3 // indirect
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jmoiron/sqlx v1.4.0 // indirect
github.com/jpillora/backoff v1.0.0 // indirect
Expand All @@ -74,6 +103,7 @@ require (
github.com/kr/text v0.2.0 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/lib/pq v1.10.9 // indirect
github.com/mailru/easyjson v0.9.0 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect
Expand All @@ -84,7 +114,9 @@ require (
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mr-tron/base58 v1.2.0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/oklog/run v1.2.0 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
github.com/pelletier/go-toml v1.9.5 // indirect
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
github.com/pion/dtls/v2 v2.2.12 // indirect
github.com/pion/logging v0.2.2 // indirect
Expand All @@ -101,27 +133,39 @@ require (
github.com/rogpeppe/go-internal v1.13.1 // indirect
github.com/rs/cors v1.11.1 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect
github.com/scylladb/go-reflectx v1.0.1 // indirect
github.com/shirou/gopsutil v3.21.11+incompatible // indirect
github.com/shopspring/decimal v1.4.0 // indirect
github.com/smartcontractkit/chain-selectors v1.0.67 // indirect
github.com/smartcontractkit/chainlink-ccip v0.1.1-solana.0.20250915134957-5014a52895ca // indirect
github.com/smartcontractkit/chainlink-common/pkg/chipingress v0.0.4 // indirect
github.com/smartcontractkit/chainlink-evm/gethwrappers v0.0.0-20250808121824-2c3544aab8f3 // indirect
github.com/smartcontractkit/chainlink-framework/chains v0.0.0-20250717121125-2350c82883e2 // indirect
github.com/smartcontractkit/chainlink-framework/metrics v0.0.0-20250717121125-2350c82883e2 // indirect
github.com/smartcontractkit/chainlink-framework/multinode v0.0.0-20250729142306-508e798f6a5d // indirect
github.com/smartcontractkit/chainlink-protos/cre/go v0.0.0-20250911124514-5874cc6d62b2 // indirect
github.com/smartcontractkit/chainlink-protos/svr v1.1.0 // indirect
github.com/smartcontractkit/chainlink-tron/relayer v0.0.11-0.20250815105909-75499abc4335 // indirect
github.com/smartcontractkit/freeport v0.1.3-0.20250716200817-cb5dfd0e369e // indirect
github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect
github.com/smartcontractkit/libocr v0.0.0-20250707144819-babe0ec4e358 // indirect
github.com/supranational/blst v0.3.14 // indirect
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d // indirect
github.com/theodesp/go-heaps v0.0.0-20190520121037-88e35354fe0a // indirect
github.com/tidwall/gjson v1.18.0 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.1 // indirect
github.com/tklauser/go-sysconf v0.3.15 // indirect
github.com/tklauser/numcpus v0.10.0 // indirect
github.com/ugorji/go/codec v1.2.12 // indirect
github.com/urfave/cli/v2 v2.27.5 // indirect
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
github.com/x448/float16 v0.8.4 // indirect
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect
go.opentelemetry.io/otel v1.37.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2 // indirect
Expand All @@ -146,7 +190,7 @@ require (
golang.org/x/exp v0.0.0-20250711185948-6ae5c78190dc // indirect
golang.org/x/net v0.42.0 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.34.0 // indirect
golang.org/x/sys v0.35.0 // indirect
golang.org/x/text v0.27.0 // indirect
golang.org/x/time v0.12.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect
Expand Down
Loading
Loading