Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(relay-monitor): Calculate genesis time #369

Merged
merged 1 commit into from
Sep 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 78 additions & 0 deletions example_relay_monitor.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
logging: "debug" # panic,fatal,warn,info,debug,trace
metricsAddr: ":9097"
pprofAddr: ":6065" # optional. if supplied it enables pprof server

name: example-instance

ethereum:
## Mainnet
network: mainnet
networkConfigUrl: https://raw.githubusercontent.com/eth-clients/mainnet/main/metadata/config.yaml
slotsPerEpoch: 32

## Holesky
# network: holesky
# networkConfigUrl: https://raw.githubusercontent.com/eth-clients/holesky/main/metadata/config.yaml
# slotsPerEpoch: 32

## Sepolia
# network: sepolia
# networkConfigUrl: https://raw.githubusercontent.com/eth-clients/sepolia/main/metadata/config.yaml
# slotsPerEpoch: 32

relays:
### Mainnet
- name: flashbots-ofac
url: https://0xac6e77dfe25ecd6110b8e780608cce0dab71fdd5ebea22a16c0205200f2f8e2e3ad3b71d3499c54ad14d6c21b41a37ae@boost-relay.flashbots.net
- name: aestus-uncensored
url: https://0xa15b52576bcbf1072f4a011c0f99f9fb6c66f3e1ff321f11f461d15e31b1cb359caa092c71bbded0bae5b5ea401aab7e@aestus.live
- name: agnostic-gnosis
url: https://0xa7ab7a996c8584251c8f925da3170bdfd6ebc75d50f5ddc4050a6fdc77f2a3b5fce2cc750d0865e05d7228af97d69561@agnostic-relay.net
- name: bloxroute-max-profit
url: https://0x8b5d2e73e2a3a55c6c87b8b6eb92e0149a125c852751db1422fa951e42a09b82c142c3ea98d0d9930b056a3bc9896b8f@bloxroute.max-profit.blxrbdn.com
- name: bloxroute-regulated
url: https://0xb0b07cd0abef743db4260b0ed50619cf6ad4d82064cb4fbec9d3ec530f7c5e6793d9f286c4e082c0244ffb9f2658fe88@bloxroute.regulated.blxrbdn.com
- name: eden-network
url: https://0xb3ee7afcf27f1f1259ac1787876318c6584ee353097a50ed84f51a1f21a323b3736f271a895c7ce918c038e4265918be@relay.edennetwork.io
- name: manifold
url: https://0x98650451ba02064f7b000f5768cf0cf4d4e492317d82871bdc87ef841a0743f69f0f1eea11168503240ac35d101c9135@mainnet-relay.securerpc.com
- name: ultra-sound
url: https://0xa1559ace749633b997cb3fdacffb890aeebdb0f5a3b6aaa7eeeaf1a38af0a8fe88b9e4b1f61f236d2e64d95733327a62@relay.ultrasound.money
- name: wenmerge
url: https://0x8c7d33605ecef85403f8b7289c8058f440cbb6bf72b055dfe2f3e2c6695b6a1ea5a9cd0eb3a7982927a463feb4c3dae2@relay.wenmerge.com
- name: proof-relay
url: https://0xa44f64faca0209764461b2abfe3533f9f6ed1d51844974e22d79d4cfd06eff858bb434d063e512ce55a1841e66977bfd@proof-relay.ponrelay.com

### Holesky
# - name: "BloXroute"
# url: https://0x821f2a65afb70e7f2e820a925a9b4c80a159620582c1766b1b09729fec178b11ea22abb3a51f07b288be815a1a2ff516@bloxroute.holesky.blxrbdn.com
# - name: "Eden Network"
# url: https://0xb1d229d9c21298a87846c7022ebeef277dfc321fe674fa45312e20b5b6c400bfde9383f801848d7837ed5fc449083a12@relay-holesky.edennetwork.io
# - name: "Flashbots"
# url: https://0xafa4c6985aa049fb79dd37010438cfebeb0f2bd42b115b89dd678dab0670c1de38da0c4e9138c9290a398ecd9a0b3110@boost-relay-holesky.flashbots.net
# - name: "Aestus"
# url: https://0xab78bf8c781c58078c3beb5710c57940874dd96aef2835e7742c866b4c7c0406754376c2c8285a36c630346aa5c5f833@holesky.aestus.live
# - name: "Ultra Sound"
# url: https://0xb1559beef7b5ba3127485bbbb090362d9f497ba64e177ee2c8e7db74746306efad687f2cf8574e38d70067d40ef136dc@relay-stag.ultrasound.money
# - name: "Titan Relay"
# url: https://0xaa58208899c6105603b74396734a6263cc7d947f444f396a90f7b7d3e65d102aec7e5e5291b27e08d02c50a050825c2f@holesky.titanrelay.xyz

### Sepolia
# - name: "Flashbots"
# url: https://0xafa4c6985aa049fb79dd37010438cfebeb0f2bd42b115b89dd678dab0670c1de38da0c4e9138c9290a398ecd9a0b3110@boost-relay-sepolia.flashbots.net
schedule:
atSlotTimes:
- "4s"
- "12s"

outputs:
- name: xatu
type: xatu
config:
address: localhost:8080
tls: false
maxQueueSize: 500000
batchTimeout: 1s
exportTimeout: 15s
maxExportBatchSize: 200
workers: 5
12 changes: 4 additions & 8 deletions pkg/relaymonitor/ethereum/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ package ethereum
import "errors"

type Config struct {
Network string `yaml:"network"`
NetworkConfigURL string `yaml:"networkConfigUrl"`
GenesisSSZURL string `yaml:"genesisSszUrl"`
SlotsPerEpoch uint64 `yaml:"slotsPerEpoch"`
Network string `yaml:"network"`
NetworkConfigURL string `yaml:"networkConfigUrl"`
SlotsPerEpoch uint64 `yaml:"slotsPerEpoch"`
OverrideGenesisTime *uint64 `yaml:"overrideGenesisTime"`
}

func (c *Config) Validate() error {
Expand All @@ -18,10 +18,6 @@ func (c *Config) Validate() error {
return errors.New("networkConfigUrl is required")
}

if c.GenesisSSZURL == "" {
return errors.New("genesisSSZUrl is required")
}

if c.SlotsPerEpoch == 0 {
return errors.New("slotsPerEpoch is required")
}
Expand Down
55 changes: 22 additions & 33 deletions pkg/relaymonitor/ethereum/ethereum.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package ethereum

import (
"context"
"encoding/binary"
"io"
"net/http"
"time"
Expand All @@ -22,6 +21,8 @@ type BeaconNetwork struct {
//nolint:tagliatelle // At the mercy of the config spec.
type NetworkConfig struct {
SecondsPerSlot uint64 `yaml:"SECONDS_PER_SLOT"`
MinGenesisTime uint64 `yaml:"MIN_GENESIS_TIME"`
GenesisDelay uint64 `yaml:"GENESIS_DELAY"`
}

func NewBeaconNetwork(log logrus.FieldLogger, config *Config) (*BeaconNetwork, error) {
Expand Down Expand Up @@ -54,19 +55,33 @@ func (b *BeaconNetwork) Start(ctx context.Context) error {
return errors.New("invalid seconds_per_slot value found in network config: 0")
}

genesisTime, err := b.fetchGenesisTime(ctx)
if err != nil {
return errors.Wrap(err, "failed to fetch genesis time")
if networkConfig.MinGenesisTime == 0 {
return errors.New("invalid min_genesis_time value found in network config: 0")
}

if networkConfig.GenesisDelay == 0 {
return errors.New("invalid genesis_delay value found in network config: 0")
}

// Calculate the genesis time
// Convert the genesis time to a Unix timestamp
genesisTime := time.Unix(int64(networkConfig.MinGenesisTime), 0).Add(time.Duration(networkConfig.GenesisDelay) * time.Second)

if b.config.OverrideGenesisTime != nil {
b.log.WithField("override_genesis_time", *b.config.OverrideGenesisTime).Info("Using override genesis time")

genesisTime = time.Unix(int64(*b.config.OverrideGenesisTime), 0)
}

// Create a new EthereumBeaconChain with the calculated genesis time and network config
b.log.WithFields(logrus.Fields{
"genesis_time": genesisTime,
"human_time": time.Unix(int64(genesisTime), 0).Format("2006-01-02 15:04:05"),
"genesis_time": genesisTime.Unix(),
"human_time": genesisTime.Format("2006-01-02 15:04:05"),
}).Info("Fetched genesis time")

// Create a new EthereumBeaconChain with the fetched genesis time and network config
b.wallclock = ethwallclock.NewEthereumBeaconChain(
time.Unix(int64(genesisTime), 0),
genesisTime,
time.Duration(networkConfig.SecondsPerSlot)*time.Second,
b.config.SlotsPerEpoch,
)
Expand Down Expand Up @@ -95,29 +110,3 @@ func (b *BeaconNetwork) fetchNetworkConfig(ctx context.Context) (*NetworkConfig,

return &config, nil
}

// FetchGenesisTime fetches the genesis time from a given URL.
func (b *BeaconNetwork) fetchGenesisTime(ctx context.Context) (uint64, error) {
req, err := http.NewRequestWithContext(ctx, "GET", b.config.GenesisSSZURL, http.NoBody)
if err != nil {
return 0, err
}

response, err := http.DefaultClient.Do(req)
if err != nil {
return 0, err
}
defer response.Body.Close()

// Read only the first 8 bytes for GenesisTime
data := make([]byte, 8)

_, err = io.ReadFull(response.Body, data)
if err != nil {
return 0, err
}

genesisTime := binary.LittleEndian.Uint64(data)

return genesisTime, nil
}
Loading