Skip to content

Commit 5f855fc

Browse files
authored
Release v0.2.0 (#18)
* add sampling control in config * fix log * v0.2.0 * update metric name * fix docker compose build * cleanup * clean up * add verifier holesky deployment info
1 parent ec4238f commit 5f855fc

File tree

838 files changed

+236163
-17210
lines changed

Some content is hidden

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

838 files changed

+236163
-17210
lines changed

.env.example

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
TOPUP_PRIVATE_KEY= # required 4 ETH & 32 stETH
22
RPC_URL=http://localhost:8545
3-
HOLESKY_RPC_ENDPOINT=
3+
HOLESKY_RPC_URL=
44
FORK_BLOCK_NUMBER=1218852

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ contracts/broadcast/
77
!/broadcast
88
/broadcast/*/31337/
99
/broadcast/**/dry-run/
10+
contracts/scripts/output/
1011

1112
# Docs
1213
docs/
1314

1415
# Dotenv file
1516
.env
16-
config/operator_task_fetcher.offset
17+
config/
1718
.DS_Store
19+
/bin

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ The concept of a **TEE Quorum** aligns with the quorum definition utilized by Ei
133133
| BlsApkRegistry |[`0x2b6C2584760eDbcEC42391862f97dBB872b5e2Eb`](https://holesky.etherscan.io/address/0x2b6C2584760eDbcEC42391862f97dBB872b5e2Eb)|
134134
| IndexRegistry |[`0x158583f023ca440e79F199f037aa8b53b198F500`](https://holesky.etherscan.io/address/0x158583f023ca440e79F199f037aa8b53b198F500)|
135135
| OperatorStateRetriever | [`0xbfd43ac0a19c843e44491c3207ea13914818E214`](https://holesky.etherscan.io/address/0xbfd43ac0a19c843e44491c3207ea13914818E214) |
136-
| TEELivenessVerifier | [`0x63AED86c0c6Df1e60E01AAF9bcD39ad5cD2e3344`](https://holesky.etherscan.io/address/0x63AED86c0c6Df1e60E01AAF9bcD39ad5cD2e3344) |
136+
| TEELivenessVerifier | [`0x2E8628F6000Ef85dea615af6Da4Fd6dF4fD149e6`](https://holesky.etherscan.io/address/0x2E8628F6000Ef85dea615af6Da4Fd6dF4fD149e6)|
137137
| AutomataDcapV3Attestation | [`0x5669FE82711052e1A0EE16eafCDAb49ffe02ab14`](https://holesky.etherscan.io/address/0x5669FE82711052e1A0EE16eafCDAb49ffe02ab14) |
138138

139139
Please visit the [Operator setup](https://github.com/automata-network/multiprover-avs-operator-setup) repository if you are interested in joining the Multi-Prover AVS on Holesky testnet. The onboarding guide is available [here](https://atanetwork.notion.site/Automata-Multi-Prover-AVS-Testnet-Operator-Guide-48ad947de8404716b9e4e1e946618f08).

aggregator/aggregator.go

Lines changed: 155 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,25 @@ package aggregator
33
import (
44
"context"
55
"encoding/json"
6+
"fmt"
67
"net"
78
"net/http"
89
"os"
10+
"strings"
911
"sync"
1012
"time"
1113

12-
"github.com/Layr-Labs/eigensdk-go/chainio/clients"
13-
"github.com/Layr-Labs/eigensdk-go/services/avsregistry"
14-
blsagg "github.com/Layr-Labs/eigensdk-go/services/bls_aggregation"
15-
"github.com/Layr-Labs/eigensdk-go/types"
1614
"github.com/automata-network/multi-prover-avs/contracts/bindings"
1715
"github.com/automata-network/multi-prover-avs/contracts/bindings/MultiProverServiceManager"
16+
"github.com/automata-network/multi-prover-avs/contracts/bindings/RegistryCoordinator"
1817
"github.com/automata-network/multi-prover-avs/contracts/bindings/TEELivenessVerifier"
1918
"github.com/automata-network/multi-prover-avs/utils"
19+
"github.com/automata-network/multi-prover-avs/xmetric"
20+
"github.com/automata-network/multi-prover-avs/xtask"
21+
22+
"github.com/Layr-Labs/eigensdk-go/chainio/clients"
23+
"github.com/Layr-Labs/eigensdk-go/services/avsregistry"
24+
"github.com/Layr-Labs/eigensdk-go/types"
2025
"github.com/chzyer/logex"
2126
"github.com/ethereum/go-ethereum/accounts/abi/bind"
2227
"github.com/ethereum/go-ethereum/common"
@@ -29,36 +34,48 @@ type Config struct {
2934
ListenAddr string
3035
TimeToExpirySecs int
3136

32-
EcdsaPrivateKey string
33-
EthHttpEndpoint string
34-
EthWsEndpoint string
35-
AttestationLayerRpcURL string
36-
MultiProverContractAddress common.Address
37-
TEELivenessVerifierContractAddress common.Address
37+
EcdsaPrivateKey string
38+
EthHttpEndpoint string
39+
EthWsEndpoint string
40+
AttestationLayerRpcURL string
41+
MultiProverContractAddress common.Address
42+
TEELivenessVerifierContractAddressV1 common.Address
43+
TEELivenessVerifierContractAddress common.Address
3844

3945
AVSRegistryCoordinatorAddress common.Address
4046
OperatorStateRetrieverAddress common.Address
4147
EigenMetricsIpPortAddress string
4248
ScanStartBlock uint64
4349
Threshold uint64
50+
Sampling uint64
51+
52+
OpenTelemetry *xmetric.OpenTelemetryConfig
53+
54+
TaskFetcher []*xtask.TaskManagerConfig
4455

4556
Simulation bool
4657
}
4758

4859
type Aggregator struct {
4960
cfg *Config
5061

51-
blsAggregationService blsagg.BlsAggregationService
62+
blsAggregationService BlsAggregationService
5263
transactOpt *bind.TransactOpts
5364

65+
TaskManager *xtask.TaskManager
66+
5467
client *ethclient.Client
5568

56-
multiProverContract *MultiProverServiceManager.MultiProverServiceManager
57-
TEELivenessVerifier *TEELivenessVerifier.TEELivenessVerifierCaller
58-
registry *avsregistry.AvsRegistryServiceChainCaller
69+
multiProverContract *MultiProverServiceManager.MultiProverServiceManager
70+
TEELivenessVerifierV1 *TEELivenessVerifier.TEELivenessVerifierCaller
71+
TEELivenessVerifierV2 *TEELivenessVerifier.TEELivenessVerifierCaller
72+
registry *avsregistry.AvsRegistryServiceChainCaller
73+
registryCoordinator *RegistryCoordinator.RegistryCoordinator
5974

6075
eigenClients *clients.Clients
6176

77+
Collector *xmetric.AggregatorCollector
78+
6279
taskMutex sync.Mutex
6380
taskIndexSeq uint32
6481
taskIndexMap map[types.TaskResponseDigest]*Task
@@ -70,21 +87,25 @@ type Task struct {
7087
}
7188

7289
func NewAggregator(ctx context.Context, cfg *Config) (*Aggregator, error) {
90+
if cfg.Sampling == 0 {
91+
cfg.Sampling = 2000
92+
}
93+
logex.Info("Multi Prover Aggregator Initializing...")
7394
ecdsaPrivateKey, err := crypto.HexToECDSA(cfg.EcdsaPrivateKey)
7495
if err != nil {
7596
return nil, logex.Trace(err)
7697
}
7798
client, err := ethclient.Dial(cfg.EthHttpEndpoint)
7899
if err != nil {
79-
return nil, logex.Trace(err)
100+
return nil, logex.Trace(err, fmt.Sprintf("dial:%q", cfg.EthHttpEndpoint))
80101
}
81102
attestationClient, err := ethclient.Dial(cfg.AttestationLayerRpcURL)
82103
if err != nil {
83-
return nil, logex.Trace(err, cfg.AttestationLayerRpcURL)
104+
return nil, logex.Trace(err, fmt.Sprintf("connecting to AttestationLayerRpcURL:%q", cfg.AttestationLayerRpcURL))
84105
}
85106
chainId, err := client.ChainID(ctx)
86107
if err != nil {
87-
return nil, logex.Trace(err)
108+
return nil, logex.Trace(err, "fetch chainID")
88109
}
89110
transactOpt, err := bind.NewKeyedTransactorWithChainID(ecdsaPrivateKey, chainId)
90111
if err != nil {
@@ -106,18 +127,38 @@ func NewAggregator(ctx context.Context, cfg *Config) (*Aggregator, error) {
106127
return nil, logex.Trace(err)
107128
}
108129

109-
operatorPubkeysService, err := NewOperatorPubkeysService(ctx, client, eigenClients.AvsRegistryChainSubscriber, eigenClients.AvsRegistryChainReader, logger, "", cfg.ScanStartBlock, 5000)
130+
multiProverContract, err := MultiProverServiceManager.NewMultiProverServiceManager(cfg.MultiProverContractAddress, client)
110131
if err != nil {
111132
return nil, logex.Trace(err)
112133
}
113-
avsRegistryService := avsregistry.NewAvsRegistryServiceChainCaller(eigenClients.AvsRegistryChainReader, operatorPubkeysService, logger)
114-
blsAggregationService := blsagg.NewBlsAggregatorService(avsRegistryService, logger)
134+
teeLivenessVerifier, err := TEELivenessVerifier.NewTEELivenessVerifierCaller(cfg.TEELivenessVerifierContractAddress, attestationClient)
135+
if err != nil {
136+
return nil, logex.Trace(err)
137+
}
138+
var teeLivenessVerifierV1 *TEELivenessVerifier.TEELivenessVerifierCaller
139+
var emptyAddr common.Address
140+
if cfg.TEELivenessVerifierContractAddressV1 != emptyAddr {
141+
teeLivenessVerifierV1, err = TEELivenessVerifier.NewTEELivenessVerifierCaller(cfg.TEELivenessVerifierContractAddressV1, attestationClient)
142+
if err != nil {
143+
return nil, logex.Trace(err)
144+
}
145+
}
115146

116-
multiProverContract, err := MultiProverServiceManager.NewMultiProverServiceManager(cfg.MultiProverContractAddress, client)
147+
collector := xmetric.NewAggregatorCollector("avs")
148+
149+
taskManager, err := xtask.NewTaskManager(collector, int64(cfg.Sampling), eigenClients.EthHttpClient, cfg.TaskFetcher)
150+
if err != nil {
151+
return nil, logex.Trace(err)
152+
}
153+
154+
operatorPubkeysService, err := NewOperatorPubkeysService(ctx, client, eigenClients.AvsRegistryChainSubscriber, eigenClients.AvsRegistryChainReader, logger, "", cfg.ScanStartBlock, 5000)
117155
if err != nil {
118156
return nil, logex.Trace(err)
119157
}
120-
TEELivenessVerifier, err := TEELivenessVerifier.NewTEELivenessVerifierCaller(cfg.TEELivenessVerifierContractAddress, attestationClient)
158+
avsRegistryService := avsregistry.NewAvsRegistryServiceChainCaller(eigenClients.AvsRegistryChainReader, operatorPubkeysService, logger)
159+
blsAggregationService := NewBlsAggregatorService(avsRegistryService, logger)
160+
161+
registryCoordinator, err := RegistryCoordinator.NewRegistryCoordinator(cfg.AVSRegistryCoordinatorAddress, client)
121162
if err != nil {
122163
return nil, logex.Trace(err)
123164
}
@@ -126,14 +167,75 @@ func NewAggregator(ctx context.Context, cfg *Config) (*Aggregator, error) {
126167
cfg: cfg,
127168
transactOpt: transactOpt,
128169
client: client,
170+
eigenClients: eigenClients,
129171
blsAggregationService: blsAggregationService,
130172
multiProverContract: multiProverContract,
131-
TEELivenessVerifier: TEELivenessVerifier,
173+
TEELivenessVerifierV1: teeLivenessVerifierV1,
174+
TEELivenessVerifierV2: teeLivenessVerifier,
175+
registryCoordinator: registryCoordinator,
132176
registry: avsRegistryService,
177+
TaskManager: taskManager,
133178
taskIndexMap: make(map[types.Bytes32]*Task),
179+
Collector: collector,
134180
}, nil
135181
}
136182

183+
func (agg *Aggregator) startUpdateOperators(ctx context.Context) (func() error, error) {
184+
quorumNums := types.QuorumNums{0}
185+
blockNumber, err := agg.client.BlockNumber(ctx)
186+
if err != nil {
187+
return nil, logex.Trace(err)
188+
}
189+
states, err := agg.registry.GetOperatorsAvsStateAtBlock(ctx, quorumNums, uint32(blockNumber))
190+
if err != nil {
191+
return nil, logex.Trace(err)
192+
}
193+
var operators []common.Address
194+
for k := range states {
195+
operatorAddr, err := agg.eigenClients.AvsRegistryChainReader.GetOperatorFromId(nil, k)
196+
if err != nil {
197+
return nil, logex.Trace(err)
198+
}
199+
isRegistered, err := agg.eigenClients.AvsRegistryChainReader.IsOperatorRegistered(nil, operatorAddr)
200+
if err != nil {
201+
return nil, logex.Trace(err)
202+
}
203+
if isRegistered {
204+
operators = append(operators, operatorAddr)
205+
}
206+
}
207+
208+
newOpt := *agg.transactOpt
209+
newOpt.NoSend = true
210+
for i := 1; i < len(operators); i++ {
211+
tx, err := agg.registryCoordinator.UpdateOperators(&newOpt, operators[:i])
212+
if err != nil {
213+
return nil, logex.Trace(err)
214+
}
215+
logex.Infof("tx hash: %v -> %v", i, tx.Gas())
216+
}
217+
// logex.Info(states)
218+
return func() error { return nil }, nil
219+
}
220+
221+
func (agg *Aggregator) verifyKey(x [32]byte, y [32]byte) (bool, error) {
222+
if agg.TEELivenessVerifierV1 != nil {
223+
pass, err := agg.TEELivenessVerifierV1.VerifyLivenessProof(nil, x, y)
224+
if err != nil {
225+
return false, logex.Trace(err, "v1")
226+
}
227+
if pass {
228+
return true, nil
229+
}
230+
}
231+
232+
pass, err := agg.TEELivenessVerifierV2.VerifyLivenessProof(nil, x, y)
233+
if err != nil {
234+
return false, logex.Trace(err, "v2")
235+
}
236+
return pass, nil
237+
}
238+
137239
func (agg *Aggregator) startRpcServer(ctx context.Context) (func() error, error) {
138240
rpcSvr := rpc.NewServer()
139241
api := &AggregatorApi{
@@ -161,26 +263,42 @@ func (agg *Aggregator) startRpcServer(ctx context.Context) (func() error, error)
161263
}
162264

163265
func (agg *Aggregator) Start(ctx context.Context) error {
164-
isSimulation, err := agg.TEELivenessVerifier.Simulation(nil)
165-
if err != nil {
166-
return logex.Trace(err)
167-
}
168-
if isSimulation != agg.cfg.Simulation {
169-
return logex.NewErrorf("simulation mode not match with the contract: local:%v, remote:%v", agg.cfg.Simulation, isSimulation)
170-
}
266+
// serveUpdateTask, err := agg.startUpdateOperators(context.Background())
267+
// if err != nil {
268+
// return logex.Trace(err)
269+
// }
270+
// serveUpdateTask()
171271

172272
serveHttp, err := agg.startRpcServer(ctx)
173273
if err != nil {
174274
return logex.Trace(err)
175275
}
176276

177277
errChan := make(chan error)
278+
go func() {
279+
if err := xmetric.ExportMetricToOpenTelemetry(agg.cfg.OpenTelemetry, agg.Collector); err != nil {
280+
errChan <- logex.Trace(err)
281+
}
282+
}()
283+
284+
go func() {
285+
if err := agg.Collector.Serve(agg.cfg.EigenMetricsIpPortAddress); err != nil {
286+
errChan <- logex.Trace(err)
287+
}
288+
}()
289+
178290
go func() {
179291
if err := serveHttp(); err != nil {
180292
errChan <- logex.Trace(err)
181293
}
182294
}()
183295

296+
go func() {
297+
if err := agg.TaskManager.Run(ctx); err != nil {
298+
errChan <- logex.Trace(err)
299+
}
300+
}()
301+
184302
for {
185303
select {
186304
case response := <-agg.blsAggregationService.GetResponseChannel():
@@ -205,8 +323,8 @@ func (agg *Aggregator) submitStateHeader(ctx context.Context, req *TaskRequest)
205323
return logex.Trace(err)
206324
}
207325
if md.BatchId > 0 {
208-
if md.BatchId%2000 != 0 {
209-
logex.Info("[scroll] skip task: %#v", md)
326+
if md.BatchId%agg.cfg.Sampling != 0 {
327+
logex.Infof("[scroll] skip task: %#v", md)
210328
return nil
211329
}
212330
}
@@ -245,12 +363,14 @@ func (agg *Aggregator) submitStateHeader(ctx context.Context, req *TaskRequest)
245363
}
246364

247365
if err := agg.blsAggregationService.ProcessNewSignature(ctx, task.index, digest, req.Signature, req.OperatorId); err != nil {
248-
return logex.Trace(err)
366+
if !strings.Contains(err.Error(), "already completed") {
367+
return logex.Trace(err)
368+
}
249369
}
250370
return nil
251371
}
252372

253-
func (agg *Aggregator) sendAggregatedResponseToContract(ctx context.Context, task *Task, blsAggServiceResp blsagg.BlsAggregationServiceResponse) error {
373+
func (agg *Aggregator) sendAggregatedResponseToContract(ctx context.Context, task *Task, blsAggServiceResp BlsAggregationServiceResponse) error {
254374
if blsAggServiceResp.Err != nil {
255375
return logex.Trace(blsAggServiceResp.Err)
256376
}
@@ -287,6 +407,7 @@ func (agg *Aggregator) sendAggregatedResponseToContract(ctx context.Context, tas
287407
select {
288408
case <-ctx.Done():
289409
logex.Error(ctx.Err())
410+
return
290411
default:
291412
receipt, _ := agg.client.TransactionReceipt(ctx, tx.Hash())
292413
if receipt != nil {

0 commit comments

Comments
 (0)