go-ethereum/libevm
Arran Schlosberg 1bccf4f2dd
refactor!: temporary extras require proof of global lock (#238)
## 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 https://github.com/ava-labs/coreth/pull/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.
2025-10-16 14:27:15 +00:00
..
cmd/internalise feat: internalise command (#90) 2024-12-17 17:20:02 +01:00
ethapi feat: partially expose internal/ethapi package (#182) 2025-05-27 10:29:35 -04:00
ethtest test: lock in types.Header RLP encoding (#87) 2024-12-12 13:00:02 +00:00
hookstest chore: placate goheader (#195) 2025-06-23 15:25:18 +00:00
legacy fix(libevm/legacy): PrecompiledStatefulContract gas and remaining gas handling (#114) 2025-02-07 14:29:33 +01:00
options feat: options.ApplyTo for default values (#225) 2025-09-09 15:11:33 +01:00
pseudo refactor!: consolidate params and types payload access (#84) 2024-12-09 18:32:15 +00:00
reentrancy feat: reentrancy.Guard for stateful precompiles (#212) 2025-10-03 19:56:29 +00:00
register refactor!: temporary extras require proof of global lock (#238) 2025-10-16 14:27:15 +00:00
set chore: logging (#151) 2025-02-24 16:53:21 +00:00
stateconf feat: state-key transformation w/ override (#205) 2025-07-22 13:08:53 -04:00
sync feat(core/state): async trie prefetching (#76) 2024-11-26 08:01:47 -08:00
testonly test: StateAccount.Extra via trie.StateTrie.{Update,Get}Account() (#45) 2024-10-02 09:45:02 -07:00
tooling chore: Go 1.24 (#232) 2025-10-13 14:07:33 -04:00
extraslock.go refactor!: temporary extras require proof of global lock (#238) 2025-10-16 14:27:15 +00:00
extraslock_test.go refactor!: temporary extras require proof of global lock (#238) 2025-10-16 14:27:15 +00:00
interfaces_test.go Merge branch 'auto-rename-module_source-2bd6bd01d2e8561dd7fc21b631f4a34ac16627a1_workflow-c1fc594f020d23958b641a4e5a856b6e52c49d3bece94b95594864db16c1b0fc-main' into arr4n/rename-module 2024-10-17 13:07:28 +11:00
libevm.go feat!: disambiguate EVM-semantic and raw caller/self addresses for precompiles (#211) 2025-08-07 23:48:32 +01:00