From a37f85c22782aa7774f9f6f62efdfc6dae3b6f61 Mon Sep 17 00:00:00 2001 From: Quentin Mc Gaw Date: Thu, 13 Feb 2025 10:19:24 +0100 Subject: [PATCH 1/5] Move hooksFrom functions --- core/types/block.libevm.go | 8 -------- core/types/rlp_payload.libevm.go | 3 +++ 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/core/types/block.libevm.go b/core/types/block.libevm.go index a02abbdb423..8879d3ec090 100644 --- a/core/types/block.libevm.go +++ b/core/types/block.libevm.go @@ -44,10 +44,6 @@ func (h *Header) hooks() HeaderHooks { return new(NOOPHeaderHooks) } -func (e ExtraPayloads[HPtr, BPtr, SA]) hooksFromHeader(h *Header) HeaderHooks { - return e.Header.Get(h) -} - var _ interface { rlp.Encoder rlp.Decoder @@ -164,10 +160,6 @@ func (NOOPBodyHooks) RLPFieldPointersForDecoding(b *Body) *rlp.Fields { } } -func (e ExtraPayloads[HPtr, BPtr, SA]) hooksFromBody(b *Body) BodyHooks { - return e.Body.Get(b) -} - func (b *Body) extraPayload() *pseudo.Type { r := registeredExtras if !r.Registered() { diff --git a/core/types/rlp_payload.libevm.go b/core/types/rlp_payload.libevm.go index db9863908c8..90715bc57b8 100644 --- a/core/types/rlp_payload.libevm.go +++ b/core/types/rlp_payload.libevm.go @@ -125,6 +125,9 @@ type ExtraPayloads[HPtr HeaderHooks, BPtr BodyHooks, SA any] struct { StateAccount pseudo.Accessor[StateOrSlimAccount, SA] // Also provides [SlimAccount] access. } +func (e ExtraPayloads[HPtr, BPtr, SA]) hooksFromHeader(h *Header) HeaderHooks { return e.Header.Get(h) } +func (e ExtraPayloads[HPtr, BPtr, SA]) hooksFromBody(b *Body) BodyHooks { return e.Body.Get(b) } + func (ExtraPayloads[HPtr, BPtr, SA]) cloneStateAccount(s *StateAccountExtra) *StateAccountExtra { v := pseudo.MustNewValue[SA](s.t) return &StateAccountExtra{ From bd63e3e4f092e3bfb6371a89b28660961d2c1eef Mon Sep 17 00:00:00 2001 From: Quentin Mc Gaw Date: Thu, 13 Feb 2025 10:21:49 +0100 Subject: [PATCH 2/5] Move hooks() functions --- core/types/block.libevm.go | 16 ---------------- core/types/rlp_payload.libevm.go | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/core/types/block.libevm.go b/core/types/block.libevm.go index 8879d3ec090..86ce92f2299 100644 --- a/core/types/block.libevm.go +++ b/core/types/block.libevm.go @@ -35,15 +35,6 @@ type HeaderHooks interface { PostCopy(dst *Header) } -// hooks returns the Header's registered HeaderHooks, if any, otherwise a -// [NOOPHeaderHooks] suitable for running default behaviour. -func (h *Header) hooks() HeaderHooks { - if r := registeredExtras; r.Registered() { - return r.Get().hooks.hooksFromHeader(h) - } - return new(NOOPHeaderHooks) -} - var _ interface { rlp.Encoder rlp.Decoder @@ -129,13 +120,6 @@ type BodyHooks interface { RLPFieldPointersForDecoding(*Body) *rlp.Fields } -func (b *Body) hooks() BodyHooks { - if r := registeredExtras; r.Registered() { - return r.Get().hooks.hooksFromBody(b) - } - return NOOPBodyHooks{} -} - // NOOPBodyHooks implements [BodyHooks] such that they are equivalent to no type // having been registered. type NOOPBodyHooks struct{} diff --git a/core/types/rlp_payload.libevm.go b/core/types/rlp_payload.libevm.go index 90715bc57b8..589b8bcdab9 100644 --- a/core/types/rlp_payload.libevm.go +++ b/core/types/rlp_payload.libevm.go @@ -107,6 +107,24 @@ type extraConstructors struct { } } +// hooks returns the [Header]'s registered [HeaderHooks], if any, otherwise a +// [NOOPHeaderHooks] suitable for running default behaviour. +func (h *Header) hooks() HeaderHooks { + if r := registeredExtras; r.Registered() { + return r.Get().hooks.hooksFromHeader(h) + } + return new(NOOPHeaderHooks) +} + +// hooks returns the [Body]'s registered [BodyHooks], if any, otherwise a +// [NOOPBodyHooks] suitable for running default behaviour. +func (b *Body) hooks() BodyHooks { + if r := registeredExtras; r.Registered() { + return r.Get().hooks.hooksFromBody(b) + } + return NOOPBodyHooks{} +} + func (e *StateAccountExtra) clone() *StateAccountExtra { switch r := registeredExtras; { case !r.Registered(), e == nil: From 2e73933d56cfb8159818d8d3620ab6ecc4b72a6a Mon Sep 17 00:00:00 2001 From: Quentin Mc Gaw Date: Thu, 13 Feb 2025 10:23:13 +0100 Subject: [PATCH 3/5] Move extraPayload() functions --- core/types/block.libevm.go | 26 -------------------------- core/types/rlp_payload.libevm.go | 24 ++++++++++++++++++++++++ 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/core/types/block.libevm.go b/core/types/block.libevm.go index 86ce92f2299..747b34b576a 100644 --- a/core/types/block.libevm.go +++ b/core/types/block.libevm.go @@ -18,10 +18,8 @@ package types import ( "encoding/json" - "fmt" "io" - "github.com/ava-labs/libevm/libevm/pseudo" "github.com/ava-labs/libevm/rlp" ) @@ -62,18 +60,6 @@ func (h *Header) DecodeRLP(s *rlp.Stream) error { return h.hooks().DecodeRLP(h, s) } -func (h *Header) extraPayload() *pseudo.Type { - r := registeredExtras - if !r.Registered() { - // See params.ChainConfig.extraPayload() for panic rationale. - panic(fmt.Sprintf("%T.extraPayload() called before RegisterExtras()", r)) - } - if h.extra == nil { - h.extra = r.Get().newHeader() - } - return h.extra -} - // NOOPHeaderHooks implements [HeaderHooks] such that they are equivalent to // no type having been registered. type NOOPHeaderHooks struct{} @@ -143,15 +129,3 @@ func (NOOPBodyHooks) RLPFieldPointersForDecoding(b *Body) *rlp.Fields { Optional: []any{&b.Withdrawals}, } } - -func (b *Body) extraPayload() *pseudo.Type { - r := registeredExtras - if !r.Registered() { - // See params.ChainConfig.extraPayload() for panic rationale. - panic(fmt.Sprintf("%T.extraPayload() called before RegisterExtras()", r)) - } - if b.extra == nil { - b.extra = r.Get().newBody() - } - return b.extra -} diff --git a/core/types/rlp_payload.libevm.go b/core/types/rlp_payload.libevm.go index 589b8bcdab9..e0aacada985 100644 --- a/core/types/rlp_payload.libevm.go +++ b/core/types/rlp_payload.libevm.go @@ -107,6 +107,30 @@ type extraConstructors struct { } } +func (h *Header) extraPayload() *pseudo.Type { + r := registeredExtras + if !r.Registered() { + // See params.ChainConfig.extraPayload() for panic rationale. + panic(fmt.Sprintf("%T.extraPayload() called before RegisterExtras()", r)) + } + if h.extra == nil { + h.extra = r.Get().newHeader() + } + return h.extra +} + +func (b *Body) extraPayload() *pseudo.Type { + r := registeredExtras + if !r.Registered() { + // See params.ChainConfig.extraPayload() for panic rationale. + panic(fmt.Sprintf("%T.extraPayload() called before RegisterExtras()", r)) + } + if b.extra == nil { + b.extra = r.Get().newBody() + } + return b.extra +} + // hooks returns the [Header]'s registered [HeaderHooks], if any, otherwise a // [NOOPHeaderHooks] suitable for running default behaviour. func (h *Header) hooks() HeaderHooks { From 3add47b39f97c85d439783c9cfd45e596a69dc40 Mon Sep 17 00:00:00 2001 From: Quentin Mc Gaw Date: Thu, 13 Feb 2025 10:27:28 +0100 Subject: [PATCH 4/5] Shared `extraPayloadOrSetDefault` for `extraPayload()` functions --- core/types/rlp_payload.libevm.go | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/core/types/rlp_payload.libevm.go b/core/types/rlp_payload.libevm.go index e0aacada985..ec090463687 100644 --- a/core/types/rlp_payload.libevm.go +++ b/core/types/rlp_payload.libevm.go @@ -108,27 +108,27 @@ type extraConstructors struct { } func (h *Header) extraPayload() *pseudo.Type { - r := registeredExtras - if !r.Registered() { - // See params.ChainConfig.extraPayload() for panic rationale. - panic(fmt.Sprintf("%T.extraPayload() called before RegisterExtras()", r)) - } - if h.extra == nil { - h.extra = r.Get().newHeader() - } - return h.extra + return extraPayloadOrSetDefault(&h.extra, func(c *extraConstructors) *pseudo.Type { + return c.newHeader() + }) } func (b *Body) extraPayload() *pseudo.Type { + return extraPayloadOrSetDefault(&b.extra, func(c *extraConstructors) *pseudo.Type { + return c.newBody() + }) +} + +func extraPayloadOrSetDefault(field **pseudo.Type, construct func(*extraConstructors) *pseudo.Type) *pseudo.Type { r := registeredExtras if !r.Registered() { // See params.ChainConfig.extraPayload() for panic rationale. - panic(fmt.Sprintf("%T.extraPayload() called before RegisterExtras()", r)) + panic(".extraPayload() called before RegisterExtras()") } - if b.extra == nil { - b.extra = r.Get().newBody() + if *field == nil { + *field = construct(r.Get()) } - return b.extra + return *field } // hooks returns the [Header]'s registered [HeaderHooks], if any, otherwise a From dd907cec992aa2aeb06c99ef81343cbaff9d6678 Mon Sep 17 00:00:00 2001 From: Arran Schlosberg <519948+ARR4N@users.noreply.github.com> Date: Thu, 13 Feb 2025 11:26:23 +0000 Subject: [PATCH 5/5] refactor: bring closer in line with #133 (#136) --- core/types/rlp_payload.libevm.go | 47 ++++++++++++++++---------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/core/types/rlp_payload.libevm.go b/core/types/rlp_payload.libevm.go index ec090463687..10fd1dbabb9 100644 --- a/core/types/rlp_payload.libevm.go +++ b/core/types/rlp_payload.libevm.go @@ -74,11 +74,10 @@ func RegisterExtras[ // The [ExtraPayloads] that we returns is based on [HPtr,BPtr,SA], not // [H,B,SA] so our constructors MUST match that. This guarantees that calls to // the [HeaderHooks] and [BodyHooks] methods will never be performed on a nil pointer. - newHeader: pseudo.NewConstructor[H]().NewPointer, // i.e. non-nil HPtr - newBody: pseudo.NewConstructor[B]().NewPointer, // i.e. non-nil BPtr - newStateAccount: pseudo.NewConstructor[SA]().Zero, - cloneStateAccount: extra.cloneStateAccount, - hooks: extra, + newHeader: pseudo.NewConstructor[H]().NewPointer, // i.e. non-nil HPtr + newBody: pseudo.NewConstructor[B]().NewPointer, // i.e. non-nil BPtr + newStateAccount: pseudo.NewConstructor[SA]().Zero, + hooks: extra, }) return extra } @@ -96,29 +95,17 @@ func TestOnlyClearRegisteredExtras() { var registeredExtras register.AtMostOnce[*extraConstructors] type extraConstructors struct { - stateAccountType string - newHeader func() *pseudo.Type - newBody func() *pseudo.Type - newStateAccount func() *pseudo.Type - cloneStateAccount func(*StateAccountExtra) *StateAccountExtra - hooks interface { + stateAccountType string + newHeader func() *pseudo.Type + newBody func() *pseudo.Type + newStateAccount func() *pseudo.Type + hooks interface { hooksFromHeader(*Header) HeaderHooks hooksFromBody(*Body) BodyHooks + cloneStateAccount(*StateAccountExtra) *StateAccountExtra } } -func (h *Header) extraPayload() *pseudo.Type { - return extraPayloadOrSetDefault(&h.extra, func(c *extraConstructors) *pseudo.Type { - return c.newHeader() - }) -} - -func (b *Body) extraPayload() *pseudo.Type { - return extraPayloadOrSetDefault(&b.extra, func(c *extraConstructors) *pseudo.Type { - return c.newBody() - }) -} - func extraPayloadOrSetDefault(field **pseudo.Type, construct func(*extraConstructors) *pseudo.Type) *pseudo.Type { r := registeredExtras if !r.Registered() { @@ -131,6 +118,18 @@ func extraPayloadOrSetDefault(field **pseudo.Type, construct func(*extraConstruc return *field } +func (h *Header) extraPayload() *pseudo.Type { + return extraPayloadOrSetDefault(&h.extra, func(c *extraConstructors) *pseudo.Type { + return c.newHeader() + }) +} + +func (b *Body) extraPayload() *pseudo.Type { + return extraPayloadOrSetDefault(&b.extra, func(c *extraConstructors) *pseudo.Type { + return c.newBody() + }) +} + // hooks returns the [Header]'s registered [HeaderHooks], if any, otherwise a // [NOOPHeaderHooks] suitable for running default behaviour. func (h *Header) hooks() HeaderHooks { @@ -154,7 +153,7 @@ func (e *StateAccountExtra) clone() *StateAccountExtra { case !r.Registered(), e == nil: return nil default: - return r.Get().cloneStateAccount(e) + return r.Get().hooks.cloneStateAccount(e) } }