cli_commands/
registration_signatures.rs1use crate::key_params::{SidechainSigningKeyParam, StakePoolSigningKeyParam};
2use clap::Parser;
3use plutus_datum_derive::*;
4use secp256k1::SecretKey;
5use serde::Serialize;
6use serde_json;
7use sidechain_domain::{
8 MainchainSignature, SidechainPublicKey, SidechainSignature, StakePoolPublicKey, UtxoId,
9 crypto::*,
10};
11use std::fmt::{Display, Formatter};
12
13#[derive(Clone, Debug, Parser)]
14#[command(author, version, about, long_about = None)]
15pub struct RegistrationSignaturesCmd {
16 #[arg(long)]
17 pub genesis_utxo: UtxoId,
18 #[arg(long)]
20 pub mainchain_signing_key: StakePoolSigningKeyParam,
21 #[arg(long)]
22 pub sidechain_signing_key: SidechainSigningKeyParam,
23 #[arg(long)]
24 pub registration_utxo: UtxoId,
25}
26
27impl RegistrationSignaturesCmd {
28 pub fn to_register_validator_message(&self, genesis_utxo: UtxoId) -> RegisterValidatorMessage {
29 RegisterValidatorMessage::new(
30 genesis_utxo,
31 self.sidechain_signing_key.to_pub_key(),
32 self.registration_utxo,
33 )
34 }
35
36 pub fn execute(&self) -> RegistrationCmdOutput {
37 self.to_register_validator_message(self.genesis_utxo)
38 .sign_and_prepare_registration_cmd_output(
39 self.mainchain_signing_key.0,
40 self.sidechain_signing_key.0,
41 )
42 }
43}
44
45#[derive(Clone, Debug, Serialize)]
46pub struct RegistrationCmdOutput {
47 pub spo_public_key: StakePoolPublicKey,
48 pub spo_signature: MainchainSignature,
49 pub sidechain_public_key: SidechainPublicKey,
50 pub sidechain_signature: SidechainSignature,
51}
52
53impl Display for RegistrationCmdOutput {
54 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
55 match serde_json::to_string(self) {
56 Ok(json) => write!(f, "{}", json),
57 Err(e) => write!(f, "{{'error': '{}'}}", e),
58 }
59 }
60}
61
62#[derive(Clone, Debug, ToDatum)]
63pub struct RegisterValidatorMessage {
64 pub genesis_utxo: UtxoId,
65 pub sidechain_pub_key: SidechainPublicKey,
66 pub registration_utxo: UtxoId,
67}
68
69impl RegisterValidatorMessage {
70 pub fn new(
71 genesis_utxo: UtxoId,
72 pub_key: secp256k1::PublicKey,
73 registration_utxo: UtxoId,
74 ) -> Self {
75 RegisterValidatorMessage {
76 genesis_utxo,
77 sidechain_pub_key: SidechainPublicKey(pub_key.serialize().to_vec()),
78 registration_utxo,
79 }
80 }
81
82 pub fn sign_and_prepare_registration_cmd_output(
83 &self,
84 mainchain_key: ed25519_zebra::SigningKey,
85 sidechain_key: SecretKey,
86 ) -> RegistrationCmdOutput {
87 let (spo_public_key, spo_signature) =
88 cardano_spo_public_key_and_signature(mainchain_key, self.clone());
89 let (sc_pub_key, sc_signature) =
90 sc_public_key_and_signature_for_datum(sidechain_key, self.clone());
91 RegistrationCmdOutput {
92 spo_public_key,
93 spo_signature,
94 sidechain_public_key: SidechainPublicKey(sc_pub_key.serialize().to_vec()),
95 sidechain_signature: SidechainSignature(sc_signature.serialize_compact().to_vec()),
96 }
97 }
98}
99
100#[cfg(test)]
101mod tests {
102 use crate::registration_signatures::RegisterValidatorMessage;
103 use plutus::to_datum_cbor_bytes;
104 use secp256k1::PublicKey;
105 use sidechain_domain::UtxoId;
106 use std::str::FromStr;
107
108 #[test]
109 fn validator_msg_to_datum() {
110 let sidechain_pub_key = PublicKey::from_str(
111 "02dbfc8b66c22f931a6647fd86db2fc073dd564b99837226a1bdfe7a99578854ec",
112 )
113 .unwrap();
114 let genesis_utxo =
115 UtxoId::from_str("e41c9b57841e582c207bb68d5e9736fb48c7af5f1ec29ade00692fa5e0e47efa#4")
116 .unwrap();
117 let registration_utxo =
118 UtxoId::from_str("8ea10040249ad3033ae7c4d4b69e0b2e2b50a90741b783491cb5ddf8ced0d861#4")
119 .unwrap();
120 let message =
121 RegisterValidatorMessage::new(genesis_utxo, sidechain_pub_key, registration_utxo);
122 assert_eq!(
123 hex::encode(to_datum_cbor_bytes(message)),
124 "d8799fd8799fd8799f5820e41c9b57841e582c207bb68d5e9736fb48c7af5f1ec29ade00692fa5e0e47efaff04ff582102dbfc8b66c22f931a6647fd86db2fc073dd564b99837226a1bdfe7a99578854ecd8799fd8799f58208ea10040249ad3033ae7c4d4b69e0b2e2b50a90741b783491cb5ddf8ced0d861ff04ffff"
125 )
126 }
127}