Skip to content

Commit

Permalink
feat: add ENV config for operator and aggregator (#74)
Browse files Browse the repository at this point in the history
* operator supprot ENV config

* add env for aggregator
  • Loading branch information
fyInALT authored Mar 28, 2024
1 parent 2e6123c commit 4e843df
Show file tree
Hide file tree
Showing 3 changed files with 136 additions and 8 deletions.
40 changes: 35 additions & 5 deletions core/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,12 +68,42 @@ func NewConfig(ctx *cli.Context) (*Config, error) {
sdkutils.ReadYamlConfig(configFilePath, &configRaw)
}

ethRpcUrl, ok := os.LookupEnv("ETH_RPC_URL")
if ok && ethRpcUrl != "" {
configRaw.EthRpcUrl = ethRpcUrl
}

EthWsUrl, ok := os.LookupEnv("ETH_WS_URL")
if ok && EthWsUrl != "" {
configRaw.EthWsUrl = EthWsUrl
}

aggregatorServerIpPortAddress, ok := os.LookupEnv("AGGREGATOR_SERVER_URL")
if ok && aggregatorServerIpPortAddress != "" {
configRaw.AggregatorServerIpPortAddr = aggregatorServerIpPortAddress
}

var deploymentRaw MachAvsDeploymentRaw
deploymentFilePath := ctx.GlobalString(DeploymentFileFlag.Name)
if _, err := os.Stat(deploymentFilePath); errors.Is(err, os.ErrNotExist) {
panic("Path " + deploymentFilePath + " does not exist")

avsRegistryCoordinatorAddress, rcOk := os.LookupEnv("AVS_REGISTRY_COORDINATOR_ADDRESS")
operatorStateRetrieverAddress, osOk := os.LookupEnv("OPERATOR_STATE_RETRIEVER_ADDRESS")

if rcOk && osOk && avsRegistryCoordinatorAddress != "" && operatorStateRetrieverAddress != "" {
deploymentRaw.OperatorStateRetrieverAddr = operatorStateRetrieverAddress
deploymentRaw.RegistryCoordinatorAddr = avsRegistryCoordinatorAddress
} else {
deploymentFilePath := ctx.GlobalString(DeploymentFileFlag.Name)
if deploymentFilePath == "" {
panic("If not use env `AVS_REGISTRY_COORDINATOR_ADDRESS` and `OPERATOR_STATE_RETRIEVER_ADDRESS`, should use --avs-deployment to use config for avs contract addresses!")
}

if _, err := os.Stat(deploymentFilePath); errors.Is(err, os.ErrNotExist) {
panic("Path " + deploymentFilePath + " does not exist")
}
if err := sdkutils.ReadJsonConfig(deploymentFilePath, &deploymentRaw); err != nil {
panic(err)
}
}
sdkutils.ReadJsonConfig(deploymentFilePath, &deploymentRaw)

logger, err := sdklogging.NewZapLogger(configRaw.Environment)
if err != nil {
Expand Down Expand Up @@ -162,7 +192,7 @@ var (
}
DeploymentFileFlag = cli.StringFlag{
Name: "avs-deployment",
Required: true,
Required: false,
Usage: "Load avs contract addresses from `FILE`",
}
EcdsaPrivateKeyFlag = cli.StringFlag{
Expand Down
2 changes: 1 addition & 1 deletion operator/cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ func operatorMain(ctx *cli.Context) error {
if err != nil {
log.Fatalf(err.Error())
}
log.Println("Config:", string(configJson))
log.Println("Config from file:", string(configJson))

log.Println("initializing operator")
operator, err := operator.NewOperatorFromConfig(nodeConfig)
Expand Down
102 changes: 100 additions & 2 deletions operator/operator.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package operator

import (
"context"
"encoding/json"
"fmt"
"log"
"os"
"strings"

Expand Down Expand Up @@ -62,12 +64,105 @@ type Operator struct {
serviceManagerAddr common.Address
}

// use the env config first for some keys
func withEnvConfig(c config.NodeConfig) config.NodeConfig {
// This keys can use the environment:
//
// - `ETH_RPC_URL` : eth_rpc_url
// - `ETH_WS_URL` : eth_ws_url
// - `ECDSA_PRIVATE_KEY_PATH` : ecdsa_private_key_store_path
// - `BLS_PRIVATE_KEY_PATH` : bls_private_key_store_path
// - `AGGREGATOR_SERVER_URL` : eth_rpc_url
// - `EIGEN_METRICS_URL` : eigen_metrics_ip_port_address
// - `NODE_API_URL` : node_api_ip_port_address
// - `ENABLE_METRICS` : enable_metrics
// - `ENABLE_NODE_API` : enable_node_api
// - `AVS_REGISTRY_COORDINATOR_ADDRESS` : avs_registry_coordinator_address
// - `OPERATOR_STATE_RETRIEVER_ADDRESS` : operator_state_retriever_address
// - `OPERATOR_SERVER_URL` : operator_server_ip_port_addr
// - `METADATA_URI` : metadata_uri

ethRpcUrl, ok := os.LookupEnv("ETH_RPC_URL")
if ok && ethRpcUrl != "" {
c.EthRpcUrl = ethRpcUrl
}

EthWsUrl, ok := os.LookupEnv("ETH_WS_URL")
if ok && EthWsUrl != "" {
c.EthWsUrl = EthWsUrl
}

ecdsaPrivateKeyStorePath, ok := os.LookupEnv("ECDSA_PRIVATE_KEY_PATH")
if ok && ecdsaPrivateKeyStorePath != "" {
c.EcdsaPrivateKeyStorePath = ecdsaPrivateKeyStorePath
}

blsPrivateKeyStorePath, ok := os.LookupEnv("BLS_PRIVATE_KEY_PATH")
if ok && blsPrivateKeyStorePath != "" {
c.BlsPrivateKeyStorePath = blsPrivateKeyStorePath
}

aggregatorServerIpPortAddress, ok := os.LookupEnv("AGGREGATOR_SERVER_URL")
if ok && aggregatorServerIpPortAddress != "" {
c.AggregatorServerIpPortAddress = aggregatorServerIpPortAddress
}

eigenMetricsIpPortAddress, ok := os.LookupEnv("EIGEN_METRICS_URL")
if ok && eigenMetricsIpPortAddress != "" {
c.EigenMetricsIpPortAddress = eigenMetricsIpPortAddress
}

nodeApiIpPortAddress, ok := os.LookupEnv("NODE_API_URL")
if ok && nodeApiIpPortAddress != "" {
c.NodeApiIpPortAddress = nodeApiIpPortAddress
}

enableMetrics, ok := os.LookupEnv("ENABLE_METRICS")
if ok && enableMetrics != "" {
c.EnableMetrics = enableMetrics == "true"
}

enableNodeApi, ok := os.LookupEnv("ENABLE_NODE_API")
if ok && enableNodeApi != "" {
c.EnableNodeApi = enableNodeApi == "true"
}

aVSRegistryCoordinatorAddress, ok := os.LookupEnv("AVS_REGISTRY_COORDINATOR_ADDRESS")
if ok && aVSRegistryCoordinatorAddress != "" {
c.AVSRegistryCoordinatorAddress = aVSRegistryCoordinatorAddress
}

operatorStateRetrieverAddress, ok := os.LookupEnv("OPERATOR_STATE_RETRIEVER_ADDRESS")
if ok && operatorStateRetrieverAddress != "" {
c.OperatorStateRetrieverAddress = operatorStateRetrieverAddress
}

operatorServerIpPortAddr, ok := os.LookupEnv("OPERATOR_SERVER_URL")
if ok && operatorServerIpPortAddr != "" {
c.OperatorServerIpPortAddr = operatorServerIpPortAddr
}

metadataURI, ok := os.LookupEnv("METADATA_URI")
if ok && metadataURI != "" {
c.MetadataURI = metadataURI
}

configJson, err := json.MarshalIndent(c, "", " ")
if err != nil {
panic(err)
}

log.Println("Config Env:", string(configJson))

return c
}

// TODO(samlaf): config is a mess right now, since the chainio client constructors
//
// take the config in core (which is shared with aggregator and challenger)
func NewOperatorFromConfig(c config.NodeConfig) (*Operator, error) {
func NewOperatorFromConfig(cfg config.NodeConfig) (*Operator, error) {
var logLevel logging.LogLevel
if c.Production {
if cfg.Production {
logLevel = sdklogging.Production
} else {
logLevel = sdklogging.Development
Expand All @@ -76,6 +171,9 @@ func NewOperatorFromConfig(c config.NodeConfig) (*Operator, error) {
if err != nil {
return nil, err
}

c := withEnvConfig(cfg)

reg := prometheus.NewRegistry()
eigenMetrics := sdkmetrics.NewEigenMetrics(AVS_NAME, c.EigenMetricsIpPortAddress, reg, logger)
avsAndEigenMetrics := metrics.NewAvsAndEigenMetrics(AVS_NAME, eigenMetrics, reg)
Expand Down

0 comments on commit 4e843df

Please sign in to comment.