mirror of
https://github.com/OffchainLabs/prysm.git
synced 2026-01-08 23:18:15 -05:00
* refactor initialization to blocking startup method * require genesisSetter in blockchain, fix tests * work-around gazelle weirdness * fix dep gazelle ignores * only call SetGenesis once * fix typo * validator test setup and fix to return right error * move waitForChainStart to Start * wire up sync Service.genesisWaiter * fix p2p genesisWaiter plumbing * remove extra clock type, integrate into genesis and rename * use time.Now when no Nower is specified * remove unused ClockSetter * simplify rpc context checking * fix typo * use clock everywhere in sync; [32]byte val root * don't use DeepEqual to compare [32]byte and []byte * don't use clock in init sync, not wired up yet * use clock waiter in blockchain as well * use cancelable contexts in tests with goroutines * missed a reference to WithClockSetter * Update beacon-chain/startup/genesis.go Co-authored-by: Radosław Kapka <rkapka@wp.pl> * Update beacon-chain/blockchain/service_test.go Co-authored-by: Radosław Kapka <rkapka@wp.pl> * more clear docs * doc for NewClock * move clock typedef to more logical file name * adding documentation * gaz * fixes for capella * reducing test raciness * fix races in committee cache tests * lint * add tests on Duration slot math helper * startup package test coverage * fix bad merge * set non-zero genesis time in tests that call Start * happy deepsource, happy me-epsource * replace Synced event with channel * remove unused error * remove accidental wip commit * gaz! * remove unused event constants * remove sync statefeed subscription to fix deadlock * remove state notifier * fix build --------- Co-authored-by: Kasey Kirkham <kasey@users.noreply.github.com> Co-authored-by: Radosław Kapka <rkapka@wp.pl> Co-authored-by: prylabs-bulldozer[bot] <58059840+prylabs-bulldozer[bot]@users.noreply.github.com> Co-authored-by: nisdas <nishdas93@gmail.com>
78 lines
2.0 KiB
Go
78 lines
2.0 KiB
Go
package sync
|
|
|
|
import (
|
|
"github.com/libp2p/go-libp2p/core/network"
|
|
"github.com/libp2p/go-libp2p/core/protocol"
|
|
"github.com/pkg/errors"
|
|
"github.com/prysmaticlabs/prysm/v4/beacon-chain/p2p"
|
|
)
|
|
|
|
// Specifies the fixed size context length.
|
|
const forkDigestLength = 4
|
|
|
|
// writes peer's current context for the expected payload to the stream.
|
|
func writeContextToStream(objCtx []byte, stream network.Stream) error {
|
|
// The rpc context for our v2 methods is the fork-digest of
|
|
// the relevant payload. We write the associated fork-digest(context)
|
|
// into the stream for the payload.
|
|
rpcCtx, err := expectRpcContext(stream)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
// Exit early if an empty context is expected.
|
|
if !rpcCtx {
|
|
return nil
|
|
}
|
|
_, err = stream.Write(objCtx)
|
|
return err
|
|
}
|
|
|
|
// reads any attached context-bytes to the payload.
|
|
func readContextFromStream(stream network.Stream) ([]byte, error) {
|
|
hasCtx, err := expectRpcContext(stream)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if !hasCtx {
|
|
return []byte{}, nil
|
|
}
|
|
// Read context (fork-digest) from stream
|
|
b := make([]byte, forkDigestLength)
|
|
if _, err := stream.Read(b); err != nil {
|
|
return nil, err
|
|
}
|
|
return b, nil
|
|
}
|
|
|
|
func expectRpcContext(stream network.Stream) (bool, error) {
|
|
_, _, version, err := p2p.TopicDeconstructor(string(stream.Protocol()))
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
switch version {
|
|
case p2p.SchemaVersionV1:
|
|
return false, nil
|
|
case p2p.SchemaVersionV2:
|
|
return true, nil
|
|
default:
|
|
return false, errors.New("invalid version of %s registered for topic: %s")
|
|
}
|
|
}
|
|
|
|
// Minimal interface for a stream with a protocol.
|
|
type withProtocol interface {
|
|
Protocol() protocol.ID
|
|
}
|
|
|
|
// Validates that the rpc topic matches the provided version.
|
|
func validateVersion(version string, stream withProtocol) error {
|
|
_, _, streamVersion, err := p2p.TopicDeconstructor(string(stream.Protocol()))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if streamVersion != version {
|
|
return errors.Errorf("stream version of %s doesn't match provided version %s", streamVersion, version)
|
|
}
|
|
return nil
|
|
}
|