Skip to content

Commit 1bd233b

Browse files
author
Damien LACHAUME / PALO-IT
committed
Add Cardano transactions functionnalities in www/
1 parent 453ba89 commit 1bd233b

File tree

7 files changed

+60
-19
lines changed

7 files changed

+60
-19
lines changed

Cargo.lock

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

mithril-client-wasm/src/client_wasm.rs

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,10 @@ impl MithrilUnstableClient {
251251

252252
/// Call the client to get a Cardano transactions proofs
253253
#[wasm_bindgen]
254-
pub async fn get_cardano_transaction_proofs(&self, ctx_hashes: Box<[JsValue]>) -> WasmResult {
254+
pub async fn get_cardano_transaction_proofs(
255+
&self,
256+
ctx_hashes: Box<[JsValue]>,
257+
) -> Result<CardanoTransactionsProofs, JsValue> {
255258
let hashes = ctx_hashes
256259
.iter()
257260
.map(|h| {
@@ -269,21 +272,18 @@ impl MithrilUnstableClient {
269272
.await
270273
.map_err(|err| format!("{err:?}"))?;
271274

272-
Ok(serde_wasm_bindgen::to_value(&result)?)
275+
Ok(result)
273276
}
274277

275278
/// Call the client to compute a cardano transaction proof message
276279
#[wasm_bindgen]
277280
pub async fn compute_cardano_transaction_proof_message(
278281
&self,
279-
cardano_transaction_proof: JsValue,
282+
cardano_transaction_proof: CardanoTransactionsProofs,
280283
certificate: JsValue,
281284
) -> WasmResult {
282285
let certificate: MithrilCertificate =
283286
serde_wasm_bindgen::from_value(certificate).map_err(|err| format!("{err:?}"))?;
284-
let cardano_transaction_proof: CardanoTransactionsProofs =
285-
serde_wasm_bindgen::from_value(cardano_transaction_proof)
286-
.map_err(|err| format!("{err:?}"))?;
287287
let verified_proof = cardano_transaction_proof
288288
.verify()
289289
.map_err(|err| format!("{err:?}"))?;
@@ -545,12 +545,8 @@ mod tests {
545545
.get_cardano_transaction_proofs(ctx_hashes)
546546
.await
547547
.expect("get_verified_cardano_transaction_proofs should not fail");
548-
let cardano_tx_proof =
549-
serde_wasm_bindgen::from_value::<CardanoTransactionsProofs>(tx_proof.clone())
550-
.expect("conversion should not fail");
551-
552548
let certificate = client
553-
.get_mithril_certificate(&cardano_tx_proof.certificate_hash)
549+
.get_mithril_certificate(&tx_proof.certificate_hash)
554550
.await
555551
.unwrap();
556552

mithril-client-wasm/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
#![warn(missing_docs)]
21
//! Implementation of the 'mithril-client' library in WASM
2+
#![cfg(target_family = "wasm")]
3+
#![cfg_attr(target_family = "wasm", warn(missing_docs))]
4+
35
mod client_wasm;
46

57
pub use client_wasm::MithrilClient;

mithril-client-wasm/www/index.js

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
import initMithrilClient, { MithrilClient } from "@mithril-dev/mithril-client-wasm"
22

3-
let aggregator_endpoint =
4-
"https://aggregator.testing-preview.api.mithril.network/aggregator"
3+
// This example uses sanchonet network aggregator as it handles Cardano transactions entity type
4+
let aggregator_endpoint = "https://aggregator.testing-sanchonet.api.mithril.network/aggregator";
55
let genesis_verification_key =
6-
"5b3132372c37332c3132342c3136312c362c3133372c3133312c3231332c3230372c3131372c3139382c38352c3137362c3139392c3136322c3234312c36382c3132332c3131392c3134352c31332c3233322c3234332c34392c3232392c322c3234392c3230352c3230352c33392c3233352c34345d"
6+
"5b3132372c37332c3132342c3136312c362c3133372c3133312c3231332c3230372c3131372c3139382c38352c3137362c3139392c3136322c3234312c36382c3132332c3131392c3134352c31332c3233322c3234332c34392c3232392c322c3234392c3230352c3230352c33392c3233352c34345d";
77

88
const broadcast_channel = new BroadcastChannel("mithril-client");
99
broadcast_channel.onmessage = (e) => {
1010
let event = e.data;
1111
if (event.type == "CertificateChainValidationStarted") {
12-
displayMessageInDOM(event.type, "The certificate chain validation has started");
12+
displayMessageInDOM(event.type, "The certificate chain validation has started, event_id: " + event.payload.certificate_chain_validation_id);
1313
} else if (event.type == "CertificateValidated") {
14-
displayMessageInDOM(event.type, "A certificate has been validated, certificate_hash: " + event.payload.certificate_hash);
14+
displayMessageInDOM(event.type, "A certificate has been validated, certificate_hash: " + event.payload.certificate_hash + ", event_id: " + event.payload.certificate_chain_validation_id);
1515
} else if (event.type == "CertificateChainValidated") {
16-
displayMessageInDOM(event.type, "The certificate chain is valid");
16+
displayMessageInDOM(event.type, "The certificate chain is valid, event_id: " + event.payload.certificate_chain_validation_id);
1717
} else {
1818
displayMessageInDOM(event);
1919
}
@@ -71,4 +71,19 @@ console.log("mithril_stake_distributions_message:", mithril_stake_distributions_
7171
displayStepInDOM(6, "Validating Mithril stake distribution message...");
7272
let valid_stake_distribution_message = await client.verify_message_match_certificate(mithril_stake_distributions_message, last_certificate_from_chain);
7373
displayMessageInDOM("Result", "Mithril stake distribution message validated &#x2713;");
74-
console.log("valid_stake_distribution_message:", valid_stake_distribution_message);
74+
console.log("valid_stake_distribution_message:", valid_stake_distribution_message);
75+
76+
displayStepInDOM(7, "Getting transaction proof...");
77+
const proof = await client.unstable.get_cardano_transaction_proofs(["eac09f970f47ef3ab378db9232914e146773853397e79b904f1a45123a23c21f"]);
78+
displayMessageInDOM("Proof tx hash", proof.transactions_hashes);
79+
displayMessageInDOM("Proof certificate hash", proof.certificate_hash);
80+
81+
displayStepInDOM(9, "Verifying certificate chain...");
82+
let proof_certificate = await client.verify_certificate_chain(proof.certificate_hash);
83+
displayMessageInDOM("Result", "certificate chain verified &#x2713;");
84+
console.log("verify_certificate_chain OK, last_certificate_from_chain:", proof_certificate);
85+
86+
displayStepInDOM(10, "Validating Cardano transaction proof message...");
87+
let valid_cardano_transaction_proof = await client.unstable.compute_cardano_transaction_proof_message(proof, proof_certificate);
88+
displayMessageInDOM("Result", "Cardano transaction proof message validated &#x2713;");
89+
console.log("valid_cardano_transaction_proof:", valid_cardano_transaction_proof);

mithril-common/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ mithril-stm = { path = "../mithril-stm", version = "0.3", default-features = fal
7474
mithril-stm = { path = "../mithril-stm", version = "0.3", default-features = false, features = [
7575
"num-integer-backend",
7676
] }
77+
wasm-bindgen = "0.2.90"
7778

7879
[dev-dependencies]
7980
criterion = { version = "0.5.1", features = ["html_reports", "async_tokio"] }

mithril-common/src/messages/cardano_transactions_proof.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,15 @@ use crate::StdError;
66
use serde::{Deserialize, Serialize};
77
use thiserror::Error;
88

9+
#[cfg(target_family = "wasm")]
10+
use wasm_bindgen::prelude::*;
11+
912
/// A cryptographic proof for a set of Cardano transactions
1013
#[derive(Clone, Debug, PartialEq, Default, Serialize, Deserialize)]
14+
#[cfg_attr(
15+
target_family = "wasm",
16+
wasm_bindgen(getter_with_clone, js_name = "CardanoTransactionsProofs")
17+
)]
1118
pub struct CardanoTransactionsProofsMessage {
1219
/// Hash of the certificate that validate this proof merkle root
1320
pub certificate_hash: String,
@@ -19,6 +26,21 @@ pub struct CardanoTransactionsProofsMessage {
1926
pub non_certified_transactions: Vec<TransactionHash>,
2027
}
2128

29+
#[cfg_attr(
30+
target_family = "wasm",
31+
wasm_bindgen(js_class = "CardanoTransactionsProofs")
32+
)]
33+
impl CardanoTransactionsProofsMessage {
34+
/// Transactions that have been certified
35+
#[cfg_attr(target_family = "wasm", wasm_bindgen(getter))]
36+
pub fn transactions_hashes(&self) -> Vec<TransactionHash> {
37+
self.certified_transactions
38+
.iter()
39+
.flat_map(|ct| ct.transactions_hashes.clone())
40+
.collect::<Vec<_>>()
41+
}
42+
}
43+
2244
/// Set of transactions verified by [CardanoTransactionsProofsMessage::verify].
2345
///
2446
/// Can be used to reconstruct part of a [ProtocolMessage] in order to check that

mithril-common/src/messages/message_parts/cardano_transactions_set_proof.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
use crate::entities::{HexEncodedKey, TransactionHash};
22
use serde::{Deserialize, Serialize};
33

4+
#[cfg(target_family = "wasm")]
5+
use wasm_bindgen::prelude::*;
6+
47
/// A cryptographic proof of a set of Cardano transactions is included in the global Cardano transactions set
58
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
9+
#[cfg_attr(target_family = "wasm", wasm_bindgen(getter_with_clone))]
610
pub struct CardanoTransactionsSetProofMessagePart {
711
/// Hashes of the certified transactions
812
pub transactions_hashes: Vec<TransactionHash>,

0 commit comments

Comments
 (0)