@@ -14,6 +14,7 @@ import (
14
14
"github.com/filecoin-project/go-state-types/big"
15
15
stbuiltin "github.com/filecoin-project/go-state-types/builtin"
16
16
miner13 "github.com/filecoin-project/go-state-types/builtin/v13/miner"
17
+ miner14 "github.com/filecoin-project/go-state-types/builtin/v14/miner"
17
18
18
19
"github.com/filecoin-project/venus/venus-shared/actors/builtin/miner"
19
20
@@ -129,15 +130,21 @@ func (c CommitProcessor) Process(
129
130
130
131
ddoSectors := make ([]core.SectorState , 0 )
131
132
builtinMarketSectors := make ([]core.SectorState , 0 )
133
+ niporepSectors := make ([]core.SectorState , 0 )
132
134
for i := range sectors {
133
- if sectors [i ].HasBuiltinMarketDeal () {
135
+ if sectors [i ].SectorType .IsNonInteractive () {
136
+ niporepSectors = append (niporepSectors , sectors [i ])
137
+ } else if sectors [i ].HasBuiltinMarketDeal () {
134
138
builtinMarketSectors = append (builtinMarketSectors , sectors [i ])
135
139
} else {
136
140
ddoSectors = append (ddoSectors , sectors [i ])
137
141
}
138
142
}
139
143
140
144
aggregate := c .ShouldBatch (mid ) && len (sectors ) >= core .MinAggregatedSectors
145
+ if len (niporepSectors ) > 0 {
146
+ return c .ProcessNiPoRep (ctx , niporepSectors , mid , ctrlAddr , tok , nv , aggregate )
147
+ }
141
148
if nv >= MinDDONetworkVersion {
142
149
if err := c .ProcessV2 (ctx , ddoSectors , mid , ctrlAddr , tok , nv , aggregate ); err != nil {
143
150
return err
@@ -376,6 +383,135 @@ func (c CommitProcessor) ProcessV2(
376
383
return nil
377
384
}
378
385
386
+ func (c CommitProcessor ) ProcessNiPoRep (
387
+ ctx context.Context ,
388
+ sectors []core.SectorState ,
389
+ mid abi.ActorID ,
390
+ ctrlAddr address.Address ,
391
+ tok core.TipSetToken ,
392
+ nv network.Version ,
393
+ batch bool ,
394
+ ) error {
395
+ // Notice: If a sector in sectors has been sent, it's cid failed should be changed already.
396
+ plog := log .With ("proc" , "prove" , "miner" , mid , "ctrl" , ctrlAddr .String (), "len" , len (sectors ))
397
+
398
+ start := time .Now ()
399
+ defer func () {
400
+ plog .Infof ("finished process, elapsed %s" , time .Since (start ))
401
+ }()
402
+
403
+ defer updateSector (ctx , c .smgr , sectors , plog )
404
+
405
+ mcfg , err := c .config .MinerConfig (mid )
406
+ if err != nil {
407
+ return fmt .Errorf ("get miner config for %d: %w" , mid , err )
408
+ }
409
+
410
+ arp , err := c .aggregateProofType (nv )
411
+ if err != nil {
412
+ return fmt .Errorf ("get aggregate proof type: %w" , err )
413
+ }
414
+
415
+ infos := []core.AggregateSealVerifyInfo {}
416
+ sectorsMap := map [abi.SectorNumber ]core.SectorState {}
417
+ failed := map [abi.SectorID ]struct {}{}
418
+ actInfos := []miner14.SectorNIActivationInfo {}
419
+
420
+ collateral := big .Zero ()
421
+ for i , p := range sectors {
422
+ sectorsMap [p .ID .Number ] = sectors [i ]
423
+ expire , err := c .sectorExpiration (ctx , & p )
424
+ if err != nil {
425
+ plog .Errorf ("get sector expiration for %d failed: %s\n " , p .ID .Number , err )
426
+ failed [sectors [i ].ID ] = struct {}{}
427
+ continue
428
+ }
429
+
430
+ if mcfg .Commitment .Prove .SendFund {
431
+ sc , err := getSectorCollateral (ctx , c .api , mid , p .ID .Number , tok )
432
+ if err != nil {
433
+ plog .Errorf ("get sector collateral for %d failed: %s\n " , p .ID .Number , err )
434
+ failed [sectors [i ].ID ] = struct {}{}
435
+ continue
436
+ }
437
+
438
+ collateral = big .Add (collateral , sc )
439
+ }
440
+
441
+ infos = append (infos , core.AggregateSealVerifyInfo {
442
+ Number : p .ID .Number ,
443
+ Randomness : abi .SealRandomness (p .Ticket .Ticket ),
444
+ InteractiveRandomness : abi .InteractiveSealRandomness (p .Seed .Seed ),
445
+ SealedCID : p .Pre .CommR ,
446
+ UnsealedCID : p .Pre .CommD ,
447
+ })
448
+
449
+ actInfos [i ] = miner14.SectorNIActivationInfo {
450
+ SealingNumber : p .ID .Number ,
451
+ SealerID : mid ,
452
+ SealedCID : p .Pre .CommR ,
453
+ SectorNumber : p .ID .Number ,
454
+ SealRandEpoch : p .Seed .Epoch ,
455
+ Expiration : expire ,
456
+ }
457
+ }
458
+
459
+ if len (infos ) == 0 {
460
+ return nil
461
+ }
462
+
463
+ sort .Slice (infos , func (i , j int ) bool {
464
+ return infos [i ].Number < infos [j ].Number
465
+ })
466
+
467
+ sort .Slice (actInfos , func (i , j int ) bool {
468
+ return actInfos [i ].SealingNumber < actInfos [j ].SealingNumber
469
+ })
470
+
471
+ params := & miner14.ProveCommitSectorsNIParams {
472
+ Sectors : actInfos ,
473
+ SealProofType : sectorsMap [infos [0 ].Number ].SectorType ,
474
+ AggregateProofType : arp ,
475
+ ProvingDeadline : 7 ,
476
+ RequireActivationSuccess : true ,
477
+ }
478
+
479
+ proofs := make ([][]byte , 0 )
480
+ for i := range infos {
481
+ proofs = append (proofs , sectorsMap [infos [i ].Number ].Proof .Proof )
482
+ }
483
+
484
+ params .AggregateProof , err = c .prover .AggregateSealProofs (ctx , core.AggregateSealVerifyProofAndInfos {
485
+ Miner : mid ,
486
+ SealProof : sectorsMap [infos [0 ].Number ].SectorType ,
487
+ AggregateProof : arp ,
488
+ Infos : infos ,
489
+ }, proofs )
490
+
491
+ if err != nil {
492
+ return fmt .Errorf ("aggregate sector failed: %w" , err )
493
+ }
494
+
495
+ enc := new (bytes.Buffer )
496
+ if err := params .MarshalCBOR (enc ); err != nil {
497
+ return fmt .Errorf ("couldn't serialize ProveCommitAggregateParams: %w" , err )
498
+ }
499
+
500
+ ccid , err := pushMessage (ctx , ctrlAddr , mid , collateral , stbuiltin .MethodsMiner .ProveCommitSectorsNI ,
501
+ c .msgClient , & mcfg .Commitment .Prove .Batch .FeeConfig , enc .Bytes (), plog )
502
+ if err != nil {
503
+ return fmt .Errorf ("push aggregate prove message failed: %w" , err )
504
+ }
505
+
506
+ for i := range sectors {
507
+ if _ , ok := failed [sectors [i ].ID ]; ! ok {
508
+ sectors [i ].MessageInfo .CommitCid = & ccid
509
+ }
510
+ }
511
+
512
+ return nil
513
+ }
514
+
379
515
func (CommitProcessor ) aggregateProofType (nv network.Version ) (abi.RegisteredAggregationProof , error ) {
380
516
if nv < network .Version16 {
381
517
return abi .RegisteredAggregationProof_SnarkPackV1 , nil
0 commit comments