@@ -3,7 +3,7 @@ use fvm_ipld_encoding::ipld_block::IpldBlock;
33use fvm_ipld_encoding:: RawBytes ;
44use fvm_shared:: bigint:: BigInt ;
55use fvm_shared:: econ:: TokenAmount ;
6- use fvm_shared:: sector:: { RegisteredSealProof , SectorNumber } ;
6+ use fvm_shared:: sector:: { RegisteredAggregateProof , RegisteredSealProof , SectorNumber } ;
77use log:: info;
88use num_traits:: Zero ;
99
@@ -113,3 +113,98 @@ pub fn prove_commit_sectors_niporep_test(v: &dyn VM) {
113113 assert ! ( on_chain_sector. flags. contains( SectorOnChainInfoFlags :: SIMPLE_QA_POWER ) ) ;
114114 }
115115}
116+
117+ #[ vm_test]
118+ pub fn prove_commit_sectors_aggregate_niporep_test ( v : & dyn VM ) {
119+ // Expectations depend on the correct unsealed CID for empty sector.
120+ override_compute_unsealed_sector_cid ( v) ;
121+ let addrs = create_accounts ( v, 3 , & TokenAmount :: from_whole ( 10_000 ) ) ;
122+ let seal_proof = RegisteredSealProof :: StackedDRG32GiBV1P1_Feat_NiPoRep ;
123+ let ( owner, worker, _, _) = ( addrs[ 0 ] , addrs[ 0 ] , addrs[ 1 ] , addrs[ 2 ] ) ;
124+ let worker_id = worker. id ( ) . unwrap ( ) ;
125+ let ( maddr, _) = create_miner (
126+ v,
127+ & owner,
128+ & worker,
129+ seal_proof. registered_window_post_proof ( ) . unwrap ( ) ,
130+ & TokenAmount :: from_whole ( 8_000 ) ,
131+ ) ;
132+ let miner_id = maddr. id ( ) . unwrap ( ) ;
133+
134+ // Onboard a batch of sectors
135+ let expiration = v. epoch ( ) + 2 * EPOCHS_IN_YEAR ;
136+ let seal_rand_epoch = v. epoch ( ) - 1 ;
137+ let first_sector_number: SectorNumber = 100 ;
138+ let manifests = vec ! [
139+ first_sector_number,
140+ first_sector_number + 1 ,
141+ first_sector_number + 2 ,
142+ first_sector_number + 3 ,
143+ first_sector_number + 4 ,
144+ ] ;
145+
146+ let sectors_info: Vec < SectorNIActivationInfo > = manifests
147+ . iter ( )
148+ . map ( |sector_number| SectorNIActivationInfo {
149+ sealing_number : * sector_number,
150+ sealer_id : miner_id,
151+ sector_number : * sector_number,
152+ sealed_cid : make_sealed_cid ( format ! ( "sn: {}" , sector_number) . as_bytes ( ) ) ,
153+ seal_rand_epoch,
154+ expiration,
155+ } )
156+ . collect ( ) ;
157+
158+ // Prove-commit NI-PoRep
159+ let aggregate_proof = RawBytes :: new ( vec ! [ 1 , 2 , 3 , 4 ] ) ;
160+ let params = ProveCommitSectorsNIParams {
161+ sectors : sectors_info. clone ( ) ,
162+ seal_proof_type : RegisteredSealProof :: StackedDRG32GiBV1P1_Feat_NiPoRep ,
163+ sector_proofs : Vec :: new ( ) ,
164+ aggregate_proof,
165+ aggregate_proof_type : Some ( RegisteredAggregateProof :: SnarkPackV2 ) ,
166+ require_activation_success : true ,
167+ } ;
168+
169+ let activation_epoch = v. epoch ( ) + EPOCHS_IN_YEAR / 2 ;
170+ v. set_epoch ( activation_epoch) ;
171+
172+ apply_ok (
173+ v,
174+ & worker,
175+ & maddr,
176+ & TokenAmount :: zero ( ) ,
177+ MinerMethod :: ProveCommitSectorsNI as u64 ,
178+ Some ( params. clone ( ) ) ,
179+ ) ;
180+
181+ ExpectInvocation {
182+ from : worker_id,
183+ to : maddr,
184+ method : MinerMethod :: ProveCommitSectorsNI as u64 ,
185+ params : Some ( IpldBlock :: serialize_cbor ( & params) . unwrap ( ) ) ,
186+ subinvocs : None ,
187+ events : Vec :: new ( ) ,
188+ ..Default :: default ( )
189+ }
190+ . matches ( v. take_invocations ( ) . last ( ) . unwrap ( ) ) ;
191+
192+ // Checks on sector state.
193+ let sectors = manifests
194+ . iter ( )
195+ . map ( |sector_number| sector_info ( v, & maddr, * sector_number) )
196+ . collect :: < Vec < _ > > ( ) ;
197+ info ! ( "sectors: {:#?}" , sectors) ;
198+ for ( on_chain_sector, input_sector) in sectors. iter ( ) . zip ( sectors_info) {
199+ assert_eq ! ( input_sector. sector_number, on_chain_sector. sector_number) ;
200+ assert_eq ! ( params. seal_proof_type, on_chain_sector. seal_proof) ;
201+ assert_eq ! ( input_sector. sealed_cid, on_chain_sector. sealed_cid) ;
202+ assert ! ( on_chain_sector. deprecated_deal_ids. is_empty( ) ) ;
203+ assert_eq ! ( activation_epoch, on_chain_sector. activation) ;
204+ assert_eq ! ( input_sector. expiration, on_chain_sector. expiration) ;
205+ assert_eq ! ( BigInt :: zero( ) , on_chain_sector. deal_weight) ;
206+ assert_eq ! ( BigInt :: zero( ) , on_chain_sector. verified_deal_weight) ;
207+ assert_eq ! ( activation_epoch, on_chain_sector. power_base_epoch) ;
208+ assert ! ( on_chain_sector. flags. contains( SectorOnChainInfoFlags :: SIMPLE_QA_POWER ) ) ;
209+ }
210+ }
0 commit comments