go-ethereum/libevm
Arran Schlosberg eda3b59f67
feat(core/types): fine-grained Body RLP override (#109)
## Why this should be merged

Allows for modification of `types.Body` payload data + RLP encoding
without placing the entire RLP burden on the `libevm` user as we did
with `types.HeaderHooks`.

## How this works

RLP encoding of a struct is simply a concatenation of RLP encodings of
fields, encompassed by an RLP "list". The
`AppendRLPFields(rlp.EncoderBuffer, ...)` hook exploits this and plugs
in before all `rlp:"optional"`-tagged fields to allow for inclusion of
any new fields. The `EncoderBuffer` SHOULD be used as the `io.Writer`
passed when encoding each field: `rlp.Encode(buffer, fieldValue)`.

`Body` doesn't have `{En,De}codeRLP` methods so they are implemented to
identically replicate original behaviour when a no-op hook is present.

This pattern is sufficient for the `ava-labs/coreth` modifications of
`Body` but can be modified / extended for more complex scenarios, like
`Header`.

> [!NOTE]
> This PR does not include registration of the hooks as that was not the
initial goal and adding them would create too much PR bloat. There is a
placeholder `var todoRegisteredBodyHooks` global variable that can only
be set in tests.

## How this was tested

- Backwards compatibility: the new methods are fuzzed against a `type
withoutMethods Body` passed directly to `rlp.{En,De}code()`
- `coreth` compatibility: unit test of a local implementation of
`BodyHooks` demonstrating reproducibility of RLP encoding.

---------

Signed-off-by: Arran Schlosberg <519948+ARR4N@users.noreply.github.com>
Co-authored-by: Quentin McGaw <quentin.mcgaw@avalabs.org>
2025-02-05 10:52:28 +00:00
..
cmd/internalise feat: internalise command (#90) 2024-12-17 17:20:02 +01:00
cmpeth feat(core/types): fine-grained Body RLP override (#109) 2025-02-05 10:52:28 +00:00
ethtest test: lock in types.Header RLP encoding (#87) 2024-12-12 13:00:02 +00:00
hookstest Merge branch 'auto-rename-module_source-2bd6bd01d2e8561dd7fc21b631f4a34ac16627a1_workflow-c1fc594f020d23958b641a4e5a856b6e52c49d3bece94b95594864db16c1b0fc-main' into arr4n/rename-module 2024-10-17 13:07:28 +11:00
legacy refactor: PrecompileEnvironment.{,Use,Refund}Gas() in lieu of args (#73) 2024-12-18 13:54:51 +00:00
options refactor: abstract options package (#74) 2024-11-21 13:59:51 -08:00
pseudo refactor!: consolidate params and types payload access (#84) 2024-12-09 18:32:15 +00:00
register refactor: consolidate once-only registration of extras (#85) 2024-12-09 17:43:59 +00:00
stateconf feat: state.SnapshotTree interface for drop-in replacement (#77) 2024-11-26 17:22:13 +00: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
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 chore: post-rename cleanup + libevm intro (#68) 2024-10-30 09:51:41 -04:00