diff --git a/cmd/hermes/cmd_eth.go b/cmd/hermes/cmd_eth.go index 8e57bfd..989d682 100644 --- a/cmd/hermes/cmd_eth.go +++ b/cmd/hermes/cmd_eth.go @@ -6,7 +6,6 @@ import ( "fmt" "log/slog" - "github.com/OffchainLabs/prysm/v6/beacon-chain/core/signing" "github.com/OffchainLabs/prysm/v6/beacon-chain/p2p" "github.com/OffchainLabs/prysm/v6/beacon-chain/p2p/encoder" "github.com/OffchainLabs/prysm/v6/config/params" @@ -49,6 +48,8 @@ var ethConfig = &struct { SubnetBlobSidecarCount uint64 SubnetBlobSidecarStart uint64 SubnetBlobSidecarEnd uint64 + SubnetDataColumnsType string + SubnetDataColumnsCount uint64 SubscriptionTopics []string }{ PrivateKeyStr: "", // unset means it'll be generated @@ -65,21 +66,29 @@ var ethConfig = &struct { BootnodesURL: "", DepositContractBlockURL: "", // Default subnet configuration values. - SubnetAttestationType: "all", + SubnetAttestationType: "random", SubnetAttestationSubnets: []int64{}, - SubnetAttestationCount: 0, + SubnetAttestationCount: 2, SubnetAttestationStart: 0, SubnetAttestationEnd: 0, - SubnetSyncCommitteeType: "all", + SubnetSyncCommitteeType: "random", SubnetSyncCommitteeSubnets: []int64{}, - SubnetSyncCommitteeCount: 0, + SubnetSyncCommitteeCount: 1, SubnetSyncCommitteeStart: 0, SubnetSyncCommitteeEnd: 0, - SubnetBlobSidecarType: "all", + SubnetBlobSidecarType: "random", SubnetBlobSidecarSubnets: []int64{}, - SubnetBlobSidecarCount: 0, + SubnetBlobSidecarCount: 2, SubnetBlobSidecarStart: 0, SubnetBlobSidecarEnd: 0, + SubnetDataColumnsType: "random", + SubnetDataColumnsCount: 4, + SubscriptionTopics: []string{ + "beacon_attestations", + "beacon_block", + "sync_committee", + "data_column_sidecar", + }, } var cmdEth = &cli.Command{ @@ -313,6 +322,20 @@ var cmdEthFlags = []cli.Flag{ return nil }, }, + &cli.StringFlag{ + Name: "subnet.datacolumn.type", + EnvVars: []string{"HERMES_ETH_SUBNET_DATACOLUMN_TYPE"}, + Usage: "Subnet selection strategy for data column topics (all, random)", + Value: ethConfig.SubnetDataColumnsType, + Destination: ðConfig.SubnetDataColumnsType, + }, + &cli.Uint64Flag{ + Name: "subnet.datacolumn.count", + EnvVars: []string{"HERMES_ETH_SUBNET_DATACOLUMN_COUNT"}, + Usage: "Number of random for data columns to select when type=random", + Value: ethConfig.SubnetDataColumnsCount, + Destination: ðConfig.SubnetDataColumnsCount, + }, } func cmdEthAction(c *cli.Context) error { @@ -348,16 +371,15 @@ func cmdEthAction(c *cli.Context) error { config = c } - // Overriding configuration so that functions like ComputForkDigest take the - // correct input data from the global configuration. + // Overriding configuration so that params.ForkDigest and other functions + // use the correct network configuration. params.OverrideBeaconConfig(config.Beacon) params.OverrideBeaconNetworkConfig(config.Network) - genesisRoot := config.Genesis.GenesisValidatorRoot genesisTime := config.Genesis.GenesisTime // compute fork version and fork digest - currentSlot := slots.Since(genesisTime) + currentSlot := slots.CurrentSlot(genesisTime) currentEpoch := slots.ToEpoch(currentSlot) currentForkVersion, err := eth.GetCurrentForkVersion(currentEpoch, config.Beacon) @@ -365,10 +387,7 @@ func cmdEthAction(c *cli.Context) error { return fmt.Errorf("compute fork version for epoch %d: %w", currentEpoch, err) } - forkDigest, err := signing.ComputeForkDigest(currentForkVersion[:], genesisRoot) - if err != nil { - return fmt.Errorf("create fork digest (%s, %x): %w", genesisTime, genesisRoot, err) - } + forkDigest := params.ForkDigest(currentEpoch) cfg := ð.NodeConfig{ GenesisConfig: config.Genesis, @@ -450,7 +469,13 @@ func createSubnetConfigs() map[string]*eth.SubnetConfig { "type", ethConfig.SubnetBlobSidecarType, "config", subnetConfigs[p2p.GossipBlobSidecarMessage]) } - + // Configure das column sidecars as specified + if configureDataColumnSubnet() { + subnetConfigs[p2p.GossipDataColumnSidecarMessage] = createDataColumnSubnetConfig() + slog.Info("Configured data column subnet", + "type", ethConfig.SubnetDataColumnsType, + "config", subnetConfigs[p2p.GossipDataColumnSidecarMessage]) + } return subnetConfigs } @@ -493,6 +518,11 @@ func configureBlobSidecarSubnet() bool { return true } +// configureDataColumnSubnet checks if blob sidecar subnet configuration is provided. +func configureDataColumnSubnet() bool { + return true +} + // createAttestationSubnetConfig creates a SubnetConfig for attestation topics. func createAttestationSubnetConfig() *eth.SubnetConfig { config := ð.SubnetConfig{ @@ -574,6 +604,26 @@ func createBlobSidecarSubnetConfig() *eth.SubnetConfig { return config } +// createDataColumnSubnetConfig creates a SubnetConfig for data column topics. +func createDataColumnSubnetConfig() *eth.SubnetConfig { + // edgy case, as we need the node ID to compute the subnets (unless we subscribe to all) + // either way, compose this afterwards at the eth-chain level + config := ð.SubnetConfig{ + Type: eth.SubnetSelectionType(ethConfig.SubnetDataColumnsType), + } + switch config.Type { + case eth.SubnetAll: + config.Count = eth.GlobalBeaconConfig.DataColumnSidecarSubnetCount + case eth.SubnetRandom: + // ensure that we don't get real random subnets (we compute them at the Chain) + config.Count = ethConfig.SubnetDataColumnsCount + default: + slog.Warn("invalid type given for cgc, applying default custody of 4 data-columns") + config.Count = eth.GlobalBeaconConfig.CustodyRequirement + } + return config +} + // validateKeyFlag verifies that if a key was given it is in hex format and // can be decoded. func validateKeyFlag(c *cli.Context, s string) error { diff --git a/cmd/hermes/cmd_eth_chains.go b/cmd/hermes/cmd_eth_chains.go index 84f73f0..919b540 100644 --- a/cmd/hermes/cmd_eth_chains.go +++ b/cmd/hermes/cmd_eth_chains.go @@ -5,7 +5,6 @@ import ( "log/slog" "math" - "github.com/OffchainLabs/prysm/v6/beacon-chain/core/signing" "github.com/OffchainLabs/prysm/v6/config/params" "github.com/urfave/cli/v2" @@ -35,6 +34,10 @@ func cmdEthChainsAction(c *cli.Context) error { } slog.Info(chain) + // Override params config for this network to get correct fork digests. + params.OverrideBeaconConfig(config.Beacon) + params.OverrideBeaconNetworkConfig(config.Network) + forkVersions := [][]byte{ config.Beacon.GenesisForkVersion, config.Beacon.AltairForkVersion, @@ -42,6 +45,7 @@ func cmdEthChainsAction(c *cli.Context) error { config.Beacon.CapellaForkVersion, config.Beacon.DenebForkVersion, config.Beacon.ElectraForkVersion, + config.Beacon.FuluForkVersion, } for _, forkVersion := range forkVersions { @@ -59,10 +63,7 @@ func cmdEthChainsAction(c *cli.Context) error { continue } - digest, err := signing.ComputeForkDigest(forkVersion, config.Genesis.GenesisValidatorRoot) - if err != nil { - return err - } + digest := params.ForkDigest(epoch) slog.Info(fmt.Sprintf("- %s: 0x%x (epoch %d)", forkName, digest, epoch)) } diff --git a/cmd/hermes/cmd_op.go b/cmd/hermes/cmd_op.go index 153c746..28b1499 100644 --- a/cmd/hermes/cmd_op.go +++ b/cmd/hermes/cmd_op.go @@ -6,14 +6,13 @@ import ( "log/slog" "time" - "github.com/probe-lab/hermes/tele" - "github.com/ethereum/go-ethereum/p2p/enode" "github.com/urfave/cli/v2" "go.opentelemetry.io/otel" "github.com/probe-lab/hermes/host" "github.com/probe-lab/hermes/op" + "github.com/probe-lab/hermes/tele" ) var opConfig = &struct { diff --git a/eth/chain.go b/eth/chain.go new file mode 100644 index 0000000..d2bd579 --- /dev/null +++ b/eth/chain.go @@ -0,0 +1,455 @@ +package eth + +import ( + "context" + "encoding/hex" + "fmt" + "log/slog" + "strconv" + "sync" + "time" + + "github.com/OffchainLabs/prysm/v6/config/params" + "github.com/OffchainLabs/prysm/v6/consensus-types/primitives" + pb "github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1" + "github.com/OffchainLabs/prysm/v6/time/slots" + "github.com/ethereum/go-ethereum/p2p/enode" + + dasguardian "github.com/probe-lab/eth-das-guardian" + + "github.com/probe-lab/hermes/tele" +) + +type metadataVersion int8 +type statusVersion int8 +type chainFork int8 + +const ( + // metadata + metadataV0 metadataVersion = iota + metadataV1 + metadataV2 +) + +const ( + // status + statusV0 statusVersion = iota + statusV1 +) + +const ( + // chain fork + phase0 chainFork = iota + altair + bellatrix + capella + deneb + electra + fulu +) + +type chainUpgradeSubFn func() error + +type ChainConfig struct { + clClient *PrysmClient + + // Fork configuration for version-aware decisions + BeaconConfig *params.BeaconChainConfig + GenesisConfig *GenesisConfig + NetworkConfig *params.NetworkConfig + + // Subnets configuration + AttestationSubnetConfig *SubnetConfig + SyncSubnetConfig *SubnetConfig + ColumnSubnetConfig *SubnetConfig +} + +type Chain struct { + cfg *ChainConfig + closeC chan struct{} + + Fork chainFork + chainUpgradeSubs []chainUpgradeSubFn + + // TODO: + // - DataColumn Cache + // - Block Cache + + // ReqResp Metadata + metaDataMu sync.RWMutex + metadataHolder *MetadataHolder + statusMu sync.RWMutex + statusHolder *StatusHolder +} + +func NewChain(ctx context.Context, cfg *ChainConfig) (*Chain, error) { + chain := &Chain{ + cfg: cfg, + chainUpgradeSubs: make([]chainUpgradeSubFn, 0), + closeC: make(chan struct{}), + statusHolder: &StatusHolder{}, + metadataHolder: &MetadataHolder{}, + } + + err := chain.init(ctx) + if err != nil { + return nil, err + } + return chain, chain.epochUpdate(ctx) +} + +func (c *Chain) init(ctx context.Context) error { + slot, epoch, fork, forkDigest, err := c.epochStats() + if err != nil { + return err + } + c.Fork = fork + + // Fetch and set the BlobSchedule from Prysm for correct BPO fork digest calculation. + ctx, cancel := context.WithTimeout(ctx, 10*time.Second) + defer cancel() + if err := c.cfg.clClient.FetchAndSetBlobSchedule(ctx); err != nil { + // Continue even if this fails, as the network might not have BPO enabled. + slog.Warn("Failed to fetch BlobSchedule from Prysm", tele.LogAttrError(err)) + } + + // try to always set the highest versions (versions below can be obtained from there) + // Status + st := &pb.StatusV2{ + ForkDigest: forkDigest[:], + FinalizedRoot: []byte{}, + FinalizedEpoch: epoch - 2, // TODO: this is a very naive way of doing it (better to make some more sophisticated stuff at the API level to compose this) + HeadRoot: []byte{}, + HeadSlot: slot, + } + c.UpdateStatus(statusV1, st) + + // Metadata + md := &pb.MetaDataV2{ + SeqNumber: 0, + Attnets: BitArrayFromAttestationSubnets(c.cfg.AttestationSubnetConfig.Subnets), + Syncnets: BitArrayFromSyncSubnets(c.cfg.SyncSubnetConfig.Subnets), + CustodyGroupCount: uint64(c.cfg.ColumnSubnetConfig.Count), + } + c.UpdateMetadata(metadataV2, md) + return nil +} + +// updates the status and metadata once an epoch +func (c *Chain) epochUpdate(ctx context.Context) error { + t := time.Now() + defer func() { + slog.Debug( + "chain internal: epoch-updating", + "duration", time.Since(t), + ) + }() + // check if new hardfork + slog.Info("Getting Prysm's chain head...") + chainHead, err := c.cfg.clClient.ChainHead(ctx) + if err != nil { + return fmt.Errorf("get finalized finality checkpoints: %w", err) + } + + // -- Recompute "chain state" + // compute old status + oldStatusI := c.GetStatus(statusV1) + oldSt, _ := oldStatusI.(*pb.StatusV2) + oldEpoch := oldSt.FinalizedEpoch + oldFork := c.Fork + + // compute new status + currentSlot := slots.CurrentSlot(c.cfg.GenesisConfig.GenesisTime) + currentEpoch := slots.ToEpoch(currentSlot) + currentForkDigest := params.ForkDigest(currentEpoch) + currentFork := c.forkFromEpoch(currentEpoch) + c.statusMu.Lock() + c.Fork = currentFork + slog.Info( + "chain set to", + "fork", c.Fork, + "head-slot", currentSlot, + ) + c.statusMu.Unlock() + + // recompute the status + newSt := &pb.StatusV2{ + ForkDigest: currentForkDigest[:], + FinalizedRoot: chainHead.FinalizedBlockRoot, + FinalizedEpoch: chainHead.FinalizedEpoch, + HeadRoot: chainHead.HeadBlockRoot, + HeadSlot: chainHead.HeadSlot, + EarliestAvailableSlot: chainHead.HeadSlot, + } + c.UpdateStatus(statusV1, newSt) + + // recompute the metadata (if needed) - for now, no changes are expected + + // notify of any update to whoever needs it + notifyNewFork := (currentEpoch > oldEpoch && currentFork > oldFork) + if notifyNewFork { + for _, notFn := range c.chainUpgradeSubs { + if err := notFn(); err != nil { + slog.Error( + "error notifying sub of new fork", + "error", err.Error(), + ) + } + } + } + + return nil +} + +func (c *Chain) epochStats() (primitives.Slot, primitives.Epoch, chainFork, [4]byte, error) { + if c.cfg.BeaconConfig == nil || c.cfg.GenesisConfig == nil { + return 0, 0, phase0, [4]byte{}, fmt.Errorf("chain internals doest have beacon config") + } + var ( + slot = slots.CurrentSlot(c.cfg.GenesisConfig.GenesisTime) + epoch = slots.ToEpoch(slot) + forkDigest = params.ForkDigest(epoch) + ) + + return slot, epoch, c.forkFromEpoch(epoch), forkDigest, nil +} + +func (c *Chain) forkFromEpoch(epoch primitives.Epoch) chainFork { + var fork = phase0 + if c.cfg.BeaconConfig.FuluForkEpoch != params.BeaconConfig().FarFutureEpoch && epoch >= c.cfg.BeaconConfig.FuluForkEpoch { + fork = fulu + } else if c.cfg.BeaconConfig.ElectraForkEpoch != params.BeaconConfig().FarFutureEpoch && epoch >= c.cfg.BeaconConfig.ElectraForkEpoch { + fork = electra + } else if c.cfg.BeaconConfig.DenebForkEpoch != params.BeaconConfig().FarFutureEpoch && epoch >= c.cfg.BeaconConfig.DenebForkEpoch { + fork = deneb + } else if c.cfg.BeaconConfig.CapellaForkEpoch != params.BeaconConfig().FarFutureEpoch && epoch >= c.cfg.BeaconConfig.CapellaForkEpoch { + fork = capella + } else if c.cfg.BeaconConfig.BellatrixForkEpoch != params.BeaconConfig().FarFutureEpoch && epoch >= c.cfg.BeaconConfig.BellatrixForkEpoch { + fork = bellatrix + } else if c.cfg.BeaconConfig.AltairForkEpoch != params.BeaconConfig().FarFutureEpoch && epoch >= c.cfg.BeaconConfig.AltairForkEpoch { + fork = altair + } + return fork +} + +func (c *Chain) Serve(ctx context.Context) error { + // launch internal loop + defer func() { + slog.Info("chain internal loop closing up") + }() + for { + select { + // Epoch iteration: + case <-time.After(384 * time.Second): + slog.Info("chian internal: new chain epoch...") + err := c.epochUpdate(ctx) + if err != nil { + slog.Error( + "chain internal epoch update reported error", + "error", err.Error(), + ) + } + + case <-c.closeC: + fmt.Println("CLOOOOSED") + slog.Info("chain internal deteceted close order") + return nil + + case <-ctx.Done(): + fmt.Println("CONTEXT DIED") + slog.Info("chain internal loop detected shutdown") + return nil + } + } +} + +func (c *Chain) Close() error { + select { + case <-time.After(10 * time.Second): + return fmt.Errorf("chain internal: unable to close internal loop") + + case c.closeC <- struct{}{}: + return nil + } +} + +func (c *Chain) RegisterChainUpgrade(fn chainUpgradeSubFn) { + c.chainUpgradeSubs = append(c.chainUpgradeSubs, fn) +} + +func (c *Chain) GetMetadata(v metadataVersion) any { + c.metaDataMu.RLock() + defer c.metaDataMu.RUnlock() + switch v { + case metadataV0: + return &pb.MetaDataV0{ + SeqNumber: c.metadataHolder.SeqNumber(), + Attnets: c.metadataHolder.Attnets(), + } + case metadataV1: + syncnets, ok := c.metadataHolder.Syncnets() + if !ok { + slog.Warn("chain internal: MetadataV1 was requested but there was no info about syncnets") + } + return &pb.MetaDataV1{ + SeqNumber: c.metadataHolder.SeqNumber(), + Attnets: c.metadataHolder.Attnets(), + Syncnets: syncnets, + } + case metadataV2: + syncnets, ok := c.metadataHolder.Syncnets() + if !ok { + slog.Warn("chain internal: MetadataV2 was requested but there was no info about syncnets") + } + cgc, ok := c.metadataHolder.CustodyGroupCount() + if !ok { + slog.Warn("chain internal: MetadataV2 was requested but there was no info about cgc") + } + return &pb.MetaDataV2{ + SeqNumber: c.metadataHolder.SeqNumber(), + Attnets: c.metadataHolder.Attnets(), + Syncnets: syncnets, + CustodyGroupCount: cgc, + } + default: + slog.Error( + "chain internal: invalid metadata version", + "version", v+1, + ) + return nil + } +} + +func (c *Chain) GetStatus(v statusVersion) any { + c.statusMu.RLock() + defer c.statusMu.RUnlock() + switch v { + case statusV0: + return &pb.Status{ + ForkDigest: c.statusHolder.ForkDigest(), + FinalizedRoot: c.statusHolder.FinalizedRoot(), + FinalizedEpoch: c.statusHolder.FinalizedEpoch(), + HeadRoot: c.statusHolder.HeadRoot(), + HeadSlot: c.statusHolder.HeadSlot(), + } + case statusV1: + eas, ok := c.statusHolder.EarliestAvailableSlot() + if !ok { + slog.Warn("chain internal: StatusV2 was requested but there was no info about eas") + eas = c.statusHolder.HeadSlot() + } + return &pb.StatusV2{ + ForkDigest: c.statusHolder.ForkDigest(), + FinalizedRoot: c.statusHolder.FinalizedRoot(), + FinalizedEpoch: c.statusHolder.FinalizedEpoch(), + HeadRoot: c.statusHolder.HeadRoot(), + HeadSlot: c.statusHolder.HeadSlot(), + EarliestAvailableSlot: eas, + } + default: + slog.Error( + "chain internal: invalid status version", + "version", v+1, + ) + return nil + } +} + +func (c *Chain) UpdateStatus(v statusVersion, st any) error { + c.statusMu.Lock() + defer c.statusMu.Unlock() + switch v { + case statusV1, statusV0: + st1, ok := st.(*pb.StatusV2) + if !ok { + return fmt.Errorf("chain internal: status-update: invalid type for md version %d", v+1) + } + // always mirror the headslot at the eas + st1.EarliestAvailableSlot = st1.HeadSlot + c.statusHolder.SetV2(st1) + + slog.Info("New status V1:") + slog.Info(" fork_digest: " + hex.EncodeToString(st1.ForkDigest)) + slog.Info(" finalized_root: " + hex.EncodeToString(st1.FinalizedRoot)) + slog.Info(" finalized_epoch: " + strconv.FormatUint(uint64(st1.FinalizedEpoch), 10)) + slog.Info(" head_root: " + hex.EncodeToString(st1.HeadRoot)) + slog.Info(" head_slot: " + strconv.FormatUint(uint64(st1.HeadSlot), 10)) + slog.Info(" eas: " + strconv.FormatUint(uint64(st1.EarliestAvailableSlot), 10)) + return nil + + default: + return fmt.Errorf("chain internal: status-update: invalid status version %d", v+1) + } +} + +func (c *Chain) UpdateMetadata(v metadataVersion, md any) error { + // we won't really change our metadata while running hermes + c.metaDataMu.Lock() + defer c.metaDataMu.Unlock() + seq := c.metadataHolder.SeqNumber() + 1 + switch v { + // we only update using the v2 metadata, the request handler already takes care of the rest + case metadataV2, metadataV1, metadataV0: + md2, ok := md.(*pb.MetaDataV2) + if !ok { + return fmt.Errorf("chain internal: metadata-update: invalid type for md version %d", v+1) + } + md2.SeqNumber = seq + c.metadataHolder.SetV2(md2) + slog.Info("Composed local MetaData V2") + slog.Info(" fork_version" + strconv.FormatInt(int64(v)+1, 10)) + slog.Info(" attnets" + hex.EncodeToString(md2.Attnets.Bytes())) + slog.Info(" syncnets" + hex.EncodeToString(md2.Syncnets.Bytes())) + slog.Info(" custody_group_count" + strconv.FormatInt(int64(md2.CustodyGroupCount), 10)) + return nil + + default: + return fmt.Errorf("chain internal: metadata-update: invalid metadata version %d", v+1) + } +} + +func (c *Chain) IsInit() (bool, string) { + c.statusMu.RLock() + defer c.statusMu.RUnlock() + if c.statusHolder == nil || (c.statusHolder.GetV1() == nil && c.statusHolder.GetV2() == nil) { + return false, "chain status is nil" + } + + c.metaDataMu.RLock() + defer c.metaDataMu.RUnlock() + if c.metadataHolder == nil || (c.metadataHolder.GetV0() == nil && c.metadataHolder.GetV1() == nil && c.metadataHolder.GetV2() == nil) { + return false, "chain metadata is nil" + } + + return true, "" +} + +func (c *Chain) CurrentSeqNumber() primitives.SSZUint64 { + c.metaDataMu.RLock() + defer c.metaDataMu.RUnlock() + return primitives.SSZUint64(c.metadataHolder.SeqNumber()) +} + +func (c *Chain) CurrentForkDigest() [4]byte { + return [4]byte(c.statusHolder.ForkDigest()) +} + +func (c *Chain) CurrentFork() chainFork { + c.statusMu.RLock() + defer c.statusMu.RUnlock() + return c.Fork +} + +func (c *Chain) GetColumnCustodySubnets(nodeId enode.ID) []uint64 { + var err error + c.cfg.ColumnSubnetConfig.Subnets, err = dasguardian.CustodyColumnSubnetsSlice(nodeId, c.cfg.ColumnSubnetConfig.Count, c.cfg.BeaconConfig.DataColumnSidecarSubnetCount) + if err != nil { + slog.Error( + "error computing the custody of our node", + "node-id", nodeId.GoString(), + "cgc", c.cfg.ColumnSubnetConfig.Count, + "error", err.Error(), + ) + } + return c.cfg.ColumnSubnetConfig.Subnets +} diff --git a/eth/discovery.go b/eth/discovery.go index 9ceb8ba..da7dd31 100644 --- a/eth/discovery.go +++ b/eth/discovery.go @@ -9,7 +9,6 @@ import ( "log/slog" "net" - "github.com/OffchainLabs/prysm/v6/network/forks" pb "github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1" "github.com/ethereum/go-ethereum/crypto/secp256k1" "github.com/ethereum/go-ethereum/p2p/discover" @@ -31,7 +30,8 @@ type Discovery struct { cfg *DiscoveryConfig pk *ecdsa.PrivateKey node *enode.LocalNode - out chan *DiscoveredPeer + + out chan *DiscoveredPeer // Metrics MeterDiscoveredPeers metric.Int64Counter @@ -56,6 +56,7 @@ func NewDiscovery(privKey *ecdsa.PrivateKey, cfg *DiscoveryConfig) (*Discovery, localNode.Set(enr.TCP(cfg.TCPPort)) localNode.Set(cfg.enrAttnetsEntry()) localNode.Set(cfg.enrSyncnetsEntry()) + localNode.Set(cfg.enrCustodyEntry()) localNode.SetFallbackIP(ip) localNode.SetFallbackUDP(cfg.TCPPort) @@ -66,19 +67,24 @@ func NewDiscovery(privKey *ecdsa.PrivateKey, cfg *DiscoveryConfig) (*Discovery, localNode.Set(enrEth2Entry) - slog.Info("Initialized new enode", - "id", localNode.ID().String(), - "ip", localNode.Node().IP().String(), - "tcp", localNode.Node().TCP(), - "udp", localNode.Node().UDP(), - ) - d := &Discovery{ cfg: cfg, pk: privKey, node: localNode, out: make(chan *DiscoveredPeer), } + cfg.Chain.RegisterChainUpgrade(d.forkUpdateSubs) + + slog.Info("Initialized new enode", + "id", localNode.ID().String(), + "ip", localNode.Node().IP().String(), + "tcp", localNode.Node().TCP(), + "udp", localNode.Node().UDP(), + "attnets", cfg.Chain.cfg.AttestationSubnetConfig.Subnets, + "syncnets", cfg.Chain.cfg.SyncSubnetConfig.Subnets, + "cgc", cfg.Chain.cfg.ColumnSubnetConfig.Count, + "columns", cfg.Chain.GetColumnCustodySubnets(localNode.ID()), + ) d.MeterDiscoveredPeers, err = cfg.Meter.Int64Counter("discovered_peers", metric.WithDescription("Total number of discovered peers")) if err != nil { @@ -93,14 +99,7 @@ func (d *Discovery) Serve(ctx context.Context) (err error) { defer slog.Info("Stopped disv5 Discovery Service") defer func() { err = terminateSupervisorTreeOnErr(err) }() - genesisRoot := d.cfg.GenesisConfig.GenesisValidatorRoot - genesisTime := d.cfg.GenesisConfig.GenesisTime - - digest, err := forks.CreateForkDigest(genesisTime, genesisRoot) - if err != nil { - return fmt.Errorf("create fork digest (%s, %x): %w", genesisTime, genesisRoot, err) - } - + _, _, _, forkDigest, err := d.cfg.Chain.epochStats() ip := net.ParseIP(d.cfg.Addr) var bindIP net.IP @@ -179,7 +178,7 @@ func (d *Discovery) Serve(ctx context.Context) (err error) { continue } sszEncodedForkEntry := make([]byte, 16) - entry := enr.WithEntry(d.cfg.NetworkConfig.ETH2Key, &sszEncodedForkEntry) + entry := enr.WithEntry("eth2", &sszEncodedForkEntry) if err = node.Record().Load(entry); err != nil { // failed reading eth2 enr entry, likely because it doesn't exist continue @@ -191,7 +190,7 @@ func (d *Discovery) Serve(ctx context.Context) (err error) { continue } - if !bytes.Equal(forkEntry.CurrentForkDigest, digest[:]) { + if !bytes.Equal(forkEntry.CurrentForkDigest, forkDigest[:]) { // irrelevant network continue } @@ -214,6 +213,28 @@ func (d *Discovery) Serve(ctx context.Context) (err error) { } } +func (d *Discovery) forkUpdateSubs() error { + // update the enr entry with the new fork + enrEth2Entry, err := d.cfg.enrEth2Entry() + if err != nil { + return fmt.Errorf("build enr fork entry: %w", err) + } + + d.node.Set(enrEth2Entry) + + slog.Info("Initialized new enode", + "seq", d.node.Seq(), + "id", d.node.ID().String(), + "ip", d.node.Node().IP().String(), + "tcp", d.node.Node().TCP(), + "udp", d.node.Node().UDP(), + "attnets", d.cfg.Chain.cfg.AttestationSubnetConfig.Subnets, + "syncnets", d.cfg.Chain.cfg.SyncSubnetConfig.Subnets, + "cgc", len(d.cfg.Chain.cfg.ColumnSubnetConfig.Subnets), + ) + return nil +} + type DiscoveredPeer struct { AddrInfo peer.AddrInfo ENR *enode.Node diff --git a/eth/discovery_config.go b/eth/discovery_config.go index c75d515..6fc8c08 100644 --- a/eth/discovery_config.go +++ b/eth/discovery_config.go @@ -4,27 +4,24 @@ import ( "fmt" "github.com/OffchainLabs/prysm/v6/config/params" - "github.com/OffchainLabs/prysm/v6/network/forks" + "github.com/OffchainLabs/prysm/v6/consensus-types/primitives" pb "github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1" - "github.com/OffchainLabs/prysm/v6/time/slots" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/ethereum/go-ethereum/p2p/enr" "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/trace" + + dasguardian "github.com/probe-lab/eth-das-guardian" ) type DiscoveryConfig struct { - GenesisConfig *GenesisConfig - NetworkConfig *params.NetworkConfig - Addr string UDPPort int TCPPort int Tracer trace.Tracer Meter metric.Meter - AttestationSubnetConfig *SubnetConfig - SyncSubnetConfig *SubnetConfig + Chain *Chain } // enrEth2Entry generates an Ethereum 2.0 entry for the Ethereum Node Record @@ -33,24 +30,21 @@ type DiscoveryConfig struct { // byte slice. Finally, it returns an ENR entry with the eth2 key and the // encoded fork information. func (d *DiscoveryConfig) enrEth2Entry() (enr.Entry, error) { - genesisRoot := d.GenesisConfig.GenesisValidatorRoot - genesisTime := d.GenesisConfig.GenesisTime + var ( + _, currentEpoch, _, forkDigest, err = d.Chain.epochStats() + nextEntry = params.NextNetworkScheduleEntry(currentEpoch) + nextForkVersion [4]byte + nextForkEpoch primitives.Epoch + ) - digest, err := forks.CreateForkDigest(genesisTime, genesisRoot) - if err != nil { - return nil, fmt.Errorf("create fork digest (%s, %x): %w", genesisTime, genesisRoot, err) - } - - currentSlot := slots.Since(genesisTime) - currentEpoch := slots.ToEpoch(currentSlot) - - nextForkVersion, nextForkEpoch, err := forks.NextForkData(currentEpoch) - if err != nil { - return nil, fmt.Errorf("calculate next fork data: %w", err) + // Is there another fork coming up? + if nextEntry.Epoch > currentEpoch { + copy(nextForkVersion[:], nextEntry.ForkVersion[:]) + nextForkEpoch = nextEntry.Epoch } enrForkID := &pb.ENRForkID{ - CurrentForkDigest: digest[:], + CurrentForkDigest: forkDigest[:], NextForkVersion: nextForkVersion[:], NextForkEpoch: nextForkEpoch, } @@ -60,22 +54,26 @@ func (d *DiscoveryConfig) enrEth2Entry() (enr.Entry, error) { return nil, fmt.Errorf("marshal enr fork id: %w", err) } - return enr.WithEntry(d.NetworkConfig.ETH2Key, enc), nil + return enr.WithEntry("eth2", enc), nil } func (d *DiscoveryConfig) enrAttnetsEntry() enr.Entry { - bitV := BitArrayFromAttestationSubnets(d.AttestationSubnetConfig.Subnets) - return enr.WithEntry(d.NetworkConfig.AttSubnetKey, bitV.Bytes()) + bitV := BitArrayFromAttestationSubnets(d.Chain.cfg.AttestationSubnetConfig.Subnets) + return enr.WithEntry(d.Chain.cfg.NetworkConfig.AttSubnetKey, bitV.Bytes()) } func (d *DiscoveryConfig) enrSyncnetsEntry() enr.Entry { - bitV := BitArrayFromSyncSubnets(d.SyncSubnetConfig.Subnets) - return enr.WithEntry(d.NetworkConfig.SyncCommsSubnetKey, bitV.Bytes()) + bitV := BitArrayFromSyncSubnets(d.Chain.cfg.SyncSubnetConfig.Subnets) + return enr.WithEntry(d.Chain.cfg.NetworkConfig.SyncCommsSubnetKey, bitV.Bytes()) +} + +func (d *DiscoveryConfig) enrCustodyEntry() enr.Entry { + return dasguardian.CgcEntry(d.Chain.cfg.ColumnSubnetConfig.Count) } func (d *DiscoveryConfig) BootstrapNodes() ([]*enode.Node, error) { - nodes := make([]*enode.Node, 0, len(d.NetworkConfig.BootstrapNodes)) - for _, enrStr := range d.NetworkConfig.BootstrapNodes { + nodes := make([]*enode.Node, 0, len(d.Chain.cfg.NetworkConfig.BootstrapNodes)) + for _, enrStr := range d.Chain.cfg.NetworkConfig.BootstrapNodes { node, err := enode.Parse(enode.ValidSchemes, enrStr) if err != nil { return nil, fmt.Errorf("parse bootstrap enr: %w", err) diff --git a/eth/genesis.go b/eth/genesis.go index 3afbe7c..9ff273b 100644 --- a/eth/genesis.go +++ b/eth/genesis.go @@ -5,7 +5,6 @@ import ( "fmt" "time" - "github.com/OffchainLabs/prysm/v6/beacon-chain/core/signing" "github.com/OffchainLabs/prysm/v6/config/params" "github.com/OffchainLabs/prysm/v6/consensus-types/primitives" ) @@ -25,6 +24,7 @@ var ( CapellaForkVersion ForkVersion DenebForkVersion ForkVersion ElectraForkVersion ForkVersion + FuluForkVersion ForkVersion GlobalBeaconConfig = params.MainnetConfig() // init with Mainnet (we would override if needed) ) @@ -37,6 +37,7 @@ func initNetworkForkVersions(beaconConfig *params.BeaconChainConfig) { CapellaForkVersion = ForkVersion(beaconConfig.CapellaForkVersion) DenebForkVersion = ForkVersion(beaconConfig.DenebForkVersion) ElectraForkVersion = ForkVersion(beaconConfig.ElectraForkVersion) + FuluForkVersion = ForkVersion(beaconConfig.FuluForkVersion) GlobalBeaconConfig = beaconConfig } @@ -96,38 +97,27 @@ func GetCurrentForkVersion(epoch primitives.Epoch, beaconConfg *params.BeaconCha case epoch < beaconConfg.ElectraForkEpoch: return [4]byte(beaconConfg.DenebForkVersion), nil - case epoch >= beaconConfg.ElectraForkEpoch: + case epoch < beaconConfg.FuluForkEpoch: return [4]byte(beaconConfg.ElectraForkVersion), nil + case epoch >= beaconConfg.FuluForkEpoch: + return [4]byte(beaconConfg.FuluForkVersion), nil + default: return [4]byte{}, fmt.Errorf("not recognized case for epoch %d", epoch) } } +// GetForkVersionFromForkDigest returns the fork version for a given fork digest. +// This function is BPO-aware as it uses params.ForkDataFromDigest which handles +// the network schedule including BPO phases for Fulu+. func GetForkVersionFromForkDigest(forkD [4]byte) (forkV ForkVersion, err error) { - genesisRoot := GenesisConfigs[GlobalBeaconConfig.ConfigName].GenesisValidatorRoot - phase0D, _ := signing.ComputeForkDigest(Phase0ForkVersion[:], genesisRoot) - altairD, _ := signing.ComputeForkDigest(AltairForkVersion[:], genesisRoot) - bellatrixD, _ := signing.ComputeForkDigest(BellatrixForkVersion[:], genesisRoot) - capellaD, _ := signing.ComputeForkDigest(CapellaForkVersion[:], genesisRoot) - denebD, _ := signing.ComputeForkDigest(DenebForkVersion[:], genesisRoot) - electraD, _ := signing.ComputeForkDigest(ElectraForkVersion[:], genesisRoot) - switch forkD { - case phase0D: - forkV = Phase0ForkVersion - case altairD: - forkV = AltairForkVersion - case bellatrixD: - forkV = BellatrixForkVersion - case capellaD: - forkV = CapellaForkVersion - case denebD: - forkV = DenebForkVersion - case electraD: - forkV = ElectraForkVersion - default: - forkV = ForkVersion{} - err = fmt.Errorf("not recognized fork_version for (%s)", hex.EncodeToString([]byte(forkD[:]))) + // Use params.ForkDataFromDigest which is BPO-aware and handles all fork digests + // including those modified by BPO schedule in Fulu+ + version, _, err := params.ForkDataFromDigest(forkD) + if err != nil { + return ForkVersion{}, fmt.Errorf("fork digest %s not found in network schedule", hex.EncodeToString(forkD[:])) } - return forkV, err + + return version, nil } diff --git a/eth/network_config.go b/eth/network_config.go index 658fc9c..f72a3a3 100644 --- a/eth/network_config.go +++ b/eth/network_config.go @@ -62,6 +62,7 @@ func DeriveKnownNetworkConfig(ctx context.Context, network string) (*NetworkConf CapellaForkVersion: []byte{0x03, 0x00, 0x00, 0x64}, DenebForkVersion: []byte{0x04, 0x00, 0x00, 0x64}, ElectraForkVersion: []byte{0x05, 0x00, 0x00, 0x64}, + FuluForkVersion: []byte{0x06, 0x00, 0x00, 0x64}, ForkVersionSchedule: map[[4]byte]primitives.Epoch{ {0x00, 0x00, 0x00, 0x64}: primitives.Epoch(0), {0x01, 0x00, 0x00, 0x64}: primitives.Epoch(512), diff --git a/eth/node.go b/eth/node.go index 5e81eaf..b2c248e 100644 --- a/eth/node.go +++ b/eth/node.go @@ -9,7 +9,6 @@ import ( "time" "github.com/OffchainLabs/prysm/v6/beacon-chain/p2p" - eth "github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1" "github.com/aws/aws-sdk-go-v2/service/kinesis" gk "github.com/dennis-tra/go-kinesis" pubsub "github.com/libp2p/go-libp2p-pubsub" @@ -44,6 +43,9 @@ type Node struct { // A custom client to use various Prysm APIs pryClient *PrysmClient + // The reference point to ask for the latest chian updates (forks, head, status, metadata, etc) + chain *Chain + // The request/response protocol handlers as well as some client methods reqResp *ReqResp @@ -56,7 +58,7 @@ type Node struct { // The discovery service, periodically querying the discv5 DHT network disc *Discovery - // Metrics + // MetricTasks connCount metric.Int64ObservableGauge connDurHist metric.Float64Histogram connBeacon metric.Int64ObservableGauge @@ -173,22 +175,10 @@ func NewNode(cfg *NodeConfig) (*Node, error) { if !ok { syncConfig = new(SubnetConfig) } - - disc, err := NewDiscovery(privKey, &DiscoveryConfig{ - GenesisConfig: cfg.GenesisConfig, - NetworkConfig: cfg.NetworkConfig, - AttestationSubnetConfig: attConfig, - SyncSubnetConfig: syncConfig, - Addr: cfg.Devp2pHost, - UDPPort: cfg.Devp2pPort, - TCPPort: cfg.Libp2pPort, - Tracer: cfg.Tracer, - Meter: cfg.Meter, - }) - if err != nil { - return nil, fmt.Errorf("new discovery service: %w", err) + columConfig, ok := cfg.SubnetConfigs[p2p.GossipDataColumnSidecarMessage] + if !ok { + columConfig = new(SubnetConfig) } - slog.Info("Initialized new devp2p Node", "enr", disc.node.Node().String()) // initialize the custom Prysm client to communicate with its API pryClient, err := NewPrysmClientWithTLS(cfg.PrysmHost, cfg.PrysmPortHTTP, cfg.PrysmPortGRPC, cfg.PrysmUseTLS, cfg.DialTimeout, cfg.GenesisConfig) @@ -206,17 +196,43 @@ func NewNode(cfg *NodeConfig) (*Node, error) { return nil, fmt.Errorf("prysm client not in correct fork_digest") } - // initialize the request-response protocol handlers - reqRespCfg := &ReqRespConfig{ - ForkDigest: cfg.ForkDigest, - Encoder: cfg.RPCEncoder, + // init the Chain module + chainCfg := &ChainConfig{ + clClient: pryClient, + BeaconConfig: cfg.BeaconConfig, + GenesisConfig: cfg.GenesisConfig, + NetworkConfig: cfg.NetworkConfig, AttestationSubnetConfig: attConfig, SyncSubnetConfig: syncConfig, - DataStream: ds, - ReadTimeout: cfg.BeaconConfig.TtfbTimeoutDuration(), - WriteTimeout: cfg.BeaconConfig.RespTimeoutDuration(), - Tracer: cfg.Tracer, - Meter: cfg.Meter, + ColumnSubnetConfig: columConfig, + } + chain, err := NewChain(ctx, chainCfg) + if err != nil { + return nil, fmt.Errorf("new chain module %w", err) + } + + disc, err := NewDiscovery(privKey, &DiscoveryConfig{ + Chain: chain, + Addr: cfg.Devp2pHost, + UDPPort: cfg.Devp2pPort, + TCPPort: cfg.Libp2pPort, + Tracer: cfg.Tracer, + Meter: cfg.Meter, + }) + if err != nil { + return nil, fmt.Errorf("new discovery service: %w", err) + } + slog.Info("Initialized new devp2p Node", "enr", disc.node.Node().String()) + + // initialize the request-response protocol handlers + reqRespCfg := &ReqRespConfig{ + Encoder: cfg.RPCEncoder, + DataStream: ds, + Chain: chain, + ReadTimeout: cfg.BeaconConfig.TtfbTimeoutDuration(), + WriteTimeout: cfg.BeaconConfig.RespTimeoutDuration(), + Tracer: cfg.Tracer, + Meter: cfg.Meter, } reqResp, err := NewReqResp(h, reqRespCfg) @@ -224,13 +240,11 @@ func NewNode(cfg *NodeConfig) (*Node, error) { return nil, fmt.Errorf("new p2p server: %w", err) } - // initialize the pubsub topic handlers pubSubConfig := &PubSubConfig{ + Chain: chain, Topics: cfg.getDesiredFullTopics(cfg.GossipSubMessageEncoder), - ForkVersion: cfg.ForkVersion, Encoder: cfg.GossipSubMessageEncoder, SecondsPerSlot: time.Duration(cfg.BeaconConfig.SecondsPerSlot) * time.Second, - GenesisTime: cfg.GenesisConfig.GenesisTime, DataStream: ds, } @@ -238,6 +252,7 @@ func NewNode(cfg *NodeConfig) (*Node, error) { if err != nil { return nil, fmt.Errorf("new PubSub service: %w", err) } + // Create a new Blacklisting map // This is to prevent the node from connecting at the GossipSub level withe trusted Prysm node blacklistMap := pubsub.NewMapBlacklist() @@ -246,6 +261,7 @@ func NewNode(cfg *NodeConfig) (*Node, error) { n := &Node{ cfg: cfg, host: h, + chain: chain, pubsubBlacklist: blacklistMap, ds: ds, sup: suture.NewSimple("eth"), @@ -383,39 +399,16 @@ func (n *Node) Start(ctx context.Context) error { return fmt.Errorf("get prysm node p2p addr info: %w", err) } // Once the Prysm node has been identified, ensure we blacklist it at the pubsub level - n.pubsubBlacklist.Add(addrInfo.ID) // check if Prysm is valid + n.pubsubBlacklist.Add(addrInfo.ID) slog.Info("Prysm P2P Identity:", tele.LogAttrPeerID(addrInfo.ID)) for i, maddr := range addrInfo.Addrs { slog.Info(fmt.Sprintf(" [%d] %s", i, maddr.String())) } - // cache the address information on the node n.pryInfo = addrInfo n.reqResp.delegate = addrInfo.ID - // Now we have the beacon node's identity. The next thing we need is its - // current status. The status consists of the ForkDigest, FinalizedRoot, - // FinalizedEpoch, HeadRoot, and HeadSlot. We need the status so that we - // can reply with it upon status requests. This is just need for - // bootstrapping purposes. Subsequent Status requests will be forwarded to - // the beacon node, and the response will then be recorded and used from - // then on in the future. - slog.Info("Getting Prysm's chain head...") - chainHead, err := n.pryClient.ChainHead(ctx) - if err != nil { - return fmt.Errorf("get finalized finality checkpoints: %w", err) - } - - status := ð.Status{ - ForkDigest: n.cfg.ForkDigest[:], - FinalizedRoot: chainHead.FinalizedBlockRoot, - FinalizedEpoch: chainHead.FinalizedEpoch, - HeadRoot: chainHead.HeadBlockRoot, - HeadSlot: chainHead.HeadSlot, - } - n.reqResp.SetStatus(status) - // Set stream handlers on our libp2p host if err := n.reqResp.RegisterHandlers(ctx); err != nil { return fmt.Errorf("register RPC handlers: %w", err) @@ -426,7 +419,6 @@ func (n *Node) Start(ctx context.Context) error { if err != nil { return fmt.Errorf("fetch active validators: %w", err) } - // initialize GossipSub n.pubSub.gs, err = n.host.InitGossipSub(ctx, n.cfg.pubsubOptions(n, actVals)...) if err != nil { @@ -491,6 +483,9 @@ func (n *Node) Start(ctx context.Context) error { // protect connection to beacon node so that it's not pruned at some point n.host.ConnManager().Protect(addrInfo.ID, "hermes") + // start the chain module + n.sup.Add(n.chain) + // start the discovery service to find peers in the discv5 DHT n.sup.Add(n.disc) diff --git a/eth/node_config.go b/eth/node_config.go index 7687df9..8440055 100644 --- a/eth/node_config.go +++ b/eth/node_config.go @@ -477,6 +477,7 @@ func desiredPubSubBaseTopics() []string { p2p.GossipSyncCommitteeMessage, p2p.GossipBlsToExecutionChangeMessage, p2p.GossipBlobSidecarMessage, + p2p.GossipDataColumnSidecarMessage, } } @@ -512,6 +513,9 @@ func topicFormatFromBase(topicBase string) (string, error) { case p2p.GossipBlobSidecarMessage: return p2p.BlobSubnetTopicFormat, nil + case p2p.GossipDataColumnSidecarMessage: + return p2p.DataColumnSubnetTopicFormat, nil + default: return "", fmt.Errorf("unrecognized gossip topic base: %s", topicBase) } diff --git a/eth/node_notifiee.go b/eth/node_notifiee.go index ae279fb..08bbd7b 100644 --- a/eth/node_notifiee.go +++ b/eth/node_notifiee.go @@ -5,6 +5,7 @@ import ( "encoding/hex" "log/slog" "slices" + "strconv" "strings" "time" @@ -87,18 +88,54 @@ func (n *Node) handleNewConnection(pid peer.ID) { ps := n.host.Peerstore() var ( - err error - st *pb.Status - md *pb.MetaDataV1 + err error + forkDigest []byte + headSlot uint64 + attnets []byte + seqNum uint64 ) - st, err = n.reqResp.Status(ctx, pid) + + currentFork := n.chain.CurrentFork() + switch currentFork { + case phase0, altair, bellatrix, capella, deneb, electra: + var st *pb.Status + st, err = n.reqResp.Status(ctx, pid) + if err == nil { + forkDigest = st.ForkDigest + headSlot = uint64(st.HeadSlot) + } + case fulu: + var st *pb.StatusV2 + st, err = n.reqResp.StatusV2(ctx, pid) + if err == nil { + forkDigest = st.ForkDigest + headSlot = uint64(st.HeadSlot) + } + } if err != nil { valid = false } else { if err = n.reqResp.Ping(ctx, pid); err != nil { valid = false } else { - md, err = n.reqResp.MetaData(ctx, pid) + switch currentFork { + case phase0: + slog.Warn("too old, metadata v0 not supported") + case altair, bellatrix, capella, deneb, electra: + var md *pb.MetaDataV1 + md, err = n.reqResp.MetaDataV1(ctx, pid) + if err == nil { + attnets = md.Attnets.Bytes() + seqNum = md.SeqNumber + } + case fulu: + var md *pb.MetaDataV2 + md, err = n.reqResp.MetaDataV2(ctx, pid) + if err == nil { + attnets = md.Attnets.Bytes() + seqNum = md.SeqNumber + } + } if err != nil { valid = false } else { @@ -111,7 +148,14 @@ func (n *Node) handleNewConnection(pid peer.ID) { slog.Warn("Failed to store handshaked marker in peerstore", tele.LogAttrError(err)) } - slog.Info("Performed successful handshake", tele.LogAttrPeerID(pid), "seq", md.SeqNumber, "attnets", hex.EncodeToString(md.Attnets.Bytes()), "agent", av, "fork-digest", hex.EncodeToString(st.ForkDigest)) + slog.Info( + "Performed successful handshake", + tele.LogAttrPeerID(pid), + "head-slot", strconv.FormatUint(headSlot, 10), + "seq", seqNum, + "attnets", hex.EncodeToString(attnets), + "agent", av, + "fork-digest", hex.EncodeToString(forkDigest)) } } } diff --git a/eth/output_full.go b/eth/output_full.go index b4764d3..aaa9b00 100644 --- a/eth/output_full.go +++ b/eth/output_full.go @@ -40,6 +40,11 @@ type TraceEventElectraBlock struct { Block *ethtypes.SignedBeaconBlockElectra } +type TraceEventFuluBlock struct { + host.TraceEventPayloadMetaData + Block *ethtypes.SignedBeaconBlockFulu +} + type TraceEventAttestation struct { host.TraceEventPayloadMetaData Attestation *ethtypes.Attestation @@ -55,6 +60,11 @@ type TraceEventSingleAttestation struct { SingleAttestation *ethtypes.SingleAttestation } +type TraceEventDataColumnSidecar struct { + host.TraceEventPayloadMetaData + DataColumnSidecar *ethtypes.DataColumnSidecar +} + type TraceEventSignedAggregateAttestationAndProof struct { host.TraceEventPayloadMetaData SignedAggregateAttestationAndProof *ethtypes.SignedAggregateAttestationAndProof @@ -140,6 +150,8 @@ func (t *FullOutput) RenderPayload(evt *host.TraceEvent, msg *pubsub.Message, ds payload, err = t.renderDenebBlock(msg, d) case *ethtypes.SignedBeaconBlockElectra: payload, err = t.renderElectraBlock(msg, d) + case *ethtypes.SignedBeaconBlockFulu: + payload, err = t.renderFuluBlock(msg, d) case *ethtypes.Attestation: payload, err = t.renderAttestation(msg, d) case *ethtypes.AttestationElectra: @@ -160,6 +172,8 @@ func (t *FullOutput) RenderPayload(evt *host.TraceEvent, msg *pubsub.Message, ds payload, err = t.renderBLSToExecutionChange(msg, d) case *ethtypes.BlobSidecar: payload, err = t.renderBlobSidecar(msg, d) + case *ethtypes.DataColumnSidecar: + payload, err = t.renderDataColumnSidecar(msg, d) case *ethtypes.ProposerSlashing: payload, err = t.renderProposerSlashing(msg, d) case *ethtypes.AttesterSlashing: @@ -273,6 +287,22 @@ func (t *FullOutput) renderElectraBlock( }, nil } +func (t *FullOutput) renderFuluBlock( + msg *pubsub.Message, + block *ethtypes.SignedBeaconBlockFulu, +) (*TraceEventFuluBlock, error) { + return &TraceEventFuluBlock{ + TraceEventPayloadMetaData: host.TraceEventPayloadMetaData{ + PeerID: msg.ReceivedFrom.String(), + Topic: msg.GetTopic(), + Seq: msg.GetSeqno(), + MsgID: hex.EncodeToString([]byte(msg.ID)), + MsgSize: len(msg.Data), + }, + Block: block, + }, nil +} + func (t *FullOutput) renderAttestation( msg *pubsub.Message, attestation *ethtypes.Attestation, @@ -464,3 +494,19 @@ func (t *FullOutput) renderAttesterSlashing( AttesterSlashing: as, }, nil } + +func (t *FullOutput) renderDataColumnSidecar( + msg *pubsub.Message, + sidecar *ethtypes.DataColumnSidecar, +) (*TraceEventDataColumnSidecar, error) { + return &TraceEventDataColumnSidecar{ + TraceEventPayloadMetaData: host.TraceEventPayloadMetaData{ + PeerID: msg.ReceivedFrom.String(), + Topic: msg.GetTopic(), + Seq: msg.GetSeqno(), + MsgID: hex.EncodeToString([]byte(msg.ID)), + MsgSize: len(msg.Data), + }, + DataColumnSidecar: sidecar, + }, nil +} diff --git a/eth/output_kinesis.go b/eth/output_kinesis.go index af1f728..e4b444b 100644 --- a/eth/output_kinesis.go +++ b/eth/output_kinesis.go @@ -52,6 +52,8 @@ func (k *KinesisOutput) RenderPayload(evt *host.TraceEvent, msg *pubsub.Message, payload, err = k.renderDenebBlock(msg, d) case *ethtypes.SignedBeaconBlockElectra: payload, err = k.renderElectraBlock(msg, d) + case *ethtypes.SignedBeaconBlockFulu: + payload, err = k.renderFuluBlock(msg, d) case *ethtypes.Attestation: payload, err = k.renderAttestation(msg, d) case *ethtypes.AttestationElectra: @@ -73,6 +75,8 @@ func (k *KinesisOutput) RenderPayload(evt *host.TraceEvent, msg *pubsub.Message, payload, err = k.renderBLSToExecutionChange(msg, d) case *ethtypes.BlobSidecar: payload, err = k.renderBlobSidecar(msg, d) + case *ethtypes.DataColumnSidecar: + payload, err = k.renderDataColumnSidecar(msg, d) case *ethtypes.ProposerSlashing: payload, err = k.renderProposerSlashing(msg, d) case *ethtypes.AttesterSlashing: @@ -108,7 +112,7 @@ func (k *KinesisOutput) renderPhase0Block( "Slot": block.GetBlock().GetSlot(), "Root": root, "ValIdx": block.GetBlock().GetProposerIndex(), - "TimeInSlot": k.cfg.GenesisTime.Add(time.Duration(block.GetBlock().GetSlot()) * k.cfg.SecondsPerSlot), + "TimeInSlot": k.cfg.Chain.cfg.GenesisConfig.GenesisTime.Add(time.Duration(block.GetBlock().GetSlot()) * k.cfg.SecondsPerSlot), }, nil } @@ -130,7 +134,7 @@ func (k *KinesisOutput) renderAltairBlock( "Slot": block.GetBlock().GetSlot(), "Root": root, "ValIdx": block.GetBlock().GetProposerIndex(), - "TimeInSlot": k.cfg.GenesisTime.Add(time.Duration(block.GetBlock().GetSlot()) * k.cfg.SecondsPerSlot), + "TimeInSlot": k.cfg.Chain.cfg.GenesisConfig.GenesisTime.Add(time.Duration(block.GetBlock().GetSlot()) * k.cfg.SecondsPerSlot), }, nil } @@ -152,7 +156,7 @@ func (k *KinesisOutput) renderBellatrixBlock( "Slot": block.GetBlock().GetSlot(), "Root": root, "ValIdx": block.GetBlock().GetProposerIndex(), - "TimeInSlot": k.cfg.GenesisTime.Add(time.Duration(block.GetBlock().GetSlot()) * k.cfg.SecondsPerSlot), + "TimeInSlot": k.cfg.Chain.cfg.GenesisConfig.GenesisTime.Add(time.Duration(block.GetBlock().GetSlot()) * k.cfg.SecondsPerSlot), }, nil } @@ -174,7 +178,7 @@ func (k *KinesisOutput) renderCapellaBlock( "Slot": block.GetBlock().GetSlot(), "Root": root, "ValIdx": block.GetBlock().GetProposerIndex(), - "TimeInSlot": k.cfg.GenesisTime.Add(time.Duration(block.GetBlock().GetSlot()) * k.cfg.SecondsPerSlot), + "TimeInSlot": k.cfg.Chain.cfg.GenesisConfig.GenesisTime.Add(time.Duration(block.GetBlock().GetSlot()) * k.cfg.SecondsPerSlot), }, nil } @@ -196,7 +200,7 @@ func (k *KinesisOutput) renderDenebBlock( "Slot": block.GetBlock().GetSlot(), "Root": root, "ValIdx": block.GetBlock().GetProposerIndex(), - "TimeInSlot": k.cfg.GenesisTime.Add(time.Duration(block.GetBlock().GetSlot()) * k.cfg.SecondsPerSlot), + "TimeInSlot": k.cfg.Chain.cfg.GenesisConfig.GenesisTime.Add(time.Duration(block.GetBlock().GetSlot()) * k.cfg.SecondsPerSlot), }, nil } @@ -218,7 +222,29 @@ func (k *KinesisOutput) renderElectraBlock( "Slot": block.GetBlock().GetSlot(), "Root": root, "ValIdx": block.GetBlock().GetProposerIndex(), - "TimeInSlot": k.cfg.GenesisTime.Add(time.Duration(block.GetBlock().GetSlot()) * k.cfg.SecondsPerSlot), + "TimeInSlot": k.cfg.Chain.cfg.GenesisConfig.GenesisTime.Add(time.Duration(block.GetBlock().GetSlot()) * k.cfg.SecondsPerSlot), + }, nil +} + +func (k *KinesisOutput) renderFuluBlock( + msg *pubsub.Message, + block *ethtypes.SignedBeaconBlockFulu, +) (map[string]any, error) { + root, err := block.GetBlock().HashTreeRoot() + if err != nil { + return nil, fmt.Errorf("failed to determine block hash tree root: %w", err) + } + + return map[string]any{ + "PeerID": msg.ReceivedFrom, + "Topic": msg.GetTopic(), + "Seq": hex.EncodeToString(msg.GetSeqno()), + "MsgID": hex.EncodeToString([]byte(msg.ID)), + "MsgSize": len(msg.Data), + "Slot": block.GetBlock().GetSlot(), + "Root": root, + "ValIdx": block.GetBlock().GetProposerIndex(), + "TimeInSlot": k.cfg.Chain.cfg.GenesisConfig.GenesisTime.Add(time.Duration(block.GetBlock().GetSlot()) * k.cfg.SecondsPerSlot), }, nil } @@ -445,3 +471,22 @@ func (k *KinesisOutput) renderAttesterSlashing( "Att2_indices": as.GetAttestation_2().GetAttestingIndices(), }, nil } + +func (k *KinesisOutput) renderDataColumnSidecar( + msg *pubsub.Message, + sidecar *ethtypes.DataColumnSidecar, +) (map[string]any, error) { + return map[string]any{ + "PeerID": msg.ReceivedFrom, + "MsgID": hex.EncodeToString([]byte(msg.ID)), + "MsgSize": len(msg.Data), + "Topic": msg.GetTopic(), + "Seq": hex.EncodeToString(msg.GetSeqno()), + "Slot": sidecar.GetSignedBlockHeader().GetHeader().GetSlot(), + "ValIdx": sidecar.GetSignedBlockHeader().GetHeader().GetProposerIndex(), + "Index": sidecar.GetIndex(), + "StateRoot": hexutil.Encode(sidecar.GetSignedBlockHeader().GetHeader().GetStateRoot()), + "BodyRoot": hexutil.Encode(sidecar.GetSignedBlockHeader().GetHeader().GetBodyRoot()), + "ParentRoot": hexutil.Encode(sidecar.GetSignedBlockHeader().GetHeader().GetParentRoot()), + }, nil +} diff --git a/eth/output_kinesis_test.go b/eth/output_kinesis_test.go index 4fc4ff4..99df639 100644 --- a/eth/output_kinesis_test.go +++ b/eth/output_kinesis_test.go @@ -19,7 +19,13 @@ func TestKinesisOutputRenderMethods(t *testing.T) { topic = "test-topic" renderer = &KinesisOutput{ cfg: &PubSubConfig{ - GenesisTime: time.Unix(0, 0), + Chain: &Chain{ + cfg: &ChainConfig{ + GenesisConfig: &GenesisConfig{ + GenesisTime: time.Unix(0, 0), + }, + }, + }, SecondsPerSlot: time.Duration(12) * time.Second, }, } @@ -301,7 +307,7 @@ func TestKinesisOutputRenderMethods(t *testing.T) { require.Equal(t, typedResult.GetBlock().GetSlot(), result["Slot"]) require.Equal(t, typedResult.GetBlock().GetProposerIndex(), result["ValIdx"]) require.Equal(t, root, result["Root"]) - require.Equal(t, renderer.cfg.GenesisTime.Add(time.Duration(typedResult.GetBlock().GetSlot())*renderer.cfg.SecondsPerSlot), result["TimeInSlot"]) + require.Equal(t, renderer.cfg.Chain.cfg.GenesisConfig.GenesisTime.Add(time.Duration(typedResult.GetBlock().GetSlot())*renderer.cfg.SecondsPerSlot), result["TimeInSlot"]) case *ethtypes.SignedBeaconBlockAltair: root, err := typedResult.GetBlock().HashTreeRoot() if err != nil { @@ -311,7 +317,7 @@ func TestKinesisOutputRenderMethods(t *testing.T) { require.Equal(t, typedResult.GetBlock().GetSlot(), result["Slot"]) require.Equal(t, typedResult.GetBlock().GetProposerIndex(), result["ValIdx"]) require.Equal(t, root, result["Root"]) - require.Equal(t, renderer.cfg.GenesisTime.Add(time.Duration(typedResult.GetBlock().GetSlot())*renderer.cfg.SecondsPerSlot), result["TimeInSlot"]) + require.Equal(t, renderer.cfg.Chain.cfg.GenesisConfig.GenesisTime.Add(time.Duration(typedResult.GetBlock().GetSlot())*renderer.cfg.SecondsPerSlot), result["TimeInSlot"]) case *ethtypes.SignedBeaconBlockBellatrix: root, err := typedResult.GetBlock().HashTreeRoot() if err != nil { @@ -321,7 +327,7 @@ func TestKinesisOutputRenderMethods(t *testing.T) { require.Equal(t, typedResult.GetBlock().GetSlot(), result["Slot"]) require.Equal(t, typedResult.GetBlock().GetProposerIndex(), result["ValIdx"]) require.Equal(t, root, result["Root"]) - require.Equal(t, renderer.cfg.GenesisTime.Add(time.Duration(typedResult.GetBlock().GetSlot())*renderer.cfg.SecondsPerSlot), result["TimeInSlot"]) + require.Equal(t, renderer.cfg.Chain.cfg.GenesisConfig.GenesisTime.Add(time.Duration(typedResult.GetBlock().GetSlot())*renderer.cfg.SecondsPerSlot), result["TimeInSlot"]) case *ethtypes.SignedBeaconBlockCapella: root, err := typedResult.GetBlock().HashTreeRoot() if err != nil { @@ -331,7 +337,7 @@ func TestKinesisOutputRenderMethods(t *testing.T) { require.Equal(t, typedResult.GetBlock().GetSlot(), result["Slot"]) require.Equal(t, typedResult.GetBlock().GetProposerIndex(), result["ValIdx"]) require.Equal(t, root, result["Root"]) - require.Equal(t, renderer.cfg.GenesisTime.Add(time.Duration(typedResult.GetBlock().GetSlot())*renderer.cfg.SecondsPerSlot), result["TimeInSlot"]) + require.Equal(t, renderer.cfg.Chain.cfg.GenesisConfig.GenesisTime.Add(time.Duration(typedResult.GetBlock().GetSlot())*renderer.cfg.SecondsPerSlot), result["TimeInSlot"]) case *ethtypes.SignedBeaconBlockDeneb: root, err := typedResult.GetBlock().HashTreeRoot() if err != nil { @@ -341,7 +347,7 @@ func TestKinesisOutputRenderMethods(t *testing.T) { require.Equal(t, typedResult.GetBlock().GetSlot(), result["Slot"]) require.Equal(t, typedResult.GetBlock().GetProposerIndex(), result["ValIdx"]) require.Equal(t, root, result["Root"]) - require.Equal(t, renderer.cfg.GenesisTime.Add(time.Duration(typedResult.GetBlock().GetSlot())*renderer.cfg.SecondsPerSlot), result["TimeInSlot"]) + require.Equal(t, renderer.cfg.Chain.cfg.GenesisConfig.GenesisTime.Add(time.Duration(typedResult.GetBlock().GetSlot())*renderer.cfg.SecondsPerSlot), result["TimeInSlot"]) case *ethtypes.SignedBeaconBlockElectra: root, err := typedResult.GetBlock().HashTreeRoot() if err != nil { @@ -351,7 +357,7 @@ func TestKinesisOutputRenderMethods(t *testing.T) { require.Equal(t, typedResult.GetBlock().GetSlot(), result["Slot"]) require.Equal(t, typedResult.GetBlock().GetProposerIndex(), result["ValIdx"]) require.Equal(t, root, result["Root"]) - require.Equal(t, renderer.cfg.GenesisTime.Add(time.Duration(typedResult.GetBlock().GetSlot())*renderer.cfg.SecondsPerSlot), result["TimeInSlot"]) + require.Equal(t, renderer.cfg.Chain.cfg.GenesisConfig.GenesisTime.Add(time.Duration(typedResult.GetBlock().GetSlot())*renderer.cfg.SecondsPerSlot), result["TimeInSlot"]) case *ethtypes.Attestation: require.Equal(t, typedResult.GetData().GetSlot(), result["Slot"]) require.Equal(t, typedResult.GetData().GetCommitteeIndex(), result["CommIdx"]) diff --git a/eth/prysm.go b/eth/prysm.go index 82c50c5..22d630e 100644 --- a/eth/prysm.go +++ b/eth/prysm.go @@ -3,7 +3,6 @@ package eth import ( "bytes" "context" - "encoding/hex" "encoding/json" "errors" "fmt" @@ -16,9 +15,11 @@ import ( "github.com/OffchainLabs/prysm/v6/api/client" apiCli "github.com/OffchainLabs/prysm/v6/api/client/beacon" "github.com/OffchainLabs/prysm/v6/api/server/structs" - "github.com/OffchainLabs/prysm/v6/beacon-chain/core/signing" + "github.com/OffchainLabs/prysm/v6/config/params" + "github.com/OffchainLabs/prysm/v6/consensus-types/primitives" "github.com/OffchainLabs/prysm/v6/network/httputil" eth "github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1" + "github.com/OffchainLabs/prysm/v6/time/slots" "github.com/libp2p/go-libp2p/core/peer" ma "github.com/multiformats/go-multiaddr" "go.opentelemetry.io/otel" @@ -339,6 +340,86 @@ func (p *PrysmClient) Identity(ctx context.Context) (addrInfo *peer.AddrInfo, er return addrInfo, nil } +// FetchAndSetBlobSchedule fetches the BLOB_SCHEDULE from Prysm's spec endpoint +// and sets it in the params configuration to ensure correct fork digest calculation for BPO. +func (p *PrysmClient) FetchAndSetBlobSchedule(ctx context.Context) error { + ctx, cancel := context.WithTimeout(ctx, p.timeout) + defer cancel() + + specResp, err := p.beaconApiClient.GetConfigSpec(ctx) + if err != nil { + return fmt.Errorf("failed fetching config spec: %w", err) + } + + // Type assert Data to map[string]interface{} + specData, ok := specResp.Data.(map[string]interface{}) + if !ok { + return fmt.Errorf("unexpected spec response data type: %T", specResp.Data) + } + + // Check if BLOB_SCHEDULE exists in the spec, if no BLOB_SCHEDULE + // that means we're not on a BPO-enabled network. + blobScheduleRaw, exists := specData["BLOB_SCHEDULE"] + if !exists { + return nil + } + + // Parse the BLOB_SCHEDULE. + var blobScheduleData []struct { + Epoch string `json:"EPOCH"` + MaxBlobsPerBlock string `json:"MAX_BLOBS_PER_BLOCK"` + } + + switch v := blobScheduleRaw.(type) { + case string: + if err := json.Unmarshal([]byte(v), &blobScheduleData); err != nil { + return fmt.Errorf("failed parsing BLOB_SCHEDULE string: %w", err) + } + case []interface{}: + jsonBytes, err := json.Marshal(v) + if err != nil { + return fmt.Errorf("failed marshaling BLOB_SCHEDULE array: %w", err) + } + + if err := json.Unmarshal(jsonBytes, &blobScheduleData); err != nil { + return fmt.Errorf("failed parsing BLOB_SCHEDULE array: %w", err) + } + default: + return fmt.Errorf("BLOB_SCHEDULE has unexpected type: %T", blobScheduleRaw) + } + + // Convert to BlobScheduleEntry format. + blobSchedule := make([]params.BlobScheduleEntry, len(blobScheduleData)) + for i, entry := range blobScheduleData { + epoch, err := strconv.ParseUint(entry.Epoch, 10, 64) + if err != nil { + return fmt.Errorf("failed parsing EPOCH %s: %w", entry.Epoch, err) + } + + maxBlobs, err := strconv.ParseUint(entry.MaxBlobsPerBlock, 10, 64) + if err != nil { + return fmt.Errorf("failed parsing MAX_BLOBS_PER_BLOCK %s: %w", entry.MaxBlobsPerBlock, err) + } + + blobSchedule[i] = params.BlobScheduleEntry{ + Epoch: primitives.Epoch(epoch), + MaxBlobsPerBlock: maxBlobs, + } + } + + // Update the beacon config with the BlobSchedule + set GenesisValidatorsRoot. + // This gives us the correct details for InitializeForkSchedule(). + config := params.BeaconConfig().Copy() + config.BlobSchedule = blobSchedule + copy(config.GenesisValidatorsRoot[:], p.genesis.GenesisValidatorRoot) + config.InitializeForkSchedule() + + // Override the config with updated BlobSchedule. + params.OverrideBeaconConfig(config) + + return nil +} + func (p *PrysmClient) getActiveValidatorCount(ctx context.Context) (activeVals uint64, err error) { ctx, span := p.tracer.Start(ctx, "prysm_client.active_validators") defer func() { @@ -369,16 +450,19 @@ func (p *PrysmClient) isOnNetwork(ctx context.Context, hermesForkDigest [4]byte) }() // this checks whether the local fork_digest at hermes matches the one that the remote node keeps - // request the genesis - nodeFork, err := p.beaconApiClient.GetFork(ctx, apiCli.StateOrBlockId("head")) + // Get the chain head to determine the current epoch + chainHead, err := p.ChainHead(ctx) if err != nil { - return false, fmt.Errorf("request beacon fork to compose forkdigest: %w", err) + return false, fmt.Errorf("get chain head: %w", err) } - forkDigest, err := signing.ComputeForkDigest(nodeFork.CurrentVersion, p.genesis.GenesisValidatorRoot) - if err != nil { - return false, fmt.Errorf("create fork digest (%s, %x): %w", hex.EncodeToString(nodeFork.CurrentVersion), p.genesis.GenesisValidatorRoot, err) - } + // Calculate the current epoch from the head slot + currentEpoch := slots.ToEpoch(chainHead.HeadSlot) + + // We *must* use the current epoch from chain head, not the fork activation + // epoch in-order for our fork digests to be valid. + forkDigest := params.ForkDigest(currentEpoch) + // check if our version is within the versions of the node if forkDigest == hermesForkDigest { return true, nil diff --git a/eth/pubsub.go b/eth/pubsub.go index 9d4d648..cb9cd78 100644 --- a/eth/pubsub.go +++ b/eth/pubsub.go @@ -23,11 +23,10 @@ import ( const eventTypeHandleMessage = "HANDLE_MESSAGE" type PubSubConfig struct { + Chain *Chain Topics []string - ForkVersion ForkVersion Encoder encoder.NetworkEncoding SecondsPerSlot time.Duration - GenesisTime time.Time DataStream host.DataStream } @@ -40,7 +39,7 @@ func (p PubSubConfig) Validate() error { return fmt.Errorf("seconds per slot must not be 0") } - if p.GenesisTime.IsZero() { + if p.Chain.cfg.GenesisConfig.GenesisTime.IsZero() { return fmt.Errorf("genesis time must not be zero time") } @@ -137,6 +136,8 @@ func (p *PubSub) mapPubSubTopicWithHandlers(topic string) host.TopicHandler { return p.handleBlsToExecutionChangeMessage case strings.Contains(topic, p2p.GossipBlobSidecarMessage): return p.handleBlobSidecar + case strings.Contains(topic, p2p.GossipDataColumnSidecarMessage): + return p.handleDataColumnSidecar default: return p.host.TracedTopicHandler(host.NoopHandler) } @@ -171,21 +172,23 @@ func (p *PubSub) handleBeaconBlock(ctx context.Context, msg *pubsub.Message) err block ssz.Unmarshaler ) - switch p.cfg.ForkVersion { - case Phase0ForkVersion: + switch p.cfg.Chain.CurrentFork() { + case phase0: block = ðtypes.SignedBeaconBlock{} - case AltairForkVersion: + case altair: block = ðtypes.SignedBeaconBlockAltair{} - case BellatrixForkVersion: + case bellatrix: block = ðtypes.SignedBeaconBlockBellatrix{} - case CapellaForkVersion: + case capella: block = ðtypes.SignedBeaconBlockCapella{} - case DenebForkVersion: + case deneb: block = ðtypes.SignedBeaconBlockDeneb{} - case ElectraForkVersion: + case electra: block = ðtypes.SignedBeaconBlockElectra{} + case fulu: + block = ðtypes.SignedBeaconBlockFulu{} default: - return fmt.Errorf("handleBeaconBlock(): unrecognized fork-version: %s", p.cfg.ForkVersion.String()) + return fmt.Errorf("handleBeaconBlock(): unrecognized fork-version: %d", p.cfg.Chain.CurrentFork()) } evt, err = p.dsr.RenderPayload(evt, msg, block) @@ -199,7 +202,10 @@ func (p *PubSub) handleBeaconBlock(ctx context.Context, msg *pubsub.Message) err if err := p.cfg.DataStream.PutRecord(ctx, evt); err != nil { slog.Warn( - "failed putting topic handler event", "topic", msg.GetTopic(), "err", tele.LogAttrError(err), + "failed putting topic handler event", + "topic", msg.GetTopic(), + "fork_version", p.cfg.Chain.CurrentFork(), + "err", tele.LogAttrError(err), ) } @@ -221,16 +227,21 @@ func (p *PubSub) handleAttestation(ctx context.Context, msg *pubsub.Message) err } ) - switch p.cfg.ForkVersion { - case ElectraForkVersion: + switch p.cfg.Chain.CurrentFork() { + case phase0, altair, bellatrix, capella, deneb: + evt, err = p.dsr.RenderPayload(evt, msg, ðtypes.Attestation{}) + case electra, fulu: evt, err = p.dsr.RenderPayload(evt, msg, ðtypes.SingleAttestation{}) default: - evt, err = p.dsr.RenderPayload(evt, msg, ðtypes.Attestation{}) + return fmt.Errorf("handleAttestation(): unrecognized fork-version: %d", p.cfg.Chain.CurrentFork()) } if err != nil { slog.Warn( - "failed rendering topic handler event", "topic", msg.GetTopic(), "err", tele.LogAttrError(err), + "failed rendering topic handler event", + "topic", msg.GetTopic(), + "fork_version", p.cfg.Chain.CurrentFork(), + "err", tele.LogAttrError(err), ) return nil @@ -260,11 +271,13 @@ func (p *PubSub) handleAggregateAndProof(ctx context.Context, msg *pubsub.Messag } ) - switch p.cfg.ForkVersion { - case ElectraForkVersion: + switch p.cfg.Chain.CurrentFork() { + case phase0, altair, bellatrix, capella, deneb: + evt, err = p.dsr.RenderPayload(evt, msg, ðtypes.SignedAggregateAttestationAndProof{}) + case electra, fulu: evt, err = p.dsr.RenderPayload(evt, msg, ðtypes.SignedAggregateAttestationAndProofElectra{}) default: - evt, err = p.dsr.RenderPayload(evt, msg, ðtypes.SignedAggregateAttestationAndProof{}) + return fmt.Errorf("handleAggregateAndProof(): unrecognized fork-version: %x", p.cfg.Chain.CurrentFork()) } if err != nil { @@ -277,7 +290,10 @@ func (p *PubSub) handleAggregateAndProof(ctx context.Context, msg *pubsub.Messag if err := p.cfg.DataStream.PutRecord(ctx, evt); err != nil { slog.Warn( - "failed putting topic handler event", "topic", msg.GetTopic(), "err", tele.LogAttrError(err), + "failed putting topic handler event", + "topic", msg.GetTopic(), + "fork_version", p.cfg.Chain.CurrentFork(), + "err", tele.LogAttrError(err), ) } @@ -498,8 +514,8 @@ func (p *PubSub) handleBlobSidecar(ctx context.Context, msg *pubsub.Message) err } ) - switch p.cfg.ForkVersion { - case DenebForkVersion, ElectraForkVersion: + switch p.cfg.Chain.CurrentFork() { + case deneb, electra, fulu: blob := ethtypes.BlobSidecar{} evt, err = p.dsr.RenderPayload(evt, msg, &blob) @@ -517,7 +533,42 @@ func (p *PubSub) handleBlobSidecar(ctx context.Context, msg *pubsub.Message) err ) } default: - return fmt.Errorf("non recognized fork-version: %d", p.cfg.ForkVersion[:]) + return fmt.Errorf("non recognized fork-version: %d", p.cfg.Chain.CurrentFork()) + } + + return nil +} + +func (p *PubSub) handleDataColumnSidecar(ctx context.Context, msg *pubsub.Message) error { + if msg == nil || msg.Topic == nil || *msg.Topic == "" { + return fmt.Errorf("handleDataColumnSidecar(): nil message or topic") + } + + var ( + err error + evt = &host.TraceEvent{ + Type: eventTypeHandleMessage, + Topic: msg.GetTopic(), + PeerID: p.host.ID(), + Timestamp: time.Now(), + } + ) + + sidecar := ethtypes.DataColumnSidecar{} + + evt, err = p.dsr.RenderPayload(evt, msg, &sidecar) + if err != nil { + slog.Warn( + "failed rendering topic handler event", "topic", msg.GetTopic(), "err", tele.LogAttrError(err), + ) + + return nil + } + + if err := p.cfg.DataStream.PutRecord(ctx, evt); err != nil { + slog.Warn( + "failed putting topic handler event", "topic", msg.GetTopic(), "err", tele.LogAttrError(err), + ) } return nil diff --git a/eth/reqresp.go b/eth/reqresp.go index b963391..477ce35 100644 --- a/eth/reqresp.go +++ b/eth/reqresp.go @@ -1,7 +1,6 @@ package eth import ( - "bytes" "context" "encoding/hex" "errors" @@ -11,7 +10,6 @@ import ( "maps" "strconv" "strings" - "sync" "time" "github.com/OffchainLabs/prysm/v6/beacon-chain/p2p" @@ -39,16 +37,14 @@ import ( ) type ReqRespConfig struct { - ForkDigest [4]byte - Encoder encoder.NetworkEncoding - DataStream hermeshost.DataStream - - AttestationSubnetConfig *SubnetConfig - SyncSubnetConfig *SubnetConfig - + Encoder encoder.NetworkEncoding + DataStream hermeshost.DataStream ReadTimeout time.Duration WriteTimeout time.Duration + // Chain related info + Chain *Chain + // Telemetry accessors Tracer trace.Tracer Meter metric.Meter @@ -61,11 +57,6 @@ type ReqResp struct { cfg *ReqRespConfig delegate peer.ID // peer ID that we delegate requests to - metaDataMu sync.RWMutex - metaData *pb.MetaDataV1 - - statusMu sync.RWMutex - status *pb.Status statusLim *rate.Limiter // metrics @@ -81,21 +72,9 @@ func NewReqResp(h host.Host, cfg *ReqRespConfig) (*ReqResp, error) { return nil, fmt.Errorf("req resp server config must not be nil") } - md := &pb.MetaDataV1{ - SeqNumber: 0, - Attnets: BitArrayFromAttestationSubnets(cfg.AttestationSubnetConfig.Subnets), - Syncnets: BitArrayFromSyncSubnets(cfg.SyncSubnetConfig.Subnets), - } - - slog.Info("Composed local MetaData", - "attnets", md.Attnets, - "syncnets", md.Syncnets, - ) - p := &ReqResp{ host: h, cfg: cfg, - metaData: md, statusLim: rate.NewLimiter(1, 5), } @@ -124,95 +103,30 @@ func NewReqResp(h host.Host, cfg *ReqRespConfig) (*ReqResp, error) { return p, nil } -func (r *ReqResp) SetMetaData(seq uint64) { - r.metaDataMu.Lock() - defer r.metaDataMu.Unlock() - - if r.metaData.SeqNumber > seq { - slog.Warn("Updated metadata with lower sequence number", "old", r.metaData.SeqNumber, "new", seq) - } - - r.metaData = &pb.MetaDataV1{ - SeqNumber: seq, - Attnets: r.metaData.Attnets, - Syncnets: r.metaData.Syncnets, - } -} - -func (r *ReqResp) SetStatus(status *pb.Status) { - r.statusMu.Lock() - defer r.statusMu.Unlock() - - // if the ForkDigest is not the same, we should drop updating the local status - // TODO: this might be re-checked for hardforks (make the client resilient to them) - if r.status != nil && !bytes.Equal(r.status.ForkDigest, status.ForkDigest) { - return - } - - // check if anything has changed. Prevents the below log message to pollute - // the log output. - if r.status != nil && bytes.Equal(r.status.ForkDigest, status.ForkDigest) && - bytes.Equal(r.status.FinalizedRoot, status.FinalizedRoot) && - r.status.FinalizedEpoch == status.FinalizedEpoch && - bytes.Equal(r.status.HeadRoot, status.HeadRoot) && - r.status.HeadSlot == status.HeadSlot { - // nothing has changed -> return - return - } - - slog.Info("New status:") - slog.Info(" fork_digest: " + hex.EncodeToString(status.ForkDigest)) - slog.Info(" finalized_root: " + hex.EncodeToString(status.FinalizedRoot)) - slog.Info(" finalized_epoch: " + strconv.FormatUint(uint64(status.FinalizedEpoch), 10)) - slog.Info(" head_root: " + hex.EncodeToString(status.HeadRoot)) - slog.Info(" head_slot: " + strconv.FormatUint(uint64(status.HeadSlot), 10)) - - r.status = status -} - -func (r *ReqResp) cpyStatus() *pb.Status { - r.statusMu.RLock() - defer r.statusMu.RUnlock() - - if r.status == nil { - return nil - } - - return &pb.Status{ - ForkDigest: bytes.Clone(r.status.ForkDigest), - FinalizedRoot: bytes.Clone(r.status.FinalizedRoot), - FinalizedEpoch: r.status.FinalizedEpoch, - HeadRoot: bytes.Clone(r.status.HeadRoot), - HeadSlot: r.status.HeadSlot, - } -} - // RegisterHandlers registers all RPC handlers. It checks first if all // preconditions are met. This includes valid initial status and metadata // values. func (r *ReqResp) RegisterHandlers(ctx context.Context) error { - r.statusMu.RLock() - defer r.statusMu.RUnlock() - if r.status == nil { - return fmt.Errorf("chain status is nil") - } - - r.metaDataMu.RLock() - defer r.metaDataMu.RUnlock() - if r.metaData == nil { - return fmt.Errorf("chain metadata is nil") + init, cause := r.cfg.Chain.IsInit() + if !init { + return fmt.Errorf("reqresp: chain module is not init (%s)", cause) } handlers := map[string]ContextStreamHandler{ - p2p.RPCPingTopicV1: r.pingHandler, - p2p.RPCGoodByeTopicV1: r.goodbyeHandler, - p2p.RPCStatusTopicV1: r.statusHandler, - p2p.RPCMetaDataTopicV1: r.metadataV1Handler, - p2p.RPCMetaDataTopicV2: r.metadataV2Handler, - p2p.RPCBlocksByRangeTopicV2: r.blocksByRangeV2Handler, - p2p.RPCBlocksByRootTopicV2: r.blocksByRootV2Handler, - p2p.RPCBlobSidecarsByRangeTopicV1: r.blobsByRangeV2Handler, - p2p.RPCBlobSidecarsByRootTopicV1: r.blobsByRootV2Handler, + p2p.RPCPingTopicV1: r.pingHandler, + p2p.RPCGoodByeTopicV1: r.goodbyeHandler, + p2p.RPCStatusTopicV1: r.statusHandler, + p2p.RPCStatusTopicV2: r.statusV2Handler, + p2p.RPCMetaDataTopicV1: r.metadataV1Handler, + p2p.RPCMetaDataTopicV2: r.metadataV2Handler, + p2p.RPCMetaDataTopicV3: r.metadataV3Handler, + // TODO: this is just a test to see if we can avoid the extra BW + // p2p.RPCBlocksByRangeTopicV2: r.blocksByRangeV2Handler, + // p2p.RPCBlocksByRootTopicV2: r.blocksByRootV2Handler, + // p2p.RPCBlobSidecarsByRangeTopicV1: r.blobsByRangeV2Handler, + // p2p.RPCBlobSidecarsByRootTopicV1: r.blobsByRootV2Handler, + // p2p.RPCDataColumnSidecarsByRangeTopicV1: r.DataColumnsByRangeV1Handler, + // p2p.RPCDataColumnSidecarsByRootTopicV1: r.DataColumnsByRootV1Handler, } for id, handler := range handlers { @@ -234,8 +148,15 @@ func (r *ReqResp) wrapStreamHandler(ctx context.Context, name string, handler Co tattrs := trace.WithAttributes(attrs...) return func(s network.Stream) { - rawVal, err := r.host.Peerstore().Get(s.Conn().RemotePeer(), "AgentVersion") + // handle the request + start := time.Now() + traceData, err := handler(ctx, s) + if err != nil { + slog.Warn("failed handling rpc", "protocol", s.Protocol(), tele.LogAttrError(err), tele.LogAttrPeerID(s.Conn().RemotePeer())) + } + end := time.Now() + rawVal, err := r.host.Peerstore().Get(s.Conn().RemotePeer(), "AgentVersion") agentVersion := "n.a." if err == nil { if av, ok := rawVal.(string); ok { @@ -245,26 +166,13 @@ func (r *ReqResp) wrapStreamHandler(ctx context.Context, name string, handler Co slog.Debug("Stream Opened", tele.LogAttrPeerID(s.Conn().RemotePeer()), "protocol", s.Protocol(), "agent", agentVersion) - // Reset is a no-op if the stream is already closed. Closing the stream - // is the responsibility of the handler. - defer logDeferErr(s.Reset, "failed to reset stream") - // Start request tracing ctx, span := r.cfg.Tracer.Start(ctx, "rpc", tattrs) span.SetAttributes(attribute.String("peer_id", s.Conn().RemotePeer().String())) span.SetAttributes(attribute.String("agent", agentVersion)) defer span.End() - // time the request handling - start := time.Now() - traceData, err := handler(ctx, s) - if err != nil { - slog.Debug("failed handling rpc", "protocol", s.Protocol(), tele.LogAttrError(err), tele.LogAttrPeerID(s.Conn().RemotePeer()), "agent", agentVersion) - } - end := time.Now() - traceType := "HANDLE_STREAM" - protocol := string(s.Protocol()) // Usual protocol string: /eth2/beacon_chain/req/metadata/2/ssz_snappy @@ -305,16 +213,15 @@ func (r *ReqResp) wrapStreamHandler(ctx context.Context, name string, handler Co } func (r *ReqResp) pingHandler(ctx context.Context, stream network.Stream) (map[string]any, error) { - req := primitives.SSZUint64(0) - if err := r.readRequest(ctx, stream, &req); err != nil { + req := new(primitives.SSZUint64) + if err := r.readRequest(ctx, stream, req); err != nil { + stream.Reset() return nil, fmt.Errorf("read sequence number: %w", err) } - r.metaDataMu.RLock() - sq := primitives.SSZUint64(r.metaData.SeqNumber) - r.metaDataMu.RUnlock() - + sq := r.cfg.Chain.CurrentSeqNumber() if err := r.writeResponse(ctx, stream, &sq); err != nil { + stream.Reset() return nil, fmt.Errorf("write sequence number: %w", err) } @@ -323,16 +230,19 @@ func (r *ReqResp) pingHandler(ctx context.Context, stream network.Stream) (map[s "SentSeq": sq, } - return traceData, stream.Close() + _ = stream.Close() + + return traceData, nil } func (r *ReqResp) goodbyeHandler(ctx context.Context, stream network.Stream) (map[string]any, error) { - req := primitives.SSZUint64(0) - if err := r.readRequest(ctx, stream, &req); err != nil { + req := new(primitives.SSZUint64) + if err := r.readRequest(ctx, stream, req); err != nil { + stream.Reset() return nil, fmt.Errorf("read sequence number: %w", err) } - msg, found := types.GoodbyeCodeMessages[req] + msg, found := types.GoodbyeCodeMessages[*req] if found { if _, err := r.host.Peerstore().Get(stream.Conn().RemotePeer(), peerstoreKeyIsHandshaked); err == nil { var ( @@ -355,7 +265,7 @@ func (r *ReqResp) goodbyeHandler(ctx context.Context, stream network.Stream) (ma r.goodbyeCounter.Add(ctx, 1, metric.WithAttributes( []attribute.KeyValue{ - attribute.Int64("code", int64(req)), + attribute.Int64("code", int64(*req)), attribute.String("reason", reason), attribute.String("agent", agentVersion), }..., @@ -368,11 +278,13 @@ func (r *ReqResp) goodbyeHandler(ctx context.Context, stream network.Stream) (ma } traceData := map[string]any{ - "Code": req, + "Code": *req, "Reason": msg, } - return traceData, stream.Close() + _ = stream.Close() + + return traceData, nil } func (r *ReqResp) statusHandler(ctx context.Context, upstream network.Stream) (map[string]any, error) { @@ -385,104 +297,94 @@ func (r *ReqResp) statusHandler(ctx context.Context, upstream network.Stream) (m "FinalizedEpoch": status.FinalizedEpoch, } } - defer upstream.Close() - // check if the request comes from our delegate node. If so, just mirror - // its own status back and update our latest known status. - if upstream.Conn().RemotePeer() == r.delegate { - - resp := &pb.Status{} - if err := r.readRequest(ctx, upstream, resp); err != nil { - return nil, fmt.Errorf("read status data from delegate: %w", err) - } - - // update status - r.SetStatus(resp) - - // mirror its own status back - if err := r.writeResponse(ctx, upstream, resp); err != nil { - return nil, fmt.Errorf("write mirrored status response to delegate: %w", err) - } - - traceData := map[string]any{ - "Request": statusTraceData(resp), - "Response": statusTraceData(resp), - } - - return traceData, nil - } // first, read the status from the remote peer req := &pb.Status{} if err := r.readRequest(ctx, upstream, req); err != nil { - return nil, fmt.Errorf("read status data from delegate: %w", err) + upstream.Reset() + return nil, fmt.Errorf("read status data from remote peer: %w", err) } - // create response status from memory status - resp := r.cpyStatus() - - // if the rate limiter allows requesting a new status, do that. - if r.statusLim.Allow() { - r.statusLim.Reserve() - - // ask our delegate node for the latest status, using our known latest status - // this is important because blindly forwarding the request from a remote peer - // will lead to intermittent disconnects from the beacon node. The "trusted peer" - // setting doesn't seem to apply if we send, e.g., a status payload with - // a non-matching fork-digest or non-finalized root hash. - dialCtx := network.WithForceDirectDial(ctx, "prevent backoff") - var err error - resp, err = r.Status(dialCtx, r.delegate) - if err != nil { - // asking for the latest status failed. Use our own latest known status - slog.Warn("Downstream status request failed, using the latest known status") + // let the upstream peer (who initiated the request) know the latest status + localStI := r.cfg.Chain.GetStatus(statusV0) + localSt, _ := localStI.(*pb.Status) + if err := r.writeResponse(ctx, upstream, localSt); err != nil { + upstream.Reset() + return nil, fmt.Errorf("respond status to upstream: %w", err) + } - statusCpy := r.cpyStatus() - if err := r.writeResponse(ctx, upstream, statusCpy); err != nil { - return nil, fmt.Errorf("write mirrored status response to delegate: %w", err) - } + traceData := map[string]any{ + "Request": statusTraceData(req), + "Response": statusTraceData(localSt), + } - traceData := map[string]any{ - "Request": statusTraceData(req), - "Response": statusTraceData(statusCpy), - } + slog.Debug( + "status v1 response", + "peer", upstream.Conn().RemotePeer().String(), + "trusted-peer", upstream.Conn().RemotePeer() == r.delegate, + "head-slot", localSt.HeadSlot, + "fork_digest", hex.EncodeToString(localSt.ForkDigest), + ) + + _ = upstream.Close() - return traceData, nil + return traceData, nil +} + +// statusV2Handler handles StatusV2 protocol requests +func (r *ReqResp) statusV2Handler(ctx context.Context, upstream network.Stream) (map[string]any, error) { + statusTraceData := func(status *pb.StatusV2) map[string]any { + return map[string]any{ + "ForkDigest": hex.EncodeToString(status.ForkDigest), + "HeadRoot": hex.EncodeToString(status.HeadRoot), + "HeadSlot": status.HeadSlot, + "FinalizedRoot": hex.EncodeToString(status.FinalizedRoot), + "FinalizedEpoch": status.FinalizedEpoch, + "EarliestAvailableSlot": status.EarliestAvailableSlot, } + } - // we got a valid response from our delegate node. Update our own status - r.SetStatus(resp) + // first, read the status from the remote peer + req := &pb.StatusV2{} + if err := r.readRequest(ctx, upstream, req); err != nil { + upstream.Reset() + return nil, fmt.Errorf("read status V2 data from peer: %w", err) } + // create response status from memory status + localStI := r.cfg.Chain.GetStatus(statusV1) + localSt, _ := localStI.(*pb.StatusV2) + // let the upstream peer (who initiated the request) know the latest status - if err := r.writeResponse(ctx, upstream, resp); err != nil { - return nil, fmt.Errorf("respond status to upstream: %w", err) + if err := r.writeResponse(ctx, upstream, localSt); err != nil { + upstream.Reset() + return nil, fmt.Errorf("respond status V2 to upstream: %w", err) } traceData := map[string]any{ "Request": statusTraceData(req), - "Response": statusTraceData(resp), + "Response": statusTraceData(localSt), } slog.Debug( - "status response", + "status v2 response", "peer", upstream.Conn().RemotePeer().String(), - "head-slot", resp.HeadSlot, - "fork_digest", hex.EncodeToString(resp.ForkDigest), + "trusted-peer", upstream.Conn().RemotePeer() == r.delegate, + "head-slot", localSt.HeadSlot, + "fork_digest", hex.EncodeToString(localSt.ForkDigest), ) + _ = upstream.Close() + return traceData, nil } func (r *ReqResp) metadataV1Handler(ctx context.Context, stream network.Stream) (map[string]any, error) { - r.metaDataMu.RLock() - metaData := &pb.MetaDataV0{ - SeqNumber: r.metaData.SeqNumber, - Attnets: r.metaData.Attnets, - } - r.metaDataMu.RUnlock() + mdI := r.cfg.Chain.GetMetadata(metadataV0) + metaData, _ := mdI.(*pb.MetaDataV0) - defer stream.Close() if err := r.writeResponse(ctx, stream, metaData); err != nil { + stream.Reset() return nil, fmt.Errorf("write meta data v1: %w", err) } @@ -491,25 +393,28 @@ func (r *ReqResp) metadataV1Handler(ctx context.Context, stream network.Stream) "Attnets": hex.EncodeToString(metaData.Attnets.Bytes()), } - slog.Info( + slog.Debug( "metadata response", "peer", stream.Conn().RemotePeer().String(), "attnets", metaData.Attnets, ) + + _ = stream.Close() + return traceData, nil } func (r *ReqResp) metadataV2Handler(ctx context.Context, stream network.Stream) (map[string]any, error) { - r.metaDataMu.RLock() - metaData := &pb.MetaDataV1{ - SeqNumber: r.metaData.SeqNumber, - Attnets: r.metaData.Attnets, - Syncnets: r.metaData.Syncnets, + mdI := r.cfg.Chain.GetMetadata(metadataV1) + metaData, _ := mdI.(*pb.MetaDataV1) + + if err := r.writeResponse(ctx, stream, metaData); err != nil { + stream.Reset() + return nil, fmt.Errorf("write meta data v1: %w", err) } - r.metaDataMu.RUnlock() - defer stream.Close() if err := r.writeResponse(ctx, stream, metaData); err != nil { + stream.Reset() return nil, fmt.Errorf("write meta data v2: %w", err) } @@ -524,9 +429,104 @@ func (r *ReqResp) metadataV2Handler(ctx context.Context, stream network.Stream) "attnets", metaData.Attnets, "synccommittees", metaData.Syncnets, ) + + _ = stream.Close() + + return traceData, nil +} + +// metadataV3Handler handles MetadataV3 protocol requests (returns MetaDataV2 type) +func (r *ReqResp) metadataV3Handler(ctx context.Context, stream network.Stream) (map[string]any, error) { + mdI := r.cfg.Chain.GetMetadata(metadataV2) + metaData, _ := mdI.(*pb.MetaDataV2) + if metaData == nil { + return nil, fmt.Errorf("no metadata available") + } + + if err := r.writeResponse(ctx, stream, metaData); err != nil { + stream.Reset() + return nil, fmt.Errorf("write meta data v3: %w", err) + } + + traceData := map[string]any{ + "SeqNumber": metaData.SeqNumber, + "Attnets": hex.EncodeToString(metaData.Attnets.Bytes()), + "CustodyGroupCount": metaData.CustodyGroupCount, + } + + if metaData.Syncnets != nil { + traceData["Syncnets"] = hex.EncodeToString(metaData.Syncnets.Bytes()) + } + + slog.Debug( + "metadata V3 response", + "attnets", metaData.Attnets, + "synccommittees", metaData.Syncnets, + "custody_group_count", metaData.CustodyGroupCount, + ) + + _ = stream.Close() return traceData, nil } +func (r *ReqResp) DataColumnsByRangeV1Handler(ctx context.Context, stream network.Stream) (map[string]any, error) { + req := new(pb.DataColumnSidecarsByRangeRequest) + err := r.readRequest(ctx, stream, req) + if err != nil { + stream.Reset() + return nil, fmt.Errorf("error to read data-column-by-range request %w", err) + } + + // TODO: handle this correctly + // remote this and close correctly + stream.Reset() + + traceData := map[string]any{ + "PeerID": stream.Conn().RemotePeer().String(), + "StartSlot": req.StartSlot, + "Count": req.Count, + "Columns": req.Columns, + } + + slog.Info( + "data-columns-by-range", + "PeerID", stream.Conn().RemotePeer().String(), + "Columns", req.Columns, + ) + + // _ = stream.Close() + + return traceData, nil +} + +func (r *ReqResp) DataColumnsByRootV1Handler(ctx context.Context, stream network.Stream) (map[string]any, error) { + req := new(types.DataColumnsByRootIdentifiers) + err := r.readRequest(ctx, stream, req) + if err != nil { + return nil, fmt.Errorf("error to read data-column-by-root request %w", err) + } + + // TODO: handle this correctly + // remote this and close correctly + stream.Reset() + + traceData := map[string]any{ + "PeerID": stream.Conn().RemotePeer().String(), + "Roots": strconv.Itoa(len(*req)), + } + + slog.Info( + "data-columns-by-root", + "PeerID", stream.Conn().RemotePeer().String(), + "Roots", len(*req), + ) + + _ = stream.Close() + + return traceData, nil +} + +//lint:ignore U1000 ignore the unused litner error - testing func (r *ReqResp) blocksByRangeV2Handler(ctx context.Context, stream network.Stream) (map[string]any, error) { if stream.Conn().RemotePeer() == r.delegate { return nil, fmt.Errorf("blocks by range request from delegate peer") @@ -535,6 +535,7 @@ func (r *ReqResp) blocksByRangeV2Handler(ctx context.Context, stream network.Str return nil, r.delegateStream(ctx, stream) } +//lint:ignore U1000 ignore the unused litner error - testing func (r *ReqResp) blocksByRootV2Handler(ctx context.Context, stream network.Stream) (map[string]any, error) { if stream.Conn().RemotePeer() == r.delegate { return nil, fmt.Errorf("blocks by root request from delegate peer") @@ -543,6 +544,7 @@ func (r *ReqResp) blocksByRootV2Handler(ctx context.Context, stream network.Stre return nil, r.delegateStream(ctx, stream) } +//lint:ignore U1000 ignore the unused litner error - testing func (r *ReqResp) blobsByRangeV2Handler(ctx context.Context, stream network.Stream) (map[string]any, error) { if stream.Conn().RemotePeer() == r.delegate { return nil, fmt.Errorf("blobs by range request from delegate peer") @@ -551,6 +553,7 @@ func (r *ReqResp) blobsByRangeV2Handler(ctx context.Context, stream network.Stre return nil, r.delegateStream(ctx, stream) } +//lint:ignore U1000 ignore the unused litner error - testing func (r *ReqResp) blobsByRootV2Handler(ctx context.Context, stream network.Stream) (map[string]any, error) { if stream.Conn().RemotePeer() == r.delegate { return nil, fmt.Errorf("blobs by root request from delegate peer") @@ -559,6 +562,7 @@ func (r *ReqResp) blobsByRootV2Handler(ctx context.Context, stream network.Strea return nil, r.delegateStream(ctx, stream) } +//lint:ignore U1000 ignore the unused litner error - testing func (r *ReqResp) delegateStream(ctx context.Context, upstream network.Stream) error { dialCtx := network.WithForceDirectDial(ctx, "prevent backoff") downstream, err := r.host.NewStream(dialCtx, r.delegate, upstream.Protocol()) @@ -611,6 +615,7 @@ func (r *ReqResp) delegateStream(ctx context.Context, upstream network.Stream) e return nil } +// Status requests V1 status from a peer func (r *ReqResp) Status(ctx context.Context, pid peer.ID) (status *pb.Status, err error) { defer func() { av, err := r.host.Peerstore().Get(pid, "AgentVersion") @@ -653,40 +658,104 @@ func (r *ReqResp) Status(ctx context.Context, pid peer.ID) (status *pb.Status, e r.meterRequestCounter.Add(traceCtx, 1, metric.WithAttributes(attrs...)) }() - slog.Info("Perform status request", tele.LogAttrPeerID(pid)) + slog.Info("Perform status V1 request", tele.LogAttrPeerID(pid)) stream, err := r.host.NewStream(ctx, pid, r.protocolID(p2p.RPCStatusTopicV1)) if err != nil { return nil, fmt.Errorf("new stream to peer %s: %w", pid, err) } - defer logDeferErr(stream.Reset, "failed closing stream") // no-op if closed // actually write the data to the stream - req := r.cpyStatus() - if req == nil { - return nil, fmt.Errorf("status unknown") - } + stI := r.cfg.Chain.GetStatus(statusV0) + stReq, _ := stI.(*pb.Status) - if err := r.writeRequest(ctx, stream, req); err != nil { + if err := r.writeRequest(ctx, stream, stReq); err != nil { + stream.Reset() return nil, fmt.Errorf("write status request: %w", err) } // read and decode status response resp := &pb.Status{} if err := r.readResponse(ctx, stream, resp); err != nil { + stream.Reset() return nil, fmt.Errorf("read status response: %w", err) } - // if we requested the status from our delegate - if stream.Conn().RemotePeer() == r.delegate { - r.SetStatus(resp) - } - // we have the data that we want, so ignore error here _ = stream.Close() // (both sides should actually be already closed) return resp, nil } +// StatusV2 requests V2 status from a peer +func (r *ReqResp) StatusV2(ctx context.Context, pid peer.ID) (status *pb.StatusV2, err error) { + defer func() { + av, err := r.host.Peerstore().Get(pid, "AgentVersion") + if err != nil { + av = "unknown" + } + + reqData := map[string]any{ + "AgentVersion": av, + "PeerID": pid.String(), + } + if status != nil { + reqData["ForkDigest"] = hex.EncodeToString(status.ForkDigest) + reqData["HeadRoot"] = hex.EncodeToString(status.HeadRoot) + reqData["HeadSlot"] = status.HeadSlot + reqData["FinalizedRoot"] = hex.EncodeToString(status.FinalizedRoot) + reqData["FinalizedEpoch"] = status.FinalizedEpoch + reqData["EarliestAvailableSlot"] = status.EarliestAvailableSlot + } + + if err != nil { + reqData["Error"] = err.Error() + } + + traceEvt := &hermeshost.TraceEvent{ + Type: "REQUEST_STATUS", + PeerID: r.host.ID(), + Timestamp: time.Now(), + Payload: reqData, + } + + traceCtx := context.Background() + if err := r.cfg.DataStream.PutRecord(traceCtx, traceEvt); err != nil { + slog.Warn("failed to put record", tele.LogAttrError(err)) + } + + attrs := []attribute.KeyValue{ + attribute.String("rpc", "status_v2"), + attribute.Bool("success", err == nil), + } + r.meterRequestCounter.Add(traceCtx, 1, metric.WithAttributes(attrs...)) + }() + + stream, err := r.host.NewStream(ctx, pid, r.protocolID(p2p.RPCStatusTopicV2)) + if err != nil { + return nil, fmt.Errorf("new stream to peer %s: %w", pid, err) + } + + // actually write the data to the stream + localStI := r.cfg.Chain.GetStatus(statusV1) + localSt, _ := localStI.(*pb.StatusV2) + + if err := r.writeRequest(ctx, stream, localSt); err != nil { + stream.Reset() + return nil, fmt.Errorf("write status V2 request: %w", err) + } + + // read and decode status response + resp := &pb.StatusV2{} + if err := r.readResponse(ctx, stream, resp); err != nil { + stream.Reset() + return nil, fmt.Errorf("read status V2 response: %w", err) + } + + _ = stream.Close() + + return resp, nil +} + func (r *ReqResp) Ping(ctx context.Context, pid peer.ID) (err error) { defer func() { traceEvt := &hermeshost.TraceEvent{ @@ -714,30 +783,29 @@ func (r *ReqResp) Ping(ctx context.Context, pid peer.ID) (err error) { if err != nil { return fmt.Errorf("new %s stream to peer %s: %w", p2p.RPCPingTopicV1, pid, err) } - defer logDeferErr(stream.Reset, "failed closing stream") // no-op if closed - r.metaDataMu.RLock() - seqNum := r.metaData.SeqNumber - r.metaDataMu.RUnlock() + seqNum := r.cfg.Chain.CurrentSeqNumber() req := primitives.SSZUint64(seqNum) if err := r.writeRequest(ctx, stream, &req); err != nil { + stream.Reset() return fmt.Errorf("write ping request: %w", err) } // read and decode status response resp := new(primitives.SSZUint64) if err := r.readResponse(ctx, stream, resp); err != nil { + stream.Reset() return fmt.Errorf("read ping response: %w", err) } - // we have the data that we want, so ignore error here - _ = stream.Close() // (both sides should actually be already closed) + _ = stream.Close() return nil } -func (r *ReqResp) MetaData(ctx context.Context, pid peer.ID) (resp *pb.MetaDataV1, err error) { +// MetaData requests V1 metadata from a peer +func (r *ReqResp) MetaDataV1(ctx context.Context, pid peer.ID) (resp *pb.MetaDataV1, err error) { defer func() { reqData := map[string]any{ "PeerID": pid.String(), @@ -771,21 +839,84 @@ func (r *ReqResp) MetaData(ctx context.Context, pid peer.ID) (resp *pb.MetaDataV r.meterRequestCounter.Add(traceCtx, 1, metric.WithAttributes(attrs...)) }() - slog.Debug("Perform metadata request", tele.LogAttrPeerID(pid)) + slog.Debug("Perform metadata V1 request", tele.LogAttrPeerID(pid)) stream, err := r.host.NewStream(ctx, pid, r.protocolID(p2p.RPCMetaDataTopicV2)) if err != nil { return resp, fmt.Errorf("new %s stream to peer %s: %w", p2p.RPCMetaDataTopicV2, pid, err) } - defer logDeferErr(stream.Reset, "failed closing stream") // no-op if closed - // read and decode status response + if err := r.writeRequest(ctx, stream, nil); err != nil { + stream.Reset() + return nil, fmt.Errorf("write metadata v2 request %s", err) + } + + // read and decode metadata response resp = &pb.MetaDataV1{} if err := r.readResponse(ctx, stream, resp); err != nil { - return resp, fmt.Errorf("read ping response: %w", err) + stream.Reset() + return resp, fmt.Errorf("read metadata response: %w", err) } - // we have the data that we want, so ignore error here - _ = stream.Close() // (both sides should actually be already closed) + _ = stream.Close() + + return resp, nil +} + +// MetaDataV2 requests V2 metadata from a peer (includes custody group count) +func (r *ReqResp) MetaDataV2(ctx context.Context, pid peer.ID) (resp *pb.MetaDataV2, err error) { + defer func() { + reqData := map[string]any{ + "PeerID": pid.String(), + } + + if resp != nil { + reqData["SeqNumber"] = resp.SeqNumber + reqData["Attnets"] = resp.Attnets + reqData["Syncnets"] = resp.Syncnets + reqData["CustodyGroupCount"] = resp.CustodyGroupCount + } + + if err != nil { + reqData["Error"] = err.Error() + } + + traceEvt := &hermeshost.TraceEvent{ + Type: "REQUEST_METADATA_V2", + PeerID: r.host.ID(), + Timestamp: time.Now(), + Payload: reqData, + } + traceCtx := context.Background() + if err := r.cfg.DataStream.PutRecord(traceCtx, traceEvt); err != nil { + slog.Warn("failed to put record", tele.LogAttrError(err)) + } + + attrs := []attribute.KeyValue{ + attribute.String("rpc", "meta_data_v2"), + attribute.Bool("success", err == nil), + } + r.meterRequestCounter.Add(traceCtx, 1, metric.WithAttributes(attrs...)) + }() + + slog.Debug("Perform metadata V2 request", tele.LogAttrPeerID(pid)) + stream, err := r.host.NewStream(ctx, pid, r.protocolID(p2p.RPCMetaDataTopicV3)) + if err != nil { + return resp, fmt.Errorf("new %s stream to peer %s: %w", p2p.RPCMetaDataTopicV3, pid, err) + } + + if err := r.writeRequest(ctx, stream, nil); err != nil { + stream.Reset() + return nil, fmt.Errorf("write metadata v2 request %s", err) + } + + // read and decode metadata response + resp = &pb.MetaDataV2{} + if err := r.readResponse(ctx, stream, resp); err != nil { + stream.Reset() + return resp, fmt.Errorf("read metadata V2 response: %w", err) + } + + _ = stream.Close() return resp, nil } @@ -793,9 +924,7 @@ func (r *ReqResp) MetaData(ctx context.Context, pid peer.ID) (resp *pb.MetaDataV func (r *ReqResp) BlocksByRangeV2(ctx context.Context, pid peer.ID, firstSlot, lastSlot uint64) ([]interfaces.ReadOnlySignedBeaconBlock, error) { var err error blocks := make([]interfaces.ReadOnlySignedBeaconBlock, 0, (lastSlot - firstSlot)) - startT := time.Now() - defer func() { reqData := map[string]any{ "PeerID": pid.String(), @@ -834,8 +963,6 @@ func (r *ReqResp) BlocksByRangeV2(ctx context.Context, pid peer.ID, firstSlot, l if err != nil { return blocks, fmt.Errorf("new %s stream to peer %s: %w", p2p.RPCBlocksByRangeTopicV2, pid, err) } - defer stream.Close() - defer logDeferErr(stream.Reset, "failed closing stream") // no-op if closed req := &pb.BeaconBlocksByRangeRequest{ StartSlot: primitives.Slot(firstSlot), @@ -843,6 +970,7 @@ func (r *ReqResp) BlocksByRangeV2(ctx context.Context, pid peer.ID, firstSlot, l Step: 1, } if err := r.writeRequest(ctx, stream, req); err != nil { + stream.Reset() return blocks, fmt.Errorf("write block_by_range request: %w", err) } @@ -864,13 +992,17 @@ func (r *ReqResp) BlocksByRangeV2(ctx context.Context, pid peer.ID, firstSlot, l break } if err != nil { + stream.Reset() return nil, fmt.Errorf("reading block_by_range request: %w", err) } if err := process(blk); err != nil { + stream.Reset() return nil, fmt.Errorf("processing block_by_range chunk: %w", err) } } + _ = stream.Close() + return blocks, nil } @@ -884,6 +1016,7 @@ func (r *ReqResp) readRequest(ctx context.Context, stream network.Stream, data s _, span := r.cfg.Tracer.Start(ctx, "read_request") defer func() { if err != nil { + slog.Error("reading request", "err", err.Error()) span.RecordError(err) span.SetStatus(codes.Error, err.Error()) } @@ -901,7 +1034,6 @@ func (r *ReqResp) readRequest(ctx context.Context, stream network.Stream, data s if err = stream.CloseRead(); err != nil { return fmt.Errorf("failed to close reading side of stream: %w", err) } - return nil } @@ -912,6 +1044,7 @@ func (r *ReqResp) readResponse(ctx context.Context, stream network.Stream, data _, span := r.cfg.Tracer.Start(ctx, "read_response") defer func() { if err != nil { + slog.Error("reading response", "err", err.Error()) span.RecordError(err) span.SetStatus(codes.Error, err.Error()) } @@ -955,11 +1088,12 @@ func (r *ReqResp) writeRequest(ctx context.Context, stream network.Stream, data _, span := r.cfg.Tracer.Start(ctx, "write_request") defer func() { if err != nil { + slog.Error("error writing request", "err", err.Error()) span.RecordError(err) span.SetStatus(codes.Error, err.Error()) } span.End() - if err = stream.CloseWrite(); err != nil { + if wErr := stream.CloseWrite(); wErr != nil { slog.Error( "failed to close writing side of stream", "peer", stream.Conn().RemotePeer().String(), @@ -985,17 +1119,25 @@ func (r *ReqResp) writeResponse(ctx context.Context, stream network.Stream, data _, span := r.cfg.Tracer.Start(ctx, "write_response") defer func() { if err != nil { + slog.Error("error writing response", "err", err.Error()) span.RecordError(err) span.SetStatus(codes.Error, err.Error()) } span.End() + if wErr := stream.CloseWrite(); wErr != nil { + slog.Error( + "failed to close writing side of stream", + "peer", stream.Conn().RemotePeer().String(), + "error", err.Error(), + ) + } }() if err = stream.SetWriteDeadline(time.Now().Add(r.cfg.WriteTimeout)); err != nil { return fmt.Errorf("failed setting write deadline on stream: %w", err) } - if _, err := stream.Write([]byte{0}); err != nil { // success response + if _, err := stream.Write([]byte{0x00}); err != nil { // success response return fmt.Errorf("write success response code: %w", err) } @@ -1003,10 +1145,6 @@ func (r *ReqResp) writeResponse(ctx context.Context, stream network.Stream, data return fmt.Errorf("read sequence number: %w", err) } - if err = stream.CloseWrite(); err != nil { - return fmt.Errorf("failed to close writing side of stream: %w", err) - } - return nil } @@ -1136,7 +1274,7 @@ func (r *ReqResp) getBlockForForkVersion(forkV ForkVersion, encoding encoder.Net return blocks.NewSignedBeaconBlock(blk) default: sblk, _ := blocks.NewSignedBeaconBlock(&pb.SignedBeaconBlock{}) - return sblk, fmt.Errorf("unrecognized fork_version (received:%s) (ours: %s) (global: %s)", forkV, r.cfg.ForkDigest, DenebForkVersion) + return sblk, fmt.Errorf("unrecognized fork_version (received:%s) (ours: %d) (global: %s)", forkV, r.cfg.Chain.CurrentFork(), DenebForkVersion) } } diff --git a/eth/reqresp_test.go b/eth/reqresp_test.go index 65bc1d2..03a36a3 100644 --- a/eth/reqresp_test.go +++ b/eth/reqresp_test.go @@ -8,7 +8,11 @@ import ( "github.com/OffchainLabs/prysm/v6/beacon-chain/core/signing" "github.com/OffchainLabs/prysm/v6/beacon-chain/p2p/encoder" + "github.com/OffchainLabs/prysm/v6/consensus-types/primitives" + pb "github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1" "github.com/probe-lab/hermes/host" + "github.com/prysmaticlabs/go-bitfield" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/otel" ) @@ -32,7 +36,9 @@ func TestReqResp_ProtocolRequests(t *testing.T) { // try all the request as the node is initialized requestPing(t, ctx, ethNode) requestStatus(t, ctx, ethNode) + requestStatusV2(t, ctx, ethNode) requestMetaDataV2(t, ctx, ethNode) + requestMetaDataV3(t, ctx, ethNode) requestBlockByRangeV2(t, ctx, ethNode) } @@ -46,8 +52,18 @@ func requestStatus(t *testing.T, ctx context.Context, ethNode *Node) { require.NoError(t, err) } +func requestStatusV2(t *testing.T, ctx context.Context, ethNode *Node) { + _, err := ethNode.reqResp.StatusV2(ctx, ethNode.pryInfo.ID) + require.NoError(t, err) +} + func requestMetaDataV2(t *testing.T, ctx context.Context, ethNode *Node) { - _, err := ethNode.reqResp.MetaData(ctx, ethNode.pryInfo.ID) + _, err := ethNode.reqResp.MetaDataV1(ctx, ethNode.pryInfo.ID) + require.NoError(t, err) +} + +func requestMetaDataV3(t *testing.T, ctx context.Context, ethNode *Node) { + _, err := ethNode.reqResp.MetaDataV2(ctx, ethNode.pryInfo.ID) require.NoError(t, err) } @@ -114,3 +130,121 @@ func composeLocalEthNode(t *testing.T, ctx context.Context) (*Node, context.Canc }() return ethNode, cancel } + +// TestStatusHolder tests the StatusHolder version-aware wrapper +func TestStatusHolder(t *testing.T) { + holder := &StatusHolder{} + + // Test V1 status + statusV1 := &pb.Status{ + ForkDigest: []byte{1, 2, 3, 4}, + FinalizedRoot: []byte("finalized_root_v1"), + FinalizedEpoch: 100, + HeadRoot: []byte("head_root_v1"), + HeadSlot: 1000, + } + + holder.SetV1(statusV1) + assert.True(t, holder.GetV1() != nil) + assert.False(t, holder.IsV2()) + assert.Equal(t, statusV1.ForkDigest, holder.ForkDigest()) + assert.Equal(t, statusV1.FinalizedEpoch, holder.FinalizedEpoch()) + assert.Equal(t, statusV1.HeadSlot, holder.HeadSlot()) + + // Test V2 status + statusV2 := &pb.StatusV2{ + ForkDigest: []byte{5, 6, 7, 8}, + FinalizedRoot: []byte("finalized_root_v2"), + FinalizedEpoch: 200, + HeadRoot: []byte("head_root_v2"), + HeadSlot: 2000, + EarliestAvailableSlot: 1500, + } + + holder.SetV2(statusV2) + assert.True(t, holder.GetV2() != nil) + assert.True(t, holder.IsV2()) + assert.Nil(t, holder.GetV1()) // V1 should be cleared + assert.Equal(t, statusV2.ForkDigest, holder.ForkDigest()) + assert.Equal(t, statusV2.FinalizedEpoch, holder.FinalizedEpoch()) + assert.Equal(t, statusV2.HeadSlot, holder.HeadSlot()) + + // Test EarliestAvailableSlot + slot, hasSlot := holder.EarliestAvailableSlot() + assert.True(t, hasSlot) + assert.Equal(t, primitives.Slot(1500), slot) + + // Test with V1 (no earliest slot) + holder.SetV1(statusV1) + slot, hasSlot = holder.EarliestAvailableSlot() + assert.False(t, hasSlot) + assert.Equal(t, primitives.Slot(0), slot) +} + +// TestMetadataHolder tests the MetadataHolder version-aware wrapper +func TestMetadataHolder(t *testing.T) { + holder := &MetadataHolder{} + + // Test V0 metadata + metaV0 := &pb.MetaDataV0{ + SeqNumber: 1, + Attnets: bitfield.Bitvector64{0xFF, 0x00}, + } + + holder.SetV0(metaV0) + assert.NotNil(t, holder.GetV0()) + assert.Nil(t, holder.GetV1()) + assert.Nil(t, holder.GetV2()) + assert.Equal(t, 0, holder.Version()) + assert.Equal(t, uint64(1), holder.SeqNumber()) + assert.Equal(t, metaV0.Attnets, holder.Attnets()) + + // V0 doesn't have syncnets + syncnets, hasSyncnets := holder.Syncnets() + assert.False(t, hasSyncnets) + assert.Equal(t, bitfield.Bitvector4{}, syncnets) + + // Test V1 metadata + metaV1 := &pb.MetaDataV1{ + SeqNumber: 2, + Attnets: bitfield.Bitvector64{0xAA, 0xBB}, + Syncnets: bitfield.Bitvector4{0x0F}, + } + + holder.SetV1(metaV1) + assert.Nil(t, holder.GetV0()) // V0 should be cleared + assert.NotNil(t, holder.GetV1()) + assert.Nil(t, holder.GetV2()) + assert.Equal(t, 1, holder.Version()) + assert.Equal(t, uint64(2), holder.SeqNumber()) + + syncnets, hasSyncnets = holder.Syncnets() + assert.True(t, hasSyncnets) + assert.Equal(t, metaV1.Syncnets, syncnets) + + // Test V2 metadata + metaV2 := &pb.MetaDataV2{ + SeqNumber: 3, + Attnets: bitfield.Bitvector64{0xCC, 0xDD}, + Syncnets: bitfield.Bitvector4{0x0A}, + CustodyGroupCount: 16, + } + + holder.SetV2(metaV2) + assert.Nil(t, holder.GetV0()) + assert.Nil(t, holder.GetV1()) // V1 should be cleared + assert.NotNil(t, holder.GetV2()) + assert.Equal(t, 2, holder.Version()) + assert.Equal(t, uint64(3), holder.SeqNumber()) + + // Test CustodyGroupCount + count, hasCount := holder.CustodyGroupCount() + assert.True(t, hasCount) + assert.Equal(t, uint64(16), count) + + // Test with V1 (no custody group count) + holder.SetV1(metaV1) + count, hasCount = holder.CustodyGroupCount() + assert.False(t, hasCount) + assert.Equal(t, uint64(0), count) +} diff --git a/eth/reqresp_types.go b/eth/reqresp_types.go new file mode 100644 index 0000000..582093c --- /dev/null +++ b/eth/reqresp_types.go @@ -0,0 +1,207 @@ +package eth + +import ( + "github.com/OffchainLabs/prysm/v6/consensus-types/primitives" + pb "github.com/OffchainLabs/prysm/v6/proto/prysm/v1alpha1" + "github.com/prysmaticlabs/go-bitfield" +) + +// StatusHolder wraps different status versions +type StatusHolder struct { + v1 *pb.Status + v2 *pb.StatusV2 +} + +// SetV1 sets the V1 status +func (s *StatusHolder) SetV1(status *pb.Status) { + s.v1 = status + s.v2 = nil +} + +// SetV2 sets the V2 status +func (s *StatusHolder) SetV2(status *pb.StatusV2) { + s.v2 = status + s.v1 = nil +} + +// GetV1 returns the V1 status or nil if not set +func (s *StatusHolder) GetV1() *pb.Status { + return s.v1 +} + +// GetV2 returns the V2 status or nil if not set +func (s *StatusHolder) GetV2() *pb.StatusV2 { + return s.v2 +} + +// IsV2 returns true if this holder contains a V2 status +func (s *StatusHolder) IsV2() bool { + return s.v2 != nil +} + +// ForkDigest returns the fork digest from either version +func (s *StatusHolder) ForkDigest() []byte { + if s.v2 != nil { + return s.v2.ForkDigest + } + if s.v1 != nil { + return s.v1.ForkDigest + } + return nil +} + +// FinalizedEpoch returns the finalized epoch from either version +func (s *StatusHolder) FinalizedEpoch() primitives.Epoch { + if s.v2 != nil { + return s.v2.FinalizedEpoch + } + if s.v1 != nil { + return s.v1.FinalizedEpoch + } + return 0 +} + +// FinalizedRoot returns the finalized root from either version +func (s *StatusHolder) FinalizedRoot() []byte { + if s.v2 != nil { + return s.v2.FinalizedRoot + } + if s.v1 != nil { + return s.v1.FinalizedRoot + } + return nil +} + +// HeadRoot returns the head root from either version +func (s *StatusHolder) HeadRoot() []byte { + if s.v2 != nil { + return s.v2.HeadRoot + } + if s.v1 != nil { + return s.v1.HeadRoot + } + return nil +} + +// HeadSlot returns the head slot from either version +func (s *StatusHolder) HeadSlot() primitives.Slot { + if s.v2 != nil { + return s.v2.HeadSlot + } + if s.v1 != nil { + return s.v1.HeadSlot + } + return 0 +} + +// EarliestAvailableSlot returns the earliest available slot if V2, otherwise returns 0 and false +func (s *StatusHolder) EarliestAvailableSlot() (primitives.Slot, bool) { + if s.v2 != nil { + return s.v2.EarliestAvailableSlot, true + } + return 0, false +} + +// MetadataHolder wraps different metadata versions +type MetadataHolder struct { + v0 *pb.MetaDataV0 + v1 *pb.MetaDataV1 + v2 *pb.MetaDataV2 +} + +// SetV0 sets the V0 metadata +func (m *MetadataHolder) SetV0(md *pb.MetaDataV0) { + m.v0 = md + m.v1 = nil + m.v2 = nil +} + +// SetV1 sets the V1 metadata +func (m *MetadataHolder) SetV1(md *pb.MetaDataV1) { + m.v0 = nil + m.v1 = md + m.v2 = nil +} + +// SetV2 sets the V2 metadata +func (m *MetadataHolder) SetV2(md *pb.MetaDataV2) { + m.v0 = nil + m.v1 = nil + m.v2 = md +} + +// GetV0 returns the V0 metadata or nil if not set +func (m *MetadataHolder) GetV0() *pb.MetaDataV0 { + return m.v0 +} + +// GetV1 returns the V1 metadata or nil if not set +func (m *MetadataHolder) GetV1() *pb.MetaDataV1 { + return m.v1 +} + +// GetV2 returns the V2 metadata or nil if not set +func (m *MetadataHolder) GetV2() *pb.MetaDataV2 { + return m.v2 +} + +// SeqNumber returns the sequence number from any version +func (m *MetadataHolder) SeqNumber() uint64 { + if m.v2 != nil { + return m.v2.SeqNumber + } + if m.v1 != nil { + return m.v1.SeqNumber + } + if m.v0 != nil { + return m.v0.SeqNumber + } + return 0 +} + +// Attnets returns the attestation subnets from any version +func (m *MetadataHolder) Attnets() bitfield.Bitvector64 { + if m.v2 != nil { + return m.v2.Attnets + } + if m.v1 != nil { + return m.v1.Attnets + } + if m.v0 != nil { + return m.v0.Attnets + } + return bitfield.Bitvector64{} +} + +// Syncnets returns the sync committee subnets if available (V1 and V2 only) +func (m *MetadataHolder) Syncnets() (bitfield.Bitvector4, bool) { + if m.v2 != nil { + return m.v2.Syncnets, true + } + if m.v1 != nil { + return m.v1.Syncnets, true + } + return bitfield.Bitvector4{}, false +} + +// CustodyGroupCount returns the custody group count if V2, otherwise returns 0 and false +func (m *MetadataHolder) CustodyGroupCount() (uint64, bool) { + if m.v2 != nil { + return m.v2.CustodyGroupCount, true + } + return 0, false +} + +// Version returns the version number of the stored metadata +func (m *MetadataHolder) Version() int { + if m.v2 != nil { + return 2 + } + if m.v1 != nil { + return 1 + } + if m.v0 != nil { + return 0 + } + return -1 +} diff --git a/eth/subnets.go b/eth/subnets.go index 9bbce6f..fc888f3 100644 --- a/eth/subnets.go +++ b/eth/subnets.go @@ -52,6 +52,9 @@ func HasSubnets(topic string) (subnets uint64, hasSubnets bool) { case p2p.GossipBlobSidecarMessage: return GlobalBeaconConfig.BlobsidecarSubnetCountElectra, true + case p2p.GossipDataColumnSidecarMessage: + return GlobalBeaconConfig.DataColumnSidecarSubnetCount, true + default: return uint64(0), false } diff --git a/eth/topic_score_params.go b/eth/topic_score_params.go index 4660070..949f22e 100644 --- a/eth/topic_score_params.go +++ b/eth/topic_score_params.go @@ -67,7 +67,9 @@ func topicToScoreParamsMapper(topic string, activeValidators uint64) *pubsub.Top case strings.Contains(topic, p2p.GossipBlsToExecutionChangeMessage): return defaultBlsToExecutionChangeTopicParams() - case strings.Contains(topic, p2p.GossipBlobSidecarMessage): + case strings.Contains(topic, p2p.GossipBlobSidecarMessage), + strings.Contains(topic, p2p.GossipDataColumnSidecarMessage): + // Using the same scoring as blocks for blob and data column sidecars (following prysm's approach). return defaultBlockTopicParams() default: diff --git a/funding.json b/funding.json index 5d0fede..9d6c5d1 100644 --- a/funding.json +++ b/funding.json @@ -2,4 +2,4 @@ "opRetro": { "projectId": "0x7504e494cb8d227193182e083128912173c14eaeecec9b90fa453de28377b269" } -} +} \ No newline at end of file diff --git a/go.mod b/go.mod index 8eb247d..bb1f977 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,9 @@ module github.com/probe-lab/hermes -go 1.24.0 - -toolchain go1.24.2 +go 1.25.1 require ( - github.com/OffchainLabs/prysm/v6 v6.0.1 + github.com/OffchainLabs/prysm/v6 v6.1.4 github.com/aws/aws-sdk-go-v2 v1.32.7 github.com/aws/aws-sdk-go-v2/config v1.28.7 github.com/aws/aws-sdk-go-v2/credentials v1.17.48 @@ -13,8 +11,8 @@ require ( github.com/aws/aws-sdk-go-v2/service/s3 v1.72.0 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 github.com/dennis-tra/go-kinesis v0.0.0-20240326083914-7acf5f8dc24e - github.com/ethereum/go-ethereum v1.15.9 - github.com/ferranbt/fastssz v0.1.4 + github.com/ethereum/go-ethereum v1.15.11 + github.com/ferranbt/fastssz v1.0.0 github.com/filecoin-project/go-f3 v0.8.4 github.com/filecoin-project/lotus v1.32.2 github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e @@ -22,40 +20,43 @@ require ( github.com/hashicorp/golang-lru/v2 v2.0.7 github.com/iand/pontium v0.3.15 github.com/ipni/go-libipni v0.6.18 - github.com/klauspost/compress v1.18.0 - github.com/libp2p/go-libp2p v0.41.1 + github.com/klauspost/compress v1.18.1 + github.com/libp2p/go-libp2p v0.44.0 github.com/libp2p/go-libp2p-kad-dht v0.33.0 - github.com/libp2p/go-libp2p-mplex v0.10.0 + github.com/libp2p/go-libp2p-mplex v0.11.0 github.com/libp2p/go-libp2p-pubsub v0.15.0 github.com/lmittmann/tint v1.0.6 - github.com/multiformats/go-multiaddr v0.16.0 + github.com/multiformats/go-multiaddr v0.16.1 github.com/parquet-go/parquet-go v0.24.0 - github.com/prometheus/client_golang v1.22.0 + github.com/probe-lab/eth-das-guardian v0.2.2 + github.com/prometheus/client_golang v1.23.2 github.com/prysmaticlabs/fastssz v0.0.0-20241008181541-518c4ce73516 github.com/prysmaticlabs/go-bitfield v0.0.0-20240618144021-706c95b2dd15 - github.com/stretchr/testify v1.10.0 + github.com/stretchr/testify v1.11.1 github.com/thejerf/suture/v4 v4.0.6 github.com/urfave/cli/v2 v2.27.5 github.com/whyrusleeping/cbor-gen v0.3.1 - go.opentelemetry.io/otel v1.36.0 + go.opentelemetry.io/otel v1.38.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 go.opentelemetry.io/otel/exporters/prometheus v0.55.0 - go.opentelemetry.io/otel/metric v1.36.0 + go.opentelemetry.io/otel/metric v1.38.0 go.opentelemetry.io/otel/sdk v1.34.0 - go.opentelemetry.io/otel/sdk/metric v1.33.0 - go.opentelemetry.io/otel/trace v1.36.0 - golang.org/x/crypto v0.39.0 - golang.org/x/time v0.11.0 - google.golang.org/grpc v1.70.0 - google.golang.org/protobuf v1.36.6 + go.opentelemetry.io/otel/sdk/metric v1.34.0 + go.opentelemetry.io/otel/trace v1.38.0 + golang.org/x/crypto v0.43.0 + golang.org/x/time v0.14.0 + google.golang.org/grpc v1.71.0 + google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v3 v3.0.1 ) require ( github.com/BurntSushi/toml v1.4.1-0.20240526193622-a339e1f7089c // indirect github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/OffchainLabs/hashtree v0.2.1-0.20250530191054-577f0b75c7f7 // indirect github.com/andybalholm/brotli v1.1.1 // indirect github.com/aristanetworks/goarista v0.0.0-20241115153057-bd75d7f26a44 // indirect + github.com/attestantio/go-eth2-client v0.27.1 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26 // indirect @@ -76,25 +77,21 @@ require ( github.com/bits-and-blooms/bitset v1.20.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect github.com/buger/jsonparser v1.1.1 // indirect + github.com/casbin/govaluate v1.8.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect - github.com/consensys/bavard v0.1.25 // indirect - github.com/consensys/gnark-crypto v0.14.0 // indirect - github.com/containerd/cgroups v1.1.0 // indirect - github.com/coreos/go-systemd/v22 v22.5.0 // indirect + github.com/consensys/gnark-crypto v0.18.1 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect + github.com/crate-crypto/go-eth-kzg v1.3.0 // indirect github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect github.com/crate-crypto/go-kzg-4844 v1.1.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect github.com/deckarep/golang-set/v2 v2.7.0 // indirect - github.com/dgraph-io/ristretto v0.2.0 // indirect - github.com/docker/go-units v0.5.0 // indirect + github.com/dgraph-io/ristretto/v2 v2.2.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/elastic/gosigar v0.14.3 // indirect - github.com/emicklei/dot v1.6.4 // indirect - github.com/ethereum/c-kzg-4844 v1.0.3 // indirect - github.com/ethereum/c-kzg-4844/v2 v2.1.1 // indirect + github.com/emicklei/dot v1.9.0 // indirect + github.com/ethereum/c-kzg-4844/v2 v2.1.5 // indirect github.com/ethereum/go-verkle v0.2.2 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/filecoin-project/go-address v1.2.0 // indirect @@ -105,8 +102,8 @@ require ( github.com/filecoin-project/go-clock v0.1.0 // indirect github.com/filecoin-project/go-hamt-ipld v0.1.5 // indirect github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 // indirect - github.com/filecoin-project/go-hamt-ipld/v3 v3.4.0 // indirect - github.com/filecoin-project/go-state-types v0.16.0 // indirect + github.com/filecoin-project/go-hamt-ipld/v3 v3.4.1 // indirect + github.com/filecoin-project/go-state-types v0.17.0 // indirect github.com/filecoin-project/specs-actors v0.9.15 // indirect github.com/filecoin-project/specs-actors/v2 v2.3.6 // indirect github.com/filecoin-project/specs-actors/v3 v3.1.2 // indirect @@ -121,8 +118,8 @@ require ( github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.3.0 // indirect - github.com/go-task/slim-sprig/v3 v3.0.0 // indirect - github.com/godbus/dbus/v5 v5.1.0 // indirect + github.com/go-openapi/jsonreference v0.20.4 // indirect + github.com/goccy/go-yaml v1.18.0 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.2 // indirect @@ -130,7 +127,6 @@ require ( github.com/google/go-cmp v0.7.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/gopacket v1.1.19 // indirect - github.com/google/pprof v0.0.0-20250501235452-c0086092b71a // indirect github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect @@ -140,33 +136,33 @@ require ( github.com/invopop/jsonschema v0.12.0 // indirect github.com/ipfs/boxo v0.30.0 // indirect github.com/ipfs/go-block-format v0.2.0 // indirect - github.com/ipfs/go-cid v0.5.0 // indirect - github.com/ipfs/go-datastore v0.8.2 // indirect + github.com/ipfs/go-cid v0.6.0 // indirect + github.com/ipfs/go-datastore v0.9.0 // indirect github.com/ipfs/go-ipfs-util v0.0.3 // indirect github.com/ipfs/go-ipld-cbor v0.2.0 // indirect github.com/ipfs/go-ipld-format v0.6.0 // indirect github.com/ipfs/go-log v1.0.5 // indirect - github.com/ipfs/go-log/v2 v2.6.0 // indirect + github.com/ipfs/go-log/v2 v2.8.2 // indirect github.com/ipld/go-ipld-prime v0.21.0 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 // indirect - github.com/klauspost/cpuid/v2 v2.2.10 // indirect - github.com/koron/go-ssdp v0.0.6 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect + github.com/koron/go-ssdp v0.1.0 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-cidranger v1.1.0 // indirect - github.com/libp2p/go-flow-metrics v0.2.0 // indirect + github.com/libp2p/go-flow-metrics v0.3.0 // indirect github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect github.com/libp2p/go-libp2p-kbucket v0.7.0 // indirect github.com/libp2p/go-libp2p-record v0.3.1 // indirect github.com/libp2p/go-libp2p-routing-helpers v0.7.5 // indirect github.com/libp2p/go-mplex v0.7.0 // indirect github.com/libp2p/go-msgio v0.3.0 // indirect - github.com/libp2p/go-netroute v0.2.2 // indirect + github.com/libp2p/go-netroute v0.4.0 // indirect github.com/libp2p/go-reuseport v0.4.0 // indirect github.com/libp2p/go-yamux/v5 v5.0.1 // indirect github.com/logrusorgru/aurora v2.0.3+incompatible // indirect @@ -175,14 +171,13 @@ require ( github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/miekg/dns v1.1.66 // indirect + github.com/miekg/dns v1.1.68 // indirect github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect github.com/minio/highwayhash v1.0.3 // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect @@ -192,61 +187,60 @@ require ( github.com/multiformats/go-multiaddr-dns v0.4.1 // indirect github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect github.com/multiformats/go-multibase v0.2.0 // indirect - github.com/multiformats/go-multicodec v0.9.1 // indirect + github.com/multiformats/go-multicodec v0.10.0 // indirect github.com/multiformats/go-multihash v0.2.3 // indirect github.com/multiformats/go-multistream v0.6.1 // indirect - github.com/multiformats/go-varint v0.0.7 // indirect + github.com/multiformats/go-varint v0.1.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/onsi/ginkgo/v2 v2.23.4 // indirect - github.com/opencontainers/runtime-spec v1.2.1 // indirect + github.com/onsi/gomega v1.36.3 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/pion/datachannel v1.5.10 // indirect github.com/pion/dtls/v2 v2.2.12 // indirect - github.com/pion/dtls/v3 v3.0.6 // indirect + github.com/pion/dtls/v3 v3.0.7 // indirect github.com/pion/ice/v4 v4.0.10 // indirect - github.com/pion/interceptor v0.1.39 // indirect - github.com/pion/logging v0.2.3 // indirect + github.com/pion/interceptor v0.1.41 // indirect + github.com/pion/logging v0.2.4 // indirect github.com/pion/mdns/v2 v2.0.7 // indirect github.com/pion/randutil v0.1.0 // indirect - github.com/pion/rtcp v1.2.15 // indirect - github.com/pion/rtp v1.8.21 // indirect - github.com/pion/sctp v1.8.39 // indirect - github.com/pion/sdp/v3 v3.0.11 // indirect - github.com/pion/srtp/v3 v3.0.4 // indirect + github.com/pion/rtcp v1.2.16 // indirect + github.com/pion/rtp v1.8.25 // indirect + github.com/pion/sctp v1.8.40 // indirect + github.com/pion/sdp/v3 v3.0.16 // indirect + github.com/pion/srtp/v3 v3.0.8 // indirect github.com/pion/stun v0.6.1 // indirect - github.com/pion/stun/v3 v3.0.0 // indirect + github.com/pion/stun/v3 v3.0.1 // indirect github.com/pion/transport/v2 v2.2.10 // indirect - github.com/pion/transport/v3 v3.0.7 // indirect - github.com/pion/turn/v4 v4.0.1 // indirect - github.com/pion/webrtc/v4 v4.1.0 // indirect + github.com/pion/transport/v3 v3.0.8 // indirect + github.com/pion/turn/v4 v4.1.2 // indirect + github.com/pion/webrtc/v4 v4.1.6 // indirect + github.com/pk910/dynamic-ssz v1.1.1 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/polydawn/refmt v0.89.0 // indirect github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.63.0 // indirect - github.com/prometheus/procfs v0.16.1 // indirect - github.com/prometheus/prom2json v1.4.1 // indirect - github.com/prometheus/prometheus v0.301.0 // indirect - github.com/prysmaticlabs/gohashtree v0.0.4-beta.0.20240624100937-73632381301b // indirect + github.com/prometheus/common v0.67.2 // indirect + github.com/prometheus/procfs v0.19.2 // indirect + github.com/prometheus/prom2json v1.3.0 // indirect + github.com/prysmaticlabs/gohashtree v0.0.5-beta // indirect github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c // indirect github.com/quic-go/qpack v0.5.1 // indirect - github.com/quic-go/quic-go v0.51.0 // indirect - github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 // indirect - github.com/raulk/go-watchdog v1.3.0 // indirect + github.com/quic-go/quic-go v0.55.0 // indirect + github.com/quic-go/webtransport-go v0.9.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/rogpeppe/go-internal v1.13.1 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/schollz/progressbar/v3 v3.17.1 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/afero v1.11.0 // indirect - github.com/supranational/blst v0.3.14 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe // indirect + github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/thomaso-mirodin/intmath v0.0.0-20160323211736-5dc6d854e46e // indirect github.com/tklauser/go-sysconf v0.3.14 // indirect github.com/tklauser/numcpus v0.9.0 // indirect @@ -259,26 +253,27 @@ require ( github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect go.etcd.io/bbolt v1.3.11 // indirect - go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 // indirect go.opentelemetry.io/proto/otlp v1.5.0 // indirect - go.uber.org/automaxprocs v1.6.0 // indirect go.uber.org/dig v1.19.0 // indirect go.uber.org/fx v1.24.0 // indirect - go.uber.org/mock v0.5.2 // indirect + go.uber.org/mock v0.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect - golang.org/x/mod v0.25.0 // indirect - golang.org/x/net v0.40.0 // indirect - golang.org/x/oauth2 v0.27.0 // indirect - golang.org/x/sync v0.15.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/term v0.32.0 // indirect - golang.org/x/text v0.26.0 // indirect - golang.org/x/tools v0.33.0 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect + golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/oauth2 v0.32.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/telemetry v0.0.0-20251028164327-d7a2859f34e8 // indirect + golang.org/x/term v0.36.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/tools v0.38.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gonum.org/v1/gonum v0.16.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250212204824-5a70512c5d8b // indirect @@ -290,7 +285,6 @@ require ( k8s.io/klog/v2 v2.130.1 // indirect k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect lukechampine.com/blake3 v1.4.1 // indirect - rsc.io/tmplfunc v0.0.3 // indirect sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.5.0 // indirect sigs.k8s.io/yaml v1.4.0 // indirect diff --git a/go.sum b/go.sum index c0888ba..f74d27c 100644 --- a/go.sum +++ b/go.sum @@ -17,8 +17,10 @@ github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= -github.com/OffchainLabs/prysm/v6 v6.0.1 h1:NwFsJTyPVQqhmEz4//GqAs+M6AjcWYqH9x+HvDGxgwk= -github.com/OffchainLabs/prysm/v6 v6.0.1/go.mod h1:7QuGy5ol0x0hx1Qmz0XcXJ3CnjWWKHpMiz++bUR0IIg= +github.com/OffchainLabs/hashtree v0.2.1-0.20250530191054-577f0b75c7f7 h1:0r1HjExe/tyypkt380UTpjvILd5kLw51Xzl6a+hknQ8= +github.com/OffchainLabs/hashtree v0.2.1-0.20250530191054-577f0b75c7f7/go.mod h1:b07+cRZs+eAR8TR57CB9TQlt5Gnl/06Xs76xt/1wq0M= +github.com/OffchainLabs/prysm/v6 v6.1.4 h1:gwLBbGaYsEh9zpZL337uVjXPX3F86UNJ7KIiFiPsY7c= +github.com/OffchainLabs/prysm/v6 v6.1.4/go.mod h1:VbMsULGbZkgM4kwbKxb/ywhhR/EtebwGPIAszIU59Ws= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= @@ -43,6 +45,8 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/attestantio/go-eth2-client v0.27.1 h1:g7bm+gG/p+gfzYdEuxuAepVWYb8EO+2KojV5/Lo2BxM= +github.com/attestantio/go-eth2-client v0.27.1/go.mod h1:fvULSL9WtNskkOB4i+Yyr6BKpNHXvmpGZj9969fCrfY= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= @@ -88,7 +92,6 @@ github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPn github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/bazelbuild/rules_go v0.23.2 h1:Wxu7JjqnF78cKZbsBsARLSXx/jlGaSLCnUV3mTlyHvM= github.com/bazelbuild/rules_go v0.23.2/go.mod h1:MC23Dc/wkXEyk3Wpq6lCqz0ZAYOZDw2DR5y3N1q2i7M= -github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -116,6 +119,8 @@ github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7 github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/casbin/govaluate v1.8.0 h1:1dUaV/I0LFP2tcY1uNQEb6wBCbp8GMTcC/zhwQDWvZo= +github.com/casbin/govaluate v1.8.0/go.mod h1:G/UnbIjZk/0uMNaLwZZmFQrR72tYRZWQkO70si/iR7A= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= @@ -127,7 +132,9 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chengxilo/virtualterm v1.0.4 h1:Z6IpERbRVlfB8WkOmtbHiDbBANU7cimRIof7mk9/PwM= github.com/chengxilo/virtualterm v1.0.4/go.mod h1:DyxxBZz/x1iqJjFxTFcr6/x+jSpqN0iwWCOK1q10rlY= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= @@ -144,25 +151,18 @@ github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZ github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/consensys/bavard v0.1.25 h1:5YcSBnp03/HvfpKaIQLr/ecspTp2k8YNR5rQLOWvUyc= -github.com/consensys/bavard v0.1.25/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs= -github.com/consensys/gnark-crypto v0.14.0 h1:DDBdl4HaBtdQsq/wfMwJvZNE80sHidrK3Nfrefatm0E= -github.com/consensys/gnark-crypto v0.14.0/go.mod h1:CU4UijNPsHawiVGNxe9co07FkzCeWHHrb1li/n1XoU0= -github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= -github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= +github.com/consensys/gnark-crypto v0.18.1 h1:RyLV6UhPRoYYzaFnPQA4qK3DyuDgkTgskDdoGqFt3fI= +github.com/consensys/gnark-crypto v0.18.1/go.mod h1:L3mXGFTe1ZN+RSJ+CLjUt9x7PNdx8ubaYfDROyp2Z8c= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/crate-crypto/go-eth-kzg v1.3.0 h1:05GrhASN9kDAidaFJOda6A4BEvgvuXbazXg/0E3OOdI= +github.com/crate-crypto/go-eth-kzg v1.3.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a h1:W8mUrRp6NOVl3J+MYp5kPMoUZPp7aOYHtaua31lwRHg= github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a/go.mod h1:sTwzHBvIzm2RfVCGNEBZgRyjwK40bVoun3ZnGOCafNM= github.com/crate-crypto/go-kzg-4844 v1.1.0 h1:EN/u9k2TF6OWSHrCCDBBU6GLNMq88OspHHlMnHfoyU4= @@ -190,13 +190,12 @@ github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRk github.com/dennis-tra/go-kinesis v0.0.0-20240326083914-7acf5f8dc24e h1:y6QyYh8YZyRQDdfnQqUgC5tRBmEwUFAjavnybKboCm4= github.com/dennis-tra/go-kinesis v0.0.0-20240326083914-7acf5f8dc24e/go.mod h1:5Hm3EOeNP1/lYm9qcFwWgYgjixQilwcZA+hZ05bUz54= github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= -github.com/dgraph-io/ristretto v0.2.0 h1:XAfl+7cmoUDWW/2Lx8TGZQjjxIQ2Ley9DSf52dru4WE= -github.com/dgraph-io/ristretto v0.2.0/go.mod h1:8uBHCU/PBV4Ag0CJrP47b9Ofby5dqWNh4FicAdoqFNU= +github.com/dgraph-io/ristretto/v2 v2.2.0 h1:bkY3XzJcXoMuELV8F+vS8kzNgicwQFAaGINAEJdWGOM= +github.com/dgraph-io/ristretto/v2 v2.2.0/go.mod h1:RZrm63UmcBAaYWC1DotLYBmTvgkrs0+XhBd7Npn7/zI= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -207,29 +206,24 @@ github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5m github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/elastic/gosigar v0.14.3 h1:xwkKwPia+hSfg9GqrCUKYdId102m9qTJIIr7egmK/uo= -github.com/elastic/gosigar v0.14.3/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= -github.com/emicklei/dot v1.6.4 h1:cG9ycT67d9Yw22G+mAb4XiuUz6E6H1S0zePp/5Cwe/c= -github.com/emicklei/dot v1.6.4/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= +github.com/emicklei/dot v1.9.0 h1:FyaJNctdMfaEIbTQ1FkKZ1UCZyJJSkyvkrXOVoNZPKU= +github.com/emicklei/dot v1.9.0/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/c-kzg-4844 v1.0.3 h1:IEnbOHwjixW2cTvKRUlAAUOeleV7nNM/umJR+qy4WDs= -github.com/ethereum/c-kzg-4844 v1.0.3/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/c-kzg-4844/v2 v2.1.1 h1:KhzBVjmURsfr1+S3k/VE35T02+AW2qU9t9gr4R6YpSo= -github.com/ethereum/c-kzg-4844/v2 v2.1.1/go.mod h1:TC48kOKjJKPbN7C++qIgt0TJzZ70QznYR7Ob+WXl57E= -github.com/ethereum/go-ethereum v1.15.9 h1:bRra1zi+/q+qyXZ6fylZOrlaF8kDdnlTtzNTmNHfX+g= -github.com/ethereum/go-ethereum v1.15.9/go.mod h1:+S9k+jFzlyVTNcYGvqFhzN/SFhI6vA+aOY4T5tLSPL0= +github.com/ethereum/c-kzg-4844/v2 v2.1.5 h1:aVtoLK5xwJ6c5RiqO8g8ptJ5KU+2Hdquf6G3aXiHh5s= +github.com/ethereum/c-kzg-4844/v2 v2.1.5/go.mod h1:u59hRTTah4Co6i9fDWtiCjTrblJv0UwsqZKCc0GfgUs= +github.com/ethereum/go-ethereum v1.15.11 h1:JK73WKeu0WC0O1eyX+mdQAVHUV+UR1a9VB/domDngBU= +github.com/ethereum/go-ethereum v1.15.11/go.mod h1:mf8YiHIb0GR4x4TipcvBUPxJLw1mFdmxzoDi11sDRoI= github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8= github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/ferranbt/fastssz v0.1.4 h1:OCDB+dYDEQDvAgtAGnTSidK1Pe2tW3nFV40XyMkTeDY= -github.com/ferranbt/fastssz v0.1.4/go.mod h1:Ea3+oeoRGGLGm5shYAeDgu6PGUlcvQhE2fILyD9+tGg= +github.com/ferranbt/fastssz v1.0.0 h1:9EXXYsracSqQRBQiHeaVsG/KQeYblPf40hsQPb9Dzk8= +github.com/ferranbt/fastssz v1.0.0/go.mod h1:Ea3+oeoRGGLGm5shYAeDgu6PGUlcvQhE2fILyD9+tGg= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v1.2.0 h1:NHmWUE/J7Pi2JZX3gZt32XuY69o9StVZeJxdBodIwOE= @@ -261,14 +255,14 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxl github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+eEvrDCGJoPLxFpDynFjYfBjI= github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -github.com/filecoin-project/go-hamt-ipld/v3 v3.4.0 h1:nYs6OPUF8KbZ3E8o9p9HJnQaE8iugjHR5WYVMcicDJc= -github.com/filecoin-project/go-hamt-ipld/v3 v3.4.0/go.mod h1:s0qiHRhFyrgW0SvdQMSJFQxNa4xEIG5XvqCBZUEgcbc= +github.com/filecoin-project/go-hamt-ipld/v3 v3.4.1 h1:wl+ZHruCcE9LvwU7blpwWn35XOcRS6+IBg75G7ZzxzY= +github.com/filecoin-project/go-hamt-ipld/v3 v3.4.1/go.mod h1:AqjryNfkxffpnqsa5mwnJHlazhVqF6W2nilu+VYKIq8= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.6/go.mod h1:UwGVoMsULoCK+bWjEdd/xLCvLAQFBC7EDT477SKml+Q= -github.com/filecoin-project/go-state-types v0.16.0 h1:ajIREDzTGfq71ofIQ29iZR1WXxmkvd2nQNc6ApcP1wI= -github.com/filecoin-project/go-state-types v0.16.0/go.mod h1:YCESyrqnyu17y0MazbV6Uwma5+BrMvEKEQp5QWeIf9g= +github.com/filecoin-project/go-state-types v0.17.0 h1:HpBb6G+VSOOI6rQFSnvPVyRsnms8je94cwvU69DJ+9Y= +github.com/filecoin-project/go-state-types v0.17.0/go.mod h1:em4yo9mglrdyHbcsxelHCSKMjLdJLddLERWQe6J8vYc= github.com/filecoin-project/lotus v1.32.2 h1:UQsJgLeZVKE7dPc171va7LlIBYN5XTSqrCs8hooGcik= github.com/filecoin-project/lotus v1.32.2/go.mod h1:eNfZ0eXGMckDBFQmL1/MJk/0UgxVKHy74z40uMrGlg4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -298,6 +292,7 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= @@ -332,13 +327,10 @@ github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+Gr github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= -github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= -github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= @@ -367,6 +359,8 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -381,7 +375,7 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= @@ -394,10 +388,8 @@ github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20250501235452-c0086092b71a h1:rDA3FfmxwXR+BVKKdz55WwMJ1pD2hJQNW31d+l3mPk4= -github.com/google/pprof v0.0.0-20250501235452-c0086092b71a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -464,6 +456,10 @@ github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iU github.com/holiman/uint256 v1.3.2 h1:a9EgMPSC1AAaj1SZL5zIQD3WbwTuHrMGOerLjGmM/TA= github.com/holiman/uint256 v1.3.2/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/go-clone v1.6.0 h1:HMo5uvg4wgfiy5FoGOqlFLQED/VGRm2D9Pi8g1FXPGc= +github.com/huandu/go-clone v1.6.0/go.mod h1:ReGivhG6op3GYr+UY3lS6mxjKp7MIGTknuU5TbTVaXE= +github.com/huandu/go-clone/generic v1.6.0 h1:Wgmt/fUZ28r16F2Y3APotFD59sHk1p78K0XLdbUYN5U= +github.com/huandu/go-clone/generic v1.6.0/go.mod h1:xgd9ZebcMsBWWcBx5mVMCoqMX24gLWr5lQicr+nVXNs= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v1.0.0/go.mod h1:n9v9KO1tAxYH82qOn+UTIFQDmx5n1Zxd/ClZDMX7Bnc= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= @@ -471,6 +467,7 @@ github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFck github.com/huin/goutil v0.0.0-20170803182201-1ca381bf3150/go.mod h1:PpLOETDnJ0o3iZrZfqZzyLl6l7F3c6L1oWn7OICBi6o= github.com/iand/pontium v0.3.15 h1:p9ZzSFPuC2gsLoqZJIPh5nrkRRAgi5JDEMYOfatrhws= github.com/iand/pontium v0.3.15/go.mod h1:Fn3hprsfb1nZuVsF0+b92K+HRY0WZcxrHkLUpWOapoI= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb-client-go/v2 v2.4.0 h1:HGBfZYStlx3Kqvsv1h2pJixbCl/jhnFtxpKFAv9Tu5k= github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= @@ -501,12 +498,12 @@ github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67Fexh github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.5.0 h1:goEKKhaGm0ul11IHA7I6p1GmKz8kEYniqFopaB5Otwg= -github.com/ipfs/go-cid v0.5.0/go.mod h1:0L7vmeNXpQpUS9vt+yEARkJ8rOg43DF3iPgn4GIN0mk= +github.com/ipfs/go-cid v0.6.0 h1:DlOReBV1xhHBhhfy/gBNNTSyfOM6rLiIx9J7A4DGf30= +github.com/ipfs/go-cid v0.6.0/go.mod h1:NC4kS1LZjzfhK40UGmpXv5/qD2kcMzACYJNntCUiDhQ= github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= -github.com/ipfs/go-datastore v0.8.2 h1:Jy3wjqQR6sg/LhyY0NIePZC3Vux19nLtg7dx0TVqr6U= -github.com/ipfs/go-datastore v0.8.2/go.mod h1:W+pI1NsUsz3tcsAACMtfC+IZdnQTnC/7VfPoJBQuts0= +github.com/ipfs/go-datastore v0.9.0 h1:WocriPOayqalEsueHv6SdD4nPVl4rYMfYGLD4bqCZ+w= +github.com/ipfs/go-datastore v0.9.0/go.mod h1:uT77w/XEGrvJWwHgdrMr8bqCN6ZTW9gzmi+3uK+ouHg= github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= @@ -544,8 +541,8 @@ github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= github.com/ipfs/go-log/v2 v2.0.5/go.mod h1:eZs4Xt4ZUJQFM3DlanGhy7TkwwawCZcSByscwkWG+dw= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= -github.com/ipfs/go-log/v2 v2.6.0 h1:2Nu1KKQQ2ayonKp4MPo6pXCjqw1ULc9iohRqWV5EYqg= -github.com/ipfs/go-log/v2 v2.6.0/go.mod h1:p+Efr3qaY5YXpx9TX7MoLCSEZX5boSWj9wh86P5HJa8= +github.com/ipfs/go-log/v2 v2.8.2 h1:nVG4nNHUwwI/sTs9Bi5iE8sXFQwXs3AjkkuWhg7+Y2I= +github.com/ipfs/go-log/v2 v2.8.2/go.mod h1:UhIYAwMV7Nb4ZmihUxfIRM2Istw/y9cAk3xaK+4Zs2c= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= @@ -607,15 +604,16 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= -github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co= +github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/koron/go-ssdp v0.0.0-20180514024734-4a0ed625a78b/go.mod h1:5Ky9EC2xfoUKUor0Hjgi2BJhCSXJfMOFlmyYrVKGQMk= -github.com/koron/go-ssdp v0.0.6 h1:Jb0h04599eq/CY7rB5YEqPS83HmRfHP2azkxMN2rFtU= -github.com/koron/go-ssdp v0.0.6/go.mod h1:0R9LfRJGek1zWTjN3JUNlm5INCDYGpRDfAptnct63fI= +github.com/koron/go-ssdp v0.1.0 h1:ckl5x5H6qSNFmi+wCuROvvGUu2FQnMbQrU95IHCcv3Y= +github.com/koron/go-ssdp v0.1.0/go.mod h1:GltaDBjtK1kemZOusWYLGotV0kBeEf59Bp0wtSB0uyU= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -640,12 +638,12 @@ github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38y github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= -github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw= -github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc= +github.com/libp2p/go-flow-metrics v0.3.0 h1:q31zcHUvHnwDO0SHaukewPYgwOBSxtt830uJtUx6784= +github.com/libp2p/go-flow-metrics v0.3.0/go.mod h1:nuhlreIwEguM1IvHAew3ij7A8BMlyHQJ279ao24eZZo= github.com/libp2p/go-libp2p v0.1.0/go.mod h1:6D/2OBauqLUoqcADOJpn9WbKqvaM07tDw68qHM0BxUM= github.com/libp2p/go-libp2p v0.1.1/go.mod h1:I00BRo1UuUSdpuc8Q2mN7yDF/oTUTRAX6JWpTiK9Rp8= -github.com/libp2p/go-libp2p v0.41.1 h1:8ecNQVT5ev/jqALTvisSJeVNvXYJyK4NhQx1nNRXQZE= -github.com/libp2p/go-libp2p v0.41.1/go.mod h1:DcGTovJzQl/I7HMrby5ZRjeD0kQkGiy+9w6aEkSZpRI= +github.com/libp2p/go-libp2p v0.44.0 h1:5Gtt8OrF8yiXmH+Mx4+/iBeFRMK1TY3a8OrEBDEqAvs= +github.com/libp2p/go-libp2p v0.44.0/go.mod h1:NovCojezAt4dnDd4fH048K7PKEqH0UFYYqJRjIIu8zc= github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= github.com/libp2p/go-libp2p-autonat v0.1.0/go.mod h1:1tLf2yXxiE/oKGtDwPYWTSYG3PtvYlJmg7NeVtPRqH8= @@ -663,8 +661,8 @@ github.com/libp2p/go-libp2p-kbucket v0.7.0/go.mod h1:blOINGIj1yiPYlVEX0Rj9QwEkmV github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= -github.com/libp2p/go-libp2p-mplex v0.10.0 h1:6NKusNu1cw1A/RKb+Lm5aPGFk7HWVIXxl2azpwWqUxc= -github.com/libp2p/go-libp2p-mplex v0.10.0/go.mod h1:7RT3qPFhDqz4yp5K5QwZB5vE902N8DmED3+e453fNrg= +github.com/libp2p/go-libp2p-mplex v0.11.0 h1:0vwpLXRSfkTzshEjETIEgJaVxXvg+orbxYoIb3Ty5qM= +github.com/libp2p/go-libp2p-mplex v0.11.0/go.mod h1:QrsdNY3lzjpdo9V1goJfPb0O65Nms0sUR8CDAO18f6k= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= @@ -696,8 +694,8 @@ github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+ github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= github.com/libp2p/go-nat v0.0.3/go.mod h1:88nUEt0k0JD45Bk93NIwDqjlhiOwOoV36GchpcVc1yI= -github.com/libp2p/go-netroute v0.2.2 h1:Dejd8cQ47Qx2kRABg6lPwknU7+nBnFRpko45/fFPuZ8= -github.com/libp2p/go-netroute v0.2.2/go.mod h1:Rntq6jUAH0l9Gg17w5bFGhcC9a+vk4KNXs6s7IljKYE= +github.com/libp2p/go-netroute v0.4.0 h1:sZZx9hyANYUx9PZyqcgE/E1GUG3iEtTZHUEvdtXT7/Q= +github.com/libp2p/go-netroute v0.4.0/go.mod h1:Nkd5ShYgSMS5MUKy/MU2T57xFoOKvvLR92Lic48LEyA= github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= @@ -722,6 +720,8 @@ github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0Q github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/marcopolo/simnet v0.0.1 h1:rSMslhPz6q9IvJeFWDoMGxMIrlsbXau3NkuIXHGJxfg= +github.com/marcopolo/simnet v0.0.1/go.mod h1:WDaQkgLAjqDUEBAOXz22+1j6wXKfGlC5sD5XWt3ddOs= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -745,8 +745,8 @@ github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfr github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.66 h1:FeZXOS3VCVsKnEAd+wBkjMC3D2K+ww66Cq3VnCINuJE= -github.com/miekg/dns v1.1.66/go.mod h1:jGFzBsSNbJw6z1HYut1RKBKHA9PBdxeHrZG8J+gC2WE= +github.com/miekg/dns v1.1.68 h1:jsSRkNozw7G/mnmXULynzMNIsgY2dHC8LO6U6Ij2JEA= +github.com/miekg/dns v1.1.68/go.mod h1:fujopn7TB3Pu3JM69XaawiU0wqjpL9/8xGop5UrTPps= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= @@ -777,9 +777,6 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/pointerstructure v1.2.0 h1:O+i9nHnXS3l/9Wu7r4NrEdwA2VFTicjUEN1uBnDo34A= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= -github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= -github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= -github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -805,8 +802,8 @@ github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lg github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= github.com/multiformats/go-multiaddr v0.1.1/go.mod h1:aMKBKNEYmzmDmxfX88/vz+J5IU55txyt0p4aiWVohjo= -github.com/multiformats/go-multiaddr v0.16.0 h1:oGWEVKioVQcdIOBlYM8BH1rZDWOGJSqr9/BKl6zQ4qc= -github.com/multiformats/go-multiaddr v0.16.0/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0= +github.com/multiformats/go-multiaddr v0.16.1 h1:fgJ0Pitow+wWXzN9do+1b8Pyjmo8m5WhGfzpL82MpCw= +github.com/multiformats/go-multiaddr v0.16.1/go.mod h1:JSVUmXDjsVFiW7RjIFMP7+Ev+h1DTbiJgVeTV/tcmP0= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.4.1 h1:whi/uCLbDS3mSEUMb1MsoT4uzUeZB0N32yzufqS0i5M= @@ -819,8 +816,8 @@ github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= -github.com/multiformats/go-multicodec v0.9.1 h1:x/Fuxr7ZuR4jJV4Os5g444F7xC4XmyUaT/FWtE+9Zjo= -github.com/multiformats/go-multicodec v0.9.1/go.mod h1:LLWNMtyV5ithSBUo3vFIMaeDy+h3EbkMTek1m+Fybbo= +github.com/multiformats/go-multicodec v0.10.0 h1:UpP223cig/Cx8J76jWt91njpK3GTAO1w02sdcjZDSuc= +github.com/multiformats/go-multicodec v0.10.0/go.mod h1:wg88pM+s2kZJEQfRCKBNU+g32F5aWBEjyFHXvZLTcLI= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= @@ -833,8 +830,8 @@ github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wS github.com/multiformats/go-multistream v0.6.1 h1:4aoX5v6T+yWmc2raBHsTvzmFhOI8WVOer28DeBBEYdQ= github.com/multiformats/go-multistream v0.6.1/go.mod h1:ksQf6kqHAb6zIsyw7Zm+gAuVo57Qbq84E27YlYqavqw= github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= -github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= +github.com/multiformats/go-varint v0.1.0 h1:i2wqFp4sdl3IcIxfAonHQV9qU5OsZ4Ts9IOoETFs5dI= +github.com/multiformats/go-varint v0.1.0/go.mod h1:5KVAVXegtfmNQQm/lCY+ATvDzvJJhSkUlGQV9wgObdI= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -849,8 +846,8 @@ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OS github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= -github.com/nxadm/tail v1.4.11/go.mod h1:OTaG3NK980DZzxbRq6lEuzgU+mug70nY11sMd4JXXHc= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -860,21 +857,19 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus= -github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU= github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww= -github.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -907,45 +902,47 @@ github.com/pion/datachannel v1.5.10/go.mod h1:p/jJfC9arb29W7WrxyKbepTU20CFgyx5oL github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk= github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= -github.com/pion/dtls/v3 v3.0.6 h1:7Hkd8WhAJNbRgq9RgdNh1aaWlZlGpYTzdqjy9x9sK2E= -github.com/pion/dtls/v3 v3.0.6/go.mod h1:iJxNQ3Uhn1NZWOMWlLxEEHAN5yX7GyPvvKw04v9bzYU= +github.com/pion/dtls/v3 v3.0.7 h1:bItXtTYYhZwkPFk4t1n3Kkf5TDrfj6+4wG+CZR8uI9Q= +github.com/pion/dtls/v3 v3.0.7/go.mod h1:uDlH5VPrgOQIw59irKYkMudSFprY9IEFCqz/eTz16f8= github.com/pion/ice/v4 v4.0.10 h1:P59w1iauC/wPk9PdY8Vjl4fOFL5B+USq1+xbDcN6gT4= github.com/pion/ice/v4 v4.0.10/go.mod h1:y3M18aPhIxLlcO/4dn9X8LzLLSma84cx6emMSu14FGw= -github.com/pion/interceptor v0.1.39 h1:Y6k0bN9Y3Lg/Wb21JBWp480tohtns8ybJ037AGr9UuA= -github.com/pion/interceptor v0.1.39/go.mod h1:Z6kqH7M/FYirg3frjGJ21VLSRJGBXB/KqaTIrdqnOic= +github.com/pion/interceptor v0.1.41 h1:NpvX3HgWIukTf2yTBVjVGFXtpSpWgXjqz7IIpu7NsOw= +github.com/pion/interceptor v0.1.41/go.mod h1:nEt4187unvRXJFyjiw00GKo+kIuXMWQI9K89fsosDLY= github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= -github.com/pion/logging v0.2.3 h1:gHuf0zpoh1GW67Nr6Gj4cv5Z9ZscU7g/EaoC/Ke/igI= -github.com/pion/logging v0.2.3/go.mod h1:z8YfknkquMe1csOrxK5kc+5/ZPAzMxbKLX5aXpbpC90= +github.com/pion/logging v0.2.4 h1:tTew+7cmQ+Mc1pTBLKH2puKsOvhm32dROumOZ655zB8= +github.com/pion/logging v0.2.4/go.mod h1:DffhXTKYdNZU+KtJ5pyQDjvOAh/GsNSyv1lbkFbe3so= github.com/pion/mdns/v2 v2.0.7 h1:c9kM8ewCgjslaAmicYMFQIde2H9/lrZpjBkN8VwoVtM= github.com/pion/mdns/v2 v2.0.7/go.mod h1:vAdSYNAT0Jy3Ru0zl2YiW3Rm/fJCwIeM0nToenfOJKA= github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= -github.com/pion/rtcp v1.2.15 h1:LZQi2JbdipLOj4eBjK4wlVoQWfrZbh3Q6eHtWtJBZBo= -github.com/pion/rtcp v1.2.15/go.mod h1:jlGuAjHMEXwMUHK78RgX0UmEJFV4zUKOFHR7OP+D3D0= -github.com/pion/rtp v1.8.21 h1:3yrOwmZFyUpcIosNcWRpQaU+UXIJ6yxLuJ8Bx0mw37Y= -github.com/pion/rtp v1.8.21/go.mod h1:bAu2UFKScgzyFqvUKmbvzSdPr+NGbZtv6UB2hesqXBk= -github.com/pion/sctp v1.8.39 h1:PJma40vRHa3UTO3C4MyeJDQ+KIobVYRZQZ0Nt7SjQnE= -github.com/pion/sctp v1.8.39/go.mod h1:cNiLdchXra8fHQwmIoqw0MbLLMs+f7uQ+dGMG2gWebE= -github.com/pion/sdp/v3 v3.0.11 h1:VhgVSopdsBKwhCFoyyPmT1fKMeV9nLMrEKxNOdy3IVI= -github.com/pion/sdp/v3 v3.0.11/go.mod h1:88GMahN5xnScv1hIMTqLdu/cOcUkj6a9ytbncwMCq2E= -github.com/pion/srtp/v3 v3.0.4 h1:2Z6vDVxzrX3UHEgrUyIGM4rRouoC7v+NiF1IHtp9B5M= -github.com/pion/srtp/v3 v3.0.4/go.mod h1:1Jx3FwDoxpRaTh1oRV8A/6G1BnFL+QI82eK4ms8EEJQ= +github.com/pion/rtcp v1.2.16 h1:fk1B1dNW4hsI78XUCljZJlC4kZOPk67mNRuQ0fcEkSo= +github.com/pion/rtcp v1.2.16/go.mod h1:/as7VKfYbs5NIb4h6muQ35kQF/J0ZVNz2Z3xKoCBYOo= +github.com/pion/rtp v1.8.25 h1:b8+y44GNbwOJTYWuVan7SglX/hMlicVCAtL50ztyZHw= +github.com/pion/rtp v1.8.25/go.mod h1:rF5nS1GqbR7H/TCpKwylzeq6yDM+MM6k+On5EgeThEM= +github.com/pion/sctp v1.8.40 h1:bqbgWYOrUhsYItEnRObUYZuzvOMsVplS3oNgzedBlG8= +github.com/pion/sctp v1.8.40/go.mod h1:SPBBUENXE6ThkEksN5ZavfAhFYll+h+66ZiG6IZQuzo= +github.com/pion/sdp/v3 v3.0.16 h1:0dKzYO6gTAvuLaAKQkC02eCPjMIi4NuAr/ibAwrGDCo= +github.com/pion/sdp/v3 v3.0.16/go.mod h1:9tyKzznud3qiweZcD86kS0ff1pGYB3VX+Bcsmkx6IXo= +github.com/pion/srtp/v3 v3.0.8 h1:RjRrjcIeQsilPzxvdaElN0CpuQZdMvcl9VZ5UY9suUM= +github.com/pion/srtp/v3 v3.0.8/go.mod h1:2Sq6YnDH7/UDCvkSoHSDNDeyBcFgWL0sAVycVbAsXFg= github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= github.com/pion/stun/v2 v2.0.0 h1:A5+wXKLAypxQri59+tmQKVs7+l6mMM+3d+eER9ifRU0= github.com/pion/stun/v2 v2.0.0/go.mod h1:22qRSh08fSEttYUmJZGlriq9+03jtVmXNODgLccj8GQ= -github.com/pion/stun/v3 v3.0.0 h1:4h1gwhWLWuZWOJIJR9s2ferRO+W3zA/b6ijOI6mKzUw= -github.com/pion/stun/v3 v3.0.0/go.mod h1:HvCN8txt8mwi4FBvS3EmDghW6aQJ24T+y+1TKjB5jyU= +github.com/pion/stun/v3 v3.0.1 h1:jx1uUq6BdPihF0yF33Jj2mh+C9p0atY94IkdnW174kA= +github.com/pion/stun/v3 v3.0.1/go.mod h1:RHnvlKFg+qHgoKIqtQWMOJF52wsImCAf/Jh5GjX+4Tw= github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= github.com/pion/transport/v2 v2.2.10 h1:ucLBLE8nuxiHfvkFKnkDQRYWYfp8ejf4YBOPfaQpw6Q= github.com/pion/transport/v2 v2.2.10/go.mod h1:sq1kSLWs+cHW9E+2fJP95QudkzbK7wscs8yYgQToO5E= -github.com/pion/transport/v3 v3.0.7 h1:iRbMH05BzSNwhILHoBoAPxoB9xQgOaJk+591KC9P1o0= -github.com/pion/transport/v3 v3.0.7/go.mod h1:YleKiTZ4vqNxVwh77Z0zytYi7rXHl7j6uPLGhhz9rwo= -github.com/pion/turn/v4 v4.0.1 h1:01UTBhYToe8PDC8piB++i66q1mmctfhhoeguaFqB84c= -github.com/pion/turn/v4 v4.0.1/go.mod h1:pMMKP/ieNAG/fN5cZiN4SDuyKsXtNTr0ccN7IToA1zs= -github.com/pion/webrtc/v4 v4.1.0 h1:yq/p0G5nKGbHISf0YKNA8Yk+kmijbblBvuSLwaJ4QYg= -github.com/pion/webrtc/v4 v4.1.0/go.mod h1:cgEGkcpxGkT6Di2ClBYO5lP9mFXbCfEOrkYUpjjCQO4= +github.com/pion/transport/v3 v3.0.8 h1:oI3myyYnTKUSTthu/NZZ8eu2I5sHbxbUNNFW62olaYc= +github.com/pion/transport/v3 v3.0.8/go.mod h1:+c2eewC5WJQHiAA46fkMMzoYZSuGzA/7E2FPrOYHctQ= +github.com/pion/turn/v4 v4.1.2 h1:Em2svpl6aBFa88dLhxypMUzaLjC79kWZWx8FIov01cc= +github.com/pion/turn/v4 v4.1.2/go.mod h1:ISYWfZYy0Z3tXzRpyYZHTL+U23yFQIspfxogdQ8pn9Y= +github.com/pion/webrtc/v4 v4.1.6 h1:srHH2HwvCGwPba25EYJgUzgLqCQoXl1VCUnrGQMSzUw= +github.com/pion/webrtc/v4 v4.1.6/go.mod h1:wKecGRlkl3ox/As/MYghJL+b/cVXMEhoPMJWPuGQFhU= +github.com/pk910/dynamic-ssz v1.1.1 h1:b8sPR8fyhBvz8SHa2RH20SNtt5VDzAEY6fKsPCUcYX4= +github.com/pk910/dynamic-ssz v1.1.1/go.mod h1:3zyemisUysY2PWACZ8LeZS2tAw8AkuTb2GaLmqYsg1I= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -962,8 +959,8 @@ github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a/go.mod h1:uIp+gprXx github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4= github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= -github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= +github.com/probe-lab/eth-das-guardian v0.2.2 h1:ygQjHt9jVD6yvujtBLuWPA3fYnPe6D5b2S7xOASYfm4= +github.com/probe-lab/eth-das-guardian v0.2.2/go.mod h1:xkhVpnhL1y2tmQERuaJTUGFAMb4eKWSVEBr0rhAB6ZM= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= @@ -971,8 +968,8 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -987,8 +984,8 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= -github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18= +github.com/prometheus/common v0.67.2 h1:PcBAckGFTIHt2+L3I33uNRTlKTplNzFctXcWhPyAEN8= +github.com/prometheus/common v0.67.2/go.mod h1:63W3KZb1JOKgcjlIr64WW/LvFGAqKPj0atm+knVGEko= github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -996,32 +993,28 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= -github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= -github.com/prometheus/prom2json v1.4.1 h1:7McxdrHgPEOtMwWjkKtd0v5AhpR2Q6QAnlHKVxq0+tQ= -github.com/prometheus/prom2json v1.4.1/go.mod h1:CzOQykSKFxXuC7ELUZHOHQvwKesQ3eN0p2PWLhFitQM= -github.com/prometheus/prometheus v0.301.0 h1:0z8dgegmILivNomCd79RKvVkIols8vBGPKmcIBc7OyY= -github.com/prometheus/prometheus v0.301.0/go.mod h1:BJLjWCKNfRfjp7Q48DrAjARnCi7GhfUVvUFEAWTssZM= +github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws= +github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw= +github.com/prometheus/prom2json v1.3.0 h1:BlqrtbT9lLH3ZsOVhXPsHzFrApCTKRifB7gjJuypu6Y= +github.com/prometheus/prom2json v1.3.0/go.mod h1:rMN7m0ApCowcoDlypBHlkNbp5eJQf/+1isKykIP5ZnM= github.com/prysmaticlabs/fastssz v0.0.0-20241008181541-518c4ce73516 h1:xuVAdtz5ShYblG2sPyb4gw01DF8InbOI/kBCQjk7NiM= github.com/prysmaticlabs/fastssz v0.0.0-20241008181541-518c4ce73516/go.mod h1:h2OlIZD/M6wFvV3YMZbW16lFgh3Rsye00G44J2cwLyU= github.com/prysmaticlabs/go-bitfield v0.0.0-20240618144021-706c95b2dd15 h1:lC8kiphgdOBTcbTvo8MwkvpKjO0SlAgjv4xIK5FGJ94= github.com/prysmaticlabs/go-bitfield v0.0.0-20240618144021-706c95b2dd15/go.mod h1:8svFBIKKu31YriBG/pNizo9N0Jr9i5PQ+dFkxWg3x5k= -github.com/prysmaticlabs/gohashtree v0.0.4-beta.0.20240624100937-73632381301b h1:VK7thFOnhxAZ/5aolr5Os4beiubuD08WiuiHyRqgwks= -github.com/prysmaticlabs/gohashtree v0.0.4-beta.0.20240624100937-73632381301b/go.mod h1:HRuvtXLZ4WkaB1MItToVH2e8ZwKwZPY5/Rcby+CvvLY= +github.com/prysmaticlabs/gohashtree v0.0.5-beta h1:ct41mg7HyIZd7uoSM/ud23f+3DxQG9tlMlQG+BVX23c= +github.com/prysmaticlabs/gohashtree v0.0.5-beta/go.mod h1:HRuvtXLZ4WkaB1MItToVH2e8ZwKwZPY5/Rcby+CvvLY= github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c h1:9PHRCuO/VN0s9k+RmLykho7AjDxblNYI5bYKed16NPU= github.com/prysmaticlabs/prombbolt v0.0.0-20210126082820-9b7adba6db7c/go.mod h1:ZRws458tYHS/Zs936OQ6oCrL+Ict5O4Xpwve1UQ6C9M= github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20230228205207-28762a7b9294 h1:q9wE0ZZRdTUAAeyFP/w0SwBEnCqlVy2+on6X2/e+eAU= github.com/prysmaticlabs/protoc-gen-go-cast v0.0.0-20230228205207-28762a7b9294/go.mod h1:ZVEbRdnMkGhp/pu35zq4SXxtvUwWK0J1MATtekZpH2Y= github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= -github.com/quic-go/quic-go v0.51.0 h1:K8exxe9zXxeRKxaXxi/GpUqYiTrtdiWP8bo1KFya6Wc= -github.com/quic-go/quic-go v0.51.0/go.mod h1:MFlGGpcpJqRAfmYi6NC2cptDPSxRWTOGNuP4wqrWmzQ= -github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg= -github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw= +github.com/quic-go/quic-go v0.55.0 h1:zccPQIqYCXDt5NmcEabyYvOnomjs8Tlwl7tISjJh9Mk= +github.com/quic-go/quic-go v0.55.0/go.mod h1:DR51ilwU1uE164KuWXhinFcKWGlEjzys2l8zUl5Ss1U= +github.com/quic-go/webtransport-go v0.9.0 h1:jgys+7/wm6JarGDrW+lD/r9BGqBAmqY/ssklE09bA70= +github.com/quic-go/webtransport-go v0.9.0/go.mod h1:4FUYIiUc75XSsF6HShcLeXXYZJ9AGwo/xh3L8M/P1ao= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= github.com/raulk/clock v1.1.0/go.mod h1:3MpVxdZ/ODBQDxbN+kzshf5OSZwPjtMDx6BBXBmOeY0= -github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= -github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= @@ -1029,8 +1022,8 @@ github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= -github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= @@ -1071,7 +1064,6 @@ github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5k github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= @@ -1098,8 +1090,8 @@ github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= @@ -1112,19 +1104,21 @@ github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/supranational/blst v0.3.14 h1:xNMoHRJOTwMn63ip6qoWJ2Ymgvj7E2b9jY2FAwY+qRo= -github.com/supranational/blst v0.3.14/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe h1:nbdqkIGOGfUAD54q1s2YBcBz/WcsxCO9HUQ4aGV5hUw= +github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= +github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/thejerf/suture/v4 v4.0.6 h1:QsuCEsCqb03xF9tPAsWAj8QOAJBgQI1c0VqJNaingg8= github.com/thejerf/suture/v4 v4.0.6/go.mod h1:gu9Y4dXNUWFrByqRt30Rm9/UZ0wzRSt9AJS6xu/ZGxU= @@ -1139,7 +1133,6 @@ github.com/trailofbits/go-mutexasserts v0.0.0-20250212181730-4c2b8e9e784b h1:EBo github.com/trailofbits/go-mutexasserts v0.0.0-20250212181730-4c2b8e9e784b/go.mod h1:4R6Qam+w871wOlyRq59zRLjhb5x9/De/wgPeaCTaCwI= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w= github.com/urfave/cli/v2 v2.27.5/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= @@ -1207,12 +1200,12 @@ go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= -go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= -go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= -go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= +go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= +go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 h1:5pojmb1U1AogINhN3SurB+zm/nIcusopeBNp42f45QM= @@ -1221,30 +1214,28 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3S go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4= go.opentelemetry.io/otel/exporters/prometheus v0.55.0 h1:sSPw658Lk2NWAv74lkD3B/RSDb+xRFx46GjkrL3VUZo= go.opentelemetry.io/otel/exporters/prometheus v0.55.0/go.mod h1:nC00vyCmQixoeaxF6KNyP42II/RHa9UdruK02qBmHvI= -go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= -go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= +go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= +go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= -go.opentelemetry.io/otel/sdk/metric v1.33.0 h1:Gs5VK9/WUJhNXZgn8MR6ITatvAmKeIuCtNbsP3JkNqU= -go.opentelemetry.io/otel/sdk/metric v1.33.0/go.mod h1:dL5ykHZmm1B1nVRk9dDjChwDmt81MjVp3gLkQRwKf/Q= -go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= -go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= +go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= +go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= +go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= +go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= -go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/dig v1.19.0 h1:BACLhebsYdpQ7IROQ1AGPjrXcP5dF80U3gKoFzbaq/4= go.uber.org/dig v1.19.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= go.uber.org/fx v1.24.0 h1:wE8mruvpg2kiiL1Vqd0CC+tr0/24XIB10Iwp2lLWzkg= go.uber.org/fx v1.24.0/go.mod h1:AmDeGyS+ZARGKM4tlH4FY2Jr63VjbEDJHtqXTGP5hbo= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= -go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= +go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= +go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= @@ -1258,6 +1249,8 @@ go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1282,11 +1275,11 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= -golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI= -golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ= +golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 h1:mgKeJMpvi0yx/sU5GsxQ7p6s2wtOnGAHZWCHUM4KGzY= +golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70= golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -1300,8 +1293,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1328,24 +1321,26 @@ golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= -golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= -golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/oauth2 v0.32.0 h1:jsCblLleRMDrxMN29H3z/k1KliIvpLgCkE6R8FXXNgY= +golang.org/x/oauth2 v0.32.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1357,9 +1352,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= -golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1386,22 +1380,23 @@ golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1413,8 +1408,10 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/telemetry v0.0.0-20251028164327-d7a2859f34e8 h1:DwMAzqwLj2rVin75cRFh1kfhwQY3hyHrU1oCEDZXPmQ= +golang.org/x/telemetry v0.0.0-20251028164327-d7a2859f34e8/go.mod h1:Pi4ztBfryZoJEkyFTI5/Ocsu2jXyDr6iSdgJiYE/uwE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -1422,24 +1419,25 @@ golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= -golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= -golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= -golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1458,15 +1456,17 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= -golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= @@ -1503,16 +1503,18 @@ google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= -google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= +google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= +google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= -google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1565,8 +1567,6 @@ k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJ k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= lukechampine.com/blake3 v1.4.1 h1:I3Smz7gso8w4/TunLKec6K2fn+kyKtDxr/xcQEN84Wg= lukechampine.com/blake3 v1.4.1/go.mod h1:QFosUxmjB8mnrWFSNwKmvxHpfY72bmD2tQ0kBMM3kwo= -rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= -rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/structured-merge-diff/v4 v4.5.0 h1:nbCitCK2hfnhyiKo6uf2HxUPTCodY6Qaf85SbDIaMBk= diff --git a/host/event_types.go b/host/event_types.go index 8fabecd..bfcc059 100644 --- a/host/event_types.go +++ b/host/event_types.go @@ -1,6 +1,8 @@ package host -import "strings" +import ( + "strings" +) // EventTypeFromBeaconChainProtocol returns the event type for a given protocol string. func EventTypeFromBeaconChainProtocol(protocol string) string { diff --git a/op/node.go b/op/node.go index 77b9f52..cfb6163 100644 --- a/op/node.go +++ b/op/node.go @@ -311,7 +311,7 @@ func (n *Node) Start(ctx context.Context) error { // start the peer dialers, that consume the discovered peers from // the discovery service up until MaxPeers. - for i := 0; i < 3; i++ { // TODO: parametrize + for range 3 { // TODO: parametrize pd := &PeerDialer{ host: n.host, peerChan: n.disc.out,