passing message types properly between client and sp

This commit is contained in:
mfahampshire
2023-07-07 17:01:45 +02:00
parent 97693a496c
commit 7f37c95599
4 changed files with 65 additions and 29 deletions
@@ -1,13 +0,0 @@
Plan:
* rewrite ts cosmos broadcaster SP in rust
* create simple rust binary for client cli use with 2 functions:
* use standard CLI method - cf. NymCLI
* getSequence() for offline signing
* submitTx() for sending tx thru mixnet to SP for broadcasting
* rust server code - communicates with chain
* sdk
* nym validator client - broadcast client, gets sequence + submits tx
* rust client code - communicates with server via mixnet
* sdk
* nym validator client - offline signer
@@ -2,7 +2,7 @@ use nym_cli_commands::validator::mixnet::Mixnet;
use nym_crypto::generic_array::sequence;
use nym_sphinx_addressing::clients::Recipient;
use nym_validator_client::nyxd::CosmWasmClient;
use nym_validator_client::nyxd::cosmwasm_client::types::SequenceResponse;
// use nym_validator_client::nyxd::cosmwasm_client::types::SequenceResponse;
use nym_validator_client::signing::direct_wallet::DirectSecp256k1HdWallet;
use nym_validator_client::signing::tx_signer::TxSigner;
use nym_validator_client::signing::SignerData;
@@ -17,15 +17,25 @@ use serde::{Deserialize, Serialize};
// use serde_json::Result;
#[derive(Deserialize, Serialize)]
struct SequenceRequestData<'a> {
validator: &'a str,
struct SequenceRequest {
validator: String,
signer_address: AccountId,
request_type: String
// request_type: String
}
#[derive(Deserialize, Serialize)]
struct SequenceResponse {
sequence_response: u8,
chain_id: Id
}
struct SequenceResponseData {
sequence_response: SequenceResponse,
chain_id: Id
enum RequestTypes {
Sequence(SequenceRequest),
// Broadcast(BroadcastRequest)
}
enum ResponseTypes {
Sequence(SequenceResponse),
// Broadcast(BroadcastResponse)
}
pub async fn offline_sign(mnemonic: bip39::Mnemonic, to: AccountId, client: &mut MixnetClient , sp_address: Recipient) -> String {
@@ -33,7 +43,7 @@ pub async fn offline_sign(mnemonic: bip39::Mnemonic, to: AccountId, client: &mut
// TODO take coin amount from function args, + load network vars from config file.
let prefix = "n";
let denom: Denom = "unym".parse().unwrap();
let validator = "https://qwerty-validator.qa.nymte.ch";
let validator = String::from("https://qwerty-validator.qa.nymte.ch");
let signer = DirectSecp256k1HdWallet::from_mnemonic(prefix, mnemonic);
let signer_address = signer.try_derive_accounts().unwrap()[0].address().clone();
@@ -52,10 +62,10 @@ pub async fn offline_sign(mnemonic: bip39::Mnemonic, to: AccountId, client: &mut
// let chain_id = broadcaster.get_chain_id().await.unwrap();
///////////////
let message = SequenceRequestData{
let message = SequenceRequest{
validator,
signer_address,
request_type: String::from("sequence_request")
// request_type: String::from("sequence_request")
};
// send req to client
client.send_str(sp_address, &serde_json::to_string(&message).unwrap()).await;
@@ -64,7 +74,7 @@ pub async fn offline_sign(mnemonic: bip39::Mnemonic, to: AccountId, client: &mut
println!("{:#?}", i.message);
}
// parse json of res to get signer_data and chain_id, store in SeqResData struct
todo!()
/*
@@ -10,6 +10,7 @@ edition = "2021"
clap = { version = "4.0", features = ["derive"] }
nym-bin-common = { path = "../../common/bin-common"}
nym-sphinx-addressing = { path = "../../common/nymsphinx/addressing" }
nym-sphinx-anonymous-replies = { path = "../../common/nymsphinx/anonymous-replies" }
nym-sdk = { path = "../../sdk/rust/nym-sdk" }
nym-crypto = { path = "../../common/crypto" }
nym-cli-commands = { path = "../../common/commands" }
@@ -4,6 +4,31 @@ use nym_bin_common::logging::setup_logging;
use std::path::PathBuf;
mod commands;
use serde::{Deserialize, Serialize};
use cosmrs::rpc::{Id};
use nym_sphinx_anonymous_replies::{self, requests::RepliableMessage};
#[derive(Debug, Deserialize, Serialize)]
struct SequenceRequest {
validator: String,
signer_address: AccountId,
// request_type: String
}
#[derive(Deserialize, Serialize)]
struct SequenceResponse {
sequence_response: u8,
chain_id: Id
}
#[derive(Debug, Deserialize, Serialize)]
#[serde(untagged)]
enum RequestTypes {
Sequence(SequenceRequest),
// Broadcast(BroadcastRequest)
}
enum ResponseTypes {
Sequence(SequenceResponse),
// Broadcast(BroadcastResponse)
}
#[tokio::main]
async fn main() {
@@ -21,13 +46,26 @@ async fn main() {
let our_address = client.nym_address();
println!("Our client nym address is: {our_address}");
println!("Waiting for message");
println!("\nWaiting for message");
if let Some(received) = client.wait_for_messages().await {
for r in received {
let to_parse = String::from_utf8_lossy(&r.message);
println!("Received: {}", &to_parse);
let parsed = serde_json::from_str(&to_parse).unwrap();
for r in &received {
let s = String::from_utf8(r.message.clone());
if s.is_ok() {
let p = s.unwrap();
let request: RequestTypes = serde_json::from_str(&p).unwrap();
println!("incoming request: {:#?}", &request);
match request {
RequestTypes::Sequence(SequenceRequest) => {
println!("matched!")
// TODO pass to commands::fn
},
// RequestTypes::Broadcast(BroadcastRequest) // TODO
_ => {
println!(" (x_x) ")
}
}
}
/*
deserialise json