Proposer use highest value payload vs header (#11967)

This commit is contained in:
terencechain
2023-02-10 11:36:19 -08:00
committed by GitHub
parent 81b29ea2d8
commit e136e10ebb
27 changed files with 637 additions and 335 deletions

View File

@@ -3,6 +3,7 @@ package blocks
import (
"bytes"
"errors"
"math/big"
fastssz "github.com/prysmaticlabs/fastssz"
fieldparams "github.com/prysmaticlabs/prysm/v3/config/fieldparams"
@@ -165,6 +166,11 @@ func (executionPayload) PbCapella() (*enginev1.ExecutionPayloadCapella, error) {
return nil, ErrUnsupportedGetter
}
// Value --
func (executionPayload) Value() (*big.Int, error) {
return nil, ErrUnsupportedGetter
}
// executionPayloadHeader is a convenience wrapper around a blinded beacon block body's execution header data structure
// This wrapper allows us to conform to a common interface so that beacon
// blocks for future forks can also be applied across Prysm without issues.
@@ -316,6 +322,11 @@ func (executionPayloadHeader) PbBellatrix() (*enginev1.ExecutionPayload, error)
return nil, ErrUnsupportedGetter
}
// Value --
func (executionPayloadHeader) Value() (*big.Int, error) {
return nil, ErrUnsupportedGetter
}
// PayloadToHeader converts `payload` into execution payload header format.
func PayloadToHeader(payload interfaces.ExecutionData) (*enginev1.ExecutionPayloadHeader, error) {
txs, err := payload.Transactions()
@@ -348,12 +359,13 @@ func PayloadToHeader(payload interfaces.ExecutionData) (*enginev1.ExecutionPaylo
// This wrapper allows us to conform to a common interface so that beacon
// blocks for future forks can also be applied across Prysm without issues.
type executionPayloadCapella struct {
p *enginev1.ExecutionPayloadCapella
p *enginev1.ExecutionPayloadCapella
value *big.Int
}
// WrappedExecutionPayloadCapella is a constructor which wraps a protobuf execution payload into an interface.
func WrappedExecutionPayloadCapella(p *enginev1.ExecutionPayloadCapella) (interfaces.ExecutionData, error) {
w := executionPayloadCapella{p: p}
func WrappedExecutionPayloadCapella(p *enginev1.ExecutionPayloadCapella, value *big.Int) (interfaces.ExecutionData, error) {
w := executionPayloadCapella{p: p, value: value}
if w.IsNil() {
return nil, ErrNilObjectWrapped
}
@@ -495,16 +507,22 @@ func (executionPayloadCapella) PbBellatrix() (*enginev1.ExecutionPayload, error)
return nil, ErrUnsupportedGetter
}
// Value --
func (e executionPayloadCapella) Value() (*big.Int, error) {
return e.value, nil
}
// executionPayloadHeaderCapella is a convenience wrapper around a blinded beacon block body's execution header data structure
// This wrapper allows us to conform to a common interface so that beacon
// blocks for future forks can also be applied across Prysm without issues.
type executionPayloadHeaderCapella struct {
p *enginev1.ExecutionPayloadHeaderCapella
p *enginev1.ExecutionPayloadHeaderCapella
value *big.Int
}
// WrappedExecutionPayloadHeaderCapella is a constructor which wraps a protobuf execution header into an interface.
func WrappedExecutionPayloadHeaderCapella(p *enginev1.ExecutionPayloadHeaderCapella) (interfaces.ExecutionData, error) {
w := executionPayloadHeaderCapella{p: p}
func WrappedExecutionPayloadHeaderCapella(p *enginev1.ExecutionPayloadHeaderCapella, value *big.Int) (interfaces.ExecutionData, error) {
w := executionPayloadHeaderCapella{p: p, value: value}
if w.IsNil() {
return nil, ErrNilObjectWrapped
}
@@ -646,6 +664,11 @@ func (executionPayloadHeaderCapella) PbBellatrix() (*enginev1.ExecutionPayload,
return nil, ErrUnsupportedGetter
}
// Value --
func (e executionPayloadHeaderCapella) Value() (*big.Int, error) {
return e.value, nil
}
// PayloadToHeaderCapella converts `payload` into execution payload header format.
func PayloadToHeaderCapella(payload interfaces.ExecutionData) (*enginev1.ExecutionPayloadHeaderCapella, error) {
txs, err := payload.Transactions()

View File

@@ -1,6 +1,7 @@
package blocks_test
import (
"math/big"
"testing"
fieldparams "github.com/prysmaticlabs/prysm/v3/config/fieldparams"
@@ -104,8 +105,11 @@ func TestWrapExecutionPayloadCapella(t *testing.T) {
Amount: 77,
}},
}
payload, err := blocks.WrappedExecutionPayloadCapella(data)
payload, err := blocks.WrappedExecutionPayloadCapella(data, big.NewInt(10))
require.NoError(t, err)
v, err := payload.Value()
require.NoError(t, err)
assert.DeepEqual(t, big.NewInt(10), v)
assert.DeepEqual(t, data, payload.Proto())
}
@@ -128,9 +132,13 @@ func TestWrapExecutionPayloadHeaderCapella(t *testing.T) {
TransactionsRoot: []byte("transactionsroot"),
WithdrawalsRoot: []byte("withdrawalsroot"),
}
payload, err := blocks.WrappedExecutionPayloadHeaderCapella(data)
payload, err := blocks.WrappedExecutionPayloadHeaderCapella(data, big.NewInt(10))
require.NoError(t, err)
v, err := payload.Value()
require.NoError(t, err)
assert.DeepEqual(t, big.NewInt(10), v)
assert.DeepEqual(t, data, payload.Proto())
txRoot, err := payload.TransactionsRoot()
@@ -143,22 +151,22 @@ func TestWrapExecutionPayloadHeaderCapella(t *testing.T) {
}
func TestWrapExecutionPayloadCapella_IsNil(t *testing.T) {
_, err := blocks.WrappedExecutionPayloadCapella(nil)
_, err := blocks.WrappedExecutionPayloadCapella(nil, big.NewInt(0))
require.Equal(t, blocks.ErrNilObjectWrapped, err)
data := &enginev1.ExecutionPayloadCapella{GasUsed: 54}
payload, err := blocks.WrappedExecutionPayloadCapella(data)
payload, err := blocks.WrappedExecutionPayloadCapella(data, big.NewInt(0))
require.NoError(t, err)
assert.Equal(t, false, payload.IsNil())
}
func TestWrapExecutionPayloadHeaderCapella_IsNil(t *testing.T) {
_, err := blocks.WrappedExecutionPayloadHeaderCapella(nil)
_, err := blocks.WrappedExecutionPayloadHeaderCapella(nil, big.NewInt(0))
require.Equal(t, blocks.ErrNilObjectWrapped, err)
data := &enginev1.ExecutionPayloadHeaderCapella{GasUsed: 54}
payload, err := blocks.WrappedExecutionPayloadHeaderCapella(data)
payload, err := blocks.WrappedExecutionPayloadHeaderCapella(data, big.NewInt(0))
require.NoError(t, err)
assert.Equal(t, false, payload.IsNil())
@@ -293,7 +301,7 @@ func createWrappedPayloadCapella(t testing.TB) interfaces.ExecutionData {
BlockHash: make([]byte, fieldparams.RootLength),
Transactions: make([][]byte, 0),
Withdrawals: make([]*enginev1.Withdrawal, 0),
})
}, big.NewInt(10))
require.NoError(t, err)
return payload
}
@@ -315,7 +323,7 @@ func createWrappedPayloadHeaderCapella(t testing.TB) interfaces.ExecutionData {
BlockHash: make([]byte, fieldparams.RootLength),
TransactionsRoot: make([]byte, fieldparams.RootLength),
WithdrawalsRoot: make([]byte, fieldparams.RootLength),
})
}, big.NewInt(11))
require.NoError(t, err)
return payload
}

View File

@@ -2,6 +2,7 @@ package blocks
import (
"fmt"
"math/big"
"github.com/pkg/errors"
"github.com/prysmaticlabs/prysm/v3/consensus-types/interfaces"
@@ -193,7 +194,7 @@ func BuildSignedBeaconBlockFromExecutionPayload(
case *enginev1.ExecutionPayload:
wrappedPayload, wrapErr = WrappedExecutionPayload(p)
case *enginev1.ExecutionPayloadCapella:
wrappedPayload, wrapErr = WrappedExecutionPayloadCapella(p)
wrappedPayload, wrapErr = WrappedExecutionPayloadCapella(p, big.NewInt(0))
default:
return nil, fmt.Errorf("%T is not a type of execution payload", p)
}

View File

@@ -2,6 +2,7 @@ package blocks
import (
"fmt"
"math/big"
"github.com/pkg/errors"
ssz "github.com/prysmaticlabs/fastssz"
@@ -854,7 +855,7 @@ func (b *BeaconBlockBody) Execution() (interfaces.ExecutionData, error) {
if !ok {
return nil, errPayloadHeaderWrongType
}
return WrappedExecutionPayloadHeaderCapella(ph)
return WrappedExecutionPayloadHeaderCapella(ph, big.NewInt(0))
}
}
var p *enginev1.ExecutionPayloadCapella
@@ -865,7 +866,7 @@ func (b *BeaconBlockBody) Execution() (interfaces.ExecutionData, error) {
return nil, errPayloadWrongType
}
}
return WrappedExecutionPayloadCapella(p)
return WrappedExecutionPayloadCapella(p, big.NewInt(0))
default:
return nil, errIncorrectBlockVersion
}

View File

@@ -1,6 +1,7 @@
package blocks
import (
"math/big"
"testing"
ssz "github.com/prysmaticlabs/fastssz"
@@ -391,7 +392,7 @@ func Test_BeaconBlockBody_Execution(t *testing.T) {
assert.DeepEqual(t, result, e)
executionCapella := &pb.ExecutionPayloadCapella{BlockNumber: 1}
eCapella, err := WrappedExecutionPayloadCapella(executionCapella)
eCapella, err := WrappedExecutionPayloadCapella(executionCapella, big.NewInt(0))
require.NoError(t, err)
bb = &SignedBeaconBlock{version: version.Capella, block: &BeaconBlock{body: &BeaconBlockBody{version: version.Capella}}}
require.NoError(t, bb.SetExecution(eCapella))
@@ -400,7 +401,7 @@ func Test_BeaconBlockBody_Execution(t *testing.T) {
assert.DeepEqual(t, result, eCapella)
executionCapellaHeader := &pb.ExecutionPayloadHeaderCapella{BlockNumber: 1}
eCapellaHeader, err := WrappedExecutionPayloadHeaderCapella(executionCapellaHeader)
eCapellaHeader, err := WrappedExecutionPayloadHeaderCapella(executionCapellaHeader, big.NewInt(0))
require.NoError(t, err)
bb = &SignedBeaconBlock{version: version.Capella, block: &BeaconBlock{version: version.Capella, body: &BeaconBlockBody{version: version.Capella, isBlinded: true}}}
require.NoError(t, bb.SetExecution(eCapellaHeader))

View File

@@ -1,6 +1,8 @@
package blocks
import (
"math/big"
"github.com/pkg/errors"
"github.com/prysmaticlabs/prysm/v3/encoding/bytesutil"
enginev1 "github.com/prysmaticlabs/prysm/v3/proto/engine/v1"
@@ -666,7 +668,7 @@ func initBlockBodyFromProtoCapella(pb *eth.BeaconBlockBodyCapella) (*BeaconBlock
return nil, errNilBlockBody
}
p, err := WrappedExecutionPayloadCapella(pb.ExecutionPayload)
p, err := WrappedExecutionPayloadCapella(pb.ExecutionPayload, big.NewInt(0))
// We allow the payload to be nil
if err != nil && err != ErrNilObjectWrapped {
return nil, err
@@ -694,7 +696,7 @@ func initBlindedBlockBodyFromProtoCapella(pb *eth.BlindedBeaconBlockBodyCapella)
return nil, errNilBlockBody
}
ph, err := WrappedExecutionPayloadHeaderCapella(pb.ExecutionPayloadHeader)
ph, err := WrappedExecutionPayloadHeaderCapella(pb.ExecutionPayloadHeader, big.NewInt(0))
// We allow the payload to be nil
if err != nil && err != ErrNilObjectWrapped {
return nil, err

View File

@@ -1,6 +1,7 @@
package blocks
import (
"math/big"
"testing"
"github.com/prysmaticlabs/go-bitfield"
@@ -1022,7 +1023,7 @@ func bodyBlindedBellatrix(t *testing.T) *BeaconBlockBody {
func bodyCapella(t *testing.T) *BeaconBlockBody {
f := getFields()
p, err := WrappedExecutionPayloadCapella(f.execPayloadCapella)
p, err := WrappedExecutionPayloadCapella(f.execPayloadCapella, big.NewInt(0))
require.NoError(t, err)
return &BeaconBlockBody{
version: version.Capella,
@@ -1046,7 +1047,7 @@ func bodyCapella(t *testing.T) *BeaconBlockBody {
func bodyBlindedCapella(t *testing.T) *BeaconBlockBody {
f := getFields()
ph, err := WrappedExecutionPayloadHeaderCapella(f.execPayloadHeaderCapella)
ph, err := WrappedExecutionPayloadHeaderCapella(f.execPayloadHeaderCapella, big.NewInt(0))
require.NoError(t, err)
return &BeaconBlockBody{
version: version.Capella,

View File

@@ -1,6 +1,8 @@
package interfaces
import (
"math/big"
ssz "github.com/prysmaticlabs/fastssz"
field_params "github.com/prysmaticlabs/prysm/v3/config/fieldparams"
"github.com/prysmaticlabs/prysm/v3/consensus-types/primitives"
@@ -120,4 +122,5 @@ type ExecutionData interface {
WithdrawalsRoot() ([]byte, error)
PbCapella() (*enginev1.ExecutionPayloadCapella, error)
PbBellatrix() (*enginev1.ExecutionPayload, error)
Value() (*big.Int, error)
}