Skip to content

Commit 4e0b5a6

Browse files
authored
Merge branch 'main' into bapp-example-page
2 parents a16fbde + e872771 commit 4e0b5a6

32 files changed

+446
-159
lines changed

.github/renovate.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"extends": [
3+
"github>ssvlabs/shared-configs//renovate/renovate.json"
4+
]
5+
}

docs/based-applications/user-guides/create-strategy.md

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,34 @@ This page will display a list of the Strategies you already created.
2323

2424
Once you clicked on "Create Strategy" you will see a list of available bApps you can choose from.
2525

26-
In this example, we will skip this step and choose "I'll do it later" on the bottom of the page.
26+
In this example, we will choose MNT-Receiver bApp by clicking "Select" on the right side of the list.
2727

2828
<div style={{ textAlign: 'center' }}>
2929
<img src="/img/create-strategy-2.png" alt="" />
3030
</div>
3131

32-
## 3. Set Fee and Obligations
32+
## 3. Set Obligations
3333

34-
You will be prompted to set the Obligations and the Fees for your strategy. If you did not choose any bApp on the previous step, the Obligations step will be skipped and you will go to the "Set Fee" stage.
34+
You will be prompted to set the Obligations and add Data for your strategy. If you did not choose any bApp on the previous step, the Obligations step will be skipped and you will go to the "Set Fee" stage.
3535

36-
Enter an amount for your Fee, and click the Continue button.
36+
- `Obligations` is % of the strategy to be obligated to chosen bApp. In the example on screenshot below, 30% of the strategy's MNT balance will be obligated to the bApp.
37+
You can later update your obligations by modifying existing ones or adding a new token obligation.
3738

38-
<div style={{ textAlign: 'center', width: '60%', margin: '0 auto' }}>
39+
- `Add Data` is an optional field for off-chain information required by some bApps for participation. Please check this bApp’s documentation [before opting-in](../developers/get-started/#4-opting-in).
40+
41+
<div style={{ textAlign: 'center' }}>
42+
<img src="/img/create-strategy-7.png" alt="" />
43+
</div>
44+
45+
## 4. Set Fee
46+
47+
You can choose the fee rate on bApp rewards. Enter an amount for your Fee, and click the Continue button.
48+
49+
<div style={{ textAlign: 'center', width: '100%', margin: '0 auto' }}>
3950
<img src="/img/create-strategy-3.png" alt="" />
4051
</div>
4152

42-
## 4. Provide Metadata
53+
## 5. Provide Metadata
4354

4455
Metadata for your Strategy and your Account will have to be set with `.json` files.
4556

@@ -67,7 +78,7 @@ Once you provided URI to those files, you will see that information on the page.
6778

6879
After you verified the information, click on Continue.
6980

70-
## 5. Sign transactions
81+
## 6. Sign transactions
7182

7283
To create your Strategy you will need to sign 2 transactions.
7384

@@ -84,7 +95,7 @@ After the first one is completed, another pop-up will appear to sign Registratio
8495
</div>
8596

8697

87-
## 6. Check the created Strategy
98+
## 7. Check the created Strategy
8899

89100
Once both of the transactions are completed, you will be redirected to the page of your newly created Strategy.
90101

docs/developers/tools/ssv-dkg-client/ceremony-output-summary.md

Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,89 @@ ceremony-[timestamp]
2424
```
2525
### Files:
2626
* `deposit_data.json` - this file contains the deposit data necessary to perform the transaction on the Deposit contract and activate the validator on the Beacon layer
27-
* `keyshares.json` - this file contains the keyshares necessary to register the validator on the ssv.network
28-
* `proof.json` - contains the signed proofs that a DKG client participated in a DKG ceremony, generating key shares for a certain owner. This file is crucial for [resharing your validator to a different set of operators](change-operator-set-and-reshare-validator-key-shares.md), or to [regenerate the signature portion of key shares](update-owner-nonce-in-key-shares.md) in the future.
27+
* [`keyshares.json`](#keyshares) - this file contains the keyshares necessary to register the validator on the ssv.network
28+
* [`proof.json`](#proofs) - contains the signed proofs that a DKG client participated in a DKG ceremony, generating key shares for a certain owner. This file is crucial for [resharing your validator to a different set of operators](change-operator-set-and-reshare-validator-key-shares.md), or to [regenerate the signature portion of key shares](update-owner-nonce-in-key-shares.md) in the future.
29+
30+
### Proofs
31+
#### An example of `proofs.json` structure:
32+
```json
33+
[
34+
{
35+
"proof": {
36+
"validator": "VALIDATOR_PUBKEY",
37+
"encrypted_share": "ENCRYPTED_SHARE_FOR_I-TH_OPERATOR_IN_CEREMONY",
38+
"share_pub": "PUB_KEY_OF_OPERATOR_THAT_ENCRYPTED_THE_SHARE",
39+
"owner": "OWNER_ADDRESS_USED_IN_CEREMONY"
40+
},
41+
"signature": "CONTENT_OF_PROOF_SIGNED_BY_OPERATOR_PRIVATE_KEY"
42+
},
43+
{
44+
"proof": {...},
45+
"signature": "..."
46+
},
47+
...
48+
]
49+
```
50+
#### Details about the structure:
51+
- Each validator will have X proofs, where X is the number of operators in the cluster
52+
- X proofs of a validator are in an array `[]`
53+
- One file can contain proofs for multiple validators, by having nested arrays `[[],[],[]]`
54+
- Each proof has 4 parameters:
55+
- `validator` - validator's public key, not encrypted
56+
- `encrypted_share`- validator share for i-th operator, encrypted by operator's private key
57+
- `share_pub` - Public key of i-th operator, not encrypted
58+
- `owner` - Address of validator owner, not encrypted
59+
- Last parameter `signature` is the content of `proof` signed by private key of i-th operator.
60+
61+
#### How `proofs` secure the ceremony for both parties:
62+
- Owner/initiator can't change their owner address, because the address is part of proof's content and this is signed by operator's private key.
63+
- Operator signs the proof with their private key and the proof itself has their public key which can be used to verify the signature.
64+
65+
### Keyshares
66+
#### An example of `keyshares.json` structure:
67+
```json
68+
{
69+
"version": "v1.1.0",
70+
"createdAt": "2025-05-14T10:23:43.794Z",
71+
"shares": [
72+
{
73+
"data": {
74+
"ownerNonce": 0,
75+
"ownerAddress": "OWNER_ADDRESS",
76+
"publicKey": "VALIDATOR_PUBKEY",
77+
"operators": [
78+
{
79+
"id": 1,
80+
"operatorKey": "OPERATOR_PUBKEY"
81+
},
82+
{...},
83+
{...},
84+
{...}
85+
]
86+
},
87+
"payload": {
88+
"publicKey": "VALIDATOR_PUBKEY",
89+
"operatorIds": [1,2,3,4],
90+
"sharesData": "ENCRYPTED_SHARES_DATA"
91+
}
92+
}
93+
]
94+
}
95+
```
96+
97+
#### Details about `sharesData` field
98+
Below is an example of `sharesData` from a Hoodi validator with 4 operators. Each segment is highlighted with color:
99+
100+
<div style={{ textAlign: 'center', width: '100%', margin: '0 auto' }}>
101+
<img src="/img/sharesData.png" alt="" />
102+
</div>
103+
104+
#### Explanation of each segment:
105+
- <span style={{ color: 'black', backgroundColor: '#d4d4d4', fontWeight: 'bold' }}>Signature</span> - First 192 characters (excluding `0x`) is a serialized BLS signed message ([read more about SSZ here](https://ethereum.org/en/developers/docs/data-structures-and-encoding/ssz/)). The message itself is `ownerAddress:ownerNonce`, it's signed by the validator private key and consequently can be verified using validator's `publicKey`.
106+
- <span style={{ color: 'black', backgroundColor: '#bad6a7', fontWeight: 'bold' }}>Share</span><span style={{ color: 'black', backgroundColor: '#fbe6a2', fontWeight: 'bold' }}>s' pu</span><span style={{ color: 'black', backgroundColor: '#de9d9b', fontWeight: 'bold' }}>blic </span><span style={{ color: 'black', backgroundColor: '#aac1f0', fontWeight: 'bold' }}>keys</span> - An array of concatenated BLS public keys. Each element is a public share of a validator's key and is 96 characters long. The number of shares depends on the number of chosen operators.
107+
- <span style={{ color: 'black', backgroundColor: '#dce9d5', fontWeight: 'bold' }}>Encr</span><span style={{ color: 'black', backgroundColor: '#fcf5d9', fontWeight: 'bold' }}>ypte</span><span style={{ color: 'black', backgroundColor: '#edcece', fontWeight: 'bold' }}>d sh</span><span style={{ color: 'black', backgroundColor: '#d5e0f5', fontWeight: 'bold' }}>ares</span> - An array of concatenated BLS encrypted keys. Each element is a private share of a validator's key and is 512 characters long. The number of shares depends on the number of chosen operators. Shares are encrypted with each operator's public key and can only be decrypted with the respective private key.
108+
109+
**If you want to learn more about keyshare verification**, you can dissect [verify-keyshare repository on GitHub](https://github.com/RaekwonIII/verify-keyshares):
110+
- `validateSingleShares` function in `ssv-keys.ts` does the signature verification.
111+
- `buildSharesFromBytes` function breaks down each operators' keyshare.
112+
- `areKeysharesValid` function then checks the signature and operators' keyshares agains the validator public key.

docs/operators/operator-node/node-setup/README.md

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -114,10 +114,11 @@ Git is needed to download the SSV Node stack on your machine.
114114

115115
#### 4. Adjust Firewall
116116

117-
Make sure to expose the ports on your SSV node machine's firewall, otherwise your node won't be able to run correctly. The default ports are :
117+
Make sure to expose the ports on your SSV node machine's firewall, otherwise your node won't be able to run correctly. The default ports are:
118118
- P2P - **12001 UDP** and **13001 TCP**
119119
- Metrics - **15000 TCP**
120120
- Health endpoint - **16000 TCP**
121+
- DKG port - **3030 TCP**
121122

122123
If you don't want to use the default ports, they can be changed on the next step.
123124

@@ -143,21 +144,31 @@ Edit the `ssv.env` file and adjust the settings to your needs. The minimum you n
143144
* `BEACON_NODE_ADDR` - HTTP address of the Beacon node (e.g. `http://1.2.3.4:5052`)
144145
* `ETH_1_ADDR` - WebSocket address of the Execution node (e.g. `ws://1.2.3.4:8546`)
145146
* `NETWORK` - The network you are running on (`mainnet`, `hoodi`)
146-
:::info
147+
148+
All existing settings are listed on the [Configuration Reference page](./node-configuration-reference.md).
149+
:::info Multiple Endpoints
147150
Both `BEACON_NODE_ADDR` and `ETH_1_ADDR` support multiple endpoints. Separate them with `;`.
148151

149152
Example: `BEACON_NODE_ADDR=http://1.2.3.4:5052;http://1.2.3.4:5053`
150153
:::
151-
***
152-
If you already have encrypted key and password files:
154+
155+
### Password and private key
156+
On the first start the Node will generate a random `password` and encrypted `private_key` files. You can find the files under `~/ssv-stack/ssv-node-data` directory.&#x20;
157+
158+
**If you already have encrypted key and password files**:
153159
* Copy/move them to `/ssv-stack/ssv-node-data`
154160
* Edit the environment variables to the correct file names, e.g.:
155161
* `PRIVATE_KEY_FILE=/data/encrypted_private_key.json`
156162
* `PASSWORD_FILE=/data/password`
157163

158164
**If this is done incorrectly**, new keys will be automatically generated, and you will see a message in the console indicating this.
159165

160-
All existing settings are listed on the [Configuration Reference page](./node-configuration-reference.md).
166+
167+
:::info Backup your files
168+
Both password and private key are needed to run SSV and DKG Nodes.
169+
170+
**Backup those files** on a separate device, if any of the two are lost — you will lose access to your operator without a chance to recover.
171+
:::
161172

162173
### Custom ports
163174

@@ -171,24 +182,20 @@ Changes to those files will be applied after a restart of the node (_if you alre
171182
## Start the Node
172183

173184
To start your node use the following command
174-
175185
```bash
176186
docker compose up
177187
```
178188

179189
Or you can start it in the background, so there won't be logs in your CLI
180-
181190
```bash
182191
docker compose up -d
183192
```
184193

185-
:::info Backup your files
186-
On the first start the Node will generate a random `password` and encrypted `private_key` files.&#x20;
194+
## Start DKG Node
195+
You can also run the stack with DKG, simplifying the setup process.
187196

188-
Both files are needed to run SSV Node and DKG Node. You can find them under `~/ssv-stack/ssv-node-data` directory.&#x20;
197+
The instructions are on the ["Enablind DKG" section](./enabling-dkg/start-dkg-node/README.md).
189198

190-
**Backup those files** on a separate device, if any of the two are lost — you will lose access to your operator without a chance to recover.
191-
:::
192199

193200
## Other setup options
194201

docs/operators/operator-node/node-setup/best-practices.md

Lines changed: 54 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ sidebar_position: 3
77

88
This guide outlines key recommendations to ensure the best Performance and Correctness of your node. The guide will be updated as we get new information.
99

10-
The page is divided into three parts:
11-
- [**Introduction**](#introduction) - understanding the Performance, Correctness, and their key factors.
12-
- [**Major impact**](#major-impact) - vital tips, more obvious.
13-
- [**Minor impact**](#minor-impact) - fine-tuning tips, nice-to-have, less obvious.
10+
The page is divided into four parts:
11+
- [**Introduction**](#introduction) - Understanding the Performance, Correctness, and their key factors.
12+
- [**SSV-specific**](#ssv-specific) - Features of SSV that will improve Performance or Correctness.
13+
- [**Major impact**](#major-impact) - Vital tips, more obvious.
14+
- [**Minor impact**](#minor-impact) - Fine-tuning tips, nice-to-have, less obvious.
1415

1516

1617
## **Introduction**
@@ -22,6 +23,52 @@ Several key factors influence this:
2223
- **Network Throughput & Latency:** Minimal network delay is critical, especially for production setups.
2324
- **Hardware Resources:** Adequate CPU, sufficient RAM, and fast, reliable storage are necessary.
2425

26+
## **SSV-specific**
27+
28+
#### Failover for EL and CL clients
29+
```yaml
30+
eth2:
31+
# HTTP URL of the Beacon node to connect to.
32+
BeaconNodeAddr: http://example.url:5052;http://example.url:5053
33+
34+
eth1:
35+
# WebSocket URL of the Execution node to connect to.
36+
ETH1Addr: ws://example.url:8546/ws;ws://example.url:8547/ws
37+
```
38+
- When the first node goes offline or out of sync, SSV will switch to the next endpoint.
39+
- Endpoints should be set in the order you want them to be used. The first node will be the primary one.
40+
- Failover works in round-robin way, so once SSV circled through all of the endpoints it will start from the first one again.
41+
- When SSV node restarts it will always start with the first endpoint from the list.
42+
43+
44+
#### Weighted Attestation Data
45+
```yaml
46+
eth2:
47+
WithWeightedAttestationData: true # Enables WAD
48+
```
49+
- The feature only works with 2+ CL endpoints (`BeaconNodeAddr`) configured.
50+
- Improves attestation accuracy by scoring responses from multiple Beacon nodes based on epoch and slot proximity. Adds slight latency to duties but includes safeguards (timeouts, retries).
51+
52+
#### Parallel Data Submission
53+
```yaml
54+
eth2:
55+
WithParallelSubmissions: true # Sends duties to all nodes concurrently
56+
```
57+
- The feature only works with 2+ CL endpoints (`BeaconNodeAddr`) configured.
58+
- SSV will submit duty data to all Beacon nodes in parallel. This built-in configuration ensures high availability and improves performance.
59+
60+
61+
#### Doppelganger Protection
62+
```yaml
63+
EnableDoppelgangerProtection: true # Enables Doppelganger Protection
64+
```
65+
- Doppelganger Protection (DG) checks if the managed validators are attesting elsewhere at the moment of SSV node start. That prevents double signature which is a slashable event.
66+
- SSV with DG enabled will be offline for the first 3 epochs after the node start.
67+
- If enough nodes in the cluster have DG enabled and are online - a restarted node will not wait for 3 epochs. Node can identify that there's a DG quorum going on and will join it. This process is almost as quick as restart of a node without DG.
68+
- If you manage all nodes in the cluster — it is recommended to restart one by one. Otherwise, it will take 3 epochs to do the DG checks.
69+
- To learn more technical details please refer to [our documentation page on GitHub](https://github.com/ssvlabs/ssv/blob/v2.3.0/doppelganger/README.md).
70+
71+
2572
## **Major impact**
2673
High‑priority practices that ensure reliable, on‑time duty submissions. Might sound obvious, but are often overlooked.
2774

@@ -32,7 +79,7 @@ Most of hardware-related suggestions below are for Execution (EL) and Consensus
3279
### **For Home Setups**
3380
- **Hardware:** Usual setup has 4- to 8-core CPU (focus on single-thread performance) and 32GB RAM.
3481
- **Disk:** NVMe SSDs are strongly recommended. If you're unsure with filesystem to use, stick to `ext4`, as it is performant and the easiest to maintain.
35-
- **Reliability:** Use a UPS and ensure the machine is well-ventilated. Sudden power loss or thermal throttling can cause downtime or result in missed duties
82+
- **Reliability:** Use a UPS and ensure the machine is well-ventilated. Sudden power loss or thermal throttling can cause downtime or result in missed duties.
3683
- **Internet Connectivity:** Ensure your ISP doesn't impose strict data caps. Choose a plan with at least 10 Mbps upload speed, but latency and reliability make the difference.
3784
- **[Follow EthStaker hardware section](https://ethstaker.org/staking-hardware)** as their guides are focused on running Execution and Consensus nodes.
3885

@@ -62,8 +109,8 @@ Ensure your hardware meets or exceeds [SSV recommended specifications](./hardwar
62109
Ensure all required ports are open and correctly configured on your setup.
63110

64111
**Critical Ports:**
65-
- **SSV P2P:** Typically 12001 UDP and 13001 TCP (or as specified in your configuration)
66-
- **Execution P2P:** Typically 30303 TCP and UDP (for Geth and Nethermind)
112+
- **SSV P2P:** Typically 12001 UDP and 13001 TCP (or as specified in your configuration).
113+
- **Execution P2P:** Typically 30303 TCP and UDP (for Geth and Nethermind).
67114
- **Execution RPC:** HTTP 8545 and WS 8546 (for Geth and Nethermind), **open only to SSV Node!**.
68115
- **Consensus P2P:** Depends on your client, make sure to follow your client's documentation to open the correct ports.
69116
- **Consensus RPC:** Depends on your client (e.g. 3500 for Prysm, 5052 for Lighthouse), **open only to SSV Node!**.
@@ -84,9 +131,6 @@ Location of your clients plays a direct role in performance. Co-hosting Executio
84131

85132
### Network Throughput and Latency
86133

87-
**Recommendation:**
88-
Optimize your overall network performance by implementing the following best practices:
89-
90134
**Minimizing Intermediate Layers**
91135
- Reduce the number of intermediate hops (such as redundant routers, proxies, or firewalls) between your nodes and connected services.
92136
- Simplify your firewall configuration by using minimal, direct rule sets (e.g., UFW with straightforward rules) to avoid delays.
@@ -145,36 +189,6 @@ Keep your clients updated, while prioritizing stability over following every upg
145189
**TCP Congestion Control**
146190
- Set your TCP congestion control to BBR by [following this guide](https://www.cyberciti.biz/cloud-computing/increase-your-linux-server-internet-speed-with-tcp-bbr-congestion-control/), if supported by your kernel version.
147191

148-
### SSV-Specific
149-
150-
**Failover for EL and CL clients:**
151-
152-
```yaml
153-
eth2:
154-
# HTTP URL of the Beacon node to connect to.
155-
BeaconNodeAddr: http://example.url:5052;http://example.url:5053
156-
157-
eth1:
158-
# WebSocket URL of the Eth1 node to connect to.
159-
ETH1Addr: ws://example.url:8546/ws;ws://example.url:8547/ws
160-
```
161-
162-
**Weighted Attestation Data**
163-
- The feature only works with 2+ CL endpoints configured
164-
- Improves attestation accuracy by scoring responses from multiple Beacon nodes based on epoch and slot proximity. Adds slight latency to duties but includes safeguards (timeouts, retries).
165-
```yaml
166-
eth2:
167-
WithWeightedAttestationData: true # Enables WAD
168-
```
169-
170-
**Parallel Data Submission**
171-
- The feature only works with 2+ CL endpoints (`BeaconNodeAddr`) configured
172-
- Take advantage of the SSV client's native ability to submit duty data in parallel. This built-in configuration helps ensure high availability and improve performance:
173-
```yaml
174-
eth2:
175-
WithParallelSubmissions: true # Sends duties to all nodes concurrently
176-
```
177-
178192
### Containerization Trade-offs
179193

180194
**Recommendation:**

0 commit comments

Comments
 (0)