Skip to content

Commit 5098172

Browse files
ToniRamirezMStefan-Ethernaljoanestebanr
authored
feat: move witness generation outside mutex (#311)
* move witness generation outside mutex * linter * getWitness function * add logs * fix: update Kurtosis CDK references and Docker images (#310) --------- Co-authored-by: joanestebanr <129153821+joanestebanr@users.noreply.github.com> --------- Co-authored-by: Stefan Negovanović <93934272+Stefan-Ethernal@users.noreply.github.com> Co-authored-by: joanestebanr <129153821+joanestebanr@users.noreply.github.com>
1 parent df3ecb7 commit 5098172

File tree

1 file changed

+50
-41
lines changed

1 file changed

+50
-41
lines changed

aggregator/aggregator.go

Lines changed: 50 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,7 +1053,7 @@ func (a *Aggregator) getVerifiedBatchAccInputHash(ctx context.Context, batchNumb
10531053

10541054
func (a *Aggregator) getAndLockBatchToProve(
10551055
ctx context.Context, prover ProverInterface,
1056-
) (*state.Batch, []byte, *state.Proof, error) {
1056+
) (*state.Batch, *state.Proof, error) {
10571057
proverID := prover.ID()
10581058
proverName := prover.Name()
10591059

@@ -1069,7 +1069,7 @@ func (a *Aggregator) getAndLockBatchToProve(
10691069
// Get last virtual batch number from L1
10701070
lastVerifiedBatchNumber, err := a.etherman.GetLatestVerifiedBatchNum()
10711071
if err != nil {
1072-
return nil, nil, nil, err
1072+
return nil, nil, err
10731073
}
10741074

10751075
proofExists := true
@@ -1082,7 +1082,7 @@ func (a *Aggregator) getAndLockBatchToProve(
10821082
if err != nil {
10831083
tmpLogger.Infof("Error checking proof exists for batch %d", batchNumberToVerify)
10841084

1085-
return nil, nil, nil, err
1085+
return nil, nil, err
10861086
}
10871087

10881088
if proofExists {
@@ -1094,7 +1094,7 @@ func (a *Aggregator) getAndLockBatchToProve(
10941094
err := a.storage.CleanupGeneratedProofs(ctx, math.MaxInt, nil)
10951095
if err != nil {
10961096
tmpLogger.Infof("Error cleaning up generated proofs for batch %d", batchNumberToVerify)
1097-
return nil, nil, nil, err
1097+
return nil, nil, err
10981098
}
10991099
batchNumberToVerify--
11001100
break
@@ -1105,38 +1105,45 @@ func (a *Aggregator) getAndLockBatchToProve(
11051105
// Check if the batch has been sequenced
11061106
sequence, err := a.l1Syncr.GetSequenceByBatchNumber(ctx, batchNumberToVerify)
11071107
if err != nil && !errors.Is(err, entities.ErrNotFound) {
1108-
return nil, nil, nil, err
1108+
return nil, nil, err
11091109
}
11101110

11111111
// Not found, so it it not possible to verify the batch yet
11121112
if sequence == nil || errors.Is(err, entities.ErrNotFound) {
11131113
tmpLogger.Infof("Sequencing event for batch %d has not been synced yet, "+
11141114
"so it is not possible to verify it yet. Waiting ...", batchNumberToVerify)
11151115

1116-
return nil, nil, nil, state.ErrNotFound
1116+
return nil, nil, state.ErrNotFound
11171117
}
11181118

11191119
stateSequence := state.Sequence{
11201120
FromBatchNumber: sequence.FromBatchNumber,
11211121
ToBatchNumber: sequence.ToBatchNumber,
11221122
}
11231123

1124+
// Store the sequence in aggregator DB
1125+
err = a.storage.AddSequence(ctx, stateSequence, nil)
1126+
if err != nil {
1127+
tmpLogger.Infof("Error storing sequence for batch %d", batchNumberToVerify)
1128+
return nil, nil, err
1129+
}
1130+
11241131
// Get Batch from L1 Syncer
11251132
virtualBatch, err := a.l1Syncr.GetVirtualBatchByBatchNumber(a.ctx, batchNumberToVerify)
11261133
if err != nil && !errors.Is(err, entities.ErrNotFound) {
11271134
a.logger.Errorf("Error getting virtual batch: %v", err)
1128-
return nil, nil, nil, err
1135+
return nil, nil, err
11291136
} else if errors.Is(err, entities.ErrNotFound) {
11301137
a.logger.Infof("Virtual batch %d has not been synced yet, "+
11311138
"so it is not possible to verify it yet. Waiting ...", batchNumberToVerify)
1132-
return nil, nil, nil, state.ErrNotFound
1139+
return nil, nil, state.ErrNotFound
11331140
}
11341141

11351142
// Get Batch from RPC
11361143
rpcBatch, err := a.rpcClient.GetBatch(batchNumberToVerify)
11371144
if err != nil {
11381145
a.logger.Errorf("error getting batch %d from RPC: %v.", batchNumberToVerify, err)
1139-
return nil, nil, nil, err
1146+
return nil, nil, err
11401147
}
11411148

11421149
// Compare BatchL2Data from virtual batch and rpcBatch (skipping injected batch (1))
@@ -1157,7 +1164,7 @@ func (a *Aggregator) getAndLockBatchToProve(
11571164
oldAccInputHash := a.getAccInputHash(batchNumberToVerify - 1)
11581165
if oldAccInputHash == (common.Hash{}) && batchNumberToVerify > 1 {
11591166
tmpLogger.Warnf("AccInputHash for previous batch (%d) is not in memory. Waiting ...", batchNumberToVerify-1)
1160-
return nil, nil, nil, state.ErrNotFound
1167+
return nil, nil, state.ErrNotFound
11611168
}
11621169

11631170
forcedBlockHashL1 := rpcBatch.ForcedBlockHashL1()
@@ -1167,7 +1174,7 @@ func (a *Aggregator) getAndLockBatchToProve(
11671174
l1Block, err := a.l1Syncr.GetL1BlockByNumber(ctx, virtualBatch.BlockNumber)
11681175
if err != nil {
11691176
a.logger.Errorf("Error getting l1 block: %v", err)
1170-
return nil, nil, nil, err
1177+
return nil, nil, err
11711178
}
11721179

11731180
forcedBlockHashL1 = l1Block.ParentHash
@@ -1213,34 +1220,9 @@ func (a *Aggregator) getAndLockBatchToProve(
12131220
ForkID: a.cfg.ForkId,
12141221
}
12151222

1216-
// Request the witness from the server, if it is busy just keep looping until it is available
1217-
start := time.Now()
1218-
witness, err := a.rpcClient.GetWitness(batchNumberToVerify, a.cfg.UseFullWitness)
1219-
for err != nil {
1220-
if errors.Is(err, rpc.ErrBusy) {
1221-
a.logger.Debugf(
1222-
"Witness server is busy, retrying get witness for batch %d in %v",
1223-
batchNumberToVerify, a.cfg.RetryTime.Duration,
1224-
)
1225-
} else {
1226-
a.logger.Errorf("Failed to get witness for batch %d, err: %v", batchNumberToVerify, err)
1227-
}
1228-
time.Sleep(a.cfg.RetryTime.Duration)
1229-
witness, err = a.rpcClient.GetWitness(batchNumberToVerify, a.cfg.UseFullWitness)
1230-
}
1231-
end := time.Now()
1232-
a.logger.Debugf("Time to get witness for batch %d: %v", batchNumberToVerify, end.Sub(start))
1233-
1234-
// Store the sequence in aggregator DB
1235-
err = a.storage.AddSequence(ctx, stateSequence, nil)
1236-
if err != nil {
1237-
tmpLogger.Infof("Error storing sequence for batch %d", batchNumberToVerify)
1238-
1239-
return nil, nil, nil, err
1240-
}
1241-
12421223
// All the data required to generate a proof is ready
1243-
tmpLogger.Infof("All information to generate proof for batch %d is ready", virtualBatch.BatchNumber)
1224+
tmpLogger.Infof("All information to generate proof for batch %d is ready. "+
1225+
"Witness will be requested.", virtualBatch.BatchNumber)
12441226
tmpLogger = tmpLogger.WithFields("batch", virtualBatch.BatchNumber)
12451227

12461228
now := time.Now().Round(time.Microsecond)
@@ -1257,10 +1239,10 @@ func (a *Aggregator) getAndLockBatchToProve(
12571239
if err != nil {
12581240
tmpLogger.Errorf("Failed to add batch proof to DB for batch %d, err: %v", virtualBatch.BatchNumber, err)
12591241

1260-
return nil, nil, nil, err
1242+
return nil, nil, err
12611243
}
12621244

1263-
return stateBatch, witness, proof, nil
1245+
return stateBatch, proof, nil
12641246
}
12651247

12661248
func (a *Aggregator) tryGenerateBatchProof(ctx context.Context, prover ProverInterface) (bool, error) {
@@ -1271,7 +1253,7 @@ func (a *Aggregator) tryGenerateBatchProof(ctx context.Context, prover ProverInt
12711253
)
12721254
tmpLogger.Debug("tryGenerateBatchProof start")
12731255

1274-
batchToProve, witness, proof, err0 := a.getAndLockBatchToProve(ctx, prover)
1256+
batchToProve, proof, err0 := a.getAndLockBatchToProve(ctx, prover)
12751257
if errors.Is(err0, state.ErrNotFound) || errors.Is(err0, entities.ErrNotFound) {
12761258
// nothing to proof, swallow the error
12771259
tmpLogger.Debug("Nothing to generate proof")
@@ -1281,6 +1263,11 @@ func (a *Aggregator) tryGenerateBatchProof(ctx context.Context, prover ProverInt
12811263
return false, err0
12821264
}
12831265

1266+
// Request Witness
1267+
tmpLogger.Infof("Requesting witness for batch %d", batchToProve.BatchNumber)
1268+
witness := a.getWitness(batchToProve.BatchNumber)
1269+
tmpLogger.Infof("Witness received for batch %d", batchToProve.BatchNumber)
1270+
12841271
tmpLogger = tmpLogger.WithFields("batch", batchToProve.BatchNumber)
12851272

12861273
var (
@@ -1362,6 +1349,28 @@ func (a *Aggregator) tryGenerateBatchProof(ctx context.Context, prover ProverInt
13621349
return true, nil
13631350
}
13641351

1352+
func (a *Aggregator) getWitness(batchNumber uint64) []byte {
1353+
// Request the witness from the server, if it is busy just keep looping until it is available
1354+
start := time.Now()
1355+
witness, err := a.rpcClient.GetWitness(batchNumber, a.cfg.UseFullWitness)
1356+
for err != nil {
1357+
if errors.Is(err, rpc.ErrBusy) {
1358+
a.logger.Debugf(
1359+
"Witness server is busy, retrying get witness for batch %d in %v",
1360+
batchNumber, a.cfg.RetryTime.Duration,
1361+
)
1362+
} else {
1363+
a.logger.Errorf("Failed to get witness for batch %d, err: %v", batchNumber, err)
1364+
}
1365+
time.Sleep(a.cfg.RetryTime.Duration)
1366+
witness, err = a.rpcClient.GetWitness(batchNumber, a.cfg.UseFullWitness)
1367+
}
1368+
end := time.Now()
1369+
a.logger.Debugf("Time to get witness for batch %d: %v", batchNumber, end.Sub(start))
1370+
1371+
return witness
1372+
}
1373+
13651374
func (a *Aggregator) performSanityChecks(tmpLogger *log.Logger, stateRoot, accInputHash common.Hash,
13661375
batchToProve *state.Batch) {
13671376
// Sanity Check: state root from the proof must match the one from the batch

0 commit comments

Comments
 (0)