Skip to content

Commit 77946c7

Browse files
authored
Merge pull request #16 from automata-network/dev
v0.1.3
2 parents 7fb90fc + 33a2474 commit 77946c7

File tree

1,863 files changed

+534177
-397
lines changed

Some content is hidden

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

1,863 files changed

+534177
-397
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@ docs/
1414
# Dotenv file
1515
.env
1616
config/operator_task_fetcher.offset
17+
.DS_Store

.gitmodules

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,6 @@
1717
path = sgx-prover
1818
url = [email protected]:automata-network/sgx-prover.git
1919
branch = avs
20+
[submodule "linea-sgx-prover"]
21+
path = linea-sgx-prover
22+
url = [email protected]:automata-network/linea-sgx-prover.git

README.md

Lines changed: 5 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -152,55 +152,16 @@ Please visit the [Operator setup](https://github.com/automata-network/multiprove
152152

153153
The Multi-Prover AVS will launch on mainnet soon, please be patient!
154154

155-
## Quick Start
155+
## Compile From Source
156156

157-
Steps for running the multi-prover-avs in simulation node(without the SGX prover):
157+
### Operator
158158

159-
1. Start a execution node
160159
```
161-
> anvil --fork-url ${holesky_rpc_endpoint} --fork-block-number 1218851
160+
go build -o out/operator ./cmd/operator
162161
```
163162

164-
2. Prepare the environment
165-
```
166-
> cp .env.example .env
167-
> # vim .env
168-
```
169-
170-
3. Deploy the avs contracts
171-
```
172-
> ./script/deploy.sh init_all --simulation
173-
> # this script will update the configure on config/operator.json and config/aggregator.json
174-
```
175-
176-
4. Run the aggregator
177-
```
178-
go run ./cmd/aggregator
179-
```
180-
181-
5. Run the operator
182-
```
183-
go run ./cmd/operator
184-
```
185-
186-
### With Docker compose
187-
188-
1. build image
189-
```
190-
> ./script/docker.sh build
191-
```
163+
### Aggregator
192164

193-
2. init state
194165
```
195-
> ./scripts/docker.sh init_state --simulation
196-
```
197-
198-
3. start aggregator & operator
199-
```
200-
> ./scripts/docker.sh run
201-
```
202-
203-
3. stop all
166+
go build -o out/aggregator ./cmd/aggregator
204167
```
205-
> ./scripts/docker.sh stop
206-
```

aggregator/aggregator.go

Lines changed: 57 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@ package aggregator
22

33
import (
44
"context"
5-
"math/big"
5+
"encoding/json"
66
"net"
77
"net/http"
88
"os"
99
"sync"
1010
"time"
1111

1212
"github.com/Layr-Labs/eigensdk-go/chainio/clients"
13-
"github.com/Layr-Labs/eigensdk-go/crypto/bls"
1413
"github.com/Layr-Labs/eigensdk-go/services/avsregistry"
1514
blsagg "github.com/Layr-Labs/eigensdk-go/services/bls_aggregation"
1615
"github.com/Layr-Labs/eigensdk-go/types"
16+
"github.com/automata-network/multi-prover-avs/contracts/bindings"
1717
"github.com/automata-network/multi-prover-avs/contracts/bindings/MultiProverServiceManager"
1818
"github.com/automata-network/multi-prover-avs/contracts/bindings/TEELivenessVerifier"
1919
"github.com/automata-network/multi-prover-avs/utils"
@@ -32,13 +32,15 @@ type Config struct {
3232
EcdsaPrivateKey string
3333
EthHttpEndpoint string
3434
EthWsEndpoint string
35+
AttestationLayerRpcURL string
3536
MultiProverContractAddress common.Address
3637
TEELivenessVerifierContractAddress common.Address
3738

3839
AVSRegistryCoordinatorAddress common.Address
3940
OperatorStateRetrieverAddress common.Address
4041
EigenMetricsIpPortAddress string
4142
ScanStartBlock uint64
43+
Threshold uint64
4244

4345
Simulation bool
4446
}
@@ -55,6 +57,8 @@ type Aggregator struct {
5557
TEELivenessVerifier *TEELivenessVerifier.TEELivenessVerifierCaller
5658
registry *avsregistry.AvsRegistryServiceChainCaller
5759

60+
eigenClients *clients.Clients
61+
5862
taskMutex sync.Mutex
5963
taskIndexSeq uint32
6064
taskIndexMap map[types.TaskResponseDigest]*Task
@@ -74,6 +78,10 @@ func NewAggregator(ctx context.Context, cfg *Config) (*Aggregator, error) {
7478
if err != nil {
7579
return nil, logex.Trace(err)
7680
}
81+
attestationClient, err := ethclient.Dial(cfg.AttestationLayerRpcURL)
82+
if err != nil {
83+
return nil, logex.Trace(err, cfg.AttestationLayerRpcURL)
84+
}
7785
chainId, err := client.ChainID(ctx)
7886
if err != nil {
7987
return nil, logex.Trace(err)
@@ -109,7 +117,7 @@ func NewAggregator(ctx context.Context, cfg *Config) (*Aggregator, error) {
109117
if err != nil {
110118
return nil, logex.Trace(err)
111119
}
112-
TEELivenessVerifier, err := TEELivenessVerifier.NewTEELivenessVerifierCaller(cfg.TEELivenessVerifierContractAddress, client)
120+
TEELivenessVerifier, err := TEELivenessVerifier.NewTEELivenessVerifierCaller(cfg.TEELivenessVerifierContractAddress, attestationClient)
113121
if err != nil {
114122
return nil, logex.Trace(err)
115123
}
@@ -181,7 +189,7 @@ func (agg *Aggregator) Start(ctx context.Context) error {
181189
delete(agg.taskIndexMap, response.TaskResponseDigest)
182190
agg.taskMutex.Unlock()
183191

184-
if err := agg.sendAggregatedResponseToContract(task, response); err != nil {
192+
if err := agg.sendAggregatedResponseToContract(ctx, task, response); err != nil {
185193
logex.Error(err)
186194
}
187195
case err := <-errChan:
@@ -191,10 +199,31 @@ func (agg *Aggregator) Start(ctx context.Context) error {
191199
}
192200

193201
func (agg *Aggregator) submitStateHeader(ctx context.Context, req *TaskRequest) error {
202+
if req.Task.Identifier.ToInt().Int64() == 1 {
203+
var md Metadata
204+
if err := json.Unmarshal([]byte(req.Task.Metadata), &md); err != nil {
205+
return logex.Trace(err)
206+
}
207+
if md.BatchId > 0 {
208+
if md.BatchId%2000 != 0 {
209+
logex.Info("[scroll] skip task: %#v", md)
210+
return nil
211+
}
212+
}
213+
}
194214
digest, err := req.Task.Digest()
195215
if err != nil {
196216
return logex.Trace(err)
197217
}
218+
219+
quorumNumbers := make([]types.QuorumNum, len(req.Task.QuorumNumbers))
220+
quorumThresholdPercentages := make([]types.QuorumThresholdPercentage, len(req.Task.QuorumThresholdPercentages))
221+
for i, qn := range req.Task.QuorumNumbers {
222+
quorumNumbers[i] = types.QuorumNum(qn)
223+
quorumThresholdPercentages[i] = types.QuorumThresholdPercentage(agg.cfg.Threshold)
224+
}
225+
req.Task.QuorumThresholdPercentages = types.QuorumThresholdPercentages(quorumThresholdPercentages).UnderlyingType()
226+
198227
agg.taskMutex.Lock()
199228
task, ok := agg.taskIndexMap[digest]
200229
if !ok {
@@ -209,16 +238,7 @@ func (agg *Aggregator) submitStateHeader(ctx context.Context, req *TaskRequest)
209238

210239
if !ok {
211240
timeToExpiry := time.Duration(agg.cfg.TimeToExpirySecs) * time.Second
212-
sh := req.Task
213-
quorumNumbers := make([]types.QuorumNum, len(sh.QuorumNumbers))
214-
quorumThresholdPercentages := make([]types.QuorumThresholdPercentage, len(sh.QuorumThresholdPercentages))
215-
for i, qn := range sh.QuorumNumbers {
216-
quorumNumbers[i] = types.QuorumNum(qn)
217-
}
218-
for i, qn := range sh.QuorumThresholdPercentages {
219-
quorumThresholdPercentages[i] = types.QuorumThresholdPercentage(qn)
220-
}
221-
err = agg.blsAggregationService.InitializeNewTask(task.index, sh.ReferenceBlockNumber, quorumNumbers, quorumThresholdPercentages, timeToExpiry)
241+
err = agg.blsAggregationService.InitializeNewTask(task.index, req.Task.ReferenceBlockNumber, quorumNumbers, quorumThresholdPercentages, timeToExpiry)
222242
if err != nil {
223243
return logex.Trace(err)
224244
}
@@ -230,24 +250,24 @@ func (agg *Aggregator) submitStateHeader(ctx context.Context, req *TaskRequest)
230250
return nil
231251
}
232252

233-
func (agg *Aggregator) sendAggregatedResponseToContract(task *Task, blsAggServiceResp blsagg.BlsAggregationServiceResponse) error {
253+
func (agg *Aggregator) sendAggregatedResponseToContract(ctx context.Context, task *Task, blsAggServiceResp blsagg.BlsAggregationServiceResponse) error {
234254
if blsAggServiceResp.Err != nil {
235255
return logex.Trace(blsAggServiceResp.Err)
236256
}
237257

238258
nonSignerPubkeys := []MultiProverServiceManager.BN254G1Point{}
239259
for _, nonSignerPubkey := range blsAggServiceResp.NonSignersPubkeysG1 {
240-
nonSignerPubkeys = append(nonSignerPubkeys, ConvertToBN254G1Point(nonSignerPubkey))
260+
nonSignerPubkeys = append(nonSignerPubkeys, bindings.ConvertToBN254G1Point(nonSignerPubkey))
241261
}
242262
quorumApks := []MultiProverServiceManager.BN254G1Point{}
243263
for _, quorumApk := range blsAggServiceResp.QuorumApksG1 {
244-
quorumApks = append(quorumApks, ConvertToBN254G1Point(quorumApk))
264+
quorumApks = append(quorumApks, bindings.ConvertToBN254G1Point(quorumApk))
245265
}
246266
nonSignerStakesAndSignature := MultiProverServiceManager.IBLSSignatureCheckerNonSignerStakesAndSignature{
247267
NonSignerPubkeys: nonSignerPubkeys,
248268
QuorumApks: quorumApks,
249-
ApkG2: ConvertToBN254G2Point(blsAggServiceResp.SignersApkG2),
250-
Sigma: ConvertToBN254G1Point(blsAggServiceResp.SignersAggSigG1.G1Point),
269+
ApkG2: bindings.ConvertToBN254G2Point(blsAggServiceResp.SignersApkG2),
270+
Sigma: bindings.ConvertToBN254G1Point(blsAggServiceResp.SignersAggSigG1.G1Point),
251271
NonSignerQuorumBitmapIndices: blsAggServiceResp.NonSignerQuorumBitmapIndices,
252272
QuorumApkIndices: blsAggServiceResp.QuorumApkIndices,
253273
TotalStakeIndices: blsAggServiceResp.TotalStakeIndices,
@@ -260,21 +280,23 @@ func (agg *Aggregator) sendAggregatedResponseToContract(task *Task, blsAggServic
260280
}
261281
logex.Pretty(task.state.Task)
262282
logex.Infof("confirm state: %v", tx.Hash())
283+
go func() {
284+
ctx, cancel := context.WithTimeout(ctx, 300*time.Second)
285+
defer cancel()
286+
for {
287+
select {
288+
case <-ctx.Done():
289+
logex.Error(ctx.Err())
290+
default:
291+
receipt, _ := agg.client.TransactionReceipt(ctx, tx.Hash())
292+
if receipt != nil {
293+
logex.Infof("tx commited: %v, gas used: %v, success: %v", tx.Hash(), receipt.GasUsed, receipt.Status == 1)
294+
return
295+
}
296+
time.Sleep(3 * time.Second)
297+
continue
298+
}
299+
}
300+
}()
263301
return nil
264302
}
265-
266-
func ConvertToBN254G1Point(input *bls.G1Point) MultiProverServiceManager.BN254G1Point {
267-
output := MultiProverServiceManager.BN254G1Point{
268-
X: input.X.BigInt(big.NewInt(0)),
269-
Y: input.Y.BigInt(big.NewInt(0)),
270-
}
271-
return output
272-
}
273-
274-
func ConvertToBN254G2Point(input *bls.G2Point) MultiProverServiceManager.BN254G2Point {
275-
output := MultiProverServiceManager.BN254G2Point{
276-
X: [2]*big.Int{input.X.A1.BigInt(big.NewInt(0)), input.X.A0.BigInt(big.NewInt(0))},
277-
Y: [2]*big.Int{input.Y.A1.BigInt(big.NewInt(0)), input.Y.A0.BigInt(big.NewInt(0))},
278-
}
279-
return output
280-
}

aggregator/aggregator_api.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func (a *AggregatorApi) submitTask(ctx context.Context, req *TaskRequest) error
6565
return logex.Trace(err)
6666
}
6767
if !pass {
68-
return logex.NewErrorf("prover not registered")
68+
return logex.NewErrorf("prover[%v] not registered", req.OperatorId)
6969
}
7070

7171
if err := a.agg.submitStateHeader(ctx, req); err != nil {

aggregator/client.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ type Client struct {
1717
}
1818

1919
func NewClient(endpoint string) (*Client, error) {
20+
logex.Infof("connecting to aggregator: %v", endpoint)
2021
client, err := rpc.Dial(endpoint)
2122
if err != nil {
2223
return nil, logex.Trace(err)
@@ -26,6 +27,12 @@ func NewClient(endpoint string) (*Client, error) {
2627
}, nil
2728
}
2829

30+
type Metadata struct {
31+
BatchId uint64 `json:"batch_id,omitempty"`
32+
StartBlock uint64 `json:"start_block"`
33+
EndBlock uint64 `json:"end_block"`
34+
}
35+
2936
type TaskRequest struct {
3037
Task *StateHeader
3138
Signature *bls.Signature
@@ -43,7 +50,7 @@ type StateHeader struct {
4350

4451
func (s *StateHeader) ToAbi() *bindings.StateHeader {
4552
return &bindings.StateHeader{
46-
Identifier: new(big.Int).Set((*big.Int)(s.Identifier)),
53+
CommitteeId: new(big.Int).Set((*big.Int)(s.Identifier)),
4754
Metadata: []byte(s.Metadata),
4855
State: []byte(s.State),
4956
QuorumNumbers: []byte(s.QuorumNumbers),

cmd/abigen/main.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,23 @@ import (
1010
)
1111

1212
func main() {
13-
if err := gen("contracts/bindings", "contracts/out/", "MultiProverServiceManager"); err != nil {
13+
target := "contracts/bindings"
14+
if err := gen(target, "contracts/out/", "MultiProverServiceManager"); err != nil {
1415
logex.Fatal(err)
1516
}
16-
if err := gen("contracts/bindings", "contracts/dcap-v3-attestation/out/", "AutomataDcapV3Attestation"); err != nil {
17+
if err := gen(target, "contracts/dcap-v3-attestation/out/", "AutomataDcapV3Attestation"); err != nil {
1718
logex.Fatal(err)
1819
}
19-
if err := gen("contracts/bindings", "contracts/out/", "TEELivenessVerifier"); err != nil {
20+
if err := gen(target, "contracts/out/", "TEELivenessVerifier"); err != nil {
21+
logex.Fatal(err)
22+
}
23+
if err := gen(target, "contracts/out/", "BLSApkRegistry"); err != nil {
24+
logex.Fatal(err)
25+
}
26+
if err := gen(target, "contracts/out/", "RegistryCoordinator"); err != nil {
27+
logex.Fatal(err)
28+
}
29+
if err := gen(target, "contracts/out/ERC20", "ERC20"); err != nil {
2030
logex.Fatal(err)
2131
}
2232
}

cmd/aggregator/Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ COPY contracts/bindings ./contracts/bindings
1212
COPY utils ./utils
1313
COPY go.mod ./
1414
COPY go.sum ./
15+
COPY vendor ./vendor
1516

1617

1718
RUN go build -o ./bin/aggregator ./cmd/aggregator

cmd/operator/Dockerfile

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,16 @@ COPY contracts/bindings ./contracts/bindings
1313
COPY utils ./utils
1414
COPY go.mod ./
1515
COPY go.sum ./
16+
COPY vendor ./vendor
1617

18+
ARG BUILD_TAG
19+
ARG GIT_COMMIT
20+
ARG GIT_DATE
21+
ENV BUILD_TAG $BUILD_TAG
22+
ENV GIT_COMMIT $GIT_COMMIT
23+
ENV GIT_DATE $GIT_DATE
1724

18-
RUN go build -o ./bin/operator ./cmd/operator
25+
RUN go build -ldflags "-X main.SemVer=${BUILD_TAG} -X main.GitCommit=${GIT_COMMIT} -X main.GitDate=${GIT_DATE}" -o ./bin/operator ./cmd/operator
1926

2027
FROM alpine:3.18
2128

0 commit comments

Comments
 (0)