zombienet_orchestrator/generators/
identity.rs

1use hex::FromHex;
2use libp2p::identity::{ed25519, Keypair};
3use sha2::digest::Digest;
4
5use super::errors::GeneratorError;
6
7// Generate p2p identity for node
8// return `node-key` and `peerId`
9pub fn generate(node_name: &str) -> Result<(String, String), GeneratorError> {
10    let key = hex::encode(sha2::Sha256::digest(node_name));
11
12    let bytes = <[u8; 32]>::from_hex(key.clone()).map_err(|_| {
13        GeneratorError::IdentityGeneration("can not transform hex to [u8;32]".into())
14    })?;
15    let sk = ed25519::SecretKey::try_from_bytes(bytes)
16        .map_err(|_| GeneratorError::IdentityGeneration("can not create sk from bytes".into()))?;
17    let local_identity: Keypair = ed25519::Keypair::from(sk).into();
18    let local_public = local_identity.public();
19    let local_peer_id = local_public.to_peer_id();
20
21    Ok((key, local_peer_id.to_base58()))
22}
23
24#[cfg(test)]
25mod tests {
26
27    use super::*;
28    #[test]
29    fn generate_for_alice() {
30        let s = "alice";
31        let (key, peer_id) = generate(s).unwrap();
32        assert_eq!(
33            &key,
34            "2bd806c97f0e00af1a1fc3328fa763a9269723c8db8fac4f93af71db186d6e90"
35        );
36        assert_eq!(
37            &peer_id,
38            "12D3KooWQCkBm1BYtkHpocxCwMgR8yjitEeHGx8spzcDLGt2gkBm"
39        );
40    }
41}