Skip to content

Commit bfe3867

Browse files
authored
Merge pull request #1171 from input-output-hk/ensemble/668/protocol-key-for-era-keys
Protocol key for era keys
2 parents 2e61a83 + 9eee791 commit bfe3867

File tree

9 files changed

+119
-80
lines changed

9 files changed

+119
-80
lines changed

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mithril-aggregator/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-aggregator"
3-
version = "0.3.73"
3+
version = "0.3.74"
44
description = "A Mithril Aggregator server"
55
authors = { workspace = true }
66
edition = { workspace = true }

mithril-aggregator/src/commands/era_command.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
use anyhow::anyhow;
1+
use anyhow::Context;
22
use clap::{Parser, Subcommand};
33
use config::{builder::DefaultState, ConfigBuilder};
44
use mithril_common::{
5-
crypto_helper::{key_decode_hex, EraMarkersSigner},
5+
crypto_helper::{EraMarkersSigner, EraMarkersVerifierSecretKey},
66
entities::{Epoch, HexEncodedEraMarkersSecretKey},
77
StdResult,
88
};
@@ -89,8 +89,9 @@ impl GenerateTxDatumEraSubCommand {
8989
debug!("GENERATETXDATUM ERA command");
9090
let era_tools = EraTools::new();
9191

92-
let era_markers_secret_key = key_decode_hex(&self.era_markers_secret_key)
93-
.map_err(|e| anyhow!(e).context("json hex decode of era markers secret key failure"))?;
92+
let era_markers_secret_key =
93+
EraMarkersVerifierSecretKey::from_json_hex(&self.era_markers_secret_key)
94+
.with_context(|| "json hex decode of era markers secret key failure")?;
9495
let era_markers_signer = EraMarkersSigner::from_secret_key(era_markers_secret_key);
9596
print!(
9697
"{}",

mithril-aggregator/src/tools/era.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use anyhow::anyhow;
22
use mithril_common::{
33
chain_observer::{TxDatumBuilder, TxDatumFieldValue},
4-
crypto_helper::{key_encode_hex, EraMarkersSigner},
4+
crypto_helper::EraMarkersSigner,
55
entities::Epoch,
66
era::{adapters::EraMarkersPayloadCardanoChain, EraMarker, SupportedEra},
77
StdResult,
@@ -52,11 +52,7 @@ impl EraTools {
5252
.sign(era_markers_signer)?;
5353

5454
let tx_datum = TxDatumBuilder::new()
55-
.add_field(TxDatumFieldValue::Bytes(
56-
key_encode_hex(era_markers_payload).map_err(|e| {
57-
anyhow!(e).context("era markerspayload could not be hex encoded")
58-
})?,
59-
))
55+
.add_field(TxDatumFieldValue::Bytes(era_markers_payload.to_json_hex()?))
6056
.build()?;
6157
Ok(tx_datum.0)
6258
}

mithril-common/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-common"
3-
version = "0.2.96"
3+
version = "0.2.97"
44
authors = { workspace = true }
55
edition = { workspace = true }
66
documentation = { workspace = true }

mithril-common/src/crypto_helper/era.rs

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,16 @@ use rand_chacha_dalek_compat::ChaCha20Rng;
44
use serde::{Deserialize, Serialize};
55
use thiserror::Error;
66

7+
use super::ProtocolKey;
8+
79
/// Alias of [Ed25519:PublicKey](https://docs.rs/ed25519-dalek/latest/ed25519_dalek/struct.PublicKey.html).
8-
pub type EraMarkersVerifierVerificationKey = ed25519_dalek::PublicKey;
10+
pub type EraMarkersVerifierVerificationKey = ProtocolKey<ed25519_dalek::PublicKey>;
911

1012
/// Alias of [Ed25519:SecretKey](https://docs.rs/ed25519-dalek/latest/ed25519_dalek/struct.SecretKey.html).
11-
pub type EraMarkersVerifierSecretKey = ed25519_dalek::SecretKey;
13+
pub type EraMarkersVerifierSecretKey = ProtocolKey<ed25519_dalek::SecretKey>;
1214

1315
/// Alias of [Ed25519:Signature](https://docs.rs/ed25519-dalek/latest/ed25519_dalek/struct.Signature.html).
14-
pub type EraMarkersVerifierSignature = ed25519_dalek::Signature;
16+
pub type EraMarkersVerifierSignature = ProtocolKey<ed25519_dalek::Signature>;
1517

1618
#[derive(Error, Debug)]
1719
/// [EraMarkersSigner] and [EraMarkersVerifier] related errors.
@@ -21,7 +23,7 @@ pub enum EraMarkersVerifierError {
2123
SignatureVerification(#[from] SignatureError),
2224
}
2325

24-
/// A cryptographic signer that is responsible for signing the EreMarkers
26+
/// A cryptographic signer that is responsible for signing the EraMarkers
2527
#[derive(Debug, Serialize, Deserialize)]
2628
pub struct EraMarkersSigner {
2729
pub(crate) secret_key: EraMarkersVerifierSecretKey,
@@ -33,8 +35,8 @@ impl EraMarkersSigner {
3335
where
3436
R: CryptoRng + RngCore,
3537
{
36-
let secret_key = EraMarkersVerifierSecretKey::generate(&mut rng);
37-
Self::from_secret_key(secret_key)
38+
let secret_key = ed25519_dalek::SecretKey::generate(&mut rng);
39+
Self::from_secret_key(secret_key.into())
3840
}
3941

4042
/// EraMarkersSigner deterministic
@@ -56,16 +58,15 @@ impl EraMarkersSigner {
5658

5759
/// Create a an expanded secret key
5860
fn create_expanded_secret_key(&self) -> ExpandedSecretKey {
59-
ExpandedSecretKey::from(&self.secret_key)
61+
ExpandedSecretKey::from(&*self.secret_key)
6062
}
6163

6264
/// Create a EraMarkersVerifierVerificationKey
6365
fn create_verification_key(
6466
&self,
6567
expanded_secret_key: &ExpandedSecretKey,
6668
) -> EraMarkersVerifierVerificationKey {
67-
let verification_key: EraMarkersVerifierVerificationKey = expanded_secret_key.into();
68-
verification_key
69+
EraMarkersVerifierVerificationKey::new(expanded_secret_key.into())
6970
}
7071

7172
/// Create a EraMarkersVerifier
@@ -79,7 +80,7 @@ impl EraMarkersSigner {
7980
pub fn sign(&self, message: &[u8]) -> EraMarkersVerifierSignature {
8081
let expanded_secret_key = self.create_expanded_secret_key();
8182
let verification_key = self.create_verification_key(&expanded_secret_key);
82-
expanded_secret_key.sign(message, &verification_key)
83+
expanded_secret_key.sign(message, &verification_key).into()
8384
}
8485
}
8586

@@ -112,9 +113,26 @@ impl EraMarkersVerifier {
112113

113114
#[cfg(test)]
114115
mod tests {
115-
use super::super::codec::{key_decode_hex, key_encode_hex};
116116
use super::*;
117117

118+
const GOLDEN_ERA_MARKERS_VERIFICATION_KEY: &str =
119+
"5b32332c32372c3131322c362c35372c38342c3138302c342c3135302c3233322c3233372c3132362c3131392c\
120+
3231342c33352c35342c38312c3230382c3231372c39392c3137302c3233312c3133392c362c3132322c39342c3\
121+
9322c3137322c32332c3130322c3135372c3136375d";
122+
const GOLDEN_ERA_MARKERS_SECRET_KEY: &str =
123+
"5b34332c3133322c3232312c3138382c3235332c3132372c3235352c38362c3136322c3133312c3233332c3131\
124+
362c3134322c3233352c3131312c3133332c3134312c3138332c302c33392c3132302c3139372c39322c3133302\
125+
c3233342c34362c3135372c32352c3133322c31352c3234312c3235345d";
126+
127+
#[test]
128+
fn golden_master() {
129+
EraMarkersVerifierVerificationKey::from_json_hex(GOLDEN_ERA_MARKERS_VERIFICATION_KEY)
130+
.expect("Decoding golden verification key should not fail");
131+
132+
EraMarkersVerifierSecretKey::from_json_hex(GOLDEN_ERA_MARKERS_SECRET_KEY)
133+
.expect("Decoding golden secret key should not fail");
134+
}
135+
118136
#[test]
119137
fn test_generate_test_deterministic_keypair() {
120138
let signer = EraMarkersSigner::create_deterministic_signer();
@@ -129,11 +147,11 @@ mod tests {
129147

130148
println!(
131149
"Deterministic Verification Key={}",
132-
key_encode_hex(verifier.verification_key.as_bytes()).unwrap()
150+
verifier.verification_key.to_json_hex().unwrap()
133151
);
134152
println!(
135153
"Deterministic Secret Key=={}",
136-
key_encode_hex(signer.secret_key.as_bytes()).unwrap()
154+
signer.secret_key.to_json_hex().unwrap()
137155
);
138156
}
139157

@@ -144,25 +162,24 @@ mod tests {
144162

145163
println!(
146164
"Non Deterministic Verification Key={}",
147-
key_encode_hex(verifier.verification_key.as_bytes()).unwrap()
165+
verifier.verification_key.to_json_hex().unwrap()
148166
);
149167
println!(
150168
"Non Deterministic Secret Key=={}",
151-
key_encode_hex(signer.secret_key.as_bytes()).unwrap()
169+
signer.secret_key.to_json_hex().unwrap()
152170
);
153171
}
154172

155173
#[test]
156174
fn test_codec_keypair() {
157175
let signer = EraMarkersSigner::create_deterministic_signer();
158176
let verifier = signer.create_verifier();
159-
let secret_key_encoded = key_encode_hex(signer.secret_key.as_bytes()).unwrap();
160-
let verification_key_encoded =
161-
key_encode_hex(verifier.verification_key.as_bytes()).unwrap();
177+
let secret_key_encoded = signer.secret_key.to_json_hex().unwrap();
178+
let verification_key_encoded = verifier.verification_key.to_json_hex().unwrap();
162179
let secret_key_decoded: EraMarkersVerifierSecretKey =
163-
key_decode_hex(&secret_key_encoded).unwrap();
180+
secret_key_encoded.try_into().unwrap();
164181
let verification_key_decoded: EraMarkersVerifierVerificationKey =
165-
key_decode_hex(&verification_key_encoded).unwrap();
182+
verification_key_encoded.try_into().unwrap();
166183
let signer_decoded = EraMarkersSigner::from_secret_key(secret_key_decoded);
167184
let verifier_decoded = EraMarkersVerifier::from_verification_key(verification_key_decoded);
168185

mithril-common/src/entities/type_alias.rs

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,6 @@ pub type HexEncodedKeySlice<'a> = &'a str;
3333
/// Hex encoded Single Signature
3434
pub type HexEncodedSingleSignature = HexEncodedKey;
3535

36-
/// Hex encoded Multi Signature
37-
pub type HexEncodedMultiSignature = HexEncodedKey;
38-
3936
/// Hex encoded Aggregate Verification Key
4037
pub type HexEncodedAgregateVerificationKey = HexEncodedKey;
4138

@@ -54,17 +51,8 @@ pub type HexEncodedGenesisSecretKey = HexEncodedKey;
5451
/// Hex encoded Genesis Verification Key
5552
pub type HexEncodedGenesisVerificationKey = HexEncodedKey;
5653

57-
/// Hex encoded Genesis Signature
58-
pub type HexEncodedGenesisSignature = HexEncodedKey;
59-
6054
/// Hex encoded Sha256 Digest
6155
pub type HexEncodedDigest = HexEncodedKey;
6256

6357
/// Hex encoded Era Markers Secret Key
6458
pub type HexEncodedEraMarkersSecretKey = HexEncodedKey;
65-
66-
/// Hex encoded Era Markers Verification Key
67-
pub type HexEncodedEraMarkersVerificationKey = HexEncodedKey;
68-
69-
/// Hex encoded Era Markers Signature
70-
pub type HexEncodedEraMarkersSignature = HexEncodedKey;

mithril-common/src/era/adapters/builder.rs

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@ use thiserror::Error;
44

55
use crate::{
66
chain_observer::{ChainAddress, ChainObserver},
7-
crypto_helper::key_decode_hex,
8-
entities::HexEncodedEraMarkersSignature,
7+
crypto_helper::EraMarkersVerifierVerificationKey,
98
era::{
109
adapters::{
1110
EraReaderBootstrapAdapter, EraReaderCardanoChainAdapter, EraReaderDummyAdapter,
1211
EraReaderFileAdapter,
1312
},
1413
EraMarker, EraReaderAdapter,
1514
},
15+
StdError,
1616
};
1717

1818
/// Type of era reader adapaters available
@@ -43,7 +43,7 @@ pub enum AdapterBuilderError {
4343

4444
/// Parameters decode error.
4545
#[error("era reader adapter parameters decode error: {0:?}")]
46-
Decode(String),
46+
Decode(StdError),
4747
}
4848

4949
/// Era adapter builder
@@ -71,7 +71,7 @@ impl AdapterBuilder {
7171
#[derive(Deserialize)]
7272
struct CardanoChainAdapterConfig {
7373
address: ChainAddress,
74-
verification_key: HexEncodedEraMarkersSignature,
74+
verification_key: EraMarkersVerifierVerificationKey,
7575
}
7676

7777
let adapter_config: CardanoChainAdapterConfig = serde_json::from_str(
@@ -84,8 +84,7 @@ impl AdapterBuilder {
8484
Ok(Arc::new(EraReaderCardanoChainAdapter::new(
8585
adapter_config.address,
8686
chain_observer,
87-
key_decode_hex(&adapter_config.verification_key)
88-
.map_err(AdapterBuilderError::Decode)?,
87+
adapter_config.verification_key,
8988
)))
9089
}
9190
AdapterType::File => {
@@ -125,3 +124,25 @@ impl AdapterBuilder {
125124
}
126125
}
127126
}
127+
128+
#[cfg(test)]
129+
mod test {
130+
use crate::chain_observer::MockChainObserver;
131+
132+
use super::*;
133+
134+
const GOLDEN_ADAPTER_PARAMS: &str = r#"{
135+
"address":"addr_test1qrv5xfwh043mlc3vk5d97s4nmhxu7cmleyssvhx37gkfyejfe8d38v3vsfgetjafgrsdc49krug8wf04h5rmtengtejqlxrksk",
136+
"verification_key":"5b35352c3232382c3134342c38372c3133382c3133362c34382c382c31342c3138372c38352c3134382c39372c3233322c3235352c3232392c33382c3234342c3234372c3230342c3139382c31332c33312c3232322c32352c3136342c35322c3130322c39312c3132302c3230382c3134375d"
137+
}"#;
138+
139+
#[test]
140+
fn golden_test_for_cardano_chain() {
141+
AdapterBuilder::new(
142+
&AdapterType::CardanoChain,
143+
&Some(GOLDEN_ADAPTER_PARAMS.to_owned()),
144+
)
145+
.build(Arc::new(MockChainObserver::new()))
146+
.expect("building an cardano chain era reader with golden params should not fail");
147+
}
148+
}

0 commit comments

Comments
 (0)