mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-20 02:42:27 +00:00
beacon/types: add ExecutionHeader
This commit is contained in:
parent
d75c0e51ca
commit
27088a9c29
2 changed files with 82 additions and 4 deletions
80
beacon/types/exec_header.go
Normal file
80
beacon/types/exec_header.go
Normal file
|
|
@ -0,0 +1,80 @@
|
||||||
|
// Copyright 2024 The go-ethereum Authors
|
||||||
|
// This file is part of the go-ethereum library.
|
||||||
|
//
|
||||||
|
// The go-ethereum library is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// The go-ethereum library is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Lesser General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public License
|
||||||
|
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
package types
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/beacon/merkle"
|
||||||
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/protolambda/zrnt/eth2/beacon/capella"
|
||||||
|
zrntcommon "github.com/protolambda/zrnt/eth2/beacon/common"
|
||||||
|
"github.com/protolambda/zrnt/eth2/beacon/deneb"
|
||||||
|
"github.com/protolambda/ztyp/tree"
|
||||||
|
)
|
||||||
|
|
||||||
|
type headerObject interface {
|
||||||
|
HashTreeRoot(hFn tree.HashFn) zrntcommon.Root
|
||||||
|
}
|
||||||
|
|
||||||
|
type ExecutionHeader struct {
|
||||||
|
obj headerObject
|
||||||
|
}
|
||||||
|
|
||||||
|
// HeaderFromJSON decodes an execution header from JSON data provided by
|
||||||
|
// the beacon chain API.
|
||||||
|
func ExecutionHeaderFromJSON(forkName string, data []byte) (*ExecutionHeader, error) {
|
||||||
|
var obj headerObject
|
||||||
|
switch forkName {
|
||||||
|
case "capella":
|
||||||
|
obj = new(capella.ExecutionPayloadHeader)
|
||||||
|
case "deneb":
|
||||||
|
obj = new(deneb.ExecutionPayloadHeader)
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("unsupported fork: " + forkName)
|
||||||
|
}
|
||||||
|
if err := json.Unmarshal(data, obj); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &ExecutionHeader{obj: obj}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewExecutionHeader(obj headerObject) *ExecutionHeader {
|
||||||
|
switch obj.(type) {
|
||||||
|
case *capella.ExecutionPayloadHeader:
|
||||||
|
case *deneb.ExecutionPayloadHeader:
|
||||||
|
default:
|
||||||
|
panic(fmt.Errorf("unsupported ExecutionPayloadHeader type %T", obj))
|
||||||
|
}
|
||||||
|
return &ExecutionHeader{obj: obj}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (eh *ExecutionHeader) PayloadRoot() merkle.Value {
|
||||||
|
return merkle.Value(eh.obj.HashTreeRoot(tree.GetHashFn()))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (eh *ExecutionHeader) BlockHash() common.Hash {
|
||||||
|
switch obj := eh.obj.(type) {
|
||||||
|
case *capella.ExecutionPayloadHeader:
|
||||||
|
return common.Hash(obj.BlockHash)
|
||||||
|
case *deneb.ExecutionPayloadHeader:
|
||||||
|
return common.Hash(obj.BlockHash)
|
||||||
|
default:
|
||||||
|
panic(fmt.Errorf("unsupported ExecutionPayloadHeader type %T", obj))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -24,8 +24,6 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/beacon/merkle"
|
"github.com/ethereum/go-ethereum/beacon/merkle"
|
||||||
"github.com/ethereum/go-ethereum/beacon/params"
|
"github.com/ethereum/go-ethereum/beacon/params"
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
"github.com/protolambda/zrnt/eth2/beacon/capella"
|
|
||||||
"github.com/protolambda/ztyp/tree"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// HeadInfo represents an unvalidated new head announcement.
|
// HeadInfo represents an unvalidated new head announcement.
|
||||||
|
|
@ -146,12 +144,12 @@ func (u UpdateScore) BetterThan(w UpdateScore) bool {
|
||||||
|
|
||||||
type HeaderWithExecProof struct {
|
type HeaderWithExecProof struct {
|
||||||
Header
|
Header
|
||||||
PayloadHeader *capella.ExecutionPayloadHeader
|
PayloadHeader *ExecutionHeader
|
||||||
PayloadBranch merkle.Values
|
PayloadBranch merkle.Values
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *HeaderWithExecProof) Validate() error {
|
func (h *HeaderWithExecProof) Validate() error {
|
||||||
payloadRoot := merkle.Value(h.PayloadHeader.HashTreeRoot(tree.GetHashFn()))
|
payloadRoot := h.PayloadHeader.PayloadRoot()
|
||||||
return merkle.VerifyProof(h.BodyRoot, params.BodyIndexExecPayload, h.PayloadBranch, payloadRoot)
|
return merkle.VerifyProof(h.BodyRoot, params.BodyIndexExecPayload, h.PayloadBranch, payloadRoot)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue