@@ -496,18 +496,17 @@ impl Actor {
496
496
let curr_epoch = rt. curr_epoch ( ) ;
497
497
498
498
let st: State = rt. state ( ) ?;
499
- let proposals = st. get_proposal_array ( rt. store ( ) ) ?;
499
+ let proposal_array = st. get_proposal_array ( rt. store ( ) ) ?;
500
500
501
501
let mut sectors_data = Vec :: with_capacity ( params. sectors . len ( ) ) ;
502
502
for sector in params. sectors . iter ( ) {
503
+ let sector_proposals = get_proposals ( & proposal_array, & sector. deal_ids , st. next_id ) ?;
503
504
let sector_size = sector
504
505
. sector_type
505
506
. sector_size ( )
506
507
. map_err ( |e| actor_error ! ( illegal_argument, "sector size unknown: {}" , e) ) ?;
507
508
validate_and_return_deal_space (
508
- & proposals,
509
- & sector. deal_ids ,
510
- st. next_id ,
509
+ & sector_proposals,
511
510
& miner_addr,
512
511
sector. sector_expiry ,
513
512
curr_epoch,
@@ -518,14 +517,15 @@ impl Actor {
518
517
let commd = if sector. deal_ids . is_empty ( ) {
519
518
None
520
519
} else {
521
- Some ( compute_data_commitment ( rt, & proposals , sector. sector_type , & sector . deal_ids ) ?)
520
+ Some ( compute_data_commitment ( rt, & sector_proposals , sector. sector_type ) ?)
522
521
} ;
523
522
524
523
sectors_data. push ( SectorDealData { commd } ) ;
525
524
}
526
525
527
526
Ok ( VerifyDealsForActivationReturn { sectors : sectors_data } )
528
527
}
528
+
529
529
/// Activate a set of deals, returning the combined deal space and extra info for verified deals.
530
530
fn activate_deals (
531
531
rt : & impl Runtime ,
@@ -536,13 +536,12 @@ impl Actor {
536
536
let curr_epoch = rt. curr_epoch ( ) ;
537
537
538
538
let ( deal_spaces, verified_infos) = rt. transaction ( |st : & mut State , rt| {
539
- let proposals = st. get_proposal_array ( rt. store ( ) ) ?;
539
+ let proposal_array = st. get_proposal_array ( rt. store ( ) ) ?;
540
+ let proposals = get_proposals ( & proposal_array, & params. deal_ids , st. next_id ) ?;
540
541
541
542
let deal_spaces = {
542
543
validate_and_return_deal_space (
543
544
& proposals,
544
- & params. deal_ids ,
545
- st. next_id ,
546
545
& miner_addr,
547
546
params. sector_expiry ,
548
547
curr_epoch,
@@ -555,7 +554,7 @@ impl Actor {
555
554
let mut verified_infos = Vec :: new ( ) ;
556
555
let mut deal_states: Vec < ( DealID , DealState ) > = vec ! [ ] ;
557
556
558
- for deal_id in params . deal_ids {
557
+ for ( deal_id, proposal ) in proposals {
559
558
// This construction could be replaced with a single "update deal state"
560
559
// state method, possibly batched over all deal ids at once.
561
560
let s = st. find_deal_state ( rt. store ( ) , deal_id) ?;
@@ -568,8 +567,6 @@ impl Actor {
568
567
) ) ;
569
568
}
570
569
571
- let proposal = st. get_proposal ( rt. store ( ) , deal_id) ?;
572
-
573
570
let propc = rt_deal_cid ( rt, & proposal) ?;
574
571
575
572
// Confirm the deal is in the pending proposals queue.
@@ -690,16 +687,12 @@ impl Actor {
690
687
rt. validate_immediate_caller_type ( std:: iter:: once ( & Type :: Miner ) ) ?;
691
688
692
689
let st: State = rt. state ( ) ?;
693
- let proposals = st. get_proposal_array ( rt. store ( ) ) ?;
690
+ let proposal_array = st. get_proposal_array ( rt. store ( ) ) ?;
694
691
695
692
let mut commds = Vec :: with_capacity ( params. inputs . len ( ) ) ;
696
693
for comm_input in params. inputs . iter ( ) {
697
- commds. push ( compute_data_commitment (
698
- rt,
699
- & proposals,
700
- comm_input. sector_type ,
701
- & comm_input. deal_ids ,
702
- ) ?) ;
694
+ let proposed_deals = get_proposals ( & proposal_array, & comm_input. deal_ids , st. next_id ) ?;
695
+ commds. push ( compute_data_commitment ( rt, & proposed_deals, comm_input. sector_type ) ?) ;
703
696
}
704
697
705
698
Ok ( ComputeDataCommitmentReturn { commds } )
@@ -1022,65 +1015,59 @@ impl Actor {
1022
1015
}
1023
1016
}
1024
1017
1025
- fn compute_data_commitment < BS : Blockstore > (
1026
- rt : & impl Runtime ,
1027
- proposals : & DealArray < BS > ,
1028
- sector_type : RegisteredSealProof ,
1018
+ fn get_proposals < BS : Blockstore > (
1019
+ proposal_array : & DealArray < BS > ,
1029
1020
deal_ids : & [ DealID ] ,
1030
- ) -> Result < Cid , ActorError > {
1031
- let mut pieces = Vec :: with_capacity ( deal_ids. len ( ) ) ;
1032
-
1021
+ next_id : DealID ,
1022
+ ) -> Result < Vec < ( DealID , DealProposal ) > , ActorError > {
1023
+ let mut proposals = Vec :: new ( ) ;
1024
+ let mut seen_deal_ids = BTreeSet :: new ( ) ;
1033
1025
for deal_id in deal_ids {
1034
- let deal = proposals
1026
+ if !seen_deal_ids. insert ( deal_id) {
1027
+ return Err ( actor_error ! ( illegal_argument, "duplicate deal ID {} in sector" , deal_id) ) ;
1028
+ }
1029
+ let proposal = proposal_array
1035
1030
. get ( * deal_id)
1036
- . map_err ( |e| {
1037
- e. downcast_default (
1038
- ExitCode :: USR_ILLEGAL_STATE ,
1039
- format ! ( "failed to get deal_id ({})" , deal_id) ,
1040
- )
1041
- } ) ?
1042
- . ok_or_else ( || actor_error ! ( not_found, "proposal doesn't exist ({})" , deal_id) ) ?;
1031
+ . context_code ( ExitCode :: USR_ILLEGAL_STATE , "failed to load deal" ) ?
1032
+ . ok_or_else ( || {
1033
+ if * deal_id < next_id {
1034
+ ActorError :: unchecked ( EX_DEAL_EXPIRED , format ! ( "deal {} expired" , deal_id) )
1035
+ } else {
1036
+ actor_error ! ( not_found, "no such deal {}" , deal_id)
1037
+ }
1038
+ } ) ?;
1039
+ proposals. push ( ( * deal_id, proposal. clone ( ) ) ) ;
1040
+ }
1041
+ Ok ( proposals)
1042
+ }
1043
+
1044
+ fn compute_data_commitment (
1045
+ rt : & impl Runtime ,
1046
+ proposals : & [ ( DealID , DealProposal ) ] ,
1047
+ sector_type : RegisteredSealProof ,
1048
+ ) -> Result < Cid , ActorError > {
1049
+ let mut pieces = Vec :: with_capacity ( proposals. len ( ) ) ;
1043
1050
1051
+ for ( _, deal) in proposals {
1044
1052
pieces. push ( PieceInfo { cid : deal. piece_cid , size : deal. piece_size } ) ;
1045
1053
}
1054
+
1046
1055
rt. compute_unsealed_sector_cid ( sector_type, & pieces) . map_err ( |e| {
1047
1056
e. downcast_default ( ExitCode :: USR_ILLEGAL_ARGUMENT , "failed to compute unsealed sector CID" )
1048
1057
} )
1049
1058
}
1050
1059
1051
- pub fn validate_and_return_deal_space < BS : Blockstore > (
1052
- proposals : & DealArray < BS > ,
1053
- deal_ids : & [ DealID ] ,
1054
- next_id : DealID ,
1060
+ pub fn validate_and_return_deal_space (
1061
+ proposals : & [ ( DealID , DealProposal ) ] ,
1055
1062
miner_addr : & Address ,
1056
1063
sector_expiry : ChainEpoch ,
1057
1064
sector_activation : ChainEpoch ,
1058
1065
sector_size : Option < SectorSize > ,
1059
1066
) -> Result < DealSpaces , ActorError > {
1060
- let mut seen_deal_ids = BTreeSet :: new ( ) ;
1061
1067
let mut deal_space = BigInt :: zero ( ) ;
1062
1068
let mut verified_deal_space = BigInt :: zero ( ) ;
1063
1069
1064
- for deal_id in deal_ids {
1065
- if !seen_deal_ids. insert ( deal_id) {
1066
- return Err ( actor_error ! (
1067
- illegal_argument,
1068
- "deal id {} present multiple times" ,
1069
- deal_id
1070
- ) ) ;
1071
- }
1072
-
1073
- let proposal = proposals
1074
- . get ( * deal_id)
1075
- . context_code ( ExitCode :: USR_ILLEGAL_STATE , "failed to load deal" ) ?
1076
- . ok_or_else ( || {
1077
- if deal_id < & next_id {
1078
- ActorError :: unchecked ( EX_DEAL_EXPIRED , format ! ( "deal {} expired" , deal_id) )
1079
- } else {
1080
- actor_error ! ( not_found, "no such deal {}" , deal_id)
1081
- }
1082
- } ) ?;
1083
-
1070
+ for ( deal_id, proposal) in proposals {
1084
1071
validate_deal_can_activate ( proposal, miner_addr, sector_expiry, sector_activation)
1085
1072
. with_context ( || format ! ( "cannot activate deal {}" , deal_id) ) ?;
1086
1073
0 commit comments