mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2025-01-10 03:31:20 +00:00
d17996f8b0
* Update V3 from V4 * Fix build v3 -> v4 * Update ssz * Update beacon_chain.pb.go * Fix formatter import * Update update-mockgen.sh comment to v4 * Fix conflicts. Pass build and tests * Fix test
158 lines
5.2 KiB
Go
158 lines
5.2 KiB
Go
package validator
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"github.com/pkg/errors"
|
|
"github.com/prysmaticlabs/prysm/v4/beacon-chain/state"
|
|
consensusblocks "github.com/prysmaticlabs/prysm/v4/consensus-types/blocks"
|
|
"github.com/prysmaticlabs/prysm/v4/consensus-types/interfaces"
|
|
enginev1 "github.com/prysmaticlabs/prysm/v4/proto/engine/v1"
|
|
ethpb "github.com/prysmaticlabs/prysm/v4/proto/prysm/v1alpha1"
|
|
"github.com/prysmaticlabs/prysm/v4/runtime/version"
|
|
"github.com/sirupsen/logrus"
|
|
)
|
|
|
|
// Sets the bls to exec data for a block.
|
|
func (vs *Server) setBlsToExecData(blk interfaces.SignedBeaconBlock, headState state.BeaconState) {
|
|
if blk.Version() < version.Capella {
|
|
return
|
|
}
|
|
if err := blk.SetBLSToExecutionChanges([]*ethpb.SignedBLSToExecutionChange{}); err != nil {
|
|
log.WithError(err).Error("Could not set bls to execution data in block")
|
|
return
|
|
}
|
|
changes, err := vs.BLSChangesPool.BLSToExecChangesForInclusion(headState)
|
|
if err != nil {
|
|
log.WithError(err).Error("Could not get bls to execution changes")
|
|
return
|
|
} else {
|
|
if err := blk.SetBLSToExecutionChanges(changes); err != nil {
|
|
log.WithError(err).Error("Could not set bls to execution changes")
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
func (vs *Server) unblindBuilderBlockCapella(ctx context.Context, b interfaces.ReadOnlySignedBeaconBlock) (interfaces.ReadOnlySignedBeaconBlock, error) {
|
|
if err := consensusblocks.BeaconBlockIsNil(b); err != nil {
|
|
return nil, errors.Wrap(err, "block is nil")
|
|
}
|
|
|
|
// No-op if the input block is not version blind and capella.
|
|
if b.Version() != version.Capella || !b.IsBlinded() {
|
|
return b, nil
|
|
}
|
|
// No-op nothing if the builder has not been configured.
|
|
if !vs.BlockBuilder.Configured() {
|
|
return b, nil
|
|
}
|
|
|
|
agg, err := b.Block().Body().SyncAggregate()
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "could not get sync aggregate")
|
|
}
|
|
h, err := b.Block().Body().Execution()
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "could not get execution header")
|
|
}
|
|
header, ok := h.Proto().(*enginev1.ExecutionPayloadHeaderCapella)
|
|
if !ok {
|
|
return nil, errors.New("execution data must be execution payload header capella")
|
|
}
|
|
parentRoot := b.Block().ParentRoot()
|
|
stateRoot := b.Block().StateRoot()
|
|
randaoReveal := b.Block().Body().RandaoReveal()
|
|
graffiti := b.Block().Body().Graffiti()
|
|
sig := b.Signature()
|
|
sb := ðpb.SignedBlindedBeaconBlockCapella{
|
|
Block: ðpb.BlindedBeaconBlockCapella{
|
|
Slot: b.Block().Slot(),
|
|
ProposerIndex: b.Block().ProposerIndex(),
|
|
ParentRoot: parentRoot[:],
|
|
StateRoot: stateRoot[:],
|
|
Body: ðpb.BlindedBeaconBlockBodyCapella{
|
|
RandaoReveal: randaoReveal[:],
|
|
Eth1Data: b.Block().Body().Eth1Data(),
|
|
Graffiti: graffiti[:],
|
|
ProposerSlashings: b.Block().Body().ProposerSlashings(),
|
|
AttesterSlashings: b.Block().Body().AttesterSlashings(),
|
|
Attestations: b.Block().Body().Attestations(),
|
|
Deposits: b.Block().Body().Deposits(),
|
|
VoluntaryExits: b.Block().Body().VoluntaryExits(),
|
|
SyncAggregate: agg,
|
|
ExecutionPayloadHeader: header,
|
|
},
|
|
},
|
|
Signature: sig[:],
|
|
}
|
|
|
|
wrappedSb, err := consensusblocks.NewSignedBeaconBlock(sb)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "could not create signed block")
|
|
}
|
|
|
|
payload, err := vs.BlockBuilder.SubmitBlindedBlock(ctx, wrappedSb)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "could not submit blinded block")
|
|
}
|
|
|
|
payloadHtr, err := payload.HashTreeRoot()
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "could not get payload hash tree root")
|
|
}
|
|
headerHtr, err := header.HashTreeRoot()
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "could not get header hash tree root")
|
|
}
|
|
if payloadHtr != headerHtr {
|
|
return nil, fmt.Errorf("payload hash tree root %x does not match header hash tree root %x", payloadHtr, headerHtr)
|
|
}
|
|
|
|
capellaPayload, err := payload.PbCapella()
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "could not get payload")
|
|
}
|
|
|
|
bb := ðpb.SignedBeaconBlockCapella{
|
|
Block: ðpb.BeaconBlockCapella{
|
|
Slot: sb.Block.Slot,
|
|
ProposerIndex: sb.Block.ProposerIndex,
|
|
ParentRoot: sb.Block.ParentRoot,
|
|
StateRoot: sb.Block.StateRoot,
|
|
Body: ðpb.BeaconBlockBodyCapella{
|
|
RandaoReveal: sb.Block.Body.RandaoReveal,
|
|
Eth1Data: sb.Block.Body.Eth1Data,
|
|
Graffiti: sb.Block.Body.Graffiti,
|
|
ProposerSlashings: sb.Block.Body.ProposerSlashings,
|
|
AttesterSlashings: sb.Block.Body.AttesterSlashings,
|
|
Attestations: sb.Block.Body.Attestations,
|
|
Deposits: sb.Block.Body.Deposits,
|
|
VoluntaryExits: sb.Block.Body.VoluntaryExits,
|
|
SyncAggregate: agg,
|
|
ExecutionPayload: capellaPayload,
|
|
},
|
|
},
|
|
Signature: sb.Signature,
|
|
}
|
|
wb, err := consensusblocks.NewSignedBeaconBlock(bb)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "could not create signed block")
|
|
}
|
|
|
|
txs, err := payload.Transactions()
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "could not get transactions from payload")
|
|
}
|
|
log.WithFields(logrus.Fields{
|
|
"blockHash": fmt.Sprintf("%#x", h.BlockHash()),
|
|
"feeRecipient": fmt.Sprintf("%#x", h.FeeRecipient()),
|
|
"gasUsed": h.GasUsed,
|
|
"slot": b.Block().Slot(),
|
|
"txs": len(txs),
|
|
}).Info("Retrieved full capella payload from builder")
|
|
|
|
return wb, nil
|
|
}
|