From 01bddb29f566f42eb0d9d8c98c2a46442c114a27 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Mon, 20 Nov 2023 18:07:49 +0100 Subject: [PATCH 01/82] feat: add draft of config file --- .gitignore | 3 +- etc/config.local.yaml | 16 ++++++ eth_validator_watcher/config.py | 77 ++++++++++++++++++++++++++ eth_validator_watcher/entrypoint.py | 83 +++++++++-------------------- eth_validator_watcher/utils.py | 17 +++--- poetry.lock | 63 +++++++++++++++++++++- pyproject.toml | 1 + 7 files changed, 191 insertions(+), 69 deletions(-) create mode 100644 etc/config.local.yaml create mode 100644 eth_validator_watcher/config.py diff --git a/.gitignore b/.gitignore index 50f21df..8444dc5 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ __pycache__ .mypy_cache .coverage .idea -coverage.xml \ No newline at end of file +coverage.xml +Makefile diff --git a/etc/config.local.yaml b/etc/config.local.yaml new file mode 100644 index 0000000..81cecb3 --- /dev/null +++ b/etc/config.local.yaml @@ -0,0 +1,16 @@ +# Example config file for the Ethereum watcher. + +beacon_url: http://localhost:5051/ +beacon_type: ~ +execution_url: ~ +web3signer_url: ~ +default_fee_recipient: ~ +slack_channel: ~ +slack_token: ~ +relay_url: ~ +liveness_file: ~ + +watched_keys: + - public_key: 0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3 + labels: ["google"] + fee_recipient: ~ diff --git a/eth_validator_watcher/config.py b/eth_validator_watcher/config.py new file mode 100644 index 0000000..0aeeb45 --- /dev/null +++ b/eth_validator_watcher/config.py @@ -0,0 +1,77 @@ +from dataclasses import dataclass, field +from typing import Any, List, Optional + +import os +import yaml + + +@dataclass +class WatchedKeyConfig: + """Configuration of a watched key. + """ + public_key: str + labels: Optional[list[str]] = None + fee_recipient: Optional[str] = None + + +@dataclass +class Config: + """Configuration of the Ethereum Validator Watcher. + + Everything can be configured via a configuration file, there is + the possibility to override parts of the configuration with + environment variables, which ca be useful for secrets. + + Settings here are split in two groups: the ones that can be overriden, + and the more complex ones that can't. + """ + beacon_url: Optional[str] = os.getenv('ETH_WATCHER_BEACON_URL') + beacon_type: Optional[str] = os.getenv('ETH_WATCHER_BEACON_TYPE') + execution_url: Optional[str] = os.getenv('ETH_WATCHER_EXEC_URL') + config_file: Optional[str] = os.getenv('ETH_WATCHER_CONFIG_FILE', 'etc/config.local.yaml') + web3signer_url: Optional[str] = os.getenv('ETH_WATCHER_WEB3SIGNER_URL') + default_fee_recipient: Optional[str] = os.getenv('ETH_WATCHER_DEFAULT_FEE_RECIPIENT') + slack_channel: Optional[str] = os.getenv('ETH_WATCHER_SLACK_CHANNEL') + slack_token: Optional[str] = os.getenv('ETH_WATCHER_SLACK_TOKEN') + relay_url: Optional[List[str]] = field(default_factory=lambda: os.getenv('ETH_WATCHER_RELAY_URL', '').split(',')) + liveness_file: Optional[str] = os.getenv('ETH_WATCHER_LIVENESS_FILE') + + watched_keys: Optional[List[WatchedKeyConfig]] = None + + +def load_config(config_file: str) -> Config: + """Loads the configuration file + + Parameters: + config_file : path to the YAML configuration file + """ + with open(config_file, 'r') as fh: + yml = yaml.safe_load(fh) + config = Config() + + def get_value(value: Any, key: str) -> Any: + if value is not None: + return value + return yml.get(key) + + # Settings that can be overriden via environment. + config.beacon_url = get_value(config.beacon_url, 'beacon_url') + config.execution_url = get_value(config.execution_url, 'execution_url') + config.web3signer_url = get_value(config.web3signer_url, 'web3signer_url') + config.default_fee_recipient = get_value(config.default_fee_recipient, 'default_fee_recipient') + config.slack_channel = get_value(config.slack_channel, 'slack_channel') + config.slack_token = get_value(config.slack_token, 'slack_token') + config.beacon_type = get_value(config.beacon_type, 'beacon_type') + config.relay_url = get_value(config.relay_url, 'relay_url') + config.liveness_file = get_value(config.liveness_file, 'liveness_file') + + # More complex settings that can't. + config.watched_keys = [ + WatchedKeyConfig( + public_key=config_key.get('public_key'), + labels=config_key.get('label'), + fee_recipient=config_key.get('fee_recipient', config.default_fee_recipient), + ) for config_key in yml.get('watched_keys') + ] + + return config diff --git a/eth_validator_watcher/entrypoint.py b/eth_validator_watcher/entrypoint.py index a79c7bc..b5f163e 100644 --- a/eth_validator_watcher/entrypoint.py +++ b/eth_validator_watcher/entrypoint.py @@ -11,6 +11,7 @@ from typer import Option from .beacon import Beacon +from .config import load_config, WatchedKeyConfig from .coinbase import Coinbase from .entry_queue import export_duration_sec as export_entry_queue_dur_sec from .execution import Execution @@ -76,49 +77,14 @@ @app.command() def handler( - beacon_url: str = Option(..., help="URL of beacon node", show_default=False), - execution_url: str = Option(None, help="URL of execution node", show_default=False), - pubkeys_file_path: Optional[Path] = Option( - None, - help="File containing the list of public keys to watch", + config: Optional[Path] = Option( + 'etc/config.local.yaml', + help="File containing the Ethereum Validator Watcher configuration file.", exists=True, file_okay=True, dir_okay=False, - show_default=False, - ), - web3signer_url: Optional[str] = Option( - None, help="URL to web3signer managing keys to watch", show_default=False - ), - fee_recipient: Optional[str] = Option( - None, - help="Fee recipient address - --execution-url must be set", - show_default=False, - ), - slack_channel: Optional[str] = Option( - None, - help="Slack channel to send alerts - SLACK_TOKEN env var must be set", - show_default=False, - ), - beacon_type: BeaconType = Option( - BeaconType.OTHER, - case_sensitive=False, - help=( - "Use this option if connected to a Teku < 23.6.0, Prysm < 4.0.8, " - "Lighthouse or Nimbus beacon node. " - "See https://github.com/ConsenSys/teku/issues/7204 for Teku < 23.6.0, " - "https://github.com/prysmaticlabs/prysm/issues/11581 for Prysm < 4.0.8, " - "https://github.com/sigp/lighthouse/issues/4243 for Lighthouse, " - "https://github.com/status-im/nimbus-eth2/issues/5019 and " - "https://github.com/status-im/nimbus-eth2/issues/5138 for Nimbus." - ), show_default=True, ), - relay_url: List[str] = Option( - [], help="URL of allow listed relay", show_default=False - ), - liveness_file: Optional[Path] = Option( - None, help="Liveness file", show_default=False - ), ) -> None: """ 🚨 Ethereum Validator Watcher 🚨 @@ -170,17 +136,20 @@ def handler( Prometheus server is automatically exposed on port 8000. """ + cfg = load_config(config) + try: # pragma: no cover _handler( - beacon_url, - execution_url, - pubkeys_file_path, - web3signer_url, - fee_recipient, - slack_channel, - beacon_type, - relay_url, - liveness_file, + cfg.beacon_url, + cfg.execution_url, + cfg.watched_keys, + cfg.web3signer_url, + cfg.default_fee_recipient, + cfg.slack_channel, + cfg.slack_token, + cfg.beacon_type, + cfg.relay_url, + cfg.liveness_file, ) except KeyboardInterrupt: # pragma: no cover print("👋 Bye!") @@ -189,31 +158,31 @@ def handler( def _handler( beacon_url: str, execution_url: str | None, - pubkeys_file_path: Path | None, + watched_keys: List[WatchedKeyConfig] | None, web3signer_url: str | None, - fee_recipient: str | None, + default_fee_recipient: str | None, slack_channel: str | None, + slack_token: str | None, beacon_type: BeaconType, relays_url: List[str], liveness_file: Path | None, ) -> None: """Just a wrapper to be able to test the handler function""" - slack_token = environ.get("SLACK_TOKEN") - if fee_recipient is not None and execution_url is None: + if default_fee_recipient is not None and execution_url is None: raise typer.BadParameter( - "`execution-url` must be set if you want to use `fee-recipient`" + "`execution_url` must be set if you want to use `default_fee_recipient`" ) - if fee_recipient is not None: + if default_fee_recipient is not None: try: - fee_recipient = eth1_address_lower_0x_prefixed(fee_recipient) + default_fee_recipient = eth1_address_lower_0x_prefixed(default_fee_recipient) except ValueError: - raise typer.BadParameter("`fee-recipient` should be a valid ETH1 address") + raise typer.BadParameter("`default_fee_recipient` should be a valid ETH1 address") if slack_channel is not None and slack_token is None: raise typer.BadParameter( - "SLACK_TOKEN env var must be set if you want to use `slack-channel`" + "slack_token var must be set if you want to use `slack_channel`" ) slack = ( @@ -277,7 +246,7 @@ def _handler( if is_new_epoch: try: - our_pubkeys = get_our_pubkeys(pubkeys_file_path, web3signer) + our_pubkeys = get_our_pubkeys(watched_keys, web3signer) except ValueError: raise typer.BadParameter("Some pubkeys are invalid") diff --git a/eth_validator_watcher/utils.py b/eth_validator_watcher/utils.py index 074a3ad..ba06c50 100644 --- a/eth_validator_watcher/utils.py +++ b/eth_validator_watcher/utils.py @@ -1,12 +1,13 @@ import re from pathlib import Path from time import sleep, time -from typing import Any, Iterator, Optional, Tuple +from typing import Any, Iterator, List, Optional, Tuple from more_itertools import chunked from prometheus_client import Gauge from slack_sdk import WebClient +from .config import WatchedKeyConfig from .web3signer import Web3Signer NB_SLOT_PER_EPOCH = 32 @@ -184,13 +185,13 @@ def load_pubkeys_from_file(path: Path) -> set[str]: def get_our_pubkeys( - pubkeys_file_path: Path | None, + watched_keys: List[WatchedKeyConfig] | None, web3signer: Web3Signer | None, ) -> set[str]: """Get our pubkeys Parameters: - pubkeys_file_path: The path of file containing keys to watch + watched_keys : The list of validator keys we want to watch web3signer : Web3Signer instance signing for the keys to watch Query pubkeys from either file path or Web3Signer instance. @@ -198,18 +199,16 @@ def get_our_pubkeys( returns `our_pubkeys`. """ - # Get public keys to watch from file - pubkeys_from_file: set[str] = ( - load_pubkeys_from_file(pubkeys_file_path) - if pubkeys_file_path is not None - else set() + # Get public keys from config + pubkeys_from_config: set[str] = set( + k.public_key for k in watched_keys ) pubkeys_from_web3signer = ( web3signer.load_pubkeys() if web3signer is not None else set() ) - our_pubkeys = pubkeys_from_file | pubkeys_from_web3signer + our_pubkeys = pubkeys_from_config | pubkeys_from_web3signer metric_keys_count.set(len(our_pubkeys)) return our_pubkeys diff --git a/poetry.lock b/poetry.lock index 5ac55ee..0a50d76 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. [[package]] name = "annotated-types" @@ -608,6 +608,65 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + [[package]] name = "requests" version = "2.31.0" @@ -740,4 +799,4 @@ zstd = ["zstandard (>=0.18.0)"] [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "b2c1523a63b4321c89e1dd6a874059ca0fde1b5f06e352f16ecd32c9e6d13ebb" +content-hash = "2869c7c017f19bd39e16bf2eab971005f62a6457beb0aab6d826af9daa213548" diff --git a/pyproject.toml b/pyproject.toml index 0cf1ec4..e58a5e4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,6 +15,7 @@ requests = "^2.31.0" typer = "^0.9.0" slack-sdk = "^3.21.3" tenacity = "^8.2.2" +pyyaml = "^6.0.1" [tool.poetry.group.dev.dependencies] mypy = "^1.2.0" From 50912fa61f5506928918911ccac4694a4c20550b Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Mon, 20 Nov 2023 18:49:36 +0100 Subject: [PATCH 02/82] feat: adapt unit tests to new config file --- eth_validator_watcher/beacon.py | 4 +- eth_validator_watcher/config.py | 6 ++- eth_validator_watcher/entrypoint.py | 4 +- tests/entrypoint/test__handler.py | 76 ++++++++--------------------- tests/utils/test_get_our_pubkeys.py | 9 +++- 5 files changed, 34 insertions(+), 65 deletions(-) diff --git a/eth_validator_watcher/beacon.py b/eth_validator_watcher/beacon.py index 17eecbc..13560bb 100644 --- a/eth_validator_watcher/beacon.py +++ b/eth_validator_watcher/beacon.py @@ -349,11 +349,9 @@ def get_validators_liveness( print( "❓ You can ignore this message if the watcher just started less " "than one epoch ago. Otherwise, please check that you used the correct " - f"`--beacon-type` option (currently set to `{beacon_type}`). " + f"`beacon_type` option (currently set to `{beacon_type}`). " ) - print("❓ Use `--help` for more details.") - return {index: True for index in validators_index} validators_liveness_dict = response.json() diff --git a/eth_validator_watcher/config.py b/eth_validator_watcher/config.py index 0aeeb45..b8379fa 100644 --- a/eth_validator_watcher/config.py +++ b/eth_validator_watcher/config.py @@ -1,3 +1,4 @@ +from .models import BeaconType from dataclasses import dataclass, field from typing import Any, List, Optional @@ -26,7 +27,7 @@ class Config: and the more complex ones that can't. """ beacon_url: Optional[str] = os.getenv('ETH_WATCHER_BEACON_URL') - beacon_type: Optional[str] = os.getenv('ETH_WATCHER_BEACON_TYPE') + beacon_type: Optional[str] = os.getenv('ETH_WATCHER_BEACON_TYPE', BeaconType.OTHER) execution_url: Optional[str] = os.getenv('ETH_WATCHER_EXEC_URL') config_file: Optional[str] = os.getenv('ETH_WATCHER_CONFIG_FILE', 'etc/config.local.yaml') web3signer_url: Optional[str] = os.getenv('ETH_WATCHER_WEB3SIGNER_URL') @@ -44,6 +45,9 @@ def load_config(config_file: str) -> Config: Parameters: config_file : path to the YAML configuration file + + Returns: + The effective configuration used by the watcher """ with open(config_file, 'r') as fh: yml = yaml.safe_load(fh) diff --git a/eth_validator_watcher/entrypoint.py b/eth_validator_watcher/entrypoint.py index b5f163e..04b6bef 100644 --- a/eth_validator_watcher/entrypoint.py +++ b/eth_validator_watcher/entrypoint.py @@ -163,7 +163,7 @@ def _handler( default_fee_recipient: str | None, slack_channel: str | None, slack_token: str | None, - beacon_type: BeaconType, + beacon_type: BeaconType | None, relays_url: List[str], liveness_file: Path | None, ) -> None: @@ -380,7 +380,7 @@ def _handler( ) process_fee_recipient( - block, our_active_idx2val, execution, fee_recipient, slack + block, our_active_idx2val, execution, default_fee_recipient, slack ) is_our_validator = process_missed_blocks_head( diff --git a/tests/entrypoint/test__handler.py b/tests/entrypoint/test__handler.py index d960d47..62b7649 100644 --- a/tests/entrypoint/test__handler.py +++ b/tests/entrypoint/test__handler.py @@ -1,8 +1,9 @@ from os import environ from pathlib import Path -from typing import Iterator, Optional, Tuple +from typing import Iterator, List, Optional, Tuple from eth_validator_watcher import entrypoint +from eth_validator_watcher.config import WatchedKeyConfig from eth_validator_watcher.entrypoint import _handler from eth_validator_watcher.models import BeaconType, Genesis, Validators from eth_validator_watcher.utils import LimitedDict, Slack @@ -20,10 +21,11 @@ def test_fee_recipient_set_while_execution_url_not_set() -> None: _handler( beacon_url="", execution_url=None, - pubkeys_file_path=None, + watched_keys=None, web3signer_url=None, - fee_recipient="something", + default_fee_recipient="something", slack_channel="MY SLACK CHANNEL", + slack_token=None, beacon_type=BeaconType.OLD_TEKU, relays_url=[], liveness_file=None, @@ -35,10 +37,11 @@ def test_fee_recipient_not_valid() -> None: _handler( beacon_url="", execution_url="http://localhost:8545", - pubkeys_file_path=None, + watched_keys=None, web3signer_url=None, - fee_recipient="something", + default_fee_recipient="something", slack_channel="MY SLACK CHANNEL", + slack_token=None, beacon_type=BeaconType.OLD_TEKU, relays_url=[], liveness_file=None, @@ -50,58 +53,17 @@ def test_slack_token_not_defined() -> None: _handler( beacon_url="", execution_url=None, - pubkeys_file_path=None, + watched_keys=None, web3signer_url=None, - fee_recipient=None, + default_fee_recipient=None, slack_channel="MY SLACK CHANNEL", + slack_token=None, beacon_type=BeaconType.OLD_TEKU, relays_url=[], liveness_file=None, ) -def test_invalid_pubkeys() -> None: - class Beacon: - def __init__(self, url: str) -> None: - assert url == "http://localhost:5052" - - def get_genesis(self) -> Genesis: - return Genesis( - data=Genesis.Data( - genesis_time=0, - ) - ) - - def get_our_pubkeys(pubkeys_file_path: Path, web3signer: None) -> set[str]: - assert pubkeys_file_path == Path("/path/to/pubkeys") - raise ValueError("Invalid pubkeys") - - def slots(genesis_time: int) -> Iterator[Tuple[(int, int)]]: - assert genesis_time == 0 - yield 63, 1664 - yield 64, 1676 - - def start_http_server(_: int) -> None: - pass - - entrypoint.get_our_pubkeys = get_our_pubkeys # type: ignore - entrypoint.Beacon = Beacon # type: ignore - entrypoint.slots = slots # type: ignore - entrypoint.start_http_server = start_http_server # type: ignore - - with raises(BadParameter): - _handler( - beacon_url="http://localhost:5052", - execution_url=None, - pubkeys_file_path=Path("/path/to/pubkeys"), - web3signer_url=None, - fee_recipient=None, - slack_channel=None, - beacon_type=BeaconType.OLD_TEKU, - relays_url=[], - liveness_file=None, - ) - def test_chain_not_ready() -> None: class Beacon: @@ -142,10 +104,11 @@ def start_http_server(_: int) -> None: _handler( beacon_url="http://localhost:5052", execution_url=None, - pubkeys_file_path=Path("/path/to/pubkeys"), + watched_keys=None, web3signer_url=None, - fee_recipient=None, + default_fee_recipient=None, slack_channel=None, + slack_token=None, beacon_type=BeaconType.OLD_TEKU, relays_url=[], liveness_file=Path("/path/to/liveness"), @@ -221,8 +184,8 @@ def slots(genesis_time: int) -> Iterator[Tuple[(int, int)]]: yield 63, 1664 yield 64, 1676 - def get_our_pubkeys(pubkeys_file_path: Path, web3signer: Web3Signer) -> set[str]: - assert pubkeys_file_path == Path("/path/to/pubkeys") + def get_our_pubkeys(watched_keys: List[WatchedKeyConfig], web3signer: Web3Signer) -> set[str]: + assert watched_keys == [WatchedKeyConfig(public_key="0xfff")] assert isinstance(web3signer, Web3Signer) return {"0xaaa", "0xbbb", "0xccc", "0xddd", "0xeee", "0xfff"} @@ -358,15 +321,14 @@ def write_liveness_file(liveness_file: Path) -> None: entrypoint.process_rewards = process_rewards # type: ignore entrypoint.write_liveness_file = write_liveness_file # type: ignore - environ["SLACK_TOKEN"] = "my_slack_token" - _handler( beacon_url="http://localhost:5052", execution_url=None, - pubkeys_file_path=Path("/path/to/pubkeys"), + watched_keys=[WatchedKeyConfig(public_key="0xfff")], web3signer_url="http://localhost:9000", - fee_recipient=None, + default_fee_recipient=None, slack_channel="my slack channel", + slack_token="my_slack_token", beacon_type=BeaconType.OLD_TEKU, relays_url=["http://my-awesome-relay.com"], liveness_file=Path("/path/to/liveness"), diff --git a/tests/utils/test_get_our_pubkeys.py b/tests/utils/test_get_our_pubkeys.py index 35b58d7..47b2c4e 100644 --- a/tests/utils/test_get_our_pubkeys.py +++ b/tests/utils/test_get_our_pubkeys.py @@ -1,5 +1,6 @@ from pathlib import Path +from eth_validator_watcher.config import WatchedKeyConfig from eth_validator_watcher.utils import get_our_pubkeys from tests.utils import assets @@ -15,7 +16,11 @@ def load_pubkeys() -> set[str]: def test_get_our_pubkeys() -> None: - pubkey_path = Path(assets.__file__).parent / "pubkeys.txt" + watched_keys = [ + WatchedKeyConfig(public_key="0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), + WatchedKeyConfig(public_key="0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"), + WatchedKeyConfig(public_key="0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"), + ] web3signer = Web3Signer() expected = { @@ -26,4 +31,4 @@ def test_get_our_pubkeys() -> None: "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", } - assert get_our_pubkeys(pubkey_path, web3signer) == expected # type: ignore + assert get_our_pubkeys(watched_keys, web3signer) == expected # type: ignore From 9965494ef498eb57ac5f171882cefcf1510e5067 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Mon, 20 Nov 2023 18:53:00 +0100 Subject: [PATCH 03/82] fix: remove unused test file --- tests/utils/assets/__init__.py | 0 tests/utils/assets/pubkeys.txt | 3 --- tests/utils/test_load_pubkeys_from_file.py | 14 -------------- 3 files changed, 17 deletions(-) delete mode 100644 tests/utils/assets/__init__.py delete mode 100644 tests/utils/assets/pubkeys.txt delete mode 100644 tests/utils/test_load_pubkeys_from_file.py diff --git a/tests/utils/assets/__init__.py b/tests/utils/assets/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/utils/assets/pubkeys.txt b/tests/utils/assets/pubkeys.txt deleted file mode 100644 index 590e201..0000000 --- a/tests/utils/assets/pubkeys.txt +++ /dev/null @@ -1,3 +0,0 @@ -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb -cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc diff --git a/tests/utils/test_load_pubkeys_from_file.py b/tests/utils/test_load_pubkeys_from_file.py deleted file mode 100644 index 86df758..0000000 --- a/tests/utils/test_load_pubkeys_from_file.py +++ /dev/null @@ -1,14 +0,0 @@ -from pathlib import Path - -from eth_validator_watcher.utils import load_pubkeys_from_file -from tests.utils import assets - - -def test_load_pubkeys_from_file(): - pubkey_path = Path(assets.__file__).parent / "pubkeys.txt" - expected = { - "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", - } - assert load_pubkeys_from_file(pubkey_path) == expected From 9041295ac8c350ebe050993fb266b901afb5634c Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Mon, 20 Nov 2023 19:14:22 +0100 Subject: [PATCH 04/82] feat: add unit test for empty config file --- tests/config/.#test_load_config.py | 1 + tests/config/__init__.py | 0 tests/config/assets/__init__.py | 0 tests/config/assets/config.empty.yaml | 10 ++++++++++ tests/config/assets/config.yaml | 16 ++++++++++++++++ tests/config/test_load_config.py | 8 ++++++++ 6 files changed, 35 insertions(+) create mode 120000 tests/config/.#test_load_config.py create mode 100644 tests/config/__init__.py create mode 100644 tests/config/assets/__init__.py create mode 100644 tests/config/assets/config.empty.yaml create mode 100644 tests/config/assets/config.yaml create mode 100644 tests/config/test_load_config.py diff --git a/tests/config/.#test_load_config.py b/tests/config/.#test_load_config.py new file mode 120000 index 0000000..fafd067 --- /dev/null +++ b/tests/config/.#test_load_config.py @@ -0,0 +1 @@ +mxs@bombadil.590226:1700469311 \ No newline at end of file diff --git a/tests/config/__init__.py b/tests/config/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/config/assets/__init__.py b/tests/config/assets/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/config/assets/config.empty.yaml b/tests/config/assets/config.empty.yaml new file mode 100644 index 0000000..ae9e98f --- /dev/null +++ b/tests/config/assets/config.empty.yaml @@ -0,0 +1,10 @@ +beacon_url: ~ +beacon_type: ~ +execution_url: ~ +web3signer_url: ~ +default_fee_recipient: ~ +slack_channel: ~ +slack_token: ~ +relay_url: ~ +liveness_file: ~ +watched_keys: ~ diff --git a/tests/config/assets/config.yaml b/tests/config/assets/config.yaml new file mode 100644 index 0000000..e1a2b83 --- /dev/null +++ b/tests/config/assets/config.yaml @@ -0,0 +1,16 @@ +# Example config file for the Ethereum watcher. + +beacon_url: http://localhost:5051/ +beacon_type: other +execution_url: http://localhost:8545/ +web3signer_url: http://web3signer:9000/ +default_fee_recipient: 0x41bF25fC8C52d292bD66D3BCEcd8a919ecB9EF88 +slack_channel: '#ethereum-monitoring' +slack_token: 'secret' +relay_url: http://relay1,http://relay2 +liveness_file: /tmp/i-am-alive + +watched_keys: + - public_key: 0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3 + labels: ["google"] + fee_recipient: ~ diff --git a/tests/config/test_load_config.py b/tests/config/test_load_config.py new file mode 100644 index 0000000..59e6c26 --- /dev/null +++ b/tests/config/test_load_config.py @@ -0,0 +1,8 @@ +from pathlib import Path + +from eth_validator_watcher.config import load_config + + +def test_empty_config() -> None: + Path(assets.__file__).parent / "" + config = load_config() From 56d703c7d7af7ef3f6b80e5aeb1a84909626be9e Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Mon, 20 Nov 2023 21:24:19 +0100 Subject: [PATCH 05/82] feat: add unit test for filled config --- etc/config.local.yaml | 2 +- eth_validator_watcher/config.py | 8 +++--- tests/config/assets/config.empty.yaml | 2 +- tests/config/assets/config.yaml | 8 +++--- tests/config/test_load_config.py | 38 ++++++++++++++++++++++++--- 5 files changed, 45 insertions(+), 13 deletions(-) diff --git a/etc/config.local.yaml b/etc/config.local.yaml index 81cecb3..74f75d5 100644 --- a/etc/config.local.yaml +++ b/etc/config.local.yaml @@ -7,7 +7,7 @@ web3signer_url: ~ default_fee_recipient: ~ slack_channel: ~ slack_token: ~ -relay_url: ~ +relays: ~ liveness_file: ~ watched_keys: diff --git a/eth_validator_watcher/config.py b/eth_validator_watcher/config.py index b8379fa..3602db5 100644 --- a/eth_validator_watcher/config.py +++ b/eth_validator_watcher/config.py @@ -34,10 +34,10 @@ class Config: default_fee_recipient: Optional[str] = os.getenv('ETH_WATCHER_DEFAULT_FEE_RECIPIENT') slack_channel: Optional[str] = os.getenv('ETH_WATCHER_SLACK_CHANNEL') slack_token: Optional[str] = os.getenv('ETH_WATCHER_SLACK_TOKEN') - relay_url: Optional[List[str]] = field(default_factory=lambda: os.getenv('ETH_WATCHER_RELAY_URL', '').split(',')) + relays: Optional[List[str]] = field(default_factory=lambda: list(filter(bool, os.getenv('ETH_WATCHER_RELAY_URL', '').split(',')))) liveness_file: Optional[str] = os.getenv('ETH_WATCHER_LIVENESS_FILE') - watched_keys: Optional[List[WatchedKeyConfig]] = None + watched_keys: List[WatchedKeyConfig] = field(default_factory=list) def load_config(config_file: str) -> Config: @@ -66,7 +66,7 @@ def get_value(value: Any, key: str) -> Any: config.slack_channel = get_value(config.slack_channel, 'slack_channel') config.slack_token = get_value(config.slack_token, 'slack_token') config.beacon_type = get_value(config.beacon_type, 'beacon_type') - config.relay_url = get_value(config.relay_url, 'relay_url') + config.relays = get_value(config.relays or None, 'relays') config.liveness_file = get_value(config.liveness_file, 'liveness_file') # More complex settings that can't. @@ -75,7 +75,7 @@ def get_value(value: Any, key: str) -> Any: public_key=config_key.get('public_key'), labels=config_key.get('label'), fee_recipient=config_key.get('fee_recipient', config.default_fee_recipient), - ) for config_key in yml.get('watched_keys') + ) for config_key in yml.get('watched_keys') or () ] return config diff --git a/tests/config/assets/config.empty.yaml b/tests/config/assets/config.empty.yaml index ae9e98f..2c57e69 100644 --- a/tests/config/assets/config.empty.yaml +++ b/tests/config/assets/config.empty.yaml @@ -5,6 +5,6 @@ web3signer_url: ~ default_fee_recipient: ~ slack_channel: ~ slack_token: ~ -relay_url: ~ +relays: ~ liveness_file: ~ watched_keys: ~ diff --git a/tests/config/assets/config.yaml b/tests/config/assets/config.yaml index e1a2b83..45bfdc1 100644 --- a/tests/config/assets/config.yaml +++ b/tests/config/assets/config.yaml @@ -4,13 +4,15 @@ beacon_url: http://localhost:5051/ beacon_type: other execution_url: http://localhost:8545/ web3signer_url: http://web3signer:9000/ -default_fee_recipient: 0x41bF25fC8C52d292bD66D3BCEcd8a919ecB9EF88 +default_fee_recipient: '0x41bF25fC8C52d292bD66D3BCEcd8a919ecB9EF88' slack_channel: '#ethereum-monitoring' slack_token: 'secret' -relay_url: http://relay1,http://relay2 +relays: + - http://relay1 + - http://relay2 liveness_file: /tmp/i-am-alive watched_keys: - - public_key: 0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3 + - public_key: '0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3' labels: ["google"] fee_recipient: ~ diff --git a/tests/config/test_load_config.py b/tests/config/test_load_config.py index 59e6c26..138bada 100644 --- a/tests/config/test_load_config.py +++ b/tests/config/test_load_config.py @@ -1,8 +1,38 @@ from pathlib import Path - -from eth_validator_watcher.config import load_config +from eth_validator_watcher.config import load_config, WatchedKeyConfig +from eth_validator_watcher.models import BeaconType +from tests.config import assets def test_empty_config() -> None: - Path(assets.__file__).parent / "" - config = load_config() + path = Path(assets.__file__).parent / "config.empty.yaml" + config = load_config(path) + + assert config.beacon_url is None + assert config.execution_url is None + assert config.web3signer_url is None + assert config.default_fee_recipient is None + assert config.slack_channel is None + assert config.slack_token is None + assert config.beacon_type == BeaconType.OTHER + assert config.relays is None + assert config.liveness_file is None + + assert config.watched_keys == [] + + +def test_filled_config() -> None: + path = Path(assets.__file__).parent / "config.yaml" + config = load_config(path) + + assert config.beacon_url == 'http://localhost:5051/' + assert config.execution_url == 'http://localhost:8545/' + assert config.web3signer_url == 'http://web3signer:9000/' + assert config.default_fee_recipient == '0x41bF25fC8C52d292bD66D3BCEcd8a919ecB9EF88' + assert config.slack_channel == '#ethereum-monitoring' + assert config.slack_token == 'secret' + assert config.beacon_type == BeaconType.OTHER + assert config.relays == ['http://relay1', 'http://relay2'] + assert config.liveness_file == '/tmp/i-am-alive' + + assert [k.public_key for k in config.watched_keys] == ['0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3'] From 53a2d0e8e043849973c736050770a00d411a2ef2 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Mon, 20 Nov 2023 23:32:06 +0100 Subject: [PATCH 06/82] feat: move config to pydantic --- eth_validator_watcher/config.py | 77 +++++---------- poetry.lock | 163 ++++++++++++++++++++++++++++++- pyproject.toml | 2 + tests/config/test_load_config.py | 39 +++++++- 4 files changed, 226 insertions(+), 55 deletions(-) diff --git a/eth_validator_watcher/config.py b/eth_validator_watcher/config.py index 3602db5..245d52e 100644 --- a/eth_validator_watcher/config.py +++ b/eth_validator_watcher/config.py @@ -1,13 +1,13 @@ from .models import BeaconType -from dataclasses import dataclass, field +from pydantic import BaseModel +from pydantic_settings import BaseSettings, SettingsConfigDict from typing import Any, List, Optional import os import yaml -@dataclass -class WatchedKeyConfig: +class WatchedKeyConfig(BaseModel): """Configuration of a watched key. """ public_key: str @@ -15,34 +15,29 @@ class WatchedKeyConfig: fee_recipient: Optional[str] = None -@dataclass -class Config: +class Config(BaseSettings): """Configuration of the Ethereum Validator Watcher. - - Everything can be configured via a configuration file, there is - the possibility to override parts of the configuration with - environment variables, which ca be useful for secrets. - - Settings here are split in two groups: the ones that can be overriden, - and the more complex ones that can't. """ - beacon_url: Optional[str] = os.getenv('ETH_WATCHER_BEACON_URL') - beacon_type: Optional[str] = os.getenv('ETH_WATCHER_BEACON_TYPE', BeaconType.OTHER) - execution_url: Optional[str] = os.getenv('ETH_WATCHER_EXEC_URL') - config_file: Optional[str] = os.getenv('ETH_WATCHER_CONFIG_FILE', 'etc/config.local.yaml') - web3signer_url: Optional[str] = os.getenv('ETH_WATCHER_WEB3SIGNER_URL') - default_fee_recipient: Optional[str] = os.getenv('ETH_WATCHER_DEFAULT_FEE_RECIPIENT') - slack_channel: Optional[str] = os.getenv('ETH_WATCHER_SLACK_CHANNEL') - slack_token: Optional[str] = os.getenv('ETH_WATCHER_SLACK_TOKEN') - relays: Optional[List[str]] = field(default_factory=lambda: list(filter(bool, os.getenv('ETH_WATCHER_RELAY_URL', '').split(',')))) - liveness_file: Optional[str] = os.getenv('ETH_WATCHER_LIVENESS_FILE') + model_config = SettingsConfigDict(case_sensitive=True, env_prefix='eth_watcher_') - watched_keys: List[WatchedKeyConfig] = field(default_factory=list) + beacon_url: Optional[str] = None + beacon_type: Optional[BeaconType] = None + execution_url: Optional[str] = None + web3signer_url: Optional[str] = None + default_fee_recipient: Optional[str] = None + slack_channel: Optional[str] = None + slack_token: Optional[str] = None + relays: Optional[List[str]] = None + liveness_file: Optional[str] = None + watched_keys: Optional[List[WatchedKeyConfig]] = None def load_config(config_file: str) -> Config: - """Loads the configuration file + """Loads the configuration file from environment and configfile. + Environment variables have priority (can be used to set secrets + and override the config file). + Parameters: config_file : path to the YAML configuration file @@ -50,32 +45,12 @@ def load_config(config_file: str) -> Config: The effective configuration used by the watcher """ with open(config_file, 'r') as fh: - yml = yaml.safe_load(fh) - config = Config() - - def get_value(value: Any, key: str) -> Any: - if value is not None: - return value - return yml.get(key) - - # Settings that can be overriden via environment. - config.beacon_url = get_value(config.beacon_url, 'beacon_url') - config.execution_url = get_value(config.execution_url, 'execution_url') - config.web3signer_url = get_value(config.web3signer_url, 'web3signer_url') - config.default_fee_recipient = get_value(config.default_fee_recipient, 'default_fee_recipient') - config.slack_channel = get_value(config.slack_channel, 'slack_channel') - config.slack_token = get_value(config.slack_token, 'slack_token') - config.beacon_type = get_value(config.beacon_type, 'beacon_type') - config.relays = get_value(config.relays or None, 'relays') - config.liveness_file = get_value(config.liveness_file, 'liveness_file') + config = yaml.safe_load(fh) + + from_env = Config().model_dump() + from_yaml = Config(**config).model_dump() - # More complex settings that can't. - config.watched_keys = [ - WatchedKeyConfig( - public_key=config_key.get('public_key'), - labels=config_key.get('label'), - fee_recipient=config_key.get('fee_recipient', config.default_fee_recipient), - ) for config_key in yml.get('watched_keys') or () - ] + merged = from_yaml.copy() + merged.update({k: v for k, v in from_env.items() if v}) - return config + return Config(**merged) diff --git a/poetry.lock b/poetry.lock index 0a50d76..b970356 100644 --- a/poetry.lock +++ b/poetry.lock @@ -275,6 +275,25 @@ files = [ {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] +[[package]] +name = "importlib-metadata" +version = "6.8.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, + {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] + [[package]] name = "iniconfig" version = "2.0.0" @@ -556,6 +575,42 @@ files = [ [package.dependencies] typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" +[[package]] +name = "pydantic-settings" +version = "2.1.0" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_settings-2.1.0-py3-none-any.whl", hash = "sha256:7621c0cb5d90d1140d2f0ef557bdf03573aac7035948109adf2574770b77605a"}, + {file = "pydantic_settings-2.1.0.tar.gz", hash = "sha256:26b1492e0a24755626ac5e6d715e9077ab7ad4fb5f19a8b7ed7011d52f36141c"}, +] + +[package.dependencies] +pydantic = ">=2.3.0" +python-dotenv = ">=0.21.0" + +[[package]] +name = "pydantic-yaml" +version = "1.2.0" +description = "Adds some YAML functionality to the excellent `pydantic` library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pydantic_yaml-1.2.0-py3-none-any.whl", hash = "sha256:196cd4286a66cbe913bcc2e463251cb6b73ebe5ac9c8af2ceed0b1c72ddc03a2"}, + {file = "pydantic_yaml-1.2.0.tar.gz", hash = "sha256:54bdaf4da25bca95bb9ba790b1a5c6b4b3e93f7cf218fcde46b3073b61779f81"}, +] + +[package.dependencies] +importlib-metadata = "*" +pydantic = ">=1.8" +"ruamel.yaml" = ">=0.16.0,<0.18.0" +typing-extensions = ">=4.5.0" + +[package.extras] +dev = ["black (==23.3.0)", "mypy (==1.5.1)", "pre-commit (==2.21.0)", "pytest (==7.4.2)", "ruff (==0.0.291)", "setuptools (>=61.0.0)", "setuptools-scm[toml] (>=6.2)"] +docs = ["mkdocs", "mkdocs-material", "mkdocstrings[python]", "pygments", "pymdown-extensions"] + [[package]] name = "pytest" version = "7.4.2" @@ -608,6 +663,20 @@ files = [ [package.dependencies] six = ">=1.5" +[[package]] +name = "python-dotenv" +version = "1.0.0" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, + {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + [[package]] name = "pyyaml" version = "6.0.1" @@ -707,6 +776,83 @@ six = "*" fixture = ["fixtures"] test = ["fixtures", "mock", "purl", "pytest", "requests-futures", "sphinx", "testtools"] +[[package]] +name = "ruamel-yaml" +version = "0.17.40" +description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +optional = false +python-versions = ">=3" +files = [ + {file = "ruamel.yaml-0.17.40-py3-none-any.whl", hash = "sha256:b16b6c3816dff0a93dca12acf5e70afd089fa5acb80604afd1ffa8b465b7722c"}, + {file = "ruamel.yaml-0.17.40.tar.gz", hash = "sha256:6024b986f06765d482b5b07e086cc4b4cd05dd22ddcbc758fa23d54873cf313d"}, +] + +[package.dependencies] +"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} + +[package.extras] +docs = ["mercurial (>5.7)", "ryd"] +jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.8" +description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" +optional = false +python-versions = ">=3.6" +files = [ + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_24_aarch64.whl", hash = "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b"}, + {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, + {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, +] + [[package]] name = "six" version = "1.16.0" @@ -796,7 +942,22 @@ secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17. socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "zipp" +version = "3.17.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "2869c7c017f19bd39e16bf2eab971005f62a6457beb0aab6d826af9daa213548" +content-hash = "2792d2dc4d7c44168036a2388952c40f3b02e531c987d1f134f9ec35a931afa5" diff --git a/pyproject.toml b/pyproject.toml index e58a5e4..0b87dda 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,6 +16,8 @@ typer = "^0.9.0" slack-sdk = "^3.21.3" tenacity = "^8.2.2" pyyaml = "^6.0.1" +pydantic-yaml = "^1.2.0" +pydantic-settings = "^2.1.0" [tool.poetry.group.dev.dependencies] mypy = "^1.2.0" diff --git a/tests/config/test_load_config.py b/tests/config/test_load_config.py index 138bada..63dae06 100644 --- a/tests/config/test_load_config.py +++ b/tests/config/test_load_config.py @@ -1,3 +1,5 @@ +import os + from pathlib import Path from eth_validator_watcher.config import load_config, WatchedKeyConfig from eth_validator_watcher.models import BeaconType @@ -14,11 +16,10 @@ def test_empty_config() -> None: assert config.default_fee_recipient is None assert config.slack_channel is None assert config.slack_token is None - assert config.beacon_type == BeaconType.OTHER + assert config.beacon_type is None assert config.relays is None assert config.liveness_file is None - - assert config.watched_keys == [] + assert config.watched_keys is None def test_filled_config() -> None: @@ -36,3 +37,35 @@ def test_filled_config() -> None: assert config.liveness_file == '/tmp/i-am-alive' assert [k.public_key for k in config.watched_keys] == ['0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3'] + + +def test_filled_config_overriden() -> None: + environ = os.environ.copy() + + os.environ['eth_watcher_beacon_url'] = 'http://override-beacon/' + os.environ['eth_watcher_execution_url'] = 'http://override-exec/' + os.environ['eth_watcher_web3signer_url'] = 'http://override-web3signer/' + os.environ['eth_watcher_default_fee_recipient'] = '0x42' + os.environ['eth_watcher_slack_channel'] = '#ethereum-monitoring-override' + os.environ['eth_watcher_slack_token'] = 'secret-override' + os.environ['eth_watcher_beacon_type'] = 'nimbus' + os.environ['eth_watcher_relays'] = '["http://overriden-relay-1" ,"http://overriden-relay-2"]' + os.environ['eth_watcher_liveness_file'] = '/tmp/override-liveness-file' + + path = Path(assets.__file__).parent / "config.yaml" + config = load_config(path) + + assert config.beacon_url == 'http://override-beacon/' + assert config.execution_url == 'http://override-exec/' + assert config.web3signer_url == 'http://override-web3signer/' + assert config.default_fee_recipient == '0x42' + assert config.slack_channel == '#ethereum-monitoring-override' + assert config.slack_token == 'secret-override' + assert config.beacon_type == BeaconType.NIMBUS + assert config.relays == ['http://overriden-relay-1' ,'http://overriden-relay-2'] + assert config.liveness_file == '/tmp/override-liveness-file' + + assert [k.public_key for k in config.watched_keys] == ['0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3'] + + os.environ.clear() + os.environ.update(environ) From 07080363cd65de09f67464198d02ef2d58af6153 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Mon, 20 Nov 2023 23:32:41 +0100 Subject: [PATCH 07/82] feat: update authors --- .gitignore | 2 +- Makefile | 1 + pyproject.toml | 2 +- tests/config/.#test_load_config.py | 1 - 4 files changed, 3 insertions(+), 3 deletions(-) delete mode 120000 tests/config/.#test_load_config.py diff --git a/.gitignore b/.gitignore index 8444dc5..f649a78 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ +Makefile __pycache__ .mypy_cache .coverage .idea coverage.xml -Makefile diff --git a/Makefile b/Makefile index a40c4b6..d68ae64 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ all: + eth-validator-watcher 2>&1 | tee -a /var/log/ethereum-watcher/watcher.log test: poetry run pytest diff --git a/pyproject.toml b/pyproject.toml index 0b87dda..b7630bb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ name = "eth-validator-watcher" version = "0.1.0" description = "Ethereum Validator Watcher" -authors = ["Manu NALEPA "] +authors = ["Manu NALEPA , Sébastien Rannou "] readme = "README.md" packages = [{include = "eth_validator_watcher"}] diff --git a/tests/config/.#test_load_config.py b/tests/config/.#test_load_config.py deleted file mode 120000 index fafd067..0000000 --- a/tests/config/.#test_load_config.py +++ /dev/null @@ -1 +0,0 @@ -mxs@bombadil.590226:1700469311 \ No newline at end of file From 9b9d02d59e1b8c079f8e1267c46c6455f34d2639 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Tue, 21 Nov 2023 10:40:40 +0100 Subject: [PATCH 08/82] fix: dead import that worked locally --- tests/utils/test_get_our_pubkeys.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/utils/test_get_our_pubkeys.py b/tests/utils/test_get_our_pubkeys.py index 47b2c4e..395e47e 100644 --- a/tests/utils/test_get_our_pubkeys.py +++ b/tests/utils/test_get_our_pubkeys.py @@ -2,7 +2,6 @@ from eth_validator_watcher.config import WatchedKeyConfig from eth_validator_watcher.utils import get_our_pubkeys -from tests.utils import assets class Web3Signer: From 2609fbd42308089574f59a8421192d6804b8aeed Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Tue, 21 Nov 2023 11:53:44 +0100 Subject: [PATCH 09/82] fix: remove legacy exception check --- eth_validator_watcher/entrypoint.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/eth_validator_watcher/entrypoint.py b/eth_validator_watcher/entrypoint.py index 04b6bef..768cc9c 100644 --- a/eth_validator_watcher/entrypoint.py +++ b/eth_validator_watcher/entrypoint.py @@ -245,10 +245,7 @@ def _handler( last_processed_finalized_slot = slot if is_new_epoch: - try: - our_pubkeys = get_our_pubkeys(watched_keys, web3signer) - except ValueError: - raise typer.BadParameter("Some pubkeys are invalid") + our_pubkeys = get_our_pubkeys(watched_keys, web3signer) # Network validators # ------------------ From 70a9b702bd90a88a58da6a0db9ed09a876c31f59 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Tue, 21 Nov 2023 12:12:28 +0100 Subject: [PATCH 10/82] feat: pretty print config errors --- etc/config.local.yaml | 4 ++-- eth_validator_watcher/entrypoint.py | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/etc/config.local.yaml b/etc/config.local.yaml index 74f75d5..b5122d8 100644 --- a/etc/config.local.yaml +++ b/etc/config.local.yaml @@ -11,6 +11,6 @@ relays: ~ liveness_file: ~ watched_keys: - - public_key: 0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3 - labels: ["google"] + - public_key: '0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3' + labels: ['google'] fee_recipient: ~ diff --git a/eth_validator_watcher/entrypoint.py b/eth_validator_watcher/entrypoint.py index 768cc9c..7dee7a9 100644 --- a/eth_validator_watcher/entrypoint.py +++ b/eth_validator_watcher/entrypoint.py @@ -9,6 +9,7 @@ import typer from prometheus_client import Gauge, start_http_server from typer import Option +from pydantic import ValidationError from .beacon import Beacon from .config import load_config, WatchedKeyConfig @@ -136,7 +137,10 @@ def handler( Prometheus server is automatically exposed on port 8000. """ - cfg = load_config(config) + try: + cfg = load_config(config) + except ValidationError as err: + raise typer.BadParameter(f'Invalid configuration file: {err}') try: # pragma: no cover _handler( @@ -148,7 +152,7 @@ def handler( cfg.slack_channel, cfg.slack_token, cfg.beacon_type, - cfg.relay_url, + cfg.relays, cfg.liveness_file, ) except KeyboardInterrupt: # pragma: no cover From f14b68b3973fdfc4df6e80493949e8b5f6c41261 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Tue, 21 Nov 2023 12:16:19 +0100 Subject: [PATCH 11/82] feat: make BeaconType compulsory with a default value --- eth_validator_watcher/config.py | 4 ++-- tests/config/assets/config.empty.yaml | 2 +- tests/config/test_load_config.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/eth_validator_watcher/config.py b/eth_validator_watcher/config.py index 245d52e..fbff2f6 100644 --- a/eth_validator_watcher/config.py +++ b/eth_validator_watcher/config.py @@ -21,7 +21,7 @@ class Config(BaseSettings): model_config = SettingsConfigDict(case_sensitive=True, env_prefix='eth_watcher_') beacon_url: Optional[str] = None - beacon_type: Optional[BeaconType] = None + beacon_type: BeaconType = BeaconType.OTHER execution_url: Optional[str] = None web3signer_url: Optional[str] = None default_fee_recipient: Optional[str] = None @@ -46,7 +46,7 @@ def load_config(config_file: str) -> Config: """ with open(config_file, 'r') as fh: config = yaml.safe_load(fh) - + from_env = Config().model_dump() from_yaml = Config(**config).model_dump() diff --git a/tests/config/assets/config.empty.yaml b/tests/config/assets/config.empty.yaml index 2c57e69..5d9fca1 100644 --- a/tests/config/assets/config.empty.yaml +++ b/tests/config/assets/config.empty.yaml @@ -1,5 +1,5 @@ beacon_url: ~ -beacon_type: ~ +beacon_type: other execution_url: ~ web3signer_url: ~ default_fee_recipient: ~ diff --git a/tests/config/test_load_config.py b/tests/config/test_load_config.py index 63dae06..f1a54c5 100644 --- a/tests/config/test_load_config.py +++ b/tests/config/test_load_config.py @@ -16,7 +16,7 @@ def test_empty_config() -> None: assert config.default_fee_recipient is None assert config.slack_channel is None assert config.slack_token is None - assert config.beacon_type is None + assert config.beacon_type == BeaconType.OTHER assert config.relays is None assert config.liveness_file is None assert config.watched_keys is None From 5e726f97ce8b3afaa5e6cb15f478a5c8accd4edb Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Tue, 21 Nov 2023 12:19:01 +0100 Subject: [PATCH 12/82] feat: add unit test for null config file --- eth_validator_watcher/config.py | 2 +- tests/config/assets/config.empty.yaml | 10 ---------- tests/config/assets/config.null.yaml | 10 ++++++++++ tests/config/test_load_config.py | 16 ++++++++++++++++ 4 files changed, 27 insertions(+), 11 deletions(-) create mode 100644 tests/config/assets/config.null.yaml diff --git a/eth_validator_watcher/config.py b/eth_validator_watcher/config.py index fbff2f6..c2a5612 100644 --- a/eth_validator_watcher/config.py +++ b/eth_validator_watcher/config.py @@ -45,7 +45,7 @@ def load_config(config_file: str) -> Config: The effective configuration used by the watcher """ with open(config_file, 'r') as fh: - config = yaml.safe_load(fh) + config = yaml.safe_load(fh) or dict() from_env = Config().model_dump() from_yaml = Config(**config).model_dump() diff --git a/tests/config/assets/config.empty.yaml b/tests/config/assets/config.empty.yaml index 5d9fca1..e69de29 100644 --- a/tests/config/assets/config.empty.yaml +++ b/tests/config/assets/config.empty.yaml @@ -1,10 +0,0 @@ -beacon_url: ~ -beacon_type: other -execution_url: ~ -web3signer_url: ~ -default_fee_recipient: ~ -slack_channel: ~ -slack_token: ~ -relays: ~ -liveness_file: ~ -watched_keys: ~ diff --git a/tests/config/assets/config.null.yaml b/tests/config/assets/config.null.yaml new file mode 100644 index 0000000..5d9fca1 --- /dev/null +++ b/tests/config/assets/config.null.yaml @@ -0,0 +1,10 @@ +beacon_url: ~ +beacon_type: other +execution_url: ~ +web3signer_url: ~ +default_fee_recipient: ~ +slack_channel: ~ +slack_token: ~ +relays: ~ +liveness_file: ~ +watched_keys: ~ diff --git a/tests/config/test_load_config.py b/tests/config/test_load_config.py index f1a54c5..ddd8fcb 100644 --- a/tests/config/test_load_config.py +++ b/tests/config/test_load_config.py @@ -6,6 +6,22 @@ from tests.config import assets +def test_null_config() -> None: + path = Path(assets.__file__).parent / "config.null.yaml" + config = load_config(path) + + assert config.beacon_url is None + assert config.execution_url is None + assert config.web3signer_url is None + assert config.default_fee_recipient is None + assert config.slack_channel is None + assert config.slack_token is None + assert config.beacon_type == BeaconType.OTHER + assert config.relays is None + assert config.liveness_file is None + assert config.watched_keys is None + + def test_empty_config() -> None: path = Path(assets.__file__).parent / "config.empty.yaml" config = load_config(path) From 35eb7247cd51ffca10583cdcc4e06c1fec2501cb Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Tue, 21 Nov 2023 15:35:49 +0100 Subject: [PATCH 13/82] feat: add test for invalid config --- tests/entrypoint/assets/__init__.py | 0 tests/entrypoint/assets/invalid_config.yaml | 1 + tests/entrypoint/test__handler.py | 17 +++++++++++++---- 3 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 tests/entrypoint/assets/__init__.py create mode 100644 tests/entrypoint/assets/invalid_config.yaml diff --git a/tests/entrypoint/assets/__init__.py b/tests/entrypoint/assets/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/entrypoint/assets/invalid_config.yaml b/tests/entrypoint/assets/invalid_config.yaml new file mode 100644 index 0000000..264ce10 --- /dev/null +++ b/tests/entrypoint/assets/invalid_config.yaml @@ -0,0 +1 @@ +beacon_type: 42 diff --git a/tests/entrypoint/test__handler.py b/tests/entrypoint/test__handler.py index 62b7649..b0f6d17 100644 --- a/tests/entrypoint/test__handler.py +++ b/tests/entrypoint/test__handler.py @@ -2,15 +2,17 @@ from pathlib import Path from typing import Iterator, List, Optional, Tuple +from freezegun import freeze_time +from pytest import raises +from typer import BadParameter + from eth_validator_watcher import entrypoint from eth_validator_watcher.config import WatchedKeyConfig -from eth_validator_watcher.entrypoint import _handler +from eth_validator_watcher.entrypoint import handler, _handler from eth_validator_watcher.models import BeaconType, Genesis, Validators from eth_validator_watcher.utils import LimitedDict, Slack from eth_validator_watcher.web3signer import Web3Signer -from freezegun import freeze_time -from pytest import raises -from typer import BadParameter +from tests.entrypoint import assets StatusEnum = Validators.DataItem.StatusEnum Validator = Validators.DataItem.Validator @@ -335,3 +337,10 @@ def write_liveness_file(liveness_file: Path) -> None: ) assert Coinbase.nb_calls == 2 + + +def test_invalid_config() -> None: + path = Path(assets.__file__).parent / "invalid_config.yaml" + + with raises(BadParameter): + handler(path) From cc0ac17d43843cc2cf550296f97a733f84c07a8d Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Tue, 21 Nov 2023 15:38:11 +0100 Subject: [PATCH 14/82] feat: remove dead code --- eth_validator_watcher/utils.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/eth_validator_watcher/utils.py b/eth_validator_watcher/utils.py index ba06c50..feab032 100644 --- a/eth_validator_watcher/utils.py +++ b/eth_validator_watcher/utils.py @@ -170,20 +170,6 @@ def apply_mask(items: list[Any], mask: list[bool]) -> set[Any]: return set(item for item, bit in zip(items, mask) if bit) -def load_pubkeys_from_file(path: Path) -> set[str]: - """Load public keys from a file. - - Parameters: - path: A path to a file containing a list of public keys. - - Returns the corresponding set of public keys. - """ - with path.open() as file_descriptor: - return set( - (eth2_address_lower_0x_prefixed(line.strip()) for line in file_descriptor) - ) - - def get_our_pubkeys( watched_keys: List[WatchedKeyConfig] | None, web3signer: Web3Signer | None, From 467833cfcd20ae473470a011cae5761b45fcfdb2 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Tue, 21 Nov 2023 16:07:48 +0100 Subject: [PATCH 15/82] feat: add new config setting for beacon timeout --- etc/config.local.yaml | 2 +- eth_validator_watcher/beacon.py | 32 +++++++++---------- eth_validator_watcher/config.py | 1 + eth_validator_watcher/entrypoint.py | 4 ++- eth_validator_watcher/execution.py | 2 +- tests/beacon/test_get_block.py | 6 ++-- ..._to_committee_index_to_validators_index.py | 2 +- tests/beacon/test_get_genesis.py | 2 +- tests/beacon/test_get_header.py | 6 ++-- tests/beacon/test_get_proposer_duties.py | 2 +- tests/beacon/test_get_rewards.py | 4 +-- .../test_get_status_to_index_to_validator.py | 2 +- tests/beacon/test_get_validators_liveness.py | 12 +++---- tests/beacon/test_potential_block.py | 4 +-- tests/config/assets/config.null.yaml | 1 - tests/config/assets/config.yaml | 1 + tests/config/test_load_config.py | 5 +++ tests/entrypoint/test__handler.py | 11 +++++-- 18 files changed, 56 insertions(+), 43 deletions(-) diff --git a/etc/config.local.yaml b/etc/config.local.yaml index b5122d8..6f43721 100644 --- a/etc/config.local.yaml +++ b/etc/config.local.yaml @@ -1,7 +1,7 @@ # Example config file for the Ethereum watcher. beacon_url: http://localhost:5051/ -beacon_type: ~ +beacon_type: other execution_url: ~ web3signer_url: ~ default_fee_recipient: ~ diff --git a/eth_validator_watcher/beacon.py b/eth_validator_watcher/beacon.py index 13560bb..8fa9f1a 100644 --- a/eth_validator_watcher/beacon.py +++ b/eth_validator_watcher/beacon.py @@ -1,6 +1,5 @@ """Contains the Beacon class which is used to interact with the consensus layer node.""" - import functools from collections import defaultdict from functools import lru_cache @@ -26,11 +25,8 @@ ValidatorsLivenessResponse, ) -StatusEnum = Validators.DataItem.StatusEnum - -# Hard-coded for now, will need to move this to a config. -TIMEOUT_BEACON_SEC = 90 +StatusEnum = Validators.DataItem.StatusEnum print = functools.partial(print, flush=True) @@ -43,13 +39,15 @@ class NoBlockError(Exception): class Beacon: """Beacon node abstraction.""" - def __init__(self, url: str) -> None: + def __init__(self, url: str, timeout_sec: int) -> None: """Beacon Parameters: - url: URL where the beacon can be reached + url : URL where the beacon can be reached + timeout_sec: timeout in seconds used to query the beacon """ self.__url = url + self.__timeout_sec = timeout_sec self.__http_retry_not_found = Session() self.__http = Session() self.__first_liveness_call = True @@ -114,7 +112,7 @@ def __post_retry_not_found(self, *args: Any, **kwargs: Any) -> Response: def get_genesis(self) -> Genesis: """Get genesis data.""" response = self.__get_retry_not_found( - f"{self.__url}/eth/v1/beacon/genesis", timeout=TIMEOUT_BEACON_SEC + f"{self.__url}/eth/v1/beacon/genesis", timeout=self.__timeout_sec ) response.raise_for_status() genesis_dict = response.json() @@ -129,7 +127,7 @@ def get_header(self, block_identifier: Union[BlockIdentierType, int]) -> Header: """ try: response = self.__get( - f"{self.__url}/eth/v1/beacon/headers/{block_identifier}", timeout=TIMEOUT_BEACON_SEC + f"{self.__url}/eth/v1/beacon/headers/{block_identifier}", timeout=self.__timeout_sec ) response.raise_for_status() @@ -153,7 +151,7 @@ def get_block(self, slot: int) -> Block: """ try: response = self.__get( - f"{self.__url}/eth/v2/beacon/blocks/{slot}", timeout=TIMEOUT_BEACON_SEC + f"{self.__url}/eth/v2/beacon/blocks/{slot}", timeout=self.__timeout_sec ) response.raise_for_status() @@ -176,7 +174,7 @@ def get_proposer_duties(self, epoch: int) -> ProposerDuties: epoch: Epoch corresponding to the proposer duties to retrieve """ response = self.__get_retry_not_found( - f"{self.__url}/eth/v1/validator/duties/proposer/{epoch}", timeout=TIMEOUT_BEACON_SEC + f"{self.__url}/eth/v1/validator/duties/proposer/{epoch}", timeout=self.__timeout_sec ) response.raise_for_status() @@ -193,7 +191,7 @@ def get_status_to_index_to_validator( inner value : Validator """ response = self.__get_retry_not_found( - f"{self.__url}/eth/v1/beacon/states/head/validators", timeout=TIMEOUT_BEACON_SEC + f"{self.__url}/eth/v1/beacon/states/head/validators", timeout=self.__timeout_sec ) response.raise_for_status() @@ -226,7 +224,7 @@ def get_duty_slot_to_committee_index_to_validators_index( response = self.__get_retry_not_found( f"{self.__url}/eth/v1/beacon/states/head/committees", params=dict(epoch=epoch), - timeout=TIMEOUT_BEACON_SEC, + timeout=self.__timeout_sec, ) response.raise_for_status() @@ -289,7 +287,7 @@ def get_rewards( if validators_index is not None else [] ), - timeout=TIMEOUT_BEACON_SEC, + timeout=self.__timeout_sec, ) response.raise_for_status() @@ -390,7 +388,7 @@ def __get_validators_liveness_lighthouse( json=ValidatorsLivenessRequestLighthouse( epoch=epoch, indices=sorted(list(validators_index)) ).model_dump(), - timeout=TIMEOUT_BEACON_SEC, + timeout=self.__timeout_sec, ) def __get_validators_liveness_old_teku( @@ -410,7 +408,7 @@ def __get_validators_liveness_old_teku( json=ValidatorsLivenessRequestTeku( indices=sorted(list(validators_index)) ).model_dump(), - timeout=TIMEOUT_BEACON_SEC, + timeout=self.__timeout_sec, ) def __get_validators_liveness_beacon_api( @@ -431,5 +429,5 @@ def __get_validators_liveness_beacon_api( str(validator_index) for validator_index in sorted(list(validators_index)) ], - timeout=TIMEOUT_BEACON_SEC, + timeout=self.__timeout_sec, ) diff --git a/eth_validator_watcher/config.py b/eth_validator_watcher/config.py index c2a5612..e3b8073 100644 --- a/eth_validator_watcher/config.py +++ b/eth_validator_watcher/config.py @@ -22,6 +22,7 @@ class Config(BaseSettings): beacon_url: Optional[str] = None beacon_type: BeaconType = BeaconType.OTHER + beacon_timeout_sec: int = 90 execution_url: Optional[str] = None web3signer_url: Optional[str] = None default_fee_recipient: Optional[str] = None diff --git a/eth_validator_watcher/entrypoint.py b/eth_validator_watcher/entrypoint.py index 7dee7a9..0612487 100644 --- a/eth_validator_watcher/entrypoint.py +++ b/eth_validator_watcher/entrypoint.py @@ -145,6 +145,7 @@ def handler( try: # pragma: no cover _handler( cfg.beacon_url, + cfg.beacon_timeout_sec, cfg.execution_url, cfg.watched_keys, cfg.web3signer_url, @@ -161,6 +162,7 @@ def handler( def _handler( beacon_url: str, + beacon_timeout_sec: int, execution_url: str | None, watched_keys: List[WatchedKeyConfig] | None, web3signer_url: str | None, @@ -195,7 +197,7 @@ def _handler( else None ) - beacon = Beacon(beacon_url) + beacon = Beacon(beacon_url, beacon_timeout_sec) execution = Execution(execution_url) if execution_url is not None else None coinbase = Coinbase() web3signer = Web3Signer(web3signer_url) if web3signer_url is not None else None diff --git a/eth_validator_watcher/execution.py b/eth_validator_watcher/execution.py index 476b6fe..18fc1ab 100644 --- a/eth_validator_watcher/execution.py +++ b/eth_validator_watcher/execution.py @@ -8,7 +8,7 @@ class Execution: - """Beacon node abstraction.""" + """Execution node abstraction.""" def __init__(self, url: str) -> None: """Execution node diff --git a/tests/beacon/test_get_block.py b/tests/beacon/test_get_block.py index 5400163..bb2888b 100644 --- a/tests/beacon/test_get_block.py +++ b/tests/beacon/test_get_block.py @@ -15,7 +15,7 @@ def test_get_block_exists() -> None: with block_path.open() as file_descriptor: block_dict = json.load(file_descriptor) - beacon = Beacon("http://beacon-node:5052") + beacon = Beacon("http://beacon-node:5052", 90) with Mocker() as mock: mock.get( @@ -33,7 +33,7 @@ def get(url: str, **_) -> Response: raise HTTPError(response=response) - beacon = Beacon("http://beacon-node:5052") + beacon = Beacon("http://beacon-node:5052", 90) beacon._Beacon__http.get = get # type: ignore with raises(NoBlockError): @@ -48,7 +48,7 @@ def get(url: str, **_) -> Response: raise HTTPError(response=response) - beacon = Beacon("http://beacon-node:5052") + beacon = Beacon("http://beacon-node:5052", 90) beacon._Beacon__http.get = get # type: ignore with raises(exceptions.RequestException): diff --git a/tests/beacon/test_get_duty_slot_to_committee_index_to_validators_index.py b/tests/beacon/test_get_duty_slot_to_committee_index_to_validators_index.py index da30978..d7236de 100644 --- a/tests/beacon/test_get_duty_slot_to_committee_index_to_validators_index.py +++ b/tests/beacon/test_get_duty_slot_to_committee_index_to_validators_index.py @@ -26,7 +26,7 @@ def test_get_duty_slot_to_committee_index_to_validators_index(): json=committees, ) - beacon = Beacon(beacon_url) + beacon = Beacon(beacon_url, 90) assert ( beacon.get_duty_slot_to_committee_index_to_validators_index(epoch) diff --git a/tests/beacon/test_get_genesis.py b/tests/beacon/test_get_genesis.py index b3da996..5633e51 100644 --- a/tests/beacon/test_get_genesis.py +++ b/tests/beacon/test_get_genesis.py @@ -26,6 +26,6 @@ def test_get_genesis(): f"{beacon_url}/eth/v1/beacon/genesis", json=genesis, ) - beacon = Beacon(beacon_url) + beacon = Beacon(beacon_url, 90) assert beacon.get_genesis() == expected diff --git a/tests/beacon/test_get_header.py b/tests/beacon/test_get_header.py index 2f5f1c0..3008110 100644 --- a/tests/beacon/test_get_header.py +++ b/tests/beacon/test_get_header.py @@ -16,7 +16,7 @@ def test_get_header_exists() -> None: with block_path.open() as file_descriptor: header_dict = json.load(file_descriptor) - beacon = Beacon("http://beacon-node:5052") + beacon = Beacon("http://beacon-node:5052", 90) for identifier, value in { "head": BlockIdentierType.HEAD, @@ -42,7 +42,7 @@ def get(url: str, **_) -> Response: raise HTTPError(response=response) - beacon = Beacon("http://beacon-node:5052") + beacon = Beacon("http://beacon-node:5052", 90) beacon._Beacon__http.get = get # type: ignore with raises(NoBlockError): @@ -57,7 +57,7 @@ def get(url: str, **_) -> Response: raise HTTPError(response=response) - beacon = Beacon("http://beacon-node:5052") + beacon = Beacon("http://beacon-node:5052", 90) beacon._Beacon__http.get = get # type: ignore with raises(exceptions.RequestException): diff --git a/tests/beacon/test_get_proposer_duties.py b/tests/beacon/test_get_proposer_duties.py index 3c986a1..d080729 100644 --- a/tests/beacon/test_get_proposer_duties.py +++ b/tests/beacon/test_get_proposer_duties.py @@ -42,6 +42,6 @@ def test_(): f"{beacon_url}/eth/v1/validator/duties/proposer/6542", json=proposer_duties ) - beacon = Beacon(beacon_url) + beacon = Beacon(beacon_url, 90) assert beacon.get_proposer_duties(6542) == expected diff --git a/tests/beacon/test_get_rewards.py b/tests/beacon/test_get_rewards.py index bb4beb6..3342ae8 100644 --- a/tests/beacon/test_get_rewards.py +++ b/tests/beacon/test_get_rewards.py @@ -9,7 +9,7 @@ def test_get_rewards_not_supported() -> None: - beacon = Beacon("http://beacon-node:5052") + beacon = Beacon("http://beacon-node:5052", 90) expected = Rewards(data=Rewards.Data(ideal_rewards=[], total_rewards=[])) @@ -26,7 +26,7 @@ def test_get_rewards() -> None: with rewards_path.open() as file_descriptor: rewards_dict = json.load(file_descriptor) - beacon = Beacon("http://beacon-node:5052") + beacon = Beacon("http://beacon-node:5052", 90) def match_request(request) -> bool: return request.json() == ["8499", "8500"] diff --git a/tests/beacon/test_get_status_to_index_to_validator.py b/tests/beacon/test_get_status_to_index_to_validator.py index 94fed63..13a1019 100644 --- a/tests/beacon/test_get_status_to_index_to_validator.py +++ b/tests/beacon/test_get_status_to_index_to_validator.py @@ -17,7 +17,7 @@ def test_get_status_to_index_to_validator() -> None: with asset_path.open() as file_descriptor: validators = json.load(file_descriptor) - beacon = Beacon("http://localhost:5052") + beacon = Beacon("http://localhost:5052", 90) expected = { StatusEnum.activeOngoing: { 0: Validator( diff --git a/tests/beacon/test_get_validators_liveness.py b/tests/beacon/test_get_validators_liveness.py index cb12d21..a3eca80 100644 --- a/tests/beacon/test_get_validators_liveness.py +++ b/tests/beacon/test_get_validators_liveness.py @@ -33,7 +33,7 @@ def match_request(request) -> bool: additional_matcher=match_request, json=liveness_response, ) - beacon = Beacon(beacon_url) + beacon = Beacon(beacon_url, 90) expected = {42: True, 44: False, 46: True} assert ( @@ -48,7 +48,7 @@ def match_request(request) -> bool: def test_get_validators_liveness_nimbus(): beacon_url = "http://beacon:5052" - beacon = Beacon(beacon_url) + beacon = Beacon(beacon_url, 90) assert beacon.get_validators_liveness( beacon_type=BeaconType.NIMBUS, epoch=1664, validators_index={42, 44, 46} @@ -76,7 +76,7 @@ def match_request(request) -> bool: additional_matcher=match_request, json=liveness_response, ) - beacon = Beacon(beacon_url) + beacon = Beacon(beacon_url, 90) expected = {42: True, 44: False, 46: True} assert ( @@ -113,7 +113,7 @@ def match_request(request) -> bool: additional_matcher=match_request, json=liveness_response, ) - beacon = Beacon(beacon_url) + beacon = Beacon(beacon_url, 90) expected = {42: True, 44: False, 46: True} assert ( @@ -134,7 +134,7 @@ def post(url: str, **_) -> Response: return response - beacon = Beacon(beacon_url) + beacon = Beacon(beacon_url, 90) beacon._Beacon__http_retry_not_found.post = post # type: ignore expected = {42: True, 44: True, 46: True} @@ -154,7 +154,7 @@ def post(url: str, **_) -> Response: return response - beacon = Beacon(beacon_url) + beacon = Beacon(beacon_url, 90) beacon._Beacon__http_retry_not_found.post = post # type: ignore with raises(HTTPError): diff --git a/tests/beacon/test_potential_block.py b/tests/beacon/test_potential_block.py index c75c108..8109bce 100644 --- a/tests/beacon/test_potential_block.py +++ b/tests/beacon/test_potential_block.py @@ -7,7 +7,7 @@ def get_block(slot: int) -> Block: assert slot == 42 return "a fake block" # type: ignore - beacon = Beacon("http://beacon-node:5052") + beacon = Beacon("http://beacon-node:5052", 90) beacon.get_block = get_block # type: ignore assert beacon.get_potential_block(42) == "a fake block" @@ -18,7 +18,7 @@ def get_block(slot: int) -> Block: assert slot == 42 raise NoBlockError - beacon = Beacon("http://beacon-node:5052") + beacon = Beacon("http://beacon-node:5052", 90) beacon.get_block = get_block # type: ignore assert beacon.get_potential_block(42) is None diff --git a/tests/config/assets/config.null.yaml b/tests/config/assets/config.null.yaml index 5d9fca1..7adb329 100644 --- a/tests/config/assets/config.null.yaml +++ b/tests/config/assets/config.null.yaml @@ -1,5 +1,4 @@ beacon_url: ~ -beacon_type: other execution_url: ~ web3signer_url: ~ default_fee_recipient: ~ diff --git a/tests/config/assets/config.yaml b/tests/config/assets/config.yaml index 45bfdc1..bdb309a 100644 --- a/tests/config/assets/config.yaml +++ b/tests/config/assets/config.yaml @@ -2,6 +2,7 @@ beacon_url: http://localhost:5051/ beacon_type: other +beacon_timeout_sec: 90 execution_url: http://localhost:8545/ web3signer_url: http://web3signer:9000/ default_fee_recipient: '0x41bF25fC8C52d292bD66D3BCEcd8a919ecB9EF88' diff --git a/tests/config/test_load_config.py b/tests/config/test_load_config.py index ddd8fcb..1711e5f 100644 --- a/tests/config/test_load_config.py +++ b/tests/config/test_load_config.py @@ -11,6 +11,7 @@ def test_null_config() -> None: config = load_config(path) assert config.beacon_url is None + assert config.beacon_timeout_sec == 90 assert config.execution_url is None assert config.web3signer_url is None assert config.default_fee_recipient is None @@ -27,6 +28,7 @@ def test_empty_config() -> None: config = load_config(path) assert config.beacon_url is None + assert config.beacon_timeout_sec == 90 assert config.execution_url is None assert config.web3signer_url is None assert config.default_fee_recipient is None @@ -43,6 +45,7 @@ def test_filled_config() -> None: config = load_config(path) assert config.beacon_url == 'http://localhost:5051/' + assert config.beacon_timeout_sec == 90 assert config.execution_url == 'http://localhost:8545/' assert config.web3signer_url == 'http://web3signer:9000/' assert config.default_fee_recipient == '0x41bF25fC8C52d292bD66D3BCEcd8a919ecB9EF88' @@ -59,6 +62,7 @@ def test_filled_config_overriden() -> None: environ = os.environ.copy() os.environ['eth_watcher_beacon_url'] = 'http://override-beacon/' + os.environ['eth_watcher_beacon_timeout_sec'] = '42' os.environ['eth_watcher_execution_url'] = 'http://override-exec/' os.environ['eth_watcher_web3signer_url'] = 'http://override-web3signer/' os.environ['eth_watcher_default_fee_recipient'] = '0x42' @@ -72,6 +76,7 @@ def test_filled_config_overriden() -> None: config = load_config(path) assert config.beacon_url == 'http://override-beacon/' + assert config.beacon_timeout_sec == 42 assert config.execution_url == 'http://override-exec/' assert config.web3signer_url == 'http://override-web3signer/' assert config.default_fee_recipient == '0x42' diff --git a/tests/entrypoint/test__handler.py b/tests/entrypoint/test__handler.py index b0f6d17..e0879c8 100644 --- a/tests/entrypoint/test__handler.py +++ b/tests/entrypoint/test__handler.py @@ -22,6 +22,7 @@ def test_fee_recipient_set_while_execution_url_not_set() -> None: with raises(BadParameter): _handler( beacon_url="", + beacon_timeout_sec=90, execution_url=None, watched_keys=None, web3signer_url=None, @@ -38,6 +39,7 @@ def test_fee_recipient_not_valid() -> None: with raises(BadParameter): _handler( beacon_url="", + beacon_timeout_sec=90, execution_url="http://localhost:8545", watched_keys=None, web3signer_url=None, @@ -54,6 +56,7 @@ def test_slack_token_not_defined() -> None: with raises(BadParameter): _handler( beacon_url="", + beacon_timeout_sec=90, execution_url=None, watched_keys=None, web3signer_url=None, @@ -69,8 +72,9 @@ def test_slack_token_not_defined() -> None: def test_chain_not_ready() -> None: class Beacon: - def __init__(self, url: str) -> None: + def __init__(self, url: str, timeout_sec: int) -> None: assert url == "http://localhost:5052" + assert timeout_sec == 90 def get_genesis(self) -> Genesis: return Genesis( @@ -105,6 +109,7 @@ def start_http_server(_: int) -> None: _handler( beacon_url="http://localhost:5052", + beacon_timeout_sec=90, execution_url=None, watched_keys=None, web3signer_url=None, @@ -120,8 +125,9 @@ def start_http_server(_: int) -> None: @freeze_time("2023-01-01 00:00:00", auto_tick_seconds=15) def test_nominal() -> None: class Beacon: - def __init__(self, url: str) -> None: + def __init__(self, url: str, timeout_sec: int) -> None: assert url == "http://localhost:5052" + assert timeout_sec == 90 def get_genesis(self) -> Genesis: return Genesis( @@ -325,6 +331,7 @@ def write_liveness_file(liveness_file: Path) -> None: _handler( beacon_url="http://localhost:5052", + beacon_timeout_sec=90, execution_url=None, watched_keys=[WatchedKeyConfig(public_key="0xfff")], web3signer_url="http://localhost:9000", From 4d8fafc0086d1ad1daad9840712fa7bcc178c49e Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Wed, 22 Nov 2023 18:14:23 +0100 Subject: [PATCH 16/82] feat: introduce labels for queue size and active validator count --- eth_validator_watcher/entrypoint.py | 34 ++++++++++++----------------- eth_validator_watcher/utils.py | 2 ++ 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/eth_validator_watcher/entrypoint.py b/eth_validator_watcher/entrypoint.py index 0612487..ac1598f 100644 --- a/eth_validator_watcher/entrypoint.py +++ b/eth_validator_watcher/entrypoint.py @@ -36,6 +36,8 @@ NB_SLOT_PER_EPOCH, SLOT_FOR_MISSED_ATTESTATIONS_PROCESS, SLOT_FOR_REWARDS_PROCESS, + LABEL_SCOPE_NETWORK, + LABEL_SCOPE_WATCHED, LimitedDict, Slack, convert_seconds_to_dhms, @@ -55,24 +57,16 @@ metric_slot_gauge = Gauge("slot", "Slot") metric_epoch_gauge = Gauge("epoch", "Epoch") -metric_our_queued_vals_gauge = Gauge( - "our_pending_queued_validators_count", - "Our pending queued validators count", +metric_pending_q_vals_gauge = Gauge( + "pending_queued_validators_count", + "Pending queued validators count", + ["scope"], ) -metric_net_pending_q_vals_gauge = Gauge( - "total_pending_queued_validators_count", - "Total pending queued validators count", -) - -metric_our_active_validators_gauge = Gauge( - "our_active_validators_count", - "Our active validators count", -) - -metric_net_active_validators_gauge = Gauge( - "total_active_validators_count", - "Total active validators count", +metric_active_validators_gauge = Gauge( + "active_validators_count", + "Active validators count", + ["scope"], ) @@ -259,7 +253,7 @@ def _handler( net_pending_q_idx2val = net_status2idx2val.get(Status.pendingQueued, {}) nb_total_pending_q_vals = len(net_pending_q_idx2val) - metric_net_pending_q_vals_gauge.set(nb_total_pending_q_vals) + metric_pending_q_vals_gauge.labels(scope=LABEL_SCOPE_NETWORK).set(nb_total_pending_q_vals) active_ongoing = net_status2idx2val.get(Status.activeOngoing, {}) active_exiting = net_status2idx2val.get(Status.activeExiting, {}) @@ -268,7 +262,7 @@ def _handler( net_epoch2active_idx2val[epoch] = net_active_idx2val net_active_vals_count = len(net_active_idx2val) - metric_net_active_validators_gauge.set(net_active_vals_count) + metric_active_validators_gauge.labels(scope=LABEL_SCOPE_NETWORK).set(net_active_vals_count) net_exited_s_idx2val = net_status2idx2val.get(Status.exitedSlashed, {}) @@ -288,7 +282,7 @@ def _handler( } our_queued_idx2val = our_status2idx2val.get(Status.pendingQueued, {}) - metric_our_queued_vals_gauge.set(len(our_queued_idx2val)) + metric_pending_q_vals_gauge.labels(scope=LABEL_SCOPE_WATCHED).set(len(our_queued_idx2val)) ongoing = our_status2idx2val.get(Status.activeOngoing, {}) active_exiting = our_status2idx2val.get(Status.activeExiting, {}) @@ -296,7 +290,7 @@ def _handler( our_active_idx2val = ongoing | active_exiting | active_slashed our_epoch2active_idx2val[epoch] = our_active_idx2val - metric_our_active_validators_gauge.set(len(our_active_idx2val)) + metric_active_validators_gauge.labels(scope=LABEL_SCOPE_WATCHED).set(len(our_active_idx2val)) our_exited_u_idx2val = our_status2idx2val.get(Status.exitedUnslashed, {}) our_exited_s_idx2val = our_status2idx2val.get(Status.exitedSlashed, {}) diff --git a/eth_validator_watcher/utils.py b/eth_validator_watcher/utils.py index feab032..b43c7f2 100644 --- a/eth_validator_watcher/utils.py +++ b/eth_validator_watcher/utils.py @@ -17,6 +17,8 @@ SLOT_FOR_REWARDS_PROCESS = 17 ETH1_ADDRESS_LEN = 40 ETH2_ADDRESS_LEN = 96 +LABEL_SCOPE_NETWORK="network" +LABEL_SCOPE_WATCHED="watched" CHUCK_NORRIS = [ "Chuck Norris doesn't stake Ethers; he stares at the blockchain, and it instantly " From cc26e5f1f97c73bc828511c47cb0a145930c46d5 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Wed, 3 Apr 2024 15:45:50 +0200 Subject: [PATCH 17/82] feat: add dummy gitignore for local configs --- etc/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 etc/.gitignore diff --git a/etc/.gitignore b/etc/.gitignore new file mode 100644 index 0000000..c11eec8 --- /dev/null +++ b/etc/.gitignore @@ -0,0 +1 @@ +config.dev.yaml \ No newline at end of file From 07236a44b4748aa7b00a2dff97fbb713c4e0ed82 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Wed, 3 Apr 2024 15:55:31 +0200 Subject: [PATCH 18/82] feat: add new alternate entrypoint to later support labeling processing --- eth_validator_watcher/entrypoint_v2.py | 65 ++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 eth_validator_watcher/entrypoint_v2.py diff --git a/eth_validator_watcher/entrypoint_v2.py b/eth_validator_watcher/entrypoint_v2.py new file mode 100644 index 0000000..6fc5477 --- /dev/null +++ b/eth_validator_watcher/entrypoint_v2.py @@ -0,0 +1,65 @@ +"""Draft entrypoint for the eth-validator-watcher v1.0.0. +""" + +from functools import partial +from pathlib import Path +from typing import Optional + +import typer +import time + +from .config import load_config, WatchedKeyConfig + + +print = partial(print, flush=True) +app = typer.Typer(add_completion=False) + + +class ValidatorWatcher: + """Ethereum Validator Watcher. + """ + + def __init__(self, cfg_path: Path) -> None: + """Initialize the Ethereum Validator Watcher. + + Args: + ----- + cfg_path: Path + Path to the configuration file. + """ + self.cfg_path = cfg_path + self.cfg = None + + def reload_config(self) -> None: + """Reload the configuration file. + """ + try: + self.cfg = load_config(self.cfg_path) + except ValidationError as err: + raise typer.BadParameter(f'Invalid configuration file: {err}') + + def run(self) -> None: + """Run the Ethereum Validator Watcher. + """ + while True: + print('Reloading configuration...') + self.reload_config() + time.sleep(1) + + + +@app.command() +def handler( + config: Optional[Path] = typer.Option( + 'etc/config.local.yaml', + help="File containing the Ethereum Validator Watcher configuration file.", + exists=True, + file_okay=True, + dir_okay=False, + show_default=True, + ), +) -> None: + """Run the Ethereum Validator Watcher.""" + + watcher = ValidatorWatcher(config) + watcher.run() From c23d6c1d401f0936ecf86efa264448fd43d9ce2c Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Wed, 3 Apr 2024 15:55:47 +0200 Subject: [PATCH 19/82] feat: add dedicated prometheus metric class --- eth_validator_watcher/metrics.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 eth_validator_watcher/metrics.py diff --git a/eth_validator_watcher/metrics.py b/eth_validator_watcher/metrics.py new file mode 100644 index 0000000..e69de29 From 5956b36bf886794ebbf16a2d976b7a4d5cfc57a4 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Thu, 4 Apr 2024 13:30:07 +0200 Subject: [PATCH 20/82] feat: add basic handling of the main processing loop and introduced watched validators --- etc/config.local.yaml | 4 + eth_validator_watcher/beacon.py | 23 +++ eth_validator_watcher/entrypoint_v2.py | 34 +++- eth_validator_watcher/watched_validators.py | 162 ++++++++++++++++++++ poetry.lock | 2 +- pyproject.toml | 2 +- 6 files changed, 218 insertions(+), 9 deletions(-) create mode 100644 eth_validator_watcher/watched_validators.py diff --git a/etc/config.local.yaml b/etc/config.local.yaml index 6f43721..fb89ab4 100644 --- a/etc/config.local.yaml +++ b/etc/config.local.yaml @@ -10,6 +10,10 @@ slack_token: ~ relays: ~ liveness_file: ~ +# This mapping is reloaded dynamically at the beginning of each +# epoch. If the new mapping is invalid the watcher will crash, be sure +# to use atomic filesystem operations to have a completely updated +# configuration file if you dynamically watch keys. watched_keys: - public_key: '0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3' labels: ['google'] diff --git a/eth_validator_watcher/beacon.py b/eth_validator_watcher/beacon.py index 8fa9f1a..35386f4 100644 --- a/eth_validator_watcher/beacon.py +++ b/eth_validator_watcher/beacon.py @@ -82,6 +82,14 @@ def __init__(self, url: str, timeout_sec: int) -> None: self.__http.mount("http://", adapter) self.__http.mount("https://", adapter) + def get_url(self) -> str: + """Return the URL of the beacon.""" + return self.__url + + def get_timeout_sec(self) -> int: + """Return the timeout in seconds used to query the beacon.""" + return self.__timeout_sec + @retry( stop=stop_after_attempt(5), wait=wait_fixed(3), @@ -208,6 +216,21 @@ def get_status_to_index_to_validator( return result + def get_validators(self) -> Validators: + response = self.__get_retry_not_found( + f"{self.__url}/eth/v1/beacon/states/head/validators", timeout=self.__timeout_sec + ) + + # Unsure if explicit del help with memory here, let's keep it + # for now and benchmark this in real conditions. + response.raise_for_status() + validators_dict = response.json() + del response + validators = Validators(**validators_dict) + del validators_dict + + return validators + @lru_cache(maxsize=1) def get_duty_slot_to_committee_index_to_validators_index( self, epoch: int diff --git a/eth_validator_watcher/entrypoint_v2.py b/eth_validator_watcher/entrypoint_v2.py index 6fc5477..2cdcb49 100644 --- a/eth_validator_watcher/entrypoint_v2.py +++ b/eth_validator_watcher/entrypoint_v2.py @@ -5,13 +5,15 @@ from pathlib import Path from typing import Optional +import logging import typer import time +from .beacon import Beacon from .config import load_config, WatchedKeyConfig +from .watched_validators import WatchedValidators -print = partial(print, flush=True) app = typer.Typer(add_completion=False) @@ -27,23 +29,37 @@ def __init__(self, cfg_path: Path) -> None: cfg_path: Path Path to the configuration file. """ - self.cfg_path = cfg_path - self.cfg = None + self._cfg_path = cfg_path + self._cfg = None + self._beacon = None - def reload_config(self) -> None: + self._reload_config() + + def _reload_config(self) -> None: """Reload the configuration file. """ try: - self.cfg = load_config(self.cfg_path) + self._cfg = load_config(self._cfg_path) except ValidationError as err: raise typer.BadParameter(f'Invalid configuration file: {err}') + if self._beacon is None or self._beacon.get_url() != self._cfg.beacon_url or self._beacon.get_timeout_sec() != self._cfg.beacon_timeout_sec: + self._beacon = Beacon(self._cfg.beacon_url, self._cfg.beacon_timeout_sec) + def run(self) -> None: """Run the Ethereum Validator Watcher. """ + watched_validators = WatchedValidators() while True: - print('Reloading configuration...') - self.reload_config() + logging.info('Processing new epoch') + beacon_validators = self._beacon.get_validators() + watched_validators.process_epoch(beacon_validators) + + logging.info('Processing configuration update') + self._reload_config() + watched_validators.process_config(self._cfg) + + logging.info('Waiting for next iteration') time.sleep(1) @@ -60,6 +76,10 @@ def handler( ), ) -> None: """Run the Ethereum Validator Watcher.""" + logging.basicConfig( + level=logging.INFO, + format='%(asctime)s %(levelname)-8s %(message)s' + ) watcher = ValidatorWatcher(config) watcher.run() diff --git a/eth_validator_watcher/watched_validators.py b/eth_validator_watcher/watched_validators.py new file mode 100644 index 0000000..d486bf5 --- /dev/null +++ b/eth_validator_watcher/watched_validators.py @@ -0,0 +1,162 @@ +"""Watched validators. + +This module provides a wrapper around per-validator computations +before exposing them later to prometheus. There are 4 types of +processing performed: + +- process_config: configuration update (per-key labels) +- process_epoch: new epoch processing (beacon chain status update) +- process_missed_attestations: missed attestation processing (slot 16) +- process_rewards: rewards processing (slot 17) + +WatchedValidator which holds the state of a validator while +WatchedValidators handles the collection of all validators, providing +efficient ways to access them which are then used by the prometheus +exporter. +""" + +import logging + +from typing import Optional + +from .config import Config, WatchedKeyConfig +from .models import Validators + + +class WatchedValidator: + """Watched validator abstraction. + + This needs to be optimized for both CPU and memory usage as it + will be instantiated for every validator of the network. + + Attributes: + index: Validator index + pubkey: Validator public key + status: Validator status for the current epoch + previous_status: Validator previous status for the previous epoch + labels: Validator labels + missed_attestation: Validator missed attestation for the current epoch + previous_missed_attestation: Validator missed previous attestation for the previous epoch + suboptimal_source: Validator suboptimal source for the current epoch + suboptimal_target: Validator suboptimal target for the current epoch + suboptimal_head: Validator suboptimal head for the current epoch + beacon_validator: Latest state of the validator from the beacon chain + """ + + def __init__(self): + self.index : int = 0 + self.previous_status : Validators.DataItem.StatusEnum | None = None + self.labels : Optional[list[str]] = None + self.missed_attestation : bool | None = None + self.previous_missed_attestation : bool | None = None + self.suboptimal_source : bool | None = None + self.suboptimal_target : bool | None = None + self.suboptimal_head : bool | None = None + self.beacon_validator : Validators.DataItem | None = None + + @property + def pubkey(self) -> str: + return self.beacon_validator.validator.pubkey + + @property + def status(self) -> Validators.DataItem.StatusEnum: + return self.beacon_validator.status + + def process_config(self, config: WatchedKeyConfig): + """Processes a new configuration. + + Parameters: + config: New configuration + """ + self.labels = config.labels + + def process_epoch(self, validator: Validators.DataItem): + """Processes a new epoch. + + Parameters: + validator: Validator beacon state + """ + if self.beacon_validator is not None: + self.previous_status = self.status + + self.previous_missed_attestation = self.missed_attestation + self.missed_attestation = None + + self.suboptimal_source = None + self.suboptimal_target = None + self.suboptimal_head = None + + self.beacon_validator = validator + + +class WatchedValidators: + """Wrapper around watched validators. + + Provides facilities to retrieve a validator by index or public + key. This needs to be efficient both in terms of CPU and memory as + there are about ~1 million validators on the network. + """ + + def __init__(self): + self._validators: dict[int, WatchedValidator] = {} + self._pubkey_to_index: dict[str, int] = {} + + def get_validator_by_index(self, index: int) -> Optional[WatchedValidator]: + """Get a validator by index. + + Parameters: + index: Index of the validator to retrieve + """ + return self._validators.get(index) + + def get_validator_by_pubkey(self, pubkey: str) -> Optional[WatchedValidator]: + """Get a validator by public key. + + Parameters: + pubkey: Public key of the validator to retrieve + """ + index = self._pubkey_to_index.get(pubkey) + if index is None: + return None + return self._validators.get(index) + + def process_config(self, config: Config): + """Process a config update + + Parameters: + config: Updated configuration + """ + logging.info('Processing config & validator labels') + + unknown = 0 + for item in config.watched_keys: + updated = False + index = self._pubkey_to_index.get(item.public_key, None) + if index: + validator = self._validators.get(index) + if validator: + validator.process_config(item) + updated = True + if not updated: + unknown += 1 + + logging.info(f'Config processed ({unknown} unknown validators were skipped)') + + def process_epoch(self, validators: Validators): + """Process a new epoch + + Parameters: + validators: New validator state for the epoch from the beaconchain. + """ + logging.info('Processing new epoch') + + for item in validators.data: + validator = self._validators.get(item.index) + if validator is None: + validator = WatchedValidator() + self._validators[item.index] = validator + self._pubkey_to_index[item.validator.pubkey] = item.index + + validator.process_epoch(item) + + logging.info(f'New epoch processed ({len(validators.data)} validators)') diff --git a/poetry.lock b/poetry.lock index b970356..c234659 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.7.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "annotated-types" diff --git a/pyproject.toml b/pyproject.toml index b7630bb..4400286 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,4 +32,4 @@ requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.poetry.scripts] -eth-validator-watcher = "eth_validator_watcher.entrypoint:app" +eth-validator-watcher = "eth_validator_watcher.entrypoint_v2:app" From 38700e386e73242ce2c507e80a465ee30eda121e Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Thu, 4 Apr 2024 13:45:36 +0200 Subject: [PATCH 21/82] feat: normalize public key for comparisons --- eth_validator_watcher/watched_validators.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/eth_validator_watcher/watched_validators.py b/eth_validator_watcher/watched_validators.py index d486bf5..3da991f 100644 --- a/eth_validator_watcher/watched_validators.py +++ b/eth_validator_watcher/watched_validators.py @@ -23,6 +23,17 @@ from .models import Validators +def normalized_public_key(pubkey: str) -> str: + """Normalize a public key. + + Parameters: + pubkey: Public key to normalize + """ + if pubkey.startswith('0x'): + pubkey = pubkey[2:] + return pubkey.lower() + + class WatchedValidator: """Watched validator abstraction. @@ -56,7 +67,7 @@ def __init__(self): @property def pubkey(self) -> str: - return self.beacon_validator.validator.pubkey + return normalized_public_key(self.beacon_validator.validator.pubkey) @property def status(self) -> Validators.DataItem.StatusEnum: @@ -131,7 +142,7 @@ def process_config(self, config: Config): unknown = 0 for item in config.watched_keys: updated = False - index = self._pubkey_to_index.get(item.public_key, None) + index = self._pubkey_to_index.get(normalized_public_key(item.public_key), None) if index: validator = self._validators.get(index) if validator: @@ -155,7 +166,7 @@ def process_epoch(self, validators: Validators): if validator is None: validator = WatchedValidator() self._validators[item.index] = validator - self._pubkey_to_index[item.validator.pubkey] = item.index + self._pubkey_to_index[normalized_public_key(item.validator.pubkey)] = item.index validator.process_epoch(item) From 3f8e3fa3c9e5ce95fafd4b4a571439be7cff74e0 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Thu, 4 Apr 2024 14:50:27 +0200 Subject: [PATCH 22/82] feat: add beacon clock to synchronize the different steps of the watcher --- eth_validator_watcher/beacon.py | 14 ++- eth_validator_watcher/entrypoint_v2.py | 134 ++++++++++++++++++++++++- eth_validator_watcher/models.py | 8 ++ 3 files changed, 150 insertions(+), 6 deletions(-) diff --git a/eth_validator_watcher/beacon.py b/eth_validator_watcher/beacon.py index 35386f4..951cb93 100644 --- a/eth_validator_watcher/beacon.py +++ b/eth_validator_watcher/beacon.py @@ -19,6 +19,7 @@ Header, ProposerDuties, Rewards, + Spec, Validators, ValidatorsLivenessRequestLighthouse, ValidatorsLivenessRequestTeku, @@ -126,6 +127,15 @@ def get_genesis(self) -> Genesis: genesis_dict = response.json() return Genesis(**genesis_dict) + def get_spec(self) -> Spec: + """Get spec data.""" + response = self.__get_retry_not_found( + f"{self.__url}/eth/v1/config/spec", timeout=self.__timeout_sec + ) + response.raise_for_status() + spec_dict = response.json() + return Spec(**spec_dict) + def get_header(self, block_identifier: Union[BlockIdentierType, int]) -> Header: """Get a header. @@ -216,9 +226,9 @@ def get_status_to_index_to_validator( return result - def get_validators(self) -> Validators: + def get_validators(self, slot: int) -> Validators: response = self.__get_retry_not_found( - f"{self.__url}/eth/v1/beacon/states/head/validators", timeout=self.__timeout_sec + f"{self.__url}/eth/v1/beacon/states/{slot}/validators", timeout=self.__timeout_sec ) # Unsure if explicit del help with memory here, let's keep it diff --git a/eth_validator_watcher/entrypoint_v2.py b/eth_validator_watcher/entrypoint_v2.py index 2cdcb49..b38fa10 100644 --- a/eth_validator_watcher/entrypoint_v2.py +++ b/eth_validator_watcher/entrypoint_v2.py @@ -11,12 +11,118 @@ from .beacon import Beacon from .config import load_config, WatchedKeyConfig +from .utils import ( + SLOT_FOR_MISSED_ATTESTATIONS_PROCESS, + SLOT_FOR_REWARDS_PROCESS, +) from .watched_validators import WatchedValidators app = typer.Typer(add_completion=False) +class BeaconClock: + """Helper class to keep track of the beacon clock. + """ + + def __init__(self, genesis: int, slot_duration: int, slots_per_epoch: int) -> None: + self._genesis = genesis + self._slot_duration = slot_duration + self._slots_per_epoch = slots_per_epoch + + def get_current_epoch(self, now: float) -> int: + """Get the current epoch. + + Args: + ----- + now: float + Current time in seconds since the epoch. + + Returns: + -------- + int: Current epoch. + """ + return self.get_current_slot(now) // self._slots_per_epoch + + def epoch_to_slot(self, epoch: int) -> int: + """Convert an epoch to a slot. + + Args: + ----- + epoch: int + Epoch to convert. + + Returns: + -------- + int: Slot corresponding to the epoch. + """ + return epoch * self._slots_per_epoch + + def get_current_slot(self, now: float) -> int: + """Get the current slot. + + Args: + ----- + now: float + Current time in seconds since the epoch. + + Returns: + -------- + int: Current slot. + """ + return int((now - self._genesis) // self._slot_duration) + + def maybe_wait_for_epoch(self, epoch: int, now: float) -> None: + """Wait for the next epoch. + + Args: + ----- + epoch: int + Current epoch. + now: float + Current time in seconds since the epoch. + """ + epoch_start = self.epoch_to_slot(epoch) * self._slot_duration + self._genesis + time_to_wait = epoch_start - now + if time_to_wait > 0: + logging.info(f'Waiting {time_to_wait:.2f} seconds for the next epoch {epoch}') + time.sleep(time_to_wait) + + def maybe_wait_for_missed_attestations_slot(self, epoch: int, now: float) -> None: + """Wait for the missed attestations slot. + + Args: + ----- + epoch: int + Current epoch. + now: float + Current time in seconds since the epoch. + """ + slot = self.epoch_to_slot(epoch) + SLOT_FOR_MISSED_ATTESTATIONS_PROCESS + slot_time = slot * self._slot_duration + self._genesis + time_to_wait = slot_time - now + if time_to_wait > 0: + logging.info(f'Waiting {time_to_wait:.2f} seconds for the missed attestations slot {slot}') + time.sleep(time_to_wait) + + def maybe_wait_for_rewards_slot(self, epoch: int, now: float) -> None: + """Wait for the rewards slot. + + Args: + ----- + epoch: int + Current epoch. + now: float + Current time in seconds since the epoch. + """ + slot = self.epoch_to_slot(epoch) + SLOT_FOR_REWARDS_PROCESS + slot_time = slot * self._slot_duration + self._genesis + time_to_wait = slot_time - now + if time_to_wait > 0: + logging.info(f'Waiting {time_to_wait:.2f} seconds for the rewards slot {slot}') + time.sleep(time_to_wait) + + class ValidatorWatcher: """Ethereum Validator Watcher. """ @@ -32,9 +138,20 @@ def __init__(self, cfg_path: Path) -> None: self._cfg_path = cfg_path self._cfg = None self._beacon = None + self._slot_duration = None + self._genesis = None self._reload_config() + spec = self._beacon.get_spec() + genesis = self._beacon.get_genesis().data.genesis_time + + self._clock = BeaconClock( + genesis, + spec.data.SECONDS_PER_SLOT, + spec.data.SLOTS_PER_EPOCH, + ) + def _reload_config(self) -> None: """Reload the configuration file. """ @@ -50,17 +167,26 @@ def run(self) -> None: """Run the Ethereum Validator Watcher. """ watched_validators = WatchedValidators() + + epoch = self._clock.get_current_epoch(time.time()) + while True: - logging.info('Processing new epoch') - beacon_validators = self._beacon.get_validators() + logging.info(f'Processing epoch {epoch}') + self._clock.maybe_wait_for_epoch(epoch, time.time()) + beacon_validators = self._beacon.get_validators(self._clock.epoch_to_slot(epoch)) watched_validators.process_epoch(beacon_validators) logging.info('Processing configuration update') self._reload_config() watched_validators.process_config(self._cfg) - logging.info('Waiting for next iteration') - time.sleep(1) + logging.info('Processing missed attestations') + self._clock.maybe_wait_for_missed_attestations_slot(epoch, time.time()) + + logging.info('Processing rewards') + self._clock.maybe_wait_for_rewards_slot(epoch, time.time()) + + epoch += 1 diff --git a/eth_validator_watcher/models.py b/eth_validator_watcher/models.py index 7e72d64..3fad089 100644 --- a/eth_validator_watcher/models.py +++ b/eth_validator_watcher/models.py @@ -38,6 +38,14 @@ class Data(BaseModel): data: Data +class Spec(BaseModel): + class Data(BaseModel): + SECONDS_PER_SLOT: int + SLOTS_PER_EPOCH: int + + data: Data + + class Header(BaseModel): class Data(BaseModel): class Header(BaseModel): From 1f006920787373f9efebb442c8e4a2a50e5bf327 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Thu, 4 Apr 2024 16:19:03 +0200 Subject: [PATCH 23/82] feat: add ability to process every slot --- eth_validator_watcher/entrypoint_v2.py | 90 +++++++++----------------- 1 file changed, 32 insertions(+), 58 deletions(-) diff --git a/eth_validator_watcher/entrypoint_v2.py b/eth_validator_watcher/entrypoint_v2.py index b38fa10..6330b4d 100644 --- a/eth_validator_watcher/entrypoint_v2.py +++ b/eth_validator_watcher/entrypoint_v2.py @@ -72,55 +72,20 @@ def get_current_slot(self, now: float) -> int: """ return int((now - self._genesis) // self._slot_duration) - def maybe_wait_for_epoch(self, epoch: int, now: float) -> None: - """Wait for the next epoch. + def maybe_wait_for_slot(self, slot: int, now: float) -> None: + """Wait until the given slot is reached. Args: ----- - epoch: int - Current epoch. - now: float - Current time in seconds since the epoch. - """ - epoch_start = self.epoch_to_slot(epoch) * self._slot_duration + self._genesis - time_to_wait = epoch_start - now - if time_to_wait > 0: - logging.info(f'Waiting {time_to_wait:.2f} seconds for the next epoch {epoch}') - time.sleep(time_to_wait) - - def maybe_wait_for_missed_attestations_slot(self, epoch: int, now: float) -> None: - """Wait for the missed attestations slot. - - Args: - ----- - epoch: int - Current epoch. + slot: int + Slot to wait for. now: float Current time in seconds since the epoch. """ - slot = self.epoch_to_slot(epoch) + SLOT_FOR_MISSED_ATTESTATIONS_PROCESS - slot_time = slot * self._slot_duration + self._genesis - time_to_wait = slot_time - now - if time_to_wait > 0: - logging.info(f'Waiting {time_to_wait:.2f} seconds for the missed attestations slot {slot}') - time.sleep(time_to_wait) - - def maybe_wait_for_rewards_slot(self, epoch: int, now: float) -> None: - """Wait for the rewards slot. - - Args: - ----- - epoch: int - Current epoch. - now: float - Current time in seconds since the epoch. - """ - slot = self.epoch_to_slot(epoch) + SLOT_FOR_REWARDS_PROCESS - slot_time = slot * self._slot_duration + self._genesis - time_to_wait = slot_time - now - if time_to_wait > 0: - logging.info(f'Waiting {time_to_wait:.2f} seconds for the rewards slot {slot}') - time.sleep(time_to_wait) + target = self._genesis + slot * self._slot_duration + if now < target: + logging.info(f'Waiting {target - now:.2f} seconds for slot {slot}') + time.sleep(target - now) class ValidatorWatcher: @@ -143,13 +108,13 @@ def __init__(self, cfg_path: Path) -> None: self._reload_config() - spec = self._beacon.get_spec() + self._spec = self._beacon.get_spec() genesis = self._beacon.get_genesis().data.genesis_time self._clock = BeaconClock( genesis, - spec.data.SECONDS_PER_SLOT, - spec.data.SLOTS_PER_EPOCH, + self._spec.data.SECONDS_PER_SLOT, + self._spec.data.SLOTS_PER_EPOCH, ) def _reload_config(self) -> None: @@ -170,24 +135,33 @@ def run(self) -> None: epoch = self._clock.get_current_epoch(time.time()) + # Before entering the processing loop, make sure we have a + # beacon state in the watched validators as this is what + # ensures we know about validators. + logging.info(f'Initializing watcher at epoch {epoch}') + beacon_validators = self._beacon.get_validators(self._clock.epoch_to_slot(epoch)) + watched_validators.process_epoch(beacon_validators) + + slot = self._clock.get_current_slot(time.time()) while True: - logging.info(f'Processing epoch {epoch}') - self._clock.maybe_wait_for_epoch(epoch, time.time()) - beacon_validators = self._beacon.get_validators(self._clock.epoch_to_slot(epoch)) - watched_validators.process_epoch(beacon_validators) + if slot % self._spec.data.SLOTS_PER_EPOCH == 0: + logging.info(f'Processing new epoch {epoch}') + beacon_validators = self._beacon.get_validators(self._clock.epoch_to_slot(epoch)) + watched_validators.process_epoch(beacon_validators) + + if slot % SLOT_FOR_MISSED_ATTESTATIONS_PROCESS == 0: + logging.info('Processing missed attestations') + + if slot % SLOT_FOR_REWARDS_PROCESS == 0: + logging.info('Processing rewards') logging.info('Processing configuration update') self._reload_config() watched_validators.process_config(self._cfg) - logging.info('Processing missed attestations') - self._clock.maybe_wait_for_missed_attestations_slot(epoch, time.time()) - - logging.info('Processing rewards') - self._clock.maybe_wait_for_rewards_slot(epoch, time.time()) - - epoch += 1 - + self._clock.maybe_wait_for_slot(slot + 1, time.time()) + slot += 1 + epoch = slot % self._spec.data.SLOTS_PER_EPOCH @app.command() From f5b2dc7ab876519114b4a0b1f1098cf99831db7a Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Thu, 4 Apr 2024 16:43:59 +0200 Subject: [PATCH 24/82] feat: add expose of validator status count per label --- eth_validator_watcher/entrypoint_v2.py | 30 +++++++++++++++++ eth_validator_watcher/metrics.py | 37 +++++++++++++++++++++ eth_validator_watcher/watched_validators.py | 20 +++++++++-- 3 files changed, 85 insertions(+), 2 deletions(-) diff --git a/eth_validator_watcher/entrypoint_v2.py b/eth_validator_watcher/entrypoint_v2.py index 6330b4d..48e277b 100644 --- a/eth_validator_watcher/entrypoint_v2.py +++ b/eth_validator_watcher/entrypoint_v2.py @@ -1,6 +1,7 @@ """Draft entrypoint for the eth-validator-watcher v1.0.0. """ +from collections import defaultdict from functools import partial from pathlib import Path from typing import Optional @@ -11,6 +12,8 @@ from .beacon import Beacon from .config import load_config, WatchedKeyConfig +from .metrics import get_prometheus_metrics +from .models import Validators from .utils import ( SLOT_FOR_MISSED_ATTESTATIONS_PROCESS, SLOT_FOR_REWARDS_PROCESS, @@ -100,6 +103,7 @@ def __init__(self, cfg_path: Path) -> None: cfg_path: Path Path to the configuration file. """ + self._metrics = get_prometheus_metrics() self._cfg_path = cfg_path self._cfg = None self._beacon = None @@ -128,6 +132,28 @@ def _reload_config(self) -> None: if self._beacon is None or self._beacon.get_url() != self._cfg.beacon_url or self._beacon.get_timeout_sec() != self._cfg.beacon_timeout_sec: self._beacon = Beacon(self._cfg.beacon_url, self._cfg.beacon_timeout_sec) + def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slot: int) -> None: + """Update the Prometheus metrics with the watched validators. + + Args: + ----- + watched_validators: Watched validators. + epoch: Current epoch. + slot: Current slot. + """ + # Update network metrics + self._metrics.eth_epoch.set(epoch) + self._metrics.eth_slot.set(slot) + + # Update metric for validator status. + validator_status_count: dict[str, dict[StatusEnum, int]] = defaultdict(partial(defaultdict, int)) + for validator in watched_validators.get_validators().values(): + for label in validator.labels: + validator_status_count[label][validator.status] += 1 + for label, status_count in validator_status_count.items(): + for status, count in status_count.items(): + self._metrics.eth_validator_status_count.labels(label, status.name).set(count) + def run(self) -> None: """Run the Ethereum Validator Watcher. """ @@ -144,6 +170,8 @@ def run(self) -> None: slot = self._clock.get_current_slot(time.time()) while True: + logging.info(f'Processing slot {slot}') + if slot % self._spec.data.SLOTS_PER_EPOCH == 0: logging.info(f'Processing new epoch {epoch}') beacon_validators = self._beacon.get_validators(self._clock.epoch_to_slot(epoch)) @@ -159,6 +187,8 @@ def run(self) -> None: self._reload_config() watched_validators.process_config(self._cfg) + self._update_metrics(watched_validators, epoch, slot) + self._clock.maybe_wait_for_slot(slot + 1, time.time()) slot += 1 epoch = slot % self._spec.data.SLOTS_PER_EPOCH diff --git a/eth_validator_watcher/metrics.py b/eth_validator_watcher/metrics.py index e69de29..831ae2a 100644 --- a/eth_validator_watcher/metrics.py +++ b/eth_validator_watcher/metrics.py @@ -0,0 +1,37 @@ +from dataclasses import dataclass + +from prometheus_client import Counter, Gauge, Histogram + + +# This is global because Prometheus metrics don't support registration +# multiple times. This is a workaround for unit tests. +_metrics = None + + +@dataclass +class PrometheusMetrics: + """Define the Prometheus metrics. + """ + eth_slot: Gauge + eth_epoch: Gauge + + eth_validator_status_count: Gauge + + +def get_prometheus_metrics() -> PrometheusMetrics: + """Get the Prometheus metrics. + + Returns: + -------- + PrometheusMetrics + """ + global _metrics + + if _metrics is None: + _metrics = PrometheusMetrics( + eth_slot=Gauge("eth_slot", "Current slot"), + eth_epoch=Gauge("eth_epoch", "Current epoch"), + eth_validator_status_count=Gauge("eth_validator_status_count", "Validator status count", ['scope', 'status']) + ) + + return _metrics diff --git a/eth_validator_watcher/watched_validators.py b/eth_validator_watcher/watched_validators.py index 3da991f..004027f 100644 --- a/eth_validator_watcher/watched_validators.py +++ b/eth_validator_watcher/watched_validators.py @@ -21,6 +21,7 @@ from .config import Config, WatchedKeyConfig from .models import Validators +from .utils import LABEL_SCOPE_NETWORK, LABEL_SCOPE_WATCHED def normalized_public_key(pubkey: str) -> str: @@ -57,7 +58,7 @@ class WatchedValidator: def __init__(self): self.index : int = 0 self.previous_status : Validators.DataItem.StatusEnum | None = None - self.labels : Optional[list[str]] = None + self._labels : Optional[list[str]] = None self.missed_attestation : bool | None = None self.previous_missed_attestation : bool | None = None self.suboptimal_source : bool | None = None @@ -67,19 +68,30 @@ def __init__(self): @property def pubkey(self) -> str: + """Get the public key of the validator. + """ return normalized_public_key(self.beacon_validator.validator.pubkey) @property def status(self) -> Validators.DataItem.StatusEnum: + """Get the status of the validator. + """ return self.beacon_validator.status + @property + def labels(self) -> list[str]: + """Get the labels for the validator. + """ + configured = self._labels or [] + return configured + [LABEL_SCOPE_NETWORK, LABEL_SCOPE_WATCHED] + def process_config(self, config: WatchedKeyConfig): """Processes a new configuration. Parameters: config: New configuration """ - self.labels = config.labels + self._labels = config.labels def process_epoch(self, validator: Validators.DataItem): """Processes a new epoch. @@ -131,6 +143,10 @@ def get_validator_by_pubkey(self, pubkey: str) -> Optional[WatchedValidator]: return None return self._validators.get(index) + def get_validators(self) -> dict[int, WatchedValidator]: + """Get all validators.""" + return self._validators + def process_config(self, config: Config): """Process a config update From 0dbb2ece23978030d7da8cfc11e8527b95e99c81 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Thu, 4 Apr 2024 16:51:02 +0200 Subject: [PATCH 25/82] feat: start metrics server --- eth_validator_watcher/config.py | 1 + eth_validator_watcher/entrypoint_v2.py | 6 ++++++ eth_validator_watcher/watched_validators.py | 5 +++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/eth_validator_watcher/config.py b/eth_validator_watcher/config.py index e3b8073..6c50269 100644 --- a/eth_validator_watcher/config.py +++ b/eth_validator_watcher/config.py @@ -31,6 +31,7 @@ class Config(BaseSettings): relays: Optional[List[str]] = None liveness_file: Optional[str] = None watched_keys: Optional[List[WatchedKeyConfig]] = None + metrics_port: Optional[int] = 8000 def load_config(config_file: str) -> Config: diff --git a/eth_validator_watcher/entrypoint_v2.py b/eth_validator_watcher/entrypoint_v2.py index 48e277b..46cdac8 100644 --- a/eth_validator_watcher/entrypoint_v2.py +++ b/eth_validator_watcher/entrypoint_v2.py @@ -4,6 +4,7 @@ from collections import defaultdict from functools import partial from pathlib import Path +from prometheus_client import start_http_server from typing import Optional import logging @@ -104,6 +105,7 @@ def __init__(self, cfg_path: Path) -> None: Path to the configuration file. """ self._metrics = get_prometheus_metrics() + self._metrics_started = False self._cfg_path = cfg_path self._cfg = None self._beacon = None @@ -154,6 +156,10 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo for status, count in status_count.items(): self._metrics.eth_validator_status_count.labels(label, status.name).set(count) + if not self._metrics_started: + start_http_server(self._cfg.metrics_port) + self._metrics_started = True + def run(self) -> None: """Run the Ethereum Validator Watcher. """ diff --git a/eth_validator_watcher/watched_validators.py b/eth_validator_watcher/watched_validators.py index 004027f..b84088c 100644 --- a/eth_validator_watcher/watched_validators.py +++ b/eth_validator_watcher/watched_validators.py @@ -83,7 +83,7 @@ def labels(self) -> list[str]: """Get the labels for the validator. """ configured = self._labels or [] - return configured + [LABEL_SCOPE_NETWORK, LABEL_SCOPE_WATCHED] + return configured + [LABEL_SCOPE_NETWORK] def process_config(self, config: WatchedKeyConfig): """Processes a new configuration. @@ -91,7 +91,8 @@ def process_config(self, config: WatchedKeyConfig): Parameters: config: New configuration """ - self._labels = config.labels + labels = config.labels or [] + self._labels = labels + [LABEL_SCOPE_WATCHED] def process_epoch(self, validator: Validators.DataItem): """Processes a new epoch. From 0bfe45c06bb9a37b6161f41338953d958af1524f Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Thu, 4 Apr 2024 16:51:45 +0200 Subject: [PATCH 26/82] fix: epoch --- eth_validator_watcher/entrypoint_v2.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eth_validator_watcher/entrypoint_v2.py b/eth_validator_watcher/entrypoint_v2.py index 46cdac8..8f66f76 100644 --- a/eth_validator_watcher/entrypoint_v2.py +++ b/eth_validator_watcher/entrypoint_v2.py @@ -197,7 +197,7 @@ def run(self) -> None: self._clock.maybe_wait_for_slot(slot + 1, time.time()) slot += 1 - epoch = slot % self._spec.data.SLOTS_PER_EPOCH + epoch = slot // self._spec.data.SLOTS_PER_EPOCH @app.command() From 3dc3acedf63cd04921a4bb8d1f818d63725a39db Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Thu, 4 Apr 2024 17:42:17 +0200 Subject: [PATCH 27/82] feat: add processing of rewards by scope --- eth_validator_watcher/beacon.py | 48 +-- eth_validator_watcher/entrypoint_v2.py | 49 ++- eth_validator_watcher/metrics.py | 8 +- eth_validator_watcher/rewards.py | 339 ++------------------ eth_validator_watcher/watched_validators.py | 4 + 5 files changed, 84 insertions(+), 364 deletions(-) diff --git a/eth_validator_watcher/beacon.py b/eth_validator_watcher/beacon.py index 951cb93..8018ce8 100644 --- a/eth_validator_watcher/beacon.py +++ b/eth_validator_watcher/beacon.py @@ -274,58 +274,24 @@ def get_duty_slot_to_committee_index_to_validators_index( return result - def get_rewards( - self, - beacon_type: BeaconType, - epoch: int, - validators_index: set[int] | None = None, - ) -> Rewards: + def get_rewards(self, epoch: int) -> Rewards: """Get rewards. Parameters: - beacon_type : Type of beacon node - epoch : Epoch corresponding to the rewards to retrieve - validators_index: Set of validator indexes corresponding to the rewards to - retrieve. If None, rewards for all validators will be - retrieved. + epoch: Epoch corresponding to the rewards to retrieve. """ - - # On Prysm, because of - # https://github.com/prysmaticlabs/prysm/issues/11581, - # we just assume there is no rewards at all - - # On Nimbus, because of - # https://github.com/status-im/nimbus-eth2/issues/5138, - # we just assume there is no rewards at all - - if beacon_type in {BeaconType.NIMBUS, BeaconType.OLD_PRYSM}: - if self.__first_rewards_call: - self.__first_rewards_call = False - print( - ( - "⚠️ You are using Prysm < 4.0.8 or Nimbus. Rewards will be " - "ignored. See " - "https://github.com/prysmaticlabs/prysm/issues/11581 " - "(Prysm) & https://github.com/status-im/nimbus-eth2/issues/5138 " - "(Nimbus) for more information." - ) - ) - - return Rewards(data=Rewards.Data(ideal_rewards=[], total_rewards=[])) - response = self.__post_retry_not_found( f"{self.__url}/eth/v1/beacon/rewards/attestations/{epoch}", - json=( - [str(index) for index in sorted(validators_index)] - if validators_index is not None - else [] - ), + json=([]), timeout=self.__timeout_sec, ) response.raise_for_status() rewards_dict = response.json() - return Rewards(**rewards_dict) + del response + rewards = Rewards(**rewards_dict) + del rewards_dict + return rewards def get_validators_liveness( self, beacon_type: BeaconType, epoch: int, validators_index: set[int] diff --git a/eth_validator_watcher/entrypoint_v2.py b/eth_validator_watcher/entrypoint_v2.py index 8f66f76..194a767 100644 --- a/eth_validator_watcher/entrypoint_v2.py +++ b/eth_validator_watcher/entrypoint_v2.py @@ -15,6 +15,7 @@ from .config import load_config, WatchedKeyConfig from .metrics import get_prometheus_metrics from .models import Validators +from .rewards import process_rewards from .utils import ( SLOT_FOR_MISSED_ATTESTATIONS_PROCESS, SLOT_FOR_REWARDS_PROCESS, @@ -25,6 +26,15 @@ app = typer.Typer(add_completion=False) +def pct(a: int, b: int) -> float: + """Helper function to calculate the percentage of a over b. + """ + total = a + b + if total == 0: + return 0.0 + return float(a / total) * 100.0 + + class BeaconClock: """Helper class to keep track of the beacon clock. """ @@ -143,19 +153,50 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo epoch: Current epoch. slot: Current slot. """ - # Update network metrics self._metrics.eth_epoch.set(epoch) self._metrics.eth_slot.set(slot) - # Update metric for validator status. + # We iterate once on the validator set to optimize CPU as + # there is a log of entries here, this makes code here a bit + # more complex and entangled. + validator_status_count: dict[str, dict[StatusEnum, int]] = defaultdict(partial(defaultdict, int)) + + validator_suboptimal_source_count: dict[str, int] = defaultdict(int) + validator_suboptimal_target_count: dict[str, int] = defaultdict(int) + validator_suboptimal_head_count: dict[str, int] = defaultdict(int) + validator_optimal_source_count: dict[str, int] = defaultdict(int) + validator_optimal_target_count: dict[str, int] = defaultdict(int) + validator_optimal_head_count: dict[str, int] = defaultdict(int) + + labels = set() + for validator in watched_validators.get_validators().values(): for label in validator.labels: + validator_status_count[label][validator.status] += 1 + + # Looks weird but we want to explicitly have labels set + # for each set of labels even if they aren't validating + # (in which case the validator attributes are None). + validator_suboptimal_source_count[label] += int(validator.suboptimal_source == True) + validator_suboptimal_target_count[label] += int(validator.suboptimal_target == True) + validator_suboptimal_head_count[label] += int(validator.suboptimal_head == True) + validator_optimal_source_count[label] += int(validator.suboptimal_source == False) + validator_optimal_target_count[label] += int(validator.suboptimal_target == False) + validator_optimal_head_count[label] += int(validator.suboptimal_head == False) + + labels.add(label) + for label, status_count in validator_status_count.items(): for status, count in status_count.items(): self._metrics.eth_validator_status_count.labels(label, status.name).set(count) + for label in labels: + self._metrics.eth_suboptimal_sources_rate.labels(label).set(pct(validator_suboptimal_source_count[label], validator_optimal_source_count[label])) + self._metrics.eth_suboptimal_targets_rate.labels(label).set(pct(validator_suboptimal_target_count[label], validator_optimal_target_count[label])) + self._metrics.eth_suboptimal_heads_rate.labels(label).set(pct(validator_suboptimal_head_count[label], validator_optimal_head_count[label])) + if not self._metrics_started: start_http_server(self._cfg.metrics_port) self._metrics_started = True @@ -173,6 +214,8 @@ def run(self) -> None: logging.info(f'Initializing watcher at epoch {epoch}') beacon_validators = self._beacon.get_validators(self._clock.epoch_to_slot(epoch)) watched_validators.process_epoch(beacon_validators) + rewards = self._beacon.get_rewards(epoch - 2) + process_rewards(watched_validators, rewards) slot = self._clock.get_current_slot(time.time()) while True: @@ -188,6 +231,8 @@ def run(self) -> None: if slot % SLOT_FOR_REWARDS_PROCESS == 0: logging.info('Processing rewards') + rewards = self._beacon.get_rewards(epoch - 2) + process_rewards(watched_validators, rewards) logging.info('Processing configuration update') self._reload_config() diff --git a/eth_validator_watcher/metrics.py b/eth_validator_watcher/metrics.py index 831ae2a..e30643d 100644 --- a/eth_validator_watcher/metrics.py +++ b/eth_validator_watcher/metrics.py @@ -16,6 +16,9 @@ class PrometheusMetrics: eth_epoch: Gauge eth_validator_status_count: Gauge + eth_suboptimal_sources_rate: Gauge + eth_suboptimal_targets_rate: Gauge + eth_suboptimal_heads_rate: Gauge def get_prometheus_metrics() -> PrometheusMetrics: @@ -31,7 +34,10 @@ def get_prometheus_metrics() -> PrometheusMetrics: _metrics = PrometheusMetrics( eth_slot=Gauge("eth_slot", "Current slot"), eth_epoch=Gauge("eth_epoch", "Current epoch"), - eth_validator_status_count=Gauge("eth_validator_status_count", "Validator status count", ['scope', 'status']) + eth_validator_status_count=Gauge("eth_validator_status_count", "Validator status count", ['scope', 'status']), + eth_suboptimal_sources_rate=Gauge("eth_suboptimal_sources_rate", "Suboptimal sources rate", ['scope']), + eth_suboptimal_targets_rate=Gauge("eth_suboptimal_targets_rate", "Suboptimal targets rate", ['scope']), + eth_suboptimal_heads_rate=Gauge("eth_suboptimal_heads_rate", "Suboptimal heads rate", ['scope']), ) return _metrics diff --git a/eth_validator_watcher/rewards.py b/eth_validator_watcher/rewards.py index 6ddf400..e906a40 100644 --- a/eth_validator_watcher/rewards.py +++ b/eth_validator_watcher/rewards.py @@ -1,330 +1,29 @@ """Contains functions to handle rewards calculation""" -from typing import Tuple +from .models import Rewards +from .watched_validators import WatchedValidators -from prometheus_client import Counter, Gauge -from eth_validator_watcher.utils import LimitedDict - -from .beacon import Beacon -from .models import BeaconType, Validators - -Validator = Validators.DataItem.Validator - -Reward = Tuple[int, int, int] # source, target, head -AreIdeal = Tuple[bool, bool, bool] # source, target, head - -# Network validators -# ------------------ -( - metric_net_suboptimal_sources_rate_gauge, - metric_net_suboptimal_targets_rate_gauge, - metric_net_suboptimal_heads_rate_gauge, -) = ( - Gauge("net_suboptimal_sources_rate", "Network suboptimal sources rate"), - Gauge("net_suboptimal_targets_rate", "Network suboptimal targets rate"), - Gauge("net_suboptimal_heads_rate", "Network suboptimal heads rate"), -) - -( - metric_net_ideal_sources_count, - metric_net_ideal_targets_count, - metric_net_ideal_heads_count, -) = ( - Counter("net_ideal_sources_count", "Network ideal sources count"), - Counter("net_ideal_targets_count", "Network ideal targets count"), - Counter("net_ideal_heads_count", "Network ideal heads count"), -) - -( - metric_net_actual_pos_sources_count, - metric_net_actual_neg_sources_count, - metric_net_actual_pos_targets_count, - metric_net_actual_neg_targets_count, - metric_net_actual_heads_count, -) = ( - Counter("net_actual_pos_sources_count", "Network actual positive sources count"), - Counter("net_actual_neg_sources_count", "Network actual negative sources count"), - Counter("net_actual_pos_targets_count", "Network actual positive targets count"), - Counter("net_actual_neg_targets_count", "Network actual negative targets count"), - Counter("net_actual_heads_count", "Network actual heads count"), -) - -# Our validators -# -------------- -( - metric_our_suboptimal_sources_rate_gauge, - metric_our_suboptimal_targets_rate_gauge, - metric_our_suboptimal_heads_rate_gauge, -) = ( - Gauge("our_suboptimal_sources_rate", "Our suboptimal sources rate"), - Gauge("our_suboptimal_targets_rate", "Our suboptimal targets rate"), - Gauge("our_suboptimal_heads_rate", "Our suboptimal heads rate"), -) - -( - metric_our_ideal_sources_count, - metric_our_ideal_targets_count, - metric_our_ideal_heads_count, -) = ( - Counter("our_ideal_sources_count", "Our ideal sources count"), - Counter("our_ideal_targets_count", "Our ideal targets count"), - Counter("our_ideal_heads_count", "Our ideal heads count"), -) - -( - metric_our_actual_pos_sources_count, - metric_our_actual_neg_sources_count, - metric_our_actual_pos_targets_count, - metric_our_actual_neg_targets_count, - metric_our_actual_heads_count, -) = ( - Counter("our_actual_pos_sources_count", "Our actual positive sources count"), - Counter("our_actual_neg_sources_count", "Our actual negative sources count"), - Counter("our_actual_pos_targets_count", "Our actual positive targets count"), - Counter("our_actual_neg_targets_count", "Our actual negative targets count"), - Counter("our_actual_heads_count", "Our actual heads count"), -) - - -def _log( - pubkeys: Tuple[str], - are_ideal: Tuple[bool], - suboptimal_rate: float, - epoch: int, - picto: str, - label: str, -) -> None: - not_perfect_pubkeys = { - pubkey for (pubkey, perfect) in zip(pubkeys, are_ideal) if not perfect - } - - if len(not_perfect_pubkeys) > 0: - first_not_perfect_pubkeys = sorted(not_perfect_pubkeys)[:5] - - short_first_not_perfect_pubkeys = [ - pubkey[:10] for pubkey in first_not_perfect_pubkeys - ] - - short_first_not_perfect_pubkeys_str = ", ".join(short_first_not_perfect_pubkeys) - - diff = len(not_perfect_pubkeys) - len(first_not_perfect_pubkeys) - - print( - f"{picto} Our validator {short_first_not_perfect_pubkeys_str} and {diff} " - f"more had not ideal rewards on {label} at epoch {epoch-2} " - f"({suboptimal_rate:.2%})" - ) - - -def process_rewards( - beacon: Beacon, - beacon_type: BeaconType, - epoch: int, - net_epoch_to_index_to_validator: LimitedDict, - our_epoch_to_index_to_validator: LimitedDict, -) -> None: - """Process rewards for given epoch and validators - - Parameters: - beacon (Beacon): Beacon object - beacon_type (BeaconType): Beacon type - epoch (int): Epoch number - - net_epoch_to_index_to_validator : Limited dictionary with: - outer key : epoch - outer value, inner key: validator indexes - inner value : validators - - our_epoch_to_index_to_validator : Limited dictionary with: - outer key : epoch - outer value, inner key: validator indexes - inner value : validators +def process_rewards(validators: WatchedValidators, rewards: Rewards) -> None: + """Processes rewards for all validators. """ + ideal_by_eb: dict[int, Rewards.Data.IdealReward] = {} + for ideal_reward in rewards.data.ideal_rewards: + ideal_by_eb[ideal_reward.effective_balance] = ideal_reward - if epoch < 2: - return - - # Network validators - # ------------------ - net_index_to_validator = ( - net_epoch_to_index_to_validator[epoch - 2] - if epoch - 2 in net_epoch_to_index_to_validator - else ( - net_epoch_to_index_to_validator[epoch - 1] - if epoch - 1 in net_epoch_to_index_to_validator - else net_epoch_to_index_to_validator[epoch] - ) - ) - - if len(net_index_to_validator) == 0: - return - - data = beacon.get_rewards(beacon_type, epoch - 2).data - - effective_balance_to_ideal_reward: dict[int, Reward] = { - reward.effective_balance: (reward.source, reward.target, reward.head) - for reward in data.ideal_rewards - } - - index_to_actual_reward: dict[int, Reward] = { - reward.validator_index: (reward.source, reward.target, reward.head) - for reward in data.total_rewards - } - - items = [ - _process_validator( - validator.pubkey, - effective_balance_to_ideal_reward[validator.effective_balance], - index_to_actual_reward[index], - ) - for index, validator in net_index_to_validator.items() - if index in index_to_actual_reward - ] - - unzipped: Tuple[ - Tuple[str], Tuple[Reward], Tuple[Reward], Tuple[AreIdeal] - ] = zip( # type:ignore - *items - ) - - _, ideal_rewards, actual_rewards, ideals = unzipped - - ideal_sources, ideal_targets, ideal_heads = zip(*ideal_rewards) - actual_sources, actual_targets, actual_heads = zip(*actual_rewards) - are_sources_ideal, are_targets_ideal, are_heads_ideal = zip(*ideals) - - total_ideal_sources = sum(ideal_sources) - total_ideal_targets = sum(ideal_targets) - total_ideal_heads = sum(ideal_heads) - - metric_net_ideal_sources_count.inc(total_ideal_sources) - metric_net_ideal_targets_count.inc(total_ideal_targets) - metric_net_ideal_heads_count.inc(total_ideal_heads) - - total_actual_sources = sum(actual_sources) - total_actual_targets = sum(actual_targets) - total_actual_heads = sum(actual_heads) - - ( - metric_net_actual_pos_sources_count - if total_actual_sources >= 0 - else metric_net_actual_neg_sources_count - ).inc(abs(total_actual_sources)) - - ( - metric_net_actual_pos_targets_count - if total_actual_targets >= 0 - else metric_net_actual_neg_targets_count - ).inc(abs(total_actual_targets)) - - metric_net_actual_heads_count.inc(total_actual_heads) - - suboptimal_sources_rate = 1 - sum(are_sources_ideal) / len(are_sources_ideal) - suboptimal_targets_rate = 1 - sum(are_targets_ideal) / len(are_targets_ideal) - suboptimal_heads_rate = 1 - sum(are_heads_ideal) / len(are_heads_ideal) - - metric_net_suboptimal_sources_rate_gauge.set(suboptimal_sources_rate) - metric_net_suboptimal_targets_rate_gauge.set(suboptimal_targets_rate) - metric_net_suboptimal_heads_rate_gauge.set(suboptimal_heads_rate) - - # Our validators - # -------------- - our_index_to_validator = ( - our_epoch_to_index_to_validator[epoch - 2] - if epoch - 2 in our_epoch_to_index_to_validator - else ( - our_epoch_to_index_to_validator[epoch - 1] - if epoch - 1 in our_epoch_to_index_to_validator - else our_epoch_to_index_to_validator[epoch] - ) - ) - - our_indexes = set(our_index_to_validator) - - if len(our_indexes) == 0: - return - - data = beacon.get_rewards(beacon_type, epoch - 2, our_indexes).data - - effective_balance_to_ideal_reward = { - reward.effective_balance: (reward.source, reward.target, reward.head) - for reward in data.ideal_rewards - } - - index_to_actual_reward = { - reward.validator_index: (reward.source, reward.target, reward.head) - for reward in data.total_rewards - } - - items = [ - _process_validator( - validator.pubkey, - effective_balance_to_ideal_reward[validator.effective_balance], - index_to_actual_reward[index], - ) - for index, validator in our_index_to_validator.items() - ] - - unzipped = zip(*items) # type: ignore - - pubkeys, ideal_rewards, actual_rewards, ideals = unzipped - - ideal_sources, ideal_targets, ideal_heads = zip(*ideal_rewards) - actual_sources, actual_targets, actual_heads = zip(*actual_rewards) - are_sources_ideal, are_targets_ideal, are_heads_ideal = zip(*ideals) - - total_ideal_sources = sum(ideal_sources) - total_ideal_targets = sum(ideal_targets) - total_ideal_heads = sum(ideal_heads) - - metric_our_ideal_sources_count.inc(total_ideal_sources) - metric_our_ideal_targets_count.inc(total_ideal_targets) - metric_our_ideal_heads_count.inc(total_ideal_heads) - - total_actual_sources = sum(actual_sources) - total_actual_targets = sum(actual_targets) - total_actual_heads = sum(actual_heads) - - ( - metric_our_actual_pos_sources_count - if total_actual_sources >= 0 - else metric_our_actual_neg_sources_count - ).inc(abs(total_actual_sources)) - - ( - metric_our_actual_pos_targets_count - if total_actual_targets >= 0 - else metric_our_actual_neg_targets_count - ).inc(abs(total_actual_targets)) - - metric_our_actual_heads_count.inc(total_actual_heads) - - suboptimal_sources_rate = 1 - sum(are_sources_ideal) / len(are_sources_ideal) - suboptimal_targets_rate = 1 - sum(are_targets_ideal) / len(are_targets_ideal) - suboptimal_heads_rate = 1 - sum(are_heads_ideal) / len(are_heads_ideal) - - metric_our_suboptimal_sources_rate_gauge.set(suboptimal_sources_rate) - metric_our_suboptimal_targets_rate_gauge.set(suboptimal_targets_rate) - metric_our_suboptimal_heads_rate_gauge.set(suboptimal_heads_rate) - - _log(pubkeys, are_sources_ideal, suboptimal_sources_rate, epoch, "🚰", "source") - _log(pubkeys, are_targets_ideal, suboptimal_targets_rate, epoch, "🎯", "target") - _log(pubkeys, are_heads_ideal, suboptimal_heads_rate, epoch, "👤", "head ") + for reward in rewards.data.total_rewards: + validator = validators.get_validator_by_index(reward.validator_index) + if not validator: + continue + ideal = ideal_by_eb.get(validator.beacon_validator.validator.effective_balance) + if not ideal: + continue -def _process_validator( - pubkey: str, - ideal_reward: Reward, - actual_reward: Reward, -) -> Tuple[str, Reward, Reward, AreIdeal]: - (ideal_source_reward, ideal_target_reward, ideal_head_reward) = ideal_reward - (actual_source_reward, actual_target_reward, actual_head_reward) = actual_reward + validator.suboptimal_source = reward.source != ideal.source + validator.suboptimal_target = reward.target != ideal.target + validator.suboptimal_head = reward.head != ideal.head - are_ideal = ( - actual_source_reward == ideal_source_reward, - actual_target_reward == ideal_target_reward, - actual_head_reward == ideal_head_reward, - ) + validator.ideal_consensus_reward = ideal.source + ideal.target + ideal.head + validator.actual_consensus_reward = reward.source + reward.target + reward.head - return pubkey, ideal_reward, actual_reward, are_ideal diff --git a/eth_validator_watcher/watched_validators.py b/eth_validator_watcher/watched_validators.py index b84088c..b01b082 100644 --- a/eth_validator_watcher/watched_validators.py +++ b/eth_validator_watcher/watched_validators.py @@ -64,6 +64,8 @@ def __init__(self): self.suboptimal_source : bool | None = None self.suboptimal_target : bool | None = None self.suboptimal_head : bool | None = None + self.ideal_consensus_reward : int | None = None + self.actual_consensus_reward : int | None = None self.beacon_validator : Validators.DataItem | None = None @property @@ -109,6 +111,8 @@ def process_epoch(self, validator: Validators.DataItem): self.suboptimal_source = None self.suboptimal_target = None self.suboptimal_head = None + self.ideal_consensus_reward = None + self.actual_consensus_reward = None self.beacon_validator = validator From dab0dba35f066eb17af408bec261fec800e027ae Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Thu, 4 Apr 2024 17:46:49 +0200 Subject: [PATCH 28/82] fix: simplify the main loop --- eth_validator_watcher/entrypoint_v2.py | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/eth_validator_watcher/entrypoint_v2.py b/eth_validator_watcher/entrypoint_v2.py index 194a767..1d7c482 100644 --- a/eth_validator_watcher/entrypoint_v2.py +++ b/eth_validator_watcher/entrypoint_v2.py @@ -205,31 +205,24 @@ def run(self) -> None: """Run the Ethereum Validator Watcher. """ watched_validators = WatchedValidators() - epoch = self._clock.get_current_epoch(time.time()) + slot = self._clock.get_current_slot(time.time()) - # Before entering the processing loop, make sure we have a - # beacon state in the watched validators as this is what - # ensures we know about validators. - logging.info(f'Initializing watcher at epoch {epoch}') - beacon_validators = self._beacon.get_validators(self._clock.epoch_to_slot(epoch)) - watched_validators.process_epoch(beacon_validators) - rewards = self._beacon.get_rewards(epoch - 2) - process_rewards(watched_validators, rewards) + beacon_validators = None + rewards = None - slot = self._clock.get_current_slot(time.time()) while True: logging.info(f'Processing slot {slot}') - - if slot % self._spec.data.SLOTS_PER_EPOCH == 0: - logging.info(f'Processing new epoch {epoch}') + + if beacon_validators == None or (slot % self._spec.data.SLOTS_PER_EPOCH == 0): + logging.info(f'Processing epoch {epoch}') beacon_validators = self._beacon.get_validators(self._clock.epoch_to_slot(epoch)) watched_validators.process_epoch(beacon_validators) if slot % SLOT_FOR_MISSED_ATTESTATIONS_PROCESS == 0: logging.info('Processing missed attestations') - if slot % SLOT_FOR_REWARDS_PROCESS == 0: + if rewards == None or (slot % SLOT_FOR_REWARDS_PROCESS == 0): logging.info('Processing rewards') rewards = self._beacon.get_rewards(epoch - 2) process_rewards(watched_validators, rewards) @@ -238,6 +231,7 @@ def run(self) -> None: self._reload_config() watched_validators.process_config(self._cfg) + logging.info('Updating Prometheus metrics') self._update_metrics(watched_validators, epoch, slot) self._clock.maybe_wait_for_slot(slot + 1, time.time()) From 2d6dfdbf374f64f64d45d9f6a2718e876e3aa99c Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Thu, 4 Apr 2024 18:01:24 +0200 Subject: [PATCH 29/82] feat: compute ideal/actual consensus rewards per scope --- eth_validator_watcher/entrypoint_v2.py | 44 ++++++++++++++++---------- eth_validator_watcher/metrics.py | 6 ++++ 2 files changed, 33 insertions(+), 17 deletions(-) diff --git a/eth_validator_watcher/entrypoint_v2.py b/eth_validator_watcher/entrypoint_v2.py index 1d7c482..53e9dcc 100644 --- a/eth_validator_watcher/entrypoint_v2.py +++ b/eth_validator_watcher/entrypoint_v2.py @@ -26,10 +26,10 @@ app = typer.Typer(add_completion=False) -def pct(a: int, b: int) -> float: +def pct(a: int, b: int, inclusive: bool=False) -> float: """Helper function to calculate the percentage of a over b. """ - total = a + b + total = a + b if not inclusive else b if total == 0: return 0.0 return float(a / total) * 100.0 @@ -162,12 +162,15 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo validator_status_count: dict[str, dict[StatusEnum, int]] = defaultdict(partial(defaultdict, int)) - validator_suboptimal_source_count: dict[str, int] = defaultdict(int) - validator_suboptimal_target_count: dict[str, int] = defaultdict(int) - validator_suboptimal_head_count: dict[str, int] = defaultdict(int) - validator_optimal_source_count: dict[str, int] = defaultdict(int) - validator_optimal_target_count: dict[str, int] = defaultdict(int) - validator_optimal_head_count: dict[str, int] = defaultdict(int) + suboptimal_source_count: dict[str, int] = defaultdict(int) + suboptimal_target_count: dict[str, int] = defaultdict(int) + suboptimal_head_count: dict[str, int] = defaultdict(int) + optimal_source_count: dict[str, int] = defaultdict(int) + optimal_target_count: dict[str, int] = defaultdict(int) + optimal_head_count: dict[str, int] = defaultdict(int) + + ideal_consensus_reward: dict[str, int] = defaultdict(int) + actual_consensus_reward: dict[str, int] = defaultdict(int) labels = set() @@ -179,12 +182,15 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo # Looks weird but we want to explicitly have labels set # for each set of labels even if they aren't validating # (in which case the validator attributes are None). - validator_suboptimal_source_count[label] += int(validator.suboptimal_source == True) - validator_suboptimal_target_count[label] += int(validator.suboptimal_target == True) - validator_suboptimal_head_count[label] += int(validator.suboptimal_head == True) - validator_optimal_source_count[label] += int(validator.suboptimal_source == False) - validator_optimal_target_count[label] += int(validator.suboptimal_target == False) - validator_optimal_head_count[label] += int(validator.suboptimal_head == False) + suboptimal_source_count[label] += int(validator.suboptimal_source == True) + suboptimal_target_count[label] += int(validator.suboptimal_target == True) + suboptimal_head_count[label] += int(validator.suboptimal_head == True) + optimal_source_count[label] += int(validator.suboptimal_source == False) + optimal_target_count[label] += int(validator.suboptimal_target == False) + optimal_head_count[label] += int(validator.suboptimal_head == False) + + ideal_consensus_reward[label] += validator.ideal_consensus_reward or 0 + actual_consensus_reward[label] += validator.actual_consensus_reward or 0 labels.add(label) @@ -193,9 +199,13 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo self._metrics.eth_validator_status_count.labels(label, status.name).set(count) for label in labels: - self._metrics.eth_suboptimal_sources_rate.labels(label).set(pct(validator_suboptimal_source_count[label], validator_optimal_source_count[label])) - self._metrics.eth_suboptimal_targets_rate.labels(label).set(pct(validator_suboptimal_target_count[label], validator_optimal_target_count[label])) - self._metrics.eth_suboptimal_heads_rate.labels(label).set(pct(validator_suboptimal_head_count[label], validator_optimal_head_count[label])) + self._metrics.eth_suboptimal_sources_rate.labels(label).set(pct(suboptimal_source_count[label], optimal_source_count[label])) + self._metrics.eth_suboptimal_targets_rate.labels(label).set(pct(suboptimal_target_count[label], optimal_target_count[label])) + self._metrics.eth_suboptimal_heads_rate.labels(label).set(pct(suboptimal_head_count[label], optimal_head_count[label])) + + self._metrics.eth_ideal_consensus_rewards.labels(label).set(ideal_consensus_reward[label]) + self._metrics.eth_actual_consensus_rewards.labels(label).set(actual_consensus_reward[label]) + self._metrics.eth_consensus_rewards_rate.labels(label).set(pct(actual_consensus_reward[label], ideal_consensus_reward[label], True)) if not self._metrics_started: start_http_server(self._cfg.metrics_port) diff --git a/eth_validator_watcher/metrics.py b/eth_validator_watcher/metrics.py index e30643d..61b9e48 100644 --- a/eth_validator_watcher/metrics.py +++ b/eth_validator_watcher/metrics.py @@ -19,6 +19,9 @@ class PrometheusMetrics: eth_suboptimal_sources_rate: Gauge eth_suboptimal_targets_rate: Gauge eth_suboptimal_heads_rate: Gauge + eth_ideal_consensus_rewards: Gauge + eth_actual_consensus_rewards: Gauge + eth_consensus_rewards_rate: Gauge def get_prometheus_metrics() -> PrometheusMetrics: @@ -38,6 +41,9 @@ def get_prometheus_metrics() -> PrometheusMetrics: eth_suboptimal_sources_rate=Gauge("eth_suboptimal_sources_rate", "Suboptimal sources rate", ['scope']), eth_suboptimal_targets_rate=Gauge("eth_suboptimal_targets_rate", "Suboptimal targets rate", ['scope']), eth_suboptimal_heads_rate=Gauge("eth_suboptimal_heads_rate", "Suboptimal heads rate", ['scope']), + eth_ideal_consensus_rewards=Gauge("eth_ideal_consensus_rewards", "Ideal consensus rewards", ['scope']), + eth_actual_consensus_rewards=Gauge("eth_actual_consensus_rewards", "Actual consensus rewards", ['scope']), + eth_consensus_rewards_rate=Gauge("eth_consensus_rewards_rate", "Consensus rewards rate", ['scope']), ) return _metrics From 7d882b552d3127dd178e5976468a4bd718dc3de2 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Fri, 5 Apr 2024 15:04:56 +0200 Subject: [PATCH 30/82] feat: now processing missed attestations --- etc/.gitignore | 3 +- eth_validator_watcher/beacon.py | 119 +++----------------- eth_validator_watcher/entrypoint_v2.py | 5 +- eth_validator_watcher/models.py | 9 -- eth_validator_watcher/watched_validators.py | 24 +++- 5 files changed, 41 insertions(+), 119 deletions(-) diff --git a/etc/.gitignore b/etc/.gitignore index c11eec8..1a609a5 100644 --- a/etc/.gitignore +++ b/etc/.gitignore @@ -1 +1,2 @@ -config.dev.yaml \ No newline at end of file +config.dev.yaml +config.py diff --git a/eth_validator_watcher/beacon.py b/eth_validator_watcher/beacon.py index 8018ce8..9beb522 100644 --- a/eth_validator_watcher/beacon.py +++ b/eth_validator_watcher/beacon.py @@ -21,8 +21,6 @@ Rewards, Spec, Validators, - ValidatorsLivenessRequestLighthouse, - ValidatorsLivenessRequestTeku, ValidatorsLivenessResponse, ) @@ -293,68 +291,24 @@ def get_rewards(self, epoch: int) -> Rewards: del rewards_dict return rewards - def get_validators_liveness( - self, beacon_type: BeaconType, epoch: int, validators_index: set[int] - ) -> dict[int, bool]: + def get_validators_liveness(self, epoch: int, indexes: list[int]) -> ValidatorsLivenessResponse: """Get validators liveness. - Parameters : - beacon_type : Type of beacon node - epoch : Epoch corresponding to the validators liveness to retrieve - validators_index: Set of validator indexs corresponding to the liveness to - retrieve + Parameters: + epoch: Epoch corresponding to the validators liveness to retrieve """ + response = self.__post_retry_not_found( + f"{self.__url}/eth/v1/validator/liveness/{epoch}", + json=[f"{i}" for i in indexes], + timeout=self.__timeout_sec, + ) - # On Nimbus, because of - # https://github.com/status-im/nimbus-eth2/issues/5019, - # we just assume that all validators are live - - if beacon_type == BeaconType.NIMBUS: - if self.__first_liveness_call: - self.__first_liveness_call = False - print( - ( - "⚠️ You are using Nimbus. Missed attestations will be ignored. " - "See https://github.com/status-im/nimbus-eth2/issues/5019 for " - "more information." - ) - ) - - return {index: True for index in validators_index} - - beacon_type_to_function = { - BeaconType.LIGHTHOUSE: self.__get_validators_liveness_lighthouse, - BeaconType.OLD_PRYSM: self.__get_validators_liveness_beacon_api, - BeaconType.OLD_TEKU: self.__get_validators_liveness_old_teku, - BeaconType.OTHER: self.__get_validators_liveness_beacon_api, - } - - response = beacon_type_to_function[beacon_type](epoch, validators_index) - - try: - response.raise_for_status() - except HTTPError as e: - if e.response.status_code != codes.bad_request: - raise - - # If we are here, it means the requested epoch is too old, which - # could be normal if the watcher just started - print( - f"❓ Missed attestations detection is disabled for epoch {epoch}. " - ) - - print( - "❓ You can ignore this message if the watcher just started less " - "than one epoch ago. Otherwise, please check that you used the correct " - f"`beacon_type` option (currently set to `{beacon_type}`). " - ) - - return {index: True for index in validators_index} - + response.raise_for_status() validators_liveness_dict = response.json() + del response validators_liveness = ValidatorsLivenessResponse(**validators_liveness_dict) - - return {item.index: item.is_live for item in validators_liveness.data} + del validators_liveness_dict + return validators_liveness def get_potential_block(self, slot) -> Block | None: """Get a block if it exists, otherwise return None. @@ -370,46 +324,6 @@ def get_potential_block(self, slot) -> Block | None: # orphaned before we could fetch it. return None - def __get_validators_liveness_lighthouse( - self, epoch: int, validators_index: set[int] - ) -> Response: - """Get validators liveness from Lighthouse. - - https://github.com/sigp/lighthouse/issues/4243 - - Parameters: - epoch : Epoch corresponding to the validators liveness to retrieve - validators_index: Set of validator indexs corresponding to the liveness to - retrieve - """ - return self.__post_retry_not_found( - f"{self.__url}/lighthouse/liveness", - json=ValidatorsLivenessRequestLighthouse( - epoch=epoch, indices=sorted(list(validators_index)) - ).model_dump(), - timeout=self.__timeout_sec, - ) - - def __get_validators_liveness_old_teku( - self, epoch: int, validators_index: set[int] - ) -> Response: - """Get validators liveness from Teku. - - https://github.com/ConsenSys/teku/issues/7204 - - Parameters: - epoch : Epoch corresponding to the validators liveness to retrieve - validators_index: Set of validator indexs corresponding to the liveness to - retrieve - """ - return self.__post_retry_not_found( - f"{self.__url}/eth/v1/validator/liveness/{epoch}", - json=ValidatorsLivenessRequestTeku( - indices=sorted(list(validators_index)) - ).model_dump(), - timeout=self.__timeout_sec, - ) - def __get_validators_liveness_beacon_api( self, epoch: int, validators_index: set[int] ) -> Response: @@ -422,11 +336,4 @@ def __get_validators_liveness_beacon_api( validators_index: Set of validator indexs corresponding to the liveness to retrieve """ - return self.__post_retry_not_found( - f"{self.__url}/eth/v1/validator/liveness/{epoch}", - json=[ - str(validator_index) - for validator_index in sorted(list(validators_index)) - ], - timeout=self.__timeout_sec, - ) + return diff --git a/eth_validator_watcher/entrypoint_v2.py b/eth_validator_watcher/entrypoint_v2.py index 53e9dcc..f5d31ea 100644 --- a/eth_validator_watcher/entrypoint_v2.py +++ b/eth_validator_watcher/entrypoint_v2.py @@ -5,6 +5,7 @@ from functools import partial from pathlib import Path from prometheus_client import start_http_server +from pydantic import ValidationError from typing import Optional import logging @@ -159,7 +160,7 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo # We iterate once on the validator set to optimize CPU as # there is a log of entries here, this makes code here a bit # more complex and entangled. - + validator_status_count: dict[str, dict[StatusEnum, int]] = defaultdict(partial(defaultdict, int)) suboptimal_source_count: dict[str, int] = defaultdict(int) @@ -182,6 +183,7 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo # Looks weird but we want to explicitly have labels set # for each set of labels even if they aren't validating # (in which case the validator attributes are None). + suboptimal_source_count[label] += int(validator.suboptimal_source == True) suboptimal_target_count[label] += int(validator.suboptimal_target == True) suboptimal_head_count[label] += int(validator.suboptimal_head == True) @@ -228,6 +230,7 @@ def run(self) -> None: logging.info(f'Processing epoch {epoch}') beacon_validators = self._beacon.get_validators(self._clock.epoch_to_slot(epoch)) watched_validators.process_epoch(beacon_validators) + validators_liveness = self._beacon.get_validators_liveness(epoch - 1, watched_validators.get_indexes()) if slot % SLOT_FOR_MISSED_ATTESTATIONS_PROCESS == 0: logging.info('Processing missed attestations') diff --git a/eth_validator_watcher/models.py b/eth_validator_watcher/models.py index 3fad089..0a25916 100644 --- a/eth_validator_watcher/models.py +++ b/eth_validator_watcher/models.py @@ -106,15 +106,6 @@ class Data(BaseModel): data: list[Data] -class ValidatorsLivenessRequestLighthouse(BaseModel): - indices: list[int] - epoch: int - - -class ValidatorsLivenessRequestTeku(BaseModel): - indices: list[int] - - class ValidatorsLivenessResponse(BaseModel): class Data(BaseModel): index: int diff --git a/eth_validator_watcher/watched_validators.py b/eth_validator_watcher/watched_validators.py index b01b082..7561667 100644 --- a/eth_validator_watcher/watched_validators.py +++ b/eth_validator_watcher/watched_validators.py @@ -20,7 +20,7 @@ from typing import Optional from .config import Config, WatchedKeyConfig -from .models import Validators +from .models import Validators, ValidatorsLivenessResponse from .utils import LABEL_SCOPE_NETWORK, LABEL_SCOPE_WATCHED @@ -148,6 +148,10 @@ def get_validator_by_pubkey(self, pubkey: str) -> Optional[WatchedValidator]: return None return self._validators.get(index) + def get_indexes(self) -> list[int]: + """Get all validator indexes.""" + return list(self._validators.keys()) + def get_validators(self) -> dict[int, WatchedValidator]: """Get all validators.""" return self._validators @@ -172,13 +176,14 @@ def process_config(self, config: Config): if not updated: unknown += 1 - logging.info(f'Config processed ({unknown} unknown validators were skipped)') + logging.info(f'Config reloaded') def process_epoch(self, validators: Validators): """Process a new epoch Parameters: validators: New validator state for the epoch from the beaconchain. + liveness: Whether or not the validator attested in the previous epoch. """ logging.info('Processing new epoch') @@ -192,3 +197,18 @@ def process_epoch(self, validators: Validators): validator.process_epoch(item) logging.info(f'New epoch processed ({len(validators.data)} validators)') + + def process_liveness(self, liveness: ValidatorsLivenessResponse): + """Process liveness data + + Parameters: + liveness: Liveness data from the beacon chain + """ + logging.info('Processing liveness data') + + for item in liveness.data: + validator = self._validators.get(item.index) + if validator: + validator.missed_attestation = not item.is_live + + logging.info(f'Liveness data processed ({len(liveness.data)} validators)') From da466bbb16133abd91fc45e7f9adecd83188851f Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Fri, 5 Apr 2024 17:56:42 +0200 Subject: [PATCH 31/82] feat: exporting status in protocol format instead of camelCased --- eth_validator_watcher/entrypoint_v2.py | 4 ++-- eth_validator_watcher/utils.py | 4 ++-- eth_validator_watcher/watched_validators.py | 22 ++++++++++----------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/eth_validator_watcher/entrypoint_v2.py b/eth_validator_watcher/entrypoint_v2.py index f5d31ea..93ef13d 100644 --- a/eth_validator_watcher/entrypoint_v2.py +++ b/eth_validator_watcher/entrypoint_v2.py @@ -178,7 +178,7 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo for validator in watched_validators.get_validators().values(): for label in validator.labels: - validator_status_count[label][validator.status] += 1 + validator_status_count[label][str(validator.status)] += 1 # Looks weird but we want to explicitly have labels set # for each set of labels even if they aren't validating @@ -198,7 +198,7 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo for label, status_count in validator_status_count.items(): for status, count in status_count.items(): - self._metrics.eth_validator_status_count.labels(label, status.name).set(count) + self._metrics.eth_validator_status_count.labels(label, status).set(count) for label in labels: self._metrics.eth_suboptimal_sources_rate.labels(label).set(pct(suboptimal_source_count[label], optimal_source_count[label])) diff --git a/eth_validator_watcher/utils.py b/eth_validator_watcher/utils.py index b43c7f2..9e24b05 100644 --- a/eth_validator_watcher/utils.py +++ b/eth_validator_watcher/utils.py @@ -17,8 +17,8 @@ SLOT_FOR_REWARDS_PROCESS = 17 ETH1_ADDRESS_LEN = 40 ETH2_ADDRESS_LEN = 96 -LABEL_SCOPE_NETWORK="network" -LABEL_SCOPE_WATCHED="watched" +LABEL_SCOPE_NETWORK="scope:network" +LABEL_SCOPE_WATCHED="scope:watched" CHUCK_NORRIS = [ "Chuck Norris doesn't stake Ethers; he stares at the blockchain, and it instantly " diff --git a/eth_validator_watcher/watched_validators.py b/eth_validator_watcher/watched_validators.py index 7561667..fea3ec0 100644 --- a/eth_validator_watcher/watched_validators.py +++ b/eth_validator_watcher/watched_validators.py @@ -1,12 +1,12 @@ """Watched validators. This module provides a wrapper around per-validator computations -before exposing them later to prometheus. There are 4 types of +before exposing them later to prometheus. There are different types of processing performed: - process_config: configuration update (per-key labels) - process_epoch: new epoch processing (beacon chain status update) -- process_missed_attestations: missed attestation processing (slot 16) +- process_liveness: missed attestation processing (slot 16) - process_rewards: rewards processing (slot 17) WatchedValidator which holds the state of a validator while @@ -105,16 +105,16 @@ def process_epoch(self, validator: Validators.DataItem): if self.beacon_validator is not None: self.previous_status = self.status - self.previous_missed_attestation = self.missed_attestation - self.missed_attestation = None + self.beacon_validator = validator - self.suboptimal_source = None - self.suboptimal_target = None - self.suboptimal_head = None - self.ideal_consensus_reward = None - self.actual_consensus_reward = None + def process_liveness(self, liveness: ValidatorsLivenessResponse.Data): + """Processes liveness data. - self.beacon_validator = validator + Parameters: + liveness: Validator liveness data + """ + self.previous_missed_attestation = self.missed_attestation + self.missed_attestation = not liveness.is_live class WatchedValidators: @@ -209,6 +209,6 @@ def process_liveness(self, liveness: ValidatorsLivenessResponse): for item in liveness.data: validator = self._validators.get(item.index) if validator: - validator.missed_attestation = not item.is_live + validator.process_liveness() logging.info(f'Liveness data processed ({len(liveness.data)} validators)') From d76b3d9ac56c248327851c4e1d1b33b8d87174af Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Sat, 6 Apr 2024 00:54:23 +0200 Subject: [PATCH 32/82] feat: add tracking of missed attestations and consecutive missed attestations --- eth_validator_watcher/entrypoint_v2.py | 8 ++++++++ eth_validator_watcher/metrics.py | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/eth_validator_watcher/entrypoint_v2.py b/eth_validator_watcher/entrypoint_v2.py index 93ef13d..b4f7307 100644 --- a/eth_validator_watcher/entrypoint_v2.py +++ b/eth_validator_watcher/entrypoint_v2.py @@ -172,6 +172,8 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo ideal_consensus_reward: dict[str, int] = defaultdict(int) actual_consensus_reward: dict[str, int] = defaultdict(int) + missed_attestations: dict[str, int] = defaultdict(int) + missed_consecutive_attestations: dict[str, int] = defaultdict(int) labels = set() @@ -194,6 +196,9 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo ideal_consensus_reward[label] += validator.ideal_consensus_reward or 0 actual_consensus_reward[label] += validator.actual_consensus_reward or 0 + missed_attestations[label] += int(validator.missed_attestation == True) + missed_consecutive_attestations[label] += int(validator.previous_missed_attestation == True and validator.missed_attestation == True) + labels.add(label) for label, status_count in validator_status_count.items(): @@ -209,6 +214,9 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo self._metrics.eth_actual_consensus_rewards.labels(label).set(actual_consensus_reward[label]) self._metrics.eth_consensus_rewards_rate.labels(label).set(pct(actual_consensus_reward[label], ideal_consensus_reward[label], True)) + self._metrics.eth_missed_attestations.labels(label).set(missed_attestations[label]) + self._metrics.eth_missed_consecutive_attestations.labels(label).set(missed_consecutive_attestations[label]) + if not self._metrics_started: start_http_server(self._cfg.metrics_port) self._metrics_started = True diff --git a/eth_validator_watcher/metrics.py b/eth_validator_watcher/metrics.py index 61b9e48..00dee95 100644 --- a/eth_validator_watcher/metrics.py +++ b/eth_validator_watcher/metrics.py @@ -22,6 +22,8 @@ class PrometheusMetrics: eth_ideal_consensus_rewards: Gauge eth_actual_consensus_rewards: Gauge eth_consensus_rewards_rate: Gauge + eth_missed_attestations: Gauge + eth_missed_consecutive_attestations: Gauge def get_prometheus_metrics() -> PrometheusMetrics: @@ -44,6 +46,8 @@ def get_prometheus_metrics() -> PrometheusMetrics: eth_ideal_consensus_rewards=Gauge("eth_ideal_consensus_rewards", "Ideal consensus rewards", ['scope']), eth_actual_consensus_rewards=Gauge("eth_actual_consensus_rewards", "Actual consensus rewards", ['scope']), eth_consensus_rewards_rate=Gauge("eth_consensus_rewards_rate", "Consensus rewards rate", ['scope']), + eth_missed_attestations=Gauge("eth_missed_attestations", "Missed attestations in the last epoch", ['scope']), + eth_missed_consecutive_attestations=Gauge("eth_missed_consecutive_attestations", "Missed consecutive attestations", ['scope']), ) return _metrics From f4a038fcb6134e6935f2e264e37cddc5eada05e6 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Mon, 15 Apr 2024 10:58:21 +0200 Subject: [PATCH 33/82] feat: rework handle of ETH price --- eth_validator_watcher/coinbase.py | 50 +++++++++++++------------- eth_validator_watcher/entrypoint_v2.py | 2 ++ eth_validator_watcher/metrics.py | 2 ++ poetry.lock | 13 ++++++- pyproject.toml | 1 + 5 files changed, 41 insertions(+), 27 deletions(-) diff --git a/eth_validator_watcher/coinbase.py b/eth_validator_watcher/coinbase.py index 9fde9e9..51547f3 100644 --- a/eth_validator_watcher/coinbase.py +++ b/eth_validator_watcher/coinbase.py @@ -1,33 +1,31 @@ -"""Contains the Coinbase class, which is responsible for fetching the ETH/USD""" +"""Helper to fetch the ETH/USD""" -from prometheus_client import Gauge +from cachetools import func from pydantic import parse_obj_as from requests import Session from .models import CoinbaseTrade + URL = "https://api.pro.coinbase.com/products/ETH-USD/trades" -metric_eth_usd_gauge = Gauge("eth_usd", "ETH/USD conversion rate") - - -class Coinbase: - """Coinbase abstraction.""" - - def __init__(self) -> None: - """Coinbase""" - self.__http = Session() - - def emit_eth_usd_conversion_rate(self) -> None: - """Emit the ETH/USD conversion rate to Prometheus Gauge. - - If any error, fails silently. - """ - try: - response = self.__http.get(URL, params=dict(limit=1)) - trades_dict = response.json() - trades = parse_obj_as(list[CoinbaseTrade], trades_dict) - trade, *_ = trades - metric_eth_usd_gauge.set(trade.price) - except: - # This feature is totally optional, so if it fails, we just return 0 - pass + + +@func.ttl_cache(ttl=600) +def get_current_eth_price() -> float: + """Get the current ETH price in USD. + + Returns: + -------- + float + """ + try: + response = Session().get(URL, params=dict(limit=1)) + trades_dict = response.json() + trades = parse_obj_as(list[CoinbaseTrade], trades_dict) + trade, *_ = trades + except: + # This feature is totally optional, so if it fails, we just + # return 0.0. + return 0.0 + + return trade.price diff --git a/eth_validator_watcher/entrypoint_v2.py b/eth_validator_watcher/entrypoint_v2.py index b4f7307..58adfb7 100644 --- a/eth_validator_watcher/entrypoint_v2.py +++ b/eth_validator_watcher/entrypoint_v2.py @@ -12,6 +12,7 @@ import typer import time +from .coinbase import get_current_eth_price from .beacon import Beacon from .config import load_config, WatchedKeyConfig from .metrics import get_prometheus_metrics @@ -156,6 +157,7 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo """ self._metrics.eth_epoch.set(epoch) self._metrics.eth_slot.set(slot) + self._metrics.eth_current_price.set(get_current_eth_price()) # We iterate once on the validator set to optimize CPU as # there is a log of entries here, this makes code here a bit diff --git a/eth_validator_watcher/metrics.py b/eth_validator_watcher/metrics.py index 00dee95..3b6b892 100644 --- a/eth_validator_watcher/metrics.py +++ b/eth_validator_watcher/metrics.py @@ -14,6 +14,7 @@ class PrometheusMetrics: """ eth_slot: Gauge eth_epoch: Gauge + eth_current_price: Gauge eth_validator_status_count: Gauge eth_suboptimal_sources_rate: Gauge @@ -39,6 +40,7 @@ def get_prometheus_metrics() -> PrometheusMetrics: _metrics = PrometheusMetrics( eth_slot=Gauge("eth_slot", "Current slot"), eth_epoch=Gauge("eth_epoch", "Current epoch"), + eth_current_price=Gauge("eth_current_price", "Current price of ETH in USD"), eth_validator_status_count=Gauge("eth_validator_status_count", "Validator status count", ['scope', 'status']), eth_suboptimal_sources_rate=Gauge("eth_suboptimal_sources_rate", "Suboptimal sources rate", ['scope']), eth_suboptimal_targets_rate=Gauge("eth_suboptimal_targets_rate", "Suboptimal targets rate", ['scope']), diff --git a/poetry.lock b/poetry.lock index c234659..1f88ce9 100644 --- a/poetry.lock +++ b/poetry.lock @@ -51,6 +51,17 @@ d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] +[[package]] +name = "cachetools" +version = "5.3.3" +description = "Extensible memoizing collections and decorators" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, + {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, +] + [[package]] name = "certifi" version = "2023.7.22" @@ -960,4 +971,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "2792d2dc4d7c44168036a2388952c40f3b02e531c987d1f134f9ec35a931afa5" +content-hash = "c7c853671d5922974eeab55b612202b54fcba75c5541b8081bcf87a4634b349d" diff --git a/pyproject.toml b/pyproject.toml index 4400286..467b2c6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,6 +18,7 @@ tenacity = "^8.2.2" pyyaml = "^6.0.1" pydantic-yaml = "^1.2.0" pydantic-settings = "^2.1.0" +cachetools = "^5.3.3" [tool.poetry.group.dev.dependencies] mypy = "^1.2.0" From 6ce63a5ed004209692ccc5e23b98e5b2ba3f6ce6 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Mon, 15 Apr 2024 18:16:48 +0200 Subject: [PATCH 34/82] feat: actually process missed attestations --- eth_validator_watcher/coinbase.py | 2 +- eth_validator_watcher/entrypoint_v2.py | 3 ++- eth_validator_watcher/missed_blocks.py | 1 - eth_validator_watcher/watched_validators.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/eth_validator_watcher/coinbase.py b/eth_validator_watcher/coinbase.py index 51547f3..d371001 100644 --- a/eth_validator_watcher/coinbase.py +++ b/eth_validator_watcher/coinbase.py @@ -20,7 +20,7 @@ def get_current_eth_price() -> float: """ try: response = Session().get(URL, params=dict(limit=1)) - trades_dict = response.json() + trades_dict = response.json() trades = parse_obj_as(list[CoinbaseTrade], trades_dict) trade, *_ = trades except: diff --git a/eth_validator_watcher/entrypoint_v2.py b/eth_validator_watcher/entrypoint_v2.py index 58adfb7..1b8504a 100644 --- a/eth_validator_watcher/entrypoint_v2.py +++ b/eth_validator_watcher/entrypoint_v2.py @@ -162,7 +162,7 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo # We iterate once on the validator set to optimize CPU as # there is a log of entries here, this makes code here a bit # more complex and entangled. - + validator_status_count: dict[str, dict[StatusEnum, int]] = defaultdict(partial(defaultdict, int)) suboptimal_source_count: dict[str, int] = defaultdict(int) @@ -241,6 +241,7 @@ def run(self) -> None: beacon_validators = self._beacon.get_validators(self._clock.epoch_to_slot(epoch)) watched_validators.process_epoch(beacon_validators) validators_liveness = self._beacon.get_validators_liveness(epoch - 1, watched_validators.get_indexes()) + watched_validators.process_liveness(validators_liveness) if slot % SLOT_FOR_MISSED_ATTESTATIONS_PROCESS == 0: logging.info('Processing missed attestations') diff --git a/eth_validator_watcher/missed_blocks.py b/eth_validator_watcher/missed_blocks.py index 5bfebd5..52aaf1f 100644 --- a/eth_validator_watcher/missed_blocks.py +++ b/eth_validator_watcher/missed_blocks.py @@ -126,7 +126,6 @@ def process_missed_blocks_finalized( # Get proposer public key for this slot proposer_duties_data = proposer_duties.data - # In `data` list, items seem to be ordered by slot. # However, there is no specification for that, so it is wiser to # iterate on the list diff --git a/eth_validator_watcher/watched_validators.py b/eth_validator_watcher/watched_validators.py index fea3ec0..122768e 100644 --- a/eth_validator_watcher/watched_validators.py +++ b/eth_validator_watcher/watched_validators.py @@ -209,6 +209,6 @@ def process_liveness(self, liveness: ValidatorsLivenessResponse): for item in liveness.data: validator = self._validators.get(item.index) if validator: - validator.process_liveness() + validator.process_liveness(item) logging.info(f'Liveness data processed ({len(liveness.data)} validators)') From 3002bb548b5b9ff758f016fedff5ae2e585c0b0a Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Wed, 17 Apr 2024 17:23:47 +0200 Subject: [PATCH 35/82] feat: add handling of head/finalized blocks in the processing --- eth_validator_watcher/beacon.py | 3 - eth_validator_watcher/blocks.py | 39 +++++ eth_validator_watcher/entrypoint_v2.py | 53 +++++- eth_validator_watcher/metrics.py | 11 +- eth_validator_watcher/missed_blocks.py | 169 -------------------- eth_validator_watcher/proposer_schedule.py | 55 +++++++ eth_validator_watcher/watched_validators.py | 24 ++- 7 files changed, 162 insertions(+), 192 deletions(-) create mode 100644 eth_validator_watcher/blocks.py delete mode 100644 eth_validator_watcher/missed_blocks.py create mode 100644 eth_validator_watcher/proposer_schedule.py diff --git a/eth_validator_watcher/beacon.py b/eth_validator_watcher/beacon.py index 9beb522..125ad4a 100644 --- a/eth_validator_watcher/beacon.py +++ b/eth_validator_watcher/beacon.py @@ -2,7 +2,6 @@ import functools from collections import defaultdict -from functools import lru_cache from typing import Any, Optional, Union from requests import HTTPError, Response, Session, codes @@ -183,7 +182,6 @@ def get_block(self, slot: int) -> Block: block_dict = response.json() return Block(**block_dict) - @lru_cache() def get_proposer_duties(self, epoch: int) -> ProposerDuties: """Get proposer duties @@ -239,7 +237,6 @@ def get_validators(self, slot: int) -> Validators: return validators - @lru_cache(maxsize=1) def get_duty_slot_to_committee_index_to_validators_index( self, epoch: int ) -> dict[int, dict[int, list[int]]]: diff --git a/eth_validator_watcher/blocks.py b/eth_validator_watcher/blocks.py new file mode 100644 index 0000000..64ef8c6 --- /dev/null +++ b/eth_validator_watcher/blocks.py @@ -0,0 +1,39 @@ +import functools + +from prometheus_client import Counter + +from .models import Block, BlockIdentierType +from .proposer_schedule import ProposerSchedule +from .watched_validators import WatchedValidators + +print = functools.partial(print, flush=True) + + +def process_block(validators: WatchedValidators, schedule: ProposerSchedule, slot_id: int, has_block: bool): + validator_index = schedule.get_head_proposer(slot_id) + if validator_index is None: + return + + validator = validators.get_validator_by_index(validator_index) + if validator is None: + return + + if has_block: + validator.proposed_blocks_count += 1 + else: + validator.missed_blocks_count += 1 + + +def process_finalized_block(validators: WatchedValidators, schedule: ProposerSchedule, slot_id: int, has_block: bool): + validator_index = schedule.get_finalized_proposer(slot_id) + if validator_index is None: + return + + validator = validators.get_validator_by_index(validator_index) + if validator is None: + return + + if has_block: + validator.proposed_blocks_finalized_count += 1 + else: + validator.missed_blocks_finalized_count += 1 diff --git a/eth_validator_watcher/entrypoint_v2.py b/eth_validator_watcher/entrypoint_v2.py index 1b8504a..a999b5a 100644 --- a/eth_validator_watcher/entrypoint_v2.py +++ b/eth_validator_watcher/entrypoint_v2.py @@ -13,15 +13,17 @@ import time from .coinbase import get_current_eth_price -from .beacon import Beacon +from .beacon import Beacon, NoBlockError from .config import load_config, WatchedKeyConfig from .metrics import get_prometheus_metrics -from .models import Validators +from .blocks import process_block, process_finalized_block +from .models import BlockIdentierType, Validators from .rewards import process_rewards from .utils import ( SLOT_FOR_MISSED_ATTESTATIONS_PROCESS, SLOT_FOR_REWARDS_PROCESS, ) +from .proposer_schedule import ProposerSchedule from .watched_validators import WatchedValidators @@ -104,6 +106,26 @@ def maybe_wait_for_slot(self, slot: int, now: float) -> None: time.sleep(target - now) +def has_block_at_slot(beacon: Beacon, block_identifier: BlockIdentierType | int) -> bool: + """Returns the slot of a block identifier if it exists. + + Args: + ----- + beacon: Beacon + Beacon instance. + block_identifier: BlockIdentierType | int + Block identifier (i.e: head, finalized, 42, etc). + + Returns: + -------- + bool: True if the block exists, False otherwise. + """ + try: + return beacon.get_header(block_identifier).data.header.message.slot > 0 + except NoBlockError: + return False + + class ValidatorWatcher: """Ethereum Validator Watcher. """ @@ -135,6 +157,8 @@ def __init__(self, cfg_path: Path) -> None: self._spec.data.SLOTS_PER_EPOCH, ) + self._schedule = ProposerSchedule(self._spec) + def _reload_config(self) -> None: """Reload the configuration file. """ @@ -231,26 +255,43 @@ def run(self) -> None: slot = self._clock.get_current_slot(time.time()) beacon_validators = None + validators_liveness = None rewards = None + last_processed_finalized_slot = None while True: logging.info(f'Processing slot {slot}') + last_finalized_slot = self._beacon.get_header(BlockIdentierType.FINALIZED).data.header.message.slot + self._schedule.update(self._beacon, slot, last_processed_finalized_slot, last_finalized_slot) + if beacon_validators == None or (slot % self._spec.data.SLOTS_PER_EPOCH == 0): logging.info(f'Processing epoch {epoch}') beacon_validators = self._beacon.get_validators(self._clock.epoch_to_slot(epoch)) watched_validators.process_epoch(beacon_validators) + + if validators_liveness == None or (slot % SLOT_FOR_MISSED_ATTESTATIONS_PROCESS == 0): + logging.info('Processing validator liveness') validators_liveness = self._beacon.get_validators_liveness(epoch - 1, watched_validators.get_indexes()) watched_validators.process_liveness(validators_liveness) - if slot % SLOT_FOR_MISSED_ATTESTATIONS_PROCESS == 0: - logging.info('Processing missed attestations') - if rewards == None or (slot % SLOT_FOR_REWARDS_PROCESS == 0): logging.info('Processing rewards') rewards = self._beacon.get_rewards(epoch - 2) process_rewards(watched_validators, rewards) + has_block = has_block_at_slot(self._beacon, slot) + + process_block(watched_validators, self._schedule, slot, has_block) + + last_finalized_slot = self._beacon.get_header(BlockIdentierType.FINALIZED).data.header.message.slot + while last_processed_finalized_slot and last_processed_finalized_slot < last_finalized_slot: + logging.info(f'Processing finalized slot from {last_processed_finalized_slot or last_finalized_slot} to {last_finalized_slot}') + has_block = has_block_at_slot(self._beacon, last_processed_finalized_slot) + process_finalized_block(watched_validators, self._schedule, last_processed_finalized_slot, has_block) + last_processed_finalized_slot += 1 + last_processed_finalized_slot = last_finalized_slot + logging.info('Processing configuration update') self._reload_config() watched_validators.process_config(self._cfg) @@ -258,7 +299,9 @@ def run(self) -> None: logging.info('Updating Prometheus metrics') self._update_metrics(watched_validators, epoch, slot) + self._schedule.clear(slot, last_processed_finalized_slot) self._clock.maybe_wait_for_slot(slot + 1, time.time()) + slot += 1 epoch = slot // self._spec.data.SLOTS_PER_EPOCH diff --git a/eth_validator_watcher/metrics.py b/eth_validator_watcher/metrics.py index 3b6b892..ff18a90 100644 --- a/eth_validator_watcher/metrics.py +++ b/eth_validator_watcher/metrics.py @@ -16,6 +16,7 @@ class PrometheusMetrics: eth_epoch: Gauge eth_current_price: Gauge + # Reset on each epoch. eth_validator_status_count: Gauge eth_suboptimal_sources_rate: Gauge eth_suboptimal_targets_rate: Gauge @@ -23,8 +24,12 @@ class PrometheusMetrics: eth_ideal_consensus_rewards: Gauge eth_actual_consensus_rewards: Gauge eth_consensus_rewards_rate: Gauge - eth_missed_attestations: Gauge - eth_missed_consecutive_attestations: Gauge + + # Incremented on each slot. + eth_missed_attestations: Counter + eth_missed_consecutive_attestations: Counter + eth_missed_block_proposals_head: Counter + eth_missed_block_proposals_finalized: Counter def get_prometheus_metrics() -> PrometheusMetrics: @@ -50,6 +55,8 @@ def get_prometheus_metrics() -> PrometheusMetrics: eth_consensus_rewards_rate=Gauge("eth_consensus_rewards_rate", "Consensus rewards rate", ['scope']), eth_missed_attestations=Gauge("eth_missed_attestations", "Missed attestations in the last epoch", ['scope']), eth_missed_consecutive_attestations=Gauge("eth_missed_consecutive_attestations", "Missed consecutive attestations", ['scope']), + eth_missed_block_proposals_head=Gauge("eth_missed_block_proposals_head", "Missed block proposals at head", ['scope']), + eth_missed_block_proposals_finalized=Gauge("eth_missed_block_proposals_finalized", "Missed finalized block proposals", ['scope']), ) return _metrics diff --git a/eth_validator_watcher/missed_blocks.py b/eth_validator_watcher/missed_blocks.py deleted file mode 100644 index 52aaf1f..0000000 --- a/eth_validator_watcher/missed_blocks.py +++ /dev/null @@ -1,169 +0,0 @@ -"""Contains functions to handle missed block proposals detection on head""" - -import functools - -from prometheus_client import Counter - -from .beacon import Beacon, NoBlockError -from .models import Block, BlockIdentierType -from .utils import NB_SLOT_PER_EPOCH, Slack - -print = functools.partial(print, flush=True) - -metric_missed_block_proposals_head_count = Counter( - "missed_block_proposals_head_count", - "Missed block proposals head count", -) - -metric_missed_block_proposals_finalized_count = Counter( - "missed_block_proposals_finalized_count", - "Missed block proposals finalized count", -) - - -def process_missed_blocks_head( - beacon: Beacon, - potential_block: Block | None, - slot: int, - our_pubkeys: set[str], - slack: Slack | None, -) -> bool: - """Process missed block proposals detection at head - - Parameters: - beacon : Beacon - potential_block: Potential block - slot : Slot - our_pubkeys : Set of our validators public keys - slack : Slack instance - - Returns `True` if we had to propose the block, `False` otherwise - """ - missed = potential_block is None - epoch = slot // NB_SLOT_PER_EPOCH - proposer_duties = beacon.get_proposer_duties(epoch) - - # Get proposer public key for this slot - proposer_duties_data = proposer_duties.data - - # In `data` list, items seem to be ordered by slot. - # However, there is no specification for that, so it is wiser to - # iterate on the list - proposer_pubkey = next( - ( - proposer_duty_data.pubkey - for proposer_duty_data in proposer_duties_data - if proposer_duty_data.slot == slot - ) - ) - - # Check if the validator that has to propose is ours - is_our_validator = proposer_pubkey in our_pubkeys - positive_emoji = "✨" if is_our_validator else "✅" - negative_emoji = "🔺" if is_our_validator else "💩" - - emoji, proposed_or_missed = ( - (negative_emoji, "missed ") if missed else (positive_emoji, "proposed") - ) - - short_proposer_pubkey = proposer_pubkey[:10] - - message_console = ( - f"{emoji} {'Our ' if is_our_validator else ' '}validator " - f"{short_proposer_pubkey} {proposed_or_missed} block at head at epoch {epoch} " - f"- slot {slot} {emoji} - 🔑 {len(our_pubkeys)} keys " - "watched" - ) - - print(message_console) - - if slack is not None and missed and is_our_validator: - message_slack = ( - f"{emoji} {'Our ' if is_our_validator else ' '}validator " - f"`{short_proposer_pubkey}` {proposed_or_missed} block at head at epoch " - f"`{epoch}` - slot `{slot}` {emoji}" - ) - - slack.send_message(message_slack) - - if is_our_validator and missed: - metric_missed_block_proposals_head_count.inc() - - return is_our_validator - - -def process_missed_blocks_finalized( - beacon: Beacon, - last_processed_finalized_slot: int, - slot: int, - our_pubkeys: set[str], - slack: Slack | None, -) -> int: - """Process missed block proposals detection at finalized - - Parameters: - beacon : Beacon - potential_block: Potential block - slot : Slot - our_pubkeys : Set of our validators public keys - slack : Slack instance - - Returns the last finalized slot - """ - assert last_processed_finalized_slot <= slot, "Last processed finalized slot > slot" - - last_finalized_header = beacon.get_header(BlockIdentierType.FINALIZED) - last_finalized_slot = last_finalized_header.data.header.message.slot - epoch_of_last_finalized_slot = last_finalized_slot // NB_SLOT_PER_EPOCH - - # Only to memoize it, in case of the BN does not serve this request for too old - # epochs - beacon.get_proposer_duties(epoch_of_last_finalized_slot) - - for slot_ in range(last_processed_finalized_slot + 1, last_finalized_slot + 1): - epoch = slot_ // NB_SLOT_PER_EPOCH - proposer_duties = beacon.get_proposer_duties(epoch) - - # Get proposer public key for this slot - proposer_duties_data = proposer_duties.data - # In `data` list, items seem to be ordered by slot. - # However, there is no specification for that, so it is wiser to - # iterate on the list - proposer_pubkey = next( - ( - proposer_duty_data.pubkey - for proposer_duty_data in proposer_duties_data - if proposer_duty_data.slot == slot_ - ) - ) - - # Check if the validator that has to propose is ours - is_our_validator = proposer_pubkey in our_pubkeys - - if not is_our_validator: - continue - - # Check if the block has been proposed - try: - beacon.get_header(slot_) - except NoBlockError: - short_proposer_pubkey = proposer_pubkey[:10] - - message_console = ( - f"❌ Our validator {short_proposer_pubkey} missed block at finalized " - f"at epoch {epoch} - slot {slot_} ❌" - ) - - print(message_console) - - if slack is not None: - message_slack = ( - f"❌ Our validator `{short_proposer_pubkey}` missed block at " - f"finalized at epoch {epoch}` - slot `{slot_}` ❌" - ) - - slack.send_message(message_slack) - - metric_missed_block_proposals_finalized_count.inc() - - return last_finalized_slot diff --git a/eth_validator_watcher/proposer_schedule.py b/eth_validator_watcher/proposer_schedule.py new file mode 100644 index 0000000..8d3ad7f --- /dev/null +++ b/eth_validator_watcher/proposer_schedule.py @@ -0,0 +1,55 @@ +"""This module contains facilities to keep track of which validator proposes blocks. +""" + +from dataclasses import dataclass + +from .beacon import Beacon +from .models import Spec + + +class ProposerSchedule: + """Helper class to keep track of which validator proposes blocks. + + We need to keep track of all slots since the last finalization and + up to the end of the next epoch. + """ + + def __init__(self, spec: Spec): + self._spec = spec + self._last_slot = None + self._head_schedule = dict() + self._finalized_schedule = dict() + + def get_head_proposer(self, slot: int) -> int: + return self._head_schedule.get(slot, None) + + def get_finalized_proposer(self, slot: int) -> int: + return self._finalized_schedule.get(slot, None) + + def epoch(self, slot: int) -> int: + return slot // self._spec.data.SLOTS_PER_EPOCH + + def update(self, beacon: Beacon, slot: int, last_processed_finalized: int, last_finalized: int) -> None: + # Current slots & future proposals. + epoch = self.epoch(slot) + if slot not in self._head_schedule: + duties = beacon.get_proposer_duties(epoch) + for duty in duties.data: + self._head_schedule[duty.slot] = duty.validator_index + if (slot + self._spec.data.SLOTS_PER_EPOCH) not in self._head_schedule: + duties = beacon.get_proposer_duties(epoch + 1) + for duty in duties.data: + self._head_schedule[duty.slot] = duty.validator_index + + # Finalized slots. + if not last_processed_finalized: + last_processed_finalized = last_finalized + for slot in range(last_processed_finalized, last_finalized + 1): + if slot not in self._finalized_schedule: + duties = beacon.get_proposer_duties(self.epoch(slot)) + for duty in duties.data: + self._finalized_schedule[duty.slot] = duty.validator_index + + def clear(self, last_processed: int, last_processed_finalized) -> None: + self._head_schedule = {k: v for k, v in self._head_schedule.items() if k > last_processed} + self._finalized_schedule = {k: v for k, v in self._finalized_schedule.items() if k > last_processed_finalized} diff --git a/eth_validator_watcher/watched_validators.py b/eth_validator_watcher/watched_validators.py index 122768e..48c91ac 100644 --- a/eth_validator_watcher/watched_validators.py +++ b/eth_validator_watcher/watched_validators.py @@ -40,27 +40,18 @@ class WatchedValidator: This needs to be optimized for both CPU and memory usage as it will be instantiated for every validator of the network. - - Attributes: - index: Validator index - pubkey: Validator public key - status: Validator status for the current epoch - previous_status: Validator previous status for the previous epoch - labels: Validator labels - missed_attestation: Validator missed attestation for the current epoch - previous_missed_attestation: Validator missed previous attestation for the previous epoch - suboptimal_source: Validator suboptimal source for the current epoch - suboptimal_target: Validator suboptimal target for the current epoch - suboptimal_head: Validator suboptimal head for the current epoch - beacon_validator: Latest state of the validator from the beacon chain """ def __init__(self): self.index : int = 0 self.previous_status : Validators.DataItem.StatusEnum | None = None self._labels : Optional[list[str]] = None + + # Gauges (updated each epoch) ; implies to use direct values + # on the Prometheus side (no rate calculation). self.missed_attestation : bool | None = None self.previous_missed_attestation : bool | None = None + self.future_proposals : int | None = None self.suboptimal_source : bool | None = None self.suboptimal_target : bool | None = None self.suboptimal_head : bool | None = None @@ -68,6 +59,13 @@ def __init__(self): self.actual_consensus_reward : int | None = None self.beacon_validator : Validators.DataItem | None = None + # Counters (incremented continuously) ; implies to use rates() + # on the Prometheus side to have meaningful graphs. + self.missed_blocks_count : int = 0 + self.missed_blocks_finalized_count : int = 0 + self.proposed_blocks_count : int = 0 + self.proposed_blocks_finalized_count : int = 0 + @property def pubkey(self) -> str: """Get the public key of the validator. From e5f384122d3b119abc56da3f206bcab76e12fb87 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Wed, 17 Apr 2024 19:04:43 +0200 Subject: [PATCH 36/82] feat: export prometheus metrics about block proposals --- eth_validator_watcher/blocks.py | 8 ++-- eth_validator_watcher/entrypoint_v2.py | 25 ++++++++-- eth_validator_watcher/metrics.py | 53 ++++++++++++--------- eth_validator_watcher/watched_validators.py | 8 ++-- 4 files changed, 59 insertions(+), 35 deletions(-) diff --git a/eth_validator_watcher/blocks.py b/eth_validator_watcher/blocks.py index 64ef8c6..abd5619 100644 --- a/eth_validator_watcher/blocks.py +++ b/eth_validator_watcher/blocks.py @@ -19,9 +19,9 @@ def process_block(validators: WatchedValidators, schedule: ProposerSchedule, slo return if has_block: - validator.proposed_blocks_count += 1 + validator.proposed_blocks_total += 1 else: - validator.missed_blocks_count += 1 + validator.missed_blocks_total += 1 def process_finalized_block(validators: WatchedValidators, schedule: ProposerSchedule, slot_id: int, has_block: bool): @@ -34,6 +34,6 @@ def process_finalized_block(validators: WatchedValidators, schedule: ProposerSch return if has_block: - validator.proposed_blocks_finalized_count += 1 + validator.proposed_blocks_finalized_total += 1 else: - validator.missed_blocks_finalized_count += 1 + validator.missed_blocks_finalized_total += 1 diff --git a/eth_validator_watcher/entrypoint_v2.py b/eth_validator_watcher/entrypoint_v2.py index a999b5a..534dcfb 100644 --- a/eth_validator_watcher/entrypoint_v2.py +++ b/eth_validator_watcher/entrypoint_v2.py @@ -181,7 +181,7 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo """ self._metrics.eth_epoch.set(epoch) self._metrics.eth_slot.set(slot) - self._metrics.eth_current_price.set(get_current_eth_price()) + self._metrics.eth_current_price_dollars.set(get_current_eth_price()) # We iterate once on the validator set to optimize CPU as # there is a log of entries here, this makes code here a bit @@ -201,6 +201,11 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo missed_attestations: dict[str, int] = defaultdict(int) missed_consecutive_attestations: dict[str, int] = defaultdict(int) + proposed_blocks: dict[str, int] = defaultdict(int) + missed_blocks: dict[str, int] = defaultdict(int) + proposed_finalized_blocks: dict[str, int] = defaultdict(int) + missed_finalized_blocks: dict[str, int] = defaultdict(int) + labels = set() for validator in watched_validators.get_validators().values(): @@ -225,6 +230,11 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo missed_attestations[label] += int(validator.missed_attestation == True) missed_consecutive_attestations[label] += int(validator.previous_missed_attestation == True and validator.missed_attestation == True) + proposed_blocks[label] += validator.proposed_blocks_total + missed_blocks[label] += validator.missed_blocks_total + proposed_finalized_blocks[label] += validator.proposed_blocks_finalized_total + missed_finalized_blocks[label] += validator.missed_blocks_finalized_total + labels.add(label) for label, status_count in validator_status_count.items(): @@ -236,12 +246,17 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo self._metrics.eth_suboptimal_targets_rate.labels(label).set(pct(suboptimal_target_count[label], optimal_target_count[label])) self._metrics.eth_suboptimal_heads_rate.labels(label).set(pct(suboptimal_head_count[label], optimal_head_count[label])) - self._metrics.eth_ideal_consensus_rewards.labels(label).set(ideal_consensus_reward[label]) - self._metrics.eth_actual_consensus_rewards.labels(label).set(actual_consensus_reward[label]) + self._metrics.eth_ideal_consensus_rewards_gwei.labels(label).set(ideal_consensus_reward[label]) + self._metrics.eth_actual_consensus_rewards_gwei.labels(label).set(actual_consensus_reward[label]) self._metrics.eth_consensus_rewards_rate.labels(label).set(pct(actual_consensus_reward[label], ideal_consensus_reward[label], True)) - self._metrics.eth_missed_attestations.labels(label).set(missed_attestations[label]) - self._metrics.eth_missed_consecutive_attestations.labels(label).set(missed_consecutive_attestations[label]) + self._metrics.eth_missed_attestations_count.labels(label).set(missed_attestations[label]) + self._metrics.eth_missed_consecutive_attestations_count.labels(label).set(missed_consecutive_attestations[label]) + + self._metrics.eth_block_proposals_head_total.labels(label).set(proposed_blocks[label]) + self._metrics.eth_missed_block_proposals_head_total.labels(label).set(missed_blocks[label]) + self._metrics.eth_block_proposals_finalized_total.labels(label).set(proposed_finalized_blocks[label]) + self._metrics.eth_missed_block_proposals_finalized_total.labels(label).set(missed_finalized_blocks[label]) if not self._metrics_started: start_http_server(self._cfg.metrics_port) diff --git a/eth_validator_watcher/metrics.py b/eth_validator_watcher/metrics.py index ff18a90..1da7d3a 100644 --- a/eth_validator_watcher/metrics.py +++ b/eth_validator_watcher/metrics.py @@ -1,6 +1,6 @@ from dataclasses import dataclass -from prometheus_client import Counter, Gauge, Histogram +from prometheus_client import Gauge # This is global because Prometheus metrics don't support registration @@ -14,22 +14,27 @@ class PrometheusMetrics: """ eth_slot: Gauge eth_epoch: Gauge - eth_current_price: Gauge + eth_current_price_dollars: Gauge - # Reset on each epoch. eth_validator_status_count: Gauge eth_suboptimal_sources_rate: Gauge eth_suboptimal_targets_rate: Gauge eth_suboptimal_heads_rate: Gauge - eth_ideal_consensus_rewards: Gauge - eth_actual_consensus_rewards: Gauge eth_consensus_rewards_rate: Gauge + eth_ideal_consensus_rewards_gwei: Gauge + eth_actual_consensus_rewards_gwei: Gauge + eth_missed_attestations_count: Gauge + eth_missed_consecutive_attestations_count: Gauge - # Incremented on each slot. - eth_missed_attestations: Counter - eth_missed_consecutive_attestations: Counter - eth_missed_block_proposals_head: Counter - eth_missed_block_proposals_finalized: Counter + # We use Gauge here while we should use a counter semantically, + # but it is not possible to explictly set a counter value in + # Prometheus' API (to prevent decreasing it). We use the _total + # terminology to make it clear that it is a counter. + + eth_block_proposals_head_total: Gauge + eth_missed_block_proposals_head_total: Gauge + eth_block_proposals_finalized_total: Gauge + eth_missed_block_proposals_finalized_total: Gauge def get_prometheus_metrics() -> PrometheusMetrics: @@ -45,18 +50,22 @@ def get_prometheus_metrics() -> PrometheusMetrics: _metrics = PrometheusMetrics( eth_slot=Gauge("eth_slot", "Current slot"), eth_epoch=Gauge("eth_epoch", "Current epoch"), - eth_current_price=Gauge("eth_current_price", "Current price of ETH in USD"), - eth_validator_status_count=Gauge("eth_validator_status_count", "Validator status count", ['scope', 'status']), - eth_suboptimal_sources_rate=Gauge("eth_suboptimal_sources_rate", "Suboptimal sources rate", ['scope']), - eth_suboptimal_targets_rate=Gauge("eth_suboptimal_targets_rate", "Suboptimal targets rate", ['scope']), - eth_suboptimal_heads_rate=Gauge("eth_suboptimal_heads_rate", "Suboptimal heads rate", ['scope']), - eth_ideal_consensus_rewards=Gauge("eth_ideal_consensus_rewards", "Ideal consensus rewards", ['scope']), - eth_actual_consensus_rewards=Gauge("eth_actual_consensus_rewards", "Actual consensus rewards", ['scope']), - eth_consensus_rewards_rate=Gauge("eth_consensus_rewards_rate", "Consensus rewards rate", ['scope']), - eth_missed_attestations=Gauge("eth_missed_attestations", "Missed attestations in the last epoch", ['scope']), - eth_missed_consecutive_attestations=Gauge("eth_missed_consecutive_attestations", "Missed consecutive attestations", ['scope']), - eth_missed_block_proposals_head=Gauge("eth_missed_block_proposals_head", "Missed block proposals at head", ['scope']), - eth_missed_block_proposals_finalized=Gauge("eth_missed_block_proposals_finalized", "Missed finalized block proposals", ['scope']), + eth_current_price_dollars=Gauge("eth_current_price_dollars", "Current price of ETH in USD"), + + eth_validator_status_count=Gauge("eth_validator_status_count", "Validator status count sampled every epoch", ['scope', 'status']), + eth_suboptimal_sources_rate=Gauge("eth_suboptimal_sources_rate", "Suboptimal sources rate sampled every epoch", ['scope']), + eth_suboptimal_targets_rate=Gauge("eth_suboptimal_targets_rate", "Suboptimal targets rate sampled every epoch", ['scope']), + eth_suboptimal_heads_rate=Gauge("eth_suboptimal_heads_rate", "Suboptimal heads rate sampled every epoch", ['scope']), + eth_ideal_consensus_rewards_gwei=Gauge("eth_ideal_consensus_rewards_gwei", "Ideal consensus rewards sampled every epoch", ['scope']), + eth_actual_consensus_rewards_gwei=Gauge("eth_actual_consensus_rewards_gwei", "Actual consensus rewards sampled every epoch", ['scope']), + eth_consensus_rewards_rate=Gauge("eth_consensus_rewards_rate", "Consensus rewards rate sampled every epoch", ['scope']), + eth_missed_attestations_count=Gauge("eth_missed_attestations", "Missed attestations in the last epoch", ['scope']), + eth_missed_consecutive_attestations_count=Gauge("eth_missed_consecutive_attestations", "Missed consecutive attestations in the last two epochs", ['scope']), + + eth_block_proposals_head_total=Gauge("eth_block_proposals_head_total", "Total block proposals at head", ['scope']), + eth_missed_block_proposals_head_total=Gauge("eth_missed_block_proposals_head_total", "Total missed block proposals at head", ['scope']), + eth_block_proposals_finalized_total=Gauge("eth_block_proposals_finalized_total", "Total finalized block proposals", ['scope']), + eth_missed_block_proposals_finalized_total=Gauge("eth_missed_block_proposals_finalized_total", "Total missed finalized block proposals", ['scope']), ) return _metrics diff --git a/eth_validator_watcher/watched_validators.py b/eth_validator_watcher/watched_validators.py index 48c91ac..ec71534 100644 --- a/eth_validator_watcher/watched_validators.py +++ b/eth_validator_watcher/watched_validators.py @@ -61,10 +61,10 @@ def __init__(self): # Counters (incremented continuously) ; implies to use rates() # on the Prometheus side to have meaningful graphs. - self.missed_blocks_count : int = 0 - self.missed_blocks_finalized_count : int = 0 - self.proposed_blocks_count : int = 0 - self.proposed_blocks_finalized_count : int = 0 + self.missed_blocks_total : int = 0 + self.missed_blocks_finalized_total : int = 0 + self.proposed_blocks_total : int = 0 + self.proposed_blocks_finalized_total : int = 0 @property def pubkey(self) -> str: From f53a0c9dcc6ce92f75c06ec0086ce8a04f2d7cf1 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Wed, 17 Apr 2024 19:50:19 +0200 Subject: [PATCH 37/82] fix: skew a bit the clock to have the data we want --- eth_validator_watcher/beacon.py | 3 --- eth_validator_watcher/entrypoint_v2.py | 30 +++++++++++--------------- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/eth_validator_watcher/beacon.py b/eth_validator_watcher/beacon.py index 125ad4a..f9656db 100644 --- a/eth_validator_watcher/beacon.py +++ b/eth_validator_watcher/beacon.py @@ -144,14 +144,11 @@ def get_header(self, block_identifier: Union[BlockIdentierType, int]) -> Header: response = self.__get( f"{self.__url}/eth/v1/beacon/headers/{block_identifier}", timeout=self.__timeout_sec ) - response.raise_for_status() - except HTTPError as e: if e.response.status_code == codes.not_found: # If we are here, it means the block does not exist raise NoBlockError from e - # If we are here, it's an other error raise diff --git a/eth_validator_watcher/entrypoint_v2.py b/eth_validator_watcher/entrypoint_v2.py index 534dcfb..511d4a0 100644 --- a/eth_validator_watcher/entrypoint_v2.py +++ b/eth_validator_watcher/entrypoint_v2.py @@ -41,26 +41,27 @@ def pct(a: int, b: int, inclusive: bool=False) -> float: class BeaconClock: """Helper class to keep track of the beacon clock. + + This clock is slightly skewed to ensure we have the data for the + slot we are processing: it is possible beacons do not have data + exactly on slot time, so we wait for ~4 seconds into the next + slot. """ def __init__(self, genesis: int, slot_duration: int, slots_per_epoch: int) -> None: self._genesis = genesis self._slot_duration = slot_duration self._slots_per_epoch = slots_per_epoch + self._lag_seconds = 4.0 - def get_current_epoch(self, now: float) -> int: + def get_current_epoch(self) -> int: """Get the current epoch. - Args: - ----- - now: float - Current time in seconds since the epoch. - Returns: -------- int: Current epoch. """ - return self.get_current_slot(now) // self._slots_per_epoch + return self.get_current_slot() // self._slots_per_epoch def epoch_to_slot(self, epoch: int) -> int: """Convert an epoch to a slot. @@ -76,19 +77,14 @@ def epoch_to_slot(self, epoch: int) -> int: """ return epoch * self._slots_per_epoch - def get_current_slot(self, now: float) -> int: + def get_current_slot(self) -> int: """Get the current slot. - Args: - ----- - now: float - Current time in seconds since the epoch. - Returns: -------- int: Current slot. """ - return int((now - self._genesis) // self._slot_duration) + return int((time.time() - self._lag_seconds - self._genesis) // self._slot_duration) def maybe_wait_for_slot(self, slot: int, now: float) -> None: """Wait until the given slot is reached. @@ -100,7 +96,7 @@ def maybe_wait_for_slot(self, slot: int, now: float) -> None: now: float Current time in seconds since the epoch. """ - target = self._genesis + slot * self._slot_duration + target = self._genesis + slot * self._slot_duration + self._lag_seconds if now < target: logging.info(f'Waiting {target - now:.2f} seconds for slot {slot}') time.sleep(target - now) @@ -266,8 +262,8 @@ def run(self) -> None: """Run the Ethereum Validator Watcher. """ watched_validators = WatchedValidators() - epoch = self._clock.get_current_epoch(time.time()) - slot = self._clock.get_current_slot(time.time()) + epoch = self._clock.get_current_epoch() + slot = self._clock.get_current_slot() beacon_validators = None validators_liveness = None From c04e49170a8085abb7f87bdf1ba72d1ac53cd1d3 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Thu, 18 Apr 2024 00:38:51 +0200 Subject: [PATCH 38/82] feat: add handling of future block proposals --- eth_validator_watcher/blocks.py | 11 +++++++++ eth_validator_watcher/entrypoint_v2.py | 27 +++++++++++++++++---- eth_validator_watcher/metrics.py | 25 +++++++++---------- eth_validator_watcher/proposer_schedule.py | 3 +++ eth_validator_watcher/watched_validators.py | 1 + 5 files changed, 48 insertions(+), 19 deletions(-) diff --git a/eth_validator_watcher/blocks.py b/eth_validator_watcher/blocks.py index abd5619..caa6805 100644 --- a/eth_validator_watcher/blocks.py +++ b/eth_validator_watcher/blocks.py @@ -37,3 +37,14 @@ def process_finalized_block(validators: WatchedValidators, schedule: ProposerSch validator.proposed_blocks_finalized_total += 1 else: validator.missed_blocks_finalized_total += 1 + + +def process_future_blocks(validators: WatchedValidators, schedule: ProposerSchedule, slot_id: int): + future_proposals = schedule.get_future_proposals(slot_id) + + for slot_id, validator_index in future_proposals.items(): + validator = validators.get_validator_by_index(validator_index) + if validator is None: + continue + + validator.future_blocks_proposal += 1 diff --git a/eth_validator_watcher/entrypoint_v2.py b/eth_validator_watcher/entrypoint_v2.py index 511d4a0..ad96236 100644 --- a/eth_validator_watcher/entrypoint_v2.py +++ b/eth_validator_watcher/entrypoint_v2.py @@ -16,7 +16,7 @@ from .beacon import Beacon, NoBlockError from .config import load_config, WatchedKeyConfig from .metrics import get_prometheus_metrics -from .blocks import process_block, process_finalized_block +from .blocks import process_block, process_finalized_block, process_future_blocks from .models import BlockIdentierType, Validators from .rewards import process_rewards from .utils import ( @@ -201,6 +201,7 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo missed_blocks: dict[str, int] = defaultdict(int) proposed_finalized_blocks: dict[str, int] = defaultdict(int) missed_finalized_blocks: dict[str, int] = defaultdict(int) + future_blocks: dict[str, int] = defaultdict(int) labels = set() @@ -230,9 +231,20 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo missed_blocks[label] += validator.missed_blocks_total proposed_finalized_blocks[label] += validator.proposed_blocks_finalized_total missed_finalized_blocks[label] += validator.missed_blocks_finalized_total + future_blocks[label] += validator.future_blocks_proposal labels.add(label) + # Here we reset the counters for the next run, we do not + # touch gauges though. This ensures we handle properly + # changes of the labelling in real-time. + + validator.proposed_blocks_total = 0 + validator.missed_blocks_total = 0 + validator.proposed_blocks_finalized_total = 0 + validator.missed_blocks_finalized_total = 0 + validator.future_blocks_proposal = 0 + for label, status_count in validator_status_count.items(): for status, count in status_count.items(): self._metrics.eth_validator_status_count.labels(label, status).set(count) @@ -249,10 +261,14 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo self._metrics.eth_missed_attestations_count.labels(label).set(missed_attestations[label]) self._metrics.eth_missed_consecutive_attestations_count.labels(label).set(missed_consecutive_attestations[label]) - self._metrics.eth_block_proposals_head_total.labels(label).set(proposed_blocks[label]) - self._metrics.eth_missed_block_proposals_head_total.labels(label).set(missed_blocks[label]) - self._metrics.eth_block_proposals_finalized_total.labels(label).set(proposed_finalized_blocks[label]) - self._metrics.eth_missed_block_proposals_finalized_total.labels(label).set(missed_finalized_blocks[label]) + # Here we inc, it's fine since we previously reset the + # counters on each run. + + self._metrics.eth_block_proposals_head_total.labels(label).inc(proposed_blocks[label]) + self._metrics.eth_missed_block_proposals_head_total.labels(label).inc(missed_blocks[label]) + self._metrics.eth_block_proposals_finalized_total.labels(label).inc(proposed_finalized_blocks[label]) + self._metrics.eth_missed_block_proposals_finalized_total.labels(label).inc(missed_finalized_blocks[label]) + self._metrics.eth_future_block_proposals.labels(label).set(future_blocks[label]) if not self._metrics_started: start_http_server(self._cfg.metrics_port) @@ -294,6 +310,7 @@ def run(self) -> None: has_block = has_block_at_slot(self._beacon, slot) process_block(watched_validators, self._schedule, slot, has_block) + process_future_blocks(watched_validators, self._schedule, slot) last_finalized_slot = self._beacon.get_header(BlockIdentierType.FINALIZED).data.header.message.slot while last_processed_finalized_slot and last_processed_finalized_slot < last_finalized_slot: diff --git a/eth_validator_watcher/metrics.py b/eth_validator_watcher/metrics.py index 1da7d3a..ba75f89 100644 --- a/eth_validator_watcher/metrics.py +++ b/eth_validator_watcher/metrics.py @@ -1,6 +1,6 @@ from dataclasses import dataclass -from prometheus_client import Gauge +from prometheus_client import Counter, Gauge # This is global because Prometheus metrics don't support registration @@ -25,16 +25,12 @@ class PrometheusMetrics: eth_actual_consensus_rewards_gwei: Gauge eth_missed_attestations_count: Gauge eth_missed_consecutive_attestations_count: Gauge - - # We use Gauge here while we should use a counter semantically, - # but it is not possible to explictly set a counter value in - # Prometheus' API (to prevent decreasing it). We use the _total - # terminology to make it clear that it is a counter. - eth_block_proposals_head_total: Gauge - eth_missed_block_proposals_head_total: Gauge - eth_block_proposals_finalized_total: Gauge - eth_missed_block_proposals_finalized_total: Gauge + eth_block_proposals_head_total: Counter + eth_missed_block_proposals_head_total: Counter + eth_block_proposals_finalized_total: Counter + eth_missed_block_proposals_finalized_total: Counter + eth_future_block_proposals: Gauge def get_prometheus_metrics() -> PrometheusMetrics: @@ -62,10 +58,11 @@ def get_prometheus_metrics() -> PrometheusMetrics: eth_missed_attestations_count=Gauge("eth_missed_attestations", "Missed attestations in the last epoch", ['scope']), eth_missed_consecutive_attestations_count=Gauge("eth_missed_consecutive_attestations", "Missed consecutive attestations in the last two epochs", ['scope']), - eth_block_proposals_head_total=Gauge("eth_block_proposals_head_total", "Total block proposals at head", ['scope']), - eth_missed_block_proposals_head_total=Gauge("eth_missed_block_proposals_head_total", "Total missed block proposals at head", ['scope']), - eth_block_proposals_finalized_total=Gauge("eth_block_proposals_finalized_total", "Total finalized block proposals", ['scope']), - eth_missed_block_proposals_finalized_total=Gauge("eth_missed_block_proposals_finalized_total", "Total missed finalized block proposals", ['scope']), + eth_block_proposals_head_total=Counter("eth_block_proposals_head_total", "Total block proposals at head", ['scope']), + eth_missed_block_proposals_head_total=Counter("eth_missed_block_proposals_head_total", "Total missed block proposals at head", ['scope']), + eth_block_proposals_finalized_total=Counter("eth_block_proposals_finalized_total", "Total finalized block proposals", ['scope']), + eth_missed_block_proposals_finalized_total=Counter("eth_missed_block_proposals_finalized_total", "Total missed finalized block proposals", ['scope']), + eth_future_block_proposals=Gauge("eth_future_block_proposals", "Future block proposals", ['scope']) ) return _metrics diff --git a/eth_validator_watcher/proposer_schedule.py b/eth_validator_watcher/proposer_schedule.py index 8d3ad7f..35621d8 100644 --- a/eth_validator_watcher/proposer_schedule.py +++ b/eth_validator_watcher/proposer_schedule.py @@ -26,6 +26,9 @@ def get_head_proposer(self, slot: int) -> int: def get_finalized_proposer(self, slot: int) -> int: return self._finalized_schedule.get(slot, None) + def get_future_proposals(self, slot: int) -> dict[int, int]: + return {k: v for k, v in self._head_schedule.items() if k > slot} + def epoch(self, slot: int) -> int: return slot // self._spec.data.SLOTS_PER_EPOCH diff --git a/eth_validator_watcher/watched_validators.py b/eth_validator_watcher/watched_validators.py index ec71534..141ce86 100644 --- a/eth_validator_watcher/watched_validators.py +++ b/eth_validator_watcher/watched_validators.py @@ -65,6 +65,7 @@ def __init__(self): self.missed_blocks_finalized_total : int = 0 self.proposed_blocks_total : int = 0 self.proposed_blocks_finalized_total : int = 0 + self.future_blocks_proposal : int = 0 @property def pubkey(self) -> str: From df141b7254eba3abece609aeaba741d06b38cc89 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Mon, 13 May 2024 12:54:50 +0200 Subject: [PATCH 39/82] feat: do not account non-active validators for missed attestations/blocks --- etc/.gitignore | 1 + eth_validator_watcher/config.py | 2 +- eth_validator_watcher/entry_queue.py | 145 ---- eth_validator_watcher/entrypoint.py | 691 ++++++++---------- eth_validator_watcher/entrypoint_v2.py | 355 --------- eth_validator_watcher/execution.py | 42 -- eth_validator_watcher/exited_validators.py | 72 -- eth_validator_watcher/fee_recipient.py | 96 --- eth_validator_watcher/next_blocks_proposal.py | 55 -- eth_validator_watcher/relays.py | 97 --- eth_validator_watcher/utils.py | 30 - eth_validator_watcher/watched_validators.py | 9 + eth_validator_watcher/web3signer.py | 23 - pyproject.toml | 2 +- 14 files changed, 336 insertions(+), 1284 deletions(-) delete mode 100644 eth_validator_watcher/entry_queue.py delete mode 100644 eth_validator_watcher/entrypoint_v2.py delete mode 100644 eth_validator_watcher/execution.py delete mode 100644 eth_validator_watcher/exited_validators.py delete mode 100644 eth_validator_watcher/fee_recipient.py delete mode 100644 eth_validator_watcher/next_blocks_proposal.py delete mode 100644 eth_validator_watcher/relays.py delete mode 100644 eth_validator_watcher/web3signer.py diff --git a/etc/.gitignore b/etc/.gitignore index 1a609a5..2813d28 100644 --- a/etc/.gitignore +++ b/etc/.gitignore @@ -1,2 +1,3 @@ config.dev.yaml config.py +mainnet.yaml \ No newline at end of file diff --git a/eth_validator_watcher/config.py b/eth_validator_watcher/config.py index 6c50269..76254e2 100644 --- a/eth_validator_watcher/config.py +++ b/eth_validator_watcher/config.py @@ -47,7 +47,7 @@ def load_config(config_file: str) -> Config: The effective configuration used by the watcher """ with open(config_file, 'r') as fh: - config = yaml.safe_load(fh) or dict() + config = yaml.load(fh, Loader=yaml.CLoader) or dict() from_env = Config().model_dump() from_yaml = Config(**config).model_dump() diff --git a/eth_validator_watcher/entry_queue.py b/eth_validator_watcher/entry_queue.py deleted file mode 100644 index f210d55..0000000 --- a/eth_validator_watcher/entry_queue.py +++ /dev/null @@ -1,145 +0,0 @@ -"""Contains the logic to compute the duration of the entry queue.""" - -from prometheus_client import Gauge - -MIN_PER_EPOCH_CHURN_LIMIT = 4 -MAX_PER_EPOCH_CHURN_LIMIT = 8 -CHURN_LIMIT_QUOTIENT = 65536 -NB_SECONDS_PER_SLOT = 12 -NB_SLOT_PER_EPOCH = 32 -NB_SECONDS_PER_EPOCH = NB_SECONDS_PER_SLOT * NB_SLOT_PER_EPOCH - -# TODO: Compute this dynamically -BUCKETS: list[tuple[int, int]] = [ - (0, 4), - (327_680, 5), - (393_216, 6), - (458_752, 7), - (524_288, 8), - (589_824, 9), - (655_360, 10), - (720_896, 11), - (786_432, 12), - (851_968, 13), - (917_504, 14), - (983_040, 15), - (1_048_576, 16), - (1_114_112, 17), - (1_179_648, 18), - (1_245_184, 19), - (1_310_720, 20), - (1_376_256, 21), - (1_441_792, 22), - (1_507_328, 23), - (1_572_864, 24), - (1_638_400, 25), - (1_703_936, 26), - (1_769_472, 27), - (1_835_008, 28), - (1_900_544, 29), - (1_966_080, 30), - (2_031_616, 31), - (2_097_152, 32), - (2_162_688, 33), - (2_228_224, 34), - (2_293_760, 35), - (2_359_296, 36), - (2_424_832, 37), - (2_490_368, 38), - (2_555_904, 39), - (2_621_440, 40), -] - -metric_entry_queue_duration_sec = Gauge( - "entry_queue_duration_sec", - "Entry queue duration in seconds", -) - - -def compute_validators_churn(nb_active_validators: int) -> int: - """Compute the number of validators that can exit the entry queue per epoch. - - Parameters: - nb_active_validators: The number of currently active validators - """ - return min(MAX_PER_EPOCH_CHURN_LIMIT, max(MIN_PER_EPOCH_CHURN_LIMIT, nb_active_validators // CHURN_LIMIT_QUOTIENT)) - - -def get_bucket_index(validator_index: int) -> int: - """Get the bucket index of a validator. - - Parameters: - validator_index: The index of the validator - """ - for index, (bucket_start, _) in enumerate(BUCKETS): - if validator_index < bucket_start: - return index - 1 - - raise RuntimeError("Validator index is too high") - - -def compute_duration_sec( - nb_active_validators: int, position_in_entry_queue: int -) -> int: - """Compute the remaining time before a validator is active if no validator wants to - exit. - - Parameters: - nb_active_validators : The number of currently active validators - position_in_entry_queue: The position of the validator in the entry queue - """ - start_bucket_index = get_bucket_index(nb_active_validators) - stop_bucket_index = get_bucket_index(nb_active_validators + position_in_entry_queue) - - if start_bucket_index == stop_bucket_index: - return ( - position_in_entry_queue // compute_validators_churn(nb_active_validators) - ) * NB_SECONDS_PER_EPOCH - # Compute the number of validators in the first bucket - start_limit, _ = BUCKETS[start_bucket_index + 1] - number_validators_in_start_bucket = start_limit - nb_active_validators - - # Compute the number of validators in the stop bucket - stop_limit, _ = BUCKETS[stop_bucket_index] - - number_validators_in_stop_bucket = ( - nb_active_validators + position_in_entry_queue + 1 - stop_limit - ) - - def fill_bucket(index: int) -> int: - if index < start_bucket_index or index > stop_bucket_index: - return 0 - if index == start_bucket_index: - return number_validators_in_start_bucket - elif index == stop_bucket_index: - return number_validators_in_stop_bucket - else: - begin, _ = BUCKETS[index] - end, _ = BUCKETS[index + 1] - return end - begin - - numbers_of_validators = [fill_bucket(index) for index in range(len(BUCKETS))] - - nb_of_needed_epochs = sum( - (number_of_validators // churn) - for (_, churn), number_of_validators in zip(BUCKETS, numbers_of_validators) - ) - - return nb_of_needed_epochs * NB_SECONDS_PER_EPOCH - - -def export_duration_sec( - nb_active_validators: int, position_in_entry_queue: int -) -> None: - """Export the duration of the entry queue. - - This function does the average of the pessimistic and optimistic duration - estimations. - - Parameters: - nb_active_validators : The number of currently active validators - position_in_entry_queue: The position of the validator in the entry queue - """ - - duration_sec = compute_duration_sec(nb_active_validators, position_in_entry_queue) - metric_entry_queue_duration_sec.set(duration_sec) diff --git a/eth_validator_watcher/entrypoint.py b/eth_validator_watcher/entrypoint.py index ac1598f..b37c33d 100644 --- a/eth_validator_watcher/entrypoint.py +++ b/eth_validator_watcher/entrypoint.py @@ -1,407 +1,364 @@ -"""Entrypoint for the eth-validator-watcher CLI.""" +"""Draft entrypoint for the eth-validator-watcher v1.0.0. +""" -import functools -from os import environ +from collections import defaultdict +from functools import partial from pathlib import Path -from time import sleep, time -from typing import List, Optional +from prometheus_client import start_http_server +from pydantic import ValidationError +from typing import Optional +import logging import typer -from prometheus_client import Gauge, start_http_server -from typer import Option -from pydantic import ValidationError +import time -from .beacon import Beacon +from .coinbase import get_current_eth_price +from .beacon import Beacon, NoBlockError from .config import load_config, WatchedKeyConfig -from .coinbase import Coinbase -from .entry_queue import export_duration_sec as export_entry_queue_dur_sec -from .execution import Execution -from .exited_validators import ExitedValidators -from .fee_recipient import process_fee_recipient -from .missed_attestations import ( - process_double_missed_attestations, - process_missed_attestations, -) -from .missed_blocks import process_missed_blocks_finalized, process_missed_blocks_head -from .models import BeaconType, Validators -from .next_blocks_proposal import process_future_blocks_proposal -from .relays import Relays +from .metrics import get_prometheus_metrics +from .blocks import process_block, process_finalized_block, process_future_blocks +from .models import BlockIdentierType, Validators from .rewards import process_rewards -from .slashed_validators import SlashedValidators -from .suboptimal_attestations import process_suboptimal_attestations from .utils import ( - CHUCK_NORRIS, - MISSED_BLOCK_TIMEOUT_SEC, - NB_SECOND_PER_SLOT, - NB_SLOT_PER_EPOCH, SLOT_FOR_MISSED_ATTESTATIONS_PROCESS, SLOT_FOR_REWARDS_PROCESS, - LABEL_SCOPE_NETWORK, - LABEL_SCOPE_WATCHED, - LimitedDict, - Slack, - convert_seconds_to_dhms, - eth1_address_lower_0x_prefixed, - get_our_pubkeys, - slots, - write_liveness_file, ) -from .web3signer import Web3Signer +from .proposer_schedule import ProposerSchedule +from .watched_validators import WatchedValidators -print = functools.partial(print, flush=True) - -Status = Validators.DataItem.StatusEnum app = typer.Typer(add_completion=False) -metric_slot_gauge = Gauge("slot", "Slot") -metric_epoch_gauge = Gauge("epoch", "Epoch") -metric_pending_q_vals_gauge = Gauge( - "pending_queued_validators_count", - "Pending queued validators count", - ["scope"], -) +def pct(a: int, b: int, inclusive: bool=False) -> float: + """Helper function to calculate the percentage of a over b. + """ + total = a + b if not inclusive else b + if total == 0: + return 0.0 + return float(a / total) * 100.0 -metric_active_validators_gauge = Gauge( - "active_validators_count", - "Active validators count", - ["scope"], -) +class BeaconClock: + """Helper class to keep track of the beacon clock. -@app.command() -def handler( - config: Optional[Path] = Option( - 'etc/config.local.yaml', - help="File containing the Ethereum Validator Watcher configuration file.", - exists=True, - file_okay=True, - dir_okay=False, - show_default=True, - ), -) -> None: + This clock is slightly skewed to ensure we have the data for the + slot we are processing: it is possible beacons do not have data + exactly on slot time, so we wait for ~4 seconds into the next + slot. """ - 🚨 Ethereum Validator Watcher 🚨 - - \b - Ethereum Validator Watcher monitors the Ethereum beacon chain in real-time and notifies you when any of your validators: - - are going to propose a block in the next two epochs - - missed a block proposal at head - - missed a block proposal at finalized - - did not optimally attest - - missed an attestation - - missed two attestations in a row - - proposed a block with the wrong fee recipient - - has exited - - got slashed - - proposed a block with an unknown relay - - did not had optimal source, target or head reward - - \b - It also exports some general metrics such as: - - your USD assets under management - - the total staking market cap - - epoch and slot - - the number or total slashed validators - - ETH/USD conversion rate - - the number of your queued validators - - the number of your active validators - - the number of your exited validators - - the number of the network queued validators - - the number of the network active validators - - the entry queue duration estimation - - \b - Optionally, you can specify the following parameters: - - the path to a file containing the list of public your keys to watch, or / and - - a URL to a Web3Signer instance managing your keys to watch. - - \b - Pubkeys are dynamically loaded, at each epoch start. - - If you use pubkeys file, you can change it without having to restart the watcher. - - If you use Web3Signer, a request to Web3Signer is done at every epoch to get the - latest set of keys to watch. - - \b - Finally, this program exports the following sets of data from: - - Prometheus (you can use a Grafana dashboard to monitor your validators) - - Slack - - logs - - Prometheus server is automatically exposed on port 8000. + + def __init__(self, genesis: int, slot_duration: int, slots_per_epoch: int) -> None: + self._genesis = genesis + self._slot_duration = slot_duration + self._slots_per_epoch = slots_per_epoch + self._lag_seconds = 4.0 + + def get_current_epoch(self) -> int: + """Get the current epoch. + + Returns: + -------- + int: Current epoch. + """ + return self.get_current_slot() // self._slots_per_epoch + + def epoch_to_slot(self, epoch: int) -> int: + """Convert an epoch to a slot. + + Args: + ----- + epoch: int + Epoch to convert. + + Returns: + -------- + int: Slot corresponding to the epoch. + """ + return epoch * self._slots_per_epoch + + def get_current_slot(self) -> int: + """Get the current slot. + + Returns: + -------- + int: Current slot. + """ + return int((time.time() - self._lag_seconds - self._genesis) // self._slot_duration) + + def maybe_wait_for_slot(self, slot: int, now: float) -> None: + """Wait until the given slot is reached. + + Args: + ----- + slot: int + Slot to wait for. + now: float + Current time in seconds since the epoch. + """ + target = self._genesis + slot * self._slot_duration + self._lag_seconds + if now < target: + logging.info(f'Waiting {target - now:.2f} seconds for slot {slot}') + time.sleep(target - now) + + +def has_block_at_slot(beacon: Beacon, block_identifier: BlockIdentierType | int) -> bool: + """Returns the slot of a block identifier if it exists. + + Args: + ----- + beacon: Beacon + Beacon instance. + block_identifier: BlockIdentierType | int + Block identifier (i.e: head, finalized, 42, etc). + + Returns: + -------- + bool: True if the block exists, False otherwise. """ try: - cfg = load_config(config) - except ValidationError as err: - raise typer.BadParameter(f'Invalid configuration file: {err}') - - try: # pragma: no cover - _handler( - cfg.beacon_url, - cfg.beacon_timeout_sec, - cfg.execution_url, - cfg.watched_keys, - cfg.web3signer_url, - cfg.default_fee_recipient, - cfg.slack_channel, - cfg.slack_token, - cfg.beacon_type, - cfg.relays, - cfg.liveness_file, - ) - except KeyboardInterrupt: # pragma: no cover - print("👋 Bye!") - - -def _handler( - beacon_url: str, - beacon_timeout_sec: int, - execution_url: str | None, - watched_keys: List[WatchedKeyConfig] | None, - web3signer_url: str | None, - default_fee_recipient: str | None, - slack_channel: str | None, - slack_token: str | None, - beacon_type: BeaconType | None, - relays_url: List[str], - liveness_file: Path | None, -) -> None: - """Just a wrapper to be able to test the handler function""" + return beacon.get_header(block_identifier).data.header.message.slot > 0 + except NoBlockError: + return False - if default_fee_recipient is not None and execution_url is None: - raise typer.BadParameter( - "`execution_url` must be set if you want to use `default_fee_recipient`" - ) - if default_fee_recipient is not None: - try: - default_fee_recipient = eth1_address_lower_0x_prefixed(default_fee_recipient) - except ValueError: - raise typer.BadParameter("`default_fee_recipient` should be a valid ETH1 address") +class ValidatorWatcher: + """Ethereum Validator Watcher. + """ - if slack_channel is not None and slack_token is None: - raise typer.BadParameter( - "slack_token var must be set if you want to use `slack_channel`" + def __init__(self, cfg_path: Path) -> None: + """Initialize the Ethereum Validator Watcher. + + Args: + ----- + cfg_path: Path + Path to the configuration file. + """ + self._metrics = get_prometheus_metrics() + self._metrics_started = False + self._cfg_path = cfg_path + self._cfg = None + self._beacon = None + self._slot_duration = None + self._genesis = None + + self._reload_config() + + self._spec = self._beacon.get_spec() + genesis = self._beacon.get_genesis().data.genesis_time + + self._clock = BeaconClock( + genesis, + self._spec.data.SECONDS_PER_SLOT, + self._spec.data.SLOTS_PER_EPOCH, ) - slack = ( - Slack(slack_channel, slack_token) - if slack_channel is not None and slack_token is not None - else None - ) - - beacon = Beacon(beacon_url, beacon_timeout_sec) - execution = Execution(execution_url) if execution_url is not None else None - coinbase = Coinbase() - web3signer = Web3Signer(web3signer_url) if web3signer_url is not None else None - relays = Relays(relays_url) - - our_pubkeys: set[str] = set() - our_active_idx2val: dict[int, Validators.DataItem.Validator] = {} - our_validators_indexes_that_missed_attestation: set[int] = set() - our_validators_indexes_that_missed_previous_attestation: set[int] = set() - our_epoch2active_idx2val = LimitedDict(3) - net_epoch2active_idx2val = LimitedDict(3) - - exited_validators = ExitedValidators(slack) - slashed_validators = SlashedValidators(slack) - - last_missed_attestations_process_epoch: int | None = None - last_rewards_process_epoch: int | None = None - - previous_epoch: int | None = None - last_processed_finalized_slot: int | None = None - - genesis = beacon.get_genesis() - - for idx, (slot, slot_start_time_sec) in enumerate(slots(genesis.data.genesis_time)): - if slot < 0: - chain_start_in_sec = -slot * NB_SECOND_PER_SLOT - days, hours, minutes, seconds = convert_seconds_to_dhms(chain_start_in_sec) - - print( - f"⏱️ The chain will start in {days:2} days, {hours:2} hours, " - f"{minutes:2} minutes and {seconds:2} seconds." - ) - - if slot % NB_SLOT_PER_EPOCH == 0: - print(f"💪 {CHUCK_NORRIS[slot%len(CHUCK_NORRIS)]}") - - if liveness_file is not None: - write_liveness_file(liveness_file) - - continue - - epoch = slot // NB_SLOT_PER_EPOCH - slot_in_epoch = slot % NB_SLOT_PER_EPOCH + self._schedule = ProposerSchedule(self._spec) - metric_slot_gauge.set(slot) - metric_epoch_gauge.set(epoch) - - is_new_epoch = previous_epoch is None or previous_epoch != epoch - - if last_processed_finalized_slot is None: - last_processed_finalized_slot = slot - - if is_new_epoch: - our_pubkeys = get_our_pubkeys(watched_keys, web3signer) - - # Network validators - # ------------------ - net_status2idx2val = beacon.get_status_to_index_to_validator() - - net_pending_q_idx2val = net_status2idx2val.get(Status.pendingQueued, {}) - nb_total_pending_q_vals = len(net_pending_q_idx2val) - metric_pending_q_vals_gauge.labels(scope=LABEL_SCOPE_NETWORK).set(nb_total_pending_q_vals) - - active_ongoing = net_status2idx2val.get(Status.activeOngoing, {}) - active_exiting = net_status2idx2val.get(Status.activeExiting, {}) - active_slashed = net_status2idx2val.get(Status.activeSlashed, {}) - net_active_idx2val = active_ongoing | active_exiting | active_slashed - net_epoch2active_idx2val[epoch] = net_active_idx2val - - net_active_vals_count = len(net_active_idx2val) - metric_active_validators_gauge.labels(scope=LABEL_SCOPE_NETWORK).set(net_active_vals_count) - - net_exited_s_idx2val = net_status2idx2val.get(Status.exitedSlashed, {}) - - with_poss = net_status2idx2val.get(Status.withdrawalPossible, {}) - with_done = net_status2idx2val.get(Status.withdrawalDone, {}) - net_withdrawable_idx2val = with_poss | with_done - - # Our validators - # -------------- - our_status2idx2val = { - status: { - index: validator - for index, validator in validator.items() - if validator.pubkey in our_pubkeys - } - for status, validator in net_status2idx2val.items() - } - - our_queued_idx2val = our_status2idx2val.get(Status.pendingQueued, {}) - metric_pending_q_vals_gauge.labels(scope=LABEL_SCOPE_WATCHED).set(len(our_queued_idx2val)) - - ongoing = our_status2idx2val.get(Status.activeOngoing, {}) - active_exiting = our_status2idx2val.get(Status.activeExiting, {}) - active_slashed = our_status2idx2val.get(Status.activeSlashed, {}) - our_active_idx2val = ongoing | active_exiting | active_slashed - our_epoch2active_idx2val[epoch] = our_active_idx2val - - metric_active_validators_gauge.labels(scope=LABEL_SCOPE_WATCHED).set(len(our_active_idx2val)) - our_exited_u_idx2val = our_status2idx2val.get(Status.exitedUnslashed, {}) - our_exited_s_idx2val = our_status2idx2val.get(Status.exitedSlashed, {}) - - with_poss = our_status2idx2val.get(Status.withdrawalPossible, {}) - with_done = our_status2idx2val.get(Status.withdrawalDone, {}) - our_withdrawable_idx2val = with_poss | with_done - - exited_validators.process(our_exited_u_idx2val, our_withdrawable_idx2val) - - slashed_validators.process( - net_exited_s_idx2val, - our_exited_s_idx2val, - net_withdrawable_idx2val, - our_withdrawable_idx2val, - ) - - export_entry_queue_dur_sec(net_active_vals_count, nb_total_pending_q_vals) - coinbase.emit_eth_usd_conversion_rate() - - if previous_epoch is not None and previous_epoch != epoch: - print(f"🎂 Epoch {epoch} starts") + def _reload_config(self) -> None: + """Reload the configuration file. + """ + try: + self._cfg = load_config(self._cfg_path) + except ValidationError as err: + raise typer.BadParameter(f'Invalid configuration file: {err}') + + if self._beacon is None or self._beacon.get_url() != self._cfg.beacon_url or self._beacon.get_timeout_sec() != self._cfg.beacon_timeout_sec: + self._beacon = Beacon(self._cfg.beacon_url, self._cfg.beacon_timeout_sec) + + def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slot: int) -> None: + """Update the Prometheus metrics with the watched validators. + + Args: + ----- + watched_validators: Watched validators. + epoch: Current epoch. + slot: Current slot. + """ + self._metrics.eth_epoch.set(epoch) + self._metrics.eth_slot.set(slot) + self._metrics.eth_current_price_dollars.set(get_current_eth_price()) + + # We iterate once on the validator set to optimize CPU as + # there is a log of entries here, this makes code here a bit + # more complex and entangled. + + validator_status_count: dict[str, dict[StatusEnum, int]] = defaultdict(partial(defaultdict, int)) + + suboptimal_source_count: dict[str, int] = defaultdict(int) + suboptimal_target_count: dict[str, int] = defaultdict(int) + suboptimal_head_count: dict[str, int] = defaultdict(int) + optimal_source_count: dict[str, int] = defaultdict(int) + optimal_target_count: dict[str, int] = defaultdict(int) + optimal_head_count: dict[str, int] = defaultdict(int) + + ideal_consensus_reward: dict[str, int] = defaultdict(int) + actual_consensus_reward: dict[str, int] = defaultdict(int) + missed_attestations: dict[str, int] = defaultdict(int) + missed_consecutive_attestations: dict[str, int] = defaultdict(int) + + proposed_blocks: dict[str, int] = defaultdict(int) + missed_blocks: dict[str, int] = defaultdict(int) + proposed_finalized_blocks: dict[str, int] = defaultdict(int) + missed_finalized_blocks: dict[str, int] = defaultdict(int) + future_blocks: dict[str, int] = defaultdict(int) + + labels = set() + + for validator in watched_validators.get_validators().values(): + # Everything here implies to have a validator that is + # active on the beacon chain, this prevents miscounting + # missed attestation for instance. + if not validator.is_validating(): + continue + + for label in validator.labels: + + validator_status_count[label][str(validator.status)] += 1 + + # Looks weird but we want to explicitly have labels set + # for each set of labels even if they aren't validating + # (in which case the validator attributes are None). + + suboptimal_source_count[label] += int(validator.suboptimal_source == True) + suboptimal_target_count[label] += int(validator.suboptimal_target == True) + suboptimal_head_count[label] += int(validator.suboptimal_head == True) + optimal_source_count[label] += int(validator.suboptimal_source == False) + optimal_target_count[label] += int(validator.suboptimal_target == False) + optimal_head_count[label] += int(validator.suboptimal_head == False) + + ideal_consensus_reward[label] += validator.ideal_consensus_reward or 0 + actual_consensus_reward[label] += validator.actual_consensus_reward or 0 + + missed_attestations[label] += int(validator.missed_attestation == True) + missed_consecutive_attestations[label] += int(validator.previous_missed_attestation == True and validator.missed_attestation == True) + + if int(validator.missed_attestation == True): + logging.info(f'Validator {validator.pubkey[:10]} missed attestation at slot {slot}') + + proposed_blocks[label] += validator.proposed_blocks_total + missed_blocks[label] += validator.missed_blocks_total + proposed_finalized_blocks[label] += validator.proposed_blocks_finalized_total + missed_finalized_blocks[label] += validator.missed_blocks_finalized_total + future_blocks[label] += validator.future_blocks_proposal + + labels.add(label) + + # Here we reset the counters for the next run, we do not + # touch gauges though. This ensures we handle properly + # changes of the labelling in real-time. + + validator.proposed_blocks_total = 0 + validator.missed_blocks_total = 0 + validator.proposed_blocks_finalized_total = 0 + validator.missed_blocks_finalized_total = 0 + validator.future_blocks_proposal = 0 + + for label, status_count in validator_status_count.items(): + for status, count in status_count.items(): + self._metrics.eth_validator_status_count.labels(label, status).set(count) + + for label in labels: + self._metrics.eth_suboptimal_sources_rate.labels(label).set(pct(suboptimal_source_count[label], optimal_source_count[label])) + self._metrics.eth_suboptimal_targets_rate.labels(label).set(pct(suboptimal_target_count[label], optimal_target_count[label])) + self._metrics.eth_suboptimal_heads_rate.labels(label).set(pct(suboptimal_head_count[label], optimal_head_count[label])) + + self._metrics.eth_ideal_consensus_rewards_gwei.labels(label).set(ideal_consensus_reward[label]) + self._metrics.eth_actual_consensus_rewards_gwei.labels(label).set(actual_consensus_reward[label]) + self._metrics.eth_consensus_rewards_rate.labels(label).set(pct(actual_consensus_reward[label], ideal_consensus_reward[label], True)) + + self._metrics.eth_missed_attestations_count.labels(label).set(missed_attestations[label]) + self._metrics.eth_missed_consecutive_attestations_count.labels(label).set(missed_consecutive_attestations[label]) + + # Here we inc, it's fine since we previously reset the + # counters on each run. + + self._metrics.eth_block_proposals_head_total.labels(label).inc(proposed_blocks[label]) + self._metrics.eth_missed_block_proposals_head_total.labels(label).inc(missed_blocks[label]) + self._metrics.eth_block_proposals_finalized_total.labels(label).inc(proposed_finalized_blocks[label]) + self._metrics.eth_missed_block_proposals_finalized_total.labels(label).inc(missed_finalized_blocks[label]) + self._metrics.eth_future_block_proposals.labels(label).set(future_blocks[label]) + + if not self._metrics_started: + start_http_server(self._cfg.metrics_port) + self._metrics_started = True + + def run(self) -> None: + """Run the Ethereum Validator Watcher. + """ + watched_validators = WatchedValidators() + epoch = self._clock.get_current_epoch() + slot = self._clock.get_current_slot() + + beacon_validators = None + validators_liveness = None + rewards = None + last_processed_finalized_slot = None + + while True: + logging.info(f'Processing slot {slot}') + + last_finalized_slot = self._beacon.get_header(BlockIdentierType.FINALIZED).data.header.message.slot + self._schedule.update(self._beacon, slot, last_processed_finalized_slot, last_finalized_slot) - should_process_missed_attestations = ( - slot_in_epoch >= SLOT_FOR_MISSED_ATTESTATIONS_PROCESS - and ( - last_missed_attestations_process_epoch is None - or last_missed_attestations_process_epoch != epoch - ) - ) + if beacon_validators == None or (slot % self._spec.data.SLOTS_PER_EPOCH == 0): + logging.info(f'Processing epoch {epoch}') + beacon_validators = self._beacon.get_validators(self._clock.epoch_to_slot(epoch)) + watched_validators.process_epoch(beacon_validators) + + if validators_liveness == None or (slot % SLOT_FOR_MISSED_ATTESTATIONS_PROCESS == 0): + logging.info('Processing validator liveness') + validators_liveness = self._beacon.get_validators_liveness(epoch - 1, watched_validators.get_indexes()) + watched_validators.process_liveness(validators_liveness) - if should_process_missed_attestations: - our_validators_indexes_that_missed_attestation = ( - process_missed_attestations( - beacon, beacon_type, our_epoch2active_idx2val, epoch - ) - ) - - process_double_missed_attestations( - our_validators_indexes_that_missed_attestation, - our_validators_indexes_that_missed_previous_attestation, - our_epoch2active_idx2val, - epoch, - slack, - ) - - last_missed_attestations_process_epoch = epoch - - is_slot_big_enough = slot_in_epoch >= SLOT_FOR_REWARDS_PROCESS - is_last_rewards_epoch_none = last_rewards_process_epoch is None - is_new_rewards_epoch = last_rewards_process_epoch != epoch - epoch_condition = is_last_rewards_epoch_none or is_new_rewards_epoch - should_process_rewards = is_slot_big_enough and epoch_condition - - if should_process_rewards: - process_rewards( - beacon, - beacon_type, - epoch, - net_epoch2active_idx2val, - our_epoch2active_idx2val, - ) - - last_rewards_process_epoch = epoch - - process_future_blocks_proposal(beacon, our_pubkeys, slot, is_new_epoch) - - last_processed_finalized_slot = process_missed_blocks_finalized( - beacon, last_processed_finalized_slot, slot, our_pubkeys, slack - ) + if rewards == None or (slot % SLOT_FOR_REWARDS_PROCESS == 0): + logging.info('Processing rewards') + rewards = self._beacon.get_rewards(epoch - 2) + process_rewards(watched_validators, rewards) - delta_sec = MISSED_BLOCK_TIMEOUT_SEC - (time() - slot_start_time_sec) - sleep(max(0, delta_sec)) + has_block = has_block_at_slot(self._beacon, slot) - potential_block = beacon.get_potential_block(slot) + process_block(watched_validators, self._schedule, slot, has_block) + process_future_blocks(watched_validators, self._schedule, slot) - if potential_block is not None: - block = potential_block + last_finalized_slot = self._beacon.get_header(BlockIdentierType.FINALIZED).data.header.message.slot + while last_processed_finalized_slot and last_processed_finalized_slot < last_finalized_slot: + logging.info(f'Processing finalized slot from {last_processed_finalized_slot or last_finalized_slot} to {last_finalized_slot}') + has_block = has_block_at_slot(self._beacon, last_processed_finalized_slot) + process_finalized_block(watched_validators, self._schedule, last_processed_finalized_slot, has_block) + last_processed_finalized_slot += 1 + last_processed_finalized_slot = last_finalized_slot - process_suboptimal_attestations( - beacon, - block, - slot, - our_active_idx2val, - ) + logging.info('Processing configuration update') + self._reload_config() + watched_validators.process_config(self._cfg) - process_fee_recipient( - block, our_active_idx2val, execution, default_fee_recipient, slack - ) + logging.info('Updating Prometheus metrics') + self._update_metrics(watched_validators, epoch, slot) - is_our_validator = process_missed_blocks_head( - beacon, - potential_block, - slot, - our_pubkeys, - slack, - ) + self._schedule.clear(slot, last_processed_finalized_slot) + self._clock.maybe_wait_for_slot(slot + 1, time.time()) - if is_our_validator and potential_block is not None: - relays.process(slot) + slot += 1 + epoch = slot // self._spec.data.SLOTS_PER_EPOCH - our_validators_indexes_that_missed_previous_attestation = ( - our_validators_indexes_that_missed_attestation - ) - previous_epoch = epoch - - if slot_in_epoch >= SLOT_FOR_MISSED_ATTESTATIONS_PROCESS: - should_process_missed_attestations = True - - if liveness_file is not None: - write_liveness_file(liveness_file) +@app.command() +def handler( + config: Optional[Path] = typer.Option( + 'etc/config.local.yaml', + help="File containing the Ethereum Validator Watcher configuration file.", + exists=True, + file_okay=True, + dir_okay=False, + show_default=True, + ), +) -> None: + """Run the Ethereum Validator Watcher.""" + logging.basicConfig( + level=logging.INFO, + format='%(asctime)s %(levelname)-8s %(message)s' + ) - if idx == 0: - start_http_server(8000) + watcher = ValidatorWatcher(config) + watcher.run() diff --git a/eth_validator_watcher/entrypoint_v2.py b/eth_validator_watcher/entrypoint_v2.py deleted file mode 100644 index ad96236..0000000 --- a/eth_validator_watcher/entrypoint_v2.py +++ /dev/null @@ -1,355 +0,0 @@ -"""Draft entrypoint for the eth-validator-watcher v1.0.0. -""" - -from collections import defaultdict -from functools import partial -from pathlib import Path -from prometheus_client import start_http_server -from pydantic import ValidationError -from typing import Optional - -import logging -import typer -import time - -from .coinbase import get_current_eth_price -from .beacon import Beacon, NoBlockError -from .config import load_config, WatchedKeyConfig -from .metrics import get_prometheus_metrics -from .blocks import process_block, process_finalized_block, process_future_blocks -from .models import BlockIdentierType, Validators -from .rewards import process_rewards -from .utils import ( - SLOT_FOR_MISSED_ATTESTATIONS_PROCESS, - SLOT_FOR_REWARDS_PROCESS, -) -from .proposer_schedule import ProposerSchedule -from .watched_validators import WatchedValidators - - -app = typer.Typer(add_completion=False) - - -def pct(a: int, b: int, inclusive: bool=False) -> float: - """Helper function to calculate the percentage of a over b. - """ - total = a + b if not inclusive else b - if total == 0: - return 0.0 - return float(a / total) * 100.0 - - -class BeaconClock: - """Helper class to keep track of the beacon clock. - - This clock is slightly skewed to ensure we have the data for the - slot we are processing: it is possible beacons do not have data - exactly on slot time, so we wait for ~4 seconds into the next - slot. - """ - - def __init__(self, genesis: int, slot_duration: int, slots_per_epoch: int) -> None: - self._genesis = genesis - self._slot_duration = slot_duration - self._slots_per_epoch = slots_per_epoch - self._lag_seconds = 4.0 - - def get_current_epoch(self) -> int: - """Get the current epoch. - - Returns: - -------- - int: Current epoch. - """ - return self.get_current_slot() // self._slots_per_epoch - - def epoch_to_slot(self, epoch: int) -> int: - """Convert an epoch to a slot. - - Args: - ----- - epoch: int - Epoch to convert. - - Returns: - -------- - int: Slot corresponding to the epoch. - """ - return epoch * self._slots_per_epoch - - def get_current_slot(self) -> int: - """Get the current slot. - - Returns: - -------- - int: Current slot. - """ - return int((time.time() - self._lag_seconds - self._genesis) // self._slot_duration) - - def maybe_wait_for_slot(self, slot: int, now: float) -> None: - """Wait until the given slot is reached. - - Args: - ----- - slot: int - Slot to wait for. - now: float - Current time in seconds since the epoch. - """ - target = self._genesis + slot * self._slot_duration + self._lag_seconds - if now < target: - logging.info(f'Waiting {target - now:.2f} seconds for slot {slot}') - time.sleep(target - now) - - -def has_block_at_slot(beacon: Beacon, block_identifier: BlockIdentierType | int) -> bool: - """Returns the slot of a block identifier if it exists. - - Args: - ----- - beacon: Beacon - Beacon instance. - block_identifier: BlockIdentierType | int - Block identifier (i.e: head, finalized, 42, etc). - - Returns: - -------- - bool: True if the block exists, False otherwise. - """ - try: - return beacon.get_header(block_identifier).data.header.message.slot > 0 - except NoBlockError: - return False - - -class ValidatorWatcher: - """Ethereum Validator Watcher. - """ - - def __init__(self, cfg_path: Path) -> None: - """Initialize the Ethereum Validator Watcher. - - Args: - ----- - cfg_path: Path - Path to the configuration file. - """ - self._metrics = get_prometheus_metrics() - self._metrics_started = False - self._cfg_path = cfg_path - self._cfg = None - self._beacon = None - self._slot_duration = None - self._genesis = None - - self._reload_config() - - self._spec = self._beacon.get_spec() - genesis = self._beacon.get_genesis().data.genesis_time - - self._clock = BeaconClock( - genesis, - self._spec.data.SECONDS_PER_SLOT, - self._spec.data.SLOTS_PER_EPOCH, - ) - - self._schedule = ProposerSchedule(self._spec) - - def _reload_config(self) -> None: - """Reload the configuration file. - """ - try: - self._cfg = load_config(self._cfg_path) - except ValidationError as err: - raise typer.BadParameter(f'Invalid configuration file: {err}') - - if self._beacon is None or self._beacon.get_url() != self._cfg.beacon_url or self._beacon.get_timeout_sec() != self._cfg.beacon_timeout_sec: - self._beacon = Beacon(self._cfg.beacon_url, self._cfg.beacon_timeout_sec) - - def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slot: int) -> None: - """Update the Prometheus metrics with the watched validators. - - Args: - ----- - watched_validators: Watched validators. - epoch: Current epoch. - slot: Current slot. - """ - self._metrics.eth_epoch.set(epoch) - self._metrics.eth_slot.set(slot) - self._metrics.eth_current_price_dollars.set(get_current_eth_price()) - - # We iterate once on the validator set to optimize CPU as - # there is a log of entries here, this makes code here a bit - # more complex and entangled. - - validator_status_count: dict[str, dict[StatusEnum, int]] = defaultdict(partial(defaultdict, int)) - - suboptimal_source_count: dict[str, int] = defaultdict(int) - suboptimal_target_count: dict[str, int] = defaultdict(int) - suboptimal_head_count: dict[str, int] = defaultdict(int) - optimal_source_count: dict[str, int] = defaultdict(int) - optimal_target_count: dict[str, int] = defaultdict(int) - optimal_head_count: dict[str, int] = defaultdict(int) - - ideal_consensus_reward: dict[str, int] = defaultdict(int) - actual_consensus_reward: dict[str, int] = defaultdict(int) - missed_attestations: dict[str, int] = defaultdict(int) - missed_consecutive_attestations: dict[str, int] = defaultdict(int) - - proposed_blocks: dict[str, int] = defaultdict(int) - missed_blocks: dict[str, int] = defaultdict(int) - proposed_finalized_blocks: dict[str, int] = defaultdict(int) - missed_finalized_blocks: dict[str, int] = defaultdict(int) - future_blocks: dict[str, int] = defaultdict(int) - - labels = set() - - for validator in watched_validators.get_validators().values(): - for label in validator.labels: - - validator_status_count[label][str(validator.status)] += 1 - - # Looks weird but we want to explicitly have labels set - # for each set of labels even if they aren't validating - # (in which case the validator attributes are None). - - suboptimal_source_count[label] += int(validator.suboptimal_source == True) - suboptimal_target_count[label] += int(validator.suboptimal_target == True) - suboptimal_head_count[label] += int(validator.suboptimal_head == True) - optimal_source_count[label] += int(validator.suboptimal_source == False) - optimal_target_count[label] += int(validator.suboptimal_target == False) - optimal_head_count[label] += int(validator.suboptimal_head == False) - - ideal_consensus_reward[label] += validator.ideal_consensus_reward or 0 - actual_consensus_reward[label] += validator.actual_consensus_reward or 0 - - missed_attestations[label] += int(validator.missed_attestation == True) - missed_consecutive_attestations[label] += int(validator.previous_missed_attestation == True and validator.missed_attestation == True) - - proposed_blocks[label] += validator.proposed_blocks_total - missed_blocks[label] += validator.missed_blocks_total - proposed_finalized_blocks[label] += validator.proposed_blocks_finalized_total - missed_finalized_blocks[label] += validator.missed_blocks_finalized_total - future_blocks[label] += validator.future_blocks_proposal - - labels.add(label) - - # Here we reset the counters for the next run, we do not - # touch gauges though. This ensures we handle properly - # changes of the labelling in real-time. - - validator.proposed_blocks_total = 0 - validator.missed_blocks_total = 0 - validator.proposed_blocks_finalized_total = 0 - validator.missed_blocks_finalized_total = 0 - validator.future_blocks_proposal = 0 - - for label, status_count in validator_status_count.items(): - for status, count in status_count.items(): - self._metrics.eth_validator_status_count.labels(label, status).set(count) - - for label in labels: - self._metrics.eth_suboptimal_sources_rate.labels(label).set(pct(suboptimal_source_count[label], optimal_source_count[label])) - self._metrics.eth_suboptimal_targets_rate.labels(label).set(pct(suboptimal_target_count[label], optimal_target_count[label])) - self._metrics.eth_suboptimal_heads_rate.labels(label).set(pct(suboptimal_head_count[label], optimal_head_count[label])) - - self._metrics.eth_ideal_consensus_rewards_gwei.labels(label).set(ideal_consensus_reward[label]) - self._metrics.eth_actual_consensus_rewards_gwei.labels(label).set(actual_consensus_reward[label]) - self._metrics.eth_consensus_rewards_rate.labels(label).set(pct(actual_consensus_reward[label], ideal_consensus_reward[label], True)) - - self._metrics.eth_missed_attestations_count.labels(label).set(missed_attestations[label]) - self._metrics.eth_missed_consecutive_attestations_count.labels(label).set(missed_consecutive_attestations[label]) - - # Here we inc, it's fine since we previously reset the - # counters on each run. - - self._metrics.eth_block_proposals_head_total.labels(label).inc(proposed_blocks[label]) - self._metrics.eth_missed_block_proposals_head_total.labels(label).inc(missed_blocks[label]) - self._metrics.eth_block_proposals_finalized_total.labels(label).inc(proposed_finalized_blocks[label]) - self._metrics.eth_missed_block_proposals_finalized_total.labels(label).inc(missed_finalized_blocks[label]) - self._metrics.eth_future_block_proposals.labels(label).set(future_blocks[label]) - - if not self._metrics_started: - start_http_server(self._cfg.metrics_port) - self._metrics_started = True - - def run(self) -> None: - """Run the Ethereum Validator Watcher. - """ - watched_validators = WatchedValidators() - epoch = self._clock.get_current_epoch() - slot = self._clock.get_current_slot() - - beacon_validators = None - validators_liveness = None - rewards = None - last_processed_finalized_slot = None - - while True: - logging.info(f'Processing slot {slot}') - - last_finalized_slot = self._beacon.get_header(BlockIdentierType.FINALIZED).data.header.message.slot - self._schedule.update(self._beacon, slot, last_processed_finalized_slot, last_finalized_slot) - - if beacon_validators == None or (slot % self._spec.data.SLOTS_PER_EPOCH == 0): - logging.info(f'Processing epoch {epoch}') - beacon_validators = self._beacon.get_validators(self._clock.epoch_to_slot(epoch)) - watched_validators.process_epoch(beacon_validators) - - if validators_liveness == None or (slot % SLOT_FOR_MISSED_ATTESTATIONS_PROCESS == 0): - logging.info('Processing validator liveness') - validators_liveness = self._beacon.get_validators_liveness(epoch - 1, watched_validators.get_indexes()) - watched_validators.process_liveness(validators_liveness) - - if rewards == None or (slot % SLOT_FOR_REWARDS_PROCESS == 0): - logging.info('Processing rewards') - rewards = self._beacon.get_rewards(epoch - 2) - process_rewards(watched_validators, rewards) - - has_block = has_block_at_slot(self._beacon, slot) - - process_block(watched_validators, self._schedule, slot, has_block) - process_future_blocks(watched_validators, self._schedule, slot) - - last_finalized_slot = self._beacon.get_header(BlockIdentierType.FINALIZED).data.header.message.slot - while last_processed_finalized_slot and last_processed_finalized_slot < last_finalized_slot: - logging.info(f'Processing finalized slot from {last_processed_finalized_slot or last_finalized_slot} to {last_finalized_slot}') - has_block = has_block_at_slot(self._beacon, last_processed_finalized_slot) - process_finalized_block(watched_validators, self._schedule, last_processed_finalized_slot, has_block) - last_processed_finalized_slot += 1 - last_processed_finalized_slot = last_finalized_slot - - logging.info('Processing configuration update') - self._reload_config() - watched_validators.process_config(self._cfg) - - logging.info('Updating Prometheus metrics') - self._update_metrics(watched_validators, epoch, slot) - - self._schedule.clear(slot, last_processed_finalized_slot) - self._clock.maybe_wait_for_slot(slot + 1, time.time()) - - slot += 1 - epoch = slot // self._spec.data.SLOTS_PER_EPOCH - - -@app.command() -def handler( - config: Optional[Path] = typer.Option( - 'etc/config.local.yaml', - help="File containing the Ethereum Validator Watcher configuration file.", - exists=True, - file_okay=True, - dir_okay=False, - show_default=True, - ), -) -> None: - """Run the Ethereum Validator Watcher.""" - logging.basicConfig( - level=logging.INFO, - format='%(asctime)s %(levelname)-8s %(message)s' - ) - - watcher = ValidatorWatcher(config) - watcher.run() diff --git a/eth_validator_watcher/execution.py b/eth_validator_watcher/execution.py deleted file mode 100644 index 18fc1ab..0000000 --- a/eth_validator_watcher/execution.py +++ /dev/null @@ -1,42 +0,0 @@ -"""Contains the Execution class which is used to interact with the execution layer node.""" - - -from requests import Session, codes -from requests.adapters import HTTPAdapter, Retry - -from eth_validator_watcher.models import EthGetBlockByHashRequest, ExecutionBlock - - -class Execution: - """Execution node abstraction.""" - - def __init__(self, url: str) -> None: - """Execution node - - url: URL where the execution node can be reached - """ - self.__url = url - self.__http = Session() - - adapter = HTTPAdapter( - max_retries=Retry( - backoff_factor=0.5, - total=3, - status_forcelist=[codes.not_found], - ) - ) - - self.__http.mount("http://", adapter) - self.__http.mount("https://", adapter) - - def eth_get_block_by_hash(self, hash: str) -> ExecutionBlock: - """Get execution block. - - Parameters: - hash: Hash of the block to retrieve - """ - request_body = EthGetBlockByHashRequest(params=[hash, True]) - response = self.__http.post(self.__url, json=request_body.model_dump()) - response.raise_for_status() - execution_block_dict = response.json() - return ExecutionBlock(**execution_block_dict) diff --git a/eth_validator_watcher/exited_validators.py b/eth_validator_watcher/exited_validators.py deleted file mode 100644 index 57de772..0000000 --- a/eth_validator_watcher/exited_validators.py +++ /dev/null @@ -1,72 +0,0 @@ -"""Contains the ExitedValidators class, which is responsible for managing the exited -validators.""" - - -from prometheus_client import Gauge - -from .models import Validators -from .utils import Slack - -metric_our_exited_validators_count = Gauge( - "our_exited_validators_count", - "Our exited validators count", -) - - -class ExitedValidators: - """Exited validators abstraction.""" - - def __init__(self, slack: Slack | None) -> None: - """Exited validators - - Parameters: - slack: Optional slack client - """ - self.__our_exited_unslashed_indexes: set[int] | None = None - self.__slack = slack - - def process( - self, - our_exited_unslashed_index_to_validator: dict[ - int, Validators.DataItem.Validator - ], - our_withdrawal_index_to_validator: dict[int, Validators.DataItem.Validator], - ) -> None: - """Process exited validators. - - Parameters: - our_exited_unslashed_index_to_validator: Dictionary with: - key : our exited validator index - value: validator data corresponding to the validator index - """ - - our_exited_unslashed_indexes = set(our_exited_unslashed_index_to_validator) - - our_unslashed_withdrawal_index_to_validator = { - index - for index, validator in our_withdrawal_index_to_validator.items() - if not validator.slashed - } - - our_exited_indexes = set(our_exited_unslashed_index_to_validator) | set( - our_unslashed_withdrawal_index_to_validator - ) - - metric_our_exited_validators_count.set(len(our_exited_indexes)) - - if self.__our_exited_unslashed_indexes is None: - self.__our_exited_unslashed_indexes = our_exited_unslashed_indexes - return - - our_new_exited_unslashed_indexes = ( - our_exited_unslashed_indexes - self.__our_exited_unslashed_indexes - ) - - for index in our_new_exited_unslashed_indexes: - message = f"🚶 Our validator {our_exited_unslashed_index_to_validator[index].pubkey[:10]} is exited" - print(message) - - if self.__slack is not None: - self.__slack.send_message(message) - - self.__our_exited_unslashed_indexes = our_exited_unslashed_indexes diff --git a/eth_validator_watcher/fee_recipient.py b/eth_validator_watcher/fee_recipient.py deleted file mode 100644 index d459a5a..0000000 --- a/eth_validator_watcher/fee_recipient.py +++ /dev/null @@ -1,96 +0,0 @@ -"""Contains the logic to check if the fee recipient is the one expected.""" - - -from prometheus_client import Counter - -from .execution import Execution -from .models import Block, Validators -from .utils import NB_SLOT_PER_EPOCH, Slack - -metric_wrong_fee_recipient_proposed_block_count = Counter( - "wrong_fee_recipient_proposed_block_count", - "Wrong fee recipient proposed block count", -) - - -def process_fee_recipient( - block: Block, - index_to_validator: dict[int, Validators.DataItem.Validator], - execution: Execution | None, - expected_fee_recipient: str | None, - slack: Slack | None, -) -> None: - """Check if the fee recipient is the one expected. - - Parameters: - block : The block to check against the fee recipient - index_to_validator : Dictionary with: - key : validator index - value: validator data corresponding to the validator index - execution : Optional execution client - expected_fee_recipient: The expected fee recipient - slack : Optional slack client - """ - - # No expected fee recipient set, nothing to do - if execution is None or expected_fee_recipient is None: - return - - proposer_index = block.data.message.proposer_index - - # Not our validator, nothing to do - if proposer_index not in index_to_validator: - return - - short_proposer_pubkey = index_to_validator[proposer_index].pubkey[:10] - slot = block.data.message.slot - epoch = slot // NB_SLOT_PER_EPOCH - - # First, we check if the beacon block fee recipient is the one expected - # `.lower()` is here just in case the execution client returns a fee recipient in - # checksum casing - actual_fee_recipient = ( - block.data.message.body.execution_payload.fee_recipient.lower() - ) - - if actual_fee_recipient == expected_fee_recipient: - # Allright, we're good - return - - # If not, it may be because the block was built by an external builder that - # set its own fee recipient. In this case, we need to check if the last transaction - # in the execution block is a transaction to the expected fee recipient. - - execution_block_hash = block.data.message.body.execution_payload.block_hash - execution_block = execution.eth_get_block_by_hash(execution_block_hash) - transactions = execution_block.result.transactions - - try: - *_, last_transaction = transactions - - # `.lower()` is here just in case the execution client returns transacion "to" - # in checksum casing - - if ( - last_transaction.to is not None - and expected_fee_recipient == last_transaction.to.lower() - ): - # The last transaction is to the expected fee recipient - return - except ValueError: - # The block is empty, so we can't check the last transaction - pass - - # If we are here, it means that the fee recipient is wrong - message = ( - f"🚩 Our validator {short_proposer_pubkey} " - f"proposed block at epoch {epoch} - slot {slot} " - "with the wrong fee recipient" - ) - - print(message) - - if slack is not None: - slack.send_message(message) - - metric_wrong_fee_recipient_proposed_block_count.inc() diff --git a/eth_validator_watcher/next_blocks_proposal.py b/eth_validator_watcher/next_blocks_proposal.py deleted file mode 100644 index 3a06fe5..0000000 --- a/eth_validator_watcher/next_blocks_proposal.py +++ /dev/null @@ -1,55 +0,0 @@ -"""Contains function to handle next blocks proposal""" - -import functools - -from prometheus_client import Gauge - -from .beacon import Beacon -from .utils import NB_SLOT_PER_EPOCH - -print = functools.partial(print, flush=True) - -metric_future_block_proposals_count = Gauge( - "future_block_proposals_count", - "Future block proposals count", -) - - -def process_future_blocks_proposal( - beacon: Beacon, - our_pubkeys: set[str], - slot: int, - is_new_epoch: bool, -) -> int: - """Handle next blocks proposal - - Parameters: - beacon : Beacon - our_pubkeys : Set of our validators public keys - slot : Slot - is_new_epoch: Is new epoch - """ - epoch = slot // NB_SLOT_PER_EPOCH - proposers_duties_current_epoch = beacon.get_proposer_duties(epoch) - proposers_duties_next_epoch = beacon.get_proposer_duties(epoch + 1) - - concatenated_data = ( - proposers_duties_current_epoch.data + proposers_duties_next_epoch.data - ) - - filtered = [ - item - for item in concatenated_data - if item.pubkey in our_pubkeys and item.slot >= slot - ] - - metric_future_block_proposals_count.set(len(filtered)) - - if is_new_epoch: - for item in filtered: - print( - f"💍 Our validator {item.pubkey[:10]} is going to propose a block " - f"at slot {item.slot} (in {item.slot - slot} slots)" - ) - - return len(filtered) diff --git a/eth_validator_watcher/relays.py b/eth_validator_watcher/relays.py deleted file mode 100644 index d92678b..0000000 --- a/eth_validator_watcher/relays.py +++ /dev/null @@ -1,97 +0,0 @@ -"""Contains the Relays class which is used to interact with the relays.""" - -from time import sleep - -from prometheus_client import Counter -from requests import Session, codes -from requests.adapters import HTTPAdapter, Retry -from requests.exceptions import ConnectionError - -MAX_TRIALS = 5 -WAIT_SEC = 0.5 - -metric_bad_relay_count = Counter( - "bad_relay_count", - "Bad relay count", -) - - -class Relays: - """Relays abstraction.""" - - def __init__(self, urls: list[str]) -> None: - """Relays - - Parameters: - urls: URLs where the relays can be reached - """ - self.__urls = urls - self.__http = Session() - - adapter = HTTPAdapter( - max_retries=Retry( - backoff_factor=0.5, - total=3, - status_forcelist=[codes.not_found], - ) - ) - - self.__http.mount("http://", adapter) - self.__http.mount("https://", adapter) - - def process(self, slot: int) -> None: - """Detect if the block was built by a known relay. - - Parameters: - slot: Slot - """ - if len(self.__urls) == 0: - return - - if not any( - ( - self.__is_proposer_payload_delivered(relay_url, slot) - for relay_url in self.__urls - ) - ): - metric_bad_relay_count.inc() - print( - "🟧 Block proposed with unknown builder (may be a locally built block)" - ) - - def __is_proposer_payload_delivered( - self, - url: str, - slot: int, - trial_count=0, - wait_sec=WAIT_SEC, - ) -> bool: - """Check if the block was built by a known relay. - - Parameters: - url: URL where the relay can be reached - slot: Slot - """ - try: - response = self.__http.get( - f"{url}/relay/v1/data/bidtraces/proposer_payload_delivered", - params=dict(slot=slot), - ) - except ConnectionError: - if trial_count >= MAX_TRIALS: - raise - - sleep(wait_sec) - - return self.__is_proposer_payload_delivered( - url, slot, trial_count + 1, wait_sec - ) - - response.raise_for_status() - proposer_payload_delivered_json: list = response.json() - - assert ( - len(proposer_payload_delivered_json) <= 1 - ), "Relay returned more than one block" - - return len(proposer_payload_delivered_json) == 1 diff --git a/eth_validator_watcher/utils.py b/eth_validator_watcher/utils.py index 9e24b05..b6ebe7e 100644 --- a/eth_validator_watcher/utils.py +++ b/eth_validator_watcher/utils.py @@ -8,7 +8,6 @@ from slack_sdk import WebClient from .config import WatchedKeyConfig -from .web3signer import Web3Signer NB_SLOT_PER_EPOCH = 32 NB_SECOND_PER_SLOT = 12 @@ -172,35 +171,6 @@ def apply_mask(items: list[Any], mask: list[bool]) -> set[Any]: return set(item for item, bit in zip(items, mask) if bit) -def get_our_pubkeys( - watched_keys: List[WatchedKeyConfig] | None, - web3signer: Web3Signer | None, -) -> set[str]: - """Get our pubkeys - - Parameters: - watched_keys : The list of validator keys we want to watch - web3signer : Web3Signer instance signing for the keys to watch - - Query pubkeys from either file path or Web3Signer instance. - If `our_pubkeys` is already set and we are not at the beginning of a new epoch, - returns `our_pubkeys`. - """ - - # Get public keys from config - pubkeys_from_config: set[str] = set( - k.public_key for k in watched_keys - ) - - pubkeys_from_web3signer = ( - web3signer.load_pubkeys() if web3signer is not None else set() - ) - - our_pubkeys = pubkeys_from_config | pubkeys_from_web3signer - metric_keys_count.set(len(our_pubkeys)) - return our_pubkeys - - def write_liveness_file(liveness_file: Path): """Write liveness file""" liveness_file.parent.mkdir(exist_ok=True, parents=True) diff --git a/eth_validator_watcher/watched_validators.py b/eth_validator_watcher/watched_validators.py index 141ce86..3011400 100644 --- a/eth_validator_watcher/watched_validators.py +++ b/eth_validator_watcher/watched_validators.py @@ -86,6 +86,15 @@ def labels(self) -> list[str]: configured = self._labels or [] return configured + [LABEL_SCOPE_NETWORK] + def is_validating(self) -> bool: + """Check if the validator is validating. + """ + return self.status in [ + Validators.DataItem.StatusEnum.activeOngoing, + Validators.DataItem.StatusEnum.activeExiting, + Validators.DataItem.StatusEnum.activeSlashed, + ] + def process_config(self, config: WatchedKeyConfig): """Processes a new configuration. diff --git a/eth_validator_watcher/web3signer.py b/eth_validator_watcher/web3signer.py deleted file mode 100644 index 8961f44..0000000 --- a/eth_validator_watcher/web3signer.py +++ /dev/null @@ -1,23 +0,0 @@ -""""Contains the Web3Signer class, which is used to interact with Web3Signer.""" - -import requests - - -class Web3Signer: - """Web3Signer abstraction.""" - - def __init__(self, url: str) -> None: - """Web3Signer - - Parameters: - url: URL where Web3Signer can be reached - """ - self.__url = url - - def load_pubkeys(self) -> set[str]: - """Load public keys from Web3Signer. - - Returns the corresponding set of public keys. - """ - resp = requests.get(f"{self.__url}/api/v1/eth2/publicKeys") - return set(resp.json()) diff --git a/pyproject.toml b/pyproject.toml index 467b2c6..45f9dd1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,4 +33,4 @@ requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.poetry.scripts] -eth-validator-watcher = "eth_validator_watcher.entrypoint_v2:app" +eth-validator-watcher = "eth_validator_watcher.entrypoint:app" From 720f2d72e80e6ea7a27709fe8282ce2119f9d640 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Mon, 13 May 2024 13:01:16 +0200 Subject: [PATCH 40/82] feat: strip down beacon class to the minimum --- eth_validator_watcher/beacon.py | 118 +-------- .../suboptimal_attestations.py | 225 ------------------ 2 files changed, 2 insertions(+), 341 deletions(-) delete mode 100644 eth_validator_watcher/suboptimal_attestations.py diff --git a/eth_validator_watcher/beacon.py b/eth_validator_watcher/beacon.py index f9656db..95d21d9 100644 --- a/eth_validator_watcher/beacon.py +++ b/eth_validator_watcher/beacon.py @@ -1,19 +1,15 @@ """Contains the Beacon class which is used to interact with the consensus layer node.""" import functools -from collections import defaultdict -from typing import Any, Optional, Union +from typing import Any, Union from requests import HTTPError, Response, Session, codes from requests.adapters import HTTPAdapter, Retry -from requests.exceptions import ChunkedEncodingError, RetryError +from requests.exceptions import ChunkedEncodingError from tenacity import retry, retry_if_exception_type, stop_after_attempt, wait_fixed from .models import ( - BeaconType, - Block, BlockIdentierType, - Committees, Genesis, Header, ProposerDuties, @@ -155,30 +151,6 @@ def get_header(self, block_identifier: Union[BlockIdentierType, int]) -> Header: header_dict = response.json() return Header(**header_dict) - def get_block(self, slot: int) -> Block: - """Get a block. - - Parameters - slot: Slot corresponding to the block to retrieve - """ - try: - response = self.__get( - f"{self.__url}/eth/v2/beacon/blocks/{slot}", timeout=self.__timeout_sec - ) - - response.raise_for_status() - - except HTTPError as e: - if e.response.status_code == codes.not_found: - # If we are here, it means the block does not exist - raise NoBlockError from e - - # If we are here, it's an other error - raise - - block_dict = response.json() - return Block(**block_dict) - def get_proposer_duties(self, epoch: int) -> ProposerDuties: """Get proposer duties @@ -193,32 +165,6 @@ def get_proposer_duties(self, epoch: int) -> ProposerDuties: proposer_duties_dict = response.json() return ProposerDuties(**proposer_duties_dict) - def get_status_to_index_to_validator( - self, - ) -> dict[StatusEnum, dict[int, Validators.DataItem.Validator]]: - """Get a nested dictionnary with: - outer key : Status - outer value (=inner key): Index of validator - inner value : Validator - """ - response = self.__get_retry_not_found( - f"{self.__url}/eth/v1/beacon/states/head/validators", timeout=self.__timeout_sec - ) - - response.raise_for_status() - validators_dict = response.json() - - validators = Validators(**validators_dict) - - result: dict[ - StatusEnum, dict[int, Validators.DataItem.Validator] - ] = defaultdict(dict) - - for item in validators.data: - result[item.status][item.index] = item.validator - - return result - def get_validators(self, slot: int) -> Validators: response = self.__get_retry_not_found( f"{self.__url}/eth/v1/beacon/states/{slot}/validators", timeout=self.__timeout_sec @@ -234,38 +180,6 @@ def get_validators(self, slot: int) -> Validators: return validators - def get_duty_slot_to_committee_index_to_validators_index( - self, epoch: int - ) -> dict[int, dict[int, list[int]]]: - """Get a nested dictionnary. - outer key : Slot number - outer value (=inner key): Committee index - inner value : Index of validators that have to attest in the - given committee index at the given slot - - Parameters: - epoch: Epoch - """ - response = self.__get_retry_not_found( - f"{self.__url}/eth/v1/beacon/states/head/committees", - params=dict(epoch=epoch), - timeout=self.__timeout_sec, - ) - - response.raise_for_status() - committees_dict = response.json() - - committees = Committees(**committees_dict) - data = committees.data - - # TODO: Do it with dict comprehension - result: dict[int, dict[int, list[int]]] = defaultdict(dict) - - for item in data: - result[item.slot][item.index] = item.validators - - return result - def get_rewards(self, epoch: int) -> Rewards: """Get rewards. @@ -303,31 +217,3 @@ def get_validators_liveness(self, epoch: int, indexes: list[int]) -> ValidatorsL validators_liveness = ValidatorsLivenessResponse(**validators_liveness_dict) del validators_liveness_dict return validators_liveness - - def get_potential_block(self, slot) -> Block | None: - """Get a block if it exists, otherwise return None. - - Parameters: - slot: Slot corresponding to the block to retrieve - """ - try: - return self.get_block(slot) - except NoBlockError: - # The block is probably orphaned: - # The beacon saw the block (that's why we received the event) but it was - # orphaned before we could fetch it. - return None - - def __get_validators_liveness_beacon_api( - self, epoch: int, validators_index: set[int] - ) -> Response: - """Get validators liveness from neither Lighthouse nor Teku. - - https://github.com/ConsenSys/teku/issues/7204 - - Parameters: - epoch : Epoch corresponding to the validators liveness to retrieve - validators_index: Set of validator indexs corresponding to the liveness to - retrieve - """ - return diff --git a/eth_validator_watcher/suboptimal_attestations.py b/eth_validator_watcher/suboptimal_attestations.py deleted file mode 100644 index cc528de..0000000 --- a/eth_validator_watcher/suboptimal_attestations.py +++ /dev/null @@ -1,225 +0,0 @@ -"""Contains functions to process sub-optimal attestations""" - -import functools -from collections import defaultdict - -from prometheus_client import Gauge - -from .beacon import Beacon -from .models import Block, Validators -from .utils import ( - NB_SLOT_PER_EPOCH, - aggregate_bools, - apply_mask, - convert_hex_to_bools, - remove_all_items_from_last_true, - switch_endianness, -) - -print = functools.partial(print, flush=True) - -metric_suboptimal_attestations_rate_gauge = Gauge( - "suboptimal_attestations_rate", - "Suboptimal attestations rate", -) - - -def process_suboptimal_attestations( - beacon: Beacon, - block: Block, - slot: int, - our_active_validators_index_to_validator: dict[int, Validators.DataItem.Validator], -) -> set[int]: - """Process sub-optimal attestations - - Parameters: - beacon : Beacon instance - block : Block to check sub-optimal attestations - against - slot : Slot of the block - our_active_validators_index_to_pubkey: dictionnary with: - - key : index of our active validator - - value: public key of our active validator - """ - if slot < 1: - return set() - - previous_slot = slot - 1 - - # Epoch of previous slot is NOT the previous epoch, but really the epoch - # corresponding to the previous slot. - epoch_of_previous_slot = previous_slot // NB_SLOT_PER_EPOCH - - # All our active validators index - our_active_validators_index = set(our_active_validators_index_to_validator) - - # Nested dictionary - # - Key of the outer dict is the slot - # - Value of the outer dict (which is key of the inner dict) is the committee index - # - Value of the inner dict is the list of validators index that have to attest - # during the given slot and for the given committee index - duty_slot_to_committee_index_to_validators_index: dict[ - int, dict[int, list[int]] - ] = beacon.get_duty_slot_to_committee_index_to_validators_index( - epoch_of_previous_slot - ) - - # Dictionary where key is committee index and value is the list of validators - # index that had to attest during the previous slot - duty_committee_index_to_validators_index_during_previous_slot = ( - duty_slot_to_committee_index_to_validators_index[previous_slot] - ) - - # Index of validators that had to attest during the previous slot - validators_index_that_had_to_attest_during_previous_slot = set( - ( - item - for sublist in duty_committee_index_to_validators_index_during_previous_slot.values() - for item in sublist - ) - ) - - # Index ouf our validators that had to attest during the previous slot - our_validators_index_that_had_to_attest_during_previous_slot = ( - validators_index_that_had_to_attest_during_previous_slot - & our_active_validators_index - ) - - # Dictionary - # - Key is the committee index - # - Value is a list of boolean where each boolean indicates if the validator - # attested optimally - committee_index_to_validator_attestation_success = aggregate_attestations( - block, previous_slot - ) - - list_of_validators_index_that_attested_optimally_during_previous_slot = ( - apply_mask( - duty_committee_index_to_validators_index_during_previous_slot[ - actual_committee_index - ], - validator_attestation_success, - ) - for ( - actual_committee_index, - validator_attestation_success, - ) in committee_index_to_validator_attestation_success.items() - ) - - # Index of validators which actually attested for the previous slot - validators_index_that_attested_optimally_during_previous_slot: set[int] = set( - item - for sublist in list_of_validators_index_that_attested_optimally_during_previous_slot - for item in sublist - ) - - # Index of our validators that attested optimally during the previous slot - our_validators_index_that_attested_optimally_during_previous_slot = ( - validators_index_that_attested_optimally_during_previous_slot - & our_validators_index_that_had_to_attest_during_previous_slot - ) - - # Index of our validators which failed to attest optimally during the previous slot - our_validators_index_that_did_not_attest_optimally_during_previous_slot = ( - our_validators_index_that_had_to_attest_during_previous_slot - - our_validators_index_that_attested_optimally_during_previous_slot - ) - - suboptimal_attestations_rate = ( - len(our_validators_index_that_did_not_attest_optimally_during_previous_slot) - / len(our_validators_index_that_had_to_attest_during_previous_slot) - if len(our_validators_index_that_had_to_attest_during_previous_slot) != 0 - else None - ) - - if suboptimal_attestations_rate is not None: - metric_suboptimal_attestations_rate_gauge.set(100 * suboptimal_attestations_rate) - - if len(our_validators_index_that_did_not_attest_optimally_during_previous_slot) > 0: - assert suboptimal_attestations_rate is not None - - first_indexes = sorted( - list( - our_validators_index_that_did_not_attest_optimally_during_previous_slot - ) - )[:5] - - first_pubkeys = ( - our_active_validators_index_to_validator[first_index].pubkey - for first_index in first_indexes - ) - - short_first_pubkeys = [pubkey[:10] for pubkey in first_pubkeys] - short_first_pubkeys_str = ", ".join(short_first_pubkeys) - - print( - f"❗ Our validator {short_first_pubkeys_str} and " - f"{len(our_validators_index_that_did_not_attest_optimally_during_previous_slot) - len(short_first_pubkeys)} more " - f"({round(100 * suboptimal_attestations_rate, 1)} %) had not optimal attestation " - f"inclusion at slot {previous_slot}" - ) - - return our_validators_index_that_did_not_attest_optimally_during_previous_slot - - -def aggregate_attestations(block: Block, slot: int) -> dict[int, list[bool]]: - """Aggregates all attestations for the slot `slot` that are presient - in block `block`. - - Parameters: - block: Block - slot: Slot - - Returns: - Each boolean of the list corresponds to a validator in the given committee. - If the validator attestation from the previous slot is included in the current - slot, the boolean is True. Else, it is False. - """ - filtered_attestations = ( - attestation - for attestation in block.data.message.body.attestations - if attestation.data.slot == slot - ) - - # TODO: Write this code with dict comprehension - committee_index_to_list_of_aggregation_bools: dict[ - int, list[list[bool]] - ] = defaultdict(list) - - for attestation in filtered_attestations: - aggregated_bits_little_endian_with_last_bit = attestation.aggregation_bits - - # Aggregations bits are given under binary (hexadecimal) shape. - # We convert bytes to booleans. - aggregated_bools_little_endian_with_last_bit = convert_hex_to_bools( - aggregated_bits_little_endian_with_last_bit - ) - - # Aggregations bits are represented in little endian shape. - # However, validators in committees are listed in big endian shape. - # We switch endianness - aggregated_bools_with_last_bit = switch_endianness( - aggregated_bools_little_endian_with_last_bit - ) - - # Aggregations bits in a given committee are represented with one bit for - # one validator. The number of validators bit is always a multiple of 8, - # even if the number of validators is not a multiple of 8. - # The last `1` (or last `True` in our boolean list) represents the boundary. - # All following `0`s can be ignored, as they do not represent validators - # As a consequence, we remove the last `1` and all following `0`s - aggregated_bools = remove_all_items_from_last_true( - aggregated_bools_with_last_bit - ) - - committee_index_to_list_of_aggregation_bools[attestation.data.index].append( - aggregated_bools - ) - - # Finally, we aggregate all attestations - items = committee_index_to_list_of_aggregation_bools.items() - - return { - committee_index: aggregate_bools(list_of_aggregation_bools) - for committee_index, list_of_aggregation_bools in items - } From 4477d5435fcf0049e66844eff7cc336eed0de388 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Mon, 13 May 2024 13:34:37 +0200 Subject: [PATCH 41/82] feat: move beacon clock to a dedicated file --- eth_validator_watcher/beacon.py | 17 +++++ eth_validator_watcher/blocks.py | 3 - eth_validator_watcher/clock.py | 65 +++++++++++++++++ eth_validator_watcher/entrypoint.py | 109 ++++------------------------ eth_validator_watcher/metrics.py | 1 + eth_validator_watcher/utils.py | 9 +++ 6 files changed, 107 insertions(+), 97 deletions(-) create mode 100644 eth_validator_watcher/clock.py diff --git a/eth_validator_watcher/beacon.py b/eth_validator_watcher/beacon.py index 95d21d9..73eee6e 100644 --- a/eth_validator_watcher/beacon.py +++ b/eth_validator_watcher/beacon.py @@ -217,3 +217,20 @@ def get_validators_liveness(self, epoch: int, indexes: list[int]) -> ValidatorsL validators_liveness = ValidatorsLivenessResponse(**validators_liveness_dict) del validators_liveness_dict return validators_liveness + + def has_block_at_slot(self, block_identifier: BlockIdentierType | int) -> bool: + """Returns the slot of a block identifier if it exists. + + Args: + ----- + block_identifier: BlockIdentierType | int + Block identifier (i.e: head, finalized, 42, etc). + + Returns: + -------- + bool: True if the block exists, False otherwise. + """ + try: + return self.get_header(block_identifier).data.header.message.slot > 0 + except NoBlockError: + return False diff --git a/eth_validator_watcher/blocks.py b/eth_validator_watcher/blocks.py index caa6805..14fd861 100644 --- a/eth_validator_watcher/blocks.py +++ b/eth_validator_watcher/blocks.py @@ -1,8 +1,5 @@ import functools -from prometheus_client import Counter - -from .models import Block, BlockIdentierType from .proposer_schedule import ProposerSchedule from .watched_validators import WatchedValidators diff --git a/eth_validator_watcher/clock.py b/eth_validator_watcher/clock.py new file mode 100644 index 0000000..acbab95 --- /dev/null +++ b/eth_validator_watcher/clock.py @@ -0,0 +1,65 @@ +import time +import logging + + +class BeaconClock: + """Helper class to keep track of the beacon clock. + + This clock is slightly skewed to ensure we have the data for the + slot we are processing: it is possible beacons do not have data + exactly on slot time, so we wait for ~4 seconds into the next + slot. + """ + + def __init__(self, genesis: int, slot_duration: int, slots_per_epoch: int) -> None: + self._genesis = genesis + self._slot_duration = slot_duration + self._slots_per_epoch = slots_per_epoch + self._lag_seconds = 4.0 + + def get_current_epoch(self) -> int: + """Get the current epoch. + + Returns: + -------- + int: Current epoch. + """ + return self.get_current_slot() // self._slots_per_epoch + + def epoch_to_slot(self, epoch: int) -> int: + """Convert an epoch to a slot. + + Args: + ----- + epoch: int + Epoch to convert. + + Returns: + -------- + int: Slot corresponding to the epoch. + """ + return epoch * self._slots_per_epoch + + def get_current_slot(self) -> int: + """Get the current slot. + + Returns: + -------- + int: Current slot. + """ + return int((time.time() - self._lag_seconds - self._genesis) // self._slot_duration) + + def maybe_wait_for_slot(self, slot: int, now: float) -> None: + """Wait until the given slot is reached. + + Args: + ----- + slot: int + Slot to wait for. + now: float + Current time in seconds since the epoch. + """ + target = self._genesis + slot * self._slot_duration + self._lag_seconds + if now < target: + logging.info(f'Waiting {target - now:.2f} seconds for slot {slot}') + time.sleep(target - now) diff --git a/eth_validator_watcher/entrypoint.py b/eth_validator_watcher/entrypoint.py index b37c33d..8619ced 100644 --- a/eth_validator_watcher/entrypoint.py +++ b/eth_validator_watcher/entrypoint.py @@ -13,6 +13,7 @@ import time from .coinbase import get_current_eth_price +from .clock import BeaconClock from .beacon import Beacon, NoBlockError from .config import load_config, WatchedKeyConfig from .metrics import get_prometheus_metrics @@ -22,6 +23,7 @@ from .utils import ( SLOT_FOR_MISSED_ATTESTATIONS_PROCESS, SLOT_FOR_REWARDS_PROCESS, + pct, ) from .proposer_schedule import ProposerSchedule from .watched_validators import WatchedValidators @@ -30,97 +32,6 @@ app = typer.Typer(add_completion=False) -def pct(a: int, b: int, inclusive: bool=False) -> float: - """Helper function to calculate the percentage of a over b. - """ - total = a + b if not inclusive else b - if total == 0: - return 0.0 - return float(a / total) * 100.0 - - -class BeaconClock: - """Helper class to keep track of the beacon clock. - - This clock is slightly skewed to ensure we have the data for the - slot we are processing: it is possible beacons do not have data - exactly on slot time, so we wait for ~4 seconds into the next - slot. - """ - - def __init__(self, genesis: int, slot_duration: int, slots_per_epoch: int) -> None: - self._genesis = genesis - self._slot_duration = slot_duration - self._slots_per_epoch = slots_per_epoch - self._lag_seconds = 4.0 - - def get_current_epoch(self) -> int: - """Get the current epoch. - - Returns: - -------- - int: Current epoch. - """ - return self.get_current_slot() // self._slots_per_epoch - - def epoch_to_slot(self, epoch: int) -> int: - """Convert an epoch to a slot. - - Args: - ----- - epoch: int - Epoch to convert. - - Returns: - -------- - int: Slot corresponding to the epoch. - """ - return epoch * self._slots_per_epoch - - def get_current_slot(self) -> int: - """Get the current slot. - - Returns: - -------- - int: Current slot. - """ - return int((time.time() - self._lag_seconds - self._genesis) // self._slot_duration) - - def maybe_wait_for_slot(self, slot: int, now: float) -> None: - """Wait until the given slot is reached. - - Args: - ----- - slot: int - Slot to wait for. - now: float - Current time in seconds since the epoch. - """ - target = self._genesis + slot * self._slot_duration + self._lag_seconds - if now < target: - logging.info(f'Waiting {target - now:.2f} seconds for slot {slot}') - time.sleep(target - now) - - -def has_block_at_slot(beacon: Beacon, block_identifier: BlockIdentierType | int) -> bool: - """Returns the slot of a block identifier if it exists. - - Args: - ----- - beacon: Beacon - Beacon instance. - block_identifier: BlockIdentierType | int - Block identifier (i.e: head, finalized, 42, etc). - - Returns: - -------- - bool: True if the block exists, False otherwise. - """ - try: - return beacon.get_header(block_identifier).data.header.message.slot > 0 - except NoBlockError: - return False - class ValidatorWatcher: """Ethereum Validator Watcher. @@ -183,8 +94,10 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo # there is a log of entries here, this makes code here a bit # more complex and entangled. + # Count of validators by status validator_status_count: dict[str, dict[StatusEnum, int]] = defaultdict(partial(defaultdict, int)) + # Gauges suboptimal_source_count: dict[str, int] = defaultdict(int) suboptimal_target_count: dict[str, int] = defaultdict(int) suboptimal_head_count: dict[str, int] = defaultdict(int) @@ -192,20 +105,25 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo optimal_target_count: dict[str, int] = defaultdict(int) optimal_head_count: dict[str, int] = defaultdict(int) + # Gauges ideal_consensus_reward: dict[str, int] = defaultdict(int) actual_consensus_reward: dict[str, int] = defaultdict(int) missed_attestations: dict[str, int] = defaultdict(int) missed_consecutive_attestations: dict[str, int] = defaultdict(int) + # Counters proposed_blocks: dict[str, int] = defaultdict(int) missed_blocks: dict[str, int] = defaultdict(int) proposed_finalized_blocks: dict[str, int] = defaultdict(int) missed_finalized_blocks: dict[str, int] = defaultdict(int) + + # Gauge future_blocks: dict[str, int] = defaultdict(int) labels = set() for validator in watched_validators.get_validators().values(): + # Everything here implies to have a validator that is # active on the beacon chain, this prevents miscounting # missed attestation for instance. @@ -240,6 +158,7 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo missed_blocks[label] += validator.missed_blocks_total proposed_finalized_blocks[label] += validator.proposed_blocks_finalized_total missed_finalized_blocks[label] += validator.missed_blocks_finalized_total + future_blocks[label] += validator.future_blocks_proposal labels.add(label) @@ -271,12 +190,14 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo self._metrics.eth_missed_consecutive_attestations_count.labels(label).set(missed_consecutive_attestations[label]) # Here we inc, it's fine since we previously reset the - # counters on each run. + # counters on each run; we can't use set because those + # metrics are counters. self._metrics.eth_block_proposals_head_total.labels(label).inc(proposed_blocks[label]) self._metrics.eth_missed_block_proposals_head_total.labels(label).inc(missed_blocks[label]) self._metrics.eth_block_proposals_finalized_total.labels(label).inc(proposed_finalized_blocks[label]) self._metrics.eth_missed_block_proposals_finalized_total.labels(label).inc(missed_finalized_blocks[label]) + self._metrics.eth_future_block_proposals.labels(label).set(future_blocks[label]) if not self._metrics_started: @@ -316,7 +237,7 @@ def run(self) -> None: rewards = self._beacon.get_rewards(epoch - 2) process_rewards(watched_validators, rewards) - has_block = has_block_at_slot(self._beacon, slot) + has_block = self._beacon.has_block_at_slot(slot) process_block(watched_validators, self._schedule, slot, has_block) process_future_blocks(watched_validators, self._schedule, slot) @@ -324,7 +245,7 @@ def run(self) -> None: last_finalized_slot = self._beacon.get_header(BlockIdentierType.FINALIZED).data.header.message.slot while last_processed_finalized_slot and last_processed_finalized_slot < last_finalized_slot: logging.info(f'Processing finalized slot from {last_processed_finalized_slot or last_finalized_slot} to {last_finalized_slot}') - has_block = has_block_at_slot(self._beacon, last_processed_finalized_slot) + has_block = self._beacon.has_block_at_slot(last_processed_finalized_slot) process_finalized_block(watched_validators, self._schedule, last_processed_finalized_slot, has_block) last_processed_finalized_slot += 1 last_processed_finalized_slot = last_finalized_slot diff --git a/eth_validator_watcher/metrics.py b/eth_validator_watcher/metrics.py index ba75f89..f3d3308 100644 --- a/eth_validator_watcher/metrics.py +++ b/eth_validator_watcher/metrics.py @@ -30,6 +30,7 @@ class PrometheusMetrics: eth_missed_block_proposals_head_total: Counter eth_block_proposals_finalized_total: Counter eth_missed_block_proposals_finalized_total: Counter + eth_future_block_proposals: Gauge diff --git a/eth_validator_watcher/utils.py b/eth_validator_watcher/utils.py index b6ebe7e..ccde9c2 100644 --- a/eth_validator_watcher/utils.py +++ b/eth_validator_watcher/utils.py @@ -225,6 +225,15 @@ def eth1_address_lower_0x_prefixed(address: str) -> str: return address_lower +def pct(a: int, b: int, inclusive: bool=False) -> float: + """Helper function to calculate the percentage of a over b. + """ + total = a + b if not inclusive else b + if total == 0: + return 0.0 + return float(a / total) * 100.0 + + def eth2_address_lower_0x_prefixed(address: str) -> str: address_lower = address.lower() From 7ec43603484a8575887db919036ece72b0ad9dc0 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Tue, 14 May 2024 09:22:25 +0200 Subject: [PATCH 42/82] feat: temporarily delete unit tests to have a basic working CI --- eth_validator_watcher/beacon.py | 16 +- tests/__init__.py | 0 tests/beacon/__init__.py | 0 tests/beacon/assets/__init__.py | 0 tests/beacon/assets/block.json | 112 ---- tests/beacon/assets/committees.json | 41 -- tests/beacon/assets/genesis.json | 7 - tests/beacon/assets/header.json | 18 - .../assets/liveness_request_beacon_api.json | 5 - .../assets/liveness_request_lighthouse.json | 8 - .../beacon/assets/liveness_request_teku.json | 7 - tests/beacon/assets/liveness_response.json | 19 - tests/beacon/assets/proposer_duties.json | 20 - tests/beacon/assets/rewards.json | 33 -- tests/beacon/assets/validators.json | 80 --- tests/beacon/test_get_block.py | 55 -- ..._to_committee_index_to_validators_index.py | 34 -- tests/beacon/test_get_genesis.py | 31 -- tests/beacon/test_get_header.py | 64 --- tests/beacon/test_get_proposer_duties.py | 47 -- tests/beacon/test_get_rewards.py | 62 --- .../test_get_status_to_index_to_validator.py | 65 --- tests/beacon/test_get_validators_liveness.py | 163 ------ tests/beacon/test_potential_block.py | 24 - .../test_emit_eth_usd_conversion_rate.py | 47 -- tests/config/__init__.py | 0 tests/config/assets/__init__.py | 0 tests/config/assets/config.empty.yaml | 0 tests/config/assets/config.null.yaml | 9 - tests/config/assets/config.yaml | 19 - tests/config/test_load_config.py | 92 ---- .../entry_queue/test_compute_duration_sec.py | 13 - .../test_compute_validators_churn.py | 8 - tests/entry_queue/test_export_duration_sec.py | 9 - tests/entry_queue/test_get_bucket_index.py | 15 - tests/entrypoint/assets/__init__.py | 0 tests/entrypoint/assets/invalid_config.yaml | 1 - tests/entrypoint/test__handler.py | 353 ------------- tests/execution/__init__.py | 0 tests/execution/assets/__init__.py | 0 tests/execution/assets/block.json | 50 -- tests/execution/test_eth_get_block_by_hash.py | 55 -- .../test_process_exited_validators.py | 59 --- tests/fee_recipient/__init__.py | 0 tests/fee_recipient/assets/__init__.py | 0 tests/fee_recipient/assets/block.json | 112 ---- .../assets/empty_execution_block.json | 7 - .../fee_recipient/assets/execution_block.json | 50 -- .../test_process_fee_recipient.py | 193 ------- ...test_process_double_missed_attestations.py | 78 --- .../test_process_missed_attestations.py | 85 --- .../test_process_missed_blocks_finalized.py | 204 -------- .../test_process_missed_blocks_head.py | 73 --- .../test_next_blocks_proposal.py | 34 -- tests/relays/test_process.py | 89 ---- tests/rewards/test_process_rewards_net.py | 492 ------------------ tests/rewards/test_process_rewards_our.py | 466 ----------------- .../test_process_slashed_validators.py | 103 ---- tests/suboptimal_attestations/__init__.py | 0 .../assets/__init__.py | 0 .../suboptimal_attestations/assets/block.json | 93 ---- .../test_aggregate_attestations.py | 80 --- .../test_suboptimal_attestations.py | 152 ------ tests/utils/__init__.py | 0 tests/utils/test_aggregate_bools.py | 15 - tests/utils/test_apply_mask.py | 9 - tests/utils/test_convert_hex_to_bools.py | 25 - tests/utils/test_convert_seconds_to_dhms.py | 8 - tests/utils/test_eth1_address_0x_prefixed.py | 31 -- tests/utils/test_eth2_address_0x_prefixed.py | 31 -- tests/utils/test_get_our_pubkeys.py | 33 -- tests/utils/test_limited_dict.py | 53 -- tests/utils/test_liveness_file.py | 11 - .../test_remove_all_items_after_last_true.py | 16 - tests/utils/test_slack.py | 18 - tests/utils/test_slots.py | 18 - tests/utils/test_switch_endianness.py | 43 -- tests/web3signer/test_web3signer.py | 14 - 78 files changed, 8 insertions(+), 4269 deletions(-) delete mode 100644 tests/__init__.py delete mode 100644 tests/beacon/__init__.py delete mode 100644 tests/beacon/assets/__init__.py delete mode 100644 tests/beacon/assets/block.json delete mode 100644 tests/beacon/assets/committees.json delete mode 100644 tests/beacon/assets/genesis.json delete mode 100644 tests/beacon/assets/header.json delete mode 100644 tests/beacon/assets/liveness_request_beacon_api.json delete mode 100644 tests/beacon/assets/liveness_request_lighthouse.json delete mode 100644 tests/beacon/assets/liveness_request_teku.json delete mode 100644 tests/beacon/assets/liveness_response.json delete mode 100644 tests/beacon/assets/proposer_duties.json delete mode 100644 tests/beacon/assets/rewards.json delete mode 100644 tests/beacon/assets/validators.json delete mode 100644 tests/beacon/test_get_block.py delete mode 100644 tests/beacon/test_get_duty_slot_to_committee_index_to_validators_index.py delete mode 100644 tests/beacon/test_get_genesis.py delete mode 100644 tests/beacon/test_get_header.py delete mode 100644 tests/beacon/test_get_proposer_duties.py delete mode 100644 tests/beacon/test_get_rewards.py delete mode 100644 tests/beacon/test_get_status_to_index_to_validator.py delete mode 100644 tests/beacon/test_get_validators_liveness.py delete mode 100644 tests/beacon/test_potential_block.py delete mode 100644 tests/coinbase/test_emit_eth_usd_conversion_rate.py delete mode 100644 tests/config/__init__.py delete mode 100644 tests/config/assets/__init__.py delete mode 100644 tests/config/assets/config.empty.yaml delete mode 100644 tests/config/assets/config.null.yaml delete mode 100644 tests/config/assets/config.yaml delete mode 100644 tests/config/test_load_config.py delete mode 100644 tests/entry_queue/test_compute_duration_sec.py delete mode 100644 tests/entry_queue/test_compute_validators_churn.py delete mode 100644 tests/entry_queue/test_export_duration_sec.py delete mode 100644 tests/entry_queue/test_get_bucket_index.py delete mode 100644 tests/entrypoint/assets/__init__.py delete mode 100644 tests/entrypoint/assets/invalid_config.yaml delete mode 100644 tests/entrypoint/test__handler.py delete mode 100644 tests/execution/__init__.py delete mode 100644 tests/execution/assets/__init__.py delete mode 100644 tests/execution/assets/block.json delete mode 100644 tests/execution/test_eth_get_block_by_hash.py delete mode 100644 tests/exited_validators/test_process_exited_validators.py delete mode 100644 tests/fee_recipient/__init__.py delete mode 100644 tests/fee_recipient/assets/__init__.py delete mode 100644 tests/fee_recipient/assets/block.json delete mode 100644 tests/fee_recipient/assets/empty_execution_block.json delete mode 100644 tests/fee_recipient/assets/execution_block.json delete mode 100644 tests/fee_recipient/test_process_fee_recipient.py delete mode 100644 tests/missed_attestations/test_process_double_missed_attestations.py delete mode 100644 tests/missed_attestations/test_process_missed_attestations.py delete mode 100644 tests/missed_blocks_finalized/test_process_missed_blocks_finalized.py delete mode 100644 tests/missed_blocks_head/test_process_missed_blocks_head.py delete mode 100644 tests/next_blocks_proposal/test_next_blocks_proposal.py delete mode 100644 tests/relays/test_process.py delete mode 100644 tests/rewards/test_process_rewards_net.py delete mode 100644 tests/rewards/test_process_rewards_our.py delete mode 100644 tests/slashed_validators/test_process_slashed_validators.py delete mode 100644 tests/suboptimal_attestations/__init__.py delete mode 100644 tests/suboptimal_attestations/assets/__init__.py delete mode 100644 tests/suboptimal_attestations/assets/block.json delete mode 100644 tests/suboptimal_attestations/test_aggregate_attestations.py delete mode 100644 tests/suboptimal_attestations/test_suboptimal_attestations.py delete mode 100644 tests/utils/__init__.py delete mode 100644 tests/utils/test_aggregate_bools.py delete mode 100644 tests/utils/test_apply_mask.py delete mode 100644 tests/utils/test_convert_hex_to_bools.py delete mode 100644 tests/utils/test_convert_seconds_to_dhms.py delete mode 100644 tests/utils/test_eth1_address_0x_prefixed.py delete mode 100644 tests/utils/test_eth2_address_0x_prefixed.py delete mode 100644 tests/utils/test_get_our_pubkeys.py delete mode 100644 tests/utils/test_limited_dict.py delete mode 100644 tests/utils/test_liveness_file.py delete mode 100644 tests/utils/test_remove_all_items_after_last_true.py delete mode 100644 tests/utils/test_slack.py delete mode 100644 tests/utils/test_slots.py delete mode 100644 tests/utils/test_switch_endianness.py delete mode 100644 tests/web3signer/test_web3signer.py diff --git a/eth_validator_watcher/beacon.py b/eth_validator_watcher/beacon.py index 73eee6e..5fb0f19 100644 --- a/eth_validator_watcher/beacon.py +++ b/eth_validator_watcher/beacon.py @@ -76,14 +76,6 @@ def __init__(self, url: str, timeout_sec: int) -> None: self.__http.mount("http://", adapter) self.__http.mount("https://", adapter) - def get_url(self) -> str: - """Return the URL of the beacon.""" - return self.__url - - def get_timeout_sec(self) -> int: - """Return the timeout in seconds used to query the beacon.""" - return self.__timeout_sec - @retry( stop=stop_after_attempt(5), wait=wait_fixed(3), @@ -111,6 +103,14 @@ def __post_retry_not_found(self, *args: Any, **kwargs: Any) -> Response: """Wrapper around requests.get() with retry on 404""" return self.__http_retry_not_found.post(*args, **kwargs) + def get_url(self) -> str: + """Return the URL of the beacon.""" + return self.__url + + def get_timeout_sec(self) -> int: + """Return the timeout in seconds used to query the beacon.""" + return self.__timeout_sec + def get_genesis(self) -> Genesis: """Get genesis data.""" response = self.__get_retry_not_found( diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/beacon/__init__.py b/tests/beacon/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/beacon/assets/__init__.py b/tests/beacon/assets/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/beacon/assets/block.json b/tests/beacon/assets/block.json deleted file mode 100644 index c895dad..0000000 --- a/tests/beacon/assets/block.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "version": "bellatrix", - "execution_optimistic": false, - "data": { - "message": { - "slot": "4839775", - "proposer_index": "365100", - "parent_root": "0xe90537191ff89b8a416ef5b128d7bc825c9f4af1fd15274d00b50374bcd83c87", - "state_root": "0xfd9677861ad339b698bac2555c2b7df5b04820807116010ebaf499f39acd4170", - "body": { - "randao_reveal": "0x98539cdc416440d3a26959a7f07b7c093a984221a78087496f5846ab694b557654836a7713649d1d9127680df5038147082bcbde5d5a427f302dcff76cb8cabaa990a131553e2193f88494a23cefbeda154cc88fe97cdba798d6550b250e5b2b", - "eth1_data": { - "deposit_root": "0x86b32b120d274e30bd5fd401610b0d8891d8eb48dc68038cadfc15de58215d7c", - "deposit_count": "449941", - "block_hash": "0x060356bdb8bf84bb2c1ca7e3874883802c672a4120b25d3b8bfb67524483a6fe" - }, - "graffiti": "0x0000000000000000000000000000000000000000000000000000000000000000", - "proposer_slashings": [], - "attester_slashings": [], - "attestations": [ - { - "aggregation_bits": "0x00ffff", - "data": { - "slot": "4839774", - "index": "1", - "beacon_block_root": "0xe90537191ff89b8a416ef5b128d7bc825c9f4af1fd15274d00b50374bcd83c87", - "source": { - "epoch": "151241", - "root": "0x8bd8a1dfa949c0f7de21083bb733fc71e36ab5754535a5970ba6b45ae7347129" - }, - "target": { - "epoch": "151242", - "root": "0x0dbfd0dc78569bcab7e2fc05d68c781ed96d2df4c6ffaeee81f2553babf287d3" - } - }, - "signature": "0xaa96594a0024e1e3cc7b17456e07515dc987698cdaba451227ee40d32dc931a909ec92200d06ebc8174b65c64f18873e17f6d20adba701ce6c9f58de424833a023486ff1ab3a8f6fe0e72e6e0ded516011786843016dd672b0730d90b108990b" - }, - { - "aggregation_bits": "0xfe00ff", - "data": { - "slot": "4839774", - "index": "1", - "beacon_block_root": "0xe90537191ff89b8a416ef5b128d7bc825c9f4af1fd15274d00b50374bcd83c87", - "source": { - "epoch": "151241", - "root": "0x8bd8a1dfa949c0f7de21083bb733fc71e36ab5754535a5970ba6b45ae7347129" - }, - "target": { - "epoch": "151242", - "root": "0x0dbfd0dc78569bcab7e2fc05d68c781ed96d2df4c6ffaeee81f2553babf287d3" - } - }, - "signature": "0xaa96594a0024e1e3cc7b17456e07515dc987698cdaba451227ee40d32dc931a909ec92200d06ebc8174b65c64f18873e17f6d20adba701ce6c9f58de424833a023486ff1ab3a8f6fe0e72e6e0ded516011786843016dd672b0730d90b108990b" - }, - { - "aggregation_bits": "0xff00ff", - "data": { - "slot": "4839774", - "index": "2", - "beacon_block_root": "0xe90537191ff89b8a416ef5b128d7bc825c9f4af1fd15274d00b50374bcd83c87", - "source": { - "epoch": "151241", - "root": "0x8bd8a1dfa949c0f7de21083bb733fc71e36ab5754535a5970ba6b45ae7347129" - }, - "target": { - "epoch": "151242", - "root": "0x0dbfd0dc78569bcab7e2fc05d68c781ed96d2df4c6ffaeee81f2553babf287d3" - } - }, - "signature": "0xaa96594a0024e1e3cc7b17456e07515dc987698cdaba451227ee40d32dc931a909ec92200d06ebc8174b65c64f18873e17f6d20adba701ce6c9f58de424833a023486ff1ab3a8f6fe0e72e6e0ded516011786843016dd672b0730d90b108990b" - }, - { - "aggregation_bits": "0xff00ff", - "data": { - "slot": "4839773", - "index": "3", - "beacon_block_root": "0xe90537191ff89b8a416ef5b128d7bc825c9f4af1fd15274d00b50374bcd83c87", - "source": { - "epoch": "151241", - "root": "0x8bd8a1dfa949c0f7de21083bb733fc71e36ab5754535a5970ba6b45ae7347129" - }, - "target": { - "epoch": "151242", - "root": "0x0dbfd0dc78569bcab7e2fc05d68c781ed96d2df4c6ffaeee81f2553babf287d3" - } - }, - "signature": "0xaa96594a0024e1e3cc7b17456e07515dc987698cdaba451227ee40d32dc931a909ec92200d06ebc8174b65c64f18873e17f6d20adba701ce6c9f58de424833a023486ff1ab3a8f6fe0e72e6e0ded516011786843016dd672b0730d90b108990b" - } - ], - "execution_payload": { - "parent_hash": "0x4b7de5b987b9bfc9aa2e7e58cf25515950c8f0b7da00366ecd5ae8cfd8e05fa3", - "fee_recipient": "0xebec795c9c8bbd61ffc14a6662944748f299cacf", - "state_root": "0x1e21e560eb6ba930006c3dad4d1b301f74ab324711931a0a5e8632f1ee3c2de2", - "receipts_root": "0x102f655d8a01fc5484b259c4067fa560796ae22ca5d67364b94e217e3f3f8029", - "logs_bloom": "0x46a5913764080408104db1108133191d16e4cc411f45c59a0103580f570e915451a55b82c752a92107a0961404d11161165584b699427a00230e21f111eca4828cc160bae709da2ce9436609cb388529b2f6522915f7e8a8f8ad5769d8f62810132ef61aa61384c711c00508b02868cfcc15483ee01a8d18e28805d1ca580744a0e232d6ff040c0810cc04404346d03e569024a1a99c10d9453439685832c08c1e1e25455c9a6e835d5949d677298c2d87108a012082440514364c051106304157fe1a47b4010b49f800cc540055f00484444a26545810540b1d45220ae4e088383aa80ad05007340915a0aa1403f0e58039161019a81c4608df0912008a950a", - "prev_randao": "0xfde69470b30e0f171e63ca8a30709e545b4f0372edc45ef6f40b41b4f6659e95", - "block_number": "17477063", - "gas_limit": "30000000", - "gas_used": "13871888", - "timestamp": "1686732083", - "extra_data": "0x6265617665726275696c642e6f7267", - "base_fee_per_gas": "16233757869", - "block_hash": "0x9fc5b74ae5b8a0f7495314c7e6608e524c2ffe8581eca704208066cd922a1fee", - "transactions": [ - "0x", - "0x" - ] - } - } - } - } -} diff --git a/tests/beacon/assets/committees.json b/tests/beacon/assets/committees.json deleted file mode 100644 index b60e2c6..0000000 --- a/tests/beacon/assets/committees.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "execution_optimistic": false, - "data": [ - { - "index": "0", - "slot": "4928000", - "validators": [ - "1", - "2", - "3" - ] - }, - { - "index": "1", - "slot": "4928000", - "validators": [ - "4", - "5", - "6" - ] - }, - { - "index": "0", - "slot": "4928001", - "validators": [ - "7", - "8", - "9" - ] - }, - { - "index": "1", - "slot": "4928001", - "validators": [ - "10", - "11", - "12" - ] - } - ] -} diff --git a/tests/beacon/assets/genesis.json b/tests/beacon/assets/genesis.json deleted file mode 100644 index 2125fef..0000000 --- a/tests/beacon/assets/genesis.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "data": { - "genesis_time": "1590832934", - "genesis_validators_root": "0xcf8e0d4e9587369b2301d0790347320302cc0943d5a1884560367e8208d920f2", - "genesis_fork_version": "0x00000000" - } -} diff --git a/tests/beacon/assets/header.json b/tests/beacon/assets/header.json deleted file mode 100644 index e2ccd78..0000000 --- a/tests/beacon/assets/header.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "execution_optimistic": false, - "finalized": true, - "data": { - "root": "0x22ef4130fc99a4660a90abf1d6dd432645d75ff03c66832f3b91d29eef6c2adb", - "canonical": true, - "header": { - "message": { - "slot": "7523776", - "proposer_index": "498365", - "parent_root": "0x3d7c31af7cfbeec277d1516e0365bcb9cedc2234a9aebede5d7398390ae77589", - "state_root": "0xbc67bbc82cf64174256b0ba109b05fa332769b82c7a79e70d100df40b6bd4e53", - "body_root": "0x7e77fd4f76867c053865f84e55d47fe55a1f035d241d475a2526e7efc5ffdbb6" - }, - "signature": "0x86c1b05725e92502e7f8c460e705678bf72ff123d1f9181cd05ebab20bd3ccd2bda8884f113250a3868cc556c7ab33770d78ad9c62aebe2dbe8d57f5387932d7236a6b87e1aa6770fb84f89af4106d4f9cb7ac3915e45297e3b5078fe2977a47" - } - } -} diff --git a/tests/beacon/assets/liveness_request_beacon_api.json b/tests/beacon/assets/liveness_request_beacon_api.json deleted file mode 100644 index e606865..0000000 --- a/tests/beacon/assets/liveness_request_beacon_api.json +++ /dev/null @@ -1,5 +0,0 @@ -[ - "42", - "44", - "46" -] diff --git a/tests/beacon/assets/liveness_request_lighthouse.json b/tests/beacon/assets/liveness_request_lighthouse.json deleted file mode 100644 index 5447980..0000000 --- a/tests/beacon/assets/liveness_request_lighthouse.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "indices": [ - 42, - 44, - 46 - ], - "epoch": 1664 -} diff --git a/tests/beacon/assets/liveness_request_teku.json b/tests/beacon/assets/liveness_request_teku.json deleted file mode 100644 index 342b971..0000000 --- a/tests/beacon/assets/liveness_request_teku.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "indices": [ - 42, - 44, - 46 - ] -} diff --git a/tests/beacon/assets/liveness_response.json b/tests/beacon/assets/liveness_response.json deleted file mode 100644 index 4f5c99d..0000000 --- a/tests/beacon/assets/liveness_response.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "data": [ - { - "index": "42", - "epoch": "1664", - "is_live": true - }, - { - "index": "44", - "epoch": "1664", - "is_live": false - }, - { - "index": "46", - "epoch": "1664", - "is_live": true - } - ] -} diff --git a/tests/beacon/assets/proposer_duties.json b/tests/beacon/assets/proposer_duties.json deleted file mode 100644 index 459bb1a..0000000 --- a/tests/beacon/assets/proposer_duties.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "dependent_root": "0x6a23256440b627bdb3de50e1bcafa9a5a3efbfcf2976bd3b15139e61f47de8b0", - "data": [ - { - "pubkey": "0x951d69f32685615df304c035151bd596d43bc3250f966e0c777544c506e3035d031afa4a3fcca1b85c41a4a041aefc01", - "validator_index": "382", - "slot": "209344" - }, - { - "pubkey": "0xa0b8e0ef0756255edd80938c4e555a3d992953cd43371915d7a7280dc1bd8433933382919d50a98faad918fc9083bc07", - "validator_index": "1176", - "slot": "209345" - }, - { - "pubkey": "0x825aca3d3dfa1d0b914e59fc3eeab6afcc5dc7e30fccd4879c592da4ea9a4e8a7a1057fc5b3faab12086e587126aa443", - "validator_index": "965", - "slot": "209346" - } - ] -} diff --git a/tests/beacon/assets/rewards.json b/tests/beacon/assets/rewards.json deleted file mode 100644 index b98b50b..0000000 --- a/tests/beacon/assets/rewards.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "execution_optimistic": false, - "data": { - "ideal_rewards": [ - { - "effective_balance": "31000000000", - "head": "2856", - "target": "5511", - "source": "2966" - }, - { - "effective_balance": "32000000000", - "head": "2948", - "target": "5689", - "source": "3062" - } - ], - "total_rewards": [ - { - "validator_index": "8499", - "head": "2948", - "target": "5689", - "source": "3062" - }, - { - "validator_index": "8500", - "head": "0", - "target": "-5707", - "source": "-3073" - } - ] - } -} diff --git a/tests/beacon/assets/validators.json b/tests/beacon/assets/validators.json deleted file mode 100644 index 5998adc..0000000 --- a/tests/beacon/assets/validators.json +++ /dev/null @@ -1,80 +0,0 @@ -{ - "execution_optimistic": false, - "data": [ - { - "index": "0", - "balance": "36016469417", - "status": "active_ongoing", - "validator": { - "pubkey": "0x933ad9491b62059dd065b560d256d8957a8c402cc6e8d8ee7290ae11e8f7329267a8811c397529dac52ae1342ba58c95", - "withdrawal_credentials": "0x00f50428677c60f997aadeab24aabf7fceaef491c96a52b463ae91f95611cf71", - "effective_balance": "32000000000", - "slashed": false, - "activation_eligibility_epoch": "0", - "activation_epoch": "0", - "exit_epoch": "18446744073709551615", - "withdrawable_epoch": "18446744073709551615" - } - }, - { - "index": "1", - "balance": "36287207627", - "status": "pending_queued", - "validator": { - "pubkey": "0xa1d1ad0714035353258038e964ae9675dc0252ee22cea896825c01458e1807bfad2f9969338798548d9858a571f7425c", - "withdrawal_credentials": "0x0092c20062cee70389f1cb4fa566a2be5e2319ff43965db26dbaa3ce90b9df99", - "effective_balance": "32000000000", - "slashed": false, - "activation_eligibility_epoch": "0", - "activation_epoch": "0", - "exit_epoch": "18446744073709551615", - "withdrawable_epoch": "18446744073709551615" - } - }, - { - "index": "2", - "balance": "36116490189", - "status": "active_exiting", - "validator": { - "pubkey": "0xb2ff4716ed345b05dd1dfc6a5a9fa70856d8c75dcc9e881dd2f766d5f891326f0d10e96f3a444ce6c912b69c22c6754d", - "withdrawal_credentials": "0x00d66cf353931500a54cbd0bc59cbaac6690cb0932f42dc8afeddc88feeaad6f", - "effective_balance": "32000000000", - "slashed": false, - "activation_eligibility_epoch": "0", - "activation_epoch": "0", - "exit_epoch": "18446744073709551615", - "withdrawable_epoch": "18446744073709551615" - } - }, - { - "index": "3", - "balance": "35927812769", - "status": "exited_slashed", - "validator": { - "pubkey": "0x8e323fd501233cd4d1b9d63d74076a38de50f2f584b001a5ac2412e4e46adb26d2fb2a6041e7e8c57cd4df0916729219", - "withdrawal_credentials": "0x00d6b91fbbce0146739afb0f541d6c21e8c41e92b97874828f402597bf530ce4", - "effective_balance": "32000000000", - "slashed": false, - "activation_eligibility_epoch": "0", - "activation_epoch": "0", - "exit_epoch": "18446744073709551615", - "withdrawable_epoch": "18446744073709551615" - } - }, - { - "index": "4", - "balance": "36082885671", - "status": "active_ongoing", - "validator": { - "pubkey": "0xa62420543ceef8d77e065c70da15f7b731e56db5457571c465f025e032bbcd263a0990c8749b4ca6ff20d77004454b51", - "withdrawal_credentials": "0x0037ca9a1cf2223d8b9f81a14d4937fef94890ae4fcdfbba928a4dc2ff7fcf3b", - "effective_balance": "32000000000", - "slashed": false, - "activation_eligibility_epoch": "0", - "activation_epoch": "0", - "exit_epoch": "18446744073709551615", - "withdrawable_epoch": "18446744073709551615" - } - } - ] -} diff --git a/tests/beacon/test_get_block.py b/tests/beacon/test_get_block.py deleted file mode 100644 index bb2888b..0000000 --- a/tests/beacon/test_get_block.py +++ /dev/null @@ -1,55 +0,0 @@ -import json -from pathlib import Path - -from pytest import raises -from requests import HTTPError, Response, codes, exceptions -from requests_mock import Mocker - -from eth_validator_watcher.beacon import Beacon, NoBlockError -from tests.beacon import assets - - -def test_get_block_exists() -> None: - block_path = Path(assets.__file__).parent / "block.json" - - with block_path.open() as file_descriptor: - block_dict = json.load(file_descriptor) - - beacon = Beacon("http://beacon-node:5052", 90) - - with Mocker() as mock: - mock.get( - f"http://beacon-node:5052/eth/v2/beacon/blocks/4839775", json=block_dict - ) - block = beacon.get_block(4839775) - assert block.data.message.proposer_index == 365100 - - -def test_get_block_does_not_exist() -> None: - def get(url: str, **_) -> Response: - assert url == "http://beacon-node:5052/eth/v2/beacon/blocks/42" - response = Response() - response.status_code = codes.NOT_FOUND - - raise HTTPError(response=response) - - beacon = Beacon("http://beacon-node:5052", 90) - beacon._Beacon__http.get = get # type: ignore - - with raises(NoBlockError): - beacon.get_block(42) - - -def test_get_block_invalid_request() -> None: - def get(url: str, **_) -> Response: - assert url == "http://beacon-node:5052/eth/v2/beacon/blocks/-42" - response = Response() - response.status_code = codes.INTERNAL_SERVER_ERROR - - raise HTTPError(response=response) - - beacon = Beacon("http://beacon-node:5052", 90) - beacon._Beacon__http.get = get # type: ignore - - with raises(exceptions.RequestException): - beacon.get_block(-42) diff --git a/tests/beacon/test_get_duty_slot_to_committee_index_to_validators_index.py b/tests/beacon/test_get_duty_slot_to_committee_index_to_validators_index.py deleted file mode 100644 index d7236de..0000000 --- a/tests/beacon/test_get_duty_slot_to_committee_index_to_validators_index.py +++ /dev/null @@ -1,34 +0,0 @@ -import json -from pathlib import Path - -import requests_mock - -from eth_validator_watcher.beacon import Beacon -from tests.beacon import assets - - -def test_get_duty_slot_to_committee_index_to_validators_index(): - beacon_url = "http://beacon:5052" - epoch = 154000 - committees_path = Path(assets.__file__).parent / "committees.json" - - expected = { - 4928000: {0: [1, 2, 3], 1: [4, 5, 6]}, - 4928001: {0: [7, 8, 9], 1: [10, 11, 12]}, - } - - with committees_path.open() as file_descriptor: - committees = json.load(file_descriptor) - - with requests_mock.Mocker() as mock: - mock.get( - f"{beacon_url}/eth/v1/beacon/states/head/committees?epoch={epoch}", - json=committees, - ) - - beacon = Beacon(beacon_url, 90) - - assert ( - beacon.get_duty_slot_to_committee_index_to_validators_index(epoch) - == expected - ) diff --git a/tests/beacon/test_get_genesis.py b/tests/beacon/test_get_genesis.py deleted file mode 100644 index 5633e51..0000000 --- a/tests/beacon/test_get_genesis.py +++ /dev/null @@ -1,31 +0,0 @@ -import json -from pathlib import Path - -import requests_mock - -from eth_validator_watcher.beacon import Beacon -from eth_validator_watcher.models import Genesis -from tests.beacon import assets - - -def test_get_genesis(): - beacon_url = "http://beacon:5052" - genesis_path = Path(assets.__file__).parent / "genesis.json" - - with genesis_path.open() as file_descriptor: - genesis = json.load(file_descriptor) - - expected = Genesis( - data=Genesis.Data( - genesis_time=1590832934, - ) - ) - - with requests_mock.Mocker() as mock: - mock.get( - f"{beacon_url}/eth/v1/beacon/genesis", - json=genesis, - ) - beacon = Beacon(beacon_url, 90) - - assert beacon.get_genesis() == expected diff --git a/tests/beacon/test_get_header.py b/tests/beacon/test_get_header.py deleted file mode 100644 index 3008110..0000000 --- a/tests/beacon/test_get_header.py +++ /dev/null @@ -1,64 +0,0 @@ -import json -from pathlib import Path - -from pytest import raises -from requests import HTTPError, Response, codes, exceptions -from requests_mock import Mocker - -from eth_validator_watcher.beacon import Beacon, NoBlockError -from eth_validator_watcher.models import BlockIdentierType, Header -from tests.beacon import assets - - -def test_get_header_exists() -> None: - block_path = Path(assets.__file__).parent / "header.json" - - with block_path.open() as file_descriptor: - header_dict = json.load(file_descriptor) - - beacon = Beacon("http://beacon-node:5052", 90) - - for identifier, value in { - "head": BlockIdentierType.HEAD, - "genesis": BlockIdentierType.GENESIS, - "finalized": BlockIdentierType.FINALIZED, - 7523776: 7523776, - }.items(): - with Mocker() as mock: - mock.get( - f"http://beacon-node:5052/eth/v1/beacon/headers/{identifier}", - json=header_dict, - ) - header = beacon.get_header(value) - - assert header.data.header.message.slot == 7523776 - - -def test_get_header_does_not_exist() -> None: - def get(url: str, **_) -> Response: - assert url == "http://beacon-node:5052/eth/v1/beacon/headers/42" - response = Response() - response.status_code = codes.NOT_FOUND - - raise HTTPError(response=response) - - beacon = Beacon("http://beacon-node:5052", 90) - beacon._Beacon__http.get = get # type: ignore - - with raises(NoBlockError): - beacon.get_header(42) - - -def test_get_header_invalid_query() -> None: - def get(url: str, **_) -> Response: - assert url == "http://beacon-node:5052/eth/v1/beacon/headers/-42" - response = Response() - response.status_code = codes.INTERNAL_SERVER_ERROR - - raise HTTPError(response=response) - - beacon = Beacon("http://beacon-node:5052", 90) - beacon._Beacon__http.get = get # type: ignore - - with raises(exceptions.RequestException): - beacon.get_header(-42) diff --git a/tests/beacon/test_get_proposer_duties.py b/tests/beacon/test_get_proposer_duties.py deleted file mode 100644 index d080729..0000000 --- a/tests/beacon/test_get_proposer_duties.py +++ /dev/null @@ -1,47 +0,0 @@ -import json -from pathlib import Path - -from requests_mock import Mocker - -from eth_validator_watcher.beacon import Beacon -from eth_validator_watcher.models import ProposerDuties -from tests.beacon import assets - - -def test_(): - beacon_url = "http://beacon:5052" - - proposer_duties_path = Path(assets.__file__).parent / "proposer_duties.json" - - with proposer_duties_path.open() as file_descriptor: - proposer_duties = json.load(file_descriptor) - - expected = ProposerDuties( - dependent_root="0x6a23256440b627bdb3de50e1bcafa9a5a3efbfcf2976bd3b15139e61f47de8b0", - data=[ - ProposerDuties.Data( - pubkey="0x951d69f32685615df304c035151bd596d43bc3250f966e0c777544c506e3035d031afa4a3fcca1b85c41a4a041aefc01", - validator_index=382, - slot=209344, - ), - ProposerDuties.Data( - pubkey="0xa0b8e0ef0756255edd80938c4e555a3d992953cd43371915d7a7280dc1bd8433933382919d50a98faad918fc9083bc07", - validator_index=1176, - slot=209345, - ), - ProposerDuties.Data( - pubkey="0x825aca3d3dfa1d0b914e59fc3eeab6afcc5dc7e30fccd4879c592da4ea9a4e8a7a1057fc5b3faab12086e587126aa443", - validator_index=965, - slot=209346, - ), - ], - ) - - with Mocker() as mock: - mock.get( - f"{beacon_url}/eth/v1/validator/duties/proposer/6542", json=proposer_duties - ) - - beacon = Beacon(beacon_url, 90) - - assert beacon.get_proposer_duties(6542) == expected diff --git a/tests/beacon/test_get_rewards.py b/tests/beacon/test_get_rewards.py deleted file mode 100644 index 3342ae8..0000000 --- a/tests/beacon/test_get_rewards.py +++ /dev/null @@ -1,62 +0,0 @@ -import json -from pathlib import Path - -from requests_mock import Mocker - -from eth_validator_watcher.beacon import Beacon -from eth_validator_watcher.models import BeaconType, Rewards -from tests.beacon import assets - - -def test_get_rewards_not_supported() -> None: - beacon = Beacon("http://beacon-node:5052", 90) - - expected = Rewards(data=Rewards.Data(ideal_rewards=[], total_rewards=[])) - - actual = beacon.get_rewards(BeaconType.OLD_PRYSM, 42, {8499, 8500}) - assert expected == actual - - actual = beacon.get_rewards(BeaconType.NIMBUS, 42, {8499, 8500}) - assert expected == actual - - -def test_get_rewards() -> None: - rewards_path = Path(assets.__file__).parent / "rewards.json" - - with rewards_path.open() as file_descriptor: - rewards_dict = json.load(file_descriptor) - - beacon = Beacon("http://beacon-node:5052", 90) - - def match_request(request) -> bool: - return request.json() == ["8499", "8500"] - - expected = Rewards( - data=Rewards.Data( - ideal_rewards=[ - Rewards.Data.IdealReward( - effective_balance=31000000000, head=2856, target=5511, source=2966 - ), - Rewards.Data.IdealReward( - effective_balance=32000000000, head=2948, target=5689, source=3062 - ), - ], - total_rewards=[ - Rewards.Data.TotalReward( - validator_index=8499, head=2948, target=5689, source=3062 - ), - Rewards.Data.TotalReward( - validator_index=8500, head=0, target=-5707, source=-3073 - ), - ], - ) - ) - - with Mocker() as mock: - mock.post( - f"http://beacon-node:5052/eth/v1/beacon/rewards/attestations/42", - additional_matcher=match_request, - json=rewards_dict, - ) - - assert beacon.get_rewards(BeaconType.LIGHTHOUSE, 42, {8499, 8500}) == expected diff --git a/tests/beacon/test_get_status_to_index_to_validator.py b/tests/beacon/test_get_status_to_index_to_validator.py deleted file mode 100644 index 13a1019..0000000 --- a/tests/beacon/test_get_status_to_index_to_validator.py +++ /dev/null @@ -1,65 +0,0 @@ -import json -from pathlib import Path - -from requests_mock import Mocker - -from eth_validator_watcher.beacon import Beacon -from eth_validator_watcher.models import Validators -from tests.beacon import assets - -StatusEnum = Validators.DataItem.StatusEnum -Validator = Validators.DataItem.Validator - - -def test_get_status_to_index_to_validator() -> None: - asset_path = Path(assets.__file__).parent / "validators.json" - - with asset_path.open() as file_descriptor: - validators = json.load(file_descriptor) - - beacon = Beacon("http://localhost:5052", 90) - expected = { - StatusEnum.activeOngoing: { - 0: Validator( - pubkey="0x933ad9491b62059dd065b560d256d8957a8c402cc6e8d8ee7290ae11e8f7329267a8811c397529dac52ae1342ba58c95", - effective_balance=32000000000, - slashed=False, - ), - 4: Validator( - pubkey="0xa62420543ceef8d77e065c70da15f7b731e56db5457571c465f025e032bbcd263a0990c8749b4ca6ff20d77004454b51", - effective_balance=32000000000, - slashed=False, - ), - }, - StatusEnum.pendingQueued: { - 1: Validator( - pubkey="0xa1d1ad0714035353258038e964ae9675dc0252ee22cea896825c01458e1807bfad2f9969338798548d9858a571f7425c", - effective_balance=32000000000, - slashed=False, - ), - }, - StatusEnum.activeExiting: { - 2: Validator( - pubkey="0xb2ff4716ed345b05dd1dfc6a5a9fa70856d8c75dcc9e881dd2f766d5f891326f0d10e96f3a444ce6c912b69c22c6754d", - effective_balance=32000000000, - slashed=False, - ), - }, - StatusEnum.exitedSlashed: { - 3: Validator( - pubkey="0x8e323fd501233cd4d1b9d63d74076a38de50f2f584b001a5ac2412e4e46adb26d2fb2a6041e7e8c57cd4df0916729219", - effective_balance=32000000000, - slashed=False, - ) - }, - } - - with Mocker() as mock: - mock.get( - "http://localhost:5052/eth/v1/beacon/states/head/validators", - json=validators, - ) - - actual = beacon.get_status_to_index_to_validator() - - assert expected == actual diff --git a/tests/beacon/test_get_validators_liveness.py b/tests/beacon/test_get_validators_liveness.py deleted file mode 100644 index a3eca80..0000000 --- a/tests/beacon/test_get_validators_liveness.py +++ /dev/null @@ -1,163 +0,0 @@ -import json -from pathlib import Path - -from eth_validator_watcher.beacon import Beacon -from eth_validator_watcher.models import BeaconType -from pytest import raises -from requests import HTTPError, Response, codes -from requests_mock import Mocker -from tests.beacon import assets - - -def test_get_validators_liveness_lighthouse(): - beacon_url = "http://beacon:5052" - - liveness_request_path = ( - Path(assets.__file__).parent / "liveness_request_lighthouse.json" - ) - - liveness_response_path = Path(assets.__file__).parent / "liveness_response.json" - - with liveness_request_path.open() as file_descriptor: - liveness_request = json.load(file_descriptor) - - with liveness_response_path.open() as file_descriptor: - liveness_response = json.load(file_descriptor) - - def match_request(request) -> bool: - return request.json() == liveness_request - - with Mocker() as mock: - mock.post( - f"{beacon_url}/lighthouse/liveness", - additional_matcher=match_request, - json=liveness_response, - ) - beacon = Beacon(beacon_url, 90) - expected = {42: True, 44: False, 46: True} - - assert ( - beacon.get_validators_liveness( - beacon_type=BeaconType.LIGHTHOUSE, - epoch=1664, - validators_index={42, 44, 46}, - ) - == expected - ) - - -def test_get_validators_liveness_nimbus(): - beacon_url = "http://beacon:5052" - beacon = Beacon(beacon_url, 90) - - assert beacon.get_validators_liveness( - beacon_type=BeaconType.NIMBUS, epoch=1664, validators_index={42, 44, 46} - ) == {42: True, 44: True, 46: True} - - -def test_get_validators_liveness_teku(): - beacon_url = "http://beacon:5052" - - liveness_request_path = Path(assets.__file__).parent / "liveness_request_teku.json" - liveness_response_path = Path(assets.__file__).parent / "liveness_response.json" - - with liveness_request_path.open() as file_descriptor: - liveness_request = json.load(file_descriptor) - - with liveness_response_path.open() as file_descriptor: - liveness_response = json.load(file_descriptor) - - def match_request(request) -> bool: - return request.json() == liveness_request - - with Mocker() as mock: - mock.post( - f"{beacon_url}/eth/v1/validator/liveness/1664", - additional_matcher=match_request, - json=liveness_response, - ) - beacon = Beacon(beacon_url, 90) - expected = {42: True, 44: False, 46: True} - - assert ( - beacon.get_validators_liveness( - beacon_type=BeaconType.OLD_TEKU, - epoch=1664, - validators_index={42, 44, 46}, - ) - == expected - ) - - -def test_get_validators_liveness_beacon_api(): - beacon_url = "http://beacon:5052" - - liveness_request_path = ( - Path(assets.__file__).parent / "liveness_request_beacon_api.json" - ) - - liveness_response_path = Path(assets.__file__).parent / "liveness_response.json" - - with liveness_request_path.open() as file_descriptor: - liveness_request = json.load(file_descriptor) - - with liveness_response_path.open() as file_descriptor: - liveness_response = json.load(file_descriptor) - - def match_request(request) -> bool: - return request.json() == liveness_request - - with Mocker() as mock: - mock.post( - f"{beacon_url}/eth/v1/validator/liveness/1664", - additional_matcher=match_request, - json=liveness_response, - ) - beacon = Beacon(beacon_url, 90) - expected = {42: True, 44: False, 46: True} - - assert ( - beacon.get_validators_liveness( - beacon_type=BeaconType.OTHER, epoch=1664, validators_index={42, 44, 46} - ) - == expected - ) - - -def test_get_validators_liveness_beacon_api_bad_request(): - beacon_url = "http://beacon:5052" - - def post(url: str, **_) -> Response: - assert url == f"{beacon_url}/eth/v1/validator/liveness/1664" - response = Response() - response.status_code = codes.bad_request - - return response - - beacon = Beacon(beacon_url, 90) - beacon._Beacon__http_retry_not_found.post = post # type: ignore - - expected = {42: True, 44: True, 46: True} - - assert expected == beacon.get_validators_liveness( - beacon_type=BeaconType.OTHER, epoch=1664, validators_index={42, 44, 46} - ) - - -def test_get_validators_liveness_beacon_api_no_extended(): - beacon_url = "http://beacon:5052" - - def post(url: str, **_) -> Response: - assert url == f"{beacon_url}/eth/v1/validator/liveness/1664" - response = Response() - response.status_code = codes.not_extended - - return response - - beacon = Beacon(beacon_url, 90) - beacon._Beacon__http_retry_not_found.post = post # type: ignore - - with raises(HTTPError): - beacon.get_validators_liveness( - beacon_type=BeaconType.OTHER, epoch=1664, validators_index={42, 44, 46} - ) diff --git a/tests/beacon/test_potential_block.py b/tests/beacon/test_potential_block.py deleted file mode 100644 index 8109bce..0000000 --- a/tests/beacon/test_potential_block.py +++ /dev/null @@ -1,24 +0,0 @@ -from eth_validator_watcher.beacon import Beacon, NoBlockError -from eth_validator_watcher.models import Block - - -def test_get_block_exists() -> None: - def get_block(slot: int) -> Block: - assert slot == 42 - return "a fake block" # type: ignore - - beacon = Beacon("http://beacon-node:5052", 90) - beacon.get_block = get_block # type: ignore - - assert beacon.get_potential_block(42) == "a fake block" - - -def test_get_block_not_exists() -> None: - def get_block(slot: int) -> Block: - assert slot == 42 - raise NoBlockError - - beacon = Beacon("http://beacon-node:5052", 90) - beacon.get_block = get_block # type: ignore - - assert beacon.get_potential_block(42) is None diff --git a/tests/coinbase/test_emit_eth_usd_conversion_rate.py b/tests/coinbase/test_emit_eth_usd_conversion_rate.py deleted file mode 100644 index 2aefc0d..0000000 --- a/tests/coinbase/test_emit_eth_usd_conversion_rate.py +++ /dev/null @@ -1,47 +0,0 @@ -from requests_mock import Mocker - -from eth_validator_watcher.coinbase import Coinbase, metric_eth_usd_gauge - - -def test_emit_eth_usd_conversion_rate_success() -> None: - coinbase = Coinbase() - - with Mocker() as mock: - mock.get( - "https://api.pro.coinbase.com/products/ETH-USD/trades?limit=1", - json=[ - { - "time": "2023-05-25T15:56:17.463034Z", - "trade_id": 452598471, - "price": "1791.86000000", - "size": "1.21500994", - "side": "sell", - } - ], - ) - - coinbase.emit_eth_usd_conversion_rate() - assert metric_eth_usd_gauge.collect()[0].samples[0].value == 1791.86 # type: ignore - - -def test_emit_eth_usd_conversion_rate_error() -> None: - coinbase = Coinbase() - - with Mocker() as mock: - mock.get( - "https://api.pro.coinbase.com/products/ETH-USD/trades?limit=1", - json=[ - { - "time": "2023-05-25T15:56:17.463034Z", - "trade_id": 452598471, - "NOT A PRICE": "1791.86000000", - "size": "1.21500994", - "side": "sell", - } - ], - ) - - coinbase.emit_eth_usd_conversion_rate() - - # We do not assert nothing special here. We just want to make sure that - # `emit_eth_usd_conversion_rate` does not raise any exception. diff --git a/tests/config/__init__.py b/tests/config/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/config/assets/__init__.py b/tests/config/assets/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/config/assets/config.empty.yaml b/tests/config/assets/config.empty.yaml deleted file mode 100644 index e69de29..0000000 diff --git a/tests/config/assets/config.null.yaml b/tests/config/assets/config.null.yaml deleted file mode 100644 index 7adb329..0000000 --- a/tests/config/assets/config.null.yaml +++ /dev/null @@ -1,9 +0,0 @@ -beacon_url: ~ -execution_url: ~ -web3signer_url: ~ -default_fee_recipient: ~ -slack_channel: ~ -slack_token: ~ -relays: ~ -liveness_file: ~ -watched_keys: ~ diff --git a/tests/config/assets/config.yaml b/tests/config/assets/config.yaml deleted file mode 100644 index bdb309a..0000000 --- a/tests/config/assets/config.yaml +++ /dev/null @@ -1,19 +0,0 @@ -# Example config file for the Ethereum watcher. - -beacon_url: http://localhost:5051/ -beacon_type: other -beacon_timeout_sec: 90 -execution_url: http://localhost:8545/ -web3signer_url: http://web3signer:9000/ -default_fee_recipient: '0x41bF25fC8C52d292bD66D3BCEcd8a919ecB9EF88' -slack_channel: '#ethereum-monitoring' -slack_token: 'secret' -relays: - - http://relay1 - - http://relay2 -liveness_file: /tmp/i-am-alive - -watched_keys: - - public_key: '0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3' - labels: ["google"] - fee_recipient: ~ diff --git a/tests/config/test_load_config.py b/tests/config/test_load_config.py deleted file mode 100644 index 1711e5f..0000000 --- a/tests/config/test_load_config.py +++ /dev/null @@ -1,92 +0,0 @@ -import os - -from pathlib import Path -from eth_validator_watcher.config import load_config, WatchedKeyConfig -from eth_validator_watcher.models import BeaconType -from tests.config import assets - - -def test_null_config() -> None: - path = Path(assets.__file__).parent / "config.null.yaml" - config = load_config(path) - - assert config.beacon_url is None - assert config.beacon_timeout_sec == 90 - assert config.execution_url is None - assert config.web3signer_url is None - assert config.default_fee_recipient is None - assert config.slack_channel is None - assert config.slack_token is None - assert config.beacon_type == BeaconType.OTHER - assert config.relays is None - assert config.liveness_file is None - assert config.watched_keys is None - - -def test_empty_config() -> None: - path = Path(assets.__file__).parent / "config.empty.yaml" - config = load_config(path) - - assert config.beacon_url is None - assert config.beacon_timeout_sec == 90 - assert config.execution_url is None - assert config.web3signer_url is None - assert config.default_fee_recipient is None - assert config.slack_channel is None - assert config.slack_token is None - assert config.beacon_type == BeaconType.OTHER - assert config.relays is None - assert config.liveness_file is None - assert config.watched_keys is None - - -def test_filled_config() -> None: - path = Path(assets.__file__).parent / "config.yaml" - config = load_config(path) - - assert config.beacon_url == 'http://localhost:5051/' - assert config.beacon_timeout_sec == 90 - assert config.execution_url == 'http://localhost:8545/' - assert config.web3signer_url == 'http://web3signer:9000/' - assert config.default_fee_recipient == '0x41bF25fC8C52d292bD66D3BCEcd8a919ecB9EF88' - assert config.slack_channel == '#ethereum-monitoring' - assert config.slack_token == 'secret' - assert config.beacon_type == BeaconType.OTHER - assert config.relays == ['http://relay1', 'http://relay2'] - assert config.liveness_file == '/tmp/i-am-alive' - - assert [k.public_key for k in config.watched_keys] == ['0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3'] - - -def test_filled_config_overriden() -> None: - environ = os.environ.copy() - - os.environ['eth_watcher_beacon_url'] = 'http://override-beacon/' - os.environ['eth_watcher_beacon_timeout_sec'] = '42' - os.environ['eth_watcher_execution_url'] = 'http://override-exec/' - os.environ['eth_watcher_web3signer_url'] = 'http://override-web3signer/' - os.environ['eth_watcher_default_fee_recipient'] = '0x42' - os.environ['eth_watcher_slack_channel'] = '#ethereum-monitoring-override' - os.environ['eth_watcher_slack_token'] = 'secret-override' - os.environ['eth_watcher_beacon_type'] = 'nimbus' - os.environ['eth_watcher_relays'] = '["http://overriden-relay-1" ,"http://overriden-relay-2"]' - os.environ['eth_watcher_liveness_file'] = '/tmp/override-liveness-file' - - path = Path(assets.__file__).parent / "config.yaml" - config = load_config(path) - - assert config.beacon_url == 'http://override-beacon/' - assert config.beacon_timeout_sec == 42 - assert config.execution_url == 'http://override-exec/' - assert config.web3signer_url == 'http://override-web3signer/' - assert config.default_fee_recipient == '0x42' - assert config.slack_channel == '#ethereum-monitoring-override' - assert config.slack_token == 'secret-override' - assert config.beacon_type == BeaconType.NIMBUS - assert config.relays == ['http://overriden-relay-1' ,'http://overriden-relay-2'] - assert config.liveness_file == '/tmp/override-liveness-file' - - assert [k.public_key for k in config.watched_keys] == ['0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3'] - - os.environ.clear() - os.environ.update(environ) diff --git a/tests/entry_queue/test_compute_duration_sec.py b/tests/entry_queue/test_compute_duration_sec.py deleted file mode 100644 index 940cac0..0000000 --- a/tests/entry_queue/test_compute_duration_sec.py +++ /dev/null @@ -1,13 +0,0 @@ -from eth_validator_watcher.entry_queue import NB_SECONDS_PER_EPOCH, compute_duration_sec - - -def test_compute_duration_sec_buckets_differ() -> None: - assert ( - compute_duration_sec(327_678, 589_826 - 327_678) - == (2 // 4 + 65536 // 5 + 65536 // 6 + 65536 // 7 + 65536 // 8 + 3 // 9) - * NB_SECONDS_PER_EPOCH - ) - - -def test_compute_duration_sec_buckets_same() -> None: - assert compute_duration_sec(4, 9) == 2 * NB_SECONDS_PER_EPOCH diff --git a/tests/entry_queue/test_compute_validators_churn.py b/tests/entry_queue/test_compute_validators_churn.py deleted file mode 100644 index aee7eb1..0000000 --- a/tests/entry_queue/test_compute_validators_churn.py +++ /dev/null @@ -1,8 +0,0 @@ -from eth_validator_watcher.entry_queue import compute_validators_churn - - -def test_compute_validators_churn() -> None: - assert compute_validators_churn(0) == 4 - assert compute_validators_churn(327_679) == 4 - assert compute_validators_churn(327_680) == 5 - assert compute_validators_churn(478_816) == 7 diff --git a/tests/entry_queue/test_export_duration_sec.py b/tests/entry_queue/test_export_duration_sec.py deleted file mode 100644 index cb903b1..0000000 --- a/tests/entry_queue/test_export_duration_sec.py +++ /dev/null @@ -1,9 +0,0 @@ -from eth_validator_watcher.entry_queue import ( - metric_entry_queue_duration_sec, - export_duration_sec, -) - - -def test_export_duration_sec() -> None: - export_duration_sec(0, 8) - assert metric_entry_queue_duration_sec.collect()[0].samples[0].value == 768 # type: ignore diff --git a/tests/entry_queue/test_get_bucket_index.py b/tests/entry_queue/test_get_bucket_index.py deleted file mode 100644 index b7efa6c..0000000 --- a/tests/entry_queue/test_get_bucket_index.py +++ /dev/null @@ -1,15 +0,0 @@ -from pytest import raises - -from eth_validator_watcher.entry_queue import get_bucket_index - - -def test_get_bucket_index_nominal() -> None: - assert get_bucket_index(0) == 0 - assert get_bucket_index(327_679) == 0 - assert get_bucket_index(327_680) == 1 - assert get_bucket_index(1_310_719) == 15 - - -def test_get_bucket_index_raise() -> None: - with raises(RuntimeError): - get_bucket_index(3_000_000) diff --git a/tests/entrypoint/assets/__init__.py b/tests/entrypoint/assets/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/entrypoint/assets/invalid_config.yaml b/tests/entrypoint/assets/invalid_config.yaml deleted file mode 100644 index 264ce10..0000000 --- a/tests/entrypoint/assets/invalid_config.yaml +++ /dev/null @@ -1 +0,0 @@ -beacon_type: 42 diff --git a/tests/entrypoint/test__handler.py b/tests/entrypoint/test__handler.py deleted file mode 100644 index e0879c8..0000000 --- a/tests/entrypoint/test__handler.py +++ /dev/null @@ -1,353 +0,0 @@ -from os import environ -from pathlib import Path -from typing import Iterator, List, Optional, Tuple - -from freezegun import freeze_time -from pytest import raises -from typer import BadParameter - -from eth_validator_watcher import entrypoint -from eth_validator_watcher.config import WatchedKeyConfig -from eth_validator_watcher.entrypoint import handler, _handler -from eth_validator_watcher.models import BeaconType, Genesis, Validators -from eth_validator_watcher.utils import LimitedDict, Slack -from eth_validator_watcher.web3signer import Web3Signer -from tests.entrypoint import assets - -StatusEnum = Validators.DataItem.StatusEnum -Validator = Validators.DataItem.Validator - - -def test_fee_recipient_set_while_execution_url_not_set() -> None: - with raises(BadParameter): - _handler( - beacon_url="", - beacon_timeout_sec=90, - execution_url=None, - watched_keys=None, - web3signer_url=None, - default_fee_recipient="something", - slack_channel="MY SLACK CHANNEL", - slack_token=None, - beacon_type=BeaconType.OLD_TEKU, - relays_url=[], - liveness_file=None, - ) - - -def test_fee_recipient_not_valid() -> None: - with raises(BadParameter): - _handler( - beacon_url="", - beacon_timeout_sec=90, - execution_url="http://localhost:8545", - watched_keys=None, - web3signer_url=None, - default_fee_recipient="something", - slack_channel="MY SLACK CHANNEL", - slack_token=None, - beacon_type=BeaconType.OLD_TEKU, - relays_url=[], - liveness_file=None, - ) - - -def test_slack_token_not_defined() -> None: - with raises(BadParameter): - _handler( - beacon_url="", - beacon_timeout_sec=90, - execution_url=None, - watched_keys=None, - web3signer_url=None, - default_fee_recipient=None, - slack_channel="MY SLACK CHANNEL", - slack_token=None, - beacon_type=BeaconType.OLD_TEKU, - relays_url=[], - liveness_file=None, - ) - - - -def test_chain_not_ready() -> None: - class Beacon: - def __init__(self, url: str, timeout_sec: int) -> None: - assert url == "http://localhost:5052" - assert timeout_sec == 90 - - def get_genesis(self) -> Genesis: - return Genesis( - data=Genesis.Data( - genesis_time=0, - ) - ) - - def get_our_pubkeys(pubkeys_file_path: Path, web3signer: None) -> set[str]: - return {"0x12345", "0x67890"} - - def slots(genesis_time: int) -> Iterator[Tuple[(int, int)]]: - assert genesis_time == 0 - yield -32, 1664 - - def convert_seconds_to_dhms(seconds: int) -> Tuple[int, int, int, int]: - assert seconds == 384 - return 42, 42, 42, 42 - - def write_liveness_file(liveness_file: Path) -> None: - assert liveness_file == Path("/path/to/liveness") - - def start_http_server(_: int) -> None: - pass - - entrypoint.get_our_pubkeys = get_our_pubkeys - entrypoint.Beacon = Beacon - entrypoint.slots = slots - entrypoint.convert_seconds_to_dhms = convert_seconds_to_dhms - entrypoint.write_liveness_file = write_liveness_file - entrypoint.start_http_server = start_http_server - - _handler( - beacon_url="http://localhost:5052", - beacon_timeout_sec=90, - execution_url=None, - watched_keys=None, - web3signer_url=None, - default_fee_recipient=None, - slack_channel=None, - slack_token=None, - beacon_type=BeaconType.OLD_TEKU, - relays_url=[], - liveness_file=Path("/path/to/liveness"), - ) - - -@freeze_time("2023-01-01 00:00:00", auto_tick_seconds=15) -def test_nominal() -> None: - class Beacon: - def __init__(self, url: str, timeout_sec: int) -> None: - assert url == "http://localhost:5052" - assert timeout_sec == 90 - - def get_genesis(self) -> Genesis: - return Genesis( - data=Genesis.Data( - genesis_time=0, - ) - ) - - def get_status_to_index_to_validator( - self, - ) -> dict[StatusEnum, dict[int, Validator]]: - return { - StatusEnum.activeOngoing: { - 0: Validator( - pubkey="0xaaa", effective_balance=32000000000, slashed=False - ), - 2: Validator( - pubkey="0xccc", effective_balance=32000000000, slashed=False - ), - 4: Validator( - pubkey="0xeee", effective_balance=32000000000, slashed=False - ), - }, - StatusEnum.pendingQueued: { - 1: Validator( - pubkey="0xbbb", effective_balance=32000000000, slashed=False - ), - 3: Validator( - pubkey="0xddd", effective_balance=32000000000, slashed=False - ), - }, - StatusEnum.exitedSlashed: { - 5: Validator( - pubkey="0xfff", effective_balance=32000000000, slashed=True - ), - 6: Validator( - pubkey="0xggg", effective_balance=32000000000, slashed=True - ), - }, - } - - def get_potential_block(self, slot: int) -> str | None: - assert slot in {63, 64} - return "A BLOCK" - - class Coinbase: - nb_calls = 0 - - @classmethod - def emit_eth_usd_conversion_rate(cls) -> None: - cls.nb_calls += 1 - - class Relays: - def __init__(self, urls: list[str]) -> None: - assert urls == ["http://my-awesome-relay.com"] - - def process(self, slot: int) -> None: - assert slot in {63, 64} - - def slots(genesis_time: int) -> Iterator[Tuple[(int, int)]]: - assert genesis_time == 0 - yield 63, 1664 - yield 64, 1676 - - def get_our_pubkeys(watched_keys: List[WatchedKeyConfig], web3signer: Web3Signer) -> set[str]: - assert watched_keys == [WatchedKeyConfig(public_key="0xfff")] - assert isinstance(web3signer, Web3Signer) - - return {"0xaaa", "0xbbb", "0xccc", "0xddd", "0xeee", "0xfff"} - - def process_missed_attestations( - beacon: Beacon, - beacon_type: BeaconType, - epoch_to_index_to_validator_index: LimitedDict, - epoch: int, - ) -> set[int]: - assert isinstance(beacon, Beacon) - assert beacon_type is BeaconType.OLD_TEKU - assert epoch_to_index_to_validator_index[1] == { - 0: Validator(pubkey="0xaaa", effective_balance=32000000000, slashed=False), - 2: Validator(pubkey="0xccc", effective_balance=32000000000, slashed=False), - 4: Validator(pubkey="0xeee", effective_balance=32000000000, slashed=False), - } - assert epoch == 1 - - return {0, 4} - - def process_double_missed_attestations( - indexes_that_missed_attestation: set[int], - indexes_that_previously_missed_attestation: set[int], - epoch_to_index_to_validator_index: LimitedDict, - epoch: int, - slack: Slack, - ) -> set[int]: - assert indexes_that_missed_attestation == {0, 4} - assert indexes_that_previously_missed_attestation == set() - assert epoch_to_index_to_validator_index[1] == { - 0: Validator(pubkey="0xaaa", effective_balance=32000000000, slashed=False), - 2: Validator(pubkey="0xccc", effective_balance=32000000000, slashed=False), - 4: Validator(pubkey="0xeee", effective_balance=32000000000, slashed=False), - } - assert epoch == 1 - assert isinstance(slack, Slack) - - return {4} - - def process_future_blocks_proposal( - beacon: Beacon, pubkeys: set[str], slot: int, is_new_epoch: bool - ) -> int: - assert isinstance(beacon, Beacon) - assert pubkeys == {"0xaaa", "0xbbb", "0xccc", "0xddd", "0xeee", "0xfff"} - assert slot in {63, 64} - assert is_new_epoch is True - - return 1 - - def process_missed_blocks_finalized( - beacon: Beacon, - last_processed_finalized_slot: int, - slot: int, - pubkeys: set[str], - slack: Slack, - ) -> int: - assert isinstance(beacon, Beacon) - assert last_processed_finalized_slot == 63 - assert slot in {63, 64} - assert pubkeys == {"0xaaa", "0xbbb", "0xccc", "0xddd", "0xeee", "0xfff"} - assert isinstance(slack, Slack) - - return 63 - - def process_suboptimal_attestations( - beacon: Beacon, - potential_block: str | None, - slot: int, - index_to_validator: dict[int, Validator], - ) -> set[int]: - assert isinstance(beacon, Beacon) - assert potential_block == "A BLOCK" - assert slot in {63, 64} - assert index_to_validator == { - 0: Validator(pubkey="0xaaa", effective_balance=32000000000, slashed=False), - 2: Validator(pubkey="0xccc", effective_balance=32000000000, slashed=False), - 4: Validator(pubkey="0xeee", effective_balance=32000000000, slashed=False), - } - - return {0} - - def process_missed_blocks( - beacon: Beacon, - potential_block: str | None, - slot: int, - pubkeys: set[str], - slack: Slack, - ) -> bool: - assert isinstance(beacon, Beacon) - assert potential_block == "A BLOCK" - assert slot in {63, 64} - assert pubkeys == {"0xaaa", "0xbbb", "0xccc", "0xddd", "0xeee", "0xfff"} - assert isinstance(slack, Slack) - - return True - - def process_rewards( - beacon: Beacon, - beacon_type: BeaconType, - epoch: int, - net_epoch2active_idx2val: dict[int, Validator], - our_epoch2active_idx2val: dict[int, Validator], - ) -> None: - assert isinstance(beacon, Beacon) - assert isinstance(beacon_type, BeaconType) - assert epoch == 1 - assert net_epoch2active_idx2val[1] == { - 0: Validator(pubkey="0xaaa", effective_balance=32000000000, slashed=False), - 2: Validator(pubkey="0xccc", effective_balance=32000000000, slashed=False), - 4: Validator(pubkey="0xeee", effective_balance=32000000000, slashed=False), - } - - def write_liveness_file(liveness_file: Path) -> None: - assert liveness_file == Path("/path/to/liveness") - - entrypoint.Beacon = Beacon # type: ignore - entrypoint.Coinbase = Coinbase # type: ignore - entrypoint.Web3Signer = Web3Signer # type: ignore - entrypoint.Relays = Relays # type: ignore - entrypoint.get_our_pubkeys = get_our_pubkeys # type: ignore - entrypoint.process_missed_attestations = process_missed_attestations # type: ignore - - entrypoint.process_double_missed_attestations = ( - process_double_missed_attestations # type:ignore - ) - - entrypoint.slots = slots # type: ignore - entrypoint.process_future_blocks_proposal = process_future_blocks_proposal # type: ignore - entrypoint.process_missed_blocks_finalized = process_missed_blocks_finalized # type: ignore - entrypoint.process_suboptimal_attestations = process_suboptimal_attestations # type: ignore - entrypoint.process_missed_blocks_head = process_missed_blocks # type: ignore - entrypoint.process_rewards = process_rewards # type: ignore - entrypoint.write_liveness_file = write_liveness_file # type: ignore - - _handler( - beacon_url="http://localhost:5052", - beacon_timeout_sec=90, - execution_url=None, - watched_keys=[WatchedKeyConfig(public_key="0xfff")], - web3signer_url="http://localhost:9000", - default_fee_recipient=None, - slack_channel="my slack channel", - slack_token="my_slack_token", - beacon_type=BeaconType.OLD_TEKU, - relays_url=["http://my-awesome-relay.com"], - liveness_file=Path("/path/to/liveness"), - ) - - assert Coinbase.nb_calls == 2 - - -def test_invalid_config() -> None: - path = Path(assets.__file__).parent / "invalid_config.yaml" - - with raises(BadParameter): - handler(path) diff --git a/tests/execution/__init__.py b/tests/execution/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/execution/assets/__init__.py b/tests/execution/assets/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/execution/assets/block.json b/tests/execution/assets/block.json deleted file mode 100644 index aa16f47..0000000 --- a/tests/execution/assets/block.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "jsonrpc": "2.0", - "id": 1, - "result": { - "transactions": [ - { - "blockHash": "0x963239e3b325016690703704b95d8ed8ab58d268eb31654d48b278e187ff6771", - "blockNumber": "0x10aa0e3", - "from": "0x2759bc7b8f9f2b47eeeffb2f5751e0cff3ff1ad8", - "gas": "0x249f0", - "gasPrice": "0x374c292b2", - "maxFeePerGas": "0x7471deff4", - "maxPriorityFeePerGas": "0x4d3f640", - "hash": "0xdedc7e577b6e84727edd683a447c8a9b684bfd0ddaaf3110050f37c750ee44cd", - "input": "0x", - "nonce": "0xfb2f", - "to": "0x760a6314a1d207377271917075f88e520141d55e", - "transactionIndex": "0x6b", - "value": "0x13274cb7135e000", - "type": "0x2", - "accessList": [], - "chainId": "0x1", - "v": "0x0", - "r": "0x31c625f5ad6016c8b6afad993888459450945e0c72c6034e57a9e846889a0f50", - "s": "0x37433d466d5edc813b81c63f6af13a0ee3a8e2a226744b518e58e7c629271b65" - }, - { - "blockHash": "0x963239e3b325016690703704b95d8ed8ab58d268eb31654d48b278e187ff6771", - "blockNumber": "0x10aa0e3", - "from": "0x2759bc7b8f9f2b47eeeffb2f5751e0cff3ff1ad8", - "gas": "0x249f0", - "gasPrice": "0x374c292b2", - "maxFeePerGas": "0x7471deff4", - "maxPriorityFeePerGas": "0x4d3f640", - "hash": "0xdedc7e577b6e84727edd683a447c8a9b684bfd0ddaaf3110050f37c750ee44cd", - "input": "0x", - "nonce": "0xfb30", - "to": "0x760a6314a1d207377271917075f88e520141d55f", - "transactionIndex": "0x6b", - "value": "0x13274cb7135e000", - "type": "0x2", - "accessList": [], - "chainId": "0x1", - "v": "0x0", - "r": "0x31c625f5ad6016c8b6afad993888459450945e0c72c6034e57a9e846889a0f50", - "s": "0x37433d466d5edc813b81c63f6af13a0ee3a8e2a226744b518e58e7c629271b65" - } - ] - } -} diff --git a/tests/execution/test_eth_get_block_by_hash.py b/tests/execution/test_eth_get_block_by_hash.py deleted file mode 100644 index 6f14a4d..0000000 --- a/tests/execution/test_eth_get_block_by_hash.py +++ /dev/null @@ -1,55 +0,0 @@ -import json -from pathlib import Path - -from requests_mock import Mocker - -from eth_validator_watcher.execution import Execution -from eth_validator_watcher.models import ExecutionBlock -from tests.execution import assets - - -def test_eth_get_block_by_hash() -> None: - execution = Execution("http://execution:8545") - execution_block_path = Path(assets.__file__).parent / "block.json" - - with execution_block_path.open() as file_descriptor: - execution_block_dict = json.load(file_descriptor) - - def match_request(request) -> bool: - return request.json() == dict( - jsonrpc="2.0", - method="eth_getBlockByHash", - params=[ - "0x963239e3b325016690703704b95d8ed8ab58d268eb31654d48b278e187ff6771", - True, - ], - id="1", - ) - - expected = ExecutionBlock( - jsonrpc="2.0", - id=1, - result=ExecutionBlock.Result( - transactions=[ - ExecutionBlock.Result.Transaction( - to="0x760a6314a1d207377271917075f88e520141d55e" - ), - ExecutionBlock.Result.Transaction( - to="0x760a6314a1d207377271917075f88e520141d55f" - ), - ] - ), - ) - - with Mocker() as mock: - mock.post( - f"http://execution:8545", - json=execution_block_dict, - additional_matcher=match_request, - ) - - actual = execution.eth_get_block_by_hash( - "0x963239e3b325016690703704b95d8ed8ab58d268eb31654d48b278e187ff6771" - ) - - assert actual == expected diff --git a/tests/exited_validators/test_process_exited_validators.py b/tests/exited_validators/test_process_exited_validators.py deleted file mode 100644 index 3a2e33a..0000000 --- a/tests/exited_validators/test_process_exited_validators.py +++ /dev/null @@ -1,59 +0,0 @@ -from eth_validator_watcher.exited_validators import ( - ExitedValidators, - metric_our_exited_validators_count, -) -from eth_validator_watcher.models import Validators - -Validator = Validators.DataItem.Validator - - -def test_process_exited_validators(): - class Slack: - def __init__(self): - self.counter = 0 - - def send_message(self, _: str) -> None: - self.counter += 1 - - slack = Slack() - - our_exited_unslashed_index_to_validator = { - 44: Validator(pubkey="0x9012", effective_balance=32000000000, slashed=False), - 45: Validator(pubkey="0x3456", effective_balance=32000000000, slashed=False), - } - - our_withdrawal_index_to_validator = { - 46: Validator(pubkey="0x1234", effective_balance=32000000000, slashed=False), - 47: Validator(pubkey="0x5678", effective_balance=32000000000, slashed=True), - } - - exited_validators = ExitedValidators(slack) # type: ignore - - exited_validators.process( - our_exited_unslashed_index_to_validator, our_withdrawal_index_to_validator - ) - - assert metric_our_exited_validators_count.collect()[0].samples[0].value == 3 # type: ignore - assert slack.counter == 0 - - assert ( - exited_validators._ExitedValidators__our_exited_unslashed_indexes # type: ignore - == {44, 45} - ) - - our_exited_unslashed_index_to_validator = { - 44: Validator(pubkey="0x9012", effective_balance=32000000000, slashed=False), - 45: Validator(pubkey="0x3456", effective_balance=32000000000, slashed=False), - 48: Validator(pubkey="0x5432", effective_balance=32000000000, slashed=False), - } - exited_validators.process( - our_exited_unslashed_index_to_validator, our_withdrawal_index_to_validator - ) - - assert metric_our_exited_validators_count.collect()[0].samples[0].value == 4 # type: ignore - assert slack.counter == 1 - - assert ( - exited_validators._ExitedValidators__our_exited_unslashed_indexes # type: ignore - == {44, 45, 48} - ) diff --git a/tests/fee_recipient/__init__.py b/tests/fee_recipient/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/fee_recipient/assets/__init__.py b/tests/fee_recipient/assets/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/fee_recipient/assets/block.json b/tests/fee_recipient/assets/block.json deleted file mode 100644 index 1c28a2b..0000000 --- a/tests/fee_recipient/assets/block.json +++ /dev/null @@ -1,112 +0,0 @@ -{ - "version": "bellatrix", - "execution_optimistic": false, - "data": { - "message": { - "slot": "4839775", - "proposer_index": "365100", - "parent_root": "0xe90537191ff89b8a416ef5b128d7bc825c9f4af1fd15274d00b50374bcd83c87", - "state_root": "0xfd9677861ad339b698bac2555c2b7df5b04820807116010ebaf499f39acd4170", - "body": { - "randao_reveal": "0x98539cdc416440d3a26959a7f07b7c093a984221a78087496f5846ab694b557654836a7713649d1d9127680df5038147082bcbde5d5a427f302dcff76cb8cabaa990a131553e2193f88494a23cefbeda154cc88fe97cdba798d6550b250e5b2b", - "eth1_data": { - "deposit_root": "0x86b32b120d274e30bd5fd401610b0d8891d8eb48dc68038cadfc15de58215d7c", - "deposit_count": "449941", - "block_hash": "0x060356bdb8bf84bb2c1ca7e3874883802c672a4120b25d3b8bfb67524483a6fe" - }, - "graffiti": "0x0000000000000000000000000000000000000000000000000000000000000000", - "proposer_slashings": [], - "attester_slashings": [], - "attestations": [ - { - "aggregation_bits": "0x00ffff", - "data": { - "slot": "4839774", - "index": "1", - "beacon_block_root": "0xe90537191ff89b8a416ef5b128d7bc825c9f4af1fd15274d00b50374bcd83c87", - "source": { - "epoch": "151241", - "root": "0x8bd8a1dfa949c0f7de21083bb733fc71e36ab5754535a5970ba6b45ae7347129" - }, - "target": { - "epoch": "151242", - "root": "0x0dbfd0dc78569bcab7e2fc05d68c781ed96d2df4c6ffaeee81f2553babf287d3" - } - }, - "signature": "0xaa96594a0024e1e3cc7b17456e07515dc987698cdaba451227ee40d32dc931a909ec92200d06ebc8174b65c64f18873e17f6d20adba701ce6c9f58de424833a023486ff1ab3a8f6fe0e72e6e0ded516011786843016dd672b0730d90b108990b" - }, - { - "aggregation_bits": "0xfe00ff", - "data": { - "slot": "4839774", - "index": "1", - "beacon_block_root": "0xe90537191ff89b8a416ef5b128d7bc825c9f4af1fd15274d00b50374bcd83c87", - "source": { - "epoch": "151241", - "root": "0x8bd8a1dfa949c0f7de21083bb733fc71e36ab5754535a5970ba6b45ae7347129" - }, - "target": { - "epoch": "151242", - "root": "0x0dbfd0dc78569bcab7e2fc05d68c781ed96d2df4c6ffaeee81f2553babf287d3" - } - }, - "signature": "0xaa96594a0024e1e3cc7b17456e07515dc987698cdaba451227ee40d32dc931a909ec92200d06ebc8174b65c64f18873e17f6d20adba701ce6c9f58de424833a023486ff1ab3a8f6fe0e72e6e0ded516011786843016dd672b0730d90b108990b" - }, - { - "aggregation_bits": "0xff00ff", - "data": { - "slot": "4839774", - "index": "2", - "beacon_block_root": "0xe90537191ff89b8a416ef5b128d7bc825c9f4af1fd15274d00b50374bcd83c87", - "source": { - "epoch": "151241", - "root": "0x8bd8a1dfa949c0f7de21083bb733fc71e36ab5754535a5970ba6b45ae7347129" - }, - "target": { - "epoch": "151242", - "root": "0x0dbfd0dc78569bcab7e2fc05d68c781ed96d2df4c6ffaeee81f2553babf287d3" - } - }, - "signature": "0xaa96594a0024e1e3cc7b17456e07515dc987698cdaba451227ee40d32dc931a909ec92200d06ebc8174b65c64f18873e17f6d20adba701ce6c9f58de424833a023486ff1ab3a8f6fe0e72e6e0ded516011786843016dd672b0730d90b108990b" - }, - { - "aggregation_bits": "0xff00ff", - "data": { - "slot": "4839773", - "index": "3", - "beacon_block_root": "0xe90537191ff89b8a416ef5b128d7bc825c9f4af1fd15274d00b50374bcd83c87", - "source": { - "epoch": "151241", - "root": "0x8bd8a1dfa949c0f7de21083bb733fc71e36ab5754535a5970ba6b45ae7347129" - }, - "target": { - "epoch": "151242", - "root": "0x0dbfd0dc78569bcab7e2fc05d68c781ed96d2df4c6ffaeee81f2553babf287d3" - } - }, - "signature": "0xaa96594a0024e1e3cc7b17456e07515dc987698cdaba451227ee40d32dc931a909ec92200d06ebc8174b65c64f18873e17f6d20adba701ce6c9f58de424833a023486ff1ab3a8f6fe0e72e6e0ded516011786843016dd672b0730d90b108990b" - } - ], - "execution_payload": { - "parent_hash": "0x4b7de5b987b9bfc9aa2e7e58cf25515950c8f0b7da00366ecd5ae8cfd8e05fa3", - "fee_recipient": "0xEbeC795c9C8bbd61ffc14a6662944748f299cacf", - "state_root": "0x1e21e560eb6ba930006c3dad4d1b301f74ab324711931a0a5e8632f1ee3c2de2", - "receipts_root": "0x102f655d8a01fc5484b259c4067fa560796ae22ca5d67364b94e217e3f3f8029", - "logs_bloom": "0x46a5913764080408104db1108133191d16e4cc411f45c59a0103580f570e915451a55b82c752a92107a0961404d11161165584b699427a00230e21f111eca4828cc160bae709da2ce9436609cb388529b2f6522915f7e8a8f8ad5769d8f62810132ef61aa61384c711c00508b02868cfcc15483ee01a8d18e28805d1ca580744a0e232d6ff040c0810cc04404346d03e569024a1a99c10d9453439685832c08c1e1e25455c9a6e835d5949d677298c2d87108a012082440514364c051106304157fe1a47b4010b49f800cc540055f00484444a26545810540b1d45220ae4e088383aa80ad05007340915a0aa1403f0e58039161019a81c4608df0912008a950a", - "prev_randao": "0xfde69470b30e0f171e63ca8a30709e545b4f0372edc45ef6f40b41b4f6659e95", - "block_number": "17477063", - "gas_limit": "30000000", - "gas_used": "13871888", - "timestamp": "1686732083", - "extra_data": "0x6265617665726275696c642e6f7267", - "base_fee_per_gas": "16233757869", - "block_hash": "0x9fc5b74ae5b8a0f7495314c7e6608e524c2ffe8581eca704208066cd922a1fee", - "transactions": [ - "0x", - "0x" - ] - } - } - } - } -} diff --git a/tests/fee_recipient/assets/empty_execution_block.json b/tests/fee_recipient/assets/empty_execution_block.json deleted file mode 100644 index 251bee5..0000000 --- a/tests/fee_recipient/assets/empty_execution_block.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "jsonrpc": "2.0", - "id": 1, - "result": { - "transactions": [] - } -} diff --git a/tests/fee_recipient/assets/execution_block.json b/tests/fee_recipient/assets/execution_block.json deleted file mode 100644 index d692021..0000000 --- a/tests/fee_recipient/assets/execution_block.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "jsonrpc": "2.0", - "id": 1, - "result": { - "transactions": [ - { - "blockHash": "0x963239e3b325016690703704b95d8ed8ab58d268eb31654d48b278e187ff6771", - "blockNumber": "0x10aa0e3", - "from": "0x2759bc7b8f9f2b47eeeffb2f5751e0cff3ff1ad8", - "gas": "0x249f0", - "gasPrice": "0x374c292b2", - "maxFeePerGas": "0x7471deff4", - "maxPriorityFeePerGas": "0x4d3f640", - "hash": "0xdedc7e577b6e84727edd683a447c8a9b684bfd0ddaaf3110050f37c750ee44cd", - "input": "0x", - "nonce": "0xfb2f", - "to": "0x760a6314a1d207377271917075f88e520141d55e", - "transactionIndex": "0x6b", - "value": "0x13274cb7135e000", - "type": "0x2", - "accessList": [], - "chainId": "0x1", - "v": "0x0", - "r": "0x31c625f5ad6016c8b6afad993888459450945e0c72c6034e57a9e846889a0f50", - "s": "0x37433d466d5edc813b81c63f6af13a0ee3a8e2a226744b518e58e7c629271b65" - }, - { - "blockHash": "0x963239e3b325016690703704b95d8ed8ab58d268eb31654d48b278e187ff6771", - "blockNumber": "0x10aa0e3", - "from": "0x2759bc7b8f9f2b47eeeffb2f5751e0cff3ff1ad8", - "gas": "0x249f0", - "gasPrice": "0x374c292b2", - "maxFeePerGas": "0x7471deff4", - "maxPriorityFeePerGas": "0x4d3f640", - "hash": "0xdedc7e577b6e84727edd683a447c8a9b684bfd0ddaaf3110050f37c750ee44cd", - "input": "0x", - "nonce": "0xfb30", - "to": "0x760A6314a1D207377271917075f88e520141D55F", - "transactionIndex": "0x6b", - "value": "0x13274cb7135e000", - "type": "0x2", - "accessList": [], - "chainId": "0x1", - "v": "0x0", - "r": "0x31c625f5ad6016c8b6afad993888459450945e0c72c6034e57a9e846889a0f50", - "s": "0x37433d466d5edc813b81c63f6af13a0ee3a8e2a226744b518e58e7c629271b65" - } - ] - } -} diff --git a/tests/fee_recipient/test_process_fee_recipient.py b/tests/fee_recipient/test_process_fee_recipient.py deleted file mode 100644 index f0d0f45..0000000 --- a/tests/fee_recipient/test_process_fee_recipient.py +++ /dev/null @@ -1,193 +0,0 @@ -import json -from pathlib import Path - -from pytest import fixture - -from eth_validator_watcher.fee_recipient import ( - process_fee_recipient, - metric_wrong_fee_recipient_proposed_block_count, -) -from eth_validator_watcher.models import Block, ExecutionBlock, Validators -from tests.fee_recipient import assets - -Validator = Validators.DataItem.Validator - - -class Slack: - def __init__(self): - self.counter = 0 - - def send_message(self, _: str) -> None: - self.counter += 1 - - -class Execution: - def eth_get_block_by_hash(self, hash: str) -> ExecutionBlock: - assert ( - hash == "0x9fc5b74ae5b8a0f7495314c7e6608e524c2ffe8581eca704208066cd922a1fee" - ) - - execution_block_path = Path(assets.__file__).parent / "execution_block.json" - - with execution_block_path.open() as file_descriptor: - return ExecutionBlock(**json.load(file_descriptor)) - - -class ExecutionEmptyBlock: - def eth_get_block_by_hash(self, hash: str) -> ExecutionBlock: - assert ( - hash == "0x9fc5b74ae5b8a0f7495314c7e6608e524c2ffe8581eca704208066cd922a1fee" - ) - - execution_block_path = ( - Path(assets.__file__).parent / "empty_execution_block.json" - ) - - with execution_block_path.open() as file_descriptor: - return ExecutionBlock(**json.load(file_descriptor)) - - -@fixture -def block() -> Block: - block_file = Path(assets.__file__).parent / "block.json" - with block_file.open() as file_descriptor: - return Block(**json.load(file_descriptor)) - - -def test_execution_is_none(): - slack = Slack() - counter_before = metric_wrong_fee_recipient_proposed_block_count.collect()[0].samples[0].value # type: ignore - - process_fee_recipient( - block="A block", # type: ignore - index_to_validator={}, - execution=None, - expected_fee_recipient="0x1234", - slack=slack, # type: ignore - ) - - counter_after = metric_wrong_fee_recipient_proposed_block_count.collect()[0].samples[0].value # type: ignore - assert counter_after == counter_before - - assert slack.counter == 0 - - -def test_fee_recipient_is_none(): - slack = Slack() - counter_before = metric_wrong_fee_recipient_proposed_block_count.collect()[0].samples[0].value # type: ignore - - process_fee_recipient( - block="A block", # type: ignore - index_to_validator={}, - execution="execution", # type: ignore - expected_fee_recipient=None, - slack=slack, # type: ignore - ) - - assert slack.counter == 0 - - -def test_not_our_validator(block: Block): - slack = Slack() - counter_before = metric_wrong_fee_recipient_proposed_block_count.collect()[0].samples[0].value # type: ignore - - process_fee_recipient( - block=block, - index_to_validator={}, - execution="execution", # type: ignore - expected_fee_recipient="0x1234", - slack=slack, # type: ignore - ) - - counter_after = metric_wrong_fee_recipient_proposed_block_count.collect()[0].samples[0].value # type: ignore - assert counter_after == counter_before - - assert slack.counter == 0 - - -def test_our_validator_allright(block: Block): - slack = Slack() - counter_before = metric_wrong_fee_recipient_proposed_block_count.collect()[0].samples[0].value # type: ignore - - process_fee_recipient( - block=block, - index_to_validator={ - 365100: Validator( - pubkey="0xabcd", effective_balance=32000000000, slashed=False - ) - }, - execution="execution", # type: ignore - expected_fee_recipient="0xebec795c9c8bbd61ffc14a6662944748f299cacf", - slack=slack, # type: ignore - ) - - counter_after = metric_wrong_fee_recipient_proposed_block_count.collect()[0].samples[0].value # type: ignore - assert counter_after == counter_before - - assert slack.counter == 0 - - -def test_our_validator_ok_in_last_tx(block: Block): - slack = Slack() - counter_before = metric_wrong_fee_recipient_proposed_block_count.collect()[0].samples[0].value # type: ignore - - process_fee_recipient( - block=block, - index_to_validator={ - 365100: Validator( - pubkey="0xabcd", effective_balance=32000000000, slashed=False - ) - }, - execution=Execution(), # type: ignore - expected_fee_recipient="0x760a6314a1d207377271917075f88e520141d55f", - slack=slack, # type: ignore - ) - - counter_after = metric_wrong_fee_recipient_proposed_block_count.collect()[0].samples[0].value # type: ignore - assert counter_after == counter_before - - assert slack.counter == 0 - - -def test_our_validator_not_ok_empty_block(block: Block): - slack = Slack() - counter_before = metric_wrong_fee_recipient_proposed_block_count.collect()[0].samples[0].value # type: ignore - - process_fee_recipient( - block=block, - index_to_validator={ - 365100: Validator( - pubkey="0xabcd", effective_balance=32000000000, slashed=False - ) - }, - execution=ExecutionEmptyBlock(), # type: ignore - expected_fee_recipient="0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - slack=slack, # type: ignore - ) - - counter_after = metric_wrong_fee_recipient_proposed_block_count.collect()[0].samples[0].value # type: ignore - assert counter_after == counter_before + 1 - - assert slack.counter == 1 - - -def test_our_validator_not_ok(block: Block): - slack = Slack() - counter_before = metric_wrong_fee_recipient_proposed_block_count.collect()[0].samples[0].value # type: ignore - - process_fee_recipient( - block=block, - index_to_validator={ - 365100: Validator( - pubkey="0xabcd", effective_balance=32000000000, slashed=False - ) - }, - execution=Execution(), # type: ignore - expected_fee_recipient="0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - slack=slack, # type: ignore - ) - - counter_after = metric_wrong_fee_recipient_proposed_block_count.collect()[0].samples[0].value # type: ignore - assert counter_after == counter_before + 1 - - assert slack.counter == 1 diff --git a/tests/missed_attestations/test_process_double_missed_attestations.py b/tests/missed_attestations/test_process_double_missed_attestations.py deleted file mode 100644 index 307c8c3..0000000 --- a/tests/missed_attestations/test_process_double_missed_attestations.py +++ /dev/null @@ -1,78 +0,0 @@ -from typing import Set - -from eth_validator_watcher.missed_attestations import process_double_missed_attestations -from eth_validator_watcher.models import Validators -from eth_validator_watcher.utils import LimitedDict - -Validator = Validators.DataItem.Validator - - -def test_process_double_missed_attestations_low_epoch() -> None: - for epoch in 0, 1: - actual = process_double_missed_attestations( - {42, 43, 44, 45}, - {40, 41, 42, 43}, - LimitedDict(0), - epoch, - None, - ) - - expected: set[int] = set() - - assert expected == actual - - -def test_process_double_missed_attestations_some_dead_indexes() -> None: - class Slack: - def __init__(self): - self.counter = 0 - - def send_message(self, _: str) -> None: - self.counter += 1 - - slack = Slack() - - epoch_to_index_to_validator_index = LimitedDict(2) - epoch_to_index_to_validator_index[1663] = { - 40: Validator(pubkey="pubkey40", effective_balance=32000000000, slashed=False), - 41: Validator(pubkey="pubkey41", effective_balance=32000000000, slashed=False), - 42: Validator(pubkey="pubkey42", effective_balance=32000000000, slashed=False), - 43: Validator(pubkey="pubkey43", effective_balance=32000000000, slashed=False), - 44: Validator(pubkey="pubkey44", effective_balance=32000000000, slashed=False), - 45: Validator(pubkey="pubkey45", effective_balance=32000000000, slashed=False), - } - - actual = process_double_missed_attestations( - {42, 43, 44, 45}, - {40, 41, 42, 43}, - epoch_to_index_to_validator_index, - 1664, - slack, # type: ignore - ) - - expected = {42, 43} - assert expected == actual - assert slack.counter == 1 - - -def test_process_double_missed_attestations_no_dead_indexes() -> None: - epoch_to_index_to_validator_index = LimitedDict(2) - epoch_to_index_to_validator_index[1663] = { - 40: Validator(pubkey="pubkey40", effective_balance=32000000000, slashed=False), - 41: Validator(pubkey="pubkey41", effective_balance=32000000000, slashed=False), - 42: Validator(pubkey="pubkey42", effective_balance=32000000000, slashed=False), - 43: Validator(pubkey="pubkey43", effective_balance=32000000000, slashed=False), - 44: Validator(pubkey="pubkey44", effective_balance=32000000000, slashed=False), - 45: Validator(pubkey="pubkey45", effective_balance=32000000000, slashed=False), - } - - actual = process_double_missed_attestations( - {44, 45}, - {40, 41}, - epoch_to_index_to_validator_index, - 1664, - None, - ) - - excepted: Set[int] = set() - assert excepted == actual diff --git a/tests/missed_attestations/test_process_missed_attestations.py b/tests/missed_attestations/test_process_missed_attestations.py deleted file mode 100644 index 4328880..0000000 --- a/tests/missed_attestations/test_process_missed_attestations.py +++ /dev/null @@ -1,85 +0,0 @@ -from typing import Set - -from eth_validator_watcher.missed_attestations import process_missed_attestations -from eth_validator_watcher.models import BeaconType, Validators -from eth_validator_watcher.utils import LimitedDict - -Validator = Validators.DataItem.Validator - - -def test_process_missed_attestations_low_epoch() -> None: - class Beacon: - pass - - actual = process_missed_attestations( - beacon=Beacon(), # type: ignore - beacon_type=BeaconType.OLD_TEKU, - epoch_to_index_to_validator_index=LimitedDict(0), - epoch=0, - ) - - expected: set[int] = set() - - assert expected == actual - - -def test_process_missed_attestations_some_dead_indexes() -> None: - class Beacon: - @staticmethod - def get_validators_liveness( - beacon_type: BeaconType, epoch: int, validators_index: set[int] - ) -> dict[int, bool]: - assert beacon_type is BeaconType.OLD_TEKU - assert epoch == 0 - assert validators_index == {42, 43, 44} - - return {42: False, 43: True, 44: False} - - expected = {42, 44} - - epoch_to_index_to_validator_client = LimitedDict(2) - epoch_to_index_to_validator_client[0] = { - 42: Validator(pubkey="pubkey42", effective_balance=32000000000, slashed=False), - 43: Validator(pubkey="pubkey43", effective_balance=32000000000, slashed=False), - 44: Validator(pubkey="pubkey44", effective_balance=32000000000, slashed=False), - } - - actual = process_missed_attestations( - beacon=Beacon(), # type: ignore - beacon_type=BeaconType.OLD_TEKU, - epoch_to_index_to_validator_index=epoch_to_index_to_validator_client, - epoch=1, - ) - - assert expected == actual - - -def test_process_missed_attestations_no_dead_indexes() -> None: - class Beacon: - @staticmethod - def get_validators_liveness( - beacon_type: BeaconType, epoch: int, validators_index: set[int] - ) -> dict[int, bool]: - assert beacon_type is BeaconType.OLD_TEKU - assert epoch == 0 - assert validators_index == {42, 43, 44} - - return {} - - expected: Set[int] = set() - - epoch_to_index_to_validator_client = LimitedDict(2) - epoch_to_index_to_validator_client[0] = { - 42: Validator(pubkey="pubkey42", effective_balance=32000000000, slashed=False), - 43: Validator(pubkey="pubkey43", effective_balance=32000000000, slashed=False), - 44: Validator(pubkey="pubkey44", effective_balance=32000000000, slashed=False), - } - - actual = process_missed_attestations( - beacon=Beacon(), # type: ignore - beacon_type=BeaconType.OLD_TEKU, - epoch_to_index_to_validator_index=epoch_to_index_to_validator_client, - epoch=1, - ) - - assert expected == actual diff --git a/tests/missed_blocks_finalized/test_process_missed_blocks_finalized.py b/tests/missed_blocks_finalized/test_process_missed_blocks_finalized.py deleted file mode 100644 index c206d77..0000000 --- a/tests/missed_blocks_finalized/test_process_missed_blocks_finalized.py +++ /dev/null @@ -1,204 +0,0 @@ -from math import e -from typing import Union - -import pytest - -from eth_validator_watcher.beacon import NoBlockError -from eth_validator_watcher.missed_blocks import ( - metric_missed_block_proposals_finalized_count, - process_missed_blocks_finalized, -) -from eth_validator_watcher.models import BlockIdentierType, Header, ProposerDuties - - -def test_process_missed_blocks_finalized_future_slot() -> None: - with pytest.raises(AssertionError): - process_missed_blocks_finalized("a beacon", 42, 41, {}, None) # type: ignore - - -def test_process_missed_blocks_finalized_nominal() -> None: - Data = ProposerDuties.Data - - class Slack: - def __init__(self) -> None: - self.counter = 0 - - def send_message(self, _: str) -> None: - self.counter += 1 - - class Beacon: - @staticmethod - def get_header(block_identifier: Union[BlockIdentierType, int]) -> Header: - def header(slot: int) -> Header: - return Header( - data=Header.Data( - header=Header.Data.Header( - message=Header.Data.Header.Message(slot=slot) - ) - ) - ) - - block_identifier_to_header = { - 43: header(43), - 57: header(57), - 58: header(58), - 91: header(91), - 99: header(99), - 100: header(100), - BlockIdentierType.FINALIZED: header(100), - } - - try: - return block_identifier_to_header[block_identifier] - except KeyError: - raise NoBlockError - - @staticmethod - def get_proposer_duties(epoch: int) -> ProposerDuties: - epoch_to_duties = { - 1: ProposerDuties( - dependent_root="0xfff", - data=[ - Data(pubkey="0x00", validator_index=32, slot=32), - Data(pubkey="0x01", validator_index=33, slot=33), - Data(pubkey="0x02", validator_index=34, slot=34), - Data(pubkey="0x03", validator_index=35, slot=35), - Data(pubkey="0x04", validator_index=36, slot=36), - Data(pubkey="0x05", validator_index=37, slot=37), - Data(pubkey="0x06", validator_index=38, slot=38), - Data(pubkey="0x07", validator_index=39, slot=39), - Data(pubkey="0x08", validator_index=40, slot=40), - Data(pubkey="0x09", validator_index=41, slot=41), - Data(pubkey="0x10", validator_index=42, slot=42), - Data(pubkey="0x11", validator_index=43, slot=43), - Data(pubkey="0x12", validator_index=44, slot=44), - Data(pubkey="0x13", validator_index=45, slot=45), - Data(pubkey="0x14", validator_index=46, slot=46), - Data(pubkey="0x15", validator_index=47, slot=47), - Data(pubkey="0x16", validator_index=48, slot=48), - Data(pubkey="0x17", validator_index=49, slot=49), - Data(pubkey="0x18", validator_index=50, slot=50), - Data(pubkey="0x19", validator_index=51, slot=51), - Data(pubkey="0x20", validator_index=52, slot=52), - Data(pubkey="0x21", validator_index=53, slot=53), - Data(pubkey="0x22", validator_index=54, slot=54), - Data(pubkey="0x23", validator_index=55, slot=55), - Data(pubkey="0x24", validator_index=56, slot=56), - Data(pubkey="0x25", validator_index=57, slot=57), - Data(pubkey="0x26", validator_index=58, slot=58), - Data(pubkey="0x27", validator_index=59, slot=59), - Data(pubkey="0x28", validator_index=60, slot=60), - Data(pubkey="0x29", validator_index=61, slot=61), - Data(pubkey="0x30", validator_index=62, slot=62), - Data(pubkey="0x31", validator_index=63, slot=63), - ], - ), - 2: ProposerDuties( - dependent_root="0xfff", - data=[ - Data(pubkey="0x32", validator_index=64, slot=64), - Data(pubkey="0x33", validator_index=65, slot=65), - Data(pubkey="0x34", validator_index=66, slot=66), - Data(pubkey="0x35", validator_index=67, slot=67), - Data(pubkey="0x36", validator_index=68, slot=68), - Data(pubkey="0x37", validator_index=69, slot=69), - Data(pubkey="0x38", validator_index=70, slot=70), - Data(pubkey="0x39", validator_index=71, slot=71), - Data(pubkey="0x40", validator_index=72, slot=72), - Data(pubkey="0x41", validator_index=73, slot=73), - Data(pubkey="0x42", validator_index=74, slot=74), - Data(pubkey="0x43", validator_index=75, slot=75), - Data(pubkey="0x44", validator_index=76, slot=76), - Data(pubkey="0x45", validator_index=77, slot=77), - Data(pubkey="0x46", validator_index=78, slot=78), - Data(pubkey="0x47", validator_index=79, slot=79), - Data(pubkey="0x48", validator_index=80, slot=80), - Data(pubkey="0x49", validator_index=81, slot=81), - Data(pubkey="0x50", validator_index=82, slot=82), - Data(pubkey="0x51", validator_index=83, slot=83), - Data(pubkey="0x52", validator_index=84, slot=84), - Data(pubkey="0x53", validator_index=85, slot=85), - Data(pubkey="0x54", validator_index=86, slot=86), - Data(pubkey="0x55", validator_index=87, slot=87), - Data(pubkey="0x56", validator_index=88, slot=88), - Data(pubkey="0x57", validator_index=89, slot=89), - Data(pubkey="0x58", validator_index=90, slot=90), - Data(pubkey="0x59", validator_index=91, slot=91), - Data(pubkey="0x60", validator_index=92, slot=92), - Data(pubkey="0x61", validator_index=93, slot=93), - Data(pubkey="0x62", validator_index=94, slot=94), - Data(pubkey="0x63", validator_index=95, slot=95), - ], - ), - 3: ProposerDuties( - dependent_root="0xfff", - data=[ - Data(pubkey="0x64", validator_index=96, slot=96), - Data(pubkey="0x65", validator_index=97, slot=97), - Data(pubkey="0x66", validator_index=98, slot=98), - Data(pubkey="0x67", validator_index=99, slot=99), - Data(pubkey="0x68", validator_index=100, slot=100), - Data(pubkey="0x69", validator_index=101, slot=101), - Data(pubkey="0x70", validator_index=102, slot=102), - Data(pubkey="0x71", validator_index=103, slot=103), - Data(pubkey="0x72", validator_index=104, slot=104), - Data(pubkey="0x73", validator_index=105, slot=105), - Data(pubkey="0x74", validator_index=106, slot=106), - Data(pubkey="0x75", validator_index=107, slot=107), - Data(pubkey="0x76", validator_index=108, slot=108), - Data(pubkey="0x77", validator_index=109, slot=109), - Data(pubkey="0x78", validator_index=110, slot=110), - Data(pubkey="0x79", validator_index=111, slot=111), - Data(pubkey="0x80", validator_index=112, slot=112), - Data(pubkey="0x81", validator_index=113, slot=113), - Data(pubkey="0x82", validator_index=114, slot=114), - Data(pubkey="0x83", validator_index=115, slot=115), - Data(pubkey="0x84", validator_index=116, slot=116), - Data(pubkey="0x85", validator_index=117, slot=117), - Data(pubkey="0x86", validator_index=118, slot=118), - Data(pubkey="0x87", validator_index=119, slot=119), - Data(pubkey="0x88", validator_index=120, slot=120), - Data(pubkey="0x89", validator_index=121, slot=121), - Data(pubkey="0x90", validator_index=122, slot=122), - Data(pubkey="0x91", validator_index=123, slot=123), - Data(pubkey="0x92", validator_index=124, slot=124), - Data(pubkey="0x93", validator_index=125, slot=125), - Data(pubkey="0x94", validator_index=126, slot=126), - Data(pubkey="0x95", validator_index=127, slot=127), - ], - ), - } - - return epoch_to_duties[epoch] - - beacon = Beacon() - slack = Slack() - - counter_before = metric_missed_block_proposals_finalized_count.collect()[0].samples[0].value # type: ignore - - assert ( - process_missed_blocks_finalized( - beacon, # type: ignore - 42, - 150, - { - "0x10", # too soon - slot: 42 - "0x11", # proposed - slot: 43 - "0x12", # missed - slot: 44 - "0x25", # proposed - slot: 57 - "0x26", # proposed - slot: 58 - "0x59", # proposed - slot: 91 - "0x66", # missed - slot: 98 - "0x67", # proposed - slot: 99 - "0x68", # proposed - slot: 100 - "0x69", # too late - slot: 101 - }, - slack, # type: ignore - ) - == 100 - ) - - counter_after = metric_missed_block_proposals_finalized_count.collect()[0].samples[0].value # type: ignore - delta = counter_after - counter_before - assert delta == 2 - assert slack.counter == 2 diff --git a/tests/missed_blocks_head/test_process_missed_blocks_head.py b/tests/missed_blocks_head/test_process_missed_blocks_head.py deleted file mode 100644 index 2768715..0000000 --- a/tests/missed_blocks_head/test_process_missed_blocks_head.py +++ /dev/null @@ -1,73 +0,0 @@ -from eth_validator_watcher.missed_blocks import ( - metric_missed_block_proposals_head_count, - process_missed_blocks_head, -) -from eth_validator_watcher.models import ProposerDuties - - -def test_process_missed_blocks_head_no_block() -> None: - class Beacon: - @staticmethod - def get_proposer_duties(epoch: int) -> ProposerDuties: - assert epoch == 0 - - return ProposerDuties( - dependent_root="0xfff", - data=[ - ProposerDuties.Data(pubkey="0xaaa", validator_index=0, slot=0), - ProposerDuties.Data(pubkey="0xbbb", validator_index=1, slot=1), - ProposerDuties.Data(pubkey="0xccc", validator_index=2, slot=2), - ProposerDuties.Data(pubkey="0xddd", validator_index=3, slot=3), - ], - ) - - class Slack: - def __init__(self): - self.counter = 0 - - def send_message(self, _: str) -> None: - self.counter += 1 - - slack = Slack() - - counter_before = metric_missed_block_proposals_head_count.collect()[0].samples[0].value # type: ignore - assert process_missed_blocks_head(Beacon(), None, 3, {"0xaaa", "0xddd"}, slack) # type: ignore - counter_after = metric_missed_block_proposals_head_count.collect()[0].samples[0].value # type: ignore - - delta = counter_after - counter_before - assert delta == 1 - assert slack.counter == 1 - - -def test_process_missed_blocks_head_habemus_blockam() -> None: - class Beacon: - @staticmethod - def get_proposer_duties(epoch: int) -> ProposerDuties: - assert epoch == 0 - - return ProposerDuties( - dependent_root="0xfff", - data=[ - ProposerDuties.Data(pubkey="0xaaa", validator_index=0, slot=0), - ProposerDuties.Data(pubkey="0xbbb", validator_index=1, slot=1), - ProposerDuties.Data(pubkey="0xccc", validator_index=2, slot=2), - ProposerDuties.Data(pubkey="0xddd", validator_index=3, slot=3), - ], - ) - - class Slack: - def __init__(self): - self.counter = 0 - - def send_message(self, _: str) -> None: - self.counter += 1 - - slack = Slack() - - counter_before = metric_missed_block_proposals_head_count.collect()[0].samples[0].value # type: ignore - assert not process_missed_blocks_head(Beacon(), "A BLOCK", 2, {"0xaaa", "0xddd"}, slack) # type: ignore - counter_after = metric_missed_block_proposals_head_count.collect()[0].samples[0].value # type: ignore - - delta = counter_after - counter_before - assert delta == 0 - assert slack.counter == 0 diff --git a/tests/next_blocks_proposal/test_next_blocks_proposal.py b/tests/next_blocks_proposal/test_next_blocks_proposal.py deleted file mode 100644 index 43dca2a..0000000 --- a/tests/next_blocks_proposal/test_next_blocks_proposal.py +++ /dev/null @@ -1,34 +0,0 @@ -from eth_validator_watcher.models import ProposerDuties -from eth_validator_watcher.next_blocks_proposal import process_future_blocks_proposal - - -class Beacon: - @staticmethod - def get_proposer_duties(epoch: int) -> ProposerDuties: - return { - 42: ProposerDuties( - dependent_root="0xfff", - data=[ - ProposerDuties.Data(pubkey="0xaaa", validator_index=0, slot=1344) - ], - ), - 43: ProposerDuties( - dependent_root="0xfff", - data=[ - ProposerDuties.Data(pubkey="0xbbb", validator_index=1, slot=1376) - ], - ), - }[epoch] - - -def test_handle_next_blocks_proposal_no_work(): - assert ( - process_future_blocks_proposal(Beacon(), set(), 1344, False) == 0 # type: ignore - ) - - -def test_handle_next_blocks_proposal_work(): - assert ( - process_future_blocks_proposal(Beacon(), {"0xaaa"}, 1344, True) # type: ignore - == 1 - ) diff --git a/tests/relays/test_process.py b/tests/relays/test_process.py deleted file mode 100644 index 84abeba..0000000 --- a/tests/relays/test_process.py +++ /dev/null @@ -1,89 +0,0 @@ -from pytest import raises -from requests.exceptions import ConnectionError -from requests_mock import Mocker - -from eth_validator_watcher.relays import Relays, metric_bad_relay_count - - -def test_process_no_relay() -> None: - counter_before = metric_bad_relay_count.collect()[0].samples[0].value # type: ignore - relays = Relays(urls=[]) - relays.process(slot=42) - counter_after = metric_bad_relay_count.collect()[0].samples[0].value # type: ignore - - delta = counter_after - counter_before - assert delta == 0 - - -def test_process_bad_relay() -> None: - relays = Relays(urls=["http://relay-1.com", "http://relay-2.com"]) - - counter_before = metric_bad_relay_count.collect()[0].samples[0].value # type: ignore - - with Mocker() as mock: - mock.get( - "http://relay-1.com/relay/v1/data/bidtraces/proposer_payload_delivered?slot=42", - json=[], - ) - - mock.get( - "http://relay-2.com/relay/v1/data/bidtraces/proposer_payload_delivered?slot=42", - json=[], - ) - - relays.process(slot=42) - - counter_after = metric_bad_relay_count.collect()[0].samples[0].value # type: ignore - delta = counter_after - counter_before - assert delta == 1 - - -def test_process_good_relay() -> None: - relays = Relays(urls=["http://relay-1.com", "http://relay-2.com"]) - - counter_before = metric_bad_relay_count.collect()[0].samples[0].value # type: ignore - - with Mocker() as mock: - mock.get( - "http://relay-1.com/relay/v1/data/bidtraces/proposer_payload_delivered?slot=42", - json=[], - ) - - mock.get( - "http://relay-2.com/relay/v1/data/bidtraces/proposer_payload_delivered?slot=42", - json=["a block"], - ) - - relays.process(slot=42) - - counter_after = metric_bad_relay_count.collect()[0].samples[0].value # type: ignore - delta = counter_after - counter_before - assert delta == 0 - - -def test_process_relay_bad_answer() -> None: - relays = Relays(urls=["http://relay.com"]) - - with Mocker() as mock: - mock.get( - "http://relay.com/relay/v1/data/bidtraces/proposer_payload_delivered?slot=42", - json=["first block", "second block"], - ) - - with raises(AssertionError): - relays.process(slot=42) - - -def test___is_proposer_payload_delivered() -> None: - relays = Relays(urls=["http://relay.com"]) - - with Mocker() as mock: - mock.get( - "http://relay.com/relay/v1/data/bidtraces/proposer_payload_delivered?slot=42", - exc=ConnectionError, - ) - - with raises(ConnectionError): - relays._Relays__is_proposer_payload_delivered( # type: ignore - url="http://relay.com", slot=42, wait_sec=0 - ) diff --git a/tests/rewards/test_process_rewards_net.py b/tests/rewards/test_process_rewards_net.py deleted file mode 100644 index 2ef8cf3..0000000 --- a/tests/rewards/test_process_rewards_net.py +++ /dev/null @@ -1,492 +0,0 @@ -from math import isclose - -from eth_validator_watcher.models import BeaconType, Rewards, Validators -from eth_validator_watcher.rewards import ( - metric_net_actual_heads_count, - metric_net_actual_neg_sources_count, - metric_net_actual_neg_targets_count, - metric_net_actual_pos_sources_count, - metric_net_actual_pos_targets_count, - metric_net_ideal_heads_count, - metric_net_ideal_sources_count, - metric_net_ideal_targets_count, - metric_net_suboptimal_heads_rate_gauge, - metric_net_suboptimal_sources_rate_gauge, - metric_net_suboptimal_targets_rate_gauge, - process_rewards, -) -from eth_validator_watcher.utils import LimitedDict - -Validator = Validators.DataItem.Validator - - -def test_process_rewards_low_epoch() -> None: - for epoch in 0, 1: - # We just want to be sure it doesn't raise an exception. - - process_rewards( - BeaconType.LIGHTHOUSE, # type: ignore - "a beacon", # type: ignore - epoch, - LimitedDict(2), - LimitedDict(2), - ) - - -def test_process_rewards_no_network_validator() -> None: - net_epoch_to_index_to_validator = LimitedDict(2) - net_epoch_to_index_to_validator[42] = {} - - process_rewards( - BeaconType.LIGHTHOUSE, # type: ignore - "a beacon", # type: ignore - 42, - net_epoch_to_index_to_validator, - LimitedDict(2), - ) - - -def test_process_rewards_all_net_validators_are_ideal() -> None: - class Beacon: - def get_rewards( - self, - beacon_type: BeaconType, - epoch: int, - validators_index: set[int] | None = None, - ) -> Rewards: - assert isinstance(beacon_type, BeaconType) - assert epoch == 40 - assert validators_index is None - - return Rewards( - data=Rewards.Data( - ideal_rewards=[ - Rewards.Data.IdealReward( - effective_balance=31_000_000_000, - head=2_856, - target=5_511, - source=2_966, - ), - Rewards.Data.IdealReward( - effective_balance=32_000_000_000, - head=2_948, - target=5_689, - source=3_062, - ), - ], - total_rewards=[ - Rewards.Data.TotalReward( # 32 ETH - validator_index=1, source=3_062, target=5_689, head=2_948 - ), - Rewards.Data.TotalReward( # 31 ETH - validator_index=2, source=2_966, target=5_511, head=2_856 - ), - Rewards.Data.TotalReward( # 32 ETH - validator_index=3, source=3_062, target=5_689, head=2_948 - ), - ], - ) - ) - - beacon = Beacon() - - ideal_sources_count_before = metric_net_ideal_sources_count.collect()[0].samples[0].value # type: ignore - ideal_targets_count_before = metric_net_ideal_targets_count.collect()[0].samples[0].value # type: ignore - ideal_heads_count_before = metric_net_ideal_heads_count.collect()[0].samples[0].value # type: ignore - - actual_positive_sources_count_before = metric_net_actual_pos_sources_count.collect()[0].samples[0].value # type: ignore - actual_negative_sources_count_before = metric_net_actual_neg_sources_count.collect()[0].samples[0].value # type: ignore - actual_positive_targets_count_before = metric_net_actual_pos_targets_count.collect()[0].samples[0].value # type: ignore - actual_negative_targets_count_before = metric_net_actual_neg_targets_count.collect()[0].samples[0].value # type: ignore - actual_heads_count_before = metric_net_actual_heads_count.collect()[0].samples[0].value # type: ignore - - net_epoch_to_index_to_validator = LimitedDict(2) - net_epoch_to_index_to_validator[42] = { - 1: Validator( - pubkey="0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", - effective_balance=32_000_000_000, - slashed=False, - ), - 2: Validator( - pubkey="0x222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222", - effective_balance=31_000_000_000, - slashed=False, - ), - 3: Validator( - pubkey="0x333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333", - effective_balance=32_000_000_000, - slashed=False, - ), - } - - our_epoch_to_index_to_validator = LimitedDict(2) - our_epoch_to_index_to_validator[42] = {} - - process_rewards( - beacon, # type: ignore - BeaconType.LIGHTHOUSE, - 42, - net_epoch_to_index_to_validator, - our_epoch_to_index_to_validator, - ) - - ideal_sources_count_after = metric_net_ideal_sources_count.collect()[0].samples[0].value # type: ignore - ideal_targets_count_after = metric_net_ideal_targets_count.collect()[0].samples[0].value # type: ignore - ideal_heads_count_after = metric_net_ideal_heads_count.collect()[0].samples[0].value # type: ignore - - actual_positive_sources_count_after = metric_net_actual_pos_sources_count.collect()[0].samples[0].value # type: ignore - actual_negative_sources_count_after = metric_net_actual_neg_sources_count.collect()[0].samples[0].value # type: ignore - actual_positive_targets_count_after = metric_net_actual_pos_targets_count.collect()[0].samples[0].value # type: ignore - actual_negative_targets_count_after = metric_net_actual_neg_targets_count.collect()[0].samples[0].value # type: ignore - - actual_heads_count_after = metric_net_actual_heads_count.collect()[0].samples[0].value # type: ignore - - assert ideal_sources_count_after - ideal_sources_count_before == 9_090 - assert ideal_targets_count_after - ideal_targets_count_before == 16_889 - assert ideal_heads_count_after - ideal_heads_count_before == 8_752 - - assert ( - actual_positive_sources_count_after - actual_positive_sources_count_before - == 9_090 - ) - - assert ( - actual_negative_sources_count_after - actual_negative_sources_count_before == 0 - ) - - assert ( - actual_positive_targets_count_after - actual_positive_targets_count_before - == 16_889 - ) - - assert ( - actual_negative_targets_count_after - actual_negative_targets_count_before == 0 - ) - - assert actual_heads_count_after - actual_heads_count_before == 8_752 - - assert isclose(metric_net_suboptimal_sources_rate_gauge.collect()[0].samples[0].value, 0.0) # type: ignore - assert isclose(metric_net_suboptimal_targets_rate_gauge.collect()[0].samples[0].value, 0.0) # type: ignore - assert isclose(metric_net_suboptimal_heads_rate_gauge.collect()[0].samples[0].value, 0.0) # type: ignore - - -def test_process_rewards_some_net_validators_are_ideal() -> None: - """10 validators. - 5 are perfect. - 2 have good source, good target but wrong head. - 2 have good source, but wrong target and wrong head. - 1 has wrong source, wrong target and wrong head. - """ - - class Beacon: - def get_rewards( - self, - beacon_type: BeaconType, - epoch: int, - validators_index: set[int] | None = None, - ) -> Rewards: - assert isinstance(beacon_type, BeaconType) - assert epoch == 40 - assert validators_index is None - - return Rewards( - data=Rewards.Data( - ideal_rewards=[ - Rewards.Data.IdealReward( - effective_balance=31_000_000_000, - source=2_966, - target=5_511, - head=2_856, - ), - Rewards.Data.IdealReward( - effective_balance=32_000_000_000, - source=3_062, - target=5_689, - head=2_948, - ), - ], - total_rewards=[ - Rewards.Data.TotalReward( # 32 ETH - GS, GT, GH - validator_index=1, source=3_062, target=5_689, head=2_948 - ), - Rewards.Data.TotalReward( # 32 ETH - GS, GT, GH - validator_index=2, source=3_062, target=5_689, head=2_948 - ), - Rewards.Data.TotalReward( # 32 ETH - GS, GT, GH - validator_index=3, source=3_062, target=5_689, head=2_948 - ), - Rewards.Data.TotalReward( # 32 ETH - GS, GT, GH - validator_index=4, source=3_062, target=5_689, head=2_948 - ), - Rewards.Data.TotalReward( # 32 ETH - GS, GT, GH - validator_index=5, source=3_062, target=5_689, head=2_948 - ), - Rewards.Data.TotalReward( # 32 ETH - GS, GT, BH - validator_index=6, source=3_062, target=5_689, head=0 - ), - Rewards.Data.TotalReward( # 32 ETH - GS, GT, BH - validator_index=7, source=3_062, target=5_689, head=0 - ), - Rewards.Data.TotalReward( # 32 ETH - GS, BT, BH - validator_index=8, source=3_062, target=-5_707, head=0 - ), - Rewards.Data.TotalReward( # 31 ETH - GS, BT, BH - validator_index=9, source=2_966, target=-5_600, head=0 - ), - Rewards.Data.TotalReward( # 32 ETH - BS, BT, BH - validator_index=10, source=-3_073, target=-5_707, head=0 - ), - ], - ) - ) - - beacon = Beacon() - - ideal_sources_count_before = metric_net_ideal_sources_count.collect()[0].samples[0].value # type: ignore - ideal_targets_count_before = metric_net_ideal_targets_count.collect()[0].samples[0].value # type: ignore - ideal_heads_count_before = metric_net_ideal_heads_count.collect()[0].samples[0].value # type: ignore - - actual_positive_sources_count_before = metric_net_actual_pos_sources_count.collect()[0].samples[0].value # type: ignore - actual_negative_sources_count_before = metric_net_actual_neg_sources_count.collect()[0].samples[0].value # type: ignore - actual_positive_targets_count_before = metric_net_actual_pos_targets_count.collect()[0].samples[0].value # type: ignore - actual_negative_targets_count_before = metric_net_actual_neg_targets_count.collect()[0].samples[0].value # type: ignore - actual_heads_count_before = metric_net_actual_heads_count.collect()[0].samples[0].value # type: ignore - - net_epoch_to_index_to_validator = LimitedDict(2) - net_epoch_to_index_to_validator[42] = { - 1: Validator( - pubkey="0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", - effective_balance=32_000_000_000, - slashed=False, - ), - 2: Validator( - pubkey="0x222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222", - effective_balance=32_000_000_000, - slashed=False, - ), - 3: Validator( - pubkey="0x333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333", - effective_balance=32_000_000_000, - slashed=False, - ), - 4: Validator( - pubkey="444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444", - effective_balance=32_000_000_000, - slashed=False, - ), - 5: Validator( - pubkey="555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555", - effective_balance=32_000_000_000, - slashed=False, - ), - 6: Validator( - pubkey="666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666", - effective_balance=32_000_000_000, - slashed=False, - ), - 7: Validator( - pubkey="777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777", - effective_balance=32_000_000_000, - slashed=False, - ), - 8: Validator( - pubkey="888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888", - effective_balance=32_000_000_000, - slashed=False, - ), - 9: Validator( - pubkey="999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999", - effective_balance=31_000_000_000, - slashed=False, - ), - 10: Validator( - pubkey="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - effective_balance=32_000_000_000, - slashed=False, - ), - } - - our_epoch_to_index_to_validator = LimitedDict(2) - our_epoch_to_index_to_validator[42] = {} - - process_rewards( - beacon, # type: ignore - BeaconType.LIGHTHOUSE, - 42, - net_epoch_to_index_to_validator, - our_epoch_to_index_to_validator, - ) - - ideal_sources_count_after = metric_net_ideal_sources_count.collect()[0].samples[0].value # type: ignore - ideal_targets_count_after = metric_net_ideal_targets_count.collect()[0].samples[0].value # type: ignore - ideal_heads_count_after = metric_net_ideal_heads_count.collect()[0].samples[0].value # type: ignore - - actual_positive_sources_count_after = metric_net_actual_pos_sources_count.collect()[0].samples[0].value # type: ignore - actual_negative_sources_count_after = metric_net_actual_neg_sources_count.collect()[0].samples[0].value # type: ignore - actual_positive_targets_count_after = metric_net_actual_pos_targets_count.collect()[0].samples[0].value # type: ignore - actual_negative_targets_count_after = metric_net_actual_neg_targets_count.collect()[0].samples[0].value # type: ignore - - actual_heads_count_after = metric_net_actual_heads_count.collect()[0].samples[0].value # type: ignore - - assert ideal_sources_count_after - ideal_sources_count_before == 30_524 - assert ideal_targets_count_after - ideal_targets_count_before == 56_712 - assert ideal_heads_count_after - ideal_heads_count_before == 29_388 - - assert ( - actual_positive_sources_count_after - actual_positive_sources_count_before - == 24_389 - ) - - assert ( - actual_negative_sources_count_after - actual_negative_sources_count_before == 0 - ) - - assert ( - actual_positive_targets_count_after - actual_positive_targets_count_before - == 22_809 - ) - - assert ( - actual_negative_targets_count_after - actual_negative_targets_count_before == 0 - ) - - assert actual_heads_count_after - actual_heads_count_before == 14_740 - - assert isclose( - metric_net_suboptimal_sources_rate_gauge.collect()[0].samples[0].value, # type: ignore - 0.1, - ) - - assert isclose( - metric_net_suboptimal_targets_rate_gauge.collect()[0].samples[0].value, # type: ignore - 0.3, - ) - - assert isclose( - metric_net_suboptimal_heads_rate_gauge.collect()[0].samples[0].value, # type: ignore - 0.5, - ) - - -def test_process_rewards_no_net_validator_is_ideal() -> None: - class Beacon: - def get_rewards( - self, - beacon_type: BeaconType, - epoch: int, - validators_index: set[int] | None = None, - ) -> Rewards: - assert isinstance(beacon_type, BeaconType) - assert epoch == 40 - assert validators_index == None - - return Rewards( - data=Rewards.Data( - ideal_rewards=[ - Rewards.Data.IdealReward( - effective_balance=31_000_000_000, - head=2_856, - target=5_511, - source=2_966, - ), - Rewards.Data.IdealReward( - effective_balance=32_000_000_000, - head=2_948, - target=5_689, - source=3_062, - ), - ], - total_rewards=[ - Rewards.Data.TotalReward( # 32 ETH - validator_index=1, source=-9_000, target=-8_000, head=0 - ), - Rewards.Data.TotalReward( # 31 ETH - validator_index=2, source=-8_500, target=-7_500, head=0 - ), - Rewards.Data.TotalReward( # 32 ETH - validator_index=3, source=-9_000, target=-8_000, head=0 - ), - ], - ) - ) - - beacon = Beacon() - - ideal_sources_count_before = metric_net_ideal_sources_count.collect()[0].samples[0].value # type: ignore - ideal_targets_count_before = metric_net_ideal_targets_count.collect()[0].samples[0].value # type: ignore - ideal_heads_count_before = metric_net_ideal_heads_count.collect()[0].samples[0].value # type: ignore - - actual_positive_sources_count_before = metric_net_actual_pos_sources_count.collect()[0].samples[0].value # type: ignore - actual_negative_sources_count_before = metric_net_actual_neg_sources_count.collect()[0].samples[0].value # type: ignore - actual_positive_targets_count_before = metric_net_actual_pos_targets_count.collect()[0].samples[0].value # type: ignore - actual_negative_targets_count_before = metric_net_actual_neg_targets_count.collect()[0].samples[0].value # type: ignore - actual_heads_count_before = metric_net_actual_heads_count.collect()[0].samples[0].value # type: ignore - - net_epoch_to_index_to_validator = LimitedDict(2) - net_epoch_to_index_to_validator[42] = { - 1: Validator( - pubkey="0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", - effective_balance=32_000_000_000, - slashed=False, - ), - 2: Validator( - pubkey="0x222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222", - effective_balance=31_000_000_000, - slashed=False, - ), - 3: Validator( - pubkey="0x333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333", - effective_balance=32_000_000_000, - slashed=False, - ), - } - - our_epoch_to_index_to_validator = LimitedDict(2) - our_epoch_to_index_to_validator[42] = {} - - process_rewards( - beacon, # type: ignore - BeaconType.LIGHTHOUSE, - 42, - net_epoch_to_index_to_validator, - our_epoch_to_index_to_validator, - ) - - ideal_sources_count_after = metric_net_ideal_sources_count.collect()[0].samples[0].value # type: ignore - ideal_targets_count_after = metric_net_ideal_targets_count.collect()[0].samples[0].value # type: ignore - ideal_heads_count_after = metric_net_ideal_heads_count.collect()[0].samples[0].value # type: ignore - - actual_positive_sources_count_after = metric_net_actual_pos_sources_count.collect()[0].samples[0].value # type: ignore - actual_negative_sources_count_after = metric_net_actual_neg_sources_count.collect()[0].samples[0].value # type: ignore - actual_positive_targets_count_after = metric_net_actual_pos_targets_count.collect()[0].samples[0].value # type: ignore - actual_negative_targets_count_after = metric_net_actual_neg_targets_count.collect()[0].samples[0].value # type: ignore - - actual_heads_count_after = metric_net_actual_heads_count.collect()[0].samples[0].value # type: ignore - - assert ideal_sources_count_after - ideal_sources_count_before == 9_090 - assert ideal_targets_count_after - ideal_targets_count_before == 16_889 - assert ideal_heads_count_after - ideal_heads_count_before == 8_752 - - assert ( - actual_positive_sources_count_after - actual_positive_sources_count_before == 0 - ) - - assert ( - actual_negative_sources_count_after - actual_negative_sources_count_before - == 26_500 - ) - - assert ( - actual_positive_targets_count_after - actual_positive_targets_count_before == 0 - ) - - assert ( - actual_negative_targets_count_after - actual_negative_targets_count_before - == 23_500 - ) - - assert actual_heads_count_after - actual_heads_count_before == 0 - - assert isclose(metric_net_suboptimal_sources_rate_gauge.collect()[0].samples[0].value, 1.0) # type: ignore - assert isclose(metric_net_suboptimal_targets_rate_gauge.collect()[0].samples[0].value, 1.0) # type: ignore - assert isclose(metric_net_suboptimal_heads_rate_gauge.collect()[0].samples[0].value, 1.0) # type: ignore diff --git a/tests/rewards/test_process_rewards_our.py b/tests/rewards/test_process_rewards_our.py deleted file mode 100644 index 6217bba..0000000 --- a/tests/rewards/test_process_rewards_our.py +++ /dev/null @@ -1,466 +0,0 @@ -from math import isclose - -from eth_validator_watcher.models import BeaconType, Rewards, Validators -from eth_validator_watcher.rewards import ( - metric_our_actual_heads_count, - metric_our_actual_neg_sources_count, - metric_our_actual_neg_targets_count, - metric_our_actual_pos_sources_count, - metric_our_actual_pos_targets_count, - metric_our_ideal_heads_count, - metric_our_ideal_sources_count, - metric_our_ideal_targets_count, - metric_our_suboptimal_heads_rate_gauge, - metric_our_suboptimal_sources_rate_gauge, - metric_our_suboptimal_targets_rate_gauge, - process_rewards, -) -from eth_validator_watcher.utils import LimitedDict - -Validator = Validators.DataItem.Validator - - -def test_process_rewards_all_our_validators_are_ideal() -> None: - class Beacon: - def get_rewards( - self, - beacon_type: BeaconType, - epoch: int, - validators_index: set[int] | None = None, - ) -> Rewards: - assert isinstance(beacon_type, BeaconType) - assert epoch == 40 - assert validators_index in (None, {1, 2, 3}) - - return Rewards( - data=Rewards.Data( - ideal_rewards=[ - Rewards.Data.IdealReward( - effective_balance=31_000_000_000, - head=2_856, - target=5_511, - source=2_966, - ), - Rewards.Data.IdealReward( - effective_balance=32_000_000_000, - head=2_948, - target=5_689, - source=3_062, - ), - ], - total_rewards=[ - Rewards.Data.TotalReward( # 32 ETH - validator_index=1, source=3_062, target=5_689, head=2_948 - ), - Rewards.Data.TotalReward( # 31 ETH - validator_index=2, source=2_966, target=5_511, head=2_856 - ), - Rewards.Data.TotalReward( # 32 ETH - validator_index=3, source=3_062, target=5_689, head=2_948 - ), - ], - ) - ) - - beacon = Beacon() - - ideal_sources_count_before = metric_our_ideal_sources_count.collect()[0].samples[0].value # type: ignore - ideal_targets_count_before = metric_our_ideal_targets_count.collect()[0].samples[0].value # type: ignore - ideal_heads_count_before = metric_our_ideal_heads_count.collect()[0].samples[0].value # type: ignore - - actual_positive_sources_count_before = metric_our_actual_pos_sources_count.collect()[0].samples[0].value # type: ignore - actual_negative_sources_count_before = metric_our_actual_neg_sources_count.collect()[0].samples[0].value # type: ignore - actual_positive_targets_count_before = metric_our_actual_pos_targets_count.collect()[0].samples[0].value # type: ignore - actual_negative_targets_count_before = metric_our_actual_neg_targets_count.collect()[0].samples[0].value # type: ignore - actual_heads_count_before = metric_our_actual_heads_count.collect()[0].samples[0].value # type: ignore - - net_epoch_to_index_to_validator = LimitedDict(2) - net_epoch_to_index_to_validator[42] = { - 1: Validator( - pubkey="0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", - effective_balance=32_000_000_000, - slashed=False, - ), - 2: Validator( - pubkey="0x222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222", - effective_balance=31_000_000_000, - slashed=False, - ), - 3: Validator( - pubkey="0x333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333", - effective_balance=32_000_000_000, - slashed=False, - ), - } - - our_epoch_to_index_to_validator = LimitedDict(2) - our_epoch_to_index_to_validator[42] = net_epoch_to_index_to_validator[42] - - process_rewards( - beacon, # type: ignore - BeaconType.LIGHTHOUSE, - 42, - net_epoch_to_index_to_validator, - our_epoch_to_index_to_validator, - ) - - ideal_sources_count_after = metric_our_ideal_sources_count.collect()[0].samples[0].value # type: ignore - ideal_targets_count_after = metric_our_ideal_targets_count.collect()[0].samples[0].value # type: ignore - ideal_heads_count_after = metric_our_ideal_heads_count.collect()[0].samples[0].value # type: ignore - - actual_positive_sources_count_after = metric_our_actual_pos_sources_count.collect()[0].samples[0].value # type: ignore - actual_negative_sources_count_after = metric_our_actual_neg_sources_count.collect()[0].samples[0].value # type: ignore - actual_positive_targets_count_after = metric_our_actual_pos_targets_count.collect()[0].samples[0].value # type: ignore - actual_negative_targets_count_after = metric_our_actual_neg_targets_count.collect()[0].samples[0].value # type: ignore - - actual_heads_count_after = metric_our_actual_heads_count.collect()[0].samples[0].value # type: ignore - - assert ideal_sources_count_after - ideal_sources_count_before == 9_090 - assert ideal_targets_count_after - ideal_targets_count_before == 16_889 - assert ideal_heads_count_after - ideal_heads_count_before == 8_752 - - assert ( - actual_positive_sources_count_after - actual_positive_sources_count_before - == 9_090 - ) - - assert ( - actual_negative_sources_count_after - actual_negative_sources_count_before == 0 - ) - - assert ( - actual_positive_targets_count_after - actual_positive_targets_count_before - == 16_889 - ) - - assert ( - actual_negative_targets_count_after - actual_negative_targets_count_before == 0 - ) - - assert actual_heads_count_after - actual_heads_count_before == 8_752 - - assert isclose(metric_our_suboptimal_sources_rate_gauge.collect()[0].samples[0].value, 0.0) # type: ignore - assert isclose(metric_our_suboptimal_targets_rate_gauge.collect()[0].samples[0].value, 0.0) # type: ignore - assert isclose(metric_our_suboptimal_heads_rate_gauge.collect()[0].samples[0].value, 0.0) # type: ignore - - -def test_process_rewards_some_our_validators_are_ideal() -> None: - """10 validators. - 5 are perfect. - 2 have good source, good target but wrong head. - 2 have good source, but wrong target and wrong head. - 1 has wrong source, wrong target and wrong head. - """ - - class Beacon: - def get_rewards( - self, - beacon_type: BeaconType, - epoch: int, - validators_index: set[int] | None = None, - ) -> Rewards: - assert isinstance(beacon_type, BeaconType) - assert epoch == 40 - assert validators_index in (None, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) - - return Rewards( - data=Rewards.Data( - ideal_rewards=[ - Rewards.Data.IdealReward( - effective_balance=31_000_000_000, - source=2_966, - target=5_511, - head=2_856, - ), - Rewards.Data.IdealReward( - effective_balance=32_000_000_000, - source=3_062, - target=5_689, - head=2_948, - ), - ], - total_rewards=[ - Rewards.Data.TotalReward( # 32 ETH - GS, GT, GH - validator_index=1, source=3_062, target=5_689, head=2_948 - ), - Rewards.Data.TotalReward( # 32 ETH - GS, GT, GH - validator_index=2, source=3_062, target=5_689, head=2_948 - ), - Rewards.Data.TotalReward( # 32 ETH - GS, GT, GH - validator_index=3, source=3_062, target=5_689, head=2_948 - ), - Rewards.Data.TotalReward( # 32 ETH - GS, GT, GH - validator_index=4, source=3_062, target=5_689, head=2_948 - ), - Rewards.Data.TotalReward( # 32 ETH - GS, GT, GH - validator_index=5, source=3_062, target=5_689, head=2_948 - ), - Rewards.Data.TotalReward( # 32 ETH - GS, GT, BH - validator_index=6, source=3_062, target=5_689, head=0 - ), - Rewards.Data.TotalReward( # 32 ETH - GS, GT, BH - validator_index=7, source=3_062, target=5_689, head=0 - ), - Rewards.Data.TotalReward( # 32 ETH - GS, BT, BH - validator_index=8, source=3_062, target=-5_707, head=0 - ), - Rewards.Data.TotalReward( # 31 ETH - GS, BT, BH - validator_index=9, source=2_966, target=-5_600, head=0 - ), - Rewards.Data.TotalReward( # 32 ETH - BS, BT, BH - validator_index=10, source=-3_073, target=-5_707, head=0 - ), - ], - ) - ) - - beacon = Beacon() - - ideal_sources_count_before = metric_our_ideal_sources_count.collect()[0].samples[0].value # type: ignore - ideal_targets_count_before = metric_our_ideal_targets_count.collect()[0].samples[0].value # type: ignore - ideal_heads_count_before = metric_our_ideal_heads_count.collect()[0].samples[0].value # type: ignore - - actual_positive_sources_count_before = metric_our_actual_pos_sources_count.collect()[0].samples[0].value # type: ignore - actual_negative_sources_count_before = metric_our_actual_neg_sources_count.collect()[0].samples[0].value # type: ignore - actual_positive_targets_count_before = metric_our_actual_pos_targets_count.collect()[0].samples[0].value # type: ignore - actual_negative_targets_count_before = metric_our_actual_neg_targets_count.collect()[0].samples[0].value # type: ignore - actual_heads_count_before = metric_our_actual_heads_count.collect()[0].samples[0].value # type: ignore - - net_epoch_to_index_to_validator = LimitedDict(2) - net_epoch_to_index_to_validator[42] = { - 1: Validator( - pubkey="0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", - effective_balance=32_000_000_000, - slashed=False, - ), - 2: Validator( - pubkey="0x222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222", - effective_balance=32_000_000_000, - slashed=False, - ), - 3: Validator( - pubkey="0x333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333", - effective_balance=32_000_000_000, - slashed=False, - ), - 4: Validator( - pubkey="444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444", - effective_balance=32_000_000_000, - slashed=False, - ), - 5: Validator( - pubkey="555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555", - effective_balance=32_000_000_000, - slashed=False, - ), - 6: Validator( - pubkey="666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666", - effective_balance=32_000_000_000, - slashed=False, - ), - 7: Validator( - pubkey="777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777777", - effective_balance=32_000_000_000, - slashed=False, - ), - 8: Validator( - pubkey="888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888", - effective_balance=32_000_000_000, - slashed=False, - ), - 9: Validator( - pubkey="999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999", - effective_balance=31_000_000_000, - slashed=False, - ), - 10: Validator( - pubkey="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - effective_balance=32_000_000_000, - slashed=False, - ), - } - - our_epoch_to_index_to_validator = LimitedDict(2) - our_epoch_to_index_to_validator[42] = net_epoch_to_index_to_validator[42] - - process_rewards( - beacon, # type: ignore - BeaconType.LIGHTHOUSE, - 42, - net_epoch_to_index_to_validator, - our_epoch_to_index_to_validator, - ) - - ideal_sources_count_after = metric_our_ideal_sources_count.collect()[0].samples[0].value # type: ignore - ideal_targets_count_after = metric_our_ideal_targets_count.collect()[0].samples[0].value # type: ignore - ideal_heads_count_after = metric_our_ideal_heads_count.collect()[0].samples[0].value # type: ignore - - actual_positive_sources_count_after = metric_our_actual_pos_sources_count.collect()[0].samples[0].value # type: ignore - actual_negative_sources_count_after = metric_our_actual_neg_sources_count.collect()[0].samples[0].value # type: ignore - actual_positive_targets_count_after = metric_our_actual_pos_targets_count.collect()[0].samples[0].value # type: ignore - actual_negative_targets_count_after = metric_our_actual_neg_targets_count.collect()[0].samples[0].value # type: ignore - - actual_heads_count_after = metric_our_actual_heads_count.collect()[0].samples[0].value # type: ignore - - assert ideal_sources_count_after - ideal_sources_count_before == 30_524 - assert ideal_targets_count_after - ideal_targets_count_before == 56_712 - assert ideal_heads_count_after - ideal_heads_count_before == 29_388 - - assert ( - actual_positive_sources_count_after - actual_positive_sources_count_before - == 24_389 - ) - - assert ( - actual_negative_sources_count_after - actual_negative_sources_count_before == 0 - ) - - assert ( - actual_positive_targets_count_after - actual_positive_targets_count_before - == 22_809 - ) - - assert ( - actual_negative_targets_count_after - actual_negative_targets_count_before == 0 - ) - - assert actual_heads_count_after - actual_heads_count_before == 14_740 - - assert isclose( - metric_our_suboptimal_sources_rate_gauge.collect()[0].samples[0].value, # type: ignore - 0.1, - ) - - assert isclose( - metric_our_suboptimal_targets_rate_gauge.collect()[0].samples[0].value, # type: ignore - 0.3, - ) - - assert isclose( - metric_our_suboptimal_heads_rate_gauge.collect()[0].samples[0].value, # type: ignore - 0.5, - ) - - -def test_process_rewards_no_our_validator_is_ideal() -> None: - class Beacon: - def get_rewards( - self, - beacon_type: BeaconType, - epoch: int, - validators_index: set[int] | None = None, - ) -> Rewards: - assert isinstance(beacon_type, BeaconType) - assert epoch == 40 - assert validators_index in (None, {1, 2, 3}) - - return Rewards( - data=Rewards.Data( - ideal_rewards=[ - Rewards.Data.IdealReward( - effective_balance=31_000_000_000, - head=2_856, - target=5_511, - source=2_966, - ), - Rewards.Data.IdealReward( - effective_balance=32_000_000_000, - head=2_948, - target=5_689, - source=3_062, - ), - ], - total_rewards=[ - Rewards.Data.TotalReward( # 32 ETH - validator_index=1, source=-9_000, target=-8_000, head=0 - ), - Rewards.Data.TotalReward( # 31 ETH - validator_index=2, source=-8_500, target=-7_500, head=0 - ), - Rewards.Data.TotalReward( # 32 ETH - validator_index=3, source=-9_000, target=-8_000, head=0 - ), - ], - ) - ) - - beacon = Beacon() - - ideal_sources_count_before = metric_our_ideal_sources_count.collect()[0].samples[0].value # type: ignore - ideal_targets_count_before = metric_our_ideal_targets_count.collect()[0].samples[0].value # type: ignore - ideal_heads_count_before = metric_our_ideal_heads_count.collect()[0].samples[0].value # type: ignore - - actual_positive_sources_count_before = metric_our_actual_pos_sources_count.collect()[0].samples[0].value # type: ignore - actual_negative_sources_count_before = metric_our_actual_neg_sources_count.collect()[0].samples[0].value # type: ignore - actual_positive_targets_count_before = metric_our_actual_pos_targets_count.collect()[0].samples[0].value # type: ignore - actual_negative_targets_count_before = metric_our_actual_neg_targets_count.collect()[0].samples[0].value # type: ignore - actual_heads_count_before = metric_our_actual_heads_count.collect()[0].samples[0].value # type: ignore - - net_epoch_to_index_to_validator = LimitedDict(2) - net_epoch_to_index_to_validator[42] = { - 1: Validator( - pubkey="0x111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111", - effective_balance=32_000_000_000, - slashed=False, - ), - 2: Validator( - pubkey="0x222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222", - effective_balance=31_000_000_000, - slashed=False, - ), - 3: Validator( - pubkey="0x333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333", - effective_balance=32_000_000_000, - slashed=False, - ), - } - - our_epoch_to_index_to_validator = LimitedDict(2) - our_epoch_to_index_to_validator[42] = net_epoch_to_index_to_validator[42] - - process_rewards( - beacon, # type: ignore - BeaconType.LIGHTHOUSE, - 42, - net_epoch_to_index_to_validator, - our_epoch_to_index_to_validator, - ) - - ideal_sources_count_after = metric_our_ideal_sources_count.collect()[0].samples[0].value # type: ignore - ideal_targets_count_after = metric_our_ideal_targets_count.collect()[0].samples[0].value # type: ignore - ideal_heads_count_after = metric_our_ideal_heads_count.collect()[0].samples[0].value # type: ignore - - actual_positive_sources_count_after = metric_our_actual_pos_sources_count.collect()[0].samples[0].value # type: ignore - actual_negative_sources_count_after = metric_our_actual_neg_sources_count.collect()[0].samples[0].value # type: ignore - actual_positive_targets_count_after = metric_our_actual_pos_targets_count.collect()[0].samples[0].value # type: ignore - actual_negative_targets_count_after = metric_our_actual_neg_targets_count.collect()[0].samples[0].value # type: ignore - - actual_heads_count_after = metric_our_actual_heads_count.collect()[0].samples[0].value # type: ignore - - assert ideal_sources_count_after - ideal_sources_count_before == 9_090 - assert ideal_targets_count_after - ideal_targets_count_before == 16_889 - assert ideal_heads_count_after - ideal_heads_count_before == 8_752 - - assert ( - actual_positive_sources_count_after - actual_positive_sources_count_before == 0 - ) - - assert ( - actual_negative_sources_count_after - actual_negative_sources_count_before - == 26_500 - ) - - assert ( - actual_positive_targets_count_after - actual_positive_targets_count_before == 0 - ) - - assert ( - actual_negative_targets_count_after - actual_negative_targets_count_before - == 23_500 - ) - - assert actual_heads_count_after - actual_heads_count_before == 0 - - assert isclose(metric_our_suboptimal_sources_rate_gauge.collect()[0].samples[0].value, 1.0) # type: ignore - assert isclose(metric_our_suboptimal_targets_rate_gauge.collect()[0].samples[0].value, 1.0) # type: ignore - assert isclose(metric_our_suboptimal_heads_rate_gauge.collect()[0].samples[0].value, 1.0) # type: ignore diff --git a/tests/slashed_validators/test_process_slashed_validators.py b/tests/slashed_validators/test_process_slashed_validators.py deleted file mode 100644 index 7e154c0..0000000 --- a/tests/slashed_validators/test_process_slashed_validators.py +++ /dev/null @@ -1,103 +0,0 @@ -from eth_validator_watcher.models import Validators -from eth_validator_watcher.slashed_validators import ( - SlashedValidators, - metric_our_slashed_validators_count, - metric_total_slashed_validators_count, -) - -Validator = Validators.DataItem.Validator - - -def test_process_slashed_validators(): - class Slack: - def __init__(self): - self.counter = 0 - - def send_message(self, _: str) -> None: - self.counter += 1 - - slack = Slack() - - slashed_validators = SlashedValidators(slack) # type: ignore - - total_exited_slashed_index_to_validator = { - 42: Validator(pubkey="0x1234", effective_balance=32000000000, slashed=True), - 43: Validator(pubkey="0x5678", effective_balance=32000000000, slashed=True), - 44: Validator(pubkey="0x9012", effective_balance=32000000000, slashed=True), - 45: Validator(pubkey="0x3456", effective_balance=32000000000, slashed=True), - 46: Validator(pubkey="0xabcd", effective_balance=32000000000, slashed=True), - } - - total_withdrawal_index_to_validator = { - 47: Validator(pubkey="0xefgh", effective_balance=32000000000, slashed=True), - 48: Validator(pubkey="0xijkl", effective_balance=32000000000, slashed=False), - 49: Validator(pubkey="0xaaaa", effective_balance=32000000000, slashed=False), - 50: Validator(pubkey="0xbbbb", effective_balance=32000000000, slashed=True), - } - - our_exited_slashed_index_to_validator = { - 44: Validator(pubkey="0x9012", effective_balance=32000000000, slashed=True), - 45: Validator(pubkey="0x3456", effective_balance=32000000000, slashed=True), - } - - our_withdrawal_index_to_validator = { - 49: Validator(pubkey="0xaaaa", effective_balance=32000000000, slashed=False), - 50: Validator(pubkey="0xbbbb", effective_balance=32000000000, slashed=True), - } - - slashed_validators.process( - total_exited_slashed_index_to_validator, - our_exited_slashed_index_to_validator, - total_withdrawal_index_to_validator, - our_withdrawal_index_to_validator, - ) - - assert metric_total_slashed_validators_count.collect()[0].samples[0].value == 7 # type: ignore - assert metric_our_slashed_validators_count.collect()[0].samples[0].value == 3 # type: ignore - assert slack.counter == 0 - - assert ( - slashed_validators._SlashedValidators__total_exited_slashed_indexes # type: ignore - == {42, 43, 44, 45, 46} - ) - - assert ( - slashed_validators._SlashedValidators__our_exited_slashed_indexes # type: ignore - == {44, 45} - ) - - total_exited_slashed_index_to_validator = { - 42: Validator(pubkey="0x1234", effective_balance=32000000000, slashed=True), - 43: Validator(pubkey="0x5678", effective_balance=32000000000, slashed=True), - 44: Validator(pubkey="0x9012", effective_balance=32000000000, slashed=True), - 45: Validator(pubkey="0x3456", effective_balance=32000000000, slashed=True), - 46: Validator(pubkey="0xabcd", effective_balance=32000000000, slashed=True), - 51: Validator(pubkey="0xffff", effective_balance=32000000000, slashed=True), - } - - our_exited_slashed_index_to_validator = { - 44: Validator(pubkey="0x9012", effective_balance=32000000000, slashed=True), - 45: Validator(pubkey="0x3456", effective_balance=32000000000, slashed=True), - 52: Validator(pubkey="0xeeee", effective_balance=32000000000, slashed=True), - } - - slashed_validators.process( - total_exited_slashed_index_to_validator, - our_exited_slashed_index_to_validator, - total_withdrawal_index_to_validator, - our_withdrawal_index_to_validator, - ) - - assert metric_total_slashed_validators_count.collect()[0].samples[0].value == 8 # type: ignore - assert metric_our_slashed_validators_count.collect()[0].samples[0].value == 4 # type: ignore - assert slack.counter == 1 - - assert ( - slashed_validators._SlashedValidators__total_exited_slashed_indexes # type: ignore - == {42, 43, 44, 45, 46, 51} - ) - - assert ( - slashed_validators._SlashedValidators__our_exited_slashed_indexes # type: ignore - == {44, 45, 52} - ) diff --git a/tests/suboptimal_attestations/__init__.py b/tests/suboptimal_attestations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/suboptimal_attestations/assets/__init__.py b/tests/suboptimal_attestations/assets/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/suboptimal_attestations/assets/block.json b/tests/suboptimal_attestations/assets/block.json deleted file mode 100644 index 5b8cbdf..0000000 --- a/tests/suboptimal_attestations/assets/block.json +++ /dev/null @@ -1,93 +0,0 @@ -{ - "version": "bellatrix", - "execution_optimistic": false, - "data": { - "message": { - "slot": "4839775", - "proposer_index": "365100", - "parent_root": "0xe90537191ff89b8a416ef5b128d7bc825c9f4af1fd15274d00b50374bcd83c87", - "state_root": "0xfd9677861ad339b698bac2555c2b7df5b04820807116010ebaf499f39acd4170", - "body": { - "randao_reveal": "0x98539cdc416440d3a26959a7f07b7c093a984221a78087496f5846ab694b557654836a7713649d1d9127680df5038147082bcbde5d5a427f302dcff76cb8cabaa990a131553e2193f88494a23cefbeda154cc88fe97cdba798d6550b250e5b2b", - "eth1_data": { - "deposit_root": "0x86b32b120d274e30bd5fd401610b0d8891d8eb48dc68038cadfc15de58215d7c", - "deposit_count": "449941", - "block_hash": "0x060356bdb8bf84bb2c1ca7e3874883802c672a4120b25d3b8bfb67524483a6fe" - }, - "graffiti": "0x0000000000000000000000000000000000000000000000000000000000000000", - "proposer_slashings": [], - "attester_slashings": [], - "attestations": [ - { - "aggregation_bits": "0x00ffff", - "data": { - "slot": "4839774", - "index": "1", - "beacon_block_root": "0xe90537191ff89b8a416ef5b128d7bc825c9f4af1fd15274d00b50374bcd83c87", - "source": { - "epoch": "151241", - "root": "0x8bd8a1dfa949c0f7de21083bb733fc71e36ab5754535a5970ba6b45ae7347129" - }, - "target": { - "epoch": "151242", - "root": "0x0dbfd0dc78569bcab7e2fc05d68c781ed96d2df4c6ffaeee81f2553babf287d3" - } - }, - "signature": "0xaa96594a0024e1e3cc7b17456e07515dc987698cdaba451227ee40d32dc931a909ec92200d06ebc8174b65c64f18873e17f6d20adba701ce6c9f58de424833a023486ff1ab3a8f6fe0e72e6e0ded516011786843016dd672b0730d90b108990b" - }, - { - "aggregation_bits": "0xfe00ff", - "data": { - "slot": "4839774", - "index": "1", - "beacon_block_root": "0xe90537191ff89b8a416ef5b128d7bc825c9f4af1fd15274d00b50374bcd83c87", - "source": { - "epoch": "151241", - "root": "0x8bd8a1dfa949c0f7de21083bb733fc71e36ab5754535a5970ba6b45ae7347129" - }, - "target": { - "epoch": "151242", - "root": "0x0dbfd0dc78569bcab7e2fc05d68c781ed96d2df4c6ffaeee81f2553babf287d3" - } - }, - "signature": "0xaa96594a0024e1e3cc7b17456e07515dc987698cdaba451227ee40d32dc931a909ec92200d06ebc8174b65c64f18873e17f6d20adba701ce6c9f58de424833a023486ff1ab3a8f6fe0e72e6e0ded516011786843016dd672b0730d90b108990b" - }, - { - "aggregation_bits": "0xff00ff", - "data": { - "slot": "4839774", - "index": "2", - "beacon_block_root": "0xe90537191ff89b8a416ef5b128d7bc825c9f4af1fd15274d00b50374bcd83c87", - "source": { - "epoch": "151241", - "root": "0x8bd8a1dfa949c0f7de21083bb733fc71e36ab5754535a5970ba6b45ae7347129" - }, - "target": { - "epoch": "151242", - "root": "0x0dbfd0dc78569bcab7e2fc05d68c781ed96d2df4c6ffaeee81f2553babf287d3" - } - }, - "signature": "0xaa96594a0024e1e3cc7b17456e07515dc987698cdaba451227ee40d32dc931a909ec92200d06ebc8174b65c64f18873e17f6d20adba701ce6c9f58de424833a023486ff1ab3a8f6fe0e72e6e0ded516011786843016dd672b0730d90b108990b" - }, - { - "aggregation_bits": "0xff00ff", - "data": { - "slot": "4839773", - "index": "3", - "beacon_block_root": "0xe90537191ff89b8a416ef5b128d7bc825c9f4af1fd15274d00b50374bcd83c87", - "source": { - "epoch": "151241", - "root": "0x8bd8a1dfa949c0f7de21083bb733fc71e36ab5754535a5970ba6b45ae7347129" - }, - "target": { - "epoch": "151242", - "root": "0x0dbfd0dc78569bcab7e2fc05d68c781ed96d2df4c6ffaeee81f2553babf287d3" - } - }, - "signature": "0xaa96594a0024e1e3cc7b17456e07515dc987698cdaba451227ee40d32dc931a909ec92200d06ebc8174b65c64f18873e17f6d20adba701ce6c9f58de424833a023486ff1ab3a8f6fe0e72e6e0ded516011786843016dd672b0730d90b108990b" - } - ] - } - } - } -} diff --git a/tests/suboptimal_attestations/test_aggregate_attestations.py b/tests/suboptimal_attestations/test_aggregate_attestations.py deleted file mode 100644 index 3a9fe14..0000000 --- a/tests/suboptimal_attestations/test_aggregate_attestations.py +++ /dev/null @@ -1,80 +0,0 @@ -import json -from pathlib import Path - -import requests_mock - -from eth_validator_watcher.models import Block -from eth_validator_watcher.suboptimal_attestations import aggregate_attestations -from tests.beacon import assets - - -def test_aggregate_attestations(): - beacon_url = "http://beacon:5052" - block_path = Path(assets.__file__).parent / "block.json" - - expected = { - 1: [ - False, - True, - True, - True, - True, - True, - True, - True, - # -- - True, - True, - True, - True, - True, - True, - True, - True, - # -- - True, - True, - True, - True, - True, - True, - True, - # -- - ], - 2: [ - True, - True, - True, - True, - True, - True, - True, - True, - # -- - False, - False, - False, - False, - False, - False, - False, - False, - # -- - True, - True, - True, - True, - True, - True, - True, - # -- - ], - } - - with block_path.open() as file_descriptor: - block_dict = json.load(file_descriptor) - - block = Block(**block_dict) - - with requests_mock.Mocker() as mock: - assert aggregate_attestations(block, 4839774) == expected diff --git a/tests/suboptimal_attestations/test_suboptimal_attestations.py b/tests/suboptimal_attestations/test_suboptimal_attestations.py deleted file mode 100644 index 10a4564..0000000 --- a/tests/suboptimal_attestations/test_suboptimal_attestations.py +++ /dev/null @@ -1,152 +0,0 @@ -from eth_validator_watcher import models, suboptimal_attestations -from eth_validator_watcher.suboptimal_attestations import ( - process_suboptimal_attestations, - metric_suboptimal_attestations_rate_gauge, -) - -Validator = models.Validators.DataItem.Validator - - -def aggregate_attestations( - block: str, - slot: int, -) -> dict[int, list[bool]]: - assert block == "A dummy block" - assert slot == 41 - - return { - 0: [ - False, # Not our key - True, # Not our key - False, # Not our key - True, # Not our key - False, # Not our key - True, # Not our key - False, # Not our key - True, # Not our key - False, # Not our key - False, # 0xaaa (validator index 10) - False, # Not our key - True, # Not our key - True, # 0xccc (validator index 30) - False, # Not our key - False, # Not our key - True, # Not our key - False, # Not our key - False, # Not our key - ], - 1: [ - False, # Not our key - True, # Not our key - False, # Not our key - True, # 0xeee (validator index 50) - False, # Not our key - True, # Not our key - False, # 0xggg (validator index 70) - True, # Not our key - False, # Not our key - False, # Not our key - False, # Not our key - True, # Not our key - True, # Not our key - False, # Not our key - False, # Not our key - True, # Not our key - False, # Not our key - False, # Not our key - ], - } - - -def test_low_slot() -> None: - expected: set[int] = set() - - actual = process_suboptimal_attestations( - beacon="A dummy beacon", # type: ignore - block="A dummy block", # type: ignore - slot=0, - our_active_validators_index_to_validator={}, - ) - - assert expected == actual - - -def test_our_pubkeys() -> None: - """ - In this test case, our pubkeys are "0xaaa" ==> "0xggg". - Only "0xaaa", "0xccc", "0xeee" & "0xggg" are active. - Respective validators index are 10, 30, 50, 70. - - "0ccc (30)" and "0xeee (50)" performed optimally during the current epoch. - "0xaaa (10)" and "0xggg (70)" did not perform optimally during the current epoch. - """ - - class Beacon: - @staticmethod - def get_duty_slot_to_committee_index_to_validators_index( - epoch: int, - ) -> dict[int, dict[int, list[int]]]: - assert epoch == 1 - - return { - 41: { - 0: [ - 1, # Not our key - 2, # Not our key - 3, # Not our key - 4, # Not our key - 5, # Not our key - 6, # Not our key - 7, # Not our key - 8, # Not our key - 9, # Not our key - 10, # 0xaaa - 11, # Not our key - 29, # Not our key - 30, # 0xccc - 31, # Not our key - 32, # Not our key - 33, # Not our key - 34, # Not our key - 35, # Not our key - ], - 1: [ - 47, # Not our key - 48, # Not our key - 49, # Not our key - 50, # 0xeee - 51, # Not our key - 69, # Not our key - 70, # 0xfff - 71, # Not our key - 72, # Not our key - 73, # Not our key - 74, # Not our key - 75, # Not our key - 76, # Not our key - 77, # Not our key - 78, # Not our key - 79, # Not our key - 80, # Not our key - 81, # Not our key - ], - } - } - - suboptimal_attestations.aggregate_attestations = aggregate_attestations - - expected = {10, 70} - actual = process_suboptimal_attestations( - beacon=Beacon(), # type: ignore - block="A dummy block", # type: ignore - slot=42, - our_active_validators_index_to_validator={ - 10: Validator(pubkey="0xaaa", effective_balance=32000000000, slashed=False), - 30: Validator(pubkey="0xccc", effective_balance=32000000000, slashed=False), - 50: Validator(pubkey="0xeee", effective_balance=32000000000, slashed=False), - 70: Validator(pubkey="0xggg", effective_balance=32000000000, slashed=False), - }, - ) - - assert expected == actual - assert metric_suboptimal_attestations_rate_gauge.collect()[0].samples[0].value == 50.0 # type: ignore diff --git a/tests/utils/__init__.py b/tests/utils/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/utils/test_aggregate_bools.py b/tests/utils/test_aggregate_bools.py deleted file mode 100644 index 3784112..0000000 --- a/tests/utils/test_aggregate_bools.py +++ /dev/null @@ -1,15 +0,0 @@ -import pytest - -from eth_validator_watcher.utils import aggregate_bools - - -def test_aggregate_bools(): - input = [[False, False, True], [False, True, False]] - expected = [False, True, True] - - assert aggregate_bools(input) == expected - - input = [[False, False], [False, True, False]] - - with pytest.raises(ValueError): - aggregate_bools(input) diff --git a/tests/utils/test_apply_mask.py b/tests/utils/test_apply_mask.py deleted file mode 100644 index 9c50c50..0000000 --- a/tests/utils/test_apply_mask.py +++ /dev/null @@ -1,9 +0,0 @@ -from eth_validator_watcher.utils import apply_mask - - -def test_apply_mask(): - input = ["a", "b", "c", "d", "e"] - mask = [True, False, False, True, False] - expected = {"a", "d"} - - assert apply_mask(input, mask) == expected diff --git a/tests/utils/test_convert_hex_to_bools.py b/tests/utils/test_convert_hex_to_bools.py deleted file mode 100644 index b9f78fa..0000000 --- a/tests/utils/test_convert_hex_to_bools.py +++ /dev/null @@ -1,25 +0,0 @@ -from eth_validator_watcher.utils import convert_hex_to_bools - - -def test_convert_hex_to_bools(): - expected = [ - False, - False, - False, - False, - True, - True, - True, - True, - False, - False, - False, - False, - True, - False, - True, - False, - ] - - assert convert_hex_to_bools("0x0F0A") == expected - assert convert_hex_to_bools("0F0A") == expected diff --git a/tests/utils/test_convert_seconds_to_dhms.py b/tests/utils/test_convert_seconds_to_dhms.py deleted file mode 100644 index c79c1c6..0000000 --- a/tests/utils/test_convert_seconds_to_dhms.py +++ /dev/null @@ -1,8 +0,0 @@ -from eth_validator_watcher.utils import convert_seconds_to_dhms - - -def test_convert_secondes_to_dhms() -> None: - assert convert_seconds_to_dhms(0) == (0, 0, 0, 0) - assert convert_seconds_to_dhms(61) == (0, 0, 1, 1) - assert convert_seconds_to_dhms(3601) == (0, 1, 0, 1) - assert convert_seconds_to_dhms(86462) == (1, 0, 1, 2) diff --git a/tests/utils/test_eth1_address_0x_prefixed.py b/tests/utils/test_eth1_address_0x_prefixed.py deleted file mode 100644 index ed1cadd..0000000 --- a/tests/utils/test_eth1_address_0x_prefixed.py +++ /dev/null @@ -1,31 +0,0 @@ -from pytest import raises - -from eth_validator_watcher.utils import eth1_address_lower_0x_prefixed - - -def test_eth1_address_0x_prefixed_invalid() -> None: - # Too short - with raises(ValueError): - eth1_address_lower_0x_prefixed("0x123") - - # Too long - with raises(ValueError): - eth1_address_lower_0x_prefixed( - "0x123456789012345678901234567890123456789012345678901234567890123" - ) - - # Invalid character - with raises(ValueError): - eth1_address_lower_0x_prefixed("0x8d8b1b85d02d05ad3a14e2e9cc7b458d5invalid") - - -def test_eth1_address_0x_prefixed_valid_already_prefixed() -> None: - input = "0x8D8B1b85D02d05Ad3a14E2e9cC7b458d5c7d8f8c" - expected_output = "0x8d8b1b85d02d05ad3a14e2e9cc7b458d5c7d8f8c" - assert eth1_address_lower_0x_prefixed(input) == expected_output - - -def test_eth1_address_0x_prefixed_valid_not_already_prefixed() -> None: - input = "8D8B1b85D02d05Ad3a14E2e9cC7b458d5c7d8f8c" - expected_output = "0x8d8b1b85d02d05ad3a14e2e9cc7b458d5c7d8f8c" - assert eth1_address_lower_0x_prefixed(input) == expected_output diff --git a/tests/utils/test_eth2_address_0x_prefixed.py b/tests/utils/test_eth2_address_0x_prefixed.py deleted file mode 100644 index 6e721a2..0000000 --- a/tests/utils/test_eth2_address_0x_prefixed.py +++ /dev/null @@ -1,31 +0,0 @@ -from pytest import raises - -from eth_validator_watcher.utils import eth2_address_lower_0x_prefixed - - -def test_eth2_address_0x_prefixed_invalid() -> None: - # Too short - with raises(ValueError): - eth2_address_lower_0x_prefixed("0x123") - - # Too long - with raises(ValueError): - eth2_address_lower_0x_prefixed( - "0x123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" - ) - - # Invalid character - with raises(ValueError): - eth2_address_lower_0x_prefixed("0x8d8b1b85d02d05ad3a14e2e9cc7b458d5invalid") - - -def test_eth2_address_0x_prefixed_valid_already_prefixed() -> None: - input = "0xB2dDae7E32fd8257c2dd468ca16dc86d310cab218f9a41ed6fabea525a9620d46955350776e8496553138c8a291a365b" - expected_output = "0xb2ddae7e32fd8257c2dd468ca16dc86d310cab218f9a41ed6fabea525a9620d46955350776e8496553138c8a291a365b" - assert eth2_address_lower_0x_prefixed(input) == expected_output - - -def test_eth2_address_0x_prefixed_valid_not_already_prefixed() -> None: - input = "B2Ddae7e32fd8257C2dd468ca16dc86d310cab218f9a41ed6fabea525a9620d46955350776e8496553138c8a291a365b" - expected_output = "0xb2ddae7e32fd8257c2dd468ca16dc86d310cab218f9a41ed6fabea525a9620d46955350776e8496553138c8a291a365b" - assert eth2_address_lower_0x_prefixed(input) == expected_output diff --git a/tests/utils/test_get_our_pubkeys.py b/tests/utils/test_get_our_pubkeys.py deleted file mode 100644 index 395e47e..0000000 --- a/tests/utils/test_get_our_pubkeys.py +++ /dev/null @@ -1,33 +0,0 @@ -from pathlib import Path - -from eth_validator_watcher.config import WatchedKeyConfig -from eth_validator_watcher.utils import get_our_pubkeys - - -class Web3Signer: - @staticmethod - def load_pubkeys() -> set[str]: - return { - "0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", - "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - } - - -def test_get_our_pubkeys() -> None: - watched_keys = [ - WatchedKeyConfig(public_key="0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"), - WatchedKeyConfig(public_key="0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"), - WatchedKeyConfig(public_key="0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"), - ] - web3signer = Web3Signer() - - expected = { - "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", - "0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", - "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - } - assert get_our_pubkeys(watched_keys, web3signer) == expected # type: ignore diff --git a/tests/utils/test_limited_dict.py b/tests/utils/test_limited_dict.py deleted file mode 100644 index 36e4ece..0000000 --- a/tests/utils/test_limited_dict.py +++ /dev/null @@ -1,53 +0,0 @@ -from eth_validator_watcher.utils import LimitedDict -from pytest import raises - - -def test_negative() -> None: - with raises(AssertionError): - LimitedDict(-1) - - -def test_nominal_increasing() -> None: - limited_dict = LimitedDict(2) - assert len(limited_dict) == 0 - - limited_dict[1] = "a" - assert len(limited_dict) == 1 - assert 1 in limited_dict - assert limited_dict[1] == "a" - - limited_dict[2] = "b" - assert len(limited_dict) == 2 - assert 2 in limited_dict - assert limited_dict[2] == "b" - - limited_dict[3] = "c" - assert len(limited_dict) == 2 - assert 3 in limited_dict - assert limited_dict[3] == "c" - assert 1 not in limited_dict - - with raises(KeyError): - limited_dict[1] - - -def test_nominal_not_increasing() -> None: - limited_dict = LimitedDict(2) - assert len(limited_dict) == 0 - - limited_dict[3] = "c" - assert len(limited_dict) == 1 - assert 3 in limited_dict - assert limited_dict[3] == "c" - - limited_dict[2] = "b" - assert len(limited_dict) == 2 - assert 2 in limited_dict - assert limited_dict[2] == "b" - - limited_dict[1] = "a" - assert len(limited_dict) == 2 - assert 1 not in limited_dict - - with raises(KeyError): - limited_dict[1] diff --git a/tests/utils/test_liveness_file.py b/tests/utils/test_liveness_file.py deleted file mode 100644 index 4227f52..0000000 --- a/tests/utils/test_liveness_file.py +++ /dev/null @@ -1,11 +0,0 @@ -from pathlib import Path - -from eth_validator_watcher.utils import write_liveness_file - - -def test_write_liveness_file(tmp_path): - tmp_path = Path(tmp_path / "liveness") - write_liveness_file(tmp_path) - - with tmp_path.open() as file_descriptor: - assert next(file_descriptor) == "OK" diff --git a/tests/utils/test_remove_all_items_after_last_true.py b/tests/utils/test_remove_all_items_after_last_true.py deleted file mode 100644 index 6b8b7d2..0000000 --- a/tests/utils/test_remove_all_items_after_last_true.py +++ /dev/null @@ -1,16 +0,0 @@ -import pytest - -from eth_validator_watcher.utils import remove_all_items_from_last_true - - -def test_remove_all_items_from_last_true(): - input = [False, True, False, True, True, False] - expected = [False, True, False, True] - assert remove_all_items_from_last_true(input) == expected - - input = [True] * 5 - expected = [True] * 4 - assert remove_all_items_from_last_true(input) == expected - - with pytest.raises(StopIteration): - remove_all_items_from_last_true([False, False]) diff --git a/tests/utils/test_slack.py b/tests/utils/test_slack.py deleted file mode 100644 index 7bd6021..0000000 --- a/tests/utils/test_slack.py +++ /dev/null @@ -1,18 +0,0 @@ -from eth_validator_watcher import utils - - -class WebClient: - def __init__(self, token: str): - assert token == "my_slack_token" - - def chat_postMessage(self, channel: str, text: str): - assert channel == "MY CHANNEL" - assert text == "MY TEXT" - - -utils.WebClient = WebClient # type: ignore - - -def test_slack() -> None: - slack = utils.Slack("MY CHANNEL", "my_slack_token") - slack.send_message("MY TEXT") diff --git a/tests/utils/test_slots.py b/tests/utils/test_slots.py deleted file mode 100644 index 2bc5654..0000000 --- a/tests/utils/test_slots.py +++ /dev/null @@ -1,18 +0,0 @@ -from freezegun import freeze_time - -from eth_validator_watcher import utils -from eth_validator_watcher.utils import slots - - -def sleep(seconds: int) -> None: - assert seconds in {11, 23} - - -utils.sleep = sleep # type: ignore - - -@freeze_time("2023-01-01 00:00:13") -def test_slots() -> None: - iter_slots = iter(slots(1672531200)) - assert next(iter_slots) == (2, 1672531224) - assert next(iter_slots) == (3, 1672531236) diff --git a/tests/utils/test_switch_endianness.py b/tests/utils/test_switch_endianness.py deleted file mode 100644 index 8645caf..0000000 --- a/tests/utils/test_switch_endianness.py +++ /dev/null @@ -1,43 +0,0 @@ -from eth_validator_watcher.utils import switch_endianness - - -def test_switch_endianness(): - input = [ - False, - False, - True, - False, - True, - True, - True, - False, - True, - False, - True, - False, - False, - True, - True, - True, - ] - - expected = [ - False, - True, - True, - True, - False, - True, - False, - False, - True, - True, - True, - False, - False, - True, - False, - True, - ] - - assert switch_endianness(input) == expected diff --git a/tests/web3signer/test_web3signer.py b/tests/web3signer/test_web3signer.py deleted file mode 100644 index 3e0eb06..0000000 --- a/tests/web3signer/test_web3signer.py +++ /dev/null @@ -1,14 +0,0 @@ -import requests_mock - -from eth_validator_watcher.web3signer import Web3Signer - - -def test_web3signer(): - web3signer_url = "http://web3signer:9000" - pubkeys = ["0xaaa", "0xbbb", "0xccc"] - expected = {"0xaaa", "0xbbb", "0xccc"} - - with requests_mock.Mocker() as mock: - mock.get(f"{web3signer_url}/api/v1/eth2/publicKeys", json=pubkeys) - web3signer = Web3Signer(web3signer_url) - assert web3signer.load_pubkeys() == expected From d7741a04f0ad8d1751d175dd54dab515e3109ccc Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Tue, 14 May 2024 14:28:20 +0200 Subject: [PATCH 43/82] feat: add unit test to check existence of a block in a slot --- tests/__init__.py | 0 tests/assets/__init__.py | 0 tests/assets/sepolia_header_4996301.json | 1 + tests/test_beacon.py | 34 ++++++++++++++++++++++++ 4 files changed, 35 insertions(+) create mode 100644 tests/__init__.py create mode 100644 tests/assets/__init__.py create mode 100644 tests/assets/sepolia_header_4996301.json create mode 100644 tests/test_beacon.py diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/assets/__init__.py b/tests/assets/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/assets/sepolia_header_4996301.json b/tests/assets/sepolia_header_4996301.json new file mode 100644 index 0000000..f21df7a --- /dev/null +++ b/tests/assets/sepolia_header_4996301.json @@ -0,0 +1 @@ +{"data":{"root":"0x80e0a252b97aed4b6e123012251e05338df4734cb000ac360838fd836adb521e","canonical":true,"header":{"message":{"slot":"4996301","proposer_index":"253","parent_root":"0x2b25f247c878f483f1b57b08739e80304a6fa59277ae9207a1a818235cf427c6","state_root":"0x8d76d8dc2bcf1c656b04d397457b3924950ae78f7b076705bcc1d4b8689eac1a","body_root":"0x43e3dba3b1c79aecb915f84d37ce5b2d96216ad7440a77fdc66069845f1e7de8"},"signature":"0x86a5304c52a150ef2c3f8e030b927c565ac865eb0e4989305f01dea02754a7b242938e43e48d6b99d771fa7f4c0cdedc11251283dbc1d9d951c8ff39bba9f074441bdc91d379ea59b93da9e4392508e77ee7c3c98f5ace88275e34083b9405bd"}},"execution_optimistic":false,"finalized":false} \ No newline at end of file diff --git a/tests/test_beacon.py b/tests/test_beacon.py new file mode 100644 index 0000000..d374d7c --- /dev/null +++ b/tests/test_beacon.py @@ -0,0 +1,34 @@ +from pathlib import Path +import json +import unittest + +from pytest import raises +from requests import HTTPError, Response, codes, exceptions +from requests_mock import Mocker + +from eth_validator_watcher.beacon import Beacon, NoBlockError +from tests import assets + + +class BeaconTestCase(unittest.TestCase): + """Test case for Beacon. + + We use data from the Sepolia testnet because it has a small number + of validators and so the asset size we store on the repo is + reasonable. + """ + + def test_has_block_at_slot_ok(self) -> None: + """Test has_block_at_slot() with a block at the slot.""" + + with open(Path(assets.__file__).parent / "sepolia_header_4996301.json") as fd: + data = json.load(fd) + + with Mocker() as m: + m.get(f"http://beacon-node:5051/eth/v1/beacon/headers/4996301", json=data) + b = Beacon("http://beacon-node:5051", 90) + self.assertTrue(b.has_block_at_slot(4996301)) + + +if __name__ == "__main__": + unittest.main() From 90972afaa3f1f2940774b5b6632e99b216fae644 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Wed, 15 May 2024 10:41:21 +0200 Subject: [PATCH 44/82] fix: do not log every missed attestations --- eth_validator_watcher/blocks.py | 2 -- eth_validator_watcher/entrypoint.py | 3 --- 2 files changed, 5 deletions(-) diff --git a/eth_validator_watcher/blocks.py b/eth_validator_watcher/blocks.py index 14fd861..a483642 100644 --- a/eth_validator_watcher/blocks.py +++ b/eth_validator_watcher/blocks.py @@ -3,8 +3,6 @@ from .proposer_schedule import ProposerSchedule from .watched_validators import WatchedValidators -print = functools.partial(print, flush=True) - def process_block(validators: WatchedValidators, schedule: ProposerSchedule, slot_id: int, has_block: bool): validator_index = schedule.get_head_proposer(slot_id) diff --git a/eth_validator_watcher/entrypoint.py b/eth_validator_watcher/entrypoint.py index 8619ced..8ac6374 100644 --- a/eth_validator_watcher/entrypoint.py +++ b/eth_validator_watcher/entrypoint.py @@ -151,9 +151,6 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo missed_attestations[label] += int(validator.missed_attestation == True) missed_consecutive_attestations[label] += int(validator.previous_missed_attestation == True and validator.missed_attestation == True) - if int(validator.missed_attestation == True): - logging.info(f'Validator {validator.pubkey[:10]} missed attestation at slot {slot}') - proposed_blocks[label] += validator.proposed_blocks_total missed_blocks[label] += validator.missed_blocks_total proposed_finalized_blocks[label] += validator.proposed_blocks_finalized_total From 3e2b9e59c4fd383d9c9f4a56ca3ba61d78372c9a Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Wed, 15 May 2024 17:37:10 +0200 Subject: [PATCH 45/82] feat: remove legacy missed attestations --- eth_validator_watcher/missed_attestations.py | 143 ------------------- 1 file changed, 143 deletions(-) delete mode 100644 eth_validator_watcher/missed_attestations.py diff --git a/eth_validator_watcher/missed_attestations.py b/eth_validator_watcher/missed_attestations.py deleted file mode 100644 index 896eafd..0000000 --- a/eth_validator_watcher/missed_attestations.py +++ /dev/null @@ -1,143 +0,0 @@ -"""Contains the logic to check if the validators missed attestations.""" - -import functools - -from prometheus_client import Gauge - -from eth_validator_watcher.models import BeaconType - -from .beacon import Beacon -from .models import Validators -from .utils import LimitedDict, Slack - -print = functools.partial(print, flush=True) - -metric_missed_attestations_count = Gauge( - "missed_attestations_count", - "Missed attestations count", -) - -metric_double_missed_attestations_count = Gauge( - "double_missed_attestations_count", - "Double missed attestations count", -) - - -def process_missed_attestations( - beacon: Beacon, - beacon_type: BeaconType, - epoch_to_index_to_validator_index: LimitedDict, - epoch: int, -) -> set[int]: - """Process missed attestations. - - Parameters: - beacon : Beacon instance - beacon_type : Beacon type - epoch_to_index_to_validator : Limited dictionary with: - outer key : epoch - outer value, inner key: validator indexes - inner value : validators - epoch : Epoch where the missed attestations are checked - """ - if epoch < 1: - return set() - - index_to_validator: dict[int, Validators.DataItem.Validator] = ( - epoch_to_index_to_validator_index[epoch - 1] - if epoch - 1 in epoch_to_index_to_validator_index - else epoch_to_index_to_validator_index[epoch] - ) - - validators_index = set(index_to_validator) - validators_liveness = beacon.get_validators_liveness( - beacon_type, epoch - 1, validators_index - ) - - dead_indexes = { - index for index, liveness in validators_liveness.items() if not liveness - } - - metric_missed_attestations_count.set(len(dead_indexes)) - - if len(dead_indexes) == 0: - return set() - - first_indexes = list(dead_indexes)[:5] - - first_pubkeys = ( - index_to_validator[first_index].pubkey for first_index in first_indexes - ) - - short_first_pubkeys = [pubkey[:10] for pubkey in first_pubkeys] - short_first_pubkeys_str = ", ".join(short_first_pubkeys) - - print( - f"🙁 Our validator {short_first_pubkeys_str} and " - f"{len(dead_indexes) - len(short_first_pubkeys)} more " - f"missed attestation at epoch {epoch - 1}" - ) - - return dead_indexes - - -def process_double_missed_attestations( - dead_indexes: set[int], - previous_dead_indexes: set[int], - epoch_to_index_to_validator_index: LimitedDict, - epoch: int, - slack: Slack | None, -) -> set[int]: - """Process double missed attestations. - - Parameters: - dead_indexes : Set of indexes of the validators that missed - attestations - previous_dead_indexes : Set of indexes of the validators that missed - attestations in the previous epoch - - epoch_to_index_to_validator : Limited dictionary with: - outer key : epoch - outer value, inner key: validator indexes - inner value : validators - - epoch : Epoch where the missed attestations are checked - slack : Slack instance - """ - if epoch < 2: - return set() - - double_dead_indexes = dead_indexes & previous_dead_indexes - metric_double_missed_attestations_count.set(len(double_dead_indexes)) - - if len(double_dead_indexes) == 0: - return set() - - index_to_validator = epoch_to_index_to_validator_index[epoch - 1] - first_indexes = list(double_dead_indexes)[:5] - - first_pubkeys = ( - index_to_validator[first_index].pubkey for first_index in first_indexes - ) - - short_first_pubkeys = [pubkey[:10] for pubkey in first_pubkeys] - short_first_pubkeys_str = ", ".join(short_first_pubkeys) - - message_console = ( - f"😱 Our validator {short_first_pubkeys_str} and " - f"{len(double_dead_indexes) - len(short_first_pubkeys)} more " - f"missed 2 attestations in a row from epoch {epoch - 2}" - ) - - print(message_console) - - if slack is not None: - message_slack = ( - f"😱 Our validator `{short_first_pubkeys_str}` and " - f"`{len(double_dead_indexes) - len(short_first_pubkeys)}` more " - f"missed 2 attestations in a row from epoch `{epoch - 2}`" - ) - - slack.send_message(message_slack) - - return double_dead_indexes From 0e21c70cef63eba579ac4954c55d748c77a839c6 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Fri, 24 May 2024 14:27:50 +0200 Subject: [PATCH 46/82] feat: add unit tests for config --- tests/assets/config.empty.yaml | 0 tests/assets/config.null.yaml | 9 ++++ tests/assets/config.yaml | 19 +++++++ tests/test_config.py | 92 ++++++++++++++++++++++++++++++++++ 4 files changed, 120 insertions(+) create mode 100644 tests/assets/config.empty.yaml create mode 100644 tests/assets/config.null.yaml create mode 100644 tests/assets/config.yaml create mode 100644 tests/test_config.py diff --git a/tests/assets/config.empty.yaml b/tests/assets/config.empty.yaml new file mode 100644 index 0000000..e69de29 diff --git a/tests/assets/config.null.yaml b/tests/assets/config.null.yaml new file mode 100644 index 0000000..7adb329 --- /dev/null +++ b/tests/assets/config.null.yaml @@ -0,0 +1,9 @@ +beacon_url: ~ +execution_url: ~ +web3signer_url: ~ +default_fee_recipient: ~ +slack_channel: ~ +slack_token: ~ +relays: ~ +liveness_file: ~ +watched_keys: ~ diff --git a/tests/assets/config.yaml b/tests/assets/config.yaml new file mode 100644 index 0000000..bdb309a --- /dev/null +++ b/tests/assets/config.yaml @@ -0,0 +1,19 @@ +# Example config file for the Ethereum watcher. + +beacon_url: http://localhost:5051/ +beacon_type: other +beacon_timeout_sec: 90 +execution_url: http://localhost:8545/ +web3signer_url: http://web3signer:9000/ +default_fee_recipient: '0x41bF25fC8C52d292bD66D3BCEcd8a919ecB9EF88' +slack_channel: '#ethereum-monitoring' +slack_token: 'secret' +relays: + - http://relay1 + - http://relay2 +liveness_file: /tmp/i-am-alive + +watched_keys: + - public_key: '0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3' + labels: ["google"] + fee_recipient: ~ diff --git a/tests/test_config.py b/tests/test_config.py new file mode 100644 index 0000000..9a8ab32 --- /dev/null +++ b/tests/test_config.py @@ -0,0 +1,92 @@ +import os + +from pathlib import Path +from eth_validator_watcher.config import load_config, WatchedKeyConfig +from eth_validator_watcher.models import BeaconType +from tests import assets + + +def test_null_config() -> None: + path = Path(assets.__file__).parent / "config.null.yaml" + config = load_config(path) + + assert config.beacon_url is None + assert config.beacon_timeout_sec == 90 + assert config.execution_url is None + assert config.web3signer_url is None + assert config.default_fee_recipient is None + assert config.slack_channel is None + assert config.slack_token is None + assert config.beacon_type == BeaconType.OTHER + assert config.relays is None + assert config.liveness_file is None + assert config.watched_keys is None + + +def test_empty_config() -> None: + path = Path(assets.__file__).parent / "config.empty.yaml" + config = load_config(path) + + assert config.beacon_url is None + assert config.beacon_timeout_sec == 90 + assert config.execution_url is None + assert config.web3signer_url is None + assert config.default_fee_recipient is None + assert config.slack_channel is None + assert config.slack_token is None + assert config.beacon_type == BeaconType.OTHER + assert config.relays is None + assert config.liveness_file is None + assert config.watched_keys is None + + +def test_filled_config() -> None: + path = Path(assets.__file__).parent / "config.yaml" + config = load_config(path) + + assert config.beacon_url == 'http://localhost:5051/' + assert config.beacon_timeout_sec == 90 + assert config.execution_url == 'http://localhost:8545/' + assert config.web3signer_url == 'http://web3signer:9000/' + assert config.default_fee_recipient == '0x41bF25fC8C52d292bD66D3BCEcd8a919ecB9EF88' + assert config.slack_channel == '#ethereum-monitoring' + assert config.slack_token == 'secret' + assert config.beacon_type == BeaconType.OTHER + assert config.relays == ['http://relay1', 'http://relay2'] + assert config.liveness_file == '/tmp/i-am-alive' + + assert [k.public_key for k in config.watched_keys] == ['0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3'] + + +def test_filled_config_overriden() -> None: + environ = os.environ.copy() + + os.environ['eth_watcher_beacon_url'] = 'http://override-beacon/' + os.environ['eth_watcher_beacon_timeout_sec'] = '42' + os.environ['eth_watcher_execution_url'] = 'http://override-exec/' + os.environ['eth_watcher_web3signer_url'] = 'http://override-web3signer/' + os.environ['eth_watcher_default_fee_recipient'] = '0x42' + os.environ['eth_watcher_slack_channel'] = '#ethereum-monitoring-override' + os.environ['eth_watcher_slack_token'] = 'secret-override' + os.environ['eth_watcher_beacon_type'] = 'nimbus' + os.environ['eth_watcher_relays'] = '["http://overriden-relay-1" ,"http://overriden-relay-2"]' + os.environ['eth_watcher_liveness_file'] = '/tmp/override-liveness-file' + + path = Path(assets.__file__).parent / "config.yaml" + config = load_config(path) + + assert config.beacon_url == 'http://override-beacon/' + assert config.beacon_timeout_sec == 42 + assert config.execution_url == 'http://override-exec/' + assert config.web3signer_url == 'http://override-web3signer/' + assert config.default_fee_recipient == '0x42' + assert config.slack_channel == '#ethereum-monitoring-override' + assert config.slack_token == 'secret-override' + assert config.beacon_type == BeaconType.NIMBUS + assert config.relays == ['http://overriden-relay-1' ,'http://overriden-relay-2'] + assert config.liveness_file == '/tmp/override-liveness-file' + + assert [k.public_key for k in config.watched_keys] == ['0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3'] + + os.environ.clear() + os.environ.update(environ) From 85566e375af59c97a0ed6291244a32c40ea7ece8 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Mon, 27 May 2024 14:19:34 +0200 Subject: [PATCH 47/82] feat: add new label for the watched network --- eth_validator_watcher/metrics.py | 34 ++++++++++++++++---------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/eth_validator_watcher/metrics.py b/eth_validator_watcher/metrics.py index f3d3308..c643ccc 100644 --- a/eth_validator_watcher/metrics.py +++ b/eth_validator_watcher/metrics.py @@ -45,25 +45,25 @@ def get_prometheus_metrics() -> PrometheusMetrics: if _metrics is None: _metrics = PrometheusMetrics( - eth_slot=Gauge("eth_slot", "Current slot"), - eth_epoch=Gauge("eth_epoch", "Current epoch"), - eth_current_price_dollars=Gauge("eth_current_price_dollars", "Current price of ETH in USD"), + eth_slot=Gauge("eth_slot", "Current slot", ["network"]), + eth_epoch=Gauge("eth_epoch", "Current epoch", ["network"]), + eth_current_price_dollars=Gauge("eth_current_price_dollars", "Current price of ETH in USD", ["network"]), - eth_validator_status_count=Gauge("eth_validator_status_count", "Validator status count sampled every epoch", ['scope', 'status']), - eth_suboptimal_sources_rate=Gauge("eth_suboptimal_sources_rate", "Suboptimal sources rate sampled every epoch", ['scope']), - eth_suboptimal_targets_rate=Gauge("eth_suboptimal_targets_rate", "Suboptimal targets rate sampled every epoch", ['scope']), - eth_suboptimal_heads_rate=Gauge("eth_suboptimal_heads_rate", "Suboptimal heads rate sampled every epoch", ['scope']), - eth_ideal_consensus_rewards_gwei=Gauge("eth_ideal_consensus_rewards_gwei", "Ideal consensus rewards sampled every epoch", ['scope']), - eth_actual_consensus_rewards_gwei=Gauge("eth_actual_consensus_rewards_gwei", "Actual consensus rewards sampled every epoch", ['scope']), - eth_consensus_rewards_rate=Gauge("eth_consensus_rewards_rate", "Consensus rewards rate sampled every epoch", ['scope']), - eth_missed_attestations_count=Gauge("eth_missed_attestations", "Missed attestations in the last epoch", ['scope']), - eth_missed_consecutive_attestations_count=Gauge("eth_missed_consecutive_attestations", "Missed consecutive attestations in the last two epochs", ['scope']), + eth_validator_status_count=Gauge("eth_validator_status_count", "Validator status count sampled every epoch", ['scope', 'status', 'network']), + eth_suboptimal_sources_rate=Gauge("eth_suboptimal_sources_rate", "Suboptimal sources rate sampled every epoch", ['scope', 'network']), + eth_suboptimal_targets_rate=Gauge("eth_suboptimal_targets_rate", "Suboptimal targets rate sampled every epoch", ['scope', 'network']), + eth_suboptimal_heads_rate=Gauge("eth_suboptimal_heads_rate", "Suboptimal heads rate sampled every epoch", ['scope', 'network']), + eth_ideal_consensus_rewards_gwei=Gauge("eth_ideal_consensus_rewards_gwei", "Ideal consensus rewards sampled every epoch", ['scope', 'network']), + eth_actual_consensus_rewards_gwei=Gauge("eth_actual_consensus_rewards_gwei", "Actual consensus rewards sampled every epoch", ['scope', 'network']), + eth_consensus_rewards_rate=Gauge("eth_consensus_rewards_rate", "Consensus rewards rate sampled every epoch", ['scope', 'network']), + eth_missed_attestations_count=Gauge("eth_missed_attestations", "Missed attestations in the last epoch", ['scope', 'network']), + eth_missed_consecutive_attestations_count=Gauge("eth_missed_consecutive_attestations", "Missed consecutive attestations in the last two epochs", ['scope', 'network']), - eth_block_proposals_head_total=Counter("eth_block_proposals_head_total", "Total block proposals at head", ['scope']), - eth_missed_block_proposals_head_total=Counter("eth_missed_block_proposals_head_total", "Total missed block proposals at head", ['scope']), - eth_block_proposals_finalized_total=Counter("eth_block_proposals_finalized_total", "Total finalized block proposals", ['scope']), - eth_missed_block_proposals_finalized_total=Counter("eth_missed_block_proposals_finalized_total", "Total missed finalized block proposals", ['scope']), - eth_future_block_proposals=Gauge("eth_future_block_proposals", "Future block proposals", ['scope']) + eth_block_proposals_head_total=Counter("eth_block_proposals_head_total", "Total block proposals at head", ['scope', 'network']), + eth_missed_block_proposals_head_total=Counter("eth_missed_block_proposals_head_total", "Total missed block proposals at head", ['scope', 'network']), + eth_block_proposals_finalized_total=Counter("eth_block_proposals_finalized_total", "Total finalized block proposals", ['scope', 'network']), + eth_missed_block_proposals_finalized_total=Counter("eth_missed_block_proposals_finalized_total", "Total missed finalized block proposals", ['scope', 'network']), + eth_future_block_proposals=Gauge("eth_future_block_proposals", "Future block proposals", ['scope', 'network']) ) return _metrics From 38de7d07fd90d2efbe471188531fb2de1bac0929 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Mon, 27 May 2024 14:23:14 +0200 Subject: [PATCH 48/82] feat: get rid of legacy beacon type config --- eth_validator_watcher/config.py | 4 +--- eth_validator_watcher/models.py | 8 -------- tests/assets/config.yaml | 1 - tests/test_config.py | 6 ------ 4 files changed, 1 insertion(+), 18 deletions(-) diff --git a/eth_validator_watcher/config.py b/eth_validator_watcher/config.py index 76254e2..2be0e79 100644 --- a/eth_validator_watcher/config.py +++ b/eth_validator_watcher/config.py @@ -1,4 +1,3 @@ -from .models import BeaconType from pydantic import BaseModel from pydantic_settings import BaseSettings, SettingsConfigDict from typing import Any, List, Optional @@ -19,9 +18,8 @@ class Config(BaseSettings): """Configuration of the Ethereum Validator Watcher. """ model_config = SettingsConfigDict(case_sensitive=True, env_prefix='eth_watcher_') - + network: Optional[str] = None beacon_url: Optional[str] = None - beacon_type: BeaconType = BeaconType.OTHER beacon_timeout_sec: int = 90 execution_url: Optional[str] = None web3signer_url: Optional[str] = None diff --git a/eth_validator_watcher/models.py b/eth_validator_watcher/models.py index 0a25916..7d8dab3 100644 --- a/eth_validator_watcher/models.py +++ b/eth_validator_watcher/models.py @@ -127,14 +127,6 @@ class CoinbaseTrade(BaseModel): side: str -class BeaconType(StrEnum): - LIGHTHOUSE = "lighthouse" - NIMBUS = "nimbus" - OLD_PRYSM = "old-prysm" - OLD_TEKU = "old-teku" - OTHER = "other" - - class BlockIdentierType(StrEnum): HEAD = "head" GENESIS = "genesis" diff --git a/tests/assets/config.yaml b/tests/assets/config.yaml index bdb309a..8ab4e15 100644 --- a/tests/assets/config.yaml +++ b/tests/assets/config.yaml @@ -1,7 +1,6 @@ # Example config file for the Ethereum watcher. beacon_url: http://localhost:5051/ -beacon_type: other beacon_timeout_sec: 90 execution_url: http://localhost:8545/ web3signer_url: http://web3signer:9000/ diff --git a/tests/test_config.py b/tests/test_config.py index 9a8ab32..4d5eec4 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -2,7 +2,6 @@ from pathlib import Path from eth_validator_watcher.config import load_config, WatchedKeyConfig -from eth_validator_watcher.models import BeaconType from tests import assets @@ -17,7 +16,6 @@ def test_null_config() -> None: assert config.default_fee_recipient is None assert config.slack_channel is None assert config.slack_token is None - assert config.beacon_type == BeaconType.OTHER assert config.relays is None assert config.liveness_file is None assert config.watched_keys is None @@ -34,7 +32,6 @@ def test_empty_config() -> None: assert config.default_fee_recipient is None assert config.slack_channel is None assert config.slack_token is None - assert config.beacon_type == BeaconType.OTHER assert config.relays is None assert config.liveness_file is None assert config.watched_keys is None @@ -51,7 +48,6 @@ def test_filled_config() -> None: assert config.default_fee_recipient == '0x41bF25fC8C52d292bD66D3BCEcd8a919ecB9EF88' assert config.slack_channel == '#ethereum-monitoring' assert config.slack_token == 'secret' - assert config.beacon_type == BeaconType.OTHER assert config.relays == ['http://relay1', 'http://relay2'] assert config.liveness_file == '/tmp/i-am-alive' @@ -68,7 +64,6 @@ def test_filled_config_overriden() -> None: os.environ['eth_watcher_default_fee_recipient'] = '0x42' os.environ['eth_watcher_slack_channel'] = '#ethereum-monitoring-override' os.environ['eth_watcher_slack_token'] = 'secret-override' - os.environ['eth_watcher_beacon_type'] = 'nimbus' os.environ['eth_watcher_relays'] = '["http://overriden-relay-1" ,"http://overriden-relay-2"]' os.environ['eth_watcher_liveness_file'] = '/tmp/override-liveness-file' @@ -82,7 +77,6 @@ def test_filled_config_overriden() -> None: assert config.default_fee_recipient == '0x42' assert config.slack_channel == '#ethereum-monitoring-override' assert config.slack_token == 'secret-override' - assert config.beacon_type == BeaconType.NIMBUS assert config.relays == ['http://overriden-relay-1' ,'http://overriden-relay-2'] assert config.liveness_file == '/tmp/override-liveness-file' From c20857352861c39faa8239c0e72d9ffd7aa2db9f Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Mon, 27 May 2024 14:24:31 +0200 Subject: [PATCH 49/82] feat: update unit test for the new network setting --- tests/assets/config.null.yaml | 1 + tests/assets/config.yaml | 1 + tests/test_config.py | 5 +++++ 3 files changed, 7 insertions(+) diff --git a/tests/assets/config.null.yaml b/tests/assets/config.null.yaml index 7adb329..ecd5ee6 100644 --- a/tests/assets/config.null.yaml +++ b/tests/assets/config.null.yaml @@ -1,5 +1,6 @@ beacon_url: ~ execution_url: ~ +network: ~ web3signer_url: ~ default_fee_recipient: ~ slack_channel: ~ diff --git a/tests/assets/config.yaml b/tests/assets/config.yaml index 8ab4e15..e21e733 100644 --- a/tests/assets/config.yaml +++ b/tests/assets/config.yaml @@ -2,6 +2,7 @@ beacon_url: http://localhost:5051/ beacon_timeout_sec: 90 +network: holesky execution_url: http://localhost:8545/ web3signer_url: http://web3signer:9000/ default_fee_recipient: '0x41bF25fC8C52d292bD66D3BCEcd8a919ecB9EF88' diff --git a/tests/test_config.py b/tests/test_config.py index 4d5eec4..241bae6 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -19,6 +19,7 @@ def test_null_config() -> None: assert config.relays is None assert config.liveness_file is None assert config.watched_keys is None + assert config.network is None def test_empty_config() -> None: @@ -35,6 +36,7 @@ def test_empty_config() -> None: assert config.relays is None assert config.liveness_file is None assert config.watched_keys is None + assert config.network is None def test_filled_config() -> None: @@ -50,6 +52,7 @@ def test_filled_config() -> None: assert config.slack_token == 'secret' assert config.relays == ['http://relay1', 'http://relay2'] assert config.liveness_file == '/tmp/i-am-alive' + assert config.network == 'holesky' assert [k.public_key for k in config.watched_keys] == ['0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3'] @@ -66,6 +69,7 @@ def test_filled_config_overriden() -> None: os.environ['eth_watcher_slack_token'] = 'secret-override' os.environ['eth_watcher_relays'] = '["http://overriden-relay-1" ,"http://overriden-relay-2"]' os.environ['eth_watcher_liveness_file'] = '/tmp/override-liveness-file' + os.environ['eth_watcher_network'] = 'sepolia' path = Path(assets.__file__).parent / "config.yaml" config = load_config(path) @@ -79,6 +83,7 @@ def test_filled_config_overriden() -> None: assert config.slack_token == 'secret-override' assert config.relays == ['http://overriden-relay-1' ,'http://overriden-relay-2'] assert config.liveness_file == '/tmp/override-liveness-file' + assert config.network == 'sepolia' assert [k.public_key for k in config.watched_keys] == ['0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3'] From 5b924b797286529aad58030b5ab499bbd7a4ca23 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Mon, 27 May 2024 14:42:40 +0200 Subject: [PATCH 50/82] feat: populate the network label --- eth_validator_watcher/entrypoint.py | 36 +++++++++++++++-------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/eth_validator_watcher/entrypoint.py b/eth_validator_watcher/entrypoint.py index 8ac6374..130afff 100644 --- a/eth_validator_watcher/entrypoint.py +++ b/eth_validator_watcher/entrypoint.py @@ -86,9 +86,11 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo epoch: Current epoch. slot: Current slot. """ - self._metrics.eth_epoch.set(epoch) - self._metrics.eth_slot.set(slot) - self._metrics.eth_current_price_dollars.set(get_current_eth_price()) + network = self._cfg.network + + self._metrics.eth_epoch.labels(network).set(epoch) + self._metrics.eth_slot.labels(network).set(slot) + self._metrics.eth_current_price_dollars.labels(network).set(get_current_eth_price()) # We iterate once on the validator set to optimize CPU as # there is a log of entries here, this makes code here a bit @@ -172,30 +174,30 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo for label, status_count in validator_status_count.items(): for status, count in status_count.items(): - self._metrics.eth_validator_status_count.labels(label, status).set(count) + self._metrics.eth_validator_status_count.labels(label, status, network).set(count) for label in labels: - self._metrics.eth_suboptimal_sources_rate.labels(label).set(pct(suboptimal_source_count[label], optimal_source_count[label])) - self._metrics.eth_suboptimal_targets_rate.labels(label).set(pct(suboptimal_target_count[label], optimal_target_count[label])) - self._metrics.eth_suboptimal_heads_rate.labels(label).set(pct(suboptimal_head_count[label], optimal_head_count[label])) + self._metrics.eth_suboptimal_sources_rate.labels(label, network).set(pct(suboptimal_source_count[label], optimal_source_count[label])) + self._metrics.eth_suboptimal_targets_rate.labels(label, network).set(pct(suboptimal_target_count[label], optimal_target_count[label])) + self._metrics.eth_suboptimal_heads_rate.labels(label, network).set(pct(suboptimal_head_count[label], optimal_head_count[label])) - self._metrics.eth_ideal_consensus_rewards_gwei.labels(label).set(ideal_consensus_reward[label]) - self._metrics.eth_actual_consensus_rewards_gwei.labels(label).set(actual_consensus_reward[label]) - self._metrics.eth_consensus_rewards_rate.labels(label).set(pct(actual_consensus_reward[label], ideal_consensus_reward[label], True)) + self._metrics.eth_ideal_consensus_rewards_gwei.labels(label, network).set(ideal_consensus_reward[label]) + self._metrics.eth_actual_consensus_rewards_gwei.labels(label, network).set(actual_consensus_reward[label]) + self._metrics.eth_consensus_rewards_rate.labels(label, network).set(pct(actual_consensus_reward[label], ideal_consensus_reward[label], True)) - self._metrics.eth_missed_attestations_count.labels(label).set(missed_attestations[label]) - self._metrics.eth_missed_consecutive_attestations_count.labels(label).set(missed_consecutive_attestations[label]) + self._metrics.eth_missed_attestations_count.labels(label, network).set(missed_attestations[label]) + self._metrics.eth_missed_consecutive_attestations_count.labels(label, network).set(missed_consecutive_attestations[label]) # Here we inc, it's fine since we previously reset the # counters on each run; we can't use set because those # metrics are counters. - self._metrics.eth_block_proposals_head_total.labels(label).inc(proposed_blocks[label]) - self._metrics.eth_missed_block_proposals_head_total.labels(label).inc(missed_blocks[label]) - self._metrics.eth_block_proposals_finalized_total.labels(label).inc(proposed_finalized_blocks[label]) - self._metrics.eth_missed_block_proposals_finalized_total.labels(label).inc(missed_finalized_blocks[label]) + self._metrics.eth_block_proposals_head_total.labels(label, network).inc(proposed_blocks[label]) + self._metrics.eth_missed_block_proposals_head_total.labels(label, network).inc(missed_blocks[label]) + self._metrics.eth_block_proposals_finalized_total.labels(label, network).inc(proposed_finalized_blocks[label]) + self._metrics.eth_missed_block_proposals_finalized_total.labels(label, network).inc(missed_finalized_blocks[label]) - self._metrics.eth_future_block_proposals.labels(label).set(future_blocks[label]) + self._metrics.eth_future_block_proposals.labels(label, network).set(future_blocks[label]) if not self._metrics_started: start_http_server(self._cfg.metrics_port) From 37d9ef8dded10f54ab81c2969d5e3190b6c7cca5 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Mon, 27 May 2024 14:51:53 +0200 Subject: [PATCH 51/82] feat: space out config reloading --- eth_validator_watcher/entrypoint.py | 8 +++++--- eth_validator_watcher/utils.py | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/eth_validator_watcher/entrypoint.py b/eth_validator_watcher/entrypoint.py index 130afff..61bf69e 100644 --- a/eth_validator_watcher/entrypoint.py +++ b/eth_validator_watcher/entrypoint.py @@ -21,6 +21,7 @@ from .models import BlockIdentierType, Validators from .rewards import process_rewards from .utils import ( + SLOT_FOR_CONFIG_RELOAD, SLOT_FOR_MISSED_ATTESTATIONS_PROCESS, SLOT_FOR_REWARDS_PROCESS, pct, @@ -249,9 +250,10 @@ def run(self) -> None: last_processed_finalized_slot += 1 last_processed_finalized_slot = last_finalized_slot - logging.info('Processing configuration update') - self._reload_config() - watched_validators.process_config(self._cfg) + if (slot % SLOT_FOR_CONFIG_RELOAD == 0): + logging.info('Processing configuration update') + self._reload_config() + watched_validators.process_config(self._cfg) logging.info('Updating Prometheus metrics') self._update_metrics(watched_validators, epoch, slot) diff --git a/eth_validator_watcher/utils.py b/eth_validator_watcher/utils.py index ccde9c2..6bd1b73 100644 --- a/eth_validator_watcher/utils.py +++ b/eth_validator_watcher/utils.py @@ -12,6 +12,7 @@ NB_SLOT_PER_EPOCH = 32 NB_SECOND_PER_SLOT = 12 MISSED_BLOCK_TIMEOUT_SEC = 10 +SLOT_FOR_CONFIG_RELOAD = 15 SLOT_FOR_MISSED_ATTESTATIONS_PROCESS = 16 SLOT_FOR_REWARDS_PROCESS = 17 ETH1_ADDRESS_LEN = 40 From c5be53f6cbe07053bfd1231cd9fe170aafe3be4f Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Mon, 27 May 2024 18:56:21 +0200 Subject: [PATCH 52/82] feat: add label unwatched for keys we don't monitor --- eth_validator_watcher/utils.py | 1 + eth_validator_watcher/watched_validators.py | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/eth_validator_watcher/utils.py b/eth_validator_watcher/utils.py index 6bd1b73..a2c2979 100644 --- a/eth_validator_watcher/utils.py +++ b/eth_validator_watcher/utils.py @@ -19,6 +19,7 @@ ETH2_ADDRESS_LEN = 96 LABEL_SCOPE_NETWORK="scope:network" LABEL_SCOPE_WATCHED="scope:watched" +LABEL_SCOPED_UNWATCHED="scope:unwatched" CHUCK_NORRIS = [ "Chuck Norris doesn't stake Ethers; he stares at the blockchain, and it instantly " diff --git a/eth_validator_watcher/watched_validators.py b/eth_validator_watcher/watched_validators.py index 3011400..93068ad 100644 --- a/eth_validator_watcher/watched_validators.py +++ b/eth_validator_watcher/watched_validators.py @@ -21,7 +21,7 @@ from .config import Config, WatchedKeyConfig from .models import Validators, ValidatorsLivenessResponse -from .utils import LABEL_SCOPE_NETWORK, LABEL_SCOPE_WATCHED +from .utils import LABEL_SCOPE_NETWORK, LABEL_SCOPE_WATCHED, LABEL_SCOPE_UNWATCHED def normalized_public_key(pubkey: str) -> str: @@ -83,8 +83,9 @@ def status(self) -> Validators.DataItem.StatusEnum: def labels(self) -> list[str]: """Get the labels for the validator. """ - configured = self._labels or [] - return configured + [LABEL_SCOPE_NETWORK] + if self._labels: + return self._labels + [LABEL_SCOPE_NETWORK] + return [LABEL_SCOPE_UNWATCHED, LABEL_SCOPE_NETWORK] def is_validating(self) -> bool: """Check if the validator is validating. From 41d2f2a13823f65bd177fdf34fe040ab33159365 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Thu, 30 May 2024 16:39:54 +0200 Subject: [PATCH 53/82] fix: labelling and status metrics regardless of whether or not the validator is active --- eth_validator_watcher/beacon.py | 3 -- eth_validator_watcher/entrypoint.py | 33 +++++++++++++-------- eth_validator_watcher/utils.py | 2 +- eth_validator_watcher/watched_validators.py | 7 ++--- 4 files changed, 25 insertions(+), 20 deletions(-) diff --git a/eth_validator_watcher/beacon.py b/eth_validator_watcher/beacon.py index 5fb0f19..8efbf42 100644 --- a/eth_validator_watcher/beacon.py +++ b/eth_validator_watcher/beacon.py @@ -20,9 +20,6 @@ ) -StatusEnum = Validators.DataItem.StatusEnum - - print = functools.partial(print, flush=True) diff --git a/eth_validator_watcher/entrypoint.py b/eth_validator_watcher/entrypoint.py index 61bf69e..76ec587 100644 --- a/eth_validator_watcher/entrypoint.py +++ b/eth_validator_watcher/entrypoint.py @@ -98,7 +98,7 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo # more complex and entangled. # Count of validators by status - validator_status_count: dict[str, dict[StatusEnum, int]] = defaultdict(partial(defaultdict, int)) + validator_status_count: dict[str, dict[str, int]] = defaultdict(partial(defaultdict, int)) # Gauges suboptimal_source_count: dict[str, int] = defaultdict(int) @@ -123,19 +123,28 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo # Gauge future_blocks: dict[str, int] = defaultdict(int) + # All labels and statuses so that we can set to 0 metrics that + # do not have any value for a given label/status. labels = set() + statuses = set() for validator in watched_validators.get_validators().values(): - # Everything here implies to have a validator that is - # active on the beacon chain, this prevents miscounting - # missed attestation for instance. - if not validator.is_validating(): - continue + status = str(validator.status) + statuses.add(status) for label in validator.labels: - validator_status_count[label][str(validator.status)] += 1 + labels.add(label) + + validator_status_count[label][status] += 1 + + # Everything below implies to have a validator that is + # active on the beacon chain, this prevents + # miscounting missed attestation for instance. + + if not validator.is_validating(): + continue # Looks weird but we want to explicitly have labels set # for each set of labels even if they aren't validating @@ -161,8 +170,6 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo future_blocks[label] += validator.future_blocks_proposal - labels.add(label) - # Here we reset the counters for the next run, we do not # touch gauges though. This ensures we handle properly # changes of the labelling in real-time. @@ -173,9 +180,11 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo validator.missed_blocks_finalized_total = 0 validator.future_blocks_proposal = 0 - for label, status_count in validator_status_count.items(): - for status, count in status_count.items(): - self._metrics.eth_validator_status_count.labels(label, status, network).set(count) + + for label in labels: + for status in statuses: + value = validator_status_count.get(label, {}).get(status, 0) + self._metrics.eth_validator_status_count.labels(label, status, network).set(value) for label in labels: self._metrics.eth_suboptimal_sources_rate.labels(label, network).set(pct(suboptimal_source_count[label], optimal_source_count[label])) diff --git a/eth_validator_watcher/utils.py b/eth_validator_watcher/utils.py index a2c2979..58254d7 100644 --- a/eth_validator_watcher/utils.py +++ b/eth_validator_watcher/utils.py @@ -19,7 +19,7 @@ ETH2_ADDRESS_LEN = 96 LABEL_SCOPE_NETWORK="scope:network" LABEL_SCOPE_WATCHED="scope:watched" -LABEL_SCOPED_UNWATCHED="scope:unwatched" +LABEL_SCOPE_UNWATCHED="scope:unwatched" CHUCK_NORRIS = [ "Chuck Norris doesn't stake Ethers; he stares at the blockchain, and it instantly " diff --git a/eth_validator_watcher/watched_validators.py b/eth_validator_watcher/watched_validators.py index 93068ad..bbebcfc 100644 --- a/eth_validator_watcher/watched_validators.py +++ b/eth_validator_watcher/watched_validators.py @@ -84,7 +84,7 @@ def labels(self) -> list[str]: """Get the labels for the validator. """ if self._labels: - return self._labels + [LABEL_SCOPE_NETWORK] + return self._labels + [LABEL_SCOPE_NETWORK, LABEL_SCOPE_WATCHED] return [LABEL_SCOPE_UNWATCHED, LABEL_SCOPE_NETWORK] def is_validating(self) -> bool: @@ -102,8 +102,7 @@ def process_config(self, config: WatchedKeyConfig): Parameters: config: New configuration """ - labels = config.labels or [] - self._labels = labels + [LABEL_SCOPE_WATCHED] + self._labels = config.labels or [] def process_epoch(self, validator: Validators.DataItem): """Processes a new epoch. @@ -123,7 +122,7 @@ def process_liveness(self, liveness: ValidatorsLivenessResponse.Data): liveness: Validator liveness data """ self.previous_missed_attestation = self.missed_attestation - self.missed_attestation = not liveness.is_live + self.missed_attestation = liveness.is_live != True class WatchedValidators: From 2ed2cb97102a9c545be6730f4e77a88cdb53292a Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Thu, 30 May 2024 17:10:59 +0200 Subject: [PATCH 54/82] feat: handle slashes --- eth_validator_watcher/entrypoint.py | 4 ++++ eth_validator_watcher/metrics.py | 2 ++ 2 files changed, 6 insertions(+) diff --git a/eth_validator_watcher/entrypoint.py b/eth_validator_watcher/entrypoint.py index 76ec587..05eed11 100644 --- a/eth_validator_watcher/entrypoint.py +++ b/eth_validator_watcher/entrypoint.py @@ -107,6 +107,7 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo optimal_source_count: dict[str, int] = defaultdict(int) optimal_target_count: dict[str, int] = defaultdict(int) optimal_head_count: dict[str, int] = defaultdict(int) + validator_slashes: dict[str, int] = defaultdict(int) # Gauges ideal_consensus_reward: dict[str, int] = defaultdict(int) @@ -139,6 +140,8 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo validator_status_count[label][status] += 1 + validator_slashes[label] += int(validator.beacon_validator.validator.slashed == True) + # Everything below implies to have a validator that is # active on the beacon chain, this prevents # miscounting missed attestation for instance. @@ -197,6 +200,7 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo self._metrics.eth_missed_attestations_count.labels(label, network).set(missed_attestations[label]) self._metrics.eth_missed_consecutive_attestations_count.labels(label, network).set(missed_consecutive_attestations[label]) + self._metrics.eth_slashed_validators_count.labels(label, network).set(validator_slashes[label]) # Here we inc, it's fine since we previously reset the # counters on each run; we can't use set because those diff --git a/eth_validator_watcher/metrics.py b/eth_validator_watcher/metrics.py index c643ccc..fe172f8 100644 --- a/eth_validator_watcher/metrics.py +++ b/eth_validator_watcher/metrics.py @@ -25,6 +25,7 @@ class PrometheusMetrics: eth_actual_consensus_rewards_gwei: Gauge eth_missed_attestations_count: Gauge eth_missed_consecutive_attestations_count: Gauge + eth_slashed_validators_count: Gauge eth_block_proposals_head_total: Counter eth_missed_block_proposals_head_total: Counter @@ -58,6 +59,7 @@ def get_prometheus_metrics() -> PrometheusMetrics: eth_consensus_rewards_rate=Gauge("eth_consensus_rewards_rate", "Consensus rewards rate sampled every epoch", ['scope', 'network']), eth_missed_attestations_count=Gauge("eth_missed_attestations", "Missed attestations in the last epoch", ['scope', 'network']), eth_missed_consecutive_attestations_count=Gauge("eth_missed_consecutive_attestations", "Missed consecutive attestations in the last two epochs", ['scope', 'network']), + eth_slashed_validators_count=Gauge("eth_slashed_validators", "Slashed validators", ['scope', 'network']), eth_block_proposals_head_total=Counter("eth_block_proposals_head_total", "Total block proposals at head", ['scope', 'network']), eth_missed_block_proposals_head_total=Counter("eth_missed_block_proposals_head_total", "Total missed block proposals at head", ['scope', 'network']), From ba6c4a334daad9d6e70197994a6f6ae0e423a3a9 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Mon, 3 Jun 2024 09:23:47 +0200 Subject: [PATCH 55/82] feat: speed up parsing by bypassing python requests JSON's parser --- eth_validator_watcher/beacon.py | 39 ++++++++++++--------------------- 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/eth_validator_watcher/beacon.py b/eth_validator_watcher/beacon.py index 8efbf42..b453ac6 100644 --- a/eth_validator_watcher/beacon.py +++ b/eth_validator_watcher/beacon.py @@ -113,18 +113,20 @@ def get_genesis(self) -> Genesis: response = self.__get_retry_not_found( f"{self.__url}/eth/v1/beacon/genesis", timeout=self.__timeout_sec ) + response.raise_for_status() - genesis_dict = response.json() - return Genesis(**genesis_dict) + + return Genesis.model_validate_json(response.text) def get_spec(self) -> Spec: """Get spec data.""" response = self.__get_retry_not_found( f"{self.__url}/eth/v1/config/spec", timeout=self.__timeout_sec ) + response.raise_for_status() - spec_dict = response.json() - return Spec(**spec_dict) + + return Spec.model_validate_json(response.text) def get_header(self, block_identifier: Union[BlockIdentierType, int]) -> Header: """Get a header. @@ -145,8 +147,8 @@ def get_header(self, block_identifier: Union[BlockIdentierType, int]) -> Header: # If we are here, it's an other error raise - header_dict = response.json() - return Header(**header_dict) + + return Header.model_validate_json(response.text) def get_proposer_duties(self, epoch: int) -> ProposerDuties: """Get proposer duties @@ -159,23 +161,16 @@ def get_proposer_duties(self, epoch: int) -> ProposerDuties: response.raise_for_status() - proposer_duties_dict = response.json() - return ProposerDuties(**proposer_duties_dict) + return ProposerDuties.model_validate_json(response.text) def get_validators(self, slot: int) -> Validators: response = self.__get_retry_not_found( f"{self.__url}/eth/v1/beacon/states/{slot}/validators", timeout=self.__timeout_sec ) - # Unsure if explicit del help with memory here, let's keep it - # for now and benchmark this in real conditions. response.raise_for_status() - validators_dict = response.json() - del response - validators = Validators(**validators_dict) - del validators_dict - return validators + return Validators.model_validate_json(response.text) def get_rewards(self, epoch: int) -> Rewards: """Get rewards. @@ -190,11 +185,8 @@ def get_rewards(self, epoch: int) -> Rewards: ) response.raise_for_status() - rewards_dict = response.json() - del response - rewards = Rewards(**rewards_dict) - del rewards_dict - return rewards + + return Rewards.model_validate_json(response.text) def get_validators_liveness(self, epoch: int, indexes: list[int]) -> ValidatorsLivenessResponse: """Get validators liveness. @@ -209,11 +201,8 @@ def get_validators_liveness(self, epoch: int, indexes: list[int]) -> ValidatorsL ) response.raise_for_status() - validators_liveness_dict = response.json() - del response - validators_liveness = ValidatorsLivenessResponse(**validators_liveness_dict) - del validators_liveness_dict - return validators_liveness + + return ValidatorsLivenessResponse.model_validate_json(response.text) def has_block_at_slot(self, block_identifier: BlockIdentierType | int) -> bool: """Returns the slot of a block identifier if it exists. From 1f5686b9da9017a16196815ccd48118ce1ef07ca Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Mon, 3 Jun 2024 16:37:32 +0200 Subject: [PATCH 56/82] feat: reduce processing time of watched metrics --- eth_validator_watcher/entrypoint.py | 148 ++++++++++---------- eth_validator_watcher/slashed_validators.py | 116 --------------- eth_validator_watcher/utils.py | 23 --- eth_validator_watcher/watched_validators.py | 23 +-- 4 files changed, 90 insertions(+), 220 deletions(-) delete mode 100644 eth_validator_watcher/slashed_validators.py diff --git a/eth_validator_watcher/entrypoint.py b/eth_validator_watcher/entrypoint.py index 05eed11..2f385f1 100644 --- a/eth_validator_watcher/entrypoint.py +++ b/eth_validator_watcher/entrypoint.py @@ -2,6 +2,7 @@ """ from collections import defaultdict +from dataclasses import dataclass, field from functools import partial from pathlib import Path from prometheus_client import start_http_server @@ -97,50 +98,54 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo # there is a log of entries here, this makes code here a bit # more complex and entangled. - # Count of validators by status - validator_status_count: dict[str, dict[str, int]] = defaultdict(partial(defaultdict, int)) + @dataclass + class MetricsByLabel(): + """Helper class to reduce the number of look-ups per label in the validators loop. - # Gauges - suboptimal_source_count: dict[str, int] = defaultdict(int) - suboptimal_target_count: dict[str, int] = defaultdict(int) - suboptimal_head_count: dict[str, int] = defaultdict(int) - optimal_source_count: dict[str, int] = defaultdict(int) - optimal_target_count: dict[str, int] = defaultdict(int) - optimal_head_count: dict[str, int] = defaultdict(int) - validator_slashes: dict[str, int] = defaultdict(int) + This reduces the number of look-ups and processing time by ~10x. + """ + # Count of validators by status + validator_status_count: dict[str, int] = field(default_factory=dict) - # Gauges - ideal_consensus_reward: dict[str, int] = defaultdict(int) - actual_consensus_reward: dict[str, int] = defaultdict(int) - missed_attestations: dict[str, int] = defaultdict(int) - missed_consecutive_attestations: dict[str, int] = defaultdict(int) + # Gauges + suboptimal_source_count: int = 0 + suboptimal_target_count: int = 0 + suboptimal_head_count: int = 0 + optimal_source_count: int = 0 + optimal_target_count: int = 0 + optimal_head_count: int = 0 + validator_slashes: int = 0 - # Counters - proposed_blocks: dict[str, int] = defaultdict(int) - missed_blocks: dict[str, int] = defaultdict(int) - proposed_finalized_blocks: dict[str, int] = defaultdict(int) - missed_finalized_blocks: dict[str, int] = defaultdict(int) + # Gauges + ideal_consensus_reward: int = 0 + actual_consensus_reward: int = 0 + missed_attestations: int = 0 + missed_consecutive_attestations: int = 0 - # Gauge - future_blocks: dict[str, int] = defaultdict(int) + # Counters + proposed_blocks: int = 0 + missed_blocks: int = 0 + proposed_finalized_blocks: int = 0 + missed_finalized_blocks: int = 0 - # All labels and statuses so that we can set to 0 metrics that - # do not have any value for a given label/status. - labels = set() - statuses = set() + # Gauge + future_blocks: int = 0 - for validator in watched_validators.get_validators().values(): - status = str(validator.status) - statuses.add(status) - - for label in validator.labels: + metrics = defaultdict(MetricsByLabel) - labels.add(label) + for validator in watched_validators.validators(): - validator_status_count[label][status] += 1 + status = str(validator.status) - validator_slashes[label] += int(validator.beacon_validator.validator.slashed == True) + for label in validator.labels: + m = metrics[label] + + if status not in m.validator_status_count: + m.validator_status_count[status] = 0 + m.validator_status_count[status] += 1 + + m.validator_slashes += int(validator.beacon_validator.validator.slashed == True) # Everything below implies to have a validator that is # active on the beacon chain, this prevents @@ -153,25 +158,25 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo # for each set of labels even if they aren't validating # (in which case the validator attributes are None). - suboptimal_source_count[label] += int(validator.suboptimal_source == True) - suboptimal_target_count[label] += int(validator.suboptimal_target == True) - suboptimal_head_count[label] += int(validator.suboptimal_head == True) - optimal_source_count[label] += int(validator.suboptimal_source == False) - optimal_target_count[label] += int(validator.suboptimal_target == False) - optimal_head_count[label] += int(validator.suboptimal_head == False) + m.suboptimal_source_count += int(validator.suboptimal_source == True) + m.suboptimal_target_count += int(validator.suboptimal_target == True) + m.suboptimal_head_count += int(validator.suboptimal_head == True) + m.optimal_source_count += int(validator.suboptimal_source == False) + m.optimal_target_count += int(validator.suboptimal_target == False) + m.optimal_head_count += int(validator.suboptimal_head == False) - ideal_consensus_reward[label] += validator.ideal_consensus_reward or 0 - actual_consensus_reward[label] += validator.actual_consensus_reward or 0 + m.ideal_consensus_reward += validator.ideal_consensus_reward or 0 + m.actual_consensus_reward += validator.actual_consensus_reward or 0 - missed_attestations[label] += int(validator.missed_attestation == True) - missed_consecutive_attestations[label] += int(validator.previous_missed_attestation == True and validator.missed_attestation == True) + m.missed_attestations += int(validator.missed_attestation == True) + m.missed_consecutive_attestations += int(validator.previous_missed_attestation == True and validator.missed_attestation == True) - proposed_blocks[label] += validator.proposed_blocks_total - missed_blocks[label] += validator.missed_blocks_total - proposed_finalized_blocks[label] += validator.proposed_blocks_finalized_total - missed_finalized_blocks[label] += validator.missed_blocks_finalized_total + m.proposed_blocks += validator.proposed_blocks_total + m.missed_blocks += validator.missed_blocks_total + m.proposed_finalized_blocks += validator.proposed_blocks_finalized_total + m.missed_finalized_blocks += validator.missed_blocks_finalized_total - future_blocks[label] += validator.future_blocks_proposal + m.future_blocks += validator.future_blocks_proposal # Here we reset the counters for the next run, we do not # touch gauges though. This ensures we handle properly @@ -184,39 +189,40 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo validator.future_blocks_proposal = 0 - for label in labels: - for status in statuses: - value = validator_status_count.get(label, {}).get(status, 0) + for label, m in metrics.items(): + for status in Validators.DataItem.StatusEnum: + value = m.validator_status_count.get(status, 0) self._metrics.eth_validator_status_count.labels(label, status, network).set(value) - for label in labels: - self._metrics.eth_suboptimal_sources_rate.labels(label, network).set(pct(suboptimal_source_count[label], optimal_source_count[label])) - self._metrics.eth_suboptimal_targets_rate.labels(label, network).set(pct(suboptimal_target_count[label], optimal_target_count[label])) - self._metrics.eth_suboptimal_heads_rate.labels(label, network).set(pct(suboptimal_head_count[label], optimal_head_count[label])) + for label, m in metrics.items(): + self._metrics.eth_suboptimal_sources_rate.labels(label, network).set(pct(m.suboptimal_source_count, m.optimal_source_count)) + self._metrics.eth_suboptimal_targets_rate.labels(label, network).set(pct(m.suboptimal_target_count, m.optimal_target_count)) + self._metrics.eth_suboptimal_heads_rate.labels(label, network).set(pct(m.suboptimal_head_count, m.optimal_head_count)) - self._metrics.eth_ideal_consensus_rewards_gwei.labels(label, network).set(ideal_consensus_reward[label]) - self._metrics.eth_actual_consensus_rewards_gwei.labels(label, network).set(actual_consensus_reward[label]) - self._metrics.eth_consensus_rewards_rate.labels(label, network).set(pct(actual_consensus_reward[label], ideal_consensus_reward[label], True)) + self._metrics.eth_ideal_consensus_rewards_gwei.labels(label, network).set(m.ideal_consensus_reward) + self._metrics.eth_actual_consensus_rewards_gwei.labels(label, network).set(m.actual_consensus_reward) + self._metrics.eth_consensus_rewards_rate.labels(label, network).set(pct(m.actual_consensus_reward, m.ideal_consensus_reward, True)) - self._metrics.eth_missed_attestations_count.labels(label, network).set(missed_attestations[label]) - self._metrics.eth_missed_consecutive_attestations_count.labels(label, network).set(missed_consecutive_attestations[label]) - self._metrics.eth_slashed_validators_count.labels(label, network).set(validator_slashes[label]) + self._metrics.eth_missed_attestations_count.labels(label, network).set(m.missed_attestations) + self._metrics.eth_missed_consecutive_attestations_count.labels(label, network).set(m.missed_consecutive_attestations) + self._metrics.eth_slashed_validators_count.labels(label, network).set(m.validator_slashes) # Here we inc, it's fine since we previously reset the # counters on each run; we can't use set because those # metrics are counters. - self._metrics.eth_block_proposals_head_total.labels(label, network).inc(proposed_blocks[label]) - self._metrics.eth_missed_block_proposals_head_total.labels(label, network).inc(missed_blocks[label]) - self._metrics.eth_block_proposals_finalized_total.labels(label, network).inc(proposed_finalized_blocks[label]) - self._metrics.eth_missed_block_proposals_finalized_total.labels(label, network).inc(missed_finalized_blocks[label]) + self._metrics.eth_block_proposals_head_total.labels(label, network).inc(m.proposed_blocks) + self._metrics.eth_missed_block_proposals_head_total.labels(label, network).inc(m.missed_blocks) + self._metrics.eth_block_proposals_finalized_total.labels(label, network).inc(m.proposed_finalized_blocks) + self._metrics.eth_missed_block_proposals_finalized_total.labels(label, network).inc(m.missed_finalized_blocks) - self._metrics.eth_future_block_proposals.labels(label, network).set(future_blocks[label]) + self._metrics.eth_future_block_proposals.labels(label, network).set(m.future_blocks) if not self._metrics_started: start_http_server(self._cfg.metrics_port) self._metrics_started = True + def run(self) -> None: """Run the Ethereum Validator Watcher. """ @@ -240,12 +246,12 @@ def run(self) -> None: beacon_validators = self._beacon.get_validators(self._clock.epoch_to_slot(epoch)) watched_validators.process_epoch(beacon_validators) - if validators_liveness == None or (slot % SLOT_FOR_MISSED_ATTESTATIONS_PROCESS == 0): + if validators_liveness == None or (slot % self._spec.data.SLOTS_PER_EPOCH == SLOT_FOR_MISSED_ATTESTATIONS_PROCESS): logging.info('Processing validator liveness') validators_liveness = self._beacon.get_validators_liveness(epoch - 1, watched_validators.get_indexes()) watched_validators.process_liveness(validators_liveness) - - if rewards == None or (slot % SLOT_FOR_REWARDS_PROCESS == 0): + + if rewards == None or (slot % self._spec.data.SLOTS_PER_EPOCH == SLOT_FOR_REWARDS_PROCESS): logging.info('Processing rewards') rewards = self._beacon.get_rewards(epoch - 2) process_rewards(watched_validators, rewards) @@ -263,7 +269,7 @@ def run(self) -> None: last_processed_finalized_slot += 1 last_processed_finalized_slot = last_finalized_slot - if (slot % SLOT_FOR_CONFIG_RELOAD == 0): + if (slot % self._spec.data.SLOTS_PER_EPOCH == SLOT_FOR_CONFIG_RELOAD): logging.info('Processing configuration update') self._reload_config() watched_validators.process_config(self._cfg) diff --git a/eth_validator_watcher/slashed_validators.py b/eth_validator_watcher/slashed_validators.py deleted file mode 100644 index a682c90..0000000 --- a/eth_validator_watcher/slashed_validators.py +++ /dev/null @@ -1,116 +0,0 @@ -"""Contains the SlashedValidators class, which is responsible for managing the slashed -validators.""" -from prometheus_client import Gauge - -from .models import Validators -from .utils import Slack - -metric_our_slashed_validators_count = Gauge( - "our_slashed_validators_count", - "Our slashed validators count", -) - -metric_total_slashed_validators_count = Gauge( - "total_slashed_validators_count", - "Total slashed validators count", -) - - -class SlashedValidators: - """Slashed validators abstraction.""" - - def __init__(self, slack: Slack | None) -> None: - """Slashed validators - - Parameters: - slack: Optional slack client - """ - self.__total_exited_slashed_indexes: set[int] | None = None - self.__our_exited_slashed_indexes: set[int] | None = None - self.__slack = slack - - def process( - self, - total_exited_slashed_index_to_validator: dict[ - int, Validators.DataItem.Validator - ], - our_exited_slashed_index_to_validator: dict[int, Validators.DataItem.Validator], - total_withdrawal_index_to_validator: dict[int, Validators.DataItem.Validator], - our_withdrawal_index_to_validator: dict[int, Validators.DataItem.Validator], - ) -> None: - """Process slashed validators. - - Parameters: - total_exited_slashed_index_to_validator: Dictionary with: - key : total exited validator index - value: validator data corresponding to the validator index - our_exited_slashed_index_to_validator : Dictionary with: - key : our exited validator index - value: validator data corresponding to the validator index - total_withdrawal_index_to_validator : Dictionary with: - key : total withdrawal validator index - value: validator data corresponding to the validator index - our_withdrawal_index_to_validator : Dictionary with: - key : our withdrawal validator index - value: validator data corresponding to the validator index - """ - total_slashed_withdrawal_index_to_validator = { - index - for index, validator in total_withdrawal_index_to_validator.items() - if validator.slashed - } - - our_slashed_withdrawal_index_to_validator = { - index - for index, validator in our_withdrawal_index_to_validator.items() - if validator.slashed - } - - total_slashed_indexes = set(total_exited_slashed_index_to_validator) | set( - total_slashed_withdrawal_index_to_validator - ) - - our_slashed_indexes = set(our_exited_slashed_index_to_validator) | set( - our_slashed_withdrawal_index_to_validator - ) - - metric_total_slashed_validators_count.set(len(total_slashed_indexes)) - metric_our_slashed_validators_count.set(len(our_slashed_indexes)) - - total_exited_slashed_indexes = set(total_exited_slashed_index_to_validator) - our_exited_slashed_indexes = set(our_exited_slashed_index_to_validator) - - if ( - self.__total_exited_slashed_indexes is None - or self.__our_exited_slashed_indexes is None - ): - self.__total_exited_slashed_indexes = total_exited_slashed_indexes - self.__our_exited_slashed_indexes = our_exited_slashed_indexes - return - - total_new_exited_slashed_indexes = ( - total_exited_slashed_indexes - self.__total_exited_slashed_indexes - ) - - our_new_exited_slashed_indexes = ( - our_exited_slashed_indexes - self.__our_exited_slashed_indexes - ) - - not_our_new_exited_slashed_indexes = ( - total_new_exited_slashed_indexes - our_new_exited_slashed_indexes - ) - - for index in not_our_new_exited_slashed_indexes: - print( - f"🔪 validator {total_exited_slashed_index_to_validator[index].pubkey[:10]} is slashed" - ) - - for index in our_new_exited_slashed_indexes: - message = f"🔕 Our validator {our_exited_slashed_index_to_validator[index].pubkey[:10]} is slashed" - print(message) - - if self.__slack is not None: - self.__slack.send_message(message) - - self.__total_exited_slashed_indexes = total_exited_slashed_indexes - self.__our_exited_slashed_indexes = our_exited_slashed_indexes diff --git a/eth_validator_watcher/utils.py b/eth_validator_watcher/utils.py index 58254d7..03b898b 100644 --- a/eth_validator_watcher/utils.py +++ b/eth_validator_watcher/utils.py @@ -21,29 +21,6 @@ LABEL_SCOPE_WATCHED="scope:watched" LABEL_SCOPE_UNWATCHED="scope:unwatched" -CHUCK_NORRIS = [ - "Chuck Norris doesn't stake Ethers; he stares at the blockchain, and it instantly " - "produces new coins.", - "When Chuck Norris sends Ethers, it doesn't need confirmations. The Ethereum " - "network just knows better than to mess with Chuck.", - "Chuck Norris once hacked into a smart contract without using a computer. He just " - "stared at the code, and it fixed itself.", - "Ethereum's gas fees are afraid of Chuck Norris. They lower themselves just to " - "avoid his wrath.", - "Chuck Norris doesn't need a private key to access his Ethereum wallet. He just " - "flexes his biceps, and it opens.", - "When Chuck Norris trades on a decentralized exchange, the price slippage goes in " - "his favor, no matter what.", - "Vitalik Buterin once challenged Chuck Norris to a coding contest. Chuck won by " - "writing Ethereum's whitepaper with his eyes closed.", - "Chuck Norris's Ethereum nodes are so fast that they can process transactions " - "before they even happen.", - 'The Ethereum community calls Chuck Norris the "Smart Contract Whisperer" ' - "because he can make any contract do his bidding.", - "When Chuck Norris checks his Ethereum balance, the wallet interface just says, " - '"Infinite."', -] - metric_keys_count = Gauge( "keys_count", "Keys count", diff --git a/eth_validator_watcher/watched_validators.py b/eth_validator_watcher/watched_validators.py index bbebcfc..5047d90 100644 --- a/eth_validator_watcher/watched_validators.py +++ b/eth_validator_watcher/watched_validators.py @@ -17,7 +17,7 @@ import logging -from typing import Optional +from typing import Optional, Generator from .config import Config, WatchedKeyConfig from .models import Validators, ValidatorsLivenessResponse @@ -43,9 +43,10 @@ class WatchedValidator: """ def __init__(self): - self.index : int = 0 self.previous_status : Validators.DataItem.StatusEnum | None = None - self._labels : Optional[list[str]] = None + + # This gets overriden by process_config if the validator is watched. + self._labels : Optional[list[str]] = [LABEL_SCOPE_NETWORK, LABEL_SCOPE_UNWATCHED] # Gauges (updated each epoch) ; implies to use direct values # on the Prometheus side (no rate calculation). @@ -83,9 +84,7 @@ def status(self) -> Validators.DataItem.StatusEnum: def labels(self) -> list[str]: """Get the labels for the validator. """ - if self._labels: - return self._labels + [LABEL_SCOPE_NETWORK, LABEL_SCOPE_WATCHED] - return [LABEL_SCOPE_UNWATCHED, LABEL_SCOPE_NETWORK] + return self._labels def is_validating(self) -> bool: """Check if the validator is validating. @@ -102,7 +101,10 @@ def process_config(self, config: WatchedKeyConfig): Parameters: config: New configuration """ - self._labels = config.labels or [] + if config.labels: + self._labels = config.labels + [LABEL_SCOPE_NETWORK, LABEL_SCOPE_WATCHED] + else: + self._labels = [LABEL_SCOPE_NETWORK, LABEL_SCOPE_UNWATCHED] def process_epoch(self, validator: Validators.DataItem): """Processes a new epoch. @@ -160,9 +162,10 @@ def get_indexes(self) -> list[int]: """Get all validator indexes.""" return list(self._validators.keys()) - def get_validators(self) -> dict[int, WatchedValidator]: - """Get all validators.""" - return self._validators + def validators(self) -> Generator[WatchedValidator, None, None]: + """Iterate over all validators.""" + for validator in self._validators.values(): + yield validator def process_config(self, config: Config): """Process a config update From 1187b324e625363a3e45299e43e1fcba7c129eca Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Thu, 6 Jun 2024 14:24:31 +0200 Subject: [PATCH 57/82] feat: use google python style for private class members --- eth_validator_watcher/beacon.py | 68 ++++++++++++++--------------- eth_validator_watcher/entrypoint.py | 1 - 2 files changed, 34 insertions(+), 35 deletions(-) diff --git a/eth_validator_watcher/beacon.py b/eth_validator_watcher/beacon.py index b453ac6..c1e4ad8 100644 --- a/eth_validator_watcher/beacon.py +++ b/eth_validator_watcher/beacon.py @@ -37,12 +37,12 @@ def __init__(self, url: str, timeout_sec: int) -> None: url : URL where the beacon can be reached timeout_sec: timeout in seconds used to query the beacon """ - self.__url = url - self.__timeout_sec = timeout_sec - self.__http_retry_not_found = Session() - self.__http = Session() - self.__first_liveness_call = True - self.__first_rewards_call = True + self._url = url + self._timeout_sec = timeout_sec + self._http_retry_not_found = Session() + self._http = Session() + self._first_liveness_call = True + self._first_rewards_call = True adapter_retry_not_found = HTTPAdapter( max_retries=Retry( @@ -67,51 +67,51 @@ def __init__(self, url: str, timeout_sec: int) -> None: ) ) - self.__http_retry_not_found.mount("http://", adapter_retry_not_found) - self.__http_retry_not_found.mount("https://", adapter_retry_not_found) + self._http_retry_not_found.mount("http://", adapter_retry_not_found) + self._http_retry_not_found.mount("https://", adapter_retry_not_found) - self.__http.mount("http://", adapter) - self.__http.mount("https://", adapter) + self._http.mount("http://", adapter) + self._http.mount("https://", adapter) @retry( stop=stop_after_attempt(5), wait=wait_fixed(3), retry=retry_if_exception_type(ChunkedEncodingError), ) - def __get_retry_not_found(self, *args: Any, **kwargs: Any) -> Response: + def _get_retry_not_found(self, *args: Any, **kwargs: Any) -> Response: """Wrapper around requests.get() with retry on 404""" - return self.__http_retry_not_found.get(*args, **kwargs) + return self._http_retry_not_found.get(*args, **kwargs) @retry( stop=stop_after_attempt(5), wait=wait_fixed(3), retry=retry_if_exception_type(ChunkedEncodingError), ) - def __get(self, *args: Any, **kwargs: Any) -> Response: + def _get(self, *args: Any, **kwargs: Any) -> Response: """Wrapper around requests.get()""" - return self.__http.get(*args, **kwargs) + return self._http.get(*args, **kwargs) @retry( stop=stop_after_attempt(5), wait=wait_fixed(3), retry=retry_if_exception_type(ChunkedEncodingError), ) - def __post_retry_not_found(self, *args: Any, **kwargs: Any) -> Response: + def _post_retry_not_found(self, *args: Any, **kwargs: Any) -> Response: """Wrapper around requests.get() with retry on 404""" - return self.__http_retry_not_found.post(*args, **kwargs) + return self._http_retry_not_found.post(*args, **kwargs) def get_url(self) -> str: """Return the URL of the beacon.""" - return self.__url + return self._url def get_timeout_sec(self) -> int: """Return the timeout in seconds used to query the beacon.""" - return self.__timeout_sec + return self._timeout_sec def get_genesis(self) -> Genesis: """Get genesis data.""" - response = self.__get_retry_not_found( - f"{self.__url}/eth/v1/beacon/genesis", timeout=self.__timeout_sec + response = self._get_retry_not_found( + f"{self._url}/eth/v1/beacon/genesis", timeout=self._timeout_sec ) response.raise_for_status() @@ -120,8 +120,8 @@ def get_genesis(self) -> Genesis: def get_spec(self) -> Spec: """Get spec data.""" - response = self.__get_retry_not_found( - f"{self.__url}/eth/v1/config/spec", timeout=self.__timeout_sec + response = self._get_retry_not_found( + f"{self._url}/eth/v1/config/spec", timeout=self._timeout_sec ) response.raise_for_status() @@ -136,8 +136,8 @@ def get_header(self, block_identifier: Union[BlockIdentierType, int]) -> Header: retrieve """ try: - response = self.__get( - f"{self.__url}/eth/v1/beacon/headers/{block_identifier}", timeout=self.__timeout_sec + response = self._get( + f"{self._url}/eth/v1/beacon/headers/{block_identifier}", timeout=self._timeout_sec ) response.raise_for_status() except HTTPError as e: @@ -155,8 +155,8 @@ def get_proposer_duties(self, epoch: int) -> ProposerDuties: epoch: Epoch corresponding to the proposer duties to retrieve """ - response = self.__get_retry_not_found( - f"{self.__url}/eth/v1/validator/duties/proposer/{epoch}", timeout=self.__timeout_sec + response = self._get_retry_not_found( + f"{self._url}/eth/v1/validator/duties/proposer/{epoch}", timeout=self._timeout_sec ) response.raise_for_status() @@ -164,8 +164,8 @@ def get_proposer_duties(self, epoch: int) -> ProposerDuties: return ProposerDuties.model_validate_json(response.text) def get_validators(self, slot: int) -> Validators: - response = self.__get_retry_not_found( - f"{self.__url}/eth/v1/beacon/states/{slot}/validators", timeout=self.__timeout_sec + response = self._get_retry_not_found( + f"{self._url}/eth/v1/beacon/states/{slot}/validators", timeout=self._timeout_sec ) response.raise_for_status() @@ -178,10 +178,10 @@ def get_rewards(self, epoch: int) -> Rewards: Parameters: epoch: Epoch corresponding to the rewards to retrieve. """ - response = self.__post_retry_not_found( - f"{self.__url}/eth/v1/beacon/rewards/attestations/{epoch}", + response = self._post_retry_not_found( + f"{self._url}/eth/v1/beacon/rewards/attestations/{epoch}", json=([]), - timeout=self.__timeout_sec, + timeout=self._timeout_sec, ) response.raise_for_status() @@ -194,10 +194,10 @@ def get_validators_liveness(self, epoch: int, indexes: list[int]) -> ValidatorsL Parameters: epoch: Epoch corresponding to the validators liveness to retrieve """ - response = self.__post_retry_not_found( - f"{self.__url}/eth/v1/validator/liveness/{epoch}", + response = self._post_retry_not_found( + f"{self._url}/eth/v1/validator/liveness/{epoch}", json=[f"{i}" for i in indexes], - timeout=self.__timeout_sec, + timeout=self._timeout_sec, ) response.raise_for_status() diff --git a/eth_validator_watcher/entrypoint.py b/eth_validator_watcher/entrypoint.py index 2f385f1..07585e9 100644 --- a/eth_validator_watcher/entrypoint.py +++ b/eth_validator_watcher/entrypoint.py @@ -34,7 +34,6 @@ app = typer.Typer(add_completion=False) - class ValidatorWatcher: """Ethereum Validator Watcher. """ From 0a421733ea10095dbfc0f6bb4ced5efe5a1854e4 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Thu, 6 Jun 2024 19:29:10 +0200 Subject: [PATCH 58/82] feat: parallelize the bulk of processing --- eth_validator_watcher/entrypoint.py | 90 +---------- eth_validator_watcher/metrics.py | 161 +++++++++++++++++++- eth_validator_watcher/watched_validators.py | 7 +- 3 files changed, 167 insertions(+), 91 deletions(-) diff --git a/eth_validator_watcher/entrypoint.py b/eth_validator_watcher/entrypoint.py index 07585e9..ec50ae0 100644 --- a/eth_validator_watcher/entrypoint.py +++ b/eth_validator_watcher/entrypoint.py @@ -2,7 +2,6 @@ """ from collections import defaultdict -from dataclasses import dataclass, field from functools import partial from pathlib import Path from prometheus_client import start_http_server @@ -17,7 +16,7 @@ from .clock import BeaconClock from .beacon import Beacon, NoBlockError from .config import load_config, WatchedKeyConfig -from .metrics import get_prometheus_metrics +from .metrics import get_prometheus_metrics, compute_validator_metrics, AggregatedMetricsByLabel from .blocks import process_block, process_finalized_block, process_future_blocks from .models import BlockIdentierType, Validators from .rewards import process_rewards @@ -97,97 +96,16 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo # there is a log of entries here, this makes code here a bit # more complex and entangled. - @dataclass - class MetricsByLabel(): - """Helper class to reduce the number of look-ups per label in the validators loop. - - This reduces the number of look-ups and processing time by ~10x. - """ - # Count of validators by status - validator_status_count: dict[str, int] = field(default_factory=dict) - - # Gauges - suboptimal_source_count: int = 0 - suboptimal_target_count: int = 0 - suboptimal_head_count: int = 0 - optimal_source_count: int = 0 - optimal_target_count: int = 0 - optimal_head_count: int = 0 - validator_slashes: int = 0 - - # Gauges - ideal_consensus_reward: int = 0 - actual_consensus_reward: int = 0 - missed_attestations: int = 0 - missed_consecutive_attestations: int = 0 - - # Counters - proposed_blocks: int = 0 - missed_blocks: int = 0 - proposed_finalized_blocks: int = 0 - missed_finalized_blocks: int = 0 - - # Gauge - future_blocks: int = 0 - - - metrics = defaultdict(MetricsByLabel) - - for validator in watched_validators.validators(): - - status = str(validator.status) - - for label in validator.labels: - m = metrics[label] - - if status not in m.validator_status_count: - m.validator_status_count[status] = 0 - m.validator_status_count[status] += 1 - - m.validator_slashes += int(validator.beacon_validator.validator.slashed == True) - - # Everything below implies to have a validator that is - # active on the beacon chain, this prevents - # miscounting missed attestation for instance. - - if not validator.is_validating(): - continue - - # Looks weird but we want to explicitly have labels set - # for each set of labels even if they aren't validating - # (in which case the validator attributes are None). - - m.suboptimal_source_count += int(validator.suboptimal_source == True) - m.suboptimal_target_count += int(validator.suboptimal_target == True) - m.suboptimal_head_count += int(validator.suboptimal_head == True) - m.optimal_source_count += int(validator.suboptimal_source == False) - m.optimal_target_count += int(validator.suboptimal_target == False) - m.optimal_head_count += int(validator.suboptimal_head == False) - - m.ideal_consensus_reward += validator.ideal_consensus_reward or 0 - m.actual_consensus_reward += validator.actual_consensus_reward or 0 - - m.missed_attestations += int(validator.missed_attestation == True) - m.missed_consecutive_attestations += int(validator.previous_missed_attestation == True and validator.missed_attestation == True) - - m.proposed_blocks += validator.proposed_blocks_total - m.missed_blocks += validator.missed_blocks_total - m.proposed_finalized_blocks += validator.proposed_blocks_finalized_total - m.missed_finalized_blocks += validator.missed_blocks_finalized_total - - m.future_blocks += validator.future_blocks_proposal - - # Here we reset the counters for the next run, we do not - # touch gauges though. This ensures we handle properly - # changes of the labelling in real-time. + metrics = compute_validator_metrics(watched_validators.validators()) + # To remove... + for _, validator in watched_validators.validators().items(): validator.proposed_blocks_total = 0 validator.missed_blocks_total = 0 validator.proposed_blocks_finalized_total = 0 validator.missed_blocks_finalized_total = 0 validator.future_blocks_proposal = 0 - for label, m in metrics.items(): for status in Validators.DataItem.StatusEnum: value = m.validator_status_count.get(status, 0) diff --git a/eth_validator_watcher/metrics.py b/eth_validator_watcher/metrics.py index fe172f8..8f791f3 100644 --- a/eth_validator_watcher/metrics.py +++ b/eth_validator_watcher/metrics.py @@ -1,7 +1,17 @@ -from dataclasses import dataclass +import os +from collections import defaultdict +from dataclasses import dataclass, field +from itertools import batched + +from multiprocessing import Pool from prometheus_client import Counter, Gauge +from .watched_validators import WatchedValidator + + +PROCESSING_CHUNK_SIZE = 100000 + # This is global because Prometheus metrics don't support registration # multiple times. This is a workaround for unit tests. @@ -34,7 +44,156 @@ class PrometheusMetrics: eth_future_block_proposals: Gauge + +@dataclass +class AggregatedMetricsByLabel(): + """Helper class used to aggregate metrics by label. + """ + # Count of validators by status + validator_status_count: dict[str, int] = field(default_factory=dict) + + # Gauges + suboptimal_source_count: int = 0 + suboptimal_target_count: int = 0 + suboptimal_head_count: int = 0 + optimal_source_count: int = 0 + optimal_target_count: int = 0 + optimal_head_count: int = 0 + validator_slashes: int = 0 + + # Gauges + ideal_consensus_reward: int = 0 + actual_consensus_reward: int = 0 + missed_attestations: int = 0 + missed_consecutive_attestations: int = 0 + + # Counters + proposed_blocks: int = 0 + missed_blocks: int = 0 + proposed_finalized_blocks: int = 0 + missed_finalized_blocks: int = 0 + + # Gauge + future_blocks: int = 0 + + +def _aggregate_validator_metrics(validators: list[WatchedValidator]) -> dict[str, AggregatedMetricsByLabel]: + """Compute the metrics from a list of validators. + + This is called in a parallel unix process so that we can scale + with the number of validators on the network (with a single CPU it + takes about 5 seconds to go through 1.5M validators). Do not try + to change the state of validators here as it will be lost. The + resulting dictionnary is then merged in the main thread. + + Parameters: + validators: list[WatchedValidator] + + Returns: + dict[str, AggregatedMetricsByLabel] + """ + print(f'New thread aggregating data from {len(validators)} validators') + + metrics = defaultdict(AggregatedMetricsByLabel) + + for validator in validators: + + status = str(validator.status) + + for label in validator.labels: + m = metrics[label] + + if status not in m.validator_status_count: + m.validator_status_count[status] = 0 + m.validator_status_count[status] += 1 + + m.validator_slashes += int(validator.beacon_validator.validator.slashed == True) + + # Everything below implies to have a validator that is + # active on the beacon chain, this prevents + # miscounting missed attestation for instance. + + if not validator.is_validating(): + continue + + # Looks weird but we want to explicitly have labels set + # for each set of labels even if they aren't validating + # (in which case the validator attributes are None). + + m.suboptimal_source_count += int(validator.suboptimal_source == True) + m.suboptimal_target_count += int(validator.suboptimal_target == True) + m.suboptimal_head_count += int(validator.suboptimal_head == True) + m.optimal_source_count += int(validator.suboptimal_source == False) + m.optimal_target_count += int(validator.suboptimal_target == False) + m.optimal_head_count += int(validator.suboptimal_head == False) + + m.ideal_consensus_reward += validator.ideal_consensus_reward or 0 + m.actual_consensus_reward += validator.actual_consensus_reward or 0 + + m.missed_attestations += int(validator.missed_attestation == True) + m.missed_consecutive_attestations += int(validator.previous_missed_attestation == True and validator.missed_attestation == True) + + m.proposed_blocks += validator.proposed_blocks_total + m.missed_blocks += validator.missed_blocks_total + m.proposed_finalized_blocks += validator.proposed_blocks_finalized_total + m.missed_finalized_blocks += validator.missed_blocks_finalized_total + + m.future_blocks += validator.future_blocks_proposal + + return metrics + + +def compute_validator_metrics(validators: dict[int, WatchedValidator]) -> dict[str, AggregatedMetricsByLabel]: + """Compute the metrics from a list of validators. + + Parameters: + validators: list[WatchedValidator] + + Returns: + dict[str, AggregatedMetricsByLabel] + """ + metrics = defaultdict(AggregatedMetricsByLabel) + + with Pool() as p: + v = validators.values() + threads = [] + for batch in batched(v, int(len(v) / os.cpu_count())): + threads.append(p.apply_async(_aggregate_validator_metrics, (batch, ))) + + for thread in threads: + entry = thread.get() + print(f'Merging results from a thread') + for label, metric in entry.items(): + m = metrics[label] + + for status, count in metric.validator_status_count.items(): + if status not in m.validator_status_count: + m.validator_status_count[status] = 0 + m.validator_status_count[status] += count + + m.suboptimal_source_count += metric.suboptimal_source_count + m.suboptimal_target_count += metric.suboptimal_target_count + m.suboptimal_head_count += metric.suboptimal_head_count + m.optimal_source_count += metric.optimal_source_count + m.optimal_target_count += metric.optimal_target_count + m.optimal_head_count += metric.optimal_head_count + m.validator_slashes += metric.validator_slashes + + m.ideal_consensus_reward += metric.ideal_consensus_reward + m.actual_consensus_reward += metric.actual_consensus_reward + m.missed_attestations += metric.missed_attestations + m.missed_consecutive_attestations += metric.missed_consecutive_attestations + + m.proposed_blocks += metric.proposed_blocks + m.missed_blocks += metric.missed_blocks + m.proposed_finalized_blocks += metric.proposed_finalized_blocks + m.missed_finalized_blocks += metric.missed_finalized_blocks + + m.future_blocks += metric.future_blocks + return metrics + + def get_prometheus_metrics() -> PrometheusMetrics: """Get the Prometheus metrics. diff --git a/eth_validator_watcher/watched_validators.py b/eth_validator_watcher/watched_validators.py index 5047d90..304892a 100644 --- a/eth_validator_watcher/watched_validators.py +++ b/eth_validator_watcher/watched_validators.py @@ -17,7 +17,7 @@ import logging -from typing import Optional, Generator +from typing import Optional from .config import Config, WatchedKeyConfig from .models import Validators, ValidatorsLivenessResponse @@ -162,10 +162,9 @@ def get_indexes(self) -> list[int]: """Get all validator indexes.""" return list(self._validators.keys()) - def validators(self) -> Generator[WatchedValidator, None, None]: + def validators(self) -> dict[int, WatchedValidator]: """Iterate over all validators.""" - for validator in self._validators.values(): - yield validator + return self._validators def process_config(self, config: Config): """Process a config update From 35b2ad02ea31a0b04f6a63c5619fc815b7efa7e4 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Thu, 20 Jun 2024 20:07:16 +0200 Subject: [PATCH 59/82] fix: unit tests --- Dockerfile | 13 +--- eth_validator_watcher/clock.py | 25 ++++++-- eth_validator_watcher/config.py | 21 +++++-- eth_validator_watcher/entrypoint.py | 18 ++++-- eth_validator_watcher/metrics.py | 9 +-- liveness_check.py | 28 --------- poetry.lock | 98 ++++++++++++++++++++++++++++- pyproject.toml | 2 + tests/test_config.py | 8 +-- 9 files changed, 157 insertions(+), 65 deletions(-) delete mode 100644 liveness_check.py diff --git a/Dockerfile b/Dockerfile index a468f0b..361988f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,19 +1,8 @@ -FROM python:3.11.6-bookworm as builder +FROM python:3.12-bookworm as builder WORKDIR /app COPY . /app RUN pip install --upgrade pip RUN pip install --no-cache-dir --progress-bar off . -# Use Python 3.11 from Debian 12 -FROM gcr.io/distroless/python3-debian12:nonroot - -COPY --from=builder /app /app -COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages -COPY --from=builder /usr/local/bin/eth-validator-watcher /usr/local/bin/eth-validator-watcher - -COPY liveness_check.py /usr/local/bin/liveness_check.py - -ENV PYTHONPATH=/usr/local/lib/python3.11/site-packages - ENTRYPOINT [ "python", "/usr/local/bin/eth-validator-watcher" ] diff --git a/eth_validator_watcher/clock.py b/eth_validator_watcher/clock.py index acbab95..5588a24 100644 --- a/eth_validator_watcher/clock.py +++ b/eth_validator_watcher/clock.py @@ -11,11 +11,27 @@ class BeaconClock: slot. """ - def __init__(self, genesis: int, slot_duration: int, slots_per_epoch: int) -> None: + def __init__(self, genesis: int, slot_duration: int, slots_per_epoch: int, start_at: int | None) -> None: self._genesis = genesis self._slot_duration = slot_duration self._slots_per_epoch = slots_per_epoch self._lag_seconds = 4.0 + self._init_at = time.time() + self._start_at = start_at + + if start_at: + logging.info(f'Starting clock at timestamp @ {start_at}') + + def now(self) -> float: + """Get the current time in seconds since the epoch. + + Returns: + -------- + float: Current time in seconds since the epoch. + """ + if self._start_at is not None: + return self._start_at + time.time() - self._init_at + return time.time() def get_current_epoch(self) -> int: """Get the current epoch. @@ -47,19 +63,18 @@ def get_current_slot(self) -> int: -------- int: Current slot. """ - return int((time.time() - self._lag_seconds - self._genesis) // self._slot_duration) + return int((self.now() - self._lag_seconds - self._genesis) // self._slot_duration) - def maybe_wait_for_slot(self, slot: int, now: float) -> None: + def maybe_wait_for_slot(self, slot: int) -> None: """Wait until the given slot is reached. Args: ----- slot: int Slot to wait for. - now: float - Current time in seconds since the epoch. """ target = self._genesis + slot * self._slot_duration + self._lag_seconds + now = self.now() if now < target: logging.info(f'Waiting {target - now:.2f} seconds for slot {slot}') time.sleep(target - now) diff --git a/eth_validator_watcher/config.py b/eth_validator_watcher/config.py index 2be0e79..e888457 100644 --- a/eth_validator_watcher/config.py +++ b/eth_validator_watcher/config.py @@ -2,6 +2,8 @@ from pydantic_settings import BaseSettings, SettingsConfigDict from typing import Any, List, Optional +import logging +import json import os import yaml @@ -30,6 +32,7 @@ class Config(BaseSettings): liveness_file: Optional[str] = None watched_keys: Optional[List[WatchedKeyConfig]] = None metrics_port: Optional[int] = 8000 + start_at: Optional[int] = None def load_config(config_file: str) -> Config: @@ -45,12 +48,22 @@ def load_config(config_file: str) -> Config: The effective configuration used by the watcher """ with open(config_file, 'r') as fh: - config = yaml.load(fh, Loader=yaml.CLoader) or dict() + logging.info(f'parsing configuration file {config_file}') + if config_file.endswith('.json'): + config = json.load(fh) + else: + config = yaml.load(fh, Loader=yaml.CLoader) or dict() + + logging.info(f'validating configuration file') from_env = Config().model_dump() - from_yaml = Config(**config).model_dump() + from_file = Config(**config).model_dump() - merged = from_yaml.copy() + logging.info(f'merging with environment variables') + merged = from_file.copy() merged.update({k: v for k, v in from_env.items() if v}) + r = Config(**merged) + + logging.info(f'configuration file is ready') - return Config(**merged) + return r diff --git a/eth_validator_watcher/entrypoint.py b/eth_validator_watcher/entrypoint.py index ec50ae0..14c7b32 100644 --- a/eth_validator_watcher/entrypoint.py +++ b/eth_validator_watcher/entrypoint.py @@ -49,6 +49,7 @@ def __init__(self, cfg_path: Path) -> None: self._metrics_started = False self._cfg_path = cfg_path self._cfg = None + self._cfg_last_modified = None self._beacon = None self._slot_duration = None self._genesis = None @@ -62,6 +63,7 @@ def __init__(self, cfg_path: Path) -> None: genesis, self._spec.data.SECONDS_PER_SLOT, self._spec.data.SLOTS_PER_EPOCH, + self._cfg.start_at ) self._schedule = ProposerSchedule(self._spec) @@ -70,7 +72,9 @@ def _reload_config(self) -> None: """Reload the configuration file. """ try: - self._cfg = load_config(self._cfg_path) + if not self._cfg or self._cfg_path.stat().st_mtime != self._cfg_last_modified: + self._cfg = load_config(str(self._cfg_path)) + self._cfg_last_modified = self._cfg_path.stat().st_mtime except ValidationError as err: raise typer.BadParameter(f'Invalid configuration file: {err}') @@ -178,7 +182,6 @@ def run(self) -> None: process_block(watched_validators, self._schedule, slot, has_block) process_future_blocks(watched_validators, self._schedule, slot) - last_finalized_slot = self._beacon.get_header(BlockIdentierType.FINALIZED).data.header.message.slot while last_processed_finalized_slot and last_processed_finalized_slot < last_finalized_slot: logging.info(f'Processing finalized slot from {last_processed_finalized_slot or last_finalized_slot} to {last_finalized_slot}') has_block = self._beacon.has_block_at_slot(last_processed_finalized_slot) @@ -186,20 +189,23 @@ def run(self) -> None: last_processed_finalized_slot += 1 last_processed_finalized_slot = last_finalized_slot + logging.info('Updating Prometheus metrics') + self._update_metrics(watched_validators, epoch, slot) + if (slot % self._spec.data.SLOTS_PER_EPOCH == SLOT_FOR_CONFIG_RELOAD): logging.info('Processing configuration update') self._reload_config() watched_validators.process_config(self._cfg) - logging.info('Updating Prometheus metrics') - self._update_metrics(watched_validators, epoch, slot) - self._schedule.clear(slot, last_processed_finalized_slot) - self._clock.maybe_wait_for_slot(slot + 1, time.time()) + self._clock.maybe_wait_for_slot(slot + 1) slot += 1 epoch = slot // self._spec.data.SLOTS_PER_EPOCH + # Development only + break + @app.command() def handler( diff --git a/eth_validator_watcher/metrics.py b/eth_validator_watcher/metrics.py index 8f791f3..6322580 100644 --- a/eth_validator_watcher/metrics.py +++ b/eth_validator_watcher/metrics.py @@ -1,3 +1,4 @@ +import logging import os from collections import defaultdict @@ -10,7 +11,7 @@ from .watched_validators import WatchedValidator -PROCESSING_CHUNK_SIZE = 100000 +NB_THREADS = 4 # This is global because Prometheus metrics don't support registration @@ -92,7 +93,7 @@ def _aggregate_validator_metrics(validators: list[WatchedValidator]) -> dict[str Returns: dict[str, AggregatedMetricsByLabel] """ - print(f'New thread aggregating data from {len(validators)} validators') + logging.info(f'New thread aggregating data from {len(validators)} validators') metrics = defaultdict(AggregatedMetricsByLabel) @@ -157,12 +158,12 @@ def compute_validator_metrics(validators: dict[int, WatchedValidator]) -> dict[s with Pool() as p: v = validators.values() threads = [] - for batch in batched(v, int(len(v) / os.cpu_count())): + for batch in batched(v, int(len(v) / NB_THREADS)): threads.append(p.apply_async(_aggregate_validator_metrics, (batch, ))) for thread in threads: entry = thread.get() - print(f'Merging results from a thread') + logging.info(f'Aggregating results from a thread') for label, metric in entry.items(): m = metrics[label] diff --git a/liveness_check.py b/liveness_check.py deleted file mode 100644 index d289dfb..0000000 --- a/liveness_check.py +++ /dev/null @@ -1,28 +0,0 @@ -import sys -from datetime import datetime, timedelta -from pathlib import Path -from sys import argv - -MAX_DIFF = timedelta(minutes=1) - - -def main(parameters: list[str]): - assert len(parameters) > 1, "Missing liveness file path" - - _, liveness_file_str_path, *_ = parameters - liveness_file_path = Path(liveness_file_str_path) - - liveness_file_last_modification_date = datetime.fromtimestamp( - liveness_file_path.stat().st_mtime - ) - - current_date = datetime.now() - - if current_date - liveness_file_last_modification_date > MAX_DIFF: - sys.exit(1) - - sys.exit(0) - - -if __name__ == "__main__": - main(argv) diff --git a/poetry.lock b/poetry.lock index 1f88ce9..d3b65d3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "annotated-types" @@ -383,6 +383,17 @@ files = [ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] +[[package]] +name = "objprint" +version = "0.2.3" +description = "A library that can print Python objects in human readable format" +optional = false +python-versions = ">=3.6" +files = [ + {file = "objprint-0.2.3-py3-none-any.whl", hash = "sha256:1721e6f97bae5c5b86c2716a0d45a9dd2c9a4cd9f52cfc8a0dfbe801805554cb"}, + {file = "objprint-0.2.3.tar.gz", hash = "sha256:73d0ad5a7c3151fce634c8892e5c2a050ccae3b1a353bf1316f08b7854da863b"}, +] + [[package]] name = "packaging" version = "23.2" @@ -890,6 +901,20 @@ files = [ optional = ["SQLAlchemy (>=1.4,<3)", "aiodns (>1.0)", "aiohttp (>=3.7.3,<4)", "boto3 (<=2)", "websocket-client (>=1,<2)", "websockets (>=10,<11)"] testing = ["Flask (>=1,<2)", "Flask-Sockets (>=0.2,<1)", "Jinja2 (==3.0.3)", "Werkzeug (<2)", "black (==22.8.0)", "boto3 (<=2)", "click (==8.0.4)", "flake8 (>=5,<6)", "itsdangerous (==1.1.0)", "moto (>=3,<4)", "psutil (>=5,<6)", "pytest (>=6.2.5,<7)", "pytest-asyncio (<1)", "pytest-cov (>=2,<3)"] +[[package]] +name = "snakeviz" +version = "2.2.0" +description = "A web-based viewer for Python profiler output" +optional = false +python-versions = ">=3.7" +files = [ + {file = "snakeviz-2.2.0-py2.py3-none-any.whl", hash = "sha256:569e2d71c47f80a886aa6e70d6405cb6d30aa3520969ad956b06f824c5f02b8e"}, + {file = "snakeviz-2.2.0.tar.gz", hash = "sha256:7bfd00be7ae147eb4a170a471578e1cd3f41f803238958b6b8efcf2c698a6aa9"}, +] + +[package.dependencies] +tornado = ">=2.0" + [[package]] name = "tenacity" version = "8.2.3" @@ -904,6 +929,26 @@ files = [ [package.extras] doc = ["reno", "sphinx", "tornado (>=4.5)"] +[[package]] +name = "tornado" +version = "6.4.1" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">=3.8" +files = [ + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, + {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, + {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, + {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, +] + [[package]] name = "typer" version = "0.9.0" @@ -953,6 +998,55 @@ secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17. socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "viztracer" +version = "0.16.3" +description = "A debugging and profiling tool that can trace and visualize python code execution" +optional = false +python-versions = ">=3.8" +files = [ + {file = "viztracer-0.16.3-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:3a39fcee0ffd35639b75565afce9a48ea92a4386f4c2f4a2752b4ec068f273cb"}, + {file = "viztracer-0.16.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c223312ecf4adb2271ca4ea84b546b278ec2dbe15b5ace5aa630cb07c2b53d4f"}, + {file = "viztracer-0.16.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1320a6ebb89d691a1eced48f5d842d5d459d79bf85ad4fbf004e46bbf417c0d5"}, + {file = "viztracer-0.16.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a96df402baacdca90c23559c4632e517db2e91628d191a7670d95809960ca8e"}, + {file = "viztracer-0.16.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff04b25518eac932fec618c8297794c9894ac75db543b1c872cea945ae986feb"}, + {file = "viztracer-0.16.3-cp310-cp310-win32.whl", hash = "sha256:8f56dad6111e1f3a0bd1f6de541d87c0c145fd88d4fd2b613b0c0d1f538b1a29"}, + {file = "viztracer-0.16.3-cp310-cp310-win_amd64.whl", hash = "sha256:59c32b87b4c5ba25b78dcb993b255512106b669042ce2b31bb7b6a92edc43d67"}, + {file = "viztracer-0.16.3-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:cca0a017635f6ade7cd73474bcdc19b2730cdc468f338912afe749234c6ebe30"}, + {file = "viztracer-0.16.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8d6a938c197f4f723ad2f8d7b8e1aa0449e249dd4702e67445aaf42392786378"}, + {file = "viztracer-0.16.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8721e1fd177b4abff0cbee141a31d6b819867833c92866f238815b321178c6df"}, + {file = "viztracer-0.16.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73c0e88ecc68572599405cca54f52d7d9b7dc811992bf8edbee1860486627542"}, + {file = "viztracer-0.16.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73697d43ed42f6e5110166387c3b4d76b4e181bf70822bac3f7f3e39b12be21e"}, + {file = "viztracer-0.16.3-cp311-cp311-win32.whl", hash = "sha256:dac628f38a23154a184bd5f37e215d8ada83e33892593036112584dec83b7369"}, + {file = "viztracer-0.16.3-cp311-cp311-win_amd64.whl", hash = "sha256:13df50118ff0e3266c32b66f0ff26df202f7c4d9583a550dc537098303141cec"}, + {file = "viztracer-0.16.3-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:4f07b263abe9ade8390253eebdd4658eb44288e98d1b7b9afae42a54d15197f1"}, + {file = "viztracer-0.16.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f4b0b59cd97f7d6fb37766105cb062d042df87648670f560a3d730050026087"}, + {file = "viztracer-0.16.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a2f9b2bf4f8e051cf9ee70bd7e6ff91c33239bcd01fa37005423915bfccaa64"}, + {file = "viztracer-0.16.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69971a9b24801259511545ec2a3b5a4f90733f64fca799268fb6d64d72c9e93e"}, + {file = "viztracer-0.16.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2f208a89c79a87ba563ee39f035df924a0109c4a2300a8098181e25f1f8afea"}, + {file = "viztracer-0.16.3-cp312-cp312-win32.whl", hash = "sha256:bf23e06d8f9a870711a3441123c364ac6a5d0caa288c6acdd116212f81e46b2a"}, + {file = "viztracer-0.16.3-cp312-cp312-win_amd64.whl", hash = "sha256:594e9dabf5cca584654d6813844be0377ae292e8dd507a013e9e427fd10d6fbd"}, + {file = "viztracer-0.16.3-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5dc505dd2a607a8d9d2c0c488dc297593a3cca2227a4c31630d20fa0e4b27087"}, + {file = "viztracer-0.16.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a50b7876bcb1762767878422fe4ba0ff46854ddf2d494b8b236b595da889156b"}, + {file = "viztracer-0.16.3-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9f17cf5d67112b236bc3501f563beaa2a542121c0d8d2087b4e9a9d24763394d"}, + {file = "viztracer-0.16.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f4d5732e1a7f3f1fa4bee0f53f17155002fabef97d620bec774158bac7bd701"}, + {file = "viztracer-0.16.3-cp38-cp38-win32.whl", hash = "sha256:e79d7e55fffd32cbb49466f96233f292602c732832f9a9cc075773762be6f487"}, + {file = "viztracer-0.16.3-cp38-cp38-win_amd64.whl", hash = "sha256:8663707e5527f614cc038b6fa189697f0809e5593fa9522c0152261b79b493f0"}, + {file = "viztracer-0.16.3-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:38d330348f6be0f17628657a2e454b760de40383f3065ad48fe6e2ae57478d7a"}, + {file = "viztracer-0.16.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67bbb88d7cbfe3d12021f97d7f58b7a21eae20d799ea7092f55d2a60eff1dbe2"}, + {file = "viztracer-0.16.3-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf1378cb93f62e58976ee31d394ad9b667eca5d0edfe8371609e2e68c6427e03"}, + {file = "viztracer-0.16.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7c5bad11791c952b107f88b3a6a2a39848b0d0d6b8499222575854789722936"}, + {file = "viztracer-0.16.3-cp39-cp39-win32.whl", hash = "sha256:65d072348f96e402dd28d21e36e6d3f513f26dc79bf89cbde0efe594f239f8f5"}, + {file = "viztracer-0.16.3-cp39-cp39-win_amd64.whl", hash = "sha256:b8e35a109e9b1d5515ffeb0806e834274c0133a73d0a2a2b2fd24f031a1f43b3"}, + {file = "viztracer-0.16.3.tar.gz", hash = "sha256:943cb874cf92cdc786cd87938ac64ea081e3ae06ef73f577deac5b4a2a9621d5"}, +] + +[package.dependencies] +objprint = ">0.1.3" + +[package.extras] +full = ["orjson"] + [[package]] name = "zipp" version = "3.17.0" @@ -971,4 +1065,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "c7c853671d5922974eeab55b612202b54fcba75c5541b8081bcf87a4634b349d" +content-hash = "e4dfe96ba7f98cc19cd93a6d3d231e133f9216de1737bf04db3b9f5e1fc13334" diff --git a/pyproject.toml b/pyproject.toml index 45f9dd1..e765fdb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,6 +20,8 @@ pydantic-yaml = "^1.2.0" pydantic-settings = "^2.1.0" cachetools = "^5.3.3" +snakeviz = "^2.2.0" +viztracer = "^0.16.3" [tool.poetry.group.dev.dependencies] mypy = "^1.2.0" black = "^23.3.0" diff --git a/tests/test_config.py b/tests/test_config.py index 241bae6..1988724 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -6,7 +6,7 @@ def test_null_config() -> None: - path = Path(assets.__file__).parent / "config.null.yaml" + path = str(Path(assets.__file__).parent / "config.null.yaml") config = load_config(path) assert config.beacon_url is None @@ -23,7 +23,7 @@ def test_null_config() -> None: def test_empty_config() -> None: - path = Path(assets.__file__).parent / "config.empty.yaml" + path = str(Path(assets.__file__).parent / "config.empty.yaml") config = load_config(path) assert config.beacon_url is None @@ -40,7 +40,7 @@ def test_empty_config() -> None: def test_filled_config() -> None: - path = Path(assets.__file__).parent / "config.yaml" + path = str(Path(assets.__file__).parent / "config.yaml") config = load_config(path) assert config.beacon_url == 'http://localhost:5051/' @@ -71,7 +71,7 @@ def test_filled_config_overriden() -> None: os.environ['eth_watcher_liveness_file'] = '/tmp/override-liveness-file' os.environ['eth_watcher_network'] = 'sepolia' - path = Path(assets.__file__).parent / "config.yaml" + path = str(Path(assets.__file__).parent / "config.yaml") config = load_config(path) assert config.beacon_url == 'http://override-beacon/' From ad8da27a03def28468712031701f2f224f17a359 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Fri, 21 Jun 2024 09:42:01 +0200 Subject: [PATCH 60/82] feat: remove unused configuration files --- eth_validator_watcher/config.py | 15 +-- eth_validator_watcher/entrypoint.py | 11 -- eth_validator_watcher/metrics.py | 111 ++++------------ eth_validator_watcher/models.py | 19 --- eth_validator_watcher/utils.py | 199 ---------------------------- tests/assets/config.null.yaml | 8 +- tests/assets/config.yaml | 10 -- tests/test_config.py | 39 +----- 8 files changed, 36 insertions(+), 376 deletions(-) diff --git a/eth_validator_watcher/config.py b/eth_validator_watcher/config.py index e888457..885331b 100644 --- a/eth_validator_watcher/config.py +++ b/eth_validator_watcher/config.py @@ -13,26 +13,19 @@ class WatchedKeyConfig(BaseModel): """ public_key: str labels: Optional[list[str]] = None - fee_recipient: Optional[str] = None class Config(BaseSettings): """Configuration of the Ethereum Validator Watcher. """ model_config = SettingsConfigDict(case_sensitive=True, env_prefix='eth_watcher_') + network: Optional[str] = None beacon_url: Optional[str] = None - beacon_timeout_sec: int = 90 - execution_url: Optional[str] = None - web3signer_url: Optional[str] = None - default_fee_recipient: Optional[str] = None - slack_channel: Optional[str] = None - slack_token: Optional[str] = None - relays: Optional[List[str]] = None - liveness_file: Optional[str] = None - watched_keys: Optional[List[WatchedKeyConfig]] = None + beacon_timeout_sec: Optional[int] = 90 metrics_port: Optional[int] = 8000 start_at: Optional[int] = None + watched_keys: Optional[List[WatchedKeyConfig]] = None def load_config(config_file: str) -> Config: @@ -50,6 +43,8 @@ def load_config(config_file: str) -> Config: with open(config_file, 'r') as fh: logging.info(f'parsing configuration file {config_file}') + # We support json for large configuration files (500 MiB) + # which can take time to parse with PyYAML. if config_file.endswith('.json'): config = json.load(fh) else: diff --git a/eth_validator_watcher/entrypoint.py b/eth_validator_watcher/entrypoint.py index 14c7b32..90c608e 100644 --- a/eth_validator_watcher/entrypoint.py +++ b/eth_validator_watcher/entrypoint.py @@ -102,14 +102,6 @@ def _update_metrics(self, watched_validators: WatchedValidators, epoch: int, slo metrics = compute_validator_metrics(watched_validators.validators()) - # To remove... - for _, validator in watched_validators.validators().items(): - validator.proposed_blocks_total = 0 - validator.missed_blocks_total = 0 - validator.proposed_blocks_finalized_total = 0 - validator.missed_blocks_finalized_total = 0 - validator.future_blocks_proposal = 0 - for label, m in metrics.items(): for status in Validators.DataItem.StatusEnum: value = m.validator_status_count.get(status, 0) @@ -203,9 +195,6 @@ def run(self) -> None: slot += 1 epoch = slot // self._spec.data.SLOTS_PER_EPOCH - # Development only - break - @app.command() def handler( diff --git a/eth_validator_watcher/metrics.py b/eth_validator_watcher/metrics.py index 6322580..2727fc4 100644 --- a/eth_validator_watcher/metrics.py +++ b/eth_validator_watcher/metrics.py @@ -5,7 +5,6 @@ from dataclasses import dataclass, field from itertools import batched -from multiprocessing import Pool from prometheus_client import Counter, Gauge from .watched_validators import WatchedValidator @@ -78,120 +77,66 @@ class AggregatedMetricsByLabel(): future_blocks: int = 0 -def _aggregate_validator_metrics(validators: list[WatchedValidator]) -> dict[str, AggregatedMetricsByLabel]: +def compute_validator_metrics(validators: dict[int, WatchedValidator]) -> dict[str, AggregatedMetricsByLabel]: """Compute the metrics from a list of validators. - This is called in a parallel unix process so that we can scale - with the number of validators on the network (with a single CPU it - takes about 5 seconds to go through 1.5M validators). Do not try - to change the state of validators here as it will be lost. The - resulting dictionnary is then merged in the main thread. - Parameters: validators: list[WatchedValidator] Returns: dict[str, AggregatedMetricsByLabel] """ - logging.info(f'New thread aggregating data from {len(validators)} validators') - metrics = defaultdict(AggregatedMetricsByLabel) - for validator in validators: + for _, v in validators.items(): + status = str(v.status) - status = str(validator.status) - - for label in validator.labels: + for label in v.labels: m = metrics[label] if status not in m.validator_status_count: m.validator_status_count[status] = 0 m.validator_status_count[status] += 1 - m.validator_slashes += int(validator.beacon_validator.validator.slashed == True) + m.validator_slashes += int(v.beacon_validator.validator.slashed == True) # Everything below implies to have a validator that is # active on the beacon chain, this prevents # miscounting missed attestation for instance. - - if not validator.is_validating(): + if not v.is_validating(): continue # Looks weird but we want to explicitly have labels set # for each set of labels even if they aren't validating # (in which case the validator attributes are None). - m.suboptimal_source_count += int(validator.suboptimal_source == True) - m.suboptimal_target_count += int(validator.suboptimal_target == True) - m.suboptimal_head_count += int(validator.suboptimal_head == True) - m.optimal_source_count += int(validator.suboptimal_source == False) - m.optimal_target_count += int(validator.suboptimal_target == False) - m.optimal_head_count += int(validator.suboptimal_head == False) - - m.ideal_consensus_reward += validator.ideal_consensus_reward or 0 - m.actual_consensus_reward += validator.actual_consensus_reward or 0 + m.suboptimal_source_count += int(v.suboptimal_source == True) + m.suboptimal_target_count += int(v.suboptimal_target == True) + m.suboptimal_head_count += int(v.suboptimal_head == True) + m.optimal_source_count += int(v.suboptimal_source == False) + m.optimal_target_count += int(v.suboptimal_target == False) + m.optimal_head_count += int(v.suboptimal_head == False) - m.missed_attestations += int(validator.missed_attestation == True) - m.missed_consecutive_attestations += int(validator.previous_missed_attestation == True and validator.missed_attestation == True) + m.ideal_consensus_reward += v.ideal_consensus_reward or 0 + m.actual_consensus_reward += v.actual_consensus_reward or 0 - m.proposed_blocks += validator.proposed_blocks_total - m.missed_blocks += validator.missed_blocks_total - m.proposed_finalized_blocks += validator.proposed_blocks_finalized_total - m.missed_finalized_blocks += validator.missed_blocks_finalized_total + m.missed_attestations += int(v.missed_attestation == True) + m.missed_consecutive_attestations += int(v.previous_missed_attestation == True and v.missed_attestation == True) - m.future_blocks += validator.future_blocks_proposal + m.proposed_blocks += v.proposed_blocks_total + m.missed_blocks += v.missed_blocks_total + m.proposed_finalized_blocks += v.proposed_blocks_finalized_total + m.missed_finalized_blocks += v.missed_blocks_finalized_total - return metrics - - -def compute_validator_metrics(validators: dict[int, WatchedValidator]) -> dict[str, AggregatedMetricsByLabel]: - """Compute the metrics from a list of validators. - - Parameters: - validators: list[WatchedValidator] - - Returns: - dict[str, AggregatedMetricsByLabel] - """ - metrics = defaultdict(AggregatedMetricsByLabel) - - with Pool() as p: - v = validators.values() - threads = [] - for batch in batched(v, int(len(v) / NB_THREADS)): - threads.append(p.apply_async(_aggregate_validator_metrics, (batch, ))) - - for thread in threads: - entry = thread.get() - logging.info(f'Aggregating results from a thread') - for label, metric in entry.items(): - m = metrics[label] - - for status, count in metric.validator_status_count.items(): - if status not in m.validator_status_count: - m.validator_status_count[status] = 0 - m.validator_status_count[status] += count - - m.suboptimal_source_count += metric.suboptimal_source_count - m.suboptimal_target_count += metric.suboptimal_target_count - m.suboptimal_head_count += metric.suboptimal_head_count - m.optimal_source_count += metric.optimal_source_count - m.optimal_target_count += metric.optimal_target_count - m.optimal_head_count += metric.optimal_head_count - m.validator_slashes += metric.validator_slashes - - m.ideal_consensus_reward += metric.ideal_consensus_reward - m.actual_consensus_reward += metric.actual_consensus_reward - m.missed_attestations += metric.missed_attestations - m.missed_consecutive_attestations += metric.missed_consecutive_attestations - - m.proposed_blocks += metric.proposed_blocks - m.missed_blocks += metric.missed_blocks - m.proposed_finalized_blocks += metric.proposed_finalized_blocks - m.missed_finalized_blocks += metric.missed_finalized_blocks - - m.future_blocks += metric.future_blocks + m.future_blocks += v.future_blocks_proposal + # Reset the counters for the next run. + v.proposed_blocks_total = 0 + v.missed_blocks_total = 0 + v.proposed_blocks_finalized_total = 0 + v.missed_blocks_finalized_total = 0 + v.future_blocks_proposal = 0 + return metrics diff --git a/eth_validator_watcher/models.py b/eth_validator_watcher/models.py index 7d8dab3..9d85672 100644 --- a/eth_validator_watcher/models.py +++ b/eth_validator_watcher/models.py @@ -133,25 +133,6 @@ class BlockIdentierType(StrEnum): FINALIZED = "finalized" -class EthGetBlockByHashRequest(BaseModel): - jsonrpc: str = "2.0" - method: str = "eth_getBlockByHash" - params: list - id: str = "1" - - -class ExecutionBlock(BaseModel): - class Result(BaseModel): - class Transaction(BaseModel): - to: str | None - - transactions: list[Transaction] - - jsonrpc: str - id: int - result: Result - - class Rewards(BaseModel): class Data(BaseModel): class IdealReward(BaseModel): diff --git a/eth_validator_watcher/utils.py b/eth_validator_watcher/utils.py index 03b898b..0b07b2b 100644 --- a/eth_validator_watcher/utils.py +++ b/eth_validator_watcher/utils.py @@ -9,200 +9,13 @@ from .config import WatchedKeyConfig -NB_SLOT_PER_EPOCH = 32 -NB_SECOND_PER_SLOT = 12 -MISSED_BLOCK_TIMEOUT_SEC = 10 SLOT_FOR_CONFIG_RELOAD = 15 SLOT_FOR_MISSED_ATTESTATIONS_PROCESS = 16 SLOT_FOR_REWARDS_PROCESS = 17 -ETH1_ADDRESS_LEN = 40 -ETH2_ADDRESS_LEN = 96 LABEL_SCOPE_NETWORK="scope:network" LABEL_SCOPE_WATCHED="scope:watched" LABEL_SCOPE_UNWATCHED="scope:unwatched" -metric_keys_count = Gauge( - "keys_count", - "Keys count", -) - - -def convert_hex_to_bools(hex: str) -> list[bool]: - """Convert an hexadecimal number into list of booleans - - Parameters: - hex: can contain `0x` prefix - - Example: - -------- - convert_hex_to_bools("0x0F0A") == convert_hex_to_bools("0F0A") == \ - [ - False, False, False, False, - True, True, True, True, - False, False, False, False, - True, False, True, False - ] - """ - hex_without_0x_prefix = hex[2:] if hex[:2] == "0x" else hex - - hex_without_0x_prefix_size = len(hex_without_0x_prefix) * 4 - binary = (bin(int(hex_without_0x_prefix, 16))[2:]).zfill(hex_without_0x_prefix_size) - - return [bit == "1" for bit in binary] - - -def switch_endianness(bits: list[bool]) -> list[bool]: - """Revert bits by 8 groups - - Paremeters: - bits: list of booleans representing bits - - Example: - ------- - switch_endianness( - [ - False, False, True, False, True, True, True, False, - True, False, True, False, False, True, True, True - ] - == - [ - False, True, True, True, False, True, False, False, - True, True, True, False, False, True, False, True - ] - ) - """ - list_of_bits = chunked(bits, 8) - reversed_list_of_bits = [reversed(bits) for bits in list_of_bits] - return [item for sublist in reversed_list_of_bits for item in sublist] - - -def remove_all_items_from_last_true(bits: list[bool]) -> list[bool]: - """Remove all items after last True - - Paremeters: - bits: list of booleans representing bits - - If no True is found in the list, StopIteration is raised - - Example: - -------- - - remove_all_items_from_last_true([False, True, False, True, True, False]) == \ - [False, True, False, True] - """ - try: - index = next((index for index, bit in enumerate(reversed(bits)) if bit)) - except StopIteration: - raise StopIteration(f"No `True` detected in {bits}") - - return bits[: -index - 1] - - -def aggregate_bools(list_of_bools: list[list[bool]]) -> list[bool]: - """Aggregate bools - - Parameters: - list_of_bools: A list of list of booleans - - If the length of each list is not the same, `ValueError` is raised. - - examples: - --------- - aggregate_bools( - [ - [False, False, True], - [False, True, False] - ] - ) == [False, True, True] - - aggregate_bools( - [ - [False, False], - [False, True, False] - ] - ) ==> ValueError - """ - - _, *trash = {len(bits) for bits in list_of_bools} - - if trash != []: - raise ValueError("At least one bools has not the same length than others") - - return [any(bools) for bools in zip(*list_of_bools)] # type:ignore - - -def apply_mask(items: list[Any], mask: list[bool]) -> set[Any]: - """Apply mask - - Parameters: - items: A list of items - mask: A list of booleans representing a mask - - Example: - -------- - - apply_mask( - ["a", "b", "c", "d", "e"], - [True, False, False, True, False] - ) == {"a", "d"} - """ - - return set(item for item, bit in zip(items, mask) if bit) - - -def write_liveness_file(liveness_file: Path): - """Write liveness file""" - liveness_file.parent.mkdir(exist_ok=True, parents=True) - - with liveness_file.open("w") as file_descriptor: - file_descriptor.write("OK") - - -class Slack: - def __init__(self, channel: str, token: str) -> None: - self.__channel = channel - self.__client = WebClient(token=token) - - def send_message(self, message: str) -> None: - self.__client.chat_postMessage(channel=self.__channel, text=message) - - -def slots(genesis_time_sec: int) -> Iterator[Tuple[int, int]]: - next_slot = int((time() - genesis_time_sec) / NB_SECOND_PER_SLOT) + 1 - - try: - while True: - next_slot_time_sec = genesis_time_sec + next_slot * NB_SECOND_PER_SLOT - time_to_wait = next_slot_time_sec - time() - sleep(max(0, time_to_wait)) - - yield next_slot, next_slot_time_sec - - next_slot += 1 - except KeyboardInterrupt: - pass # pragma: no cover - - -def convert_seconds_to_dhms(seconds: int) -> tuple[int, int, int, int]: - # Calculate days, hours, minutes, and seconds - days, seconds = divmod(seconds, 86400) # 1 day = 24 hours * 60 minutes * 60 seconds - hours, seconds = divmod(seconds, 3600) # 1 hour = 60 minutes * 60 seconds - minutes, seconds = divmod(seconds, 60) # 1 minute = 60 seconds - - return days, hours, minutes, seconds - - -def eth1_address_lower_0x_prefixed(address: str) -> str: - address_lower = address.lower() - - if not re.match(f"^(0x)?[0-9a-f]{{{ETH1_ADDRESS_LEN}}}$", address_lower): - raise ValueError(f"Invalid ETH1 address: {address_lower}") - - if len(address) == ETH1_ADDRESS_LEN: - return f"0x{address_lower}" - - return address_lower - def pct(a: int, b: int, inclusive: bool=False) -> float: """Helper function to calculate the percentage of a over b. @@ -213,18 +26,6 @@ def pct(a: int, b: int, inclusive: bool=False) -> float: return float(a / total) * 100.0 -def eth2_address_lower_0x_prefixed(address: str) -> str: - address_lower = address.lower() - - if not re.match(f"^(0x)?[0-9a-f]{{{ETH2_ADDRESS_LEN}}}$", address_lower): - raise ValueError(f"Invalid ETH2 address: {address_lower}") - - if len(address) == ETH2_ADDRESS_LEN: - return f"0x{address_lower}" - - return address_lower - - class LimitedDict: def __init__(self, max_size: int) -> None: assert max_size >= 0, "max_size must be non-negative" diff --git a/tests/assets/config.null.yaml b/tests/assets/config.null.yaml index ecd5ee6..e521bd3 100644 --- a/tests/assets/config.null.yaml +++ b/tests/assets/config.null.yaml @@ -1,10 +1,4 @@ beacon_url: ~ -execution_url: ~ +beacon_timeout_sec: ~ network: ~ -web3signer_url: ~ -default_fee_recipient: ~ -slack_channel: ~ -slack_token: ~ -relays: ~ -liveness_file: ~ watched_keys: ~ diff --git a/tests/assets/config.yaml b/tests/assets/config.yaml index e21e733..d138743 100644 --- a/tests/assets/config.yaml +++ b/tests/assets/config.yaml @@ -3,17 +3,7 @@ beacon_url: http://localhost:5051/ beacon_timeout_sec: 90 network: holesky -execution_url: http://localhost:8545/ -web3signer_url: http://web3signer:9000/ -default_fee_recipient: '0x41bF25fC8C52d292bD66D3BCEcd8a919ecB9EF88' -slack_channel: '#ethereum-monitoring' -slack_token: 'secret' -relays: - - http://relay1 - - http://relay2 -liveness_file: /tmp/i-am-alive watched_keys: - public_key: '0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3' labels: ["google"] - fee_recipient: ~ diff --git a/tests/test_config.py b/tests/test_config.py index 1988724..0b98b0b 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -11,15 +11,8 @@ def test_null_config() -> None: assert config.beacon_url is None assert config.beacon_timeout_sec == 90 - assert config.execution_url is None - assert config.web3signer_url is None - assert config.default_fee_recipient is None - assert config.slack_channel is None - assert config.slack_token is None - assert config.relays is None - assert config.liveness_file is None - assert config.watched_keys is None assert config.network is None + assert config.watched_keys is None def test_empty_config() -> None: @@ -28,15 +21,8 @@ def test_empty_config() -> None: assert config.beacon_url is None assert config.beacon_timeout_sec == 90 - assert config.execution_url is None - assert config.web3signer_url is None - assert config.default_fee_recipient is None - assert config.slack_channel is None - assert config.slack_token is None - assert config.relays is None - assert config.liveness_file is None - assert config.watched_keys is None assert config.network is None + assert config.watched_keys is None def test_filled_config() -> None: @@ -45,13 +31,6 @@ def test_filled_config() -> None: assert config.beacon_url == 'http://localhost:5051/' assert config.beacon_timeout_sec == 90 - assert config.execution_url == 'http://localhost:8545/' - assert config.web3signer_url == 'http://web3signer:9000/' - assert config.default_fee_recipient == '0x41bF25fC8C52d292bD66D3BCEcd8a919ecB9EF88' - assert config.slack_channel == '#ethereum-monitoring' - assert config.slack_token == 'secret' - assert config.relays == ['http://relay1', 'http://relay2'] - assert config.liveness_file == '/tmp/i-am-alive' assert config.network == 'holesky' assert [k.public_key for k in config.watched_keys] == ['0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3'] @@ -62,13 +41,6 @@ def test_filled_config_overriden() -> None: os.environ['eth_watcher_beacon_url'] = 'http://override-beacon/' os.environ['eth_watcher_beacon_timeout_sec'] = '42' - os.environ['eth_watcher_execution_url'] = 'http://override-exec/' - os.environ['eth_watcher_web3signer_url'] = 'http://override-web3signer/' - os.environ['eth_watcher_default_fee_recipient'] = '0x42' - os.environ['eth_watcher_slack_channel'] = '#ethereum-monitoring-override' - os.environ['eth_watcher_slack_token'] = 'secret-override' - os.environ['eth_watcher_relays'] = '["http://overriden-relay-1" ,"http://overriden-relay-2"]' - os.environ['eth_watcher_liveness_file'] = '/tmp/override-liveness-file' os.environ['eth_watcher_network'] = 'sepolia' path = str(Path(assets.__file__).parent / "config.yaml") @@ -76,13 +48,6 @@ def test_filled_config_overriden() -> None: assert config.beacon_url == 'http://override-beacon/' assert config.beacon_timeout_sec == 42 - assert config.execution_url == 'http://override-exec/' - assert config.web3signer_url == 'http://override-web3signer/' - assert config.default_fee_recipient == '0x42' - assert config.slack_channel == '#ethereum-monitoring-override' - assert config.slack_token == 'secret-override' - assert config.relays == ['http://overriden-relay-1' ,'http://overriden-relay-2'] - assert config.liveness_file == '/tmp/override-liveness-file' assert config.network == 'sepolia' assert [k.public_key for k in config.watched_keys] == ['0x832b8286f5d6535fd941c6c4ed8b9b20d214fc6aa726ce4fba1c9dbb4f278132646304f550e557231b6932aa02cf08d3'] From 0fee9f957d047eb521f8e74aecf7d23214d8cea0 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Fri, 21 Jun 2024 10:35:09 +0200 Subject: [PATCH 61/82] feat: rework the documentation of the watcher --- README.md | 276 +++++--------------- eth_validator_watcher/metrics.py | 7 +- eth_validator_watcher/utils.py | 5 +- eth_validator_watcher/watched_validators.py | 10 + 4 files changed, 85 insertions(+), 213 deletions(-) diff --git a/README.md b/README.md index d27a475..d56bdc3 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ -Ethereum Validator Watcher -========================== +# Ethereum Validator Watcher + +**This is a preview of the new version of the Ethereum Validator Watcher.** ![kiln-logo](docs/img/Kiln_Logo-Transparent-Dark.svg) @@ -7,17 +8,14 @@ Ethereum Validator Watcher The code is provided as-is with no warranties. -Youtube video of [Ethereum Validator Watcher talk during EthCC[6]](https://www.youtube.com/watch?v=SkyncLrME1g&t=12s&ab_channel=%5BEthCC%5DLivestream2). +- Youtube video of [Ethereum Validator Watcher talk during EthCC[6]](https://www.youtube.com/watch?v=SkyncLrME1g&t=12s&ab_channel=%5BEthCC%5DLivestream2) +- Youtube video of [Ethereum Validator Watcher talk during EthStaker](https://www.youtube.com/watch?v=JrGz5FROgEg) -Grafana dashboard [configuration file](./grafana_dashboard.json). +# Description -![dashboard](https://github.com/kilnfi/eth-validator-watcher/assets/4943830/c5ea8135-9b5e-4935-b8ca-56a02a9ba447) -![logs](https://github.com/kilnfi/eth-validator-watcher/assets/4943830/12bddcbe-e019-40af-be64-c1edcecc0561) -![metrics](https://github.com/kilnfi/eth-validator-watcher/assets/4943830/60b8fb12-5ad0-4908-8a35-639f1553a249) +**Ethereum Validator Watcher** monitors the Ethereum beacon chain in +real-time and notifies you when any of your validators: -Description ------------ -**Ethereum Validator Watcher** monitors the Ethereum beacon chain in real-time and notifies you when any of your validators: - are going to propose a block in the next two epochs - missed a block proposal at head - missed a block proposal at finalized @@ -27,10 +25,10 @@ Description - proposed a block with the wrong fee recipient - has exited - got slashed -- proposed a block with an unknown relay - did not had ideal source, target or head reward It also exports some general metrics such as: + - your USD assets under management - the total staking market cap - the epoch and slot @@ -43,207 +41,99 @@ It also exports some general metrics such as: - the number of the network active validators - the entry queue duration estimation -Optionally, you can specify the following parameters: -- the path to a file containing the list of public keys to watch, or / and -- a URL to a Web3Signer instance managing your keys to watch. +The Prometheus endpoint is automatically exposed on port 8000. -Pubkeys are dynamically loaded, at each epoch start. -- If you use a pubkeys file, you can change it without having to restart the watcher. -- If you use Web3Signer, a request to Web3Signer is done at every epoch to get the latest set of keys to watch. +## Command line options -Finally, this program exports the following sets of data from: -- Prometheus (you can use this Grafana dashboard to monitor your validators) -- Slack -- logs - -Prometheus server is automatically exposed on port 8000. +``` +Usage: eth-validator-watcher [OPTIONS] -Command line options --------------------- + Run the Ethereum Validator Watcher. +Options: + --config FILE File containing the Ethereum Validator Watcher configuration + file. [default: etc/config.local.yaml] + --help Show this message and exit. ``` -╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ -│ * --beacon-url TEXT URL of beacon node [required] │ -│ --execution-url TEXT URL of execution node │ -│ --pubkeys-file-path FILE File containing the list of public keys to watch │ -│ --web3signer-url TEXT URL to web3signer managing keys to watch │ -│ --fee-recipient TEXT Fee recipient address - --execution-url must be set │ -│ --slack-channel TEXT Slack channel to send alerts - SLACK_TOKEN env var must be set │ -│ --beacon-type [lighthouse|nimbus|old-prysm|old-teku|other] Use this option if connected to a Teku < 23.6.0, Prysm < 4.0.8, Lighthouse or │ -│ Nimbus beacon node. See https://github.com/ConsenSys/teku/issues/7204 for Teku < │ -│ 23.6.0, https://github.com/prysmaticlabs/prysm/issues/11581 for Prysm < 4.0.8, │ -│ https://github.com/sigp/lighthouse/issues/4243 for Lighthouse, │ -│ https://github.com/status-im/nimbus-eth2/issues/5019 and │ -│ https://github.com/status-im/nimbus-eth2/issues/5138 for Nimbus. │ -│ [default: BeaconType.OTHER] │ -│ --relay-url TEXT URL of allow listed relay │ -│ --liveness-file PATH Liveness file │ -│ --help Show this message and exit. │ -╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ -``` -Beacon nodes compatibility --------------------------- +## Beacon Compatibility + Beacon type | Compatibility ------------------|---------------------------------------------------------------------------------------------------------- -Lighthouse | Full with `--beacon-type=lighthouse`. See https://github.com/sigp/lighthouse/issues/4243 for more details. -Prysm `>= 4.0.8` | Full. -Prysm `< 4.0.8 ` | Partial with `--beacon-type=old-prysm` - Rewards computation disabled. See https://github.com/prysmaticlabs/prysm/issues/11581 for more details. -Teku `>= 23.6.0` | Full. You need to activate the [beacon-liveness-tracking-enabled](https://docs.teku.consensys.net/reference/cli#options) flag on your beacon node. -Teku `< 23.6.0 ` | Full with `--beacon-type=old-teku`. See https://github.com/ConsenSys/teku/pull/7212 for more details. You need to activate the [beacon-liveness-tracking-enabled](https://docs.teku.consensys.net/reference/cli#options) flag on your beacon node. -Nimbus | Partial with `--beacon-type=nimbus` - Missed attestations detection and rewards computation disabled. See https://github.com/status-im/nimbus-eth2/issues/5019 and https://github.com/status-im/nimbus-eth2/issues/5138 for more details. +-----------------|------------------ +Lighthouse | Full. +Prysm | Full. +Teku | Not (yet) tested. +Nimbus | Not (yet) tested. Lodestar | Not (yet) tested. -The beacon type is relative to the beacon node connected to the watcher, **not to the beacon node connected to the validator client containing a validator key you want to watch**. -(The watcher is agnostic of the infrastructure mananing validators keys you want to watch.) +The beacon type is relative to the beacon node connected to the +watcher, **not to the beacon node connected to the validator client +containing a validator key you want to watch**. The watcher is +agnostic of the infrastructure mananing validators keys you want to +watch, this means you can run it on an external location if you want +blackbox monitoring. -Command lines examples ----------------------- +## Configuration -Minimal example, connected to Prysm: -``` -eth-validator-watcher --beacon-url http://localhost:3500 -``` +The configuration uses the YAML format: -Example with Lighthouse and with keys to watch retrieved from Web3Signer: -``` -eth-validator-watcher --beacon-url http://localhost:5052 --beacon-type lighthouse --web3signer-url http://localhost:9000 ``` +# Example config file for the Ethereum validator watcher. -Example with Lighthouse, with keys to watch retrieved from a file, and with a specified fee recipient: -``` -eth-validator-watcher --beacon-url http://localhost:5052 --beacon-type lighthouse --execution-url http://localhost:8545 --pubkeys-file-path keys.txt --fee-recipient 0x4675c7e5baafbffbca748158becba61ef3b0a263 -``` +beacon_url: http://localhost:5051/ +beacon_timeout_sec: 90 +network: mainnet -With the following `keys.txt` file: -``` -0x815210c169e598f1800dbda3b2ee146a0178f772c5105722e0673d824535bcab03aa6bc422955264bb201b5ddbb6981d -0x950f77f6cba50c9ad97240a7171cf4506bf86cbed11bb8e2f45a38036e4375c4f5344647e7150c640f308fd9d6de4d59 -0x8adf063f810e2321a1aea258fd3a6ee5560911cee631980e1ef32bd88bf8c3dd5d28724e22a8987bfe411dd731f6dd38 +watched_keys: + - public_key: '0xa1d1ad0714035353258038e964ae9675dc0252ee22cea896825c01458e1807bfad2f9969338798548d9858a571f7425c' + labels: ["vc:validator-1", "region:sbg"] + - public_key: '0x8619c074f403637fdc1f49b77fc295c30214ed3060573a1bfd24caea1f25f7b8e6a9076b7c721076d807003c87956dc1' + labels: ["vc:validator-1", "region:sbg"] + - public_key: '0x91c44564d1e61f7f6e35c330bd931590036d461378ab260b83e77f012a47605a393b5a375bf591466b274dad0b0e8a25' + labels: ["vc:validator-2", "region:rbx"] ``` - `--pubkeys-file-path` and `--fee-recipient` flag allow both `0x` prefixed and non `0x` prefixed ETH1 address / pubkeys. +In this example, we define 3 validator which are running on two +validator clients in different regions. The labels can be anything you +want as long as it follows the 'category:value' format. The breakdown +dashboard uses it to offer per-value comparisons within a +category. You can for instance compare your missed attestations +between region rbx and sbg, or between validator-1 and +validator-2. This comes handy when operating at scale, you can quickly +isolate where an issue comes from if your groups match your infrastructure. -Example with Prysm, with keys to watch retrieved from Web3Signer and with Slack alerting: -``` -export SLACK_TOKEN=xoxb-xxxxxxxxxxxxx-xxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxx -eth-validator-watcher --beacon-url http://localhost:3500 --web3signer-url http://localhost:9000 --slack-channel eth-alerting -``` +Any set is possible, some plausible examples: -Example with Prysm, with keys to watch retrieved from Web3Signer and with Flasbots and UltraSound as allowed relays: -``` -eth-validator-watcher --beacon-url http://localhost:3500 --web3signer-url http://localhost:9000 --relay-url https://0xac6e77dfe25ecd6110b8e780608cce0dab71fdd5ebea22a16c0205200f2f8e2e3ad3b71d3499c54ad14d6c21b41a37ae@boost-relay.flashbots.net --relay-url https://0xa1559ace749633b997cb3fdacffb890aeebdb0f5a3b6aaa7eeeaf1a38af0a8fe88b9e4b1f61f236d2e64d95733327a62@relay.ultrasound.money -``` -Exported Prometheus metrics ---------------------------- - -name | description --------------------------------------------------|------------ -`eth_usd` | ETH/USD conversion rate -`entry_queue_duration_sec` | Entry queue duration in seconds -`our_pending_queued_validators_count` | Our pending queued validators count -`total_pending_queued_validators_count` | Total pending queued validators count -`our_active_validators_count` | Our active validators count -`total_active_validators_count` | Total active validators count -`our_exited_validators_count` | Our exited validators count -`wrong_fee_recipient_proposed_block_count` | Wrong fee recipient proposed block count -`missed_attestations_count` | Missed attestations count -`double_missed_attestations_count` | Double missed attestations count -`missed_block_proposals_head_count` | Missed block proposals on head count -`missed_block_proposals_finalized_count` | Missed block proposals on finalized count -`future_block_proposals_count` | Future block proposals count -`our_slashed_validators_count` | Our slashed validators count -`total_slashed_validators_count` | Total slashed validators count -`suboptimal_attestations_rate` | Suboptimal attestations rate -`keys_count` | Keys count -`bad_relay_count` | Bad relay count -`net_suboptimal_sources_rate` | Network suboptimal sources rate -`net_suboptimal_targets_rate` | Network suboptimal targets rate -`net_suboptimal_heads_rate` | Network suboptimal heads rate -`net_ideal_sources_count` | Network ideal sources count -`net_ideal_targets_count` | Network ideal targets count -`net_ideal_heads_count` | Network ideal heads count -`net_actual_pos_sources_count` | Network actual positive sources count -`net_actual_neg_sources_count` | Network actual negative sources count -`net_actual_pos_targets_count` | Network actual positive targets count -`net_actual_neg_targets_count` | Network actual negative targets count -`net_actual_heads_count` | Network actual heads count -`our_suboptimal_sources_rate` | Our suboptimal sources rate -`our_suboptimal_targets_rate` | Our suboptimal targets rate -`our_suboptimal_heads_rate` | Our suboptimal heads rate -`our_ideal_sources_count` | Our ideal sources count -`our_ideal_targets_count` | Our ideal targets count -`our_ideal_heads_count` | Our ideal heads count -`our_actual_pos_sources_count` | Our actual positive sources count -`our_actual_neg_sources_count` | Our actual negative sources count -`our_actual_pos_targets_count` | Our actual positive targets count -`our_actual_neg_targets_count` | Our actual negative targets count -`our_actual_heads_count` | Our actual heads count - -Installation ------------- +- by beacon instance (i.e: beacon:beacon-1) +- by client version (i.e: prysm:v5.0.3) +- by cluster (i.e: cluster:baremetal-1) +- by operator (i.e: operator:kiln) +- ... + + +## Installation From source: + ``` git clone git@github.com:kilnfi/eth-validator-watcher.git cd eth-validator-watcher pip install . ``` -Docker images -------------- -Docker images (built for AMD64 and ARM64) are available [here](https://github.com/kilnfi/eth-validator-watcher/pkgs/container/eth-validator-watcher). - - -Logs ----- - -Description | Log -------------|---- -A new epoch starts. | ```🎂 Epoch 209904 starts``` -You are going to propose a block in the next two epochs. | ```💍 Our validator 0xa6cdd026 is going to propose a block at slot 6716781 (in 13 slots)``` -Someone [proposed](https://beaconcha.in/slot/6716776) a block. | ```✅ validator 0xb9d2439f proposed block at epoch 209899 - slot 6716776 ✅``` -You [proposed](https://beaconcha.in/slot/6716781) a block. | ```✨ Our validator 0xa6cdd026 proposed block at epoch 209899 - slot 6716781 ✨``` -You proposed a block with the wrong fee recipient. | ```🚩 Our validator 0x00000000 proposed block at epoch 209952 - slot 6718495 with the wrong fee recipient``` -You [did not had](https://github.com/kilnfi/eth-validator-watcher/assets/4943830/666dad82-2f67-432d-97eb-9f99ef6c106a) optimal attestation inclusion. | ```❗ Our validator 0x98a5bad4, 0x8116a5f8, 0xa2fff7bd, 0x87cd0fd3, 0x978ebbdb and 1 more (1.2 %) had not optimal attestation inclusion at slot 6716778``` -Someone [missed](https://beaconcha.in/validator/399279#blocks) a block proposal. | ```💩 validator 0xa3dbc635 missed block at epoch 209894 - slot 6716637 💩``` -You [missed](https://sepolia.beaconcha.in/slot/3454352) a block proposal (head). | ```🔺 Our validator 0xb09d7c4e missed block at head at epoch 107948 - slot 3454352 🔺``` -You [missed](https://sepolia.beaconcha.in/slot/3454352) a block proposal (finalized). | ```❌ Our validator 0xb09d7c4e missed block at finalized at epoch 107948 - slot 3454352 ❌``` -You [missed](https://github.com/kilnfi/eth-validator-watcher/assets/4943830/9bed8b53-5c53-4cf0-818d-066434660004) an attestation. | ```🙁 Our validator 0xa672f362, 0xb5f46214, 0xac81b7f4 and 0 more missed attestation at epoch 209894``` -You [missed](https://github.com/kilnfi/eth-validator-watcher/assets/4943830/74326f4f-d3f5-405d-87ce-9576f9ed79a0) 2 attestations in a row. | ```😱 Our validator 0x8c9bfca1, 0xa68f7c5d and 0 more missed 2 attestations in a row from epoch 209367``` -You [exited](https://beaconcha.in/validator/491565). | ```🚶 Our validator 0xaeb82c90 is exited``` -Someone [got](https://beaconcha.in/validator/647102) slashed. | ```🔪 validator 0xb3a608a7 is slashed``` -You got slashed (you don't want to see this one). | ```🔕 Our validator 0x00000000 is slashed``` -You proposed a block with a non-allowed relay. | ```🟧 Block proposed with unknown builder (may be a locally built block)``` -You did not had ideal source rewards. | ```🚰 Our validator 0x8012aba2, 0x8012cdb1, 0x803f3b39, 0x8054cda1, 0x8055bb56 and 0 more had not ideal rewards on source at epoch 215201``` -You did not had ideal target rewards. | ```🎯 Our validator 0x8000118f, 0x80a238ea, 0x80e5809d, 0x80ec3c2d, 0x80f4487d and 0 more had not ideal rewards on target at epoch 215201``` -You did not had ideal head rewards. | ```🗣️ Our validator 0x8005f5e8, 0x801910e5, 0x80193dd5, 0x801a26e9, 0x80285258 and 0 more had not ideal rewards on head at epoch 215200``` -The chain is not yet started. | ```⏱️ The chain will start in 1 days, 1 hours, 3 minutes and 48 seconds.``` - -If you see this kind of message: -``` -❓ Missed attestations detection is disabled for epoch 238030. -❓ You can ignore this message if the watcher just started less than one epoch ago. Otherwise, please check that you used the correct `--beacon-type`` option (currently set to `other`). -❓ Use `--help` for more details. -``` +We recommend using the Docker images. -If you just started the watcher less than one epoch ago (and especially, if you started the watcher during the few last slots of the epoch), then you can safely ignore this message. -Otherwise, please check you uses the correct `--beacon-type` option. +## Docker images -Slack messages --------------- -If a Slack channel is specified, the slack messages are sent according to the following events: -- When you exited -- When you got slashed -- If fee recipient is specified, when you proposed a block with the wrong fee recipient -- When you missed 2 attestations in a row -- When you missed a block +Docker images (built for AMD64 and ARM64) are available +[here](https://github.com/kilnfi/eth-validator-watcher/pkgs/container/eth-validator-watcher). + +## Developer guide -Developer guide ---------------- We use [Poetry](https://python-poetry.org/) to manage dependencies and packaging. **Installation:** + ``` git clone git@github.com:kilnfi/validator-watcher.git cd validator-watcher @@ -252,37 +142,11 @@ poetry shell # To activate Python virtual environment ``` **Running tests:** -``` -pytest -# With coverage -pytest --cov eth_validator_watcher --cov-report=term-missing ``` - -# Liveness -You can use `--liveness-file ` option to ensure the watcher is live. -If using this option, at the end of every slot, the watcher will simply write `OK` in the specified file. - -**Example of liveness probe usage on Kubernetes** -```yaml -livenessProbe: - periodSeconds: 60 - initialDelaySeconds: 60 - failureThreshold: 1 - exec: - command: - - /usr/bin/python3.11 - - /usr/local/bin/liveness_check.py - - +poetry run pytest ``` -## FAQ -Why `--execution-url` is needed when `--fee-recipient` is used? - -When using external block building (with MEV-boost for example), then the block builder may set its address as a fee recipient. -In such a case, it adds an extra transaction in the block from its address to the proposer's fee recipient. -To check this last transaction, the watcher needs to retrieve the execution block. - ## License [MIT License](LICENSE). diff --git a/eth_validator_watcher/metrics.py b/eth_validator_watcher/metrics.py index 2727fc4..ba3abdb 100644 --- a/eth_validator_watcher/metrics.py +++ b/eth_validator_watcher/metrics.py @@ -130,12 +130,7 @@ def compute_validator_metrics(validators: dict[int, WatchedValidator]) -> dict[s m.future_blocks += v.future_blocks_proposal - # Reset the counters for the next run. - v.proposed_blocks_total = 0 - v.missed_blocks_total = 0 - v.proposed_blocks_finalized_total = 0 - v.missed_blocks_finalized_total = 0 - v.future_blocks_proposal = 0 + v.reset_counters() return metrics diff --git a/eth_validator_watcher/utils.py b/eth_validator_watcher/utils.py index 0b07b2b..c4c9854 100644 --- a/eth_validator_watcher/utils.py +++ b/eth_validator_watcher/utils.py @@ -9,12 +9,15 @@ from .config import WatchedKeyConfig +# Slots at which processing is performed. SLOT_FOR_CONFIG_RELOAD = 15 SLOT_FOR_MISSED_ATTESTATIONS_PROCESS = 16 SLOT_FOR_REWARDS_PROCESS = 17 + +# Default set of existing scopes. LABEL_SCOPE_NETWORK="scope:network" LABEL_SCOPE_WATCHED="scope:watched" -LABEL_SCOPE_UNWATCHED="scope:unwatched" +LABEL_SCOPE_UNWATCHED="scope:all-network" def pct(a: int, b: int, inclusive: bool=False) -> float: diff --git a/eth_validator_watcher/watched_validators.py b/eth_validator_watcher/watched_validators.py index 304892a..ad8f1af 100644 --- a/eth_validator_watcher/watched_validators.py +++ b/eth_validator_watcher/watched_validators.py @@ -126,6 +126,16 @@ def process_liveness(self, liveness: ValidatorsLivenessResponse.Data): self.previous_missed_attestation = self.missed_attestation self.missed_attestation = liveness.is_live != True + def reset_counters(self): + """Reset the counters for the next run. + """ + self.missed_blocks_total = 0 + self.missed_blocks_finalized_total = 0 + self.proposed_blocks_total = 0 + self.proposed_blocks_finalized_total = 0 + self.future_blocks_proposal = 0 + + class WatchedValidators: """Wrapper around watched validators. From 087352e283a05ffc51ef8ea9360fda2f696ebba7 Mon Sep 17 00:00:00 2001 From: "s. rannou" Date: Fri, 21 Jun 2024 11:01:51 +0200 Subject: [PATCH 62/82] feat: add images --- README.md | 20 ++++++++++++++++---- docs/img/grafana_dashboard.png | Bin 512745 -> 0 bytes docs/img/watcher-breakdown.png | Bin 0 -> 2530620 bytes docs/img/watcher-overview.png | Bin 0 -> 1687318 bytes eth_validator_watcher/utils.py | 4 ++-- eth_validator_watcher/watched_validators.py | 8 ++++---- 6 files changed, 22 insertions(+), 10 deletions(-) delete mode 100644 docs/img/grafana_dashboard.png create mode 100644 docs/img/watcher-breakdown.png create mode 100644 docs/img/watcher-overview.png diff --git a/README.md b/README.md index d56bdc3..a8df344 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,14 @@ The code is provided as-is with no warranties. - Youtube video of [Ethereum Validator Watcher talk during EthCC[6]](https://www.youtube.com/watch?v=SkyncLrME1g&t=12s&ab_channel=%5BEthCC%5DLivestream2) - Youtube video of [Ethereum Validator Watcher talk during EthStaker](https://www.youtube.com/watch?v=JrGz5FROgEg) +## Overview Dashboard + +![overview-dashboard](docs/img/watcher-overview.png) + +## Breakdown Dashboard + +![breakdown-dashboard](docs/img/watcher-breakdown.png) + # Description **Ethereum Validator Watcher** monitors the Ethereum beacon chain in @@ -93,14 +101,15 @@ watched_keys: labels: ["vc:validator-2", "region:rbx"] ``` -In this example, we define 3 validator which are running on two -validator clients in different regions. The labels can be anything you +In this example, we define 3 validators which are running on two +validator clients in separate regions. The labels can be anything you want as long as it follows the 'category:value' format. The breakdown dashboard uses it to offer per-value comparisons within a category. You can for instance compare your missed attestations between region rbx and sbg, or between validator-1 and validator-2. This comes handy when operating at scale, you can quickly -isolate where an issue comes from if your groups match your infrastructure. +isolate where an issue comes from if your groups match your +infrastructure. Any set is possible, some plausible examples: @@ -108,8 +117,11 @@ Any set is possible, some plausible examples: - by client version (i.e: prysm:v5.0.3) - by cluster (i.e: cluster:baremetal-1) - by operator (i.e: operator:kiln) -- ... +By default, the watcher exports the `scope:watched` (keys present in +the configuration file), `scope:network` (entire network without the +keys in the configuration file) `scope:all-network` (entire network) +labels. ## Installation diff --git a/docs/img/grafana_dashboard.png b/docs/img/grafana_dashboard.png deleted file mode 100644 index 24207b03602706e8df797b103dd430a1920c8b3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 512745 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

Xy=5lC5ANp~H=C?i;+?K2H{=W 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%0D*8(Ru_nA2wm^(nkupL-P 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�qUo4Z?h6V1^%dYcd7QjcsA)8zz$4$Qu;W}{{ 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%0AJ==w`MIOIunLYp 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 z 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 z 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 z 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

Ntvin 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

B)K(IF%q#gtK*8;kO|u#PNX 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 A1poj5 diff --git a/docs/img/watcher-breakdown.png b/docs/img/watcher-breakdown.png new file mode 100644 index 0000000000000000000000000000000000000000..cc3fcd1324dad075a9a64064d35f64195a912924 GIT binary patch literal 2530620 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 z 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

W~wnXbdjTbahUE4X+} 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�#@jqlh8>SVleHztXraS++2dxeeyXet2usl|Z}p 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⁢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

;!YuQovN$ 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�s^@jrRF!r#1nzntX* zVq8E}fYnoeddJ-11|}*Ku?0KA4}|a{1Wu{EnGU@#+*WVsWMp6ZCQyT+?c5i(xpp`X ze_dAxYDh-2Y)+-8HVf%UnJ`z3JD^9Y2~+1&?(aw{TB+y*pNkVL^38+0In*vzwUe<}|2~6vyVtpE{QQ#2GZ2XeNJ&qBQz9d+n6@c$0kZ>$Jb#<4W`a!Xv? z&)w}Siwi9$Bl0+dT<6u@}8-=EeP?97`j={={tjUL{yr7@*V{&Jh>buinMK zZSCsUEvC`M&ljQsBx$)$YdL54iGRw%{rPK&7TQ|}x2 z{W7IkKEuep$IfP@ft7)^4|`|LnW>+Vdp$38-Y0qy=)Jo-) zv|j9)4+c|EbL%vmtP~MQ3SH;l`EE&VpN|wG8huvh(kKm7RRxi8QmV5auEbPU5@p+| zr#Y57SK1xlWovV4JUre~kx6*kqTT~Vj7n9LVrRW_LUrt0ky%+;V>o1GB3KWjQ;7Eb zPCOfImhofJ{oj^5=0H-PCQ@((_c)J9u73Y_ok;$*oz*j6QrO`5)Bpi$1GhM{|G*M%X{bS@L zUoI+W0ovaRbh7y0pvLfyQI2zkbhd5(ATMl; z3Umo3_1!@g_6@0G2Vj{e#2&`neE!U};#NQzS}hpmqE7Ar`ayZ8e!sX|kT`g0$N!$w z1pAW80FY~lCb9D9M7hg8#5CAub8PUS(Eg10G0UrXc&JRyZR@Jtpw1JsNx+3)rs6K; z`PRz$Cp4mqB)ueDk1`@+Laj7}KoL{%k1tR!g@bo$LE9MDYA(E~Zd?lhac@51*-keP zt0@Aj#@1XTs&vCwox%zl3>Uz&ZLvObAK$;F={pXSt7BUyIt5+ju=@248Sh;i;6~rw zWa)*rDg)u!h1kC7EC}V{-?cPHH5df=V%NQnV<9eAI`qNLed;Fr4lXqD`10j_!->(D(^{<3zZs8^Vj%0Au)n`JObdegstWMiW=de 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/TGI9R4{B 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%0AL^biPG#}z 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