diff --git a/config/operator_sample.yaml b/config/operator_sample.yaml index a04c2195..290d854b 100644 --- a/config/operator_sample.yaml +++ b/config/operator_sample.yaml @@ -36,3 +36,7 @@ db_path: /tmp/ap-avs-operator target_chain: eth_rpc_url: eth_ws_url: + +enabled_features: + # event trigger requires a dedicated rpc node with websocket to listen to all on-chain event. Depend on your RPC provider, this may require significant billing so we disable by default + event_trigger: false diff --git a/operator/operator.go b/operator/operator.go index d8eccb4d..b4c89785 100644 --- a/operator/operator.go +++ b/operator/operator.go @@ -99,6 +99,10 @@ type OperatorConfig struct { Password string `yaml:"password"` TLSCertFilePath string `yaml:"tls_cert_file_path"` } `yaml:"bls_remote_signer"` + + EnabledFeatures struct { + EventTrigger bool `yaml:"event_trigger"` + } `yaml:"enabled_features"` } type Operator struct { @@ -192,11 +196,12 @@ func NewOperatorFromConfig(c OperatorConfig) (*Operator, error) { // Setup Node Api nodeApi := nodeapi.NewNodeApi(AVS_NAME, version.Get(), c.NodeApiIpPortAddress, logger) - logger.Infof("%s operator version %s", AVS_NAME, version.Get()) + logger.Info("starting operator", "version", version.Get(), "commit", version.Commit()) var ethRpcClient *eth.InstrumentedClient var ethWsClient *eth.InstrumentedClient + logger.Debug("initialize rpc call collector") rpcCallsCollector := rpccalls.NewCollector(AVS_NAME, reg) if c.EnableMetrics { ethRpcClient, err = eth.NewInstrumentedClient(c.EthRpcUrl, rpcCallsCollector) @@ -225,6 +230,7 @@ func NewOperatorFromConfig(c OperatorConfig) (*Operator, error) { var blsRemoteSigner blssignerV1.SignerClient var blsKeyPair *bls.KeyPair if c.BlsRemoteSigner.GrpcUrl != "" { + logger.Debug("initialize remote signer", "grpc_url", c.BlsRemoteSigner.GrpcUrl) logger.Info("creating signer client", "url", c.BlsRemoteSigner.GrpcUrl, "publickey", c.BlsRemoteSigner.PublicKey) creds := insecure.NewCredentials() if c.BlsRemoteSigner.TLSCertFilePath != "" { @@ -253,6 +259,7 @@ func NewOperatorFromConfig(c OperatorConfig) (*Operator, error) { } chainId, err := ethRpcClient.ChainID(context.Background()) + logger.Infof("detect EigenLayer on chain id %d", chainId) if err != nil { logger.Error("Cannot get chainId", "err", err) return nil, err @@ -529,4 +536,4 @@ func (o *Operator) GetSignature(ctx context.Context, message []byte) (*blscrypto } return sig, nil -} +} \ No newline at end of file diff --git a/operator/worker_loop.go b/operator/worker_loop.go index 27a7f992..60c677e3 100644 --- a/operator/worker_loop.go +++ b/operator/worker_loop.go @@ -61,9 +61,15 @@ func (o *Operator) runWorkLoop(ctx context.Context) error { o.timeTrigger = triggerengine.NewTimeTrigger(timeTriggerCh, o.logger) o.blockTrigger.Run(ctx) - o.eventTrigger.Run(ctx) o.timeTrigger.Run(ctx) + // Event trigger can be costly, so we require an opt-in + if o.config.EnabledFeatures.EventTrigger { + o.eventTrigger.Run(ctx) + } else { + o.logger.Info("event trigger not enable, skip initialize event monitoring") + } + // Establish a connection with gRPC server where new task will be pushed automatically o.logger.Info("open channel to grpc to receive check") go o.StreamMessages()