From 4c7e5a0efa90aed5d5454b5a68753076eea67f55 Mon Sep 17 00:00:00 2001 From: Dmytro Haidashenko <34754799+dhaidashenko@users.noreply.github.com> Date: Thu, 30 May 2024 04:19:14 +0200 Subject: [PATCH] Added config options to control HeadTracker's support of finality tags (#13336) * Added config options to control HeadTracker's support of finality tags * fixed lint issue * Disabled HeadTracker's finality tag support, if we have not observed finality gaps with finality tag enabled * rename `HeadTracker.FinalityTagSupportDisabled` to `HeadTracker.FinalityTagBypass` --- .changeset/sour-owls-grab.md | 7 + common/headtracker/head_tracker.go | 22 ++- common/headtracker/types/config.go | 2 + .../evm/config/chain_scoped_head_tracker.go | 8 ++ core/chains/evm/config/config.go | 2 + core/chains/evm/config/config_test.go | 2 + core/chains/evm/config/toml/config.go | 23 ++- .../config/toml/defaults/Avalanche_Fuji.toml | 3 + .../evm/config/toml/defaults/BSC_Testnet.toml | 5 + .../toml/defaults/Ethereum_Sepolia.toml | 3 + .../config/toml/defaults/Linea_Sepolia.toml | 2 +- .../config/toml/defaults/WeMix_Testnet.toml | 3 + .../evm/config/toml/defaults/fallback.toml | 2 + .../chains/evm/headtracker/head_saver_test.go | 7 + .../evm/headtracker/head_tracker_test.go | 86 +++++++++-- core/config/docs/chains-evm.toml | 8 ++ core/services/chainlink/config_test.go | 14 +- .../chainlink/testdata/config-full.toml | 2 + .../chainlink/testdata/config-invalid.toml | 1 + .../config-multi-chain-effective.toml | 6 + core/web/resolver/testdata/config-full.toml | 2 + .../config-multi-chain-effective.toml | 6 + docs/CONFIG.md | 136 ++++++++++++++++++ .../disk-based-logging-disabled.txtar | 2 + .../validate/disk-based-logging-no-dir.txtar | 2 + .../node/validate/disk-based-logging.txtar | 2 + testdata/scripts/node/validate/invalid.txtar | 2 + testdata/scripts/node/validate/valid.txtar | 2 + testdata/scripts/node/validate/warnings.txtar | 2 + 29 files changed, 343 insertions(+), 21 deletions(-) create mode 100644 .changeset/sour-owls-grab.md diff --git a/.changeset/sour-owls-grab.md b/.changeset/sour-owls-grab.md new file mode 100644 index 00000000000..a45cd3da66e --- /dev/null +++ b/.changeset/sour-owls-grab.md @@ -0,0 +1,7 @@ +--- +"chainlink": patch +--- + +Added config option `HeadTracker.FinalityTagBypass` to force `HeadTracker` to track blocks up to `FinalityDepth` even if `FinalityTagsEnabled = true`. This option is a temporary measure to address high CPU usage on chains with extremely large actual finality depth (gap between the current head and the latest finalized block). #added + +Added config option `HeadTracker.MaxAllowedFinalityDepth` maximum gap between current head to the latest finalized block that `HeadTracker` considers healthy. #added diff --git a/common/headtracker/head_tracker.go b/common/headtracker/head_tracker.go index 6247e87c673..48c4859a64c 100644 --- a/common/headtracker/head_tracker.go +++ b/common/headtracker/head_tracker.go @@ -119,7 +119,7 @@ func (ht *headTracker[HTH, S, ID, BLOCK_HASH]) Start(ctx context.Context) error if ctx.Err() != nil { return ctx.Err() } - ht.log.Errorw("Error handling initial head", "err", err) + ht.log.Errorw("Error handling initial head", "err", err.Error()) } ht.wgDone.Add(3) @@ -338,9 +338,23 @@ func (ht *headTracker[HTH, S, ID, BLOCK_HASH]) backfillLoop() { // calculateLatestFinalized - returns latest finalized block. It's expected that currentHeadNumber - is the head of // canonical chain. There is no guaranties that returned block belongs to the canonical chain. Additional verification // must be performed before usage. -func (ht *headTracker[HTH, S, ID, BLOCK_HASH]) calculateLatestFinalized(ctx context.Context, currentHead HTH) (h HTH, err error) { - if ht.config.FinalityTagEnabled() { - return ht.client.LatestFinalizedBlock(ctx) +func (ht *headTracker[HTH, S, ID, BLOCK_HASH]) calculateLatestFinalized(ctx context.Context, currentHead HTH) (latestFinalized HTH, err error) { + if ht.config.FinalityTagEnabled() && !ht.htConfig.FinalityTagBypass() { + latestFinalized, err = ht.client.LatestFinalizedBlock(ctx) + if err != nil { + return latestFinalized, fmt.Errorf("failed to get latest finalized block: %w", err) + } + + if !latestFinalized.IsValid() { + return latestFinalized, fmt.Errorf("failed to get valid latest finalized block") + } + + if currentHead.BlockNumber()-latestFinalized.BlockNumber() > int64(ht.htConfig.MaxAllowedFinalityDepth()) { + return latestFinalized, fmt.Errorf("gap between latest finalized block (%d) and current head (%d) is too large (> %d)", + latestFinalized.BlockNumber(), currentHead.BlockNumber(), ht.htConfig.MaxAllowedFinalityDepth()) + } + + return latestFinalized, nil } // no need to make an additional RPC call on chains with instant finality if ht.config.FinalityDepth() == 0 { diff --git a/common/headtracker/types/config.go b/common/headtracker/types/config.go index 019aa9847d9..e0eb422672d 100644 --- a/common/headtracker/types/config.go +++ b/common/headtracker/types/config.go @@ -12,4 +12,6 @@ type HeadTrackerConfig interface { HistoryDepth() uint32 MaxBufferSize() uint32 SamplingInterval() time.Duration + FinalityTagBypass() bool + MaxAllowedFinalityDepth() uint32 } diff --git a/core/chains/evm/config/chain_scoped_head_tracker.go b/core/chains/evm/config/chain_scoped_head_tracker.go index c46f5b72e6c..8bc1ff188a7 100644 --- a/core/chains/evm/config/chain_scoped_head_tracker.go +++ b/core/chains/evm/config/chain_scoped_head_tracker.go @@ -21,3 +21,11 @@ func (h *headTrackerConfig) MaxBufferSize() uint32 { func (h *headTrackerConfig) SamplingInterval() time.Duration { return h.c.SamplingInterval.Duration() } + +func (h *headTrackerConfig) FinalityTagBypass() bool { + return *h.c.FinalityTagBypass +} + +func (h *headTrackerConfig) MaxAllowedFinalityDepth() uint32 { + return *h.c.MaxAllowedFinalityDepth +} diff --git a/core/chains/evm/config/config.go b/core/chains/evm/config/config.go index 18f63b8d918..89e5b6c7d80 100644 --- a/core/chains/evm/config/config.go +++ b/core/chains/evm/config/config.go @@ -71,6 +71,8 @@ type HeadTracker interface { HistoryDepth() uint32 MaxBufferSize() uint32 SamplingInterval() time.Duration + FinalityTagBypass() bool + MaxAllowedFinalityDepth() uint32 } type BalanceMonitor interface { diff --git a/core/chains/evm/config/config_test.go b/core/chains/evm/config/config_test.go index ddf9817958d..69f6ea0875f 100644 --- a/core/chains/evm/config/config_test.go +++ b/core/chains/evm/config/config_test.go @@ -376,6 +376,8 @@ func TestChainScopedConfig_HeadTracker(t *testing.T) { assert.Equal(t, uint32(100), ht.HistoryDepth()) assert.Equal(t, uint32(3), ht.MaxBufferSize()) assert.Equal(t, time.Second, ht.SamplingInterval()) + assert.Equal(t, true, ht.FinalityTagBypass()) + assert.Equal(t, uint32(10000), ht.MaxAllowedFinalityDepth()) } func Test_chainScopedConfig_Validate(t *testing.T) { diff --git a/core/chains/evm/config/toml/config.go b/core/chains/evm/config/toml/config.go index a22f6e7f557..265557ae9b1 100644 --- a/core/chains/evm/config/toml/config.go +++ b/core/chains/evm/config/toml/config.go @@ -740,9 +740,11 @@ func (e *KeySpecificGasEstimator) setFrom(f *KeySpecificGasEstimator) { } type HeadTracker struct { - HistoryDepth *uint32 - MaxBufferSize *uint32 - SamplingInterval *commonconfig.Duration + HistoryDepth *uint32 + MaxBufferSize *uint32 + SamplingInterval *commonconfig.Duration + MaxAllowedFinalityDepth *uint32 + FinalityTagBypass *bool } func (t *HeadTracker) setFrom(f *HeadTracker) { @@ -755,6 +757,21 @@ func (t *HeadTracker) setFrom(f *HeadTracker) { if v := f.SamplingInterval; v != nil { t.SamplingInterval = v } + if v := f.MaxAllowedFinalityDepth; v != nil { + t.MaxAllowedFinalityDepth = v + } + if v := f.FinalityTagBypass; v != nil { + t.FinalityTagBypass = v + } +} + +func (t *HeadTracker) ValidateConfig() (err error) { + if *t.MaxAllowedFinalityDepth < 1 { + err = multierr.Append(err, commonconfig.ErrInvalid{Name: "MaxAllowedFinalityDepth", Value: *t.MaxAllowedFinalityDepth, + Msg: "must be greater than or equal to 1"}) + } + + return } type ClientErrors struct { diff --git a/core/chains/evm/config/toml/defaults/Avalanche_Fuji.toml b/core/chains/evm/config/toml/defaults/Avalanche_Fuji.toml index 25e884d02b3..37d2a9d0777 100644 --- a/core/chains/evm/config/toml/defaults/Avalanche_Fuji.toml +++ b/core/chains/evm/config/toml/defaults/Avalanche_Fuji.toml @@ -14,3 +14,6 @@ PriceMin = '25 gwei' [GasEstimator.BlockHistory] BlockHistorySize = 24 + +[HeadTracker] +FinalityTagBypass = false \ No newline at end of file diff --git a/core/chains/evm/config/toml/defaults/BSC_Testnet.toml b/core/chains/evm/config/toml/defaults/BSC_Testnet.toml index 424669193b5..364bae0c9f1 100644 --- a/core/chains/evm/config/toml/defaults/BSC_Testnet.toml +++ b/core/chains/evm/config/toml/defaults/BSC_Testnet.toml @@ -15,6 +15,11 @@ BumpThreshold = 5 [GasEstimator.BlockHistory] BlockHistorySize = 24 +[HeadTracker] +HistoryDepth = 100 +SamplingInterval = '1s' +FinalityTagBypass = false + [OCR] DatabaseTimeout = '2s' ContractTransmitterTransmitTimeout = '2s' diff --git a/core/chains/evm/config/toml/defaults/Ethereum_Sepolia.toml b/core/chains/evm/config/toml/defaults/Ethereum_Sepolia.toml index 7729b57b030..1c46d4ca7cf 100644 --- a/core/chains/evm/config/toml/defaults/Ethereum_Sepolia.toml +++ b/core/chains/evm/config/toml/defaults/Ethereum_Sepolia.toml @@ -11,3 +11,6 @@ TransactionPercentile = 50 [OCR2.Automation] GasLimit = 10500000 + +[HeadTracker] +FinalityTagBypass = false diff --git a/core/chains/evm/config/toml/defaults/Linea_Sepolia.toml b/core/chains/evm/config/toml/defaults/Linea_Sepolia.toml index 11a70bbf072..ac5e18a09b6 100644 --- a/core/chains/evm/config/toml/defaults/Linea_Sepolia.toml +++ b/core/chains/evm/config/toml/defaults/Linea_Sepolia.toml @@ -10,4 +10,4 @@ PriceMin = '1 wei' ResendAfterThreshold = '3m' [HeadTracker] -HistoryDepth = 1000 +HistoryDepth = 1000 \ No newline at end of file diff --git a/core/chains/evm/config/toml/defaults/WeMix_Testnet.toml b/core/chains/evm/config/toml/defaults/WeMix_Testnet.toml index 6cdb451eb1d..c089668f8ba 100644 --- a/core/chains/evm/config/toml/defaults/WeMix_Testnet.toml +++ b/core/chains/evm/config/toml/defaults/WeMix_Testnet.toml @@ -12,3 +12,6 @@ ContractConfirmations = 1 [GasEstimator] EIP1559DynamicFees = true TipCapDefault = '100 gwei' + +[HeadTracker] +FinalityTagBypass = false diff --git a/core/chains/evm/config/toml/defaults/fallback.toml b/core/chains/evm/config/toml/defaults/fallback.toml index 9d4ddf7bf0a..5a16aca091c 100644 --- a/core/chains/evm/config/toml/defaults/fallback.toml +++ b/core/chains/evm/config/toml/defaults/fallback.toml @@ -57,6 +57,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +FinalityTagBypass = true +MaxAllowedFinalityDepth = 10000 [NodePool] PollFailureThreshold = 5 diff --git a/core/chains/evm/headtracker/head_saver_test.go b/core/chains/evm/headtracker/head_saver_test.go index 78058efa560..7f10cad2080 100644 --- a/core/chains/evm/headtracker/head_saver_test.go +++ b/core/chains/evm/headtracker/head_saver_test.go @@ -36,6 +36,13 @@ func (h *headTrackerConfig) MaxBufferSize() uint32 { return uint32(0) } +func (h *headTrackerConfig) FinalityTagBypass() bool { + return false +} +func (h *headTrackerConfig) MaxAllowedFinalityDepth() uint32 { + return 10000 +} + type config struct { finalityDepth uint32 blockEmissionIdleWarningThreshold time.Duration diff --git a/core/chains/evm/headtracker/head_tracker_test.go b/core/chains/evm/headtracker/head_tracker_test.go index bf2b984b548..b0d9a50da5e 100644 --- a/core/chains/evm/headtracker/head_tracker_test.go +++ b/core/chains/evm/headtracker/head_tracker_test.go @@ -205,11 +205,27 @@ func TestHeadTracker_Start(t *testing.T) { t.Parallel() const historyDepth = 100 - newHeadTracker := func(t *testing.T) *headTrackerUniverse { + const finalityDepth = 50 + type opts struct { + FinalityTagEnable *bool + MaxAllowedFinalityDepth *uint32 + FinalityTagBypass *bool + } + newHeadTracker := func(t *testing.T, opts opts) *headTrackerUniverse { db := pgtest.NewSqlxDB(t) gCfg := configtest.NewGeneralConfig(t, func(c *chainlink.Config, _ *chainlink.Secrets) { - c.EVM[0].FinalityTagEnabled = ptr[bool](true) + if opts.FinalityTagEnable != nil { + c.EVM[0].FinalityTagEnabled = opts.FinalityTagEnable + } c.EVM[0].HeadTracker.HistoryDepth = ptr[uint32](historyDepth) + c.EVM[0].FinalityDepth = ptr[uint32](finalityDepth) + if opts.MaxAllowedFinalityDepth != nil { + c.EVM[0].HeadTracker.MaxAllowedFinalityDepth = opts.MaxAllowedFinalityDepth + } + + if opts.FinalityTagBypass != nil { + c.EVM[0].HeadTracker.FinalityTagBypass = opts.FinalityTagBypass + } }) config := evmtest.NewChainScopedConfig(t, gCfg) orm := headtracker.NewORM(cltest.FixtureChainID, db) @@ -219,7 +235,7 @@ func TestHeadTracker_Start(t *testing.T) { t.Run("Fail start if context was canceled", func(t *testing.T) { ctx, cancel := context.WithCancel(testutils.Context(t)) - ht := newHeadTracker(t) + ht := newHeadTracker(t, opts{}) ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Run(func(args mock.Arguments) { cancel() }).Return(cltest.Head(0), context.Canceled) @@ -227,19 +243,19 @@ func TestHeadTracker_Start(t *testing.T) { require.ErrorIs(t, err, context.Canceled) }) t.Run("Starts even if failed to get initialHead", func(t *testing.T) { - ht := newHeadTracker(t) + ht := newHeadTracker(t, opts{}) ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(cltest.Head(0), errors.New("failed to get init head")) ht.Start(t) tests.AssertLogEventually(t, ht.observer, "Error handling initial head") }) t.Run("Starts even if received invalid head", func(t *testing.T) { - ht := newHeadTracker(t) + ht := newHeadTracker(t, opts{}) ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(nil, nil) ht.Start(t) tests.AssertLogEventually(t, ht.observer, "Got nil initial head") }) t.Run("Starts even if fails to get finalizedHead", func(t *testing.T) { - ht := newHeadTracker(t) + ht := newHeadTracker(t, opts{FinalityTagEnable: ptr(true), FinalityTagBypass: ptr(false)}) head := cltest.Head(1000) ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once() ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(nil, errors.New("failed to load latest finalized")).Once() @@ -247,16 +263,31 @@ func TestHeadTracker_Start(t *testing.T) { tests.AssertLogEventually(t, ht.observer, "Error handling initial head") }) t.Run("Starts even if latest finalizedHead is nil", func(t *testing.T) { - ht := newHeadTracker(t) + ht := newHeadTracker(t, opts{FinalityTagEnable: ptr(true), FinalityTagBypass: ptr(false)}) head := cltest.Head(1000) ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once() ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(nil, nil).Once() + ht.ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything).Return(nil, errors.New("failed to connect")).Maybe() ht.Start(t) tests.AssertLogEventually(t, ht.observer, "Error handling initial head") }) - t.Run("Happy path", func(t *testing.T) { + t.Run("Logs error if finality gap is too big", func(t *testing.T) { + ht := newHeadTracker(t, opts{FinalityTagEnable: ptr(true), FinalityTagBypass: ptr(false), MaxAllowedFinalityDepth: ptr(uint32(10))}) + head := cltest.Head(1000) + ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once() + ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(cltest.Head(989), nil).Once() + ht.ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything).Return(nil, errors.New("failed to connect")).Maybe() + ht.Start(t) + tests.AssertEventually(t, func() bool { + // must exactly match the error passed to logger + field := zap.String("err", "failed to calculate latest finalized head: gap between latest finalized block (989) and current head (1000) is too large (> 10)") + filtered := ht.observer.FilterMessage("Error handling initial head").FilterField(field) + return filtered.Len() > 0 + }) + }) + t.Run("Happy path (finality tag)", func(t *testing.T) { head := cltest.Head(1000) - ht := newHeadTracker(t) + ht := newHeadTracker(t, opts{FinalityTagEnable: ptr(true), FinalityTagBypass: ptr(false)}) ctx := testutils.Context(t) require.NoError(t, ht.orm.IdempotentInsertHead(ctx, cltest.Head(799))) ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once() @@ -265,9 +296,46 @@ func TestHeadTracker_Start(t *testing.T) { ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(finalizedHead, nil).Once() // on backfill ht.ethClient.On("LatestFinalizedBlock", mock.Anything).Return(nil, errors.New("backfill call to finalized failed")).Maybe() + ht.ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything).Return(nil, errors.New("failed to connect")).Maybe() ht.Start(t) tests.AssertLogEventually(t, ht.observer, "Loaded chain from DB") }) + happyPathFD := func(t *testing.T, opts opts) { + head := cltest.Head(1000) + ht := newHeadTracker(t, opts) + ht.ethClient.On("HeadByNumber", mock.Anything, (*big.Int)(nil)).Return(head, nil).Once() + finalizedHead := cltest.Head(head.Number - finalityDepth) + ht.ethClient.On("HeadByNumber", mock.Anything, big.NewInt(finalizedHead.Number)).Return(finalizedHead, nil).Once() + ctx := testutils.Context(t) + require.NoError(t, ht.orm.IdempotentInsertHead(ctx, cltest.Head(finalizedHead.Number-1))) + // on backfill + ht.ethClient.On("HeadByNumber", mock.Anything, mock.Anything).Return(nil, errors.New("backfill call to finalized failed")).Maybe() + ht.ethClient.On("SubscribeNewHead", mock.Anything, mock.Anything).Return(nil, errors.New("failed to connect")).Maybe() + ht.Start(t) + tests.AssertLogEventually(t, ht.observer, "Loaded chain from DB") + } + testCases := []struct { + Name string + Opts opts + }{ + { + Name: "Happy path (Chain FT is disabled & HeadTracker's FT is disabled)", + Opts: opts{FinalityTagEnable: ptr(false), FinalityTagBypass: ptr(true)}, + }, + { + Name: "Happy path (Chain FT is disabled & HeadTracker's FT is enabled, but ignored)", + Opts: opts{FinalityTagEnable: ptr(false), FinalityTagBypass: ptr(false)}, + }, + { + Name: "Happy path (Chain FT is enabled & HeadTracker's FT is disabled)", + Opts: opts{FinalityTagEnable: ptr(true), FinalityTagBypass: ptr(true)}, + }, + } + for _, tc := range testCases { + t.Run(tc.Name, func(t *testing.T) { + happyPathFD(t, tc.Opts) + }) + } } func TestHeadTracker_CallsHeadTrackableCallbacks(t *testing.T) { diff --git a/core/config/docs/chains-evm.toml b/core/config/docs/chains-evm.toml index a4cf1ad7411..209929b2e8b 100644 --- a/core/config/docs/chains-evm.toml +++ b/core/config/docs/chains-evm.toml @@ -311,6 +311,14 @@ MaxBufferSize = 3 # Default # **ADVANCED** # SamplingInterval means that head tracker callbacks will at maximum be made once in every window of this duration. This is a performance optimisation for fast chains. Set to 0 to disable sampling entirely. SamplingInterval = '1s' # Default +# FinalityTagBypass disables FinalityTag support in HeadTracker and makes it track blocks up to FinalityDepth from the most recent head. +# It should only be used on chains with an extremely large actual finality depth (the number of blocks between the most recent head and the latest finalized block). +# Has no effect if `FinalityTagsEnabled` = false +FinalityTagBypass = true # Default +# MaxAllowedFinalityDepth - defines maximum number of blocks between the most recent head and the latest finalized block. +# If actual finality depth exceeds this number, HeadTracker aborts backfill and returns an error. +# Has no effect if `FinalityTagsEnabled` = false +MaxAllowedFinalityDepth = 10000 # Default [[EVM.KeySpecific]] # Key is the account to apply these settings to diff --git a/core/services/chainlink/config_test.go b/core/services/chainlink/config_test.go index 2aa1d26c326..e02435a946b 100644 --- a/core/services/chainlink/config_test.go +++ b/core/services/chainlink/config_test.go @@ -24,6 +24,7 @@ import ( coscfg "github.com/smartcontractkit/chainlink-cosmos/pkg/cosmos/config" solcfg "github.com/smartcontractkit/chainlink-solana/pkg/solana/config" stkcfg "github.com/smartcontractkit/chainlink-starknet/relayer/pkg/chainlink/config" + commonconfig "github.com/smartcontractkit/chainlink/v2/common/config" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets" @@ -572,9 +573,11 @@ func TestConfig_Marshal(t *testing.T) { }, HeadTracker: evmcfg.HeadTracker{ - HistoryDepth: ptr[uint32](15), - MaxBufferSize: ptr[uint32](17), - SamplingInterval: &hour, + HistoryDepth: ptr[uint32](15), + MaxBufferSize: ptr[uint32](17), + SamplingInterval: &hour, + FinalityTagBypass: ptr[bool](false), + MaxAllowedFinalityDepth: ptr[uint32](1500), }, NodePool: evmcfg.NodePool{ @@ -1034,6 +1037,8 @@ TransactionPercentile = 15 HistoryDepth = 15 MaxBufferSize = 17 SamplingInterval = '1h0m0s' +MaxAllowedFinalityDepth = 1500 +FinalityTagBypass = false [[EVM.KeySpecific]] Key = '0x2a3e23c6f242F5345320814aC8a1b4E58707D292' @@ -1275,7 +1280,7 @@ func TestConfig_Validate(t *testing.T) { - WSURL: missing: required for primary nodes - HTTPURL: missing: required for all nodes - 1.HTTPURL: missing: required for all nodes - - 1: 9 errors: + - 1: 10 errors: - ChainType: invalid value (Foo): must not be set with this chain id - Nodes: missing: must have at least one node - ChainType: invalid value (Foo): must be one of arbitrum, celo, gnosis, kroma, metis, optimismBedrock, scroll, wemix, xlayer, zkevm, zksync or omitted @@ -1286,6 +1291,7 @@ func TestConfig_Validate(t *testing.T) { - GasEstimator: 2 errors: - FeeCapDefault: invalid value (101 wei): must be equal to PriceMax (99 wei) since you are using FixedPrice estimation with gas bumping disabled in EIP1559 mode - PriceMax will be used as the FeeCap for transactions instead of FeeCapDefault - PriceMax: invalid value (1 gwei): must be greater than or equal to PriceDefault + - HeadTracker.MaxAllowedFinalityDepth: invalid value (0): must be greater than or equal to 1 - KeySpecific.Key: invalid value (0xde709f2102306220921060314715629080e2fb77): duplicate - must be unique - 2: 5 errors: - ChainType: invalid value (Arbitrum): only "optimismBedrock" can be used with this chain id diff --git a/core/services/chainlink/testdata/config-full.toml b/core/services/chainlink/testdata/config-full.toml index 356a6d69930..4e61353543e 100644 --- a/core/services/chainlink/testdata/config-full.toml +++ b/core/services/chainlink/testdata/config-full.toml @@ -335,6 +335,8 @@ TransactionPercentile = 15 HistoryDepth = 15 MaxBufferSize = 17 SamplingInterval = '1h0m0s' +MaxAllowedFinalityDepth = 1500 +FinalityTagBypass = false [[EVM.KeySpecific]] Key = '0x2a3e23c6f242F5345320814aC8a1b4E58707D292' diff --git a/core/services/chainlink/testdata/config-invalid.toml b/core/services/chainlink/testdata/config-invalid.toml index b53f4b1712d..68feeeb0451 100644 --- a/core/services/chainlink/testdata/config-invalid.toml +++ b/core/services/chainlink/testdata/config-invalid.toml @@ -66,6 +66,7 @@ PriceMax = 99 [EVM.HeadTracker] HistoryDepth = 30 +MaxAllowedFinalityDepth = 0 [[EVM.KeySpecific]] Key = '0xde709f2102306220921060314715629080e2fb77' diff --git a/core/services/chainlink/testdata/config-multi-chain-effective.toml b/core/services/chainlink/testdata/config-multi-chain-effective.toml index 25d62801455..9cf4d4a5d43 100644 --- a/core/services/chainlink/testdata/config-multi-chain-effective.toml +++ b/core/services/chainlink/testdata/config-multi-chain-effective.toml @@ -312,6 +312,8 @@ TransactionPercentile = 50 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [EVM.NodePool] PollFailureThreshold = 5 @@ -406,6 +408,8 @@ TransactionPercentile = 50 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [EVM.NodePool] PollFailureThreshold = 5 @@ -494,6 +498,8 @@ TransactionPercentile = 60 HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [EVM.NodePool] PollFailureThreshold = 5 diff --git a/core/web/resolver/testdata/config-full.toml b/core/web/resolver/testdata/config-full.toml index 2b6d728df95..ea8c16d8741 100644 --- a/core/web/resolver/testdata/config-full.toml +++ b/core/web/resolver/testdata/config-full.toml @@ -334,6 +334,8 @@ TransactionPercentile = 15 HistoryDepth = 15 MaxBufferSize = 17 SamplingInterval = '1h0m0s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [[EVM.KeySpecific]] Key = '0x2a3e23c6f242F5345320814aC8a1b4E58707D292' diff --git a/core/web/resolver/testdata/config-multi-chain-effective.toml b/core/web/resolver/testdata/config-multi-chain-effective.toml index 25d62801455..9cf4d4a5d43 100644 --- a/core/web/resolver/testdata/config-multi-chain-effective.toml +++ b/core/web/resolver/testdata/config-multi-chain-effective.toml @@ -312,6 +312,8 @@ TransactionPercentile = 50 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [EVM.NodePool] PollFailureThreshold = 5 @@ -406,6 +408,8 @@ TransactionPercentile = 50 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [EVM.NodePool] PollFailureThreshold = 5 @@ -494,6 +498,8 @@ TransactionPercentile = 60 HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [EVM.NodePool] PollFailureThreshold = 5 diff --git a/docs/CONFIG.md b/docs/CONFIG.md index c7b34dea7f2..caa911fc00a 100644 --- a/docs/CONFIG.md +++ b/docs/CONFIG.md @@ -1792,6 +1792,8 @@ TransactionPercentile = 50 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -1880,6 +1882,8 @@ TransactionPercentile = 50 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -1968,6 +1972,8 @@ TransactionPercentile = 50 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -2056,6 +2062,8 @@ TransactionPercentile = 50 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -2145,6 +2153,8 @@ TransactionPercentile = 60 HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -2233,6 +2243,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -2321,6 +2333,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -2410,6 +2424,8 @@ TransactionPercentile = 50 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -2498,6 +2514,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -2585,6 +2603,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -2672,6 +2692,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -2760,6 +2782,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = false [NodePool] PollFailureThreshold = 5 @@ -2849,6 +2873,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -2937,6 +2963,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -3025,6 +3053,8 @@ TransactionPercentile = 60 HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -3113,6 +3143,8 @@ TransactionPercentile = 60 HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -3201,6 +3233,8 @@ TransactionPercentile = 60 HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -3289,6 +3323,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -3377,6 +3413,8 @@ TransactionPercentile = 60 HistoryDepth = 400 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -3465,6 +3503,8 @@ TransactionPercentile = 60 HistoryDepth = 5 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -3553,6 +3593,8 @@ TransactionPercentile = 60 HistoryDepth = 5 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -3641,6 +3683,8 @@ TransactionPercentile = 60 HistoryDepth = 5 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -3730,6 +3774,8 @@ TransactionPercentile = 60 HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -3818,6 +3864,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -3905,6 +3953,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -3993,6 +4043,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -4081,6 +4133,8 @@ TransactionPercentile = 60 HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -4169,6 +4223,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -4257,6 +4313,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = false [NodePool] PollFailureThreshold = 5 @@ -4344,6 +4402,8 @@ TransactionPercentile = 60 HistoryDepth = 10 MaxBufferSize = 100 SamplingInterval = '0s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -4432,6 +4492,8 @@ TransactionPercentile = 60 HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -4520,6 +4582,8 @@ TransactionPercentile = 60 HistoryDepth = 400 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -4608,6 +4672,8 @@ TransactionPercentile = 60 HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -4696,6 +4762,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -4783,6 +4851,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -4871,6 +4941,8 @@ TransactionPercentile = 60 HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -4959,6 +5031,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -5048,6 +5122,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -5136,6 +5212,8 @@ TransactionPercentile = 60 HistoryDepth = 50 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -5224,6 +5302,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = false [NodePool] PollFailureThreshold = 5 @@ -5312,6 +5392,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -5400,6 +5482,8 @@ TransactionPercentile = 60 HistoryDepth = 50 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -5487,6 +5571,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -5574,6 +5660,8 @@ TransactionPercentile = 60 HistoryDepth = 1000 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -5661,6 +5749,8 @@ TransactionPercentile = 60 HistoryDepth = 350 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -5749,6 +5839,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -5837,6 +5929,8 @@ TransactionPercentile = 60 HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -5924,6 +6018,8 @@ TransactionPercentile = 60 HistoryDepth = 2000 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -6012,6 +6108,8 @@ TransactionPercentile = 60 HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -6100,6 +6198,8 @@ TransactionPercentile = 60 HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -6189,6 +6289,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -6278,6 +6380,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -6366,6 +6470,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -6454,6 +6560,8 @@ TransactionPercentile = 60 HistoryDepth = 50 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -6542,6 +6650,8 @@ TransactionPercentile = 60 HistoryDepth = 50 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -6630,6 +6740,8 @@ TransactionPercentile = 50 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = false [NodePool] PollFailureThreshold = 5 @@ -6718,6 +6830,8 @@ TransactionPercentile = 60 HistoryDepth = 300 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -6806,6 +6920,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -6894,6 +7010,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [NodePool] PollFailureThreshold = 5 @@ -7522,6 +7640,8 @@ Setting it lower will tend to set lower gas prices. HistoryDepth = 100 # Default MaxBufferSize = 3 # Default SamplingInterval = '1s' # Default +FinalityTagBypass = true # Default +MaxAllowedFinalityDepth = 10000 # Default ``` The head tracker continually listens for new heads from the chain. @@ -7552,6 +7672,22 @@ SamplingInterval = '1s' # Default ``` SamplingInterval means that head tracker callbacks will at maximum be made once in every window of this duration. This is a performance optimisation for fast chains. Set to 0 to disable sampling entirely. +### FinalityTagBypass +```toml +FinalityTagBypass = true # Default +``` +FinalityTagBypass disables FinalityTag support in HeadTracker and makes it track blocks up to FinalityDepth from the most recent head. +It should only be used on chains with an extremely large actual finality depth (the number of blocks between the most recent head and the latest finalized block). +Has no effect if `FinalityTagsEnabled` = false + +### MaxAllowedFinalityDepth +```toml +MaxAllowedFinalityDepth = 10000 # Default +``` +MaxAllowedFinalityDepth - defines maximum number of blocks between the most recent head and the latest finalized block. +If actual finality depth exceeds this number, HeadTracker aborts backfill and returns an error. +Has no effect if `FinalityTagsEnabled` = false + ## EVM.KeySpecific ```toml [[EVM.KeySpecific]] diff --git a/testdata/scripts/node/validate/disk-based-logging-disabled.txtar b/testdata/scripts/node/validate/disk-based-logging-disabled.txtar index 95366d92f54..39cc989ac21 100644 --- a/testdata/scripts/node/validate/disk-based-logging-disabled.txtar +++ b/testdata/scripts/node/validate/disk-based-logging-disabled.txtar @@ -368,6 +368,8 @@ TransactionPercentile = 50 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [EVM.NodePool] PollFailureThreshold = 5 diff --git a/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar b/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar index 02b3eaba50d..3fa24f63e36 100644 --- a/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar +++ b/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar @@ -368,6 +368,8 @@ TransactionPercentile = 50 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [EVM.NodePool] PollFailureThreshold = 5 diff --git a/testdata/scripts/node/validate/disk-based-logging.txtar b/testdata/scripts/node/validate/disk-based-logging.txtar index d83e54018b5..f80245bb5a5 100644 --- a/testdata/scripts/node/validate/disk-based-logging.txtar +++ b/testdata/scripts/node/validate/disk-based-logging.txtar @@ -368,6 +368,8 @@ TransactionPercentile = 50 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [EVM.NodePool] PollFailureThreshold = 5 diff --git a/testdata/scripts/node/validate/invalid.txtar b/testdata/scripts/node/validate/invalid.txtar index 065be4222de..5d9d51f8727 100644 --- a/testdata/scripts/node/validate/invalid.txtar +++ b/testdata/scripts/node/validate/invalid.txtar @@ -358,6 +358,8 @@ TransactionPercentile = 50 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [EVM.NodePool] PollFailureThreshold = 5 diff --git a/testdata/scripts/node/validate/valid.txtar b/testdata/scripts/node/validate/valid.txtar index 8730cb4b0d5..c7510232e59 100644 --- a/testdata/scripts/node/validate/valid.txtar +++ b/testdata/scripts/node/validate/valid.txtar @@ -365,6 +365,8 @@ TransactionPercentile = 50 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [EVM.NodePool] PollFailureThreshold = 5 diff --git a/testdata/scripts/node/validate/warnings.txtar b/testdata/scripts/node/validate/warnings.txtar index 7d45a97cc40..3a8f97fb64b 100644 --- a/testdata/scripts/node/validate/warnings.txtar +++ b/testdata/scripts/node/validate/warnings.txtar @@ -364,6 +364,8 @@ TransactionPercentile = 60 HistoryDepth = 100 MaxBufferSize = 3 SamplingInterval = '1s' +MaxAllowedFinalityDepth = 10000 +FinalityTagBypass = true [EVM.NodePool] PollFailureThreshold = 5