Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions holesky/.env.example
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
MAIN_SERVICE_IMAGE=ghcr.io/layr-labs/eigenda/opr-node:0.9.0-rc.5
MAIN_SERVICE_IMAGE=ghcr.io/layr-labs/eigenda/opr-node:0.9.0
NETWORK_NAME=eigenda-network
MAIN_SERVICE_NAME=eigenda-native-node

Expand Down Expand Up @@ -35,7 +35,6 @@ NODE_INTERNAL_RETRIEVAL_PORT=${NODE_RETRIEVAL_PORT}
NODE_INTERNAL_V2_DISPERSAL_PORT=${NODE_V2_DISPERSAL_PORT}
NODE_INTERNAL_V2_RETRIEVAL_PORT=${NODE_V2_RETRIEVAL_PORT}


# Reachability Check
NODE_REACHABILITY_POLL_INTERVAL=60
NODE_DATAAPI_URL=https://dataapi-holesky.eigenda.xyz
Expand Down
33 changes: 32 additions & 1 deletion holesky/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ NODE_INTERNAL_V2_RETRIEVAL_PORT=${NODE_V2_RETRIEVAL_PORT}

### 2. Update `MAIN_SERVICE_IMAGE`
```
MAIN_SERVICE_IMAGE=ghcr.io/layr-labs/eigenda/opr-node:0.9.0-rc.5
MAIN_SERVICE_IMAGE=ghcr.io/layr-labs/eigenda/opr-node:0.9.0
```

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


## Advanced - Multi drive support for V2 LittDB

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.

### Example .env that defines 2 littDB partitions
```
NODE_LITT_DB_STORAGE_HOST_PATH_1=${NODE_DB_PATH_HOST}/chunk_v2_litt_1
NODE_LITT_DB_STORAGE_HOST_PATH_2=${NODE_DB_PATH_HOST}/chunk_v2_litt_2
NODE_LITT_DB_STORAGE_PATHS=/data/operator/db/chunk_v2_litt_1,/data/operator/db/chunk_v2_litt_2
```
The `NODE_LITT_DB_STORAGE_HOST_PATH_X` should map to a separately mounted drive folder for each partition.
The `NODE_LITT_DB_STORAGE_PATHS` needs to map to the docker volume mounts defined in `docker-compose.yaml`
#### Example docker-compose volume mounts
```
volumes:
- "${NODE_ECDSA_KEY_FILE_HOST}:/app/operator_keys/ecdsa_key.json:readonly"
- "${NODE_BLS_KEY_FILE_HOST}:/app/operator_keys/bls_key.json:readonly"
- "${NODE_G1_PATH_HOST}:/app/g1.point:readonly"
- "${NODE_G2_PATH_HOST}:/app/g2.point.powerOf2:readonly"
- "${NODE_CACHE_PATH_HOST}:/app/cache:rw"
- "${NODE_LOG_PATH_HOST}:/app/logs:rw"
- "${NODE_DB_PATH_HOST}:/data/operator/db:rw"
- "${NODE_LITT_DB_STORAGE_HOST_PATH_1}:/data/operator/db/chunk_v2_litt_1:rw"
- "${NODE_LITT_DB_STORAGE_HOST_PATH_2}:/data/operator/db/chunk_v2_litt_2:rw"
```
#### Example node output after loading both partitions
```
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
eigenda-native-node | Jun 2 18:11:47.430 INF littbuilder/db_impl.go:118 LittDB started, current data size: 0
eigenda-native-node | Jun 2 18:11:47.430 INF littbuilder/db_impl.go:169 creating table chunks
1 change: 1 addition & 0 deletions holesky/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ services:
- "${NODE_CACHE_PATH_HOST}:/app/cache:rw"
- "${NODE_LOG_PATH_HOST}:/app/logs:rw"
- "${NODE_DB_PATH_HOST}:/data/operator/db:rw"
# TODO: Uncomment and update if using remote BLS signer https://github.com/Layr-Labs/cerberus
# - "${NODE_BLS_SIGNER_CERT_FILE_HOST}:/app/cerberus/cerberus.crt:readonly"
restart: unless-stopped
networks:
Expand Down
6 changes: 3 additions & 3 deletions holesky/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

. ./.env

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

# Check if V2 ports are defined
if [ -z "$NODE_V2_DISPERSAL_PORT" ]; then
Expand Down Expand Up @@ -83,15 +83,15 @@ listQuorums() {
}

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

# we have to pass a dummy quorum-id-list as it is required by the plugin
docker run --env-file .env \
--rm \
--volume "${NODE_ECDSA_KEY_FILE_HOST}":/app/operator_keys/ecdsa_key.json \
Expand Down
9 changes: 8 additions & 1 deletion mainnet/.env.example
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
MAIN_SERVICE_IMAGE=ghcr.io/layr-labs/eigenda/opr-node:0.8.6
MAIN_SERVICE_IMAGE=ghcr.io/layr-labs/eigenda/opr-node:0.9.0
NETWORK_NAME=eigenda-network
MAIN_SERVICE_NAME=eigenda-native-node

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

# TODO: The ip provider service used to obtain a node's public IP [seeip (default), ipify)
NODE_PUBLIC_IP_PROVIDER=seeip
Expand Down
113 changes: 112 additions & 1 deletion mainnet/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,114 @@
## Mainnet

Head over to our [EigenDA operator guides](https://docs.eigenlayer.xyz/eigenda/operator-guides/overview) for installation instructions and more details.
Head over to our [EigenDA operator guides](https://docs.eigenlayer.xyz/eigenda/operator-guides/overview) for installation instructions and more details.

## Blazar (EigenDA V2) Migration
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.

## Migration Steps
### 1. Update `.env` with v2 specific environment variables
```
NODE_V2_RUNTIME_MODE=v1-and-v2

NODE_V2_DISPERSAL_PORT=32006
NODE_V2_RETRIEVAL_PORT=32007

# Internal ports for Nginx reverse proxy
NODE_INTERNAL_V2_DISPERSAL_PORT=${NODE_V2_DISPERSAL_PORT}
NODE_INTERNAL_V2_RETRIEVAL_PORT=${NODE_V2_RETRIEVAL_PORT}
```

### 2. Update `MAIN_SERVICE_IMAGE`
```
MAIN_SERVICE_IMAGE=ghcr.io/layr-labs/eigenda/opr-node:0.9.0
```

### 3. Update socket registration
EigenDA v2 adds new ports to the socket registration. Socket registration update is required to receive v2 traffic.

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.
```
(eigenda-operator-setup) > ./run.sh update-socket
You are about to update your socket to: 23.93.87.155:32005;32004;32006;32007
Confirm? [Y/n]
```

### 4. Restart the node and monitor for reachability checks
The node will check reachability of v1 & v2 sockets. If reachability checks are failing, check that the new ports are open and accessible.
```
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
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
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
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
```

### 5. Confirm v2 StoreChunks requests are being served
```
Feb 20 19:50:36.741 INF grpc/server_v2.go:140 new StoreChunks request batchHeaderHash=873ac1c7faeec0f1e5c886142d0b364a94b3e906f1b4b4f1b0466a5f79cecefb numBlobs=14 referenceBlockNumber=3393054
Feb 20 19:50:41.765 INF grpc/server_v2.go:140 new StoreChunks request batchHeaderHash=76873d64609d50aaf90e1c435c9278c588f1a174a4c0b4a721438a7d44bb2f1e numBlobs=18 referenceBlockNumber=3393054
Feb 20 19:50:46.760 INF grpc/server_v2.go:140 new StoreChunks request batchHeaderHash=8182f31c9b58e04f0a09dfbf1634a73e47a660b441f65c7a35ef9e7afd064493 numBlobs=16 referenceBlockNumber=3393054

```

## V2 Remote BLS Signer API Migration
__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.

This change requires the operator to define the `NODE_BLS_SIGNER_API_KEY` environment variable.

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.


## V2 Environment Variable Reference

### `EIGENDA_RUNTIME_MODE`
This environment variable will be used to determine the runtime mode of the EigenDA node.

- `v1-and-v2`: The node will serve both v1 and v2 traffic (default)
- `v2-only`: The node will serve v2 traffic only
- `v1-only`: The node will serve v1 traffic only

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.

### `EIGENDA_V2_DISPERSAL_PORT`
<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.

### `EIGENDA_V2_RETRIEVAL_PORT`
<ins>Operators must publically expose this port</ins>. This port will be used to listen for retrieval requests from the EigenDA v2 API.

### `EIGENDA_INTERNAL_V2_DISPERSAL_PORT`
This port is intended for Nginx reverse proxy use. It is not required if the operator is not using a reverse proxy.

### `EIGENDA_INTERNAL_V2_RETRIEVAL_PORT`
This port is intended for Nginx reverse proxy use. It is not required if the operator is not using a reverse proxy.


## Advanced - Multi drive support for V2 LittDB

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.

### Example .env that defines 2 littDB partitions
```
NODE_LITT_DB_STORAGE_HOST_PATH_1=${NODE_DB_PATH_HOST}/chunk_v2_litt_1
NODE_LITT_DB_STORAGE_HOST_PATH_2=${NODE_DB_PATH_HOST}/chunk_v2_litt_2
NODE_LITT_DB_STORAGE_PATHS=/data/operator/db/chunk_v2_litt_1,/data/operator/db/chunk_v2_litt_2
```
The `NODE_LITT_DB_STORAGE_HOST_PATH_X` should map to a separately mounted drive folder for each partition.
The `NODE_LITT_DB_STORAGE_PATHS` needs to map to the docker volume mounts defined in `docker-compose.yaml`
#### Example docker-compose volume mounts
```
volumes:
- "${NODE_ECDSA_KEY_FILE_HOST}:/app/operator_keys/ecdsa_key.json:readonly"
- "${NODE_BLS_KEY_FILE_HOST}:/app/operator_keys/bls_key.json:readonly"
- "${NODE_G1_PATH_HOST}:/app/g1.point:readonly"
- "${NODE_G2_PATH_HOST}:/app/g2.point.powerOf2:readonly"
- "${NODE_CACHE_PATH_HOST}:/app/cache:rw"
- "${NODE_LOG_PATH_HOST}:/app/logs:rw"
- "${NODE_DB_PATH_HOST}:/data/operator/db:rw"
- "${NODE_LITT_DB_STORAGE_HOST_PATH_1}:/data/operator/db/chunk_v2_litt_1:rw"
- "${NODE_LITT_DB_STORAGE_HOST_PATH_2}:/data/operator/db/chunk_v2_litt_2:rw"
```
#### Example node output after loading both partitions
```
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
eigenda-native-node | Jun 2 18:11:47.430 INF littbuilder/db_impl.go:118 LittDB started, current data size: 0
eigenda-native-node | Jun 2 18:11:47.430 INF littbuilder/db_impl.go:169 creating table chunks
2 changes: 2 additions & 0 deletions mainnet/docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ services:
- "${NODE_CACHE_PATH_HOST}:/app/cache:rw"
- "${NODE_LOG_PATH_HOST}:/app/logs:rw"
- "${NODE_DB_PATH_HOST}:/data/operator/db:rw"
# TODO: Uncomment and update if using remote BLS signer https://github.com/Layr-Labs/cerberus
# - "${NODE_BLS_SIGNER_CERT_FILE_HOST}:/app/cerberus/cerberus.crt:readonly"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this intentional? Should we add a description

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yea, it's ugly, but Docker compose will fail if uncommented and the cert doesn't exist. I'm not opposed to removing it.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Was just matching what testnet setup had. Added comment

restart: unless-stopped
networks:
eigenda:
Expand Down
15 changes: 13 additions & 2 deletions mainnet/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,20 @@

. ./.env

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

node_plugin_image="ghcr.io/layr-labs/eigenda/opr-nodeplugin:0.8.6"
# Check if V2 ports are defined
if [ -z "$NODE_V2_DISPERSAL_PORT" ]; then
echo "ERROR: NODE_V2_DISPERSAL_PORT is not defined!"
fi
if [ -z "$NODE_V2_RETRIEVAL_PORT" ]; then
echo "ERROR: NODE_V2_RETRIEVAL_PORT is not defined!"
fi
if [ -z "$NODE_V2_DISPERSAL_PORT" ] || [ -z "$NODE_V2_RETRIEVAL_PORT" ]; then
echo "ERROR: Please update your .env file. See .env.example for reference."
exit 1
fi
socket="$NODE_HOSTNAME":"${NODE_DISPERSAL_PORT}"\;"${NODE_RETRIEVAL_PORT}"\;"${NODE_V2_DISPERSAL_PORT}"\;"${NODE_V2_RETRIEVAL_PORT}"

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