@@ -120,7 +120,7 @@ pub fn prove_commit_ni_whole_success_test(v: &dyn VM) {
120
120
}
121
121
. matches ( v. take_invocations ( ) . last ( ) . unwrap ( ) ) ;
122
122
123
- // Checks on sector state.
123
+ // Check sector state.
124
124
let sectors = sector_nos
125
125
. iter ( )
126
126
. map ( |sector_number| sector_info ( v, & maddr, * sector_number) )
@@ -253,7 +253,7 @@ pub fn prove_commit_ni_partial_success_not_required_test(v: &dyn VM) {
253
253
}
254
254
. matches ( v. take_invocations ( ) . last ( ) . unwrap ( ) ) ;
255
255
256
- // Checks on sector state.
256
+ // Check sector state.
257
257
invalid_sector_nos
258
258
. iter ( )
259
259
. for_each ( |sector_number| assert ! ( try_sector_info( v, & maddr, * sector_number) . is_none( ) ) ) ;
@@ -299,7 +299,7 @@ pub fn prove_commit_ni_partial_success_not_required_test(v: &dyn VM) {
299
299
300
300
submit_windowed_post ( v, & worker, & maddr, deadline_info, 0 , Some ( partition. unproven_power ) ) ;
301
301
302
- // Check if post is registered in deadline submissions
302
+ // Check if post is registered in deadline's optimistic submissions
303
303
let deadline = deadline_state ( v, & maddr, proving_deadline) ;
304
304
let submissions = deadline. optimistic_proofs_amt ( store) . unwrap ( ) ;
305
305
assert_eq ! ( submissions. count( ) , 1 ) ;
@@ -360,3 +360,153 @@ pub fn prove_commit_ni_partial_success_not_required_test(v: &dyn VM) {
360
360
assert ! ( partition. recoveries. is_empty( ) ) ;
361
361
}
362
362
}
363
+
364
+ #[ vm_test]
365
+ pub fn prove_commit_ni_next_deadline_post_required_test ( v : & dyn VM ) {
366
+ // Expectations depend on the correct unsealed CID for empty sector.
367
+ override_compute_unsealed_sector_cid ( v) ;
368
+ let addrs = create_accounts ( v, 3 , & TokenAmount :: from_whole ( 10_000 ) ) ;
369
+ let seal_proof = RegisteredSealProof :: StackedDRG32GiBV1P2_Feat_NiPoRep ;
370
+ let ( owner, worker, _, _) = ( addrs[ 0 ] , addrs[ 0 ] , addrs[ 1 ] , addrs[ 2 ] ) ;
371
+ let worker_id = worker. id ( ) . unwrap ( ) ;
372
+ let ( maddr, _) = create_miner (
373
+ v,
374
+ & owner,
375
+ & worker,
376
+ seal_proof. registered_window_post_proof ( ) . unwrap ( ) ,
377
+ & TokenAmount :: from_whole ( 8_000 ) ,
378
+ ) ;
379
+ let miner_id = maddr. id ( ) . unwrap ( ) ;
380
+ let policy = Policy :: default ( ) ;
381
+
382
+ // Onboard a single sector
383
+ let seal_rand_epoch = v. epoch ( ) ;
384
+ let activation_epoch = seal_rand_epoch + policy. max_prove_commit_ni_randomness_lookback / 2 ;
385
+ let expiration = activation_epoch + policy. min_sector_expiration + 1 ;
386
+ let sector_number: SectorNumber = 101 ;
387
+ let proving_deadline = 14 ;
388
+
389
+ let ni_sector_info = SectorNIActivationInfo {
390
+ sealing_number : sector_number,
391
+ sealer_id : miner_id,
392
+ sector_number,
393
+ sealed_cid : make_sealed_cid ( format ! ( "sn: {}" , sector_number) . as_bytes ( ) ) ,
394
+ seal_rand_epoch,
395
+ expiration,
396
+ } ;
397
+
398
+ // Prove-commit NI-PoRep
399
+ let aggregate_proof = RawBytes :: new ( vec ! [ 1 , 2 , 3 , 4 ] ) ;
400
+ let params = ProveCommitSectorsNIParams {
401
+ sectors : vec ! [ ni_sector_info. clone( ) ] ,
402
+ seal_proof_type : RegisteredSealProof :: StackedDRG32GiBV1P2_Feat_NiPoRep ,
403
+ aggregate_proof,
404
+ aggregate_proof_type : RegisteredAggregateProof :: SnarkPackV2 ,
405
+ proving_deadline,
406
+ require_activation_success : true ,
407
+ } ;
408
+
409
+ v. set_epoch ( activation_epoch) ;
410
+
411
+ let pcsni_ret: ProveCommitSectorsNIReturn = apply_ok (
412
+ v,
413
+ & worker,
414
+ & maddr,
415
+ & TokenAmount :: zero ( ) ,
416
+ MinerMethod :: ProveCommitSectorsNI as u64 ,
417
+ Some ( params. clone ( ) ) ,
418
+ )
419
+ . deserialize ( )
420
+ . unwrap ( ) ;
421
+
422
+ assert_eq ! ( pcsni_ret. activation_results. size( ) , 1 ) ;
423
+ assert ! ( pcsni_ret. activation_results. all_ok( ) ) ;
424
+ assert_eq ! ( pcsni_ret. activation_results. codes( ) , [ ExitCode :: OK ] ) ;
425
+
426
+ ExpectInvocation {
427
+ from : worker_id,
428
+ to : maddr,
429
+ method : MinerMethod :: ProveCommitSectorsNI as u64 ,
430
+ params : Some ( IpldBlock :: serialize_cbor ( & params) . unwrap ( ) ) ,
431
+ subinvocs : None ,
432
+ events : Some ( vec ! [ Expect :: build_sector_activation_event(
433
+ "sector-activated" ,
434
+ miner_id,
435
+ sector_number,
436
+ None ,
437
+ & vec![ ] ,
438
+ ) ] ) ,
439
+ ..Default :: default ( )
440
+ }
441
+ . matches ( v. take_invocations ( ) . last ( ) . unwrap ( ) ) ;
442
+
443
+ // Check sector state.
444
+ let on_chain_sector = sector_info ( v, & maddr, sector_number) ;
445
+ assert_eq ! ( ni_sector_info. sector_number, on_chain_sector. sector_number) ;
446
+ assert_eq ! ( params. seal_proof_type, on_chain_sector. seal_proof) ;
447
+ assert_eq ! ( ni_sector_info. sealed_cid, on_chain_sector. sealed_cid) ;
448
+ assert ! ( on_chain_sector. deprecated_deal_ids. is_empty( ) ) ;
449
+ assert_eq ! ( activation_epoch, on_chain_sector. activation) ;
450
+ assert_eq ! ( ni_sector_info. expiration, on_chain_sector. expiration) ;
451
+ assert_eq ! ( BigInt :: zero( ) , on_chain_sector. deal_weight) ;
452
+ assert_eq ! ( BigInt :: zero( ) , on_chain_sector. verified_deal_weight) ;
453
+ assert_eq ! ( activation_epoch, on_chain_sector. power_base_epoch) ;
454
+ assert ! ( on_chain_sector. flags. contains( SectorOnChainInfoFlags :: SIMPLE_QA_POWER ) ) ;
455
+
456
+ // Check if sector is properly assigned to the deadline
457
+ let deadline = deadline_state ( v, & maddr, proving_deadline) ;
458
+ assert_eq ! ( deadline. live_sectors, 1u64 ) ;
459
+
460
+ let store = & DynBlockstore :: wrap ( v. blockstore ( ) ) ;
461
+ let partition = deadline. load_partition ( store, 0 ) . unwrap ( ) ;
462
+ assert ! ( partition. sectors. get( sector_number) ) ;
463
+ assert ! ( partition. unproven. get( sector_number) ) ;
464
+
465
+ // Move past the first proving deadline while skipping window post submission
466
+ // and check if the sector is faulty
467
+ let deadline_info = advance_by_deadline_to_index ( v, & maddr, proving_deadline) ;
468
+ advance_by_deadline_to_epoch ( v, & maddr, deadline_info. close + policy. wpost_proving_period ) ;
469
+ let deadline = deadline_state ( v, & maddr, proving_deadline) ;
470
+ let partition = deadline. load_partition ( store, 0 ) . unwrap ( ) ;
471
+
472
+ assert ! ( partition. faults. get( sector_number) ) ;
473
+ assert ! ( partition. active_sectors( ) . is_empty( ) ) ;
474
+ assert ! ( partition. recoveries. is_empty( ) ) ;
475
+
476
+ // Recover faulty sectors
477
+ declare_recovery ( v, & worker, & maddr, proving_deadline, 0 , sector_number) ;
478
+ let deadline = deadline_state ( v, & maddr, proving_deadline) ;
479
+ let partition = deadline. load_partition ( store, 0 ) . unwrap ( ) ;
480
+ assert ! ( partition. faults. get( sector_number) ) ;
481
+ assert ! ( partition. recoveries. get( sector_number) ) ;
482
+
483
+ // Move to the next proving deadline and submit WindowPoSt
484
+ let deadline_info = advance_by_deadline_to_index ( v, & maddr, proving_deadline) ;
485
+ submit_windowed_post ( v, & worker, & maddr, deadline_info, 0 , None ) ;
486
+
487
+ // Move to next deadline and check if sectors are active
488
+ advance_by_deadline_to_index (
489
+ v,
490
+ & maddr,
491
+ proving_deadline + 1 % policy. wpost_proving_period as u64 ,
492
+ ) ;
493
+ let deadline = deadline_state ( v, & maddr, proving_deadline) ;
494
+ let partition = deadline. load_partition ( store, 0 ) . unwrap ( ) ;
495
+
496
+ assert ! ( partition. active_sectors( ) . get( sector_number) ) ;
497
+ assert ! ( partition. faults. is_empty( ) ) ;
498
+ assert ! ( partition. recoveries. is_empty( ) ) ;
499
+
500
+ // Move to the next proving deadline and submit WindowPoSt
501
+ let deadline_info = advance_by_deadline_to_index ( v, & maddr, proving_deadline) ;
502
+ let deadline = deadline_state ( v, & maddr, proving_deadline) ;
503
+ let submissions = deadline. optimistic_proofs_amt ( store) . unwrap ( ) ;
504
+ assert_eq ! ( submissions. count( ) , 0 ) ;
505
+
506
+ submit_windowed_post ( v, & worker, & maddr, deadline_info, 0 , Some ( partition. unproven_power ) ) ;
507
+
508
+ // Check if post is registered in deadline's optimistic submissions
509
+ let deadline = deadline_state ( v, & maddr, proving_deadline) ;
510
+ let submissions = deadline. optimistic_proofs_amt ( store) . unwrap ( ) ;
511
+ assert_eq ! ( submissions. count( ) , 1 ) ;
512
+ }
0 commit comments