Implement state.get_crosslink_committees_at_slot
This commit is contained in:
		
							parent
							
								
									9264ec1aa9
								
							
						
					
					
						commit
						94a39c3cb6
					
				| @ -44,6 +44,7 @@ pub enum Error { | ||||
|     InsufficientSlashedBalances, | ||||
|     InsufficientStateRoots, | ||||
|     NoCommitteeForShard, | ||||
|     NoCommitteeForSlot, | ||||
|     PubkeyCacheInconsistent, | ||||
|     PubkeyCacheIncomplete { | ||||
|         cache_len: usize, | ||||
| @ -346,10 +347,15 @@ impl<T: EthSpec> BeaconState<T> { | ||||
|     /// Spec v0.5.1
 | ||||
|     pub fn get_crosslink_committees_at_slot( | ||||
|         &self, | ||||
|         _slot: Slot, | ||||
|         _spec: &ChainSpec, | ||||
|     ) -> Result<&Vec<CrosslinkCommittee>, Error> { | ||||
|         unimplemented!("FIXME(sproul)") | ||||
|         slot: Slot, | ||||
|         spec: &ChainSpec, | ||||
|     ) -> Result<Vec<CrosslinkCommittee>, Error> { | ||||
|         let relative_epoch = RelativeEpoch::from_slot(self.slot, slot, T::slots_per_epoch())?; | ||||
|         let cache = self.cache(relative_epoch)?; | ||||
| 
 | ||||
|         cache | ||||
|             .get_crosslink_committees_for_slot(slot) | ||||
|             .ok_or_else(|| Error::NoCommitteeForSlot) | ||||
|     } | ||||
| 
 | ||||
|     /// Returns the crosslink committees for some shard in some cached epoch.
 | ||||
|  | ||||
| @ -150,18 +150,44 @@ impl EpochCache { | ||||
|         self.shuffling_start_shard | ||||
|     } | ||||
| 
 | ||||
|     pub fn get_crosslink_committees_for_slot(&self, slot: Slot) -> Option<Vec<CrosslinkCommittee>> { | ||||
|         let position = self | ||||
|             .initialized_epoch? | ||||
|             .position(slot, self.slots_per_epoch)?; | ||||
|         let committees_per_slot = self.committee_count / self.slots_per_epoch as usize; | ||||
|         let position = position * committees_per_slot; | ||||
| 
 | ||||
|         if position >= self.committee_count { | ||||
|             None | ||||
|         } else { | ||||
|             let mut committees = Vec::with_capacity(committees_per_slot); | ||||
| 
 | ||||
|             for index in position..position + committees_per_slot { | ||||
|                 let committee = self.compute_committee(index)?; | ||||
|                 let shard = (self.shuffling_start_shard + index as u64) % self.shard_count; | ||||
| 
 | ||||
|                 committees.push(CrosslinkCommittee { | ||||
|                     committee, | ||||
|                     shard, | ||||
|                     slot, | ||||
|                 }); | ||||
|             } | ||||
| 
 | ||||
|             Some(committees) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub fn first_committee_at_slot(&self, slot: Slot) -> Option<&[usize]> { | ||||
|         let position = self | ||||
|             .initialized_epoch? | ||||
|             .position(slot, self.slots_per_epoch)?; | ||||
|         let committees_per_slot = self.committee_count / self.slots_per_epoch as usize; | ||||
|         let position = position * committees_per_slot; | ||||
| 
 | ||||
|         if position > self.committee_count { | ||||
|         if position >= self.committee_count { | ||||
|             None | ||||
|         } else { | ||||
|             let committees_per_slot = self.committee_count / self.slots_per_epoch as usize; | ||||
|             let index = position * committees_per_slot; | ||||
| 
 | ||||
|             self.compute_committee(index) | ||||
|             self.compute_committee(position) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user