cli_commands/
registration_signatures.rs

1use 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	/// Bytes of the Cardano Stake Pool Signing Key. Bytes of 'cbor' field of a Cardano key file content, after dropping the '5820' prefix.
19	#[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}