{"id":29204908,"url":"https://github.com/probe-lab/eth-das-guardian","last_synced_at":"2025-09-05T10:48:45.390Z","repository":{"id":296831660,"uuid":"983494268","full_name":"probe-lab/eth-das-guardian","owner":"probe-lab","description":"CLI to asses the Ethereum PeerDAS column custody of nodes","archived":false,"fork":false,"pushed_at":"2025-08-27T18:04:04.000Z","size":340,"stargazers_count":6,"open_issues_count":6,"forks_count":4,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-28T03:06:21.594Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/probe-lab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-14T13:15:18.000Z","updated_at":"2025-07-31T15:07:00.000Z","dependencies_parsed_at":"2025-06-02T20:18:07.158Z","dependency_job_id":"bad9e2b8-f1e8-455d-90d1-3a97147908d0","html_url":"https://github.com/probe-lab/eth-das-guardian","commit_stats":null,"previous_names":["probe-lab/eth-das-guardian"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/probe-lab/eth-das-guardian","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/probe-lab%2Feth-das-guardian","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/probe-lab%2Feth-das-guardian/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/probe-lab%2Feth-das-guardian/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/probe-lab%2Feth-das-guardian/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/probe-lab","download_url":"https://codeload.github.com/probe-lab/eth-das-guardian/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/probe-lab%2Feth-das-guardian/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273747782,"owners_count":25160651,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-05T02:00:09.113Z","response_time":402,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-07-02T15:37:21.815Z","updated_at":"2025-09-05T10:48:45.377Z","avatar_url":"https://github.com/probe-lab.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Eth DAS Guardian\n\nThe `eth-das-guardian` tool presented in this repo is an experimental, semi-standalone utility for assessing data-column custody in the [PeerDAS](https://eips.ethereum.org/EIPS/eip-7594) context. It logs and debugs all relevant information related to connecting to a remote node and verifying whether it retains and shares the data columns it claims custody of.\n\nIt can extract and present all available information for a given [ENR](https://github.com/ethereum/devp2p/blob/master/enr.md), including:\n- **Relevant ENR Entries**:\n  - `cgc`: Column Custody Group\n  - Computed DataColumn indexes from the Custody Group\n- **Node's Chain Status (v1-v2) and Metadata (v2-v3)**\n- **Libp2p Information**:\n  - UserAgent (typically Client + Version)\n  - Supported protocols\n  - Protocol version\n  - Latency* (RTT for Ethereum's Ping RPC)\n  - Peer ID and MultiAddrs\n- **Summary table** of reported custody\n\n## Supported Networks\n\nThis experimental version of the tool is compatible with existing PeerDAS devnets. It has been tested and confirmed to work with `fusaka-devnet-2`.\n\nMore details available at:\n- EF's [fusaka-devnet-3 dashboard](https://fusaka-devnet-3.ethpandaops.io/)\n\n## PeerDAS Specifications\n\nTo function correctly, the tool adheres to the networking requirements outlined in the PeerDAS specifications:\n- [P2P Interface Specs](https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/p2p-interface.md)\n- [Data Availability Sampling (DAS) Core](https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/das-core.md)\n- [Peer Sampling Specs](https://github.com/ethereum/consensus-specs/blob/dev/specs/fulu/peer-sampling.md)\n\n## Requirements\n- `Go \u003e=1.24`\n- (Recommended) [Just](https://github.com/casey/just)\n- A Beacon API with debugging events enabled (the tool downloads the beacon-state from the node)\n  - Example: use EthPandaOps’ Beacon RPC endpoint listed in the [devnet details](https://fusaka-devnet-3.ethpandaops.io/)\n\n## Installation\n\nWe provide a `Justfile` that simplifies installation and building. Use the following commands:\n```bash\n# To build the tool locally -\u003e binary at ./build/das-guardian\n$ just build\n\n# To install the tool -\u003e binary placed at $GOPATH/bin/das-guardian\n$ just install\n```\n\n## Usage\n\nThe tool exposes a single CLI command. Basic usage:\n```bash\n$ das-guardian --help\n\nNAME:\n   das-guardian - An ethereum DAS custody checker\n\nUSAGE:\n   das-guardian [global options] [command [command options]]\n\nCOMMANDS:\n   scan      Connects and scans a given node for its custody and network status\n   monitor   Connects and monitors a given node for its custody and network status\n   playtime  Run monitor or scan commands on all consensus clients from Dora\n   help, h   Shows a list of commands or help for one command\n\nGLOBAL OPTIONS:\n   --log.level string             Level of the logs (default: \"info\")\n   --libp2p.host string           IP for the Libp2p host (default: \"127.0.0.1\")\n   --libp2p.port int              Port for the libp2p host (default: 9013)\n   --api.endpoint string          The url endpoint of a Beacon API (http://localhost:5052/) (default: \"http://127.0.0.1:5052/\")\n   --api.custom.cl string         Name of a custom CL client that we would like to query from the work-balancer ('lighthouse', 'prysm', 'nimbus')\n   --connection.retries int       Number of retries when connecting the node (default: 3)\n   --connection.timeout duration  Timeout for the connection attempt to the node (default: 30s)\n   --init.timeout duration        Timeout to limit the time it can take the guardian to init itself (default: 30s)\n   --wait.fulu                    The guardian command will wait until fulu hardfork has happened before proceeding to test the custody (default: true)\n   --help, -h                     show help\n```\n\nExample of how to use it:\n```bash\n$ das-guardian --api.endpoint \"https://beacon.fusaka-devnet-2.ethpandaops.io/\" --api.custom.cl \"lighthouse\" scan --scan.key \"enr:-PO4QFAZca5TDfbiiCKouERBRao_oLgy5KCPvbezPfhTacxHWlBqfDgsfsghRLBUH9W8bj08v1jkd64UoUjSaWZx-6UHh2F0dG5ldHOIAAAAAAADAACDY2djgYCGY2xpZW502IpMaWdodGhvdXNljDcuMS4wLWJldGEuMIRldGgykIEAExpwk3VEAAEAAAAAAACCaWSCdjSCaXCEn99xd4NuZmSENp-J94RxdWljgiMpiXNlY3AyNTZrMaEDzVa77_o452OzzqylcK2mA0DREidLotbGonvz3nogDS-Ic3luY25ldHMPg3RjcIIjKIN1ZHCCIyg\"\nINFO[0000] running das-guardian                          beacon-api=\"https://beacon.fusaka-devnet-2.ethpandaops.io/\" beacon-cl-client=lighthouse connection-retries=3 connection-timeout=30s init-timeout=30s libp2p-host=127.0.0.1 libp2p-port=9013 slot-range-number=5 slot-range-slots=\"[]\" slot-range-type=random wait-fulu=true\nINFO[0001] successfull connection to the beacon-api      node-version=Lighthouse/v7.1.0-beta.0-9993fdf/x86_64-linux\nINFO[0001] connected to the beacon API...\nINFO[0001] Beacon node identity                          enr=\"enr:-O24QMLrZGfQAo8_Svw5lG83kn6XTfiUmMP9Zz6yFayAX1sLNKjAegt04iXwWxVsclGtz0E1Ec77mTe6xT0zlJKdgn2BmIdhdHRuZXRziAAABgAAAAAAg2NnY4GAhmNsaWVudNGKTGlnaHRob3VzZYU3LjEuMIRldGgykLYvKw5wk3VE__________-CaWSCdjSCaXCEpFrLSoNuZmSEti8rDoRxdWljgiMpiXNlY3AyNTZrMaEC-HAEr6PikSNtSPQj7LoDBjzA4lRhjKXzLZMkfPa6c1CIc3luY25ldHMNg3RjcIIjKIN1ZHCCIyg\" peer_id=16Uiu2HAmC9UA9nyCov1VAaWPSjycJPLjSLd49SEQWzFpp4EBSa4P\nINFO[0005] fulu is supported\nINFO[0005] dowloaded beacon head-state\nINFO[0005] \t* version:\tfulu\nINFO[0005] \t* finalized:\tfalse\nINFO[0005] \t* optimistic-el:\tfalse\nINFO[0005] \t* validators:\t736\nINFO[0005] local beacon-status\nINFO[0005] \t* head-slot:\t152900\nINFO[0005] \t* fork-digest:\t0xb62f2b0e\nINFO[0005] local beacon-metadata\nINFO[0005] \t* syncnets:\t[0]\nINFO[0005] \t* seq-number:\t0\nINFO[0005] \t* attnets:\t[0 0 0 0 0 0 0 0]\nINFO[0005] das-guardian initialized                      peer-id=16Uiu2HAmVMkBPZgCq4oqzEvTBrfkPwwHK3K8HKixCsheKeRFtEAH\nINFO[0006] connected to remote node...\nINFO[0006] libp2p info...\nINFO[0006] \t* ping_rtt:\t105.853822ms\n...\nINFO[0013] sampling node for...                          columns=128 slots=5\nINFO[0014] req info...                                   das-result=\"128/128 columns\" req-duration=1.063251291s slot=99067\nINFO[0015] req info...                                   das-result=\"0/128 columns\" req-duration=537.631558ms slot=78000\nINFO[0015] req info...                                   das-result=\"128/128 columns\" req-duration=435.80515ms slot=147141\nINFO[0016] req info...                                   das-result=\"0/128 columns\" req-duration=189.822971ms slot=107529\nINFO[0016] req info...                                   das-result=\"128/128 columns\" req-duration=130.425776ms slot=33121\nINFO[0016] node custody sampling done...                 duration=2.35818963s\n```\n\nNote: This tool is a demonstration prototype for debugging CL nodes on devnets. The codebase is experimental — please be gentle regarding its current style and implementation.\n\n## Maintainers\n[@cortze](https://github.com/cortze) from [@probe-lab](https://github.com/probe-lab)\n[@EthPandaOps](https://github.com/ethpandaops) team\n\n## Contributing\nDue to the debugging and research nature of the project, feedback and feature suggestions are very welcome. Feel free to open an issue or submit a pull request.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprobe-lab%2Feth-das-guardian","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprobe-lab%2Feth-das-guardian","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprobe-lab%2Feth-das-guardian/lists"}