Skip to content

Commit

Permalink
Kasey's feedback
Browse files Browse the repository at this point in the history
  • Loading branch information
terencechain committed Oct 8, 2024
1 parent 7f73d11 commit d6b89e3
Show file tree
Hide file tree
Showing 8 changed files with 71 additions and 12 deletions.
2 changes: 2 additions & 0 deletions beacon-chain/execution/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ go_library(
"//beacon-chain/state:go_default_library",
"//beacon-chain/state/state-native:go_default_library",
"//beacon-chain/state/stategen:go_default_library",
"//beacon-chain/verification:go_default_library",
"//config/fieldparams:go_default_library",
"//config/params:go_default_library",
"//consensus-types/blocks:go_default_library",
Expand Down Expand Up @@ -71,6 +72,7 @@ go_library(
"@com_github_prometheus_client_golang//prometheus/promauto:go_default_library",
"@com_github_sirupsen_logrus//:go_default_library",
"@io_k8s_client_go//tools/cache:go_default_library",
"@io_k8s_utils//strings/slices:go_default_library",
"@org_golang_google_protobuf//proto:go_default_library",
],
)
Expand Down
29 changes: 26 additions & 3 deletions beacon-chain/execution/engine_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"github.com/holiman/uint256"
"github.com/pkg/errors"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/execution/types"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/verification"
fieldparams "github.com/prysmaticlabs/prysm/v5/config/fieldparams"
"github.com/prysmaticlabs/prysm/v5/config/params"
"github.com/prysmaticlabs/prysm/v5/consensus-types/blocks"
Expand All @@ -28,6 +29,7 @@ import (
"github.com/prysmaticlabs/prysm/v5/time/slots"
"github.com/sirupsen/logrus"
"google.golang.org/protobuf/proto"
"k8s.io/utils/strings/slices"
)

var (
Expand Down Expand Up @@ -491,6 +493,12 @@ func (s *Service) HeaderByNumber(ctx context.Context, number *big.Int) (*types.H
func (s *Service) GetBlobs(ctx context.Context, versionedHashes []common.Hash) ([]*pb.BlobAndProof, error) {
ctx, span := trace.StartSpan(ctx, "powchain.engine-api-client.GetBlobs")
defer span.End()
s.capabilitiesLock.RLock()
if !slices.Contains(s.capabilities, GetBlobsV1) {
s.capabilitiesLock.RUnlock()
return nil, nil
}
s.capabilitiesLock.RUnlock()

result := make([]*pb.BlobAndProof, len(versionedHashes))
err := s.rpcClient.CallContext(ctx, &result, GetBlobsV1, versionedHashes)
Expand Down Expand Up @@ -543,6 +551,9 @@ func (s *Service) ReconstructBlobSidecars(ctx context.Context, block interfaces.
if err != nil {
return nil, errors.Wrap(err, "could not get blobs")
}
if blobs == nil {
return nil, nil
}

// Get the block header and its hash tree root
header, err := block.Header()
Expand All @@ -559,7 +570,8 @@ func (s *Service) ReconstructBlobSidecars(ctx context.Context, block interfaces.
// Get the Merkle proof for the KZG commitment
proof, err := blocks.MerkleProofKZGCommitment(blockBody, index)
if err != nil {
return nil, errors.Wrap(err, "could not get Merkle proof KZG commitment")
log.WithError(err).Error("could not get Merkle proof for KZG commitment")
continue
}

// Create the BlobSidecar object
Expand All @@ -575,9 +587,20 @@ func (s *Service) ReconstructBlobSidecars(ctx context.Context, block interfaces.
// Create a read-only blob with the header root
roBlob, err := blocks.NewROBlobWithRoot(sidecar, blockRoot)
if err != nil {
return nil, errors.Wrap(err, "could not create RO blob with root")
log.WithError(err).Error("could not create RO blob with root")
continue
}
v := s.blobVerifier(roBlob, verification.ELMemPoolRequirements)
if err := v.SidecarKzgProofVerified(); err != nil {
log.WithError(err).Error("could not verify KZG proof for sidecar")
continue
}
verifiedBlob, err := v.VerifiedROBlob()
if err != nil {
log.WithError(err).Error("could not verify RO blob")
continue
}
verifiedBlobs = append(verifiedBlobs, blocks.NewVerifiedROBlob(roBlob))
verifiedBlobs = append(verifiedBlobs, verifiedBlob)
}

return verifiedBlobs, nil
Expand Down
9 changes: 9 additions & 0 deletions beacon-chain/execution/rpc_connection.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,15 @@ func (s *Service) pollConnectionStatus(ctx context.Context) {
currClient.Close()
}
log.WithField("endpoint", logs.MaskCredentialsLogging(s.cfg.currHttpEndpoint.Url)).Info("Connected to new endpoint")

c, err := s.ExchangeCapabilities(ctx)
if err != nil {
errorLogger(err, "Could not exchange capabilities with execution client")
}
s.capabilitiesLock.Lock()
s.capabilities = c
s.capabilitiesLock.Unlock()

return
case <-s.ctx.Done():
log.Debug("Received cancelled context,closing existing powchain service")
Expand Down
4 changes: 4 additions & 0 deletions beacon-chain/execution/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import (
"github.com/prysmaticlabs/prysm/v5/beacon-chain/state"
native "github.com/prysmaticlabs/prysm/v5/beacon-chain/state/state-native"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/state/stategen"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/verification"
"github.com/prysmaticlabs/prysm/v5/config/params"
"github.com/prysmaticlabs/prysm/v5/container/trie"
contracts "github.com/prysmaticlabs/prysm/v5/contracts/deposit"
Expand Down Expand Up @@ -155,6 +156,9 @@ type Service struct {
lastReceivedMerkleIndex int64 // Keeps track of the last received index to prevent log spam.
runError error
preGenesisState state.BeaconState
capabilities []string
capabilitiesLock sync.RWMutex
blobVerifier verification.NewBlobVerifier
}

// NewService sets up a new instance with an ethclient when given a web3 endpoint as a string in the config.
Expand Down
1 change: 0 additions & 1 deletion beacon-chain/sync/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,6 @@ go_library(
"//time:go_default_library",
"//time/slots:go_default_library",
"@com_github_ethereum_go_ethereum//common/hexutil:go_default_library",
"@com_github_ethereum_go_ethereum//crypto/kzg4844:go_default_library",
"@com_github_hashicorp_golang_lru//:go_default_library",
"@com_github_libp2p_go_libp2p//core:go_default_library",
"@com_github_libp2p_go_libp2p//core/host:go_default_library",
Expand Down
13 changes: 5 additions & 8 deletions beacon-chain/sync/subscriber_beacon_blocks.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import (
"os"
"path"

"github.com/ethereum/go-ethereum/crypto/kzg4844"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/blockchain"
"github.com/prysmaticlabs/prysm/v5/beacon-chain/core/transition/interop"
"github.com/prysmaticlabs/prysm/v5/config/features"
Expand Down Expand Up @@ -79,6 +78,9 @@ func (s *Service) attemptBlobSaveAndBroadcast(ctx context.Context, block interfa
log.WithError(err).Error("Failed to reconstruct blob sidecars")
return
}
if blobSidecars == nil {
return
}

// Get indices of already existing blobs in the database to avoid duplicates
indices, err := s.cfg.blobStorage.Indices(blockRoot)
Expand All @@ -93,19 +95,14 @@ func (s *Service) attemptBlobSaveAndBroadcast(ctx context.Context, block interfa
continue // Skip if the blob already exists in the database
}

if err := kzg4844.VerifyBlobProof(kzg4844.Blob(sidecar.Blob), kzg4844.Commitment(sidecar.KzgCommitment), kzg4844.Proof(sidecar.KzgProof)); err != nil {
log.WithFields(blobFields(sidecar.ROBlob)).WithError(err).Error("Failed to verify blob proof")
continue
if err := s.cfg.p2p.BroadcastBlob(ctx, sidecar.Index, sidecar.BlobSidecar); err != nil {
log.WithFields(blobFields(sidecar.ROBlob)).WithError(err).Error("Failed to broadcast blob sidecar")
}

if err := s.cfg.chain.ReceiveBlob(ctx, sidecar); err != nil {
log.WithFields(blobFields(sidecar.ROBlob)).WithError(err).Error("Failed to receive blob")
}

if err := s.cfg.p2p.BroadcastBlob(ctx, sidecar.Index, sidecar.BlobSidecar); err != nil {
log.WithFields(blobFields(sidecar.ROBlob)).WithError(err).Error("Failed to broadcast blob sidecar")
}

blobRecoveredFromELCount.Inc()

fields := blobFields(sidecar.ROBlob)
Expand Down
2 changes: 2 additions & 0 deletions beacon-chain/verification/blob.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ var InitsyncSidecarRequirements = requirementList(GossipSidecarRequirements).exc
RequireSidecarProposerExpected,
)

var ELMemPoolRequirements = []Requirement{RequireSidecarKzgProofVerified}

// BackfillSidecarRequirements is the same as InitsyncSidecarRequirements.
var BackfillSidecarRequirements = requirementList(InitsyncSidecarRequirements).excluding()

Expand Down
23 changes: 23 additions & 0 deletions proto/engine/v1/json_marshal_unmarshal.go
Original file line number Diff line number Diff line change
Expand Up @@ -830,6 +830,11 @@ func (b BlobBundleJSON) ToProto() *BlobsBundle {
}
}

type BlobAndProofJson struct {
Blob hexutil.Bytes `json:"blobs"`
KzgProof hexutil.Bytes `json:"proofs"`
}

// MarshalJSON --
func (e *ExecutionPayloadDeneb) MarshalJSON() ([]byte, error) {
transactions := make([]hexutil.Bytes, len(e.Transactions))
Expand Down Expand Up @@ -1120,3 +1125,21 @@ func RecastHexutilByteSlice(h []hexutil.Bytes) [][]byte {
}
return r
}

// UnmarshalJSON implements the json unmarshaler interface for BlobAndProof.
func (b *BlobAndProof) UnmarshalJSON(enc []byte) error {
dec := BlobAndProofJson{}
if err := json.Unmarshal(enc, &dec); err != nil {
return err
}

blob := make([]byte, fieldparams.BlobLength)
copy(blob, dec.Blob)
b.Blob = blob

proof := make([]byte, fieldparams.BLSPubkeyLength)
copy(proof, dec.KzgProof)
b.KzgProof = proof

return nil
}

0 comments on commit d6b89e3

Please sign in to comment.