├── .github └── workflows │ ├── pages.yaml │ └── vet.yaml ├── CONTRIBUTING.md ├── README.md ├── _config.yaml ├── _layouts └── default.html ├── endpoints ├── ephemery.yaml ├── holesky.yaml ├── hoodi.yaml ├── mainnet.yaml └── sepolia.yaml ├── index.md └── schema.yaml /.github/workflows/pages.yaml: -------------------------------------------------------------------------------- 1 | name: Deploy 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | workflow_dispatch: 8 | 9 | permissions: 10 | contents: read 11 | pages: write 12 | id-token: write 13 | 14 | concurrency: 15 | group: "pages" 16 | cancel-in-progress: true 17 | 18 | jobs: 19 | build: 20 | runs-on: ubuntu-latest 21 | steps: 22 | - name: Checkout 23 | uses: actions/checkout@v4 24 | - name: Setup Pages 25 | uses: actions/configure-pages@v5 26 | - name: Prepare endpoints 27 | run: | 28 | # setup Jekyll data dir 29 | mkdir -p _data 30 | export TARGET=_data/endpoints.yaml 31 | # always want mainnet ordered first 32 | echo "mainnet:" > $TARGET 33 | cat endpoints/mainnet.yaml >> $TARGET 34 | # dump all endpoints into target except for mainnet 35 | for body in endpoints/*.yaml; do filename=$(basename -- ${body%.*}); if [ "$filename" != "mainnet" ]; then echo "" >> $TARGET; echo "${filename}:" >> $TARGET; cat "$body" >> $TARGET; echo "" >> $TARGET; fi; done 36 | - name: Build with Jekyll 37 | uses: actions/jekyll-build-pages@v1 38 | with: 39 | source: ./ 40 | destination: ./_site 41 | - uses: actions/upload-artifact@v4 42 | if: failure() 43 | with: 44 | name: endpoints 45 | path: _data/endpoints.yaml 46 | - name: Upload artifact 47 | uses: actions/upload-pages-artifact@v3 48 | deploy: 49 | environment: 50 | name: github-pages 51 | url: ${{ steps.deployment.outputs.page_url }} 52 | runs-on: ubuntu-latest 53 | needs: build 54 | steps: 55 | - name: Deploy to GitHub Pages 56 | id: deployment 57 | uses: actions/deploy-pages@v4 58 | -------------------------------------------------------------------------------- /.github/workflows/vet.yaml: -------------------------------------------------------------------------------- 1 | name: Vet 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | lint: 10 | name: lint endpoints 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout 14 | uses: actions/checkout@v4 15 | - name: Lint 16 | uses: nrkno/yaml-schema-validator-github-action@v4 17 | with: 18 | schema: schema.yaml 19 | target: endpoints 20 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | If you'd like to add your endpoint to the list please submit a PR. Please only list endpoints that are publicly available with relatively high uptime. 4 | 5 | The structure of this project separates endpoints into their respective network YAML files located in [`endpoints/`](./endpoints/). 6 | 7 | ## Endpoint YAML schema 8 | 9 | Each endpoint list item follows this schema; 10 | ```yaml 11 | endpoint: 12 | # endpoint of the checkpoint sync 13 | endpoint: str() 14 | # list display name for this endpoint 15 | name: str() 16 | # if this endpoint provides entire finalized states 17 | state: bool() 18 | # if this endpoint provides an easy way for verifying the state downloaded from a different state provider 19 | verification: bool() 20 | # list of contacts 21 | contacts: list(include('contact'), min=0, max=5, required=False) 22 | # list of notes 23 | notes: list(include('contact'), min=0, max=5, required=False) 24 | 25 | contact: 26 | # display or full name of contact 27 | name: str() 28 | # URL link to the contact page. eg. twitter/github link 29 | link: str(required=False) 30 | 31 | note: 32 | # note description 33 | name: str() 34 | # URL link to related note. eg. twitter/github link 35 | link: str(required=False) 36 | ``` 37 | 38 | ## Examples 39 | 40 | Some common examples formatted in YAML 41 | 42 | ### Basic 43 | 44 | Adding a mainnet endpoint involves appending endpoint data to [`endpoints/mainnet.yaml`](./endpoints/mainnet.yaml); 45 | ```yaml 46 | - endpoint: https://checkpoint-sync.example.com 47 | name: example.com 48 | state: true 49 | verification: true 50 | ``` 51 | 52 | ### Contacts 53 | 54 | ```yaml 55 | - endpoint: https://checkpoint-sync.example.com 56 | name: example.com 57 | state: true 58 | verification: true 59 | contacts: 60 | - name: "@github" 61 | link: https://twitter.com/github 62 | # mailto link 63 | - name: "John Smith" 64 | link: "mailto:john.smith@example.com" 65 | # no link 66 | - name: "Jane Doe" 67 | ``` 68 | 69 | ### Notes 70 | 71 | ```yaml 72 | - endpoint: https://checkpoint-sync.example.com 73 | name: example.com 74 | state: true 75 | verification: true 76 | notes: 77 | - name: "Status page" 78 | link: https://checkpoint-sync-status.example.com 79 | # no link 80 | - name: "Some important note" 81 | ``` 82 | 83 | ### Verification only endpoint 84 | 85 | ```yaml 86 | - endpoint: https://checkpoint-sync.example.com 87 | name: example.com 88 | state: false 89 | verification: true 90 | ``` 91 | 92 | ### Block history endpoint 93 | 94 | ```yaml 95 | - endpoint: https://checkpoint-sync.example.com 96 | name: example.com 97 | state: true 98 | verification: true 99 | block: true 100 | ``` 101 | 102 | ## Adding a new network 103 | 104 | New networks can be added by simply creating a new file in `endpoints/{network}.yaml` and adding at least one endpoint. 105 | 106 | ## Lint locally 107 | 108 | Requirements; 109 | - Python 3.6+ 110 | - [Yamale](https://github.com/23andMe/Yamale) 111 | 112 | ```bash 113 | # make sure yamale is installed 114 | pip install yamale 115 | 116 | # yamale lint 117 | yamale -s schema.yaml endpoints 118 | ``` 119 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ethereum Beacon Chain checkpoint sync endpoints 2 | 3 | This repository contains a community maintained list of Ethereum Beacon Chain checkpoint sync endpoints. 4 | 5 | > :warning: This list should not be treated as a single source of truth for these endpoints, or the data they provide. It is a community maintained list, and as such, it is possible that some of the endpoints listed here are not up to date, or are not providing the data they claim to be providing. 6 | 7 | Endpoints can provide 3 main functions: 8 | - `state` providers - those who provide entire finalized states 9 | - `verification` providers - those who provide an **easy** way for verifying the state downloaded from a `state` provider. 10 | - `block` providers - those who provide block history up to the weak subjectivity point, allowing clients to start without backfilling over the P2P network 11 | 12 | ----- 13 |

14 | View the list here 15 |

16 | 17 | ----- 18 | 19 | # Contributing 20 | 21 | If you'd like to add your endpoint to the list please read the [documentation](./CONTRIBUTING.md). 22 | -------------------------------------------------------------------------------- /_config.yaml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman 2 | show_downloads: false 3 | title: Ethereum Beacon Chain checkpoint sync endpoints 4 | -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | {% seo %} 8 | 9 | 11 | 12 | 13 | 14 | 15 | {% include head-custom.html %} 16 | 46 | 47 | 48 | 49 | Skip to the content. 50 | 51 | 59 | 60 |
61 | {{ content }} 62 | 63 | 71 |
72 | 97 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /endpoints/ephemery.yaml: -------------------------------------------------------------------------------- 1 | - endpoint: https://checkpointz.bordel.wtf/ 2 | name: Bordel.wtf 3 | state: true 4 | verification: true 5 | contacts: 6 | - name: "@tmiychao" 7 | link: https://twitter.com/TMIYChao 8 | - endpoint: https://ephemery.beaconstate.ethstaker.cc/ 9 | name: EthStaker 10 | state: true 11 | verification: true 12 | contacts: 13 | - name: "@remy_roy" 14 | link: https://twitter.com/remy_roy 15 | -------------------------------------------------------------------------------- /endpoints/holesky.yaml: -------------------------------------------------------------------------------- 1 | - endpoint: https://holesky.beaconstate.info 2 | name: BeaconState.info 3 | state: true 4 | verification: true 5 | - endpoint: https://beaconstate-holesky.chainsafe.io 6 | name: Lodestar (ChainSafe) 7 | state: true 8 | verification: true 9 | contacts: 10 | - name: "lodestar_eth" 11 | link: https://twitter.com/lodestar_eth 12 | - endpoint: https://checkpoint-sync.holesky.ethpandaops.io 13 | name: ethPandaOps 14 | state: true 15 | verification: true 16 | contacts: 17 | - name: "@samcmau" 18 | link: https://twitter.com/samcmau 19 | - name: "@savid" 20 | link: https://twitter.com/savid 21 | - endpoint: https://holesky-checkpoint-sync.stakely.io 22 | name: Stakely 23 | state: true 24 | verification: true 25 | contacts: 26 | - name: "@Stakely_io" 27 | link: https://twitter.com/Stakely_io 28 | -------------------------------------------------------------------------------- /endpoints/hoodi.yaml: -------------------------------------------------------------------------------- 1 | - endpoint: https://hoodi.beaconstate.info 2 | name: BeaconState.info 3 | state: true 4 | verification: true 5 | - endpoint: https://hoodi.beaconstate.ethstaker.cc/ 6 | name: EthStaker 7 | state: true 8 | verification: true 9 | contacts: 10 | - name: "@remy_roy" 11 | link: https://twitter.com/remy_roy 12 | - endpoint: https://hoodi-checkpoint-sync.attestant.io 13 | name: Attestant 14 | state: true 15 | verification: true 16 | contacts: 17 | - name: "@attestantio" 18 | link: https://twitter.com/attestantio 19 | - endpoint: https://hoodi-checkpoint-sync.stakely.io 20 | name: Stakely 21 | state: true 22 | verification: true 23 | contacts: 24 | - name: "@Stakely_io" 25 | link: https://twitter.com/Stakely_io 26 | - endpoint: https://checkpoint-sync.hoodi.ethpandaops.io 27 | name: ethPandaOps 28 | state: true 29 | verification: true 30 | contacts: 31 | - name: "@ethpandaops" 32 | link: https://twitter.com/ethpandaops 33 | - endpoint: https://beaconstate-hoodi.chainsafe.io 34 | name: Lodestar (ChainSafe) 35 | state: true 36 | verification: true 37 | contacts: 38 | - name: "lodestar_eth" 39 | link: https://twitter.com/lodestar_eth -------------------------------------------------------------------------------- /endpoints/mainnet.yaml: -------------------------------------------------------------------------------- 1 | - endpoint: https://sync-mainnet.beaconcha.in 2 | name: beaconcha.in 3 | state: true 4 | verification: true 5 | contacts: 6 | - name: "@beaconcha_in" 7 | link: https://twitter.com/beaconcha_in 8 | - endpoint: https://beaconstate.info 9 | name: BeaconState.info 10 | state: true 11 | verification: true 12 | - endpoint: https://beaconstate.ethstaker.cc 13 | name: EthStaker 14 | state: true 15 | verification: true 16 | contacts: 17 | - name: "@remy_roy" 18 | link: https://twitter.com/remy_roy 19 | - endpoint: https://checkpointz.pietjepuk.net 20 | name: PietjePuk 21 | state: true 22 | verification: true 23 | contacts: 24 | - name: "@pietjepuk2" 25 | link: https://github.com/pietjepuk2 26 | - endpoint: https://mainnet-checkpoint-sync.stakely.io 27 | name: Stakely 28 | state: true 29 | verification: true 30 | contacts: 31 | - name: "@Stakely_io" 32 | link: https://twitter.com/Stakely_io 33 | - endpoint: https://mainnet.checkpoint.sigp.io 34 | name: Sigma Prime 35 | state: true 36 | verification: true 37 | - endpoint: https://mainnet-checkpoint-sync.attestant.io 38 | name: Attestant 39 | state: true 40 | verification: true 41 | contacts: 42 | - name: "@attestantio" 43 | link: https://twitter.com/attestantio 44 | - endpoint: https://beaconstate-mainnet.chainsafe.io 45 | name: Lodestar (ChainSafe) 46 | state: true 47 | verification: true 48 | contacts: 49 | - name: "@lodestar_eth" 50 | link: https://twitter.com/lodestar_eth 51 | - endpoint: http://testing.mainnet.beacon-api.nimbus.team/ 52 | name: Nimbus 53 | state: true 54 | verification: false 55 | block: true 56 | contacts: 57 | - name: "@ethnimbus" 58 | link: https://twitter.com/ethnimbus 59 | -------------------------------------------------------------------------------- /endpoints/sepolia.yaml: -------------------------------------------------------------------------------- 1 | - endpoint: https://sepolia.beaconstate.info 2 | name: BeaconState.info 3 | state: true 4 | verification: true 5 | - endpoint: https://checkpoint-sync.sepolia.ethpandaops.io 6 | name: ethPandaOps 7 | state: true 8 | verification: true 9 | contacts: 10 | - name: "@samcmau" 11 | link: https://twitter.com/samcmau 12 | - name: "@savid" 13 | link: https://twitter.com/savid 14 | - endpoint: https://beaconstate-sepolia.chainsafe.io 15 | name: Lodestar (ChainSafe) 16 | state: true 17 | verification: true 18 | contacts: 19 | - name: "@lodestar_eth" 20 | link: https://twitter.com/lodestar_eth 21 | -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 | This page contains a community maintained list of Ethereum Beacon Chain checkpoint sync endpoints. 6 | 7 | > ⚠️ This list should not be treated as a single source of truth for these endpoints, or the data they provide. It is a community maintained list, and as such, it is possible that some of the endpoints listed here are not up to date, or are not providing the data they claim to be providing. 8 | 9 | Endpoints can provide 3 main functions: 10 | - `state` providers - those who provide entire finalized states 11 | - `verification` providers - those who provide an **easy** way for verifying the state downloaded from a `state` provider. 12 | - `block` providers - those who provide block history up to the weak subjectivity point, allowing clients to start without backfilling over the P2P network 13 | 14 | If you'd like to add your endpoint to the list please read the [documentation]({{ site.github.repository_url }}/blob/main/CONTRIBUTING.md). 15 | 16 | ## Endpoints 17 | Note: pick a random `state` provider, and verify your sync against multiple random `verification` providers for the same network. 18 | 19 | Networks: 20 | {% for network in site.data.endpoints %} 21 | - [{{network[0] | capitalize}}](#{{network[0]}}) 22 | {% endfor %} 23 | 24 | {% for network in site.data.endpoints %} 25 | {% assign endpoints = network[1] | sample:99999 %} 26 | ### {{network[0] | capitalize}} 27 | 28 | | Name | State | Verification | Block | Endpoint | Contact details | Notes | 29 | |:----------|:------|:-------------|:------|:-------------------------------------------|:---------------------------------------|:------|{% for endpoint in endpoints %} 30 | | {{endpoint.name}} | {% if endpoint.state %}✅{% else %}❌{% endif %} | {% if endpoint.verification %}✅{% else %}❌{% endif %} | {% if endpoint.block %}✅{% else %}❌{% endif %} | [{{endpoint.endpoint}}]({{endpoint.endpoint}}) | {% if endpoint.contacts %}{% for contact in endpoint.contacts %}{% if contact.link %}[{{contact.name}}]({{contact.link}}){% else %}{{contact.name}}{% endif %} {% endfor %}{% endif %} | {% if endpoint.notes %}{% for note in endpoint.notes %}{% if note.link %}[{{note.name}}]({{note.link}}){% else %}{{note.name}} {% endif %}{% endfor %}{% endif %} |{% endfor %} 31 | 32 | {% endfor %} 33 | -------------------------------------------------------------------------------- /schema.yaml: -------------------------------------------------------------------------------- 1 | list(include('endpoint')) 2 | --- 3 | endpoint: 4 | endpoint: str(matches='^(http|https)://.*', ignore_case=True) 5 | name: str() 6 | state: bool() 7 | verification: bool() 8 | block: bool(required=False) 9 | contacts: list(include('contact'), min=0, max=5, required=False) 10 | notes: list(include('contact'), min=0, max=5, required=False) 11 | 12 | contact: 13 | name: str() 14 | link: str(required=False) 15 | 16 | note: 17 | name: str() 18 | link: str(required=False) 19 | --------------------------------------------------------------------------------