mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-18 02:40:45 +00:00
chore(core/types): restructure libevm hooks code (#135)
Co-authored-by: Arran Schlosberg <519948+ARR4N@users.noreply.github.com>
This commit is contained in:
parent
c78db425b8
commit
0eb029ad49
2 changed files with 56 additions and 62 deletions
|
|
@ -18,10 +18,8 @@ package types
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/ava-labs/libevm/libevm/pseudo"
|
|
||||||
"github.com/ava-labs/libevm/rlp"
|
"github.com/ava-labs/libevm/rlp"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -35,19 +33,6 @@ type HeaderHooks interface {
|
||||||
PostCopy(dst *Header)
|
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e ExtraPayloads[HPtr, BPtr, SA]) hooksFromHeader(h *Header) HeaderHooks {
|
|
||||||
return e.Header.Get(h)
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ interface {
|
var _ interface {
|
||||||
rlp.Encoder
|
rlp.Encoder
|
||||||
rlp.Decoder
|
rlp.Decoder
|
||||||
|
|
@ -75,18 +60,6 @@ func (h *Header) DecodeRLP(s *rlp.Stream) error {
|
||||||
return h.hooks().DecodeRLP(h, s)
|
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
|
// NOOPHeaderHooks implements [HeaderHooks] such that they are equivalent to
|
||||||
// no type having been registered.
|
// no type having been registered.
|
||||||
type NOOPHeaderHooks struct{}
|
type NOOPHeaderHooks struct{}
|
||||||
|
|
@ -133,13 +106,6 @@ type BodyHooks interface {
|
||||||
RLPFieldPointersForDecoding(*Body) *rlp.Fields
|
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
|
// NOOPBodyHooks implements [BodyHooks] such that they are equivalent to no type
|
||||||
// having been registered.
|
// having been registered.
|
||||||
type NOOPBodyHooks struct{}
|
type NOOPBodyHooks struct{}
|
||||||
|
|
@ -163,19 +129,3 @@ func (NOOPBodyHooks) RLPFieldPointersForDecoding(b *Body) *rlp.Fields {
|
||||||
Optional: []any{&b.Withdrawals},
|
Optional: []any{&b.Withdrawals},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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() {
|
|
||||||
// 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
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,6 @@ func RegisterExtras[
|
||||||
newHeader: pseudo.NewConstructor[H]().NewPointer, // i.e. non-nil HPtr
|
newHeader: pseudo.NewConstructor[H]().NewPointer, // i.e. non-nil HPtr
|
||||||
newBody: pseudo.NewConstructor[B]().NewPointer, // i.e. non-nil BPtr
|
newBody: pseudo.NewConstructor[B]().NewPointer, // i.e. non-nil BPtr
|
||||||
newStateAccount: pseudo.NewConstructor[SA]().Zero,
|
newStateAccount: pseudo.NewConstructor[SA]().Zero,
|
||||||
cloneStateAccount: extra.cloneStateAccount,
|
|
||||||
hooks: extra,
|
hooks: extra,
|
||||||
})
|
})
|
||||||
return extra
|
return extra
|
||||||
|
|
@ -100,19 +99,61 @@ type extraConstructors struct {
|
||||||
newHeader func() *pseudo.Type
|
newHeader func() *pseudo.Type
|
||||||
newBody func() *pseudo.Type
|
newBody func() *pseudo.Type
|
||||||
newStateAccount func() *pseudo.Type
|
newStateAccount func() *pseudo.Type
|
||||||
cloneStateAccount func(*StateAccountExtra) *StateAccountExtra
|
|
||||||
hooks interface {
|
hooks interface {
|
||||||
hooksFromHeader(*Header) HeaderHooks
|
hooksFromHeader(*Header) HeaderHooks
|
||||||
hooksFromBody(*Body) BodyHooks
|
hooksFromBody(*Body) BodyHooks
|
||||||
|
cloneStateAccount(*StateAccountExtra) *StateAccountExtra
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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("<T>.extraPayload() called before RegisterExtras()")
|
||||||
|
}
|
||||||
|
if *field == nil {
|
||||||
|
*field = construct(r.Get())
|
||||||
|
}
|
||||||
|
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 {
|
||||||
|
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 {
|
func (e *StateAccountExtra) clone() *StateAccountExtra {
|
||||||
switch r := registeredExtras; {
|
switch r := registeredExtras; {
|
||||||
case !r.Registered(), e == nil:
|
case !r.Registered(), e == nil:
|
||||||
return nil
|
return nil
|
||||||
default:
|
default:
|
||||||
return r.Get().cloneStateAccount(e)
|
return r.Get().hooks.cloneStateAccount(e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -125,6 +166,9 @@ type ExtraPayloads[HPtr HeaderHooks, BPtr BodyHooks, SA any] struct {
|
||||||
StateAccount pseudo.Accessor[StateOrSlimAccount, SA] // Also provides [SlimAccount] access.
|
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 {
|
func (ExtraPayloads[HPtr, BPtr, SA]) cloneStateAccount(s *StateAccountExtra) *StateAccountExtra {
|
||||||
v := pseudo.MustNewValue[SA](s.t)
|
v := pseudo.MustNewValue[SA](s.t)
|
||||||
return &StateAccountExtra{
|
return &StateAccountExtra{
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue