Skip to content

Conversation

ARR4N
Copy link
Collaborator

@ARR4N ARR4N commented Sep 27, 2025

Why this should be merged

Registration of extras requires runtime enforcement of payload types. In production, only a single set of types can be registered and any attempts at re-registration will panic (by design). Although this makes production usage safe, it doesn't allow downstream consumers (e.g. data indexers) to use extras from different chains (e.g. coreth and subnet-evm) at the same time.

How this works

  1. The libevm/register.AtMostOnce type can now be overridden temporarily.
  2. params, core/types, core/vm, and state packages introduce WithTempRegisteredExtras() functions.
  3. libevm/temporary.WithRegisteredExtras() provides "atomic" override of all extras.

In all cases, the scope of the override is limited to the life of a single function call.

How this was tested

Relative to numbered list above:

  1. Unit test of new and existing functionality.
  2. Integration tests of both packages, demonstrating both payload and behavioural override.

@ARR4N ARR4N self-assigned this Sep 27, 2025
@ARR4N ARR4N force-pushed the arr4n/temporary-extras branch from 23e3053 to 3cf1438 Compare September 27, 2025 19:16
@ARR4N ARR4N requested a review from a team September 29, 2025 09:10
@ARR4N ARR4N marked this pull request as ready for review September 29, 2025 09:10
Copy link

@ceyonur ceyonur left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

overall lgtm, just few questions

@ARR4N ARR4N requested a review from ceyonur October 1, 2025 09:31
Copy link

@ceyonur ceyonur left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm!

@ARR4N ARR4N merged commit 35926db into main Oct 2, 2025
12 checks passed
@ARR4N ARR4N deleted the arr4n/temporary-extras branch October 2, 2025 16:42
ARR4N added a commit that referenced this pull request Oct 16, 2025
## Why this should be merged

The `temporary.WithTempRegisteredExtras()` global lock introduced in
#234 wasn't fit for purpose when used in `coreth` as it required central
coordination of registration, types, and usage of the payload accessor.

## How this works

Instead of a central registration point, the new
`libevm.WithTemporaryExtrasLock()` function takes out a global lock and
provides the caller with a handle that proves the lock is held. All of
the override functions, e.g. `params.WithTempRegisteredExtras()` now
require a current lock, which will be propagated by the respective
`coreth` functions.

See ava-labs/coreth#1328 for intended usage in
`coreth` and `subnet-evm`. A consumer of both of these can then safely
do the following:

```go
import (
    "github.com/ava-labs/libevm/libevm"

    coreth "github.com/ava-labs/coreth/plugin/evm"
    subnet "github.com/ava-labs/subnet-evm/plugin/evm"
)

// asCChain calls `fn` while emulating `coreth`. It is safe for concurrent usage with [asSubnetEVM].
func asCChain(fn func() error) error {
    return libevm.WithTemporaryExtrasLock(func(l libevm.ExtrasLock) error {
        return coreth.WithTempRegisteredLibEVMExtras(l, fn)
    })
}

// asSubnetEVM calls `fn` while emulating `subnet-evm`. It is safe for concurrent usage with [asCChain].
func asSubnetEVM(fn func() error) error {
    return libevm.WithTemporaryExtrasLock(func(l libevm.ExtrasLock) error {
        return subnet.WithTempRegisteredLibEVMExtras(l, fn)
    })
}
```

## How this was tested

Unit test of the new function plus existing integration tests of all
modified code.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants