Skip to content

Commit ee93f60

Browse files
authored
feat(core/types): Header hook PostCopy (#106)
1 parent e2b0abb commit ee93f60

File tree

3 files changed

+25
-0
lines changed

3 files changed

+25
-0
lines changed

core/types/block.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ func CopyHeader(h *Header) *Header {
309309
cpy.ParentBeaconRoot = new(common.Hash)
310310
*cpy.ParentBeaconRoot = *h.ParentBeaconRoot
311311
}
312+
h.hooks().PostCopy(&cpy)
312313
return &cpy
313314
}
314315

core/types/block.libevm.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ type HeaderHooks interface {
3232
UnmarshalJSON(*Header, []byte) error //nolint:govet
3333
EncodeRLP(*Header, io.Writer) error
3434
DecodeRLP(*Header, *rlp.Stream) error
35+
PostCopy(dst *Header)
3536
}
3637

3738
// hooks returns the Header's registered HeaderHooks, if any, otherwise a
@@ -108,3 +109,5 @@ func (*NOOPHeaderHooks) DecodeRLP(h *Header, s *rlp.Stream) error {
108109
type withoutMethods Header
109110
return s.Decode((*withoutMethods)(h))
110111
}
112+
113+
func (n *NOOPHeaderHooks) PostCopy(dst *Header) {}

core/types/block.libevm_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,16 @@ import (
2929
. "github.com/ava-labs/libevm/core/types"
3030
"github.com/ava-labs/libevm/crypto"
3131
"github.com/ava-labs/libevm/libevm/ethtest"
32+
"github.com/ava-labs/libevm/libevm/pseudo"
3233
"github.com/ava-labs/libevm/rlp"
3334
)
3435

3536
type stubHeaderHooks struct {
3637
suffix []byte
3738
gotRawJSONToUnmarshal, gotRawRLPToDecode []byte
3839
setHeaderToOnUnmarshalOrDecode Header
40+
accessor pseudo.Accessor[*Header, *stubHeaderHooks]
41+
toCopy *stubHeaderHooks
3942

4043
errMarshal, errUnmarshal, errEncode, errDecode error
4144
}
@@ -75,6 +78,10 @@ func (hh *stubHeaderHooks) DecodeRLP(h *Header, s *rlp.Stream) error {
7578
return hh.errDecode
7679
}
7780

81+
func (hh *stubHeaderHooks) PostCopy(dst *Header) {
82+
hh.accessor.Set(dst, hh.toCopy)
83+
}
84+
7885
func TestHeaderHooks(t *testing.T) {
7986
TestOnlyClearRegisteredExtras()
8087
defer TestOnlyClearRegisteredExtras()
@@ -135,6 +142,20 @@ func TestHeaderHooks(t *testing.T) {
135142
assert.Equalf(t, &stub.setHeaderToOnUnmarshalOrDecode, hdr, "%T after RLP decoding with hook", hdr)
136143
})
137144

145+
t.Run("PostCopy", func(t *testing.T) {
146+
hdr := new(Header)
147+
stub := &stubHeaderHooks{
148+
accessor: extras.Header,
149+
toCopy: &stubHeaderHooks{
150+
suffix: []byte("copied"),
151+
},
152+
}
153+
extras.Header.Set(hdr, stub)
154+
155+
got := extras.Header.Get(CopyHeader(hdr))
156+
assert.Equal(t, stub.toCopy, got)
157+
})
158+
138159
t.Run("error_propagation", func(t *testing.T) {
139160
errMarshal := errors.New("whoops")
140161
errUnmarshal := errors.New("is it broken?")

0 commit comments

Comments
 (0)