├── .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 |
--------------------------------------------------------------------------------