Skip to content

Commit 0ed1c62

Browse files
authored
EigenDA V2 Blazar (0.9.0) (#165)
1 parent 35b7295 commit 0ed1c62

File tree

9 files changed

+1101
-26
lines changed

9 files changed

+1101
-26
lines changed

holesky/.env.example

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
MAIN_SERVICE_IMAGE=ghcr.io/layr-labs/eigenda/opr-node:0.9.0-rc.5
1+
MAIN_SERVICE_IMAGE=ghcr.io/layr-labs/eigenda/opr-node:0.9.0
22
NETWORK_NAME=eigenda-network
33
MAIN_SERVICE_NAME=eigenda-native-node
44

@@ -35,7 +35,6 @@ NODE_INTERNAL_RETRIEVAL_PORT=${NODE_RETRIEVAL_PORT}
3535
NODE_INTERNAL_V2_DISPERSAL_PORT=${NODE_V2_DISPERSAL_PORT}
3636
NODE_INTERNAL_V2_RETRIEVAL_PORT=${NODE_V2_RETRIEVAL_PORT}
3737

38-
3938
# Reachability Check
4039
NODE_REACHABILITY_POLL_INTERVAL=60
4140
NODE_DATAAPI_URL=https://dataapi-holesky.eigenda.xyz

holesky/README.md

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ NODE_INTERNAL_V2_RETRIEVAL_PORT=${NODE_V2_RETRIEVAL_PORT}
2020

2121
### 2. Update `MAIN_SERVICE_IMAGE`
2222
```
23-
MAIN_SERVICE_IMAGE=ghcr.io/layr-labs/eigenda/opr-node:0.9.0-rc.5
23+
MAIN_SERVICE_IMAGE=ghcr.io/layr-labs/eigenda/opr-node:0.9.0
2424
```
2525

2626
### 3. Update socket registration
@@ -81,3 +81,34 @@ This port is intended for Nginx reverse proxy use. It is not required if the ope
8181
### `EIGENDA_INTERNAL_V2_RETRIEVAL_PORT`
8282
This port is intended for Nginx reverse proxy use. It is not required if the operator is not using a reverse proxy.
8383

84+
85+
## Advanced - Multi drive support for V2 LittDB
86+
87+
LittDB is capable of partitioning the chunks DB across multiple drives. See https://github.com/Layr-Labs/eigenda/blob/master/node/database-paths.md for more details.
88+
89+
### Example .env that defines 2 littDB partitions
90+
```
91+
NODE_LITT_DB_STORAGE_HOST_PATH_1=${NODE_DB_PATH_HOST}/chunk_v2_litt_1
92+
NODE_LITT_DB_STORAGE_HOST_PATH_2=${NODE_DB_PATH_HOST}/chunk_v2_litt_2
93+
NODE_LITT_DB_STORAGE_PATHS=/data/operator/db/chunk_v2_litt_1,/data/operator/db/chunk_v2_litt_2
94+
```
95+
The `NODE_LITT_DB_STORAGE_HOST_PATH_X` should map to a separately mounted drive folder for each partition.
96+
The `NODE_LITT_DB_STORAGE_PATHS` needs to map to the docker volume mounts defined in `docker-compose.yaml`
97+
#### Example docker-compose volume mounts
98+
```
99+
volumes:
100+
- "${NODE_ECDSA_KEY_FILE_HOST}:/app/operator_keys/ecdsa_key.json:readonly"
101+
- "${NODE_BLS_KEY_FILE_HOST}:/app/operator_keys/bls_key.json:readonly"
102+
- "${NODE_G1_PATH_HOST}:/app/g1.point:readonly"
103+
- "${NODE_G2_PATH_HOST}:/app/g2.point.powerOf2:readonly"
104+
- "${NODE_CACHE_PATH_HOST}:/app/cache:rw"
105+
- "${NODE_LOG_PATH_HOST}:/app/logs:rw"
106+
- "${NODE_DB_PATH_HOST}:/data/operator/db:rw"
107+
- "${NODE_LITT_DB_STORAGE_HOST_PATH_1}:/data/operator/db/chunk_v2_litt_1:rw"
108+
- "${NODE_LITT_DB_STORAGE_HOST_PATH_2}:/data/operator/db/chunk_v2_litt_2:rw"
109+
```
110+
#### Example node output after loading both partitions
111+
```
112+
eigenda-native-node | Jun 2 18:11:47.430 INF node/validator_store.go:108 Using littDB at paths /data/operator/db/chunk_v2_litt_1, /data/operator/db/chunk_v2_litt_2
113+
eigenda-native-node | Jun 2 18:11:47.430 INF littbuilder/db_impl.go:118 LittDB started, current data size: 0
114+
eigenda-native-node | Jun 2 18:11:47.430 INF littbuilder/db_impl.go:169 creating table chunks

holesky/docker-compose.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ services:
3838
- "${NODE_CACHE_PATH_HOST}:/app/cache:rw"
3939
- "${NODE_LOG_PATH_HOST}:/app/logs:rw"
4040
- "${NODE_DB_PATH_HOST}:/data/operator/db:rw"
41+
# TODO: Uncomment and update if using remote BLS signer https://github.com/Layr-Labs/cerberus
4142
# - "${NODE_BLS_SIGNER_CERT_FILE_HOST}:/app/cerberus/cerberus.crt:readonly"
4243
restart: unless-stopped
4344
networks:

holesky/run.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
. ./.env
55

6-
node_plugin_image="ghcr.io/layr-labs/eigenda/opr-nodeplugin:0.9.0-rc.5"
6+
node_plugin_image="ghcr.io/layr-labs/eigenda/opr-nodeplugin:0.9.0"
77

88
# Check if V2 ports are defined
99
if [ -z "$NODE_V2_DISPERSAL_PORT" ]; then
@@ -83,15 +83,15 @@ listQuorums() {
8383
}
8484

8585
updateSocket() {
86-
# we have to pass a dummy quorum-id-list as it is required by the plugin
87-
echo "You are about to update your socket to: $socket"
86+
echo "You are about to update your socket registration to: $socket"
8887
echo "Confirm? [Y/n] "
8988
read -r answer
9089
if [ "$answer" = "n" ] || [ "$answer" = "N" ]; then
9190
echo "Operation cancelled"
9291
exit 1
9392
fi
9493

94+
# we have to pass a dummy quorum-id-list as it is required by the plugin
9595
docker run --env-file .env \
9696
--rm \
9797
--volume "${NODE_ECDSA_KEY_FILE_HOST}":/app/operator_keys/ecdsa_key.json \

mainnet/.env.example

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
MAIN_SERVICE_IMAGE=ghcr.io/layr-labs/eigenda/opr-node:0.8.6
1+
MAIN_SERVICE_IMAGE=ghcr.io/layr-labs/eigenda/opr-node:0.9.0
22
NETWORK_NAME=eigenda-network
33
MAIN_SERVICE_NAME=eigenda-native-node
44

@@ -102,6 +102,13 @@ NODE_CACHE_PATH_HOST=${USER_HOME}/eigenda-operator-setup/resources/cache
102102
# TODO: Operators need to update this to their own keys
103103
NODE_ECDSA_KEY_FILE_HOST=${EIGENLAYER_HOME}/operator_keys/opr.ecdsa.key.json
104104
NODE_BLS_KEY_FILE_HOST=${EIGENLAYER_HOME}/operator_keys/opr.bls.key.json
105+
# TODO: Uncomment and update if using remote BLS signer https://github.com/Layr-Labs/cerberus
106+
#NODE_BLS_SIGNER_CERT_FILE=/app/cerberus/cerberus.crt # DO NOT CHANGE THIS
107+
#NODE_BLS_REMOTE_SIGNER_ENABLED=true
108+
#NODE_BLS_REMOTE_SIGNER_URL=<host:port>
109+
#NODE_BLS_SIGNER_API_KEY=<api key for remote signer>
110+
#NODE_BLS_PUBLIC_KEY_HEX=<public key registered with remote signer>
111+
#NODE_BLS_SIGNER_CERT_FILE_HOST=<path to cert file on host>
105112

106113
# TODO: The ip provider service used to obtain a node's public IP [seeip (default), ipify)
107114
NODE_PUBLIC_IP_PROVIDER=seeip

mainnet/README.md

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,114 @@
11
## Mainnet
22

3-
Head over to our [EigenDA operator guides](https://docs.eigenlayer.xyz/eigenda/operator-guides/overview) for installation instructions and more details.
3+
Head over to our [EigenDA operator guides](https://docs.eigenlayer.xyz/eigenda/operator-guides/overview) for installation instructions and more details.
4+
5+
## Blazar (EigenDA V2) Migration
6+
Operators running node version `<=v0.8.6` will need to define new v2 specific environment variables, expose 2 new ports, and update their socket registration as part of the migration to v2.
7+
8+
## Migration Steps
9+
### 1. Update `.env` with v2 specific environment variables
10+
```
11+
NODE_V2_RUNTIME_MODE=v1-and-v2
12+
13+
NODE_V2_DISPERSAL_PORT=32006
14+
NODE_V2_RETRIEVAL_PORT=32007
15+
16+
# Internal ports for Nginx reverse proxy
17+
NODE_INTERNAL_V2_DISPERSAL_PORT=${NODE_V2_DISPERSAL_PORT}
18+
NODE_INTERNAL_V2_RETRIEVAL_PORT=${NODE_V2_RETRIEVAL_PORT}
19+
```
20+
21+
### 2. Update `MAIN_SERVICE_IMAGE`
22+
```
23+
MAIN_SERVICE_IMAGE=ghcr.io/layr-labs/eigenda/opr-node:0.9.0
24+
```
25+
26+
### 3. Update socket registration
27+
EigenDA v2 adds new ports to the socket registration. Socket registration update is required to receive v2 traffic.
28+
29+
Ensure that you are using the latest version of the [eigenda-operator-setup](https://github.com/Layr-Labs/eigenda-operator-setup/releases) before updating the socket.
30+
```
31+
(eigenda-operator-setup) > ./run.sh update-socket
32+
You are about to update your socket to: 23.93.87.155:32005;32004;32006;32007
33+
Confirm? [Y/n]
34+
```
35+
36+
### 4. Restart the node and monitor for reachability checks
37+
The node will check reachability of v1 & v2 sockets. If reachability checks are failing, check that the new ports are open and accessible.
38+
```
39+
Feb 20 19:47:07.861 INF node/node.go:743 Reachability check v1 - dispersal socket ONLINE component=Node status="node.Dispersal is available" socket=operator.eigenda.xyz:32001
40+
Feb 20 19:47:07.861 INF node/node.go:750 Reachability check v1 - retrieval socket ONLINE component=Node status="node.Retrieval is available" socket=operator.eigenda.xyz:32002
41+
Feb 20 19:47:07.867 INF node/node.go:743 Reachability check v2 - dispersal socket ONLINE component=Node status="validator.Dispersal is available" socket=operator.eigenda.xyz:32003
42+
Feb 20 19:47:07.867 INF node/node.go:750 Reachability check v2 - retrieval socket ONLINE component=Node status="validator.Retrieval is available" socket=operator.eigenda.xyz:32005
43+
```
44+
45+
### 5. Confirm v2 StoreChunks requests are being served
46+
```
47+
Feb 20 19:50:36.741 INF grpc/server_v2.go:140 new StoreChunks request batchHeaderHash=873ac1c7faeec0f1e5c886142d0b364a94b3e906f1b4b4f1b0466a5f79cecefb numBlobs=14 referenceBlockNumber=3393054
48+
Feb 20 19:50:41.765 INF grpc/server_v2.go:140 new StoreChunks request batchHeaderHash=76873d64609d50aaf90e1c435c9278c588f1a174a4c0b4a721438a7d44bb2f1e numBlobs=18 referenceBlockNumber=3393054
49+
Feb 20 19:50:46.760 INF grpc/server_v2.go:140 new StoreChunks request batchHeaderHash=8182f31c9b58e04f0a09dfbf1634a73e47a660b441f65c7a35ef9e7afd064493 numBlobs=16 referenceBlockNumber=3393054
50+
51+
```
52+
53+
## V2 Remote BLS Signer API Migration
54+
__Breaking Change:__ With the release of EigenDA Blazar (v2), the the node software has been upgraded to use the latest [cerberus](https://github.com/Layr-Labs/cerberus) remote BLS signer release.
55+
56+
This change requires the operator to define the `NODE_BLS_SIGNER_API_KEY` environment variable.
57+
58+
Follow the steps from the [cerberus setup guide](https://github.com/Layr-Labs/cerberus?tab=readme-ov-file#remote-signer-implementation-of-cerberus-api) to create an API key.
59+
60+
61+
## V2 Environment Variable Reference
62+
63+
### `EIGENDA_RUNTIME_MODE`
64+
This environment variable will be used to determine the runtime mode of the EigenDA node.
65+
66+
- `v1-and-v2`: The node will serve both v1 and v2 traffic (default)
67+
- `v2-only`: The node will serve v2 traffic only
68+
- `v1-only`: The node will serve v1 traffic only
69+
70+
The `v1-only` & `v2-only` modes are intended for isolating traffic to separate validator instances - where 1 instance serves v1 traffic and a second instance serves v2 traffic.
71+
72+
### `EIGENDA_V2_DISPERSAL_PORT`
73+
<ins>Operators must publically expose this port</ins>. This port will be used to listen for dispersal requests from the EigenDA v2 API. IP whitelisting is no longer required with v2.
74+
75+
### `EIGENDA_V2_RETRIEVAL_PORT`
76+
<ins>Operators must publically expose this port</ins>. This port will be used to listen for retrieval requests from the EigenDA v2 API.
77+
78+
### `EIGENDA_INTERNAL_V2_DISPERSAL_PORT`
79+
This port is intended for Nginx reverse proxy use. It is not required if the operator is not using a reverse proxy.
80+
81+
### `EIGENDA_INTERNAL_V2_RETRIEVAL_PORT`
82+
This port is intended for Nginx reverse proxy use. It is not required if the operator is not using a reverse proxy.
83+
84+
85+
## Advanced - Multi drive support for V2 LittDB
86+
87+
LittDB is capable of partitioning the chunks DB across multiple drives. See https://github.com/Layr-Labs/eigenda/blob/master/node/database-paths.md for more details.
88+
89+
### Example .env that defines 2 littDB partitions
90+
```
91+
NODE_LITT_DB_STORAGE_HOST_PATH_1=${NODE_DB_PATH_HOST}/chunk_v2_litt_1
92+
NODE_LITT_DB_STORAGE_HOST_PATH_2=${NODE_DB_PATH_HOST}/chunk_v2_litt_2
93+
NODE_LITT_DB_STORAGE_PATHS=/data/operator/db/chunk_v2_litt_1,/data/operator/db/chunk_v2_litt_2
94+
```
95+
The `NODE_LITT_DB_STORAGE_HOST_PATH_X` should map to a separately mounted drive folder for each partition.
96+
The `NODE_LITT_DB_STORAGE_PATHS` needs to map to the docker volume mounts defined in `docker-compose.yaml`
97+
#### Example docker-compose volume mounts
98+
```
99+
volumes:
100+
- "${NODE_ECDSA_KEY_FILE_HOST}:/app/operator_keys/ecdsa_key.json:readonly"
101+
- "${NODE_BLS_KEY_FILE_HOST}:/app/operator_keys/bls_key.json:readonly"
102+
- "${NODE_G1_PATH_HOST}:/app/g1.point:readonly"
103+
- "${NODE_G2_PATH_HOST}:/app/g2.point.powerOf2:readonly"
104+
- "${NODE_CACHE_PATH_HOST}:/app/cache:rw"
105+
- "${NODE_LOG_PATH_HOST}:/app/logs:rw"
106+
- "${NODE_DB_PATH_HOST}:/data/operator/db:rw"
107+
- "${NODE_LITT_DB_STORAGE_HOST_PATH_1}:/data/operator/db/chunk_v2_litt_1:rw"
108+
- "${NODE_LITT_DB_STORAGE_HOST_PATH_2}:/data/operator/db/chunk_v2_litt_2:rw"
109+
```
110+
#### Example node output after loading both partitions
111+
```
112+
eigenda-native-node | Jun 2 18:11:47.430 INF node/validator_store.go:108 Using littDB at paths /data/operator/db/chunk_v2_litt_1, /data/operator/db/chunk_v2_litt_2
113+
eigenda-native-node | Jun 2 18:11:47.430 INF littbuilder/db_impl.go:118 LittDB started, current data size: 0
114+
eigenda-native-node | Jun 2 18:11:47.430 INF littbuilder/db_impl.go:169 creating table chunks

mainnet/docker-compose.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ services:
3838
- "${NODE_CACHE_PATH_HOST}:/app/cache:rw"
3939
- "${NODE_LOG_PATH_HOST}:/app/logs:rw"
4040
- "${NODE_DB_PATH_HOST}:/data/operator/db:rw"
41+
# TODO: Uncomment and update if using remote BLS signer https://github.com/Layr-Labs/cerberus
42+
# - "${NODE_BLS_SIGNER_CERT_FILE_HOST}:/app/cerberus/cerberus.crt:readonly"
4143
restart: unless-stopped
4244
networks:
4345
eigenda:

mainnet/run.sh

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,20 @@
33

44
. ./.env
55

6-
socket="$NODE_HOSTNAME":"${NODE_DISPERSAL_PORT}"\;"${NODE_RETRIEVAL_PORT}"
6+
node_plugin_image="ghcr.io/layr-labs/eigenda/opr-nodeplugin:0.9.0"
77

8-
node_plugin_image="ghcr.io/layr-labs/eigenda/opr-nodeplugin:0.8.6"
8+
# Check if V2 ports are defined
9+
if [ -z "$NODE_V2_DISPERSAL_PORT" ]; then
10+
echo "ERROR: NODE_V2_DISPERSAL_PORT is not defined!"
11+
fi
12+
if [ -z "$NODE_V2_RETRIEVAL_PORT" ]; then
13+
echo "ERROR: NODE_V2_RETRIEVAL_PORT is not defined!"
14+
fi
15+
if [ -z "$NODE_V2_DISPERSAL_PORT" ] || [ -z "$NODE_V2_RETRIEVAL_PORT" ]; then
16+
echo "ERROR: Please update your .env file. See .env.example for reference."
17+
exit 1
18+
fi
19+
socket="$NODE_HOSTNAME":"${NODE_DISPERSAL_PORT}"\;"${NODE_RETRIEVAL_PORT}"\;"${NODE_V2_DISPERSAL_PORT}"\;"${NODE_V2_RETRIEVAL_PORT}"
920

1021
# In all commands, We have to explicitly set the password again here because
1122
# when docker run loads the `.env` file, it keeps the quotes around the password

0 commit comments

Comments
 (0)