Skip to content

Commit 47a18a8

Browse files
authored
bump libocr and add multi signing keys comparison support (#21872)
1 parent 37b2706 commit 47a18a8

20 files changed

Lines changed: 92 additions & 35 deletions

File tree

core/capabilities/ccip/oraclecreator/plugin.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"github.com/smartcontractkit/libocr/commontypes"
2020
libocr3 "github.com/smartcontractkit/libocr/offchainreporting2plus"
2121
"github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3confighelper"
22+
"github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3shims"
2223
"github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3types"
2324
ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
2425

@@ -272,7 +273,7 @@ func (i *pluginOracleCreator) Create(ctx context.Context, donID uint32, config c
272273
return nil, fmt.Errorf("failed to setup observation metrics collector: %w", err)
273274
}
274275

275-
oracleArgs := libocr3.OCR3OracleArgs[[]byte]{
276+
oracleArgs := libocr3.OCR3OracleArgs2[[]byte]{
276277
BinaryNetworkEndpointFactory: i.peerWrapper.Peer2,
277278
Database: i.db,
278279
// NOTE: when specifying V2Bootstrappers here we actually do NOT need to run a full bootstrap node!
@@ -297,7 +298,7 @@ func (i *pluginOracleCreator) Create(ctx context.Context, donID uint32, config c
297298
),
298299
OffchainConfigDigester: ocrimpls.NewConfigDigester(config.ConfigDigest),
299300
OffchainKeyring: keybundle,
300-
OnchainKeyring: onchainKeyring,
301+
OnchainKeyring: ocr3shims.OnchainKeyringAsOnchainKeyring2(onchainKeyring),
301302
ReportingPluginFactory: factory,
302303
}
303304
oracle, err := libocr3.NewOracle(oracleArgs)

core/scripts/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ require (
5959
github.com/smartcontractkit/chainlink-testing-framework/framework/components/dockercompose v0.1.20
6060
github.com/smartcontractkit/chainlink-testing-framework/lib v1.54.5
6161
github.com/smartcontractkit/chainlink-testing-framework/seth v1.51.5
62-
github.com/smartcontractkit/libocr v0.0.0-20260304194147-a03701e2c02e
62+
github.com/smartcontractkit/libocr v0.0.0-20260403184524-b6409238958d
6363
github.com/spf13/cobra v1.10.2
6464
github.com/spf13/pflag v1.0.10
6565
github.com/spf13/viper v1.21.0

core/scripts/go.sum

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

core/services/llo/delegate.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/prometheus/client_golang/prometheus"
1010
ocrcommontypes "github.com/smartcontractkit/libocr/commontypes"
1111
ocr2plus "github.com/smartcontractkit/libocr/offchainreporting2plus"
12+
"github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3shims"
1213
"github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3types"
1314
ocr2types "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
1415
"gopkg.in/guregu/null.v4"
@@ -164,7 +165,7 @@ func (d *delegate) Start(ctx context.Context) error {
164165
// This is a performance optimization
165166
})
166167

167-
oracle, err := ocr2plus.NewOracle(ocr2plus.OCR3OracleArgs[llotypes.ReportInfo]{
168+
oracle, err := ocr2plus.NewOracle(ocr2plus.OCR3OracleArgs2[llotypes.ReportInfo]{
168169
BinaryNetworkEndpointFactory: d.cfg.BinaryNetworkEndpointFactory,
169170
V2Bootstrappers: d.cfg.V2Bootstrappers,
170171
ContractConfigTracker: configTracker,
@@ -175,7 +176,7 @@ func (d *delegate) Start(ctx context.Context) error {
175176
MonitoringEndpoint: d.cfg.OCR3MonitoringEndpoint,
176177
OffchainConfigDigester: d.cfg.OffchainConfigDigester,
177178
OffchainKeyring: d.cfg.OffchainKeyring,
178-
OnchainKeyring: d.cfg.OnchainKeyring,
179+
OnchainKeyring: ocr3shims.OnchainKeyringAsOnchainKeyring2(d.cfg.OnchainKeyring),
179180
ReportingPluginFactory: promwrapper.NewReportingPluginFactory(
180181
datastreamsllo.NewPluginFactory(
181182
datastreamsllo.PluginFactoryParams{

core/services/ocr2/delegate.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"github.com/smartcontractkit/libocr/commontypes"
2525
libocr2 "github.com/smartcontractkit/libocr/offchainreporting2plus"
2626
kvdb "github.com/smartcontractkit/libocr/offchainreporting2plus/keyvaluedatabase"
27+
"github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3shims"
2728
"github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3types"
2829
ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
2930

@@ -812,7 +813,7 @@ func (d *Delegate) newServicesVaultPlugin(
812813
lggr.Infow("Using dynamic OCR config from registry", "capabilityID", vaultCapabilityID, "ocrConfigKey", vaultOCRConfigKey)
813814
}
814815

815-
oracleArgs := libocr2.OCR3_1OracleArgs[[]byte]{
816+
oracleArgs := libocr2.OCR3_1OracleArgs2[[]byte]{
816817
BinaryNetworkEndpointFactory: d.peerWrapper.Peer3_1,
817818
V2Bootstrappers: bootstrapPeers,
818819
ContractConfigTracker: configTracker,
@@ -828,7 +829,7 @@ func (d *Delegate) newServicesVaultPlugin(
828829
MonitoringEndpoint: oracleEndpoint,
829830
OffchainConfigDigester: configDigester,
830831
OffchainKeyring: kb,
831-
OnchainKeyring: onchainKeyringAdapter,
832+
OnchainKeyring: ocr3shims.OnchainKeyringAsOnchainKeyring2(onchainKeyringAdapter),
832833
MetricsRegisterer: prometheus.WrapRegistererWith(map[string]string{"job_name": jb.Name.ValueOrZero()}, prometheus.DefaultRegisterer),
833834
}
834835
rpf, err := vaultocrplugin.NewReportingPluginFactory(
@@ -1027,7 +1028,7 @@ func (d *Delegate) newDonTimePlugin(
10271028
lggr.Infow("Using dynamic OCR config from registry", "capabilityID", dontimeCapabilityID)
10281029
}
10291030

1030-
oracleArgs := libocr2.OCR3OracleArgs[[]byte]{
1031+
oracleArgs := libocr2.OCR3OracleArgs2[[]byte]{
10311032
BinaryNetworkEndpointFactory: d.peerWrapper.Peer2,
10321033
V2Bootstrappers: bootstrapPeers,
10331034
ContractConfigTracker: configTracker,
@@ -1038,7 +1039,7 @@ func (d *Delegate) newDonTimePlugin(
10381039
MonitoringEndpoint: oracleEndpoint,
10391040
OffchainConfigDigester: configDigester,
10401041
OffchainKeyring: kb,
1041-
OnchainKeyring: onchainKeyringAdapter,
1042+
OnchainKeyring: ocr3shims.OnchainKeyringAsOnchainKeyring2(onchainKeyringAdapter),
10421043
MetricsRegisterer: prometheus.WrapRegistererWith(map[string]string{"job_name": jb.Name.ValueOrZero()}, prometheus.DefaultRegisterer),
10431044
}
10441045
baseFactory, err := dontime.NewFactory(d.dontimeStore, lggr.Named("DonTimePluginFactory"))
@@ -1195,7 +1196,7 @@ func (d *Delegate) newServicesRing(
11951196
onchainKeyringAdapter = ocrcommon.NewOCR3OnchainKeyringAdapter(kb)
11961197
}
11971198

1198-
oracleArgs := libocr2.OCR3OracleArgs[[]byte]{
1199+
oracleArgs := libocr2.OCR3OracleArgs2[[]byte]{
11991200
BinaryNetworkEndpointFactory: d.peerWrapper.Peer2,
12001201
V2Bootstrappers: bootstrapPeers,
12011202
ContractConfigTracker: provider.ContractConfigTracker(),
@@ -1206,7 +1207,7 @@ func (d *Delegate) newServicesRing(
12061207
MonitoringEndpoint: oracleEndpoint,
12071208
OffchainConfigDigester: provider.OffchainConfigDigester(),
12081209
OffchainKeyring: kb,
1209-
OnchainKeyring: onchainKeyringAdapter,
1210+
OnchainKeyring: ocr3shims.OnchainKeyringAsOnchainKeyring2(onchainKeyringAdapter),
12101211
MetricsRegisterer: prometheus.WrapRegistererWith(map[string]string{"job_name": jb.Name.ValueOrZero()}, prometheus.DefaultRegisterer),
12111212
}
12121213
oracleArgs.ReportingPluginFactory, err = ring.NewFactory(ringStore, arbiterScalerClient, lggr.Named("RingPluginFactory"), &ring.ConsensusConfig{
@@ -1442,7 +1443,7 @@ func (d *Delegate) newServicesGenericPlugin(
14421443
} else {
14431444
onchainKeyringAdapter = ocrcommon.NewOCR3OnchainKeyringAdapter(kb)
14441445
}
1445-
oracleArgs := libocr2.OCR3OracleArgs[[]byte]{
1446+
oracleArgs := libocr2.OCR3OracleArgs2[[]byte]{
14461447
BinaryNetworkEndpointFactory: d.peerWrapper.Peer2,
14471448
V2Bootstrappers: bootstrapPeers,
14481449
ContractConfigTracker: provider.ContractConfigTracker(),
@@ -1453,7 +1454,7 @@ func (d *Delegate) newServicesGenericPlugin(
14531454
MonitoringEndpoint: oracleEndpoint,
14541455
OffchainConfigDigester: provider.OffchainConfigDigester(),
14551456
OffchainKeyring: kb,
1456-
OnchainKeyring: onchainKeyringAdapter,
1457+
OnchainKeyring: ocr3shims.OnchainKeyringAsOnchainKeyring2(onchainKeyringAdapter),
14571458
MetricsRegisterer: prometheus.WrapRegistererWith(map[string]string{"job_name": jb.Name.ValueOrZero()}, prometheus.DefaultRegisterer),
14581459
}
14591460
oracleArgs.ReportingPluginFactory = plugin

core/services/ocr2/plugins/generic/oraclefactory.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/prometheus/client_golang/prometheus"
1111

1212
ocr "github.com/smartcontractkit/libocr/offchainreporting2plus"
13+
"github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3shims"
1314
"github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3types"
1415
ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
1516

@@ -174,7 +175,7 @@ func (of *oracleFactory) NewOracle(ctx context.Context, args core.OracleArgs) (c
174175
return nil, fmt.Errorf("failed to instantiate onchain keyring with multi chain adapter: %w", err)
175176
}
176177

177-
oracle, err := ocr.NewOracle(ocr.OCR3OracleArgs[[]byte]{
178+
oracle, err := ocr.NewOracle(ocr.OCR3OracleArgs2[[]byte]{
178179
ContractConfigTracker: configTracker,
179180
OffchainConfigDigester: configDigester,
180181
LocalConfig: AdjustLocalConfigForRegistryBasedConfig(args.LocalConfig),
@@ -188,7 +189,7 @@ func (of *oracleFactory) NewOracle(ctx context.Context, args core.OracleArgs) (c
188189
}),
189190
MonitoringEndpoint: &telemetry.NoopAgent{},
190191
OffchainKeyring: of.kb,
191-
OnchainKeyring: onchainKeyringAdapter,
192+
OnchainKeyring: ocr3shims.OnchainKeyringAsOnchainKeyring2(onchainKeyringAdapter),
192193
MetricsRegisterer: prometheus.WrapRegistererWith(map[string]string{"job_name": of.jobName}, prometheus.DefaultRegisterer),
193194
})
194195

core/services/ocrcommon/adapters.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ func (c *OCR3ContractTransmitterAdapter) FromAccount(ctx context.Context) (ocrty
8787
}
8888

8989
var _ ocr3types.OnchainKeyring[[]byte] = (*OCR3OnchainKeyringMultiChainAdapter)(nil)
90+
var _ ocr3types.OnchainKeyring2[[]byte] = (*OCR3OnchainKeyringMultiChainAdapter)(nil)
9091

9192
func MarshalMultichainKeyBundle(ost map[string]ocr2key.KeyBundle) (ocrtypes.OnchainPublicKey, error) {
9293
pubKeys := map[string]ocrtypes.OnchainPublicKey{}
@@ -185,6 +186,34 @@ func (a *OCR3OnchainKeyringMultiChainAdapter) PublicKey() ocrtypes.OnchainPublic
185186
return a.publicKey
186187
}
187188

189+
// Has returns true if every chain public key in k matches this adapter (k may be a subset of supported chains).
190+
func (a *OCR3OnchainKeyringMultiChainAdapter) Has(k ocrtypes.OnchainPublicKey) bool {
191+
if len(k) == 0 {
192+
return false
193+
}
194+
keys, err := UnmarshalMultichainPublicKey(k)
195+
if err != nil {
196+
return bytes.Equal(k, a.publicKey)
197+
}
198+
if len(keys) == 0 {
199+
return false
200+
}
201+
for chainName, pubKey := range keys {
202+
kb, ok := a.keyBundles[chainName]
203+
if !ok {
204+
return false
205+
}
206+
if !bytes.Equal(pubKey, kb.PublicKey()) {
207+
return false
208+
}
209+
}
210+
return true
211+
}
212+
213+
func (a *OCR3OnchainKeyringMultiChainAdapter) DebugIdentifier() string {
214+
return fmt.Sprintf("%x", a.publicKey)
215+
}
216+
188217
func (a *OCR3OnchainKeyringMultiChainAdapter) getKeyBundleFromInfo(info []byte) (string, ocr2key.KeyBundle, error) {
189218
unmarshalledInfo := new(structpb.Struct)
190219
err := proto.Unmarshal(info, unmarshalledInfo)

core/services/ocrcommon/adapters_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package ocrcommon_test
22

33
import (
4+
"bytes"
45
"context"
56
"fmt"
67
"math"
@@ -170,6 +171,29 @@ func TestNewOCR3OnchainKeyringMultiChainAdapter(t *testing.T) {
170171
require.Error(t, err, "no key bundles provided")
171172
}
172173

174+
func TestOCR3OnchainKeyringMultiChainAdapter_Has(t *testing.T) {
175+
adapter := newMultichainAdapter(t)
176+
177+
require.True(t, adapter.Has(adapter.PublicKey()))
178+
assert.NotEmpty(t, adapter.DebugIdentifier())
179+
180+
keys, err := ocrcommon.UnmarshalMultichainPublicKey(adapter.PublicKey())
181+
require.NoError(t, err)
182+
evmOnly, err := ocrcommon.MarshalMultichainPublicKey(map[string]ocrtypes.OnchainPublicKey{
183+
"evm": keys["evm"],
184+
})
185+
require.NoError(t, err)
186+
require.True(t, adapter.Has(evmOnly))
187+
188+
wrongEVM, err := ocrcommon.MarshalMultichainPublicKey(map[string]ocrtypes.OnchainPublicKey{
189+
"evm": bytes.Repeat([]byte{0xab}, 32),
190+
})
191+
require.NoError(t, err)
192+
require.False(t, adapter.Has(wrongEVM))
193+
194+
require.False(t, adapter.Has(nil))
195+
}
196+
173197
func newMultichainAdapter(t *testing.T) *ocrcommon.OCR3OnchainKeyringMultiChainAdapter {
174198
evmBundle, err := ocr2key.New(corekeys.EVM)
175199
require.NoError(t, err)

deployment/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ require (
6363
github.com/smartcontractkit/chainlink-ton v0.0.0-20260331005855-7b5a4b3384f8
6464
github.com/smartcontractkit/chainlink-ton/deployment v0.0.0-20260326230916-bcfdbe85f221
6565
github.com/smartcontractkit/freeport v0.1.3-0.20250828155247-add56fa28aad
66-
github.com/smartcontractkit/libocr v0.0.0-20260304194147-a03701e2c02e
66+
github.com/smartcontractkit/libocr v0.0.0-20260403184524-b6409238958d
6767
github.com/smartcontractkit/mcms v0.38.2
6868
github.com/smartcontractkit/quarantine v0.0.0-20250909213106-ece491bef618
6969
github.com/smartcontractkit/smdkg v0.0.0-20251029093710-c38905e58aeb

deployment/go.sum

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)