use std::iter::IntoIterator;
use linera_base::{
crypto::{AccountPublicKey, ValidatorPublicKey, ValidatorSecretKey},
data_types::Timestamp,
};
pub use linera_core::genesis_config::{Error as GenesisConfigError, GenesisConfig};
use linera_execution::{
committee::{Committee, ValidatorState},
ResourceControlPolicy,
};
use linera_rpc::config::{ValidatorInternalNetworkConfig, ValidatorPublicNetworkConfig};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ValidatorConfig {
pub public_key: ValidatorPublicKey,
pub account_key: AccountPublicKey,
pub network: ValidatorPublicNetworkConfig,
}
#[derive(Serialize, Deserialize)]
pub struct ValidatorServerConfig {
pub validator: ValidatorConfig,
pub validator_secret: ValidatorSecretKey,
pub internal_network: ValidatorInternalNetworkConfig,
}
#[derive(Debug, Default, Clone, Deserialize, Serialize)]
pub struct CommitteeConfig {
pub validators: Vec<ValidatorConfig>,
}
impl CommitteeConfig {
pub fn into_committee(self, policy: ResourceControlPolicy) -> Committee {
let validators = self
.validators
.into_iter()
.map(|v| {
(
v.public_key,
ValidatorState {
network_address: v.network.to_string(),
votes: 100,
account_public_key: v.account_key,
},
)
})
.collect();
Committee::new(validators, policy)
}
}
impl CommitteeConfig {
pub fn into_genesis(
self,
timestamp: Timestamp,
policy: ResourceControlPolicy,
network_name: String,
admin_public_key: AccountPublicKey,
admin_balance: linera_base::data_types::Amount,
) -> GenesisConfig {
let committee = self.into_committee(policy);
GenesisConfig::new(
committee,
timestamp,
network_name,
admin_public_key,
admin_balance,
)
}
}