Skip to content

Commit 0eb029a

Browse files
qdm12ARR4N
andauthored
chore(core/types): restructure libevm hooks code (#135)
Co-authored-by: Arran Schlosberg <[email protected]>
1 parent c78db42 commit 0eb029a

File tree

2 files changed

+56
-62
lines changed

2 files changed

+56
-62
lines changed

core/types/block.libevm.go

Lines changed: 0 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,8 @@ package types
1818

1919
import (
2020
"encoding/json"
21-
"fmt"
2221
"io"
2322

24-
"github.com/ava-labs/libevm/libevm/pseudo"
2523
"github.com/ava-labs/libevm/rlp"
2624
)
2725

@@ -35,19 +33,6 @@ type HeaderHooks interface {
3533
PostCopy(dst *Header)
3634
}
3735

38-
// hooks returns the Header's registered HeaderHooks, if any, otherwise a
39-
// [NOOPHeaderHooks] suitable for running default behaviour.
40-
func (h *Header) hooks() HeaderHooks {
41-
if r := registeredExtras; r.Registered() {
42-
return r.Get().hooks.hooksFromHeader(h)
43-
}
44-
return new(NOOPHeaderHooks)
45-
}
46-
47-
func (e ExtraPayloads[HPtr, BPtr, SA]) hooksFromHeader(h *Header) HeaderHooks {
48-
return e.Header.Get(h)
49-
}
50-
5136
var _ interface {
5237
rlp.Encoder
5338
rlp.Decoder
@@ -75,18 +60,6 @@ func (h *Header) DecodeRLP(s *rlp.Stream) error {
7560
return h.hooks().DecodeRLP(h, s)
7661
}
7762

78-
func (h *Header) extraPayload() *pseudo.Type {
79-
r := registeredExtras
80-
if !r.Registered() {
81-
// See params.ChainConfig.extraPayload() for panic rationale.
82-
panic(fmt.Sprintf("%T.extraPayload() called before RegisterExtras()", r))
83-
}
84-
if h.extra == nil {
85-
h.extra = r.Get().newHeader()
86-
}
87-
return h.extra
88-
}
89-
9063
// NOOPHeaderHooks implements [HeaderHooks] such that they are equivalent to
9164
// no type having been registered.
9265
type NOOPHeaderHooks struct{}
@@ -133,13 +106,6 @@ type BodyHooks interface {
133106
RLPFieldPointersForDecoding(*Body) *rlp.Fields
134107
}
135108

136-
func (b *Body) hooks() BodyHooks {
137-
if r := registeredExtras; r.Registered() {
138-
return r.Get().hooks.hooksFromBody(b)
139-
}
140-
return NOOPBodyHooks{}
141-
}
142-
143109
// NOOPBodyHooks implements [BodyHooks] such that they are equivalent to no type
144110
// having been registered.
145111
type NOOPBodyHooks struct{}
@@ -163,19 +129,3 @@ func (NOOPBodyHooks) RLPFieldPointersForDecoding(b *Body) *rlp.Fields {
163129
Optional: []any{&b.Withdrawals},
164130
}
165131
}
166-
167-
func (e ExtraPayloads[HPtr, BPtr, SA]) hooksFromBody(b *Body) BodyHooks {
168-
return e.Body.Get(b)
169-
}
170-
171-
func (b *Body) extraPayload() *pseudo.Type {
172-
r := registeredExtras
173-
if !r.Registered() {
174-
// See params.ChainConfig.extraPayload() for panic rationale.
175-
panic(fmt.Sprintf("%T.extraPayload() called before RegisterExtras()", r))
176-
}
177-
if b.extra == nil {
178-
b.extra = r.Get().newBody()
179-
}
180-
return b.extra
181-
}

core/types/rlp_payload.libevm.go

Lines changed: 56 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,10 @@ func RegisterExtras[
7474
// The [ExtraPayloads] that we returns is based on [HPtr,BPtr,SA], not
7575
// [H,B,SA] so our constructors MUST match that. This guarantees that calls to
7676
// the [HeaderHooks] and [BodyHooks] methods will never be performed on a nil pointer.
77-
newHeader: pseudo.NewConstructor[H]().NewPointer, // i.e. non-nil HPtr
78-
newBody: pseudo.NewConstructor[B]().NewPointer, // i.e. non-nil BPtr
79-
newStateAccount: pseudo.NewConstructor[SA]().Zero,
80-
cloneStateAccount: extra.cloneStateAccount,
81-
hooks: extra,
77+
newHeader: pseudo.NewConstructor[H]().NewPointer, // i.e. non-nil HPtr
78+
newBody: pseudo.NewConstructor[B]().NewPointer, // i.e. non-nil BPtr
79+
newStateAccount: pseudo.NewConstructor[SA]().Zero,
80+
hooks: extra,
8281
})
8382
return extra
8483
}
@@ -96,23 +95,65 @@ func TestOnlyClearRegisteredExtras() {
9695
var registeredExtras register.AtMostOnce[*extraConstructors]
9796

9897
type extraConstructors struct {
99-
stateAccountType string
100-
newHeader func() *pseudo.Type
101-
newBody func() *pseudo.Type
102-
newStateAccount func() *pseudo.Type
103-
cloneStateAccount func(*StateAccountExtra) *StateAccountExtra
104-
hooks interface {
98+
stateAccountType string
99+
newHeader func() *pseudo.Type
100+
newBody func() *pseudo.Type
101+
newStateAccount func() *pseudo.Type
102+
hooks interface {
105103
hooksFromHeader(*Header) HeaderHooks
106104
hooksFromBody(*Body) BodyHooks
105+
cloneStateAccount(*StateAccountExtra) *StateAccountExtra
107106
}
108107
}
109108

109+
func extraPayloadOrSetDefault(field **pseudo.Type, construct func(*extraConstructors) *pseudo.Type) *pseudo.Type {
110+
r := registeredExtras
111+
if !r.Registered() {
112+
// See params.ChainConfig.extraPayload() for panic rationale.
113+
panic("<T>.extraPayload() called before RegisterExtras()")
114+
}
115+
if *field == nil {
116+
*field = construct(r.Get())
117+
}
118+
return *field
119+
}
120+
121+
func (h *Header) extraPayload() *pseudo.Type {
122+
return extraPayloadOrSetDefault(&h.extra, func(c *extraConstructors) *pseudo.Type {
123+
return c.newHeader()
124+
})
125+
}
126+
127+
func (b *Body) extraPayload() *pseudo.Type {
128+
return extraPayloadOrSetDefault(&b.extra, func(c *extraConstructors) *pseudo.Type {
129+
return c.newBody()
130+
})
131+
}
132+
133+
// hooks returns the [Header]'s registered [HeaderHooks], if any, otherwise a
134+
// [NOOPHeaderHooks] suitable for running default behaviour.
135+
func (h *Header) hooks() HeaderHooks {
136+
if r := registeredExtras; r.Registered() {
137+
return r.Get().hooks.hooksFromHeader(h)
138+
}
139+
return new(NOOPHeaderHooks)
140+
}
141+
142+
// hooks returns the [Body]'s registered [BodyHooks], if any, otherwise a
143+
// [NOOPBodyHooks] suitable for running default behaviour.
144+
func (b *Body) hooks() BodyHooks {
145+
if r := registeredExtras; r.Registered() {
146+
return r.Get().hooks.hooksFromBody(b)
147+
}
148+
return NOOPBodyHooks{}
149+
}
150+
110151
func (e *StateAccountExtra) clone() *StateAccountExtra {
111152
switch r := registeredExtras; {
112153
case !r.Registered(), e == nil:
113154
return nil
114155
default:
115-
return r.Get().cloneStateAccount(e)
156+
return r.Get().hooks.cloneStateAccount(e)
116157
}
117158
}
118159

@@ -125,6 +166,9 @@ type ExtraPayloads[HPtr HeaderHooks, BPtr BodyHooks, SA any] struct {
125166
StateAccount pseudo.Accessor[StateOrSlimAccount, SA] // Also provides [SlimAccount] access.
126167
}
127168

169+
func (e ExtraPayloads[HPtr, BPtr, SA]) hooksFromHeader(h *Header) HeaderHooks { return e.Header.Get(h) }
170+
func (e ExtraPayloads[HPtr, BPtr, SA]) hooksFromBody(b *Body) BodyHooks { return e.Body.Get(b) }
171+
128172
func (ExtraPayloads[HPtr, BPtr, SA]) cloneStateAccount(s *StateAccountExtra) *StateAccountExtra {
129173
v := pseudo.MustNewValue[SA](s.t)
130174
return &StateAccountExtra{

0 commit comments

Comments
 (0)