Skip to content

Commit 562a6b2

Browse files
authored
v0.12.0 (#1504)
2 parents 1125be8 + d3fb100 commit 562a6b2

File tree

127 files changed

+1711
-6509
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

127 files changed

+1711
-6509
lines changed

.github/workflows/test-go-retries.yml

Lines changed: 0 additions & 36 deletions
This file was deleted.

Makefile

Lines changed: 28 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ OS := $(shell uname -s)
66
CONFIG_FILE?=config-files/config.yaml
77
AGG_CONFIG_FILE?=config-files/config-aggregator.yaml
88

9-
OPERATOR_VERSION=v0.11.2
9+
OPERATOR_VERSION=v0.12.0
1010

1111
ifeq ($(OS),Linux)
1212
BUILD_ALL_FFI = $(MAKE) build_all_ffi_linux
@@ -117,6 +117,7 @@ unpause_batcher_payment_service:
117117
get_paused_state_batcher_payments_service:
118118
@echo "Getting paused state of Batcher Payments Service contract..."
119119
. contracts/scripts/get_paused_state_batcher_payments_service.sh
120+
120121
anvil_upgrade_initialize_disable_verifiers:
121122
@echo "Initializing disabled verifiers..."
122123
. contracts/scripts/anvil/upgrade_disabled_verifiers_in_service_manager.sh
@@ -229,19 +230,21 @@ operator_mint_mock_tokens:
229230

230231
operator_whitelist_devnet:
231232
@echo "Whitelisting operator"
232-
$(eval OPERATOR_ADDRESS = $(shell yq -r '.operator.address' $(CONFIG_FILE)))
233233
@echo "Operator address: $(OPERATOR_ADDRESS)"
234-
RPC_URL="http://localhost:8545" PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" OUTPUT_PATH=./script/output/devnet/alignedlayer_deployment_output.json ./contracts/scripts/whitelist_operator.sh $(OPERATOR_ADDRESS)
234+
RPC_URL="http://localhost:8545" PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" OUTPUT_PATH=./script/output/devnet/alignedlayer_deployment_output.json ./contracts/scripts/operator_whitelist.sh $(OPERATOR_ADDRESS)
235235

236-
operator_remove_devnet:
236+
operator_remove_from_whitelist_devnet:
237237
@echo "Removing operator"
238-
$(eval OPERATOR_ADDRESS = $(shell yq -r '.operator.address' $(CONFIG_FILE)))
239238
@echo "Operator address: $(OPERATOR_ADDRESS)"
240-
RPC_URL="http://localhost:8545" PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" OUTPUT_PATH=./script/output/devnet/alignedlayer_deployment_output.json ./contracts/scripts/remove_operator.sh $(OPERATOR_ADDRESS)
239+
RPC_URL="http://localhost:8545" PRIVATE_KEY="0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80" OUTPUT_PATH=./script/output/devnet/alignedlayer_deployment_output.json ./contracts/scripts/operator_remove_from_whitelist.sh $(OPERATOR_ADDRESS)
241240

242241
operator_whitelist:
243242
@echo "Whitelisting operator $(OPERATOR_ADDRESS)"
244-
@. contracts/scripts/.env && . contracts/scripts/whitelist_operator.sh $(OPERATOR_ADDRESS)
243+
@. contracts/scripts/.env && . contracts/scripts/operator_whitelist.sh $(OPERATOR_ADDRESS)
244+
245+
operator_remove_from_whitelist:
246+
@echo "Removing operator $(OPERATOR_ADDRESS)"
247+
@. contracts/scripts/.env && . contracts/scripts/operator_remove_from_whitelist.sh $(OPERATOR_ADDRESS)
245248

246249
operator_deposit_into_mock_strategy:
247250
@echo "Depositing into mock strategy"
@@ -563,18 +566,18 @@ run_storage: ## Run storage using storage-docker-compose.yaml
563566
@echo "Running storage..."
564567
@docker compose -f storage-docker-compose.yaml up
565568

566-
__DEPLOYMENT__:
567-
deploy_aligned_contracts: ## Deploy Aligned Contracts
568-
@echo "Deploying Aligned Contracts..."
569-
@. contracts/scripts/.env && . contracts/scripts/deploy_aligned_contracts.sh
569+
__DEPLOYMENT__: ## ____
570+
deploy_aligned_contracts: ## Deploy Aligned Contracts. Parameters: NETWORK=<mainnet|holesky|sepolia>
571+
@echo "Deploying Aligned Contracts on $(NETWORK) network..."
572+
@. contracts/scripts/.env.$(NETWORK) && . contracts/scripts/deploy_aligned_contracts.sh
570573

571574
deploy_pauser_registry: ## Deploy Pauser Registry
572575
@echo "Deploying Pauser Registry..."
573576
@. contracts/scripts/.env && . contracts/scripts/deploy_pauser_registry.sh
574577

575-
upgrade_aligned_contracts: ## Upgrade Aligned Contracts
576-
@echo "Upgrading Aligned Contracts..."
577-
@. contracts/scripts/.env && . contracts/scripts/upgrade_aligned_contracts.sh
578+
upgrade_aligned_contracts: ## Upgrade Aligned Contracts. Parameters: NETWORK=<mainnet|holesky|sepolia>
579+
@echo "Upgrading Aligned Contracts on $(NETWORK) network..."
580+
@. contracts/scripts/.env.$(NETWORK) && . contracts/scripts/upgrade_aligned_contracts.sh
578581

579582
upgrade_pauser_aligned_contracts: ## Upgrade Aligned Contracts with Pauser initialization
580583
@echo "Upgrading Aligned Contracts with Pauser initialization..."
@@ -608,13 +611,13 @@ deploy_verify_batch_inclusion_caller:
608611
@echo "Deploying VerifyBatchInclusionCaller contract..."
609612
@. examples/verify/.env && . examples/verify/scripts/deploy_verify_batch_inclusion_caller.sh
610613

611-
deploy_batcher_payment_service:
612-
@echo "Deploying BatcherPayments contract..."
613-
@. contracts/scripts/.env && . contracts/scripts/deploy_batcher_payment_service.sh
614+
deploy_batcher_payment_service: ## Deploy BatcherPayments contract. Parameters: NETWORK=<mainnet|holesky|sepolia>
615+
@echo "Deploying BatcherPayments contract on $(NETWORK) network..."
616+
@. contracts/scripts/.env.$(NETWORK) && . contracts/scripts/deploy_batcher_payment_service.sh
614617

615-
upgrade_batcher_payment_service:
616-
@echo "Upgrading BatcherPayments contract..."
617-
@. contracts/scripts/.env && . contracts/scripts/upgrade_batcher_payment_service.sh
618+
upgrade_batcher_payment_service: ## Upgrade BatcherPayments contract. Parameters: NETWORK=<mainnet|holesky|sepolia
619+
@echo "Upgrading BatcherPayments Contract on $(NETWORK) network..."
620+
@. contracts/scripts/.env.$(NETWORK) && . contracts/scripts/upgrade_batcher_payment_service.sh
618621

619622
build_aligned_contracts:
620623
@cd contracts/src/core && forge build
@@ -844,35 +847,6 @@ explorer_create_env:
844847
@cd explorer && \
845848
cp .env.dev .env
846849

847-
__TRACKER__:
848-
849-
tracker_devnet_start: tracker_run_db
850-
@cd operator_tracker/ && \
851-
cargo run -r -- --env-file .env.dev
852-
853-
tracker_install: tracker_build_db
854-
cargo install --path ./operator_tracker
855-
856-
tracker_build_db:
857-
@cd operator_tracker && \
858-
docker build -t tracker-postgres-image .
859-
860-
tracker_run_db: tracker_build_db tracker_remove_db_container
861-
@cd operator_tracker && \
862-
docker run -d --name tracker-postgres-container -p 5433:5432 -v tracker-postgres-data:/var/lib/postgresql/data tracker-postgres-image
863-
864-
tracker_remove_db_container:
865-
docker stop tracker-postgres-container || true && \
866-
docker rm tracker-postgres-container || true
867-
868-
tracker_clean_db: tracker_remove_db_container
869-
docker volume rm tracker-postgres-data || true
870-
871-
tracker_dump_db:
872-
@cd operator_tracker && \
873-
docker exec -t tracker-postgres-container pg_dumpall -c -U tracker_user > dump.$$(date +\%Y\%m\%d_\%H\%M\%S).sql
874-
@echo "Dumped database successfully to /operator_tracker"
875-
876850
DOCKER_RPC_URL=http://anvil:8545
877851
PROOF_GENERATOR_ADDRESS=0x66f9664f97F2b50F62D13eA064982f936dE76657
878852

@@ -1093,7 +1067,7 @@ docker_logs_batcher:
10931067

10941068
__TELEMETRY__:
10951069
# Collector, Jaeger and Elixir API
1096-
telemetry_full_start: open_telemetry_start telemetry_start
1070+
telemetry_full_start: telemetry_compile_bls_verifier open_telemetry_start telemetry_start
10971071

10981072
# Collector and Jaeger
10991073
open_telemetry_start: ## Run open telemetry services using telemetry-docker-compose.yaml
@@ -1137,6 +1111,10 @@ telemetry_create_env:
11371111
@cd telemetry_api && \
11381112
cp .env.dev .env
11391113

1114+
telemetry_compile_bls_verifier:
1115+
@cd telemetry_api/priv && \
1116+
go build ../bls_verifier/bls_verify.go
1117+
11401118
setup_local_aligned_all:
11411119
tmux kill-session -t aligned_layer || true
11421120
tmux new-session -d -s aligned_layer

aggregator/pkg/aggregator.go

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,12 @@ import (
55
"encoding/hex"
66
"fmt"
77
"math/big"
8-
"strings"
98
"sync"
109
"time"
1110

1211
gethtypes "github.com/ethereum/go-ethereum/core/types"
1312

1413
"github.com/prometheus/client_golang/prometheus"
15-
retry "github.com/yetanotherco/aligned_layer/core"
1614
"github.com/yetanotherco/aligned_layer/metrics"
1715

1816
sdkclients "github.com/Layr-Labs/eigensdk-go/chainio/clients"
@@ -107,7 +105,7 @@ func NewAggregator(aggregatorConfig config.AggregatorConfig) (*Aggregator, error
107105
// Telemetry
108106
aggregatorTelemetry := NewTelemetry(aggregatorConfig.Aggregator.TelemetryIpPortAddress, logger)
109107

110-
avsReader, err := chainio.NewAvsReaderFromConfig(aggregatorConfig.BaseConfig, aggregatorConfig.EcdsaConfig)
108+
avsReader, err := chainio.NewAvsReaderFromConfig(aggregatorConfig.BaseConfig)
111109
if err != nil {
112110
return nil, err
113111
}
@@ -136,9 +134,7 @@ func NewAggregator(aggregatorConfig config.AggregatorConfig) (*Aggregator, error
136134
PromMetricsIpPortAddress: ":9090",
137135
}
138136

139-
aggregatorPrivateKey := aggregatorConfig.EcdsaConfig.PrivateKey
140-
141-
clients, err := sdkclients.BuildAll(chainioConfig, aggregatorPrivateKey, logger)
137+
clients, err := sdkclients.BuildReadClients(chainioConfig, logger)
142138
if err != nil {
143139
logger.Errorf("Cannot create sdk clients", "err", err)
144140
return nil, err
@@ -331,6 +327,7 @@ func (agg *Aggregator) sendAggregatedResponse(batchIdentifierHash [32]byte, batc
331327
nonSignerStakesAndSignature,
332328
agg.AggregatorConfig.Aggregator.GasBaseBumpPercentage,
333329
agg.AggregatorConfig.Aggregator.GasBumpIncrementalPercentage,
330+
agg.AggregatorConfig.Aggregator.GasBumpPercentageLimit,
334331
agg.AggregatorConfig.Aggregator.TimeToWaitBeforeBump,
335332
onGasPriceBumped,
336333
)
@@ -396,7 +393,7 @@ func (agg *Aggregator) AddNewTask(batchMerkleRoot [32]byte, senderAddress [20]by
396393
quorumNums := eigentypes.QuorumNums{eigentypes.QuorumNum(QUORUM_NUMBER)}
397394
quorumThresholdPercentages := eigentypes.QuorumThresholdPercentages{eigentypes.QuorumThresholdPercentage(QUORUM_THRESHOLD)}
398395

399-
err := agg.InitializeNewTaskRetryable(batchIndex, taskCreatedBlock, quorumNums, quorumThresholdPercentages, agg.AggregatorConfig.Aggregator.BlsServiceTaskTimeout)
396+
err := agg.blsAggregationService.InitializeNewTaskWithWindow(batchIndex, taskCreatedBlock, quorumNums, quorumThresholdPercentages, agg.AggregatorConfig.Aggregator.BlsServiceTaskTimeout, 15*time.Second)
400397
if err != nil {
401398
agg.logger.Fatalf("BLS aggregation service error when initializing new task: %s", err)
402399
}
@@ -409,30 +406,6 @@ func (agg *Aggregator) AddNewTask(batchMerkleRoot [32]byte, senderAddress [20]by
409406

410407
// |---RETRYABLE---|
411408

412-
/*
413-
InitializeNewTaskRetryable
414-
Initialize a new task in the BLS Aggregation service
415-
- Errors:
416-
Permanent:
417-
- TaskAlreadyInitializedError (Permanent): Task is already intialized in the BLS Aggregation service (https://github.com/Layr-Labs/eigensdk-go/blob/dev/services/bls_aggregation/blsagg.go#L27).
418-
Transient:
419-
- All others.
420-
- Retry times (3 retries): 1 sec, 2 sec, 4 sec
421-
*/
422-
func (agg *Aggregator) InitializeNewTaskRetryable(batchIndex uint32, taskCreatedBlock uint32, quorumNums eigentypes.QuorumNums, quorumThresholdPercentages eigentypes.QuorumThresholdPercentages, timeToExpiry time.Duration) error {
423-
initializeNewTask_func := func() error {
424-
err := agg.blsAggregationService.InitializeNewTask(batchIndex, taskCreatedBlock, quorumNums, quorumThresholdPercentages, timeToExpiry)
425-
if err != nil {
426-
// Task is already initialized
427-
if strings.Contains(err.Error(), "already initialized") {
428-
err = retry.PermanentError{Inner: err}
429-
}
430-
}
431-
return err
432-
}
433-
return retry.Retry(initializeNewTask_func, retry.MinDelay, retry.RetryFactor, retry.NumRetries, retry.MaxInterval, retry.MaxElapsedTime)
434-
}
435-
436409
// Long-lived goroutine that periodically checks and removes old Tasks from stored Maps
437410
// It runs every GarbageCollectorPeriod and removes all tasks older than GarbageCollectorTasksAge
438411
// This was added because each task occupies memory in the maps, and we need to free it to avoid a memory leak

aggregator/pkg/server.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,11 @@ func (agg *Aggregator) ProcessOperatorSignedTaskResponseV2(signedTaskResponse *t
5050
"operatorId", hex.EncodeToString(signedTaskResponse.OperatorId[:]))
5151
taskIndex := uint32(0)
5252

53-
taskIndex, err := agg.GetTaskIndex(signedTaskResponse.BatchIdentifierHash)
53+
// The Aggregator may receive the Task Identifier after the operators.
54+
// If that's the case, we won't know about the task at this point
55+
// so we make GetTaskIndex retryable, waiting for some seconds,
56+
// before trying to fetch the task again from the map.
57+
taskIndex, err := agg.GetTaskIndexRetryable(signedTaskResponse.BatchIdentifierHash, retry.NetworkRetryParams())
5458

5559
if err != nil {
5660
agg.logger.Warn("Task not found in the internal map, operator signature will be lost. Batch may not reach quorum")
@@ -106,7 +110,13 @@ func (agg *Aggregator) ServerRunning(_ *struct{}, reply *int64) error {
106110
return nil
107111
}
108112

109-
func (agg *Aggregator) GetTaskIndex(batchIdentifierHash [32]byte) (uint32, error) {
113+
/*
114+
Checks Internal mapping for Signed Task Response, returns its TaskIndex.
115+
- All errors are considered Transient Errors
116+
- Retry times (3 retries): 1 sec, 2 sec, 4 sec
117+
TODO: We should refactor the retry duration considering extending it to a larger time or number of retries, at least somewhere between 1 and 2 blocks
118+
*/
119+
func (agg *Aggregator) GetTaskIndexRetryable(batchIdentifierHash [32]byte, config *retry.RetryParams) (uint32, error) {
110120
getTaskIndex_func := func() (uint32, error) {
111121
agg.taskMutex.Lock()
112122
taskIndex, ok := agg.batchesIdxByIdentifierHash[batchIdentifierHash]
@@ -118,5 +128,5 @@ func (agg *Aggregator) GetTaskIndex(batchIdentifierHash [32]byte) (uint32, error
118128
}
119129
}
120130

121-
return retry.RetryWithData(getTaskIndex_func, retry.MinDelay, retry.RetryFactor, retry.NumRetries, retry.MaxInterval, retry.MaxElapsedTime)
131+
return retry.RetryWithData(getTaskIndex_func, config)
122132
}

aggregator/pkg/telemetry.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ func (t *Telemetry) InitNewTrace(batchMerkleRoot [32]byte) {
6868
MerkleRoot: fmt.Sprintf("0x%s", hex.EncodeToString(batchMerkleRoot[:])),
6969
}
7070
if err := t.sendTelemetryMessage("/api/initTaskTrace", body); err != nil {
71-
t.logger.Error("[Telemetry] Error in InitNewTrace", "error", err)
71+
t.logger.Warn("[Telemetry] Error in InitNewTrace", "error", err)
7272
}
7373
}
7474

@@ -78,7 +78,7 @@ func (t *Telemetry) LogOperatorResponse(batchMerkleRoot [32]byte, operatorId [32
7878
OperatorId: fmt.Sprintf("0x%s", hex.EncodeToString(operatorId[:])),
7979
}
8080
if err := t.sendTelemetryMessage("/api/operatorResponse", body); err != nil {
81-
t.logger.Error("[Telemetry] Error in LogOperatorResponse", "error", err)
81+
t.logger.Warn("[Telemetry] Error in LogOperatorResponse", "error", err)
8282
}
8383
}
8484

@@ -87,7 +87,7 @@ func (t *Telemetry) LogQuorumReached(batchMerkleRoot [32]byte) {
8787
MerkleRoot: fmt.Sprintf("0x%s", hex.EncodeToString(batchMerkleRoot[:])),
8888
}
8989
if err := t.sendTelemetryMessage("/api/quorumReached", body); err != nil {
90-
t.logger.Error("[Telemetry] Error in LogQuorumReached", "error", err)
90+
t.logger.Warn("[Telemetry] Error in LogQuorumReached", "error", err)
9191
}
9292
}
9393

@@ -97,7 +97,7 @@ func (t *Telemetry) LogTaskError(batchMerkleRoot [32]byte, taskError error) {
9797
TaskError: taskError.Error(),
9898
}
9999
if err := t.sendTelemetryMessage("/api/taskError", body); err != nil {
100-
t.logger.Error("[Telemetry] Error in LogTaskError", "error", err)
100+
t.logger.Warn("[Telemetry] Error in LogTaskError", "error", err)
101101
}
102102
}
103103

@@ -107,7 +107,7 @@ func (t *Telemetry) BumpedTaskGasPrice(batchMerkleRoot [32]byte, bumpedGasPrice
107107
BumpedGasPrice: bumpedGasPrice,
108108
}
109109
if err := t.sendTelemetryMessage("/api/aggregatorTaskGasPriceBump", body); err != nil {
110-
t.logger.Error("[Telemetry] Error in LogOperatorResponse", "error", err)
110+
t.logger.Warn("[Telemetry] Error in LogOperatorResponse", "error", err)
111111
}
112112
}
113113

@@ -117,7 +117,7 @@ func (t *Telemetry) TaskSentToEthereum(batchMerkleRoot [32]byte, txHash string)
117117
TxHash: txHash,
118118
}
119119
if err := t.sendTelemetryMessage("/api/aggregatorTaskSent", body); err != nil {
120-
t.logger.Error("[Telemetry] Error in TaskSentToEthereum", "error", err)
120+
t.logger.Warn("[Telemetry] Error in TaskSentToEthereum", "error", err)
121121
}
122122
}
123123

@@ -129,15 +129,15 @@ func (t *Telemetry) FinishTrace(batchMerkleRoot [32]byte) {
129129
MerkleRoot: fmt.Sprintf("0x%s", hex.EncodeToString(batchMerkleRoot[:])),
130130
}
131131
if err := t.sendTelemetryMessage("/api/finishTaskTrace", body); err != nil {
132-
t.logger.Error("[Telemetry] Error in FinishTrace", "error", err)
132+
t.logger.Warn("[Telemetry] Error in FinishTrace", "error", err)
133133
}
134134
}()
135135
}
136136

137137
func (t *Telemetry) sendTelemetryMessage(endpoint string, message interface{}) error {
138138
encodedBody, err := json.Marshal(message)
139139
if err != nil {
140-
t.logger.Error("[Telemetry] Error marshalling JSON", "error", err)
140+
t.logger.Warn("[Telemetry] Error marshalling JSON", "error", err)
141141
return fmt.Errorf("error marshalling JSON: %w", err)
142142
}
143143

@@ -147,14 +147,14 @@ func (t *Telemetry) sendTelemetryMessage(endpoint string, message interface{}) e
147147

148148
resp, err := t.client.Post(fullURL.String(), "application/json", bytes.NewBuffer(encodedBody))
149149
if err != nil {
150-
t.logger.Error("[Telemetry] Error sending POST request", "error", err)
150+
t.logger.Warn("[Telemetry] Error sending POST request", "error", err)
151151
return fmt.Errorf("error making POST request: %w", err)
152152
}
153153
defer resp.Body.Close()
154154

155155
respBody, err := io.ReadAll(resp.Body)
156156
if err != nil {
157-
t.logger.Error("[Telemetry] Error reading response body", "error", err)
157+
t.logger.Warn("[Telemetry] Error reading response body", "error", err)
158158
return fmt.Errorf("error reading response body: %w", err)
159159
}
160160

0 commit comments

Comments
 (0)