From 7306184be8fd514b8820c0cef44911a533225901 Mon Sep 17 00:00:00 2001 From: Quentin Mc Gaw Date: Mon, 20 Jan 2025 15:42:05 +0100 Subject: [PATCH] Header Copy hooks --- core/types/block.go | 6 +----- core/types/block.libevm.go | 18 ++++++++++++++++-- core/types/block.libevm_test.go | 4 ++++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/core/types/block.go b/core/types/block.go index 8c136ef8a445a..0706f5283814c 100644 --- a/core/types/block.go +++ b/core/types/block.go @@ -281,8 +281,7 @@ func NewBlockWithWithdrawals(header *Header, txs []*Transaction, uncles []*Heade return b.WithWithdrawals(withdrawals) } -// CopyHeader creates a deep copy of a block header. -func CopyHeader(h *Header) *Header { +func copyHeader(h *Header) *Header { cpy := *h if cpy.Difficulty = new(big.Int); h.Difficulty != nil { cpy.Difficulty.Set(h.Difficulty) @@ -313,9 +312,6 @@ func CopyHeader(h *Header) *Header { cpy.ParentBeaconRoot = new(common.Hash) *cpy.ParentBeaconRoot = *h.ParentBeaconRoot } - if h.extra != nil { - cpy.extra = h.extra - } return &cpy } diff --git a/core/types/block.libevm.go b/core/types/block.libevm.go index 7ec55d7081996..3089600b2ca04 100644 --- a/core/types/block.libevm.go +++ b/core/types/block.libevm.go @@ -32,6 +32,7 @@ type HeaderHooks interface { UnmarshalJSON(*Header, []byte) error //nolint:govet EncodeRLP(*Header, io.Writer) error DecodeRLP(*Header, *rlp.Stream) error + Copy() *Header } // hooks returns the Header's registered HeaderHooks, if any, otherwise a @@ -40,7 +41,9 @@ func (h *Header) hooks() HeaderHooks { if r := registeredExtras; r.Registered() { return r.Get().hooks.hooksFromHeader(h) } - return new(NOOPHeaderHooks) + return &NOOPHeaderHooks{ + header: h, + } } func (e ExtraPayloads[HPtr, BlockExtraPtr, BodyExtraPtr, SA]) hooksFromHeader(h *Header) HeaderHooks { @@ -88,7 +91,9 @@ func (h *Header) extraPayload() *pseudo.Type { // NOOPHeaderHooks implements [HeaderHooks] such that they are equivalent to // no type having been registered. -type NOOPHeaderHooks struct{} +type NOOPHeaderHooks struct { + header *Header +} var _ HeaderHooks = (*NOOPHeaderHooks)(nil) @@ -109,6 +114,15 @@ func (*NOOPHeaderHooks) DecodeRLP(h *Header, s *rlp.Stream) error { return s.Decode((*withoutMethods)(h)) } +func (n *NOOPHeaderHooks) Copy() *Header { + return copyHeader(n.header) +} + +// CopyHeader creates a deep copy of a block header. +func CopyHeader(h *Header) *Header { + return h.hooks().Copy() +} + // BlockHooks are required for all types registered with [RegisterExtras] for // [Block] payloads. type BlockHooks interface { diff --git a/core/types/block.libevm_test.go b/core/types/block.libevm_test.go index 5bb9ae6c44245..bd1b8f8cf6f67 100644 --- a/core/types/block.libevm_test.go +++ b/core/types/block.libevm_test.go @@ -75,6 +75,10 @@ func (hh *stubHeaderHooks) DecodeRLP(h *Header, s *rlp.Stream) error { return hh.errDecode } +func (hh *stubHeaderHooks) Copy() *Header { + return nil +} + type stubBlockHooks struct { suffix []byte gotRawRLPToDecode []byte