@@ -8,20 +8,12 @@ use std::ops::Neg;
8
8
use anyhow:: { anyhow, Error } ;
9
9
use cid:: multihash:: Code ;
10
10
use cid:: Cid ;
11
- use fil_actors_runtime:: runtime:: policy_constants:: MAX_SECTOR_NUMBER ;
12
- use fil_actors_runtime:: runtime:: Policy ;
13
- use fil_actors_runtime:: {
14
- actor_error, make_empty_map, make_map_with_root_and_bitwidth, u64_key, ActorDowncast ,
15
- ActorError , Array , AsActorError ,
16
- } ;
17
11
use fvm_ipld_amt:: Error as AmtError ;
18
12
use fvm_ipld_bitfield:: BitField ;
19
13
use fvm_ipld_blockstore:: Blockstore ;
20
14
use fvm_ipld_encoding:: tuple:: * ;
21
15
use fvm_ipld_encoding:: { strict_bytes, BytesDe , CborStore } ;
22
- use fvm_ipld_hamt:: Error as HamtError ;
23
16
use fvm_shared:: address:: Address ;
24
-
25
17
use fvm_shared:: clock:: { ChainEpoch , EPOCH_UNDEFINED } ;
26
18
use fvm_shared:: econ:: TokenAmount ;
27
19
use fvm_shared:: error:: ExitCode ;
@@ -30,6 +22,13 @@ use fvm_shared::{ActorID, HAMT_BIT_WIDTH};
30
22
use itertools:: Itertools ;
31
23
use num_traits:: Zero ;
32
24
25
+ use fil_actors_runtime:: runtime:: policy_constants:: MAX_SECTOR_NUMBER ;
26
+ use fil_actors_runtime:: runtime:: Policy ;
27
+ use fil_actors_runtime:: {
28
+ actor_error, ActorContext , ActorDowncast , ActorError , Array , AsActorError , Config , Map2 ,
29
+ DEFAULT_HAMT_CONFIG ,
30
+ } ;
31
+
33
32
use super :: beneficiary:: * ;
34
33
use super :: deadlines:: new_deadline_info;
35
34
use super :: policy:: * ;
@@ -40,6 +39,9 @@ use super::{
40
39
PowerPair , QuantSpec , Sectors , TerminationResult , VestingFunds ,
41
40
} ;
42
41
42
+ pub type PreCommitMap < BS > = Map2 < BS , SectorNumber , SectorPreCommitOnChainInfo > ;
43
+ pub const PRECOMMIT_CONFIG : Config = Config { bit_width : HAMT_BIT_WIDTH , ..DEFAULT_HAMT_CONFIG } ;
44
+
43
45
const PRECOMMIT_EXPIRY_AMT_BITWIDTH : u32 = 6 ;
44
46
pub const SECTORS_AMT_BITWIDTH : u32 = 5 ;
45
47
@@ -126,14 +128,10 @@ impl State {
126
128
info_cid : Cid ,
127
129
period_start : ChainEpoch ,
128
130
deadline_idx : u64 ,
129
- ) -> anyhow :: Result < Self > {
131
+ ) -> Result < Self , ActorError > {
130
132
let empty_precommit_map =
131
- make_empty_map :: < _ , ( ) > ( store, HAMT_BIT_WIDTH ) . flush ( ) . map_err ( |e| {
132
- e. downcast_default (
133
- ExitCode :: USR_ILLEGAL_STATE ,
134
- "failed to construct empty precommit map" ,
135
- )
136
- } ) ?;
133
+ PreCommitMap :: empty ( store, PRECOMMIT_CONFIG , "precommits" ) . flush ( ) ?;
134
+
137
135
let empty_precommits_cleanup_array =
138
136
Array :: < BitField , BS > :: new_with_bit_width ( store, PRECOMMIT_EXPIRY_AMT_BITWIDTH )
139
137
. flush ( )
@@ -292,14 +290,12 @@ impl State {
292
290
precommits : Vec < SectorPreCommitOnChainInfo > ,
293
291
) -> anyhow:: Result < ( ) > {
294
292
let mut precommitted =
295
- make_map_with_root_and_bitwidth ( & self . pre_committed_sectors , store , HAMT_BIT_WIDTH ) ?;
293
+ PreCommitMap :: load ( store , & self . pre_committed_sectors , PRECOMMIT_CONFIG , "precommits" ) ?;
296
294
for precommit in precommits. into_iter ( ) {
297
295
let sector_no = precommit. info . sector_number ;
298
296
let modified = precommitted
299
- . set_if_absent ( u64_key ( precommit. info . sector_number ) , precommit)
300
- . map_err ( |e| {
301
- e. downcast_wrap ( format ! ( "failed to store precommitment for {:?}" , sector_no, ) )
302
- } ) ?;
297
+ . set_if_absent ( & sector_no, precommit)
298
+ . with_context ( || format ! ( "storing precommit for {}" , sector_no) ) ?;
303
299
if !modified {
304
300
return Err ( anyhow ! ( "sector {} already pre-commited" , sector_no) ) ;
305
301
}
@@ -313,10 +309,10 @@ impl State {
313
309
& self ,
314
310
store : & BS ,
315
311
sector_num : SectorNumber ,
316
- ) -> Result < Option < SectorPreCommitOnChainInfo > , HamtError > {
312
+ ) -> Result < Option < SectorPreCommitOnChainInfo > , ActorError > {
317
313
let precommitted =
318
- make_map_with_root_and_bitwidth ( & self . pre_committed_sectors , store , HAMT_BIT_WIDTH ) ?;
319
- Ok ( precommitted. get ( & u64_key ( sector_num) ) ?. cloned ( ) )
314
+ PreCommitMap :: load ( store , & self . pre_committed_sectors , PRECOMMIT_CONFIG , "precommits" ) ?;
315
+ Ok ( precommitted. get ( & sector_num) ?. cloned ( ) )
320
316
}
321
317
322
318
/// Gets and returns the requested pre-committed sectors, skipping missing sectors.
@@ -325,17 +321,15 @@ impl State {
325
321
store : & BS ,
326
322
sector_numbers : & [ SectorNumber ] ,
327
323
) -> anyhow:: Result < Vec < SectorPreCommitOnChainInfo > > {
328
- let precommitted = make_map_with_root_and_bitwidth :: < _ , SectorPreCommitOnChainInfo > (
329
- & self . pre_committed_sectors ,
330
- store,
331
- HAMT_BIT_WIDTH ,
332
- ) ?;
324
+ let precommitted =
325
+ PreCommitMap :: load ( store, & self . pre_committed_sectors , PRECOMMIT_CONFIG , "precommits" ) ?;
333
326
let mut result = Vec :: with_capacity ( sector_numbers. len ( ) ) ;
334
327
335
328
for & sector_number in sector_numbers {
336
- let info = match precommitted. get ( & u64_key ( sector_number) ) . map_err ( |e| {
337
- e. downcast_wrap ( format ! ( "failed to load precommitment for {}" , sector_number) )
338
- } ) ? {
329
+ let info = match precommitted
330
+ . get ( & sector_number)
331
+ . with_context ( || format ! ( "loading precommit {}" , sector_number) ) ?
332
+ {
339
333
Some ( info) => info. clone ( ) ,
340
334
None => continue ,
341
335
} ;
@@ -350,17 +344,13 @@ impl State {
350
344
& mut self ,
351
345
store : & BS ,
352
346
sector_nums : & [ SectorNumber ] ,
353
- ) -> Result < ( ) , HamtError > {
354
- let mut precommitted = make_map_with_root_and_bitwidth :: < _ , SectorPreCommitOnChainInfo > (
355
- & self . pre_committed_sectors ,
356
- store,
357
- HAMT_BIT_WIDTH ,
358
- ) ?;
359
-
347
+ ) -> Result < ( ) , ActorError > {
348
+ let mut precommitted =
349
+ PreCommitMap :: load ( store, & self . pre_committed_sectors , PRECOMMIT_CONFIG , "precommits" ) ?;
360
350
for & sector_num in sector_nums {
361
- let prev_entry = precommitted. delete ( & u64_key ( sector_num) ) ?;
351
+ let prev_entry = precommitted. delete ( & sector_num) ?;
362
352
if prev_entry. is_none ( ) {
363
- return Err ( format ! ( "sector {} doesn't exist " , sector_num) . into ( ) ) ;
353
+ return Err ( actor_error ! ( illegal_state , "sector {} not pre-committed " , sector_num) ) ;
364
354
}
365
355
}
366
356
@@ -1052,13 +1042,12 @@ impl State {
1052
1042
1053
1043
let mut precommits_to_delete = Vec :: new ( ) ;
1054
1044
let precommitted =
1055
- make_map_with_root_and_bitwidth ( & self . pre_committed_sectors , store , HAMT_BIT_WIDTH ) ?;
1045
+ PreCommitMap :: load ( store , & self . pre_committed_sectors , PRECOMMIT_CONFIG , "precommits" ) ?;
1056
1046
1057
1047
for i in sectors. iter ( ) {
1058
1048
let sector_number = i as SectorNumber ;
1059
-
1060
1049
let sector: SectorPreCommitOnChainInfo =
1061
- match precommitted. get ( & u64_key ( sector_number) ) ?. cloned ( ) {
1050
+ match precommitted. get ( & sector_number) ?. cloned ( ) {
1062
1051
Some ( sector) => sector,
1063
1052
// already committed/deleted
1064
1053
None => continue ,
@@ -1179,15 +1168,14 @@ impl State {
1179
1168
) -> Result < Vec < SectorPreCommitOnChainInfo > , ActorError > {
1180
1169
let mut precommits = Vec :: new ( ) ;
1181
1170
let precommitted =
1182
- make_map_with_root_and_bitwidth ( & self . pre_committed_sectors , store, HAMT_BIT_WIDTH )
1183
- . context_code ( ExitCode :: USR_ILLEGAL_STATE , "failed to load precommitted sectors" ) ?;
1171
+ PreCommitMap :: load ( store, & self . pre_committed_sectors , PRECOMMIT_CONFIG , "precommits" ) ?;
1184
1172
for sector_no in sector_nos. into_iter ( ) {
1185
1173
let sector_no = * sector_no. borrow ( ) ;
1186
1174
if sector_no > MAX_SECTOR_NUMBER {
1187
1175
return Err ( actor_error ! ( illegal_argument; "sector number greater than maximum" ) ) ;
1188
1176
}
1189
1177
let info: & SectorPreCommitOnChainInfo = precommitted
1190
- . get ( & u64_key ( sector_no) )
1178
+ . get ( & sector_no)
1191
1179
. exit_code ( ExitCode :: USR_ILLEGAL_STATE ) ?
1192
1180
. ok_or_else ( || actor_error ! ( not_found, "sector {} not found" , sector_no) ) ?;
1193
1181
precommits. push ( info. clone ( ) ) ;
0 commit comments