casper_storage/data_access_layer/
genesis.rs1#[cfg(test)]
2use rand::{
3 distributions::{Distribution, Standard},
4 Rng,
5};
6
7use casper_types::{
8 execution::Effects, ChainspecRegistry, Digest, GenesisAccount, GenesisConfig, GenesisValidator,
9 ProtocolVersion, PublicKey,
10};
11
12use crate::system::genesis::GenesisError;
13
14#[derive(Debug, Clone, PartialEq, Eq)]
16pub struct GenesisRequest {
17 chainspec_hash: Digest,
18 protocol_version: ProtocolVersion,
19 config: GenesisConfig,
20 chainspec_registry: ChainspecRegistry,
21}
22
23impl GenesisRequest {
24 pub fn new(
26 chainspec_hash: Digest,
27 protocol_version: ProtocolVersion,
28 config: GenesisConfig,
29 chainspec_registry: ChainspecRegistry,
30 ) -> Self {
31 GenesisRequest {
32 chainspec_hash,
33 protocol_version,
34 config,
35 chainspec_registry,
36 }
37 }
38
39 pub fn set_enable_entity(&mut self, enable: bool) {
41 self.config.set_enable_entity(enable);
42 }
43
44 pub fn push_genesis_account(&mut self, genesis_account: GenesisAccount) {
46 self.config.push_account(genesis_account);
47 }
48
49 pub fn push_genesis_validator(
51 &mut self,
52 public_key: &PublicKey,
53 genesis_validator: GenesisValidator,
54 ) {
55 self.config
56 .push_genesis_validator(public_key, genesis_validator);
57 }
58
59 pub fn chainspec_hash(&self) -> Digest {
61 self.chainspec_hash
62 }
63
64 pub fn protocol_version(&self) -> ProtocolVersion {
66 self.protocol_version
67 }
68
69 pub fn config(&self) -> &GenesisConfig {
71 &self.config
72 }
73
74 pub fn chainspec_registry(&self) -> &ChainspecRegistry {
76 &self.chainspec_registry
77 }
78}
79
80#[cfg(test)]
81impl Distribution<GenesisRequest> for Standard {
82 fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> GenesisRequest {
83 let input: [u8; 32] = rng.gen();
84 let chainspec_hash = Digest::hash(input);
85 let protocol_version = ProtocolVersion::from_parts(rng.gen(), rng.gen(), rng.gen());
86 let config = rng.gen();
87
88 let chainspec_file_bytes: [u8; 10] = rng.gen();
89 let genesis_account_file_bytes: [u8; 15] = rng.gen();
90 let chainspec_registry =
91 ChainspecRegistry::new_with_genesis(&chainspec_file_bytes, &genesis_account_file_bytes);
92 GenesisRequest::new(chainspec_hash, protocol_version, config, chainspec_registry)
93 }
94}
95
96#[derive(Debug, Clone)]
98pub enum GenesisResult {
99 Fatal(String),
101 Failure(GenesisError),
103 Success {
105 post_state_hash: Digest,
107 effects: Effects,
109 },
110}
111
112impl GenesisResult {
113 pub fn is_success(&self) -> bool {
115 matches!(self, GenesisResult::Success { .. })
116 }
117
118 pub fn as_legacy(self) -> Result<(Digest, Effects), Box<GenesisError>> {
120 match self {
121 GenesisResult::Fatal(_) => Err(Box::new(GenesisError::StateUninitialized)),
122 GenesisResult::Failure(err) => Err(Box::new(err)),
123 GenesisResult::Success {
124 post_state_hash,
125 effects,
126 } => Ok((post_state_hash, effects)),
127 }
128 }
129}