From a6f34373033543eef3d10e1f20d0c6ea1da48626 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Wed, 9 Oct 2024 17:45:38 +0200 Subject: [PATCH 01/18] Add config param gramine_bin_prefix --- crates/cli/src/config.rs | 46 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/crates/cli/src/config.rs b/crates/cli/src/config.rs index ecae1ed4..c86b2866 100644 --- a/crates/cli/src/config.rs +++ b/crates/cli/src/config.rs @@ -1,4 +1,4 @@ -use std::path::PathBuf; +use std::{path::PathBuf, str::FromStr}; use cosmrs::tendermint::chain::Id as ChainId; use reqwest::Url; @@ -60,6 +60,10 @@ pub struct Config { /// Whether to build for release or debug #[serde(default)] pub release: bool, + + /// Prefix for gramine commands (to be used if docker is preferred) + #[serde(default)] + pub gramine_bin_prefix: GramineBinPrefix, } fn default_rpc_addr() -> String { @@ -100,6 +104,45 @@ fn default_app_dir() -> PathBuf { ".".parse().expect("default app_dir pathbuf failed") } +#[derive(Debug, Clone, Deserialize, Serialize)] +#[serde(transparent)] +pub struct GramineBinPrefix(String); + +impl Default for GramineBinPrefix { + fn default() -> Self { + Self::docker_stable_jammy() + } +} + +impl GramineBinPrefix { + pub fn empty() -> Self { + Self("".to_string()) + } + + pub fn docker_stable_jammy() -> Self { + GramineBinPrefix("docker run --device /dev/sgx_enclave --device /dev/sgx_provision gramineproject/gramine:stable-jammy".to_string()) + } + + pub fn docker_stable_focal() -> Self { + GramineBinPrefix("docker run --device /dev/sgx_enclave --device /dev/sgx_provision gramineproject/gramine:stable-focal".to_string()) + } +} + +impl FromStr for GramineBinPrefix { + type Err = (); + + fn from_str(s: &str) -> Result { + // TODO(hu55a1n1): validation + Ok(Self(s.to_string())) + } +} + +impl AsRef for GramineBinPrefix { + fn as_ref(&self) -> &str { + self.0.as_str() + } +} + impl Default for Config { fn default() -> Self { Config { @@ -115,6 +158,7 @@ impl Default for Config { trusted_height: u64::default(), trusted_hash: String::default(), release: false, + gramine_bin_prefix: Default::default(), } } } From a938d33dab7d1b7dc9b6267f21e781a4df089a1b Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 14 Oct 2024 15:22:22 +0200 Subject: [PATCH 02/18] Init seq num --- .../src/handler/execute/session_set_pub_key.rs | 15 +++++++++++---- crates/contracts/core/src/state.rs | 1 + 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/crates/contracts/core/src/handler/execute/session_set_pub_key.rs b/crates/contracts/core/src/handler/execute/session_set_pub_key.rs index ddebe9ed..5bd6612e 100644 --- a/crates/contracts/core/src/handler/execute/session_set_pub_key.rs +++ b/crates/contracts/core/src/handler/execute/session_set_pub_key.rs @@ -1,20 +1,27 @@ -use cosmwasm_std::{DepsMut, Env, HexBinary, MessageInfo, Response}; +use cosmwasm_std::{DepsMut, Env, HexBinary, MessageInfo, Response, Uint64}; use crate::{ - error::Error, handler::Handler, msg::execute::session_set_pub_key::SessionSetPubKey, - state::SESSION, + error::Error, + handler::Handler, + msg::execute::session_set_pub_key::SessionSetPubKey, + state::{SEQUENCE_NUM, SESSION}, }; impl Handler for SessionSetPubKey { fn handle(self, deps: DepsMut<'_>, _env: &Env, _info: &MessageInfo) -> Result { let session = SESSION.load(deps.storage).map_err(Error::Std)?; let (nonce, pub_key) = self.into_tuple(); + let session = session .with_pub_key(nonce, pub_key) .ok_or(Error::BadSessionTransition)?; - SESSION.save(deps.storage, &session).map_err(Error::Std)?; + let sequence_num = Uint64::new(0); + SEQUENCE_NUM + .save(deps.storage, &sequence_num) + .map_err(Error::Std)?; + Ok(Response::new() .add_attribute("action", "session_set_pub_key") .add_attribute( diff --git a/crates/contracts/core/src/state.rs b/crates/contracts/core/src/state.rs index b56b2fe5..ac8ef64a 100644 --- a/crates/contracts/core/src/state.rs +++ b/crates/contracts/core/src/state.rs @@ -251,3 +251,4 @@ impl Session { pub const CONFIG: Item = Item::new("quartz_config"); pub const SESSION: Item = Item::new("quartz_session"); pub const EPOCH_COUNTER: Item = Item::new("epoch_counter"); +pub const SEQUENCE_NUM: Item = Item::new("quartz_seq_num"); From ea640e122c4513580ed3709af138b7d9360f96ad Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 15 Oct 2024 10:45:48 +0200 Subject: [PATCH 03/18] Impl sequenced message and handler --- crates/contracts/core/src/handler/execute.rs | 1 + .../core/src/handler/execute/sequenced.rs | 16 ++++++++++ crates/contracts/core/src/msg/execute.rs | 1 + .../core/src/msg/execute/sequenced.rs | 29 +++++++++++++++++++ 4 files changed, 47 insertions(+) create mode 100644 crates/contracts/core/src/handler/execute/sequenced.rs create mode 100644 crates/contracts/core/src/msg/execute/sequenced.rs diff --git a/crates/contracts/core/src/handler/execute.rs b/crates/contracts/core/src/handler/execute.rs index c332ac98..c4e3dffa 100644 --- a/crates/contracts/core/src/handler/execute.rs +++ b/crates/contracts/core/src/handler/execute.rs @@ -1,4 +1,5 @@ pub mod attested; +pub mod sequenced; pub mod session_create; pub mod session_set_pub_key; diff --git a/crates/contracts/core/src/handler/execute/sequenced.rs b/crates/contracts/core/src/handler/execute/sequenced.rs new file mode 100644 index 00000000..d3223c50 --- /dev/null +++ b/crates/contracts/core/src/handler/execute/sequenced.rs @@ -0,0 +1,16 @@ +use cosmwasm_std::{DepsMut, Env, MessageInfo, Response, StdResult, Uint64}; + +use crate::{ + error::Error, handler::Handler, msg::execute::sequenced::SequencedMsg, state::SEQUENCE_NUM, +}; + +impl Handler for SequencedMsg { + fn handle(self, deps: DepsMut<'_>, env: &Env, info: &MessageInfo) -> Result { + SEQUENCE_NUM.update(deps.storage, |mut counter| -> StdResult<_> { + counter += Uint64::one(); + Ok(counter) + })?; + + self.0.handle(deps, env, info) + } +} diff --git a/crates/contracts/core/src/msg/execute.rs b/crates/contracts/core/src/msg/execute.rs index 493652c7..caa59f1b 100644 --- a/crates/contracts/core/src/msg/execute.rs +++ b/crates/contracts/core/src/msg/execute.rs @@ -1,4 +1,5 @@ pub mod attested; +pub mod sequenced; pub mod session_create; pub mod session_set_pub_key; diff --git a/crates/contracts/core/src/msg/execute/sequenced.rs b/crates/contracts/core/src/msg/execute/sequenced.rs new file mode 100644 index 00000000..db0d94ce --- /dev/null +++ b/crates/contracts/core/src/msg/execute/sequenced.rs @@ -0,0 +1,29 @@ +use cosmwasm_schema::cw_serde; +use cosmwasm_std::StdError; +use serde::Serialize; + +use crate::msg::HasDomainType; + +#[derive(Clone, Debug, PartialEq)] +pub struct SequencedMsg(pub D); + +#[cw_serde] +pub struct RawSequencedMsg(pub R); + +impl HasDomainType for RawSequencedMsg { + type DomainType = SequencedMsg; +} + +impl TryFrom> for SequencedMsg { + type Error = StdError; + + fn try_from(value: RawSequencedMsg) -> Result { + Ok(Self(value.0.try_into()?)) + } +} + +impl From> for RawSequencedMsg { + fn from(value: SequencedMsg) -> Self { + Self(value.0.into()) + } +} From 83e3ad9b48df74e7a3991c592cbd5c13f2339c47 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 15 Oct 2024 10:47:22 +0200 Subject: [PATCH 04/18] Update transfers contract to use sequenced msgs --- examples/transfers/contracts/src/contract.rs | 10 ++++++++-- examples/transfers/contracts/src/msg.rs | 10 +++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/examples/transfers/contracts/src/contract.rs b/examples/transfers/contracts/src/contract.rs index b39bac2f..7b7716c0 100644 --- a/examples/transfers/contracts/src/contract.rs +++ b/examples/transfers/contracts/src/contract.rs @@ -53,10 +53,16 @@ pub fn execute( ExecuteMsg::Deposit => deposit(deps, env, info), ExecuteMsg::Withdraw => withdraw(deps, env, info), ExecuteMsg::ClearTextTransferRequest(_) => unimplemented!(), - ExecuteMsg::QueryRequest(msg) => query_balance(deps, env, info, msg), + ExecuteMsg::QueryRequest(msg) => { + let _ = msg.clone().handle_raw(deps.branch(), &env, &info)?; + query_balance(deps, env, info, msg.0 .0) + } // Cipher user msgs - ExecuteMsg::TransferRequest(msg) => transfer_request(deps, env, info, msg), + ExecuteMsg::TransferRequest(msg) => { + let _ = msg.clone().handle_raw(deps.branch(), &env, &info)?; + transfer_request(deps, env, info, msg.0 .0) + } // Enclave msgs ExecuteMsg::Update(attested_msg) => { diff --git a/examples/transfers/contracts/src/msg.rs b/examples/transfers/contracts/src/msg.rs index 5f4ffedf..59adf641 100644 --- a/examples/transfers/contracts/src/msg.rs +++ b/examples/transfers/contracts/src/msg.rs @@ -1,10 +1,14 @@ use cosmwasm_schema::cw_serde; use quartz_common::contract::{ - msg::execute::attested::{RawAttested, RawAttestedMsgSansHandler, RawDefaultAttestation}, + msg::execute::{ + attested::{RawAttested, RawAttestedMsgSansHandler, RawDefaultAttestation}, + sequenced::RawSequencedMsg, + }, prelude::*, }; pub type AttestedMsg = RawAttested, RA>; +pub type SequencedMsgSansHandler = RawSequencedMsg>; #[cw_serde] pub struct InstantiateMsg { @@ -31,8 +35,8 @@ pub enum ExecuteMsg { Withdraw, ClearTextTransferRequest(execute::ClearTextTransferRequestMsg), // ciphertext - TransferRequest(execute::TransferRequestMsg), - QueryRequest(execute::QueryRequestMsg), + TransferRequest(SequencedMsgSansHandler), + QueryRequest(SequencedMsgSansHandler), // Enclave msgs Update(AttestedMsg), From 2893dea2f344415aa763305c8effef7b47d0cd10 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 15 Oct 2024 10:48:51 +0200 Subject: [PATCH 05/18] AttestedMsgSansHandler -> MsgSansHandler --- .../core/src/handler/execute/attested.rs | 5 ++--- .../contracts/core/src/msg/execute/attested.rs | 18 +++++++++--------- examples/transfers/contracts/src/msg.rs | 6 +++--- examples/transfers/enclave/src/wslistener.rs | 6 +++--- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/crates/contracts/core/src/handler/execute/attested.rs b/crates/contracts/core/src/handler/execute/attested.rs index 2546015d..5bec6de4 100644 --- a/crates/contracts/core/src/handler/execute/attested.rs +++ b/crates/contracts/core/src/handler/execute/attested.rs @@ -14,8 +14,7 @@ use crate::{ error::Error, handler::Handler, msg::execute::attested::{ - Attestation, Attested, AttestedMsgSansHandler, DcapAttestation, HasUserData, - MockAttestation, Quote, + Attestation, Attested, DcapAttestation, HasUserData, MockAttestation, MsgSansHandler, Quote, }, state::CONFIG, }; @@ -181,7 +180,7 @@ where } } -impl Handler for AttestedMsgSansHandler { +impl Handler for MsgSansHandler { fn handle( self, _deps: DepsMut<'_>, diff --git a/crates/contracts/core/src/msg/execute/attested.rs b/crates/contracts/core/src/msg/execute/attested.rs index 967b09ea..671a09d1 100644 --- a/crates/contracts/core/src/msg/execute/attested.rs +++ b/crates/contracts/core/src/msg/execute/attested.rs @@ -222,16 +222,16 @@ impl Attestation for MockAttestation { } #[derive(Clone, Debug, PartialEq)] -pub struct AttestedMsgSansHandler(pub T); +pub struct MsgSansHandler(pub T); #[cw_serde] -pub struct RawAttestedMsgSansHandler(pub T); +pub struct RawMsgSansHandler(pub T); -impl HasDomainType for RawAttestedMsgSansHandler { - type DomainType = AttestedMsgSansHandler; +impl HasDomainType for RawMsgSansHandler { + type DomainType = MsgSansHandler; } -impl HasUserData for AttestedMsgSansHandler +impl HasUserData for MsgSansHandler where T: HasUserData, { @@ -240,16 +240,16 @@ where } } -impl TryFrom> for AttestedMsgSansHandler { +impl TryFrom> for MsgSansHandler { type Error = StdError; - fn try_from(value: RawAttestedMsgSansHandler) -> Result { + fn try_from(value: RawMsgSansHandler) -> Result { Ok(Self(value.0)) } } -impl From> for RawAttestedMsgSansHandler { - fn from(value: AttestedMsgSansHandler) -> Self { +impl From> for RawMsgSansHandler { + fn from(value: MsgSansHandler) -> Self { Self(value.0) } } diff --git a/examples/transfers/contracts/src/msg.rs b/examples/transfers/contracts/src/msg.rs index 59adf641..48873cc5 100644 --- a/examples/transfers/contracts/src/msg.rs +++ b/examples/transfers/contracts/src/msg.rs @@ -1,14 +1,14 @@ use cosmwasm_schema::cw_serde; use quartz_common::contract::{ msg::execute::{ - attested::{RawAttested, RawAttestedMsgSansHandler, RawDefaultAttestation}, + attested::{RawAttested, RawDefaultAttestation, RawMsgSansHandler}, sequenced::RawSequencedMsg, }, prelude::*, }; -pub type AttestedMsg = RawAttested, RA>; -pub type SequencedMsgSansHandler = RawSequencedMsg>; +pub type AttestedMsg = RawAttested, RA>; +pub type SequencedMsgSansHandler = RawSequencedMsg>; #[cw_serde] pub struct InstantiateMsg { diff --git a/examples/transfers/enclave/src/wslistener.rs b/examples/transfers/enclave/src/wslistener.rs index 7c7e2534..f7bc9f85 100644 --- a/examples/transfers/enclave/src/wslistener.rs +++ b/examples/transfers/enclave/src/wslistener.rs @@ -6,7 +6,7 @@ use cosmwasm_std::{Addr, HexBinary}; use cw_client::{CwClient, GrpcClient}; use futures_util::StreamExt; use quartz_common::{ - contract::msg::execute::attested::{RawAttested, RawAttestedMsgSansHandler}, + contract::msg::execute::attested::{RawAttested, RawMsgSansHandler}, enclave::{ attestor::Attestor, server::{WebSocketHandler, WsListenerConfig}, @@ -241,7 +241,7 @@ where // Build on-chain response // TODO add non-mock support let transfer_msg = ExecuteMsg::Update(AttestedMsg { - msg: RawAttestedMsgSansHandler(attested.msg), + msg: RawMsgSansHandler(attested.msg), attestation: attested.attestation, }); @@ -311,7 +311,7 @@ where // Build on-chain response // TODO add non-mock support let query_msg = ExecuteMsg::QueryResponse(AttestedMsg { - msg: RawAttestedMsgSansHandler(attested.msg), + msg: RawMsgSansHandler(attested.msg), attestation: attested.attestation, }); From 773de664ebb09965da149094b44f00f3b30828bd Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 15 Oct 2024 12:54:33 +0200 Subject: [PATCH 06/18] Machinery for inter-service comm --- crates/enclave/core/src/server.rs | 32 ++++++++++++++++--- .../transfers/enclave/src/transfers_server.rs | 10 +++++- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/crates/enclave/core/src/server.rs b/crates/enclave/core/src/server.rs index f21d1abc..2fa10be1 100644 --- a/crates/enclave/core/src/server.rs +++ b/crates/enclave/core/src/server.rs @@ -43,6 +43,7 @@ use tendermint_rpc::{ query::{EventType, Query}, SubscriptionClient, WebSocketClient, }; +use tokio::sync::mpsc::{channel, Receiver, Sender}; use tonic::{ body::BoxBody, codegen::http, @@ -96,10 +97,20 @@ pub trait IntoServer { fn into_server(self) -> Self::Server; } +#[derive(Debug, Clone)] +pub enum CoreMsg { + GetSequenceNumber, +} +pub trait AppService { + fn accept_channel(&mut self, tx: Sender); +} + pub struct QuartzServer { pub router: Router, ws_handlers: Vec>, pub ws_config: WsListenerConfig, + tx: Sender, + rx: Receiver, } impl QuartzServer { @@ -114,16 +125,20 @@ impl QuartzServer { { let core_service = CoreServer::new(CoreService::new(config, sk.clone(), attestor.clone())); + let (tx, rx) = channel::(32); + Self { router: Server::builder().add_service(core_service), ws_handlers: Vec::new(), ws_config, + tx, + rx, } } - pub fn add_service(mut self, service: S) -> Self + pub fn add_service(mut self, mut service: S) -> Self where - S: IntoServer + WebSocketHandler + Clone, + S: IntoServer + WebSocketHandler + Clone + AppService, S::Server: Service< http::request::Request, Response = http::response::Response, @@ -136,13 +151,16 @@ impl QuartzServer { { self.ws_handlers.push(Box::new(service.clone())); - let tonic_server = service.into_server(); + let tonic_server = { + service.accept_channel(self.tx.clone()); + service.into_server() + }; self.router = self.router.add_service(tonic_server); self } - pub async fn serve(self, addr: SocketAddr) -> Result<(), QuartzError> { + pub async fn serve(mut self, addr: SocketAddr) -> Result<(), QuartzError> { // Launch all WebSocket handlers as separate Tokio tasks tokio::spawn(async move { if let Err(e) = Self::websocket_events_listener(&self.ws_handlers, self.ws_config).await @@ -151,6 +169,12 @@ impl QuartzServer { } }); + tokio::spawn(async move { + while let Some(msg) = self.rx.recv().await { + todo!("{:?}", msg) + } + }); + Ok(self.router.serve(addr).await?) } diff --git a/examples/transfers/enclave/src/transfers_server.rs b/examples/transfers/enclave/src/transfers_server.rs index fd2748b1..a1787970 100644 --- a/examples/transfers/enclave/src/transfers_server.rs +++ b/examples/transfers/enclave/src/transfers_server.rs @@ -14,7 +14,7 @@ use quartz_common::{ }, enclave::{ attestor::Attestor, - server::{IntoServer, ProofOfPublication, WsListenerConfig}, + server::{AppService, CoreMsg, IntoServer, ProofOfPublication, WsListenerConfig}, }, }; use serde::{Deserialize, Serialize}; @@ -39,6 +39,12 @@ impl IntoServer for TransfersService { } } +impl AppService for TransfersService { + fn accept_channel(&mut self, tx: Sender) { + self.tx = Some(tx); + } +} + pub type RawCipherText = HexBinary; #[derive(Clone, Debug, Serialize, Deserialize, Default)] @@ -122,6 +128,7 @@ pub struct TransfersService { sk: Arc>>, attestor: A, pub queue_producer: Sender>, + tx: Option>, } impl TransfersService @@ -139,6 +146,7 @@ where sk, attestor, queue_producer, + tx: None, } } } From 9447a2a265387f698d977ab2ad49aac8f5b85bd7 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 15 Oct 2024 15:28:58 +0200 Subject: [PATCH 07/18] Impl query_raw for GrpcClient --- crates/utils/cw-client/src/cli.rs | 2 +- crates/utils/cw-client/src/grpc.rs | 22 +++++++++++++++++----- crates/utils/cw-client/src/lib.rs | 2 +- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/crates/utils/cw-client/src/cli.rs b/crates/utils/cw-client/src/cli.rs index a352be46..de1043a5 100644 --- a/crates/utils/cw-client/src/cli.rs +++ b/crates/utils/cw-client/src/cli.rs @@ -106,7 +106,7 @@ impl CwClient for CliClient { Ok(query_result) } - fn query_raw( + async fn query_raw( &self, contract: &Self::Address, query: Self::RawQuery, diff --git a/crates/utils/cw-client/src/grpc.rs b/crates/utils/cw-client/src/grpc.rs index 00eb4c2d..7bcac895 100644 --- a/crates/utils/cw-client/src/grpc.rs +++ b/crates/utils/cw-client/src/grpc.rs @@ -12,7 +12,8 @@ use cosmos_sdk_proto::{ }, }, cosmwasm::wasm::v1::{ - query_client::QueryClient as WasmdQueryClient, QuerySmartContractStateRequest, + query_client::QueryClient as WasmdQueryClient, QueryRawContractStateRequest, + QuerySmartContractStateRequest, }, traits::Message, Any, @@ -69,12 +70,23 @@ impl CwClient for GrpcClient { .map_err(|e| anyhow!("failed to deserialize JSON reponse: {}", e)) } - fn query_raw( + async fn query_raw( &self, - _contract: &Self::Address, - _query: Self::RawQuery, + contract: &Self::Address, + query: Self::RawQuery, ) -> Result { - unimplemented!() + let mut client = WasmdQueryClient::connect(self.url.to_string()).await?; + + let raw_query_request = QueryRawContractStateRequest { + address: contract.to_string(), + query_data: query.to_string().into_bytes(), + }; + + let raw_query_response = client.raw_contract_state(raw_query_request).await?; + + let raw_value = raw_query_response.into_inner().data; + serde_json::from_slice(&raw_value) + .map_err(|e| anyhow!("failed to deserialize JSON reponse: {}", e)) } fn query_tx(&self, _txhash: &str) -> Result { diff --git a/crates/utils/cw-client/src/lib.rs b/crates/utils/cw-client/src/lib.rs index 70ecb59e..46875736 100644 --- a/crates/utils/cw-client/src/lib.rs +++ b/crates/utils/cw-client/src/lib.rs @@ -22,7 +22,7 @@ pub trait CwClient { query: Self::Query, ) -> Result; - fn query_raw( + async fn query_raw( &self, contract: &Self::Address, query: Self::RawQuery, From cc3972ada583b6d2275960f0f93e3a35a72c5d70 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 15 Oct 2024 15:29:39 +0200 Subject: [PATCH 08/18] Fetch on-chain seq-num as part of proofs --- crates/contracts/core/src/state.rs | 3 ++- examples/transfers/enclave/src/transfers_server.rs | 1 + examples/transfers/enclave/src/wslistener.rs | 12 ++++++++++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/crates/contracts/core/src/state.rs b/crates/contracts/core/src/state.rs index ac8ef64a..80b332c1 100644 --- a/crates/contracts/core/src/state.rs +++ b/crates/contracts/core/src/state.rs @@ -248,7 +248,8 @@ impl Session { } } +pub const SEQUENCE_NUM_KEY: &str = "quartz_seq_num"; pub const CONFIG: Item = Item::new("quartz_config"); pub const SESSION: Item = Item::new("quartz_session"); pub const EPOCH_COUNTER: Item = Item::new("epoch_counter"); -pub const SEQUENCE_NUM: Item = Item::new("quartz_seq_num"); +pub const SEQUENCE_NUM: Item = Item::new(SEQUENCE_NUM_KEY); diff --git a/examples/transfers/enclave/src/transfers_server.rs b/examples/transfers/enclave/src/transfers_server.rs index a1787970..fc1cb7bd 100644 --- a/examples/transfers/enclave/src/transfers_server.rs +++ b/examples/transfers/enclave/src/transfers_server.rs @@ -51,6 +51,7 @@ pub type RawCipherText = HexBinary; pub struct UpdateRequestMessage { pub state: HexBinary, pub requests: Vec, + pub seq_num: u64, } #[derive(Clone, Debug, Serialize, Deserialize)] diff --git a/examples/transfers/enclave/src/wslistener.rs b/examples/transfers/enclave/src/wslistener.rs index f7bc9f85..5de33793 100644 --- a/examples/transfers/enclave/src/wslistener.rs +++ b/examples/transfers/enclave/src/wslistener.rs @@ -6,7 +6,10 @@ use cosmwasm_std::{Addr, HexBinary}; use cw_client::{CwClient, GrpcClient}; use futures_util::StreamExt; use quartz_common::{ - contract::msg::execute::attested::{RawAttested, RawMsgSansHandler}, + contract::{ + msg::execute::attested::{RawAttested, RawMsgSansHandler}, + state::SEQUENCE_NUM_KEY, + }, enclave::{ attestor::Attestor, server::{WebSocketHandler, WsListenerConfig}, @@ -186,8 +189,13 @@ where .await .map_err(|e| anyhow!("Problem querying contract state: {}", e))?; + let seq_num = cw_client + .query_raw(contract, SEQUENCE_NUM_KEY.to_string()) + .await + .map_err(|e| anyhow!("Problem querying contract state: {}", e))?; + // Request body contents - let update_contents = UpdateRequestMessage { state, requests }; + let update_contents = UpdateRequestMessage { state, requests, seq_num }; // Wait 2 blocks info!("Waiting 2 blocks for light client proof"); From cee7cd4bbea173c4bab45f8e40429956a592befc Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 15 Oct 2024 15:48:11 +0200 Subject: [PATCH 09/18] Add checks for sequence numbers --- .../transfers/enclave/src/transfers_server.rs | 18 ++++++++++++++++++ examples/transfers/enclave/src/wslistener.rs | 6 +++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/examples/transfers/enclave/src/transfers_server.rs b/examples/transfers/enclave/src/transfers_server.rs index fc1cb7bd..50b34fe0 100644 --- a/examples/transfers/enclave/src/transfers_server.rs +++ b/examples/transfers/enclave/src/transfers_server.rs @@ -130,6 +130,7 @@ pub struct TransfersService { attestor: A, pub queue_producer: Sender>, tx: Option>, + seq_num: u64, } impl TransfersService @@ -148,6 +149,7 @@ where attestor, queue_producer, tx: None, + seq_num: 0, } } } @@ -197,6 +199,22 @@ where // Instantiate empty withdrawals map to include in response (Update message to smart contract) let mut withdrawals_response: Vec<(Addr, Uint128)> = Vec::<(Addr, Uint128)>::new(); + // make sure number of pending requests are equal to the diff b/w on-chain v/s in-mem seq num + let pending_sequenced_requests = message + .requests + .iter() + .filter(|req| matches!(req, TransfersRequest::Transfer(_))) + .count(); + + if message.seq_num < self.seq_num { + return Err(Status::failed_precondition("replay attempted")); + } + + let seq_num_diff = message.seq_num - self.seq_num; + if seq_num_diff != pending_sequenced_requests { + return Err(Status::failed_precondition("seq_num_diff mismatch")); + } + // Loop through requests, match on cases, and apply changes to state for req in message.requests { match req { diff --git a/examples/transfers/enclave/src/wslistener.rs b/examples/transfers/enclave/src/wslistener.rs index 5de33793..5bb4a866 100644 --- a/examples/transfers/enclave/src/wslistener.rs +++ b/examples/transfers/enclave/src/wslistener.rs @@ -195,7 +195,11 @@ where .map_err(|e| anyhow!("Problem querying contract state: {}", e))?; // Request body contents - let update_contents = UpdateRequestMessage { state, requests, seq_num }; + let update_contents = UpdateRequestMessage { + state, + requests, + seq_num, + }; // Wait 2 blocks info!("Waiting 2 blocks for light client proof"); From ae00349d6a7530900a6ac1eeb86ed69ed7c6feb6 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 21 Oct 2024 23:05:52 +0200 Subject: [PATCH 10/18] Patch transfers app quartz deps to use repo paths --- examples/transfers/contracts/Cargo.lock | 59 ++++---- examples/transfers/contracts/Cargo.toml | 3 + examples/transfers/enclave/Cargo.lock | 187 +++++++++++------------- examples/transfers/enclave/Cargo.toml | 5 + 4 files changed, 122 insertions(+), 132 deletions(-) diff --git a/examples/transfers/contracts/Cargo.lock b/examples/transfers/contracts/Cargo.lock index 5c0b8005..8761ff1a 100644 --- a/examples/transfers/contracts/Cargo.lock +++ b/examples/transfers/contracts/Cargo.lock @@ -295,9 +295,9 @@ checksum = "1582e1c9e755dd6ad6b224dcffb135d199399a4568d454bd89fe515ca8425695" [[package]] name = "cc" -version = "1.1.24" +version = "1.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812acba72f0a070b003d3697490d2b55b837230ae7c6c6497f05cc2ddbb8d938" +checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" dependencies = [ "shlex", ] @@ -976,9 +976,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -1009,9 +1009,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.159" +version = "0.2.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "f0b21006cd1874ae9e650973c565615676dc4a274c965bb0a73796dac838ce4f" [[package]] name = "libloading" @@ -1200,12 +1200,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.1" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" -dependencies = [ - "portable-atomic", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "p256" @@ -1250,12 +1247,6 @@ dependencies = [ "spki", ] -[[package]] -name = "portable-atomic" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" - [[package]] name = "powerfmt" version = "0.2.0" @@ -1292,9 +1283,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" dependencies = [ "unicode-ident", ] @@ -1324,7 +1315,7 @@ dependencies = [ [[package]] name = "quartz-common" -version = "0.1.0" +version = "0.1.1" dependencies = [ "quartz-contract-core", ] @@ -1636,9 +1627,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.10.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9720086b3357bcb44fce40117d769a4d068c70ecfa190850a980a71755f66fcc" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ "base64", "chrono", @@ -1652,9 +1643,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.10.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f1abbfe725f27678f4663bcacb75a83e829fd464c25d78dd038a3a29e307cec" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ "darling", "proc-macro2", @@ -1861,9 +1852,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", "once_cell", @@ -1872,9 +1863,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", @@ -1887,9 +1878,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1897,9 +1888,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", @@ -1910,9 +1901,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "which" diff --git a/examples/transfers/contracts/Cargo.toml b/examples/transfers/contracts/Cargo.toml index 992d2e5b..7f5b8aaf 100644 --- a/examples/transfers/contracts/Cargo.toml +++ b/examples/transfers/contracts/Cargo.toml @@ -54,3 +54,6 @@ getrandom = { version = "0.2.15", features = ["js"] } [dev-dependencies] cw-multi-test = { version = "2.1.0", default-features = false } serde_json = "1.0.122" + +[patch.crates-io] +quartz-common = { path = "../../../crates/common" } diff --git a/examples/transfers/enclave/Cargo.lock b/examples/transfers/enclave/Cargo.lock index 8db89875..5c666c02 100644 --- a/examples/transfers/enclave/Cargo.lock +++ b/examples/transfers/enclave/Cargo.lock @@ -536,9 +536,9 @@ checksum = "1582e1c9e755dd6ad6b224dcffb135d199399a4568d454bd89fe515ca8425695" [[package]] name = "cc" -version = "1.1.24" +version = "1.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812acba72f0a070b003d3697490d2b55b837230ae7c6c6497f05cc2ddbb8d938" +checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945" dependencies = [ "shlex", ] @@ -618,9 +618,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.19" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be5744db7978a28d9df86a214130d106a89ce49644cbc4e3f0c22c3fba30615" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ "clap_builder", "clap_derive", @@ -628,9 +628,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.19" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5fbc17d3ef8278f55b282b2a2e75ae6f6c7d4bb70ed3d0382375104bfafdb4b" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ "anstyle", "clap_lex", @@ -1380,9 +1380,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -1394,9 +1394,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", "futures-sink", @@ -1404,21 +1404,21 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-macro" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", @@ -1427,21 +1427,21 @@ dependencies = [ [[package]] name = "futures-sink" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] name = "futures-task" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] name = "futures-util" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-core", "futures-io", @@ -1720,9 +1720,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.30" +version = "0.14.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" dependencies = [ "bytes", "futures-channel", @@ -1744,9 +1744,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" dependencies = [ "bytes", "futures-channel", @@ -1771,7 +1771,7 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper 0.14.30", + "hyper 0.14.31", "rustls 0.21.12", "tokio", "tokio-rustls 0.24.1", @@ -1785,9 +1785,9 @@ checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ "futures-util", "http 1.1.0", - "hyper 1.4.1", + "hyper 1.5.0", "hyper-util", - "rustls 0.23.13", + "rustls 0.23.15", "rustls-pki-types", "tokio", "tokio-rustls 0.26.0", @@ -1801,7 +1801,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3203a961e5c83b6f5498933e78b6b263e208c197b63e9c6c53cc82ffd3f63793" dependencies = [ - "hyper 1.4.1", + "hyper 1.5.0", "hyper-util", "pin-project-lite", "tokio", @@ -1816,7 +1816,7 @@ checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ "bytes", "http-body-util", - "hyper 1.4.1", + "hyper 1.5.0", "hyper-util", "native-tls", "tokio", @@ -1835,7 +1835,7 @@ dependencies = [ "futures-util", "http 1.1.0", "http-body 1.0.1", - "hyper 1.4.1", + "hyper 1.5.0", "pin-project-lite", "socket2", "tokio", @@ -1913,9 +1913,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "itertools" @@ -1943,9 +1943,9 @@ checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ "wasm-bindgen", ] @@ -1985,9 +1985,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.159" +version = "0.2.160" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +checksum = "f0b21006cd1874ae9e650973c565615676dc4a274c965bb0a73796dac838ce4f" [[package]] name = "libloading" @@ -2305,12 +2305,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.1" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82881c4be219ab5faaf2ad5e5e5ecdff8c66bd7402ca3160975c93b24961afd1" -dependencies = [ - "portable-atomic", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "opaque-debug" @@ -2320,9 +2317,9 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "openssl" -version = "0.10.66" +version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -2352,9 +2349,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.103" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", @@ -2469,18 +2466,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" dependencies = [ "proc-macro2", "quote", @@ -2527,12 +2524,6 @@ dependencies = [ "universal-hash", ] -[[package]] -name = "portable-atomic" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" - [[package]] name = "powerfmt" version = "0.2.0" @@ -2569,9 +2560,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" dependencies = [ "unicode-ident", ] @@ -2666,7 +2657,7 @@ dependencies = [ [[package]] name = "quartz-common" -version = "0.1.0" +version = "0.1.1" dependencies = [ "quartz-contract-core", "quartz-enclave-core", @@ -2718,7 +2709,7 @@ dependencies = [ [[package]] name = "quartz-enclave-core" -version = "0.1.0" +version = "0.1.1" dependencies = [ "anyhow", "async-trait", @@ -2826,7 +2817,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash 2.0.0", - "rustls 0.23.13", + "rustls 0.23.15", "socket2", "thiserror", "tokio", @@ -2843,7 +2834,7 @@ dependencies = [ "rand", "ring", "rustc-hash 2.0.0", - "rustls 0.23.13", + "rustls 0.23.15", "slab", "thiserror", "tinyvec", @@ -2989,7 +2980,7 @@ dependencies = [ "h2 0.3.26", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.30", + "hyper 0.14.31", "hyper-rustls 0.24.2", "ipnet", "js-sys", @@ -3032,7 +3023,7 @@ dependencies = [ "http 1.1.0", "http-body 1.0.1", "http-body-util", - "hyper 1.4.1", + "hyper 1.5.0", "hyper-rustls 0.27.3", "hyper-tls", "hyper-util", @@ -3045,7 +3036,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.13", + "rustls 0.23.15", "rustls-pemfile 2.2.0", "rustls-pki-types", "serde", @@ -3176,9 +3167,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.13" +version = "0.23.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" dependencies = [ "once_cell", "ring", @@ -3233,9 +3224,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" [[package]] name = "rustls-webpki" @@ -3260,9 +3251,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "ryu" @@ -3281,9 +3272,9 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" +checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" dependencies = [ "windows-sys 0.59.0", ] @@ -3476,9 +3467,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.10.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9720086b3357bcb44fce40117d769a4d068c70ecfa190850a980a71755f66fcc" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" dependencies = [ "base64 0.22.1", "chrono", @@ -3492,9 +3483,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.10.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f1abbfe725f27678f4663bcacb75a83e829fd464c25d78dd038a3a29e307cec" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" dependencies = [ "darling", "proc-macro2", @@ -4045,7 +4036,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.13", + "rustls 0.23.15", "rustls-pki-types", "tokio", ] @@ -4123,7 +4114,7 @@ dependencies = [ "http 1.1.0", "http-body 1.0.1", "http-body-util", - "hyper 1.4.1", + "hyper 1.5.0", "hyper-timeout", "hyper-util", "percent-encoding", @@ -4294,9 +4285,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" @@ -4360,9 +4351,9 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "uuid" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" +checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" [[package]] name = "vcpkg" @@ -4403,9 +4394,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", "once_cell", @@ -4414,9 +4405,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", @@ -4429,9 +4420,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", @@ -4441,9 +4432,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4451,9 +4442,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", @@ -4464,15 +4455,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", diff --git a/examples/transfers/enclave/Cargo.toml b/examples/transfers/enclave/Cargo.toml index c4f52e89..c73eeada 100644 --- a/examples/transfers/enclave/Cargo.toml +++ b/examples/transfers/enclave/Cargo.toml @@ -80,3 +80,8 @@ tonic-build = { version = "0.12.1", default-features = false, features = [ "prost", "transport", ] } + +[patch.crates-io] +cw-client = { path = "../../../crates/utils/cw-client" } +quartz-common = { path = "../../../crates/common" } +quartz-tm-prover = { path = "../../../crates/utils/tm-prover" } From 973974c85eeea33a3a2f2bda44b8d72cdcf9bd01 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 21 Oct 2024 23:06:36 +0200 Subject: [PATCH 11/18] Fix casting bug --- examples/transfers/enclave/src/transfers_server.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/transfers/enclave/src/transfers_server.rs b/examples/transfers/enclave/src/transfers_server.rs index 50b34fe0..eb1b9e26 100644 --- a/examples/transfers/enclave/src/transfers_server.rs +++ b/examples/transfers/enclave/src/transfers_server.rs @@ -211,7 +211,7 @@ where } let seq_num_diff = message.seq_num - self.seq_num; - if seq_num_diff != pending_sequenced_requests { + if seq_num_diff != pending_sequenced_requests as u64 { return Err(Status::failed_precondition("seq_num_diff mismatch")); } From 20e1d6b67a32c8e2ea5ca43cebeea07a5102c7d3 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 21 Oct 2024 23:41:26 +0200 Subject: [PATCH 12/18] Revert "Add config param gramine_bin_prefix" This reverts commit a6f34373033543eef3d10e1f20d0c6ea1da48626. --- crates/cli/src/config.rs | 46 +--------------------------------------- 1 file changed, 1 insertion(+), 45 deletions(-) diff --git a/crates/cli/src/config.rs b/crates/cli/src/config.rs index c86b2866..ecae1ed4 100644 --- a/crates/cli/src/config.rs +++ b/crates/cli/src/config.rs @@ -1,4 +1,4 @@ -use std::{path::PathBuf, str::FromStr}; +use std::path::PathBuf; use cosmrs::tendermint::chain::Id as ChainId; use reqwest::Url; @@ -60,10 +60,6 @@ pub struct Config { /// Whether to build for release or debug #[serde(default)] pub release: bool, - - /// Prefix for gramine commands (to be used if docker is preferred) - #[serde(default)] - pub gramine_bin_prefix: GramineBinPrefix, } fn default_rpc_addr() -> String { @@ -104,45 +100,6 @@ fn default_app_dir() -> PathBuf { ".".parse().expect("default app_dir pathbuf failed") } -#[derive(Debug, Clone, Deserialize, Serialize)] -#[serde(transparent)] -pub struct GramineBinPrefix(String); - -impl Default for GramineBinPrefix { - fn default() -> Self { - Self::docker_stable_jammy() - } -} - -impl GramineBinPrefix { - pub fn empty() -> Self { - Self("".to_string()) - } - - pub fn docker_stable_jammy() -> Self { - GramineBinPrefix("docker run --device /dev/sgx_enclave --device /dev/sgx_provision gramineproject/gramine:stable-jammy".to_string()) - } - - pub fn docker_stable_focal() -> Self { - GramineBinPrefix("docker run --device /dev/sgx_enclave --device /dev/sgx_provision gramineproject/gramine:stable-focal".to_string()) - } -} - -impl FromStr for GramineBinPrefix { - type Err = (); - - fn from_str(s: &str) -> Result { - // TODO(hu55a1n1): validation - Ok(Self(s.to_string())) - } -} - -impl AsRef for GramineBinPrefix { - fn as_ref(&self) -> &str { - self.0.as_str() - } -} - impl Default for Config { fn default() -> Self { Config { @@ -158,7 +115,6 @@ impl Default for Config { trusted_height: u64::default(), trusted_hash: String::default(), release: false, - gramine_bin_prefix: Default::default(), } } } From 45e08bd16e19a3711d0fc2ae0af749e92e4d2071 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 22 Oct 2024 00:03:20 +0200 Subject: [PATCH 13/18] Delete non-deterministic grpc client tests --- Cargo.lock | 112 ++++------------------------- crates/utils/cw-client/Cargo.toml | 4 -- crates/utils/cw-client/src/grpc.rs | 62 ---------------- 3 files changed, 12 insertions(+), 166 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 16111244..0b93cd32 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1293,9 +1293,7 @@ dependencies = [ "serde", "serde_json", "tendermint", - "tokio", "tonic", - "transfers-contract", ] [[package]] @@ -4257,45 +4255,14 @@ dependencies = [ name = "quartz-common" version = "0.1.1" dependencies = [ - "quartz-contract-core 0.1.0", + "quartz-contract-core", "quartz-enclave-core", "quartz-proto", ] -[[package]] -name = "quartz-common" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede21ada6835cd4f0982988c6987099707c82ef2d41ca460424164b139da039d" -dependencies = [ - "quartz-contract-core 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "quartz-contract-core" -version = "0.1.0" -dependencies = [ - "ciborium", - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus", - "hex", - "k256", - "quartz-dcap-verifier-msgs 0.1.0", - "quartz-tcbinfo-msgs 0.1.0", - "quartz-tee-ra 0.1.0", - "serde", - "serde_json", - "serde_with", - "sha2 0.10.8", - "thiserror", -] - [[package]] name = "quartz-contract-core" version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bba4ce403201fecbea60e7fccd8624fb3f8a62c29ec4eae280a9e20ec7fdc273" dependencies = [ "ciborium", "cosmwasm-schema", @@ -4303,9 +4270,9 @@ dependencies = [ "cw-storage-plus", "hex", "k256", - "quartz-dcap-verifier-msgs 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "quartz-tcbinfo-msgs 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "quartz-tee-ra 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "quartz-dcap-verifier-msgs", + "quartz-tcbinfo-msgs", + "quartz-tee-ra", "serde", "serde_json", "serde_with", @@ -4351,8 +4318,8 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "getrandom", - "quartz-dcap-verifier-msgs 0.1.0", - "quartz-tee-ra 0.1.0", + "quartz-dcap-verifier-msgs", + "quartz-tee-ra", ] [[package]] @@ -4363,16 +4330,6 @@ dependencies = [ "cosmwasm-std", ] -[[package]] -name = "quartz-dcap-verifier-msgs" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a6e9adb2e1877aa743947f021bebb9dffcee248e1ecb469acdda9c7fd0342fb" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", -] - [[package]] name = "quartz-enclave-core" version = "0.1.1" @@ -4388,10 +4345,10 @@ dependencies = [ "hex", "k256", "mc-sgx-dcap-sys-types", - "quartz-contract-core 0.1.0", + "quartz-contract-core", "quartz-cw-proof", "quartz-proto", - "quartz-tee-ra 0.1.0", + "quartz-tee-ra", "quartz-tm-stateless-verifier", "rand", "reqwest 0.12.8", @@ -4452,8 +4409,8 @@ dependencies = [ "miette", "once_cell", "prost", - "quartz-common 0.1.1", - "quartz-tee-ra 0.1.0", + "quartz-common", + "quartz-tee-ra", "quartz-tm-prover", "regex", "reqwest 0.12.8", @@ -4492,8 +4449,8 @@ dependencies = [ "hex", "mc-attestation-verifier", "p256", - "quartz-tcbinfo-msgs 0.1.0", - "quartz-tee-ra 0.1.0", + "quartz-tcbinfo-msgs", + "quartz-tee-ra", "schemars", "serde", "serde_json", @@ -4508,15 +4465,6 @@ dependencies = [ "cosmwasm-schema", ] -[[package]] -name = "quartz-tcbinfo-msgs" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addfd5be75e367b1e2a1da5dd9c2ee7b75527ccc02e29ce3df701f54387f8732" -dependencies = [ - "cosmwasm-schema", -] - [[package]] name = "quartz-tee-ra" version = "0.1.0" @@ -4539,27 +4487,6 @@ dependencies = [ "x509-parser", ] -[[package]] -name = "quartz-tee-ra" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42bbe5f9eaf06430360b7bc0d5e1d0941b7aa720f6241088cd012321f69b0b52" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "der", - "hex-literal", - "mc-attestation-verifier", - "mc-sgx-dcap-types", - "num-bigint", - "serde", - "serde_json", - "sha2 0.10.8", - "thiserror", - "x509-cert", - "x509-parser", -] - [[package]] name = "quartz-tm-prover" version = "0.1.0" @@ -6238,21 +6165,6 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "transfers-contract" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus", - "cw-utils", - "getrandom", - "quartz-common 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json", - "sha2 0.10.8", - "thiserror", -] - [[package]] name = "try-lock" version = "0.2.5" diff --git a/crates/utils/cw-client/Cargo.toml b/crates/utils/cw-client/Cargo.toml index f1ef2d9a..415e0e56 100644 --- a/crates/utils/cw-client/Cargo.toml +++ b/crates/utils/cw-client/Cargo.toml @@ -31,7 +31,3 @@ tonic.workspace = true cosmrs = { workspace = true, default-features = false, features = ["cosmwasm"] } cosmos-sdk-proto = { workspace = true, default-features = false, features = ["grpc", "grpc-transport"] } tendermint = { workspace = true, default-features = false } - -[dev-dependencies] -tokio.workspace = true -transfers-contract = { path = "../../../examples/transfers/contracts" } diff --git a/crates/utils/cw-client/src/grpc.rs b/crates/utils/cw-client/src/grpc.rs index 7bcac895..2bc426e1 100644 --- a/crates/utils/cw-client/src/grpc.rs +++ b/crates/utils/cw-client/src/grpc.rs @@ -215,65 +215,3 @@ pub async fn send_tx( let tx_response = client.broadcast_tx(request).await?; Ok(tx_response.into_inner()) } - -#[cfg(test)] -mod tests { - use std::error::Error; - - use serde_json::json; - use transfers_contract::msg::{execute::Request, QueryMsg::GetRequests}; - - use crate::{grpc::GrpcClient, CwClient}; - - #[tokio::test] - #[ignore] - async fn test_query() -> Result<(), Box> { - let sk = hex::decode("ffc4d3c9119e9e8263de08c0f6e2368ac5c2dacecfeb393f6813da7d178873d2") - .unwrap() - .as_slice() - .try_into() - .unwrap(); - let url = "https://grpc-falcron.pion-1.ntrn.tech:80".parse().unwrap(); - let contract = "neutron15ruzx9wvrupt9cffzsp6868uad2svhfym2nsgxm2skpeqr3qrd4q4uwk83" - .parse() - .unwrap(); - - let cw_client = GrpcClient::new(sk, url); - let resp: Vec = cw_client - .query_smart(&contract, json!(GetRequests {})) - .await?; - println!("{resp:?}"); - - Ok(()) - } - - #[tokio::test] - #[ignore] - async fn test_execute() -> Result<(), Box> { - let sk = hex::decode("ffc4d3c9119e9e8263de08c0f6e2368ac5c2dacecfeb393f6813da7d178873d2") - .unwrap() - .as_slice() - .try_into() - .unwrap(); - let url = "https://grpc-falcron.pion-1.ntrn.tech:80".parse().unwrap(); - let contract = "neutron15ruzx9wvrupt9cffzsp6868uad2svhfym2nsgxm2skpeqr3qrd4q4uwk83" - .parse() - .unwrap(); - let chain_id = "pion-1".parse().unwrap(); - - let cw_client = GrpcClient::new(sk, url); - let tx_hash = cw_client - .tx_execute( - &contract, - &chain_id, - 2000000, - "/* unused since we're getting the account from the sk */", - json!([]), - "11000untrn", - ) - .await?; - println!("{}", tx_hash); - - Ok(()) - } -} From d727072e40a9eaf4aca41409e8efa89010014f6a Mon Sep 17 00:00:00 2001 From: Shoaib Ahmed Date: Thu, 7 Nov 2024 00:12:27 +0400 Subject: [PATCH 14/18] Fix merge --- crates/utils/cw-client/src/grpc.rs | 62 ------------------------------ 1 file changed, 62 deletions(-) diff --git a/crates/utils/cw-client/src/grpc.rs b/crates/utils/cw-client/src/grpc.rs index abe37440..5dae43c3 100644 --- a/crates/utils/cw-client/src/grpc.rs +++ b/crates/utils/cw-client/src/grpc.rs @@ -215,65 +215,3 @@ pub async fn send_tx( let tx_response = client.broadcast_tx(request).await?; Ok(tx_response.into_inner()) } - -#[cfg(test)] -mod tests { - use std::error::Error; - - use serde_json::json; - use transfers_contract::msg::{execute::Request, QueryMsg::GetRequests}; - - use crate::{grpc::GrpcClient, CwClient}; - - #[tokio::test] - #[ignore] - async fn test_query() -> Result<(), Box> { - let sk = hex::decode("ffc4d3c9119e9e8263de08c0f6e2368ac5c2dacecfeb393f6813da7d178873d2") - .unwrap() - .as_slice() - .try_into() - .unwrap(); - let url = "https://grpc-falcron.pion-1.ntrn.tech:80".parse().unwrap(); - let contract = "neutron15ruzx9wvrupt9cffzsp6868uad2svhfym2nsgxm2skpeqr3qrd4q4uwk83" - .parse() - .unwrap(); - - let cw_client = GrpcClient::new(sk, url); - let resp: Vec = cw_client - .query_smart(&contract, json!(GetRequests {})) - .await?; - println!("{resp:?}"); - - Ok(()) - } - - #[tokio::test] - #[ignore] - async fn test_execute() -> Result<(), Box> { - let sk = hex::decode("ffc4d3c9119e9e8263de08c0f6e2368ac5c2dacecfeb393f6813da7d178873d2") - .unwrap() - .as_slice() - .try_into() - .unwrap(); - let url = "https://grpc-falcron.pion-1.ntrn.tech:80".parse().unwrap(); - let contract = "neutron15ruzx9wvrupt9cffzsp6868uad2svhfym2nsgxm2skpeqr3qrd4q4uwk83" - .parse() - .unwrap(); - let chain_id = "pion-1".parse().unwrap(); - - let cw_client = GrpcClient::new(sk, url); - let tx_hash = cw_client - .tx_execute( - &contract, - &chain_id, - 2000000, - "/* unused since we're getting the account from the sk */", - json!([]), - "0untrn", - ) - .await?; - println!("{}", tx_hash); - - Ok(()) - } -} From 34235abff0fc7ad228892a0960dddc0bda4f3007 Mon Sep 17 00:00:00 2001 From: Shoaib Ahmed Date: Thu, 7 Nov 2024 01:40:06 +0400 Subject: [PATCH 15/18] Fix serde for sequence num --- examples/transfers/enclave/src/wslistener.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/transfers/enclave/src/wslistener.rs b/examples/transfers/enclave/src/wslistener.rs index 5bb4a866..8fd7dce7 100644 --- a/examples/transfers/enclave/src/wslistener.rs +++ b/examples/transfers/enclave/src/wslistener.rs @@ -2,7 +2,7 @@ use std::{collections::BTreeMap, str::FromStr}; use anyhow::{anyhow, Error, Result}; use cosmrs::{tendermint::chain::Id as ChainId, AccountId}; -use cosmwasm_std::{Addr, HexBinary}; +use cosmwasm_std::{Addr, HexBinary, Uint64}; use cw_client::{CwClient, GrpcClient}; use futures_util::StreamExt; use quartz_common::{ @@ -189,7 +189,7 @@ where .await .map_err(|e| anyhow!("Problem querying contract state: {}", e))?; - let seq_num = cw_client + let seq_num: Uint64 = cw_client .query_raw(contract, SEQUENCE_NUM_KEY.to_string()) .await .map_err(|e| anyhow!("Problem querying contract state: {}", e))?; @@ -198,7 +198,7 @@ where let update_contents = UpdateRequestMessage { state, requests, - seq_num, + seq_num: seq_num.into(), }; // Wait 2 blocks From 5861808fb2414be9e9449782ae860524db14d298 Mon Sep 17 00:00:00 2001 From: Shoaib Ahmed Date: Thu, 7 Nov 2024 03:02:07 +0400 Subject: [PATCH 16/18] Disable sequencing for QueryRequest --- examples/transfers/contracts/src/contract.rs | 5 +---- examples/transfers/contracts/src/msg.rs | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/examples/transfers/contracts/src/contract.rs b/examples/transfers/contracts/src/contract.rs index 7b7716c0..7748872a 100644 --- a/examples/transfers/contracts/src/contract.rs +++ b/examples/transfers/contracts/src/contract.rs @@ -53,10 +53,7 @@ pub fn execute( ExecuteMsg::Deposit => deposit(deps, env, info), ExecuteMsg::Withdraw => withdraw(deps, env, info), ExecuteMsg::ClearTextTransferRequest(_) => unimplemented!(), - ExecuteMsg::QueryRequest(msg) => { - let _ = msg.clone().handle_raw(deps.branch(), &env, &info)?; - query_balance(deps, env, info, msg.0 .0) - } + ExecuteMsg::QueryRequest(msg) => query_balance(deps, env, info, msg), // Cipher user msgs ExecuteMsg::TransferRequest(msg) => { diff --git a/examples/transfers/contracts/src/msg.rs b/examples/transfers/contracts/src/msg.rs index 48873cc5..d6f68d11 100644 --- a/examples/transfers/contracts/src/msg.rs +++ b/examples/transfers/contracts/src/msg.rs @@ -36,7 +36,7 @@ pub enum ExecuteMsg { ClearTextTransferRequest(execute::ClearTextTransferRequestMsg), // ciphertext TransferRequest(SequencedMsgSansHandler), - QueryRequest(SequencedMsgSansHandler), + QueryRequest(execute::QueryRequestMsg), // Enclave msgs Update(AttestedMsg), From d5c545708369faa40c574873eebee189e3e699ad Mon Sep 17 00:00:00 2001 From: Shoaib Ahmed Date: Thu, 7 Nov 2024 03:02:30 +0400 Subject: [PATCH 17/18] Fix seq_num handling --- .../transfers/enclave/src/transfers_server.rs | 45 ++++++++++++++----- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/examples/transfers/enclave/src/transfers_server.rs b/examples/transfers/enclave/src/transfers_server.rs index e6a8170a..1d775c66 100644 --- a/examples/transfers/enclave/src/transfers_server.rs +++ b/examples/transfers/enclave/src/transfers_server.rs @@ -134,7 +134,7 @@ pub struct TransfersService { attestor: A, pub queue_producer: Sender>, tx: Option>, - seq_num: u64, + seq_num: Arc>, } impl TransfersService @@ -155,7 +155,7 @@ where attestor, queue_producer, tx: None, - seq_num: 0, + seq_num: Arc::new(Mutex::new(0)), } } } @@ -212,26 +212,18 @@ where // Instantiate empty withdrawals map to include in response (Update message to smart contract) let mut withdrawals_response: Vec<(Addr, Uint128)> = Vec::<(Addr, Uint128)>::new(); - // make sure number of pending requests are equal to the diff b/w on-chain v/s in-mem seq num let pending_sequenced_requests = message .requests .iter() .filter(|req| matches!(req, TransfersRequest::Transfer(_))) .count(); - if message.seq_num < self.seq_num { - return Err(Status::failed_precondition("replay attempted")); - } - - let seq_num_diff = message.seq_num - self.seq_num; - if seq_num_diff != pending_sequenced_requests as u64 { - return Err(Status::failed_precondition("seq_num_diff mismatch")); - } - // Loop through requests, match on cases, and apply changes to state for req in message.requests { match req { TransfersRequest::Transfer(ciphertext) => { + self.ensure_seq_num_consistency(message.seq_num, pending_sequenced_requests)?; + // Decrypt transfer ciphertext into cleartext struct (acquires lock on enclave sk to do so) let transfer: ClearTextTransferRequestMsg = { let sk_lock = self @@ -380,6 +372,35 @@ where } } +impl TransfersService +where + A: Attestor + Send + Sync + 'static, +{ + fn ensure_seq_num_consistency( + &self, + seq_num_on_chain: u64, + pending_sequenced_requests: usize, + ) -> TonicResult<()> { + let mut seq_num = self.seq_num.lock().unwrap(); + + if seq_num_on_chain < *seq_num { + return Err(Status::failed_precondition("replay attempted")); + } + + // make sure number of pending requests are equal to the diff b/w on-chain v/s in-mem seq num + let seq_num_diff = seq_num_on_chain - *seq_num; + if seq_num_diff != pending_sequenced_requests as u64 { + return Err(Status::failed_precondition(&format!( + "seq_num_diff mismatch: num({seq_num_diff}) v/s diff({pending_sequenced_requests})" + ))); + } + + *seq_num = seq_num_on_chain; + + Ok(()) + } +} + //TODO: consider using generics for these decrypt functions fn decrypt_transfer( sk: &SigningKey, From 4e6a40cfb45128f7fb1bae8b217aef0827662fbd Mon Sep 17 00:00:00 2001 From: Shoaib Ahmed Date: Fri, 8 Nov 2024 01:44:30 +0400 Subject: [PATCH 18/18] Remove redundant inter-service comm --- crates/enclave/core/src/server.rs | 32 +++---------------- .../transfers/enclave/src/transfers_server.rs | 11 ++----- 2 files changed, 6 insertions(+), 37 deletions(-) diff --git a/crates/enclave/core/src/server.rs b/crates/enclave/core/src/server.rs index c9c3c104..a258362d 100644 --- a/crates/enclave/core/src/server.rs +++ b/crates/enclave/core/src/server.rs @@ -45,7 +45,6 @@ use tendermint_rpc::{ query::{EventType, Query}, SubscriptionClient, WebSocketClient, }; -use tokio::sync::mpsc::{channel, Receiver, Sender}; use tonic::{ body::BoxBody, codegen::http, @@ -99,20 +98,10 @@ pub trait IntoServer { fn into_server(self) -> Self::Server; } -#[derive(Debug, Clone)] -pub enum CoreMsg { - GetSequenceNumber, -} -pub trait AppService { - fn accept_channel(&mut self, tx: Sender); -} - pub struct QuartzServer { pub router: Router, ws_handlers: Vec>, pub ws_config: WsListenerConfig, - tx: Sender, - rx: Receiver, } impl QuartzServer { @@ -133,20 +122,16 @@ impl QuartzServer { attestor.clone(), )); - let (tx, rx) = channel::(32); - Self { router: Server::builder().add_service(core_service), ws_handlers: Vec::new(), ws_config, - tx, - rx, } } - pub fn add_service(mut self, mut service: S) -> Self + pub fn add_service(mut self, service: S) -> Self where - S: IntoServer + WebSocketHandler + Clone + AppService, + S: IntoServer + WebSocketHandler + Clone, S::Server: Service< http::request::Request, Response = http::response::Response, @@ -159,16 +144,13 @@ impl QuartzServer { { self.ws_handlers.push(Box::new(service.clone())); - let tonic_server = { - service.accept_channel(self.tx.clone()); - service.into_server() - }; + let tonic_server = service.into_server(); self.router = self.router.add_service(tonic_server); self } - pub async fn serve(mut self, addr: SocketAddr) -> Result<(), QuartzError> { + pub async fn serve(self, addr: SocketAddr) -> Result<(), QuartzError> { // Launch all WebSocket handlers as separate Tokio tasks tokio::spawn(async move { if let Err(e) = Self::websocket_events_listener(&self.ws_handlers, self.ws_config).await @@ -177,12 +159,6 @@ impl QuartzServer { } }); - tokio::spawn(async move { - while let Some(msg) = self.rx.recv().await { - todo!("{:?}", msg) - } - }); - Ok(self.router.serve(addr).await?) } diff --git a/examples/transfers/enclave/src/transfers_server.rs b/examples/transfers/enclave/src/transfers_server.rs index 1d775c66..8005fc82 100644 --- a/examples/transfers/enclave/src/transfers_server.rs +++ b/examples/transfers/enclave/src/transfers_server.rs @@ -14,7 +14,7 @@ use quartz_common::{ }, enclave::{ attestor::Attestor, - server::{AppService, CoreMsg, IntoServer, ProofOfPublication, WsListenerConfig}, + server::{IntoServer, ProofOfPublication, WsListenerConfig}, }, }; use serde::{Deserialize, Serialize}; @@ -42,12 +42,6 @@ impl IntoServer for TransfersService { } } -impl AppService for TransfersService { - fn accept_channel(&mut self, tx: Sender) { - self.tx = Some(tx); - } -} - pub type RawCipherText = HexBinary; #[derive(Clone, Debug, Serialize, Deserialize, Default)] @@ -133,7 +127,6 @@ pub struct TransfersService { sk: Arc>>, attestor: A, pub queue_producer: Sender>, - tx: Option>, seq_num: Arc>, } @@ -154,7 +147,6 @@ where sk, attestor, queue_producer, - tx: None, seq_num: Arc::new(Mutex::new(0)), } } @@ -209,6 +201,7 @@ where }; let requests_len = message.requests.len() as u32; + // Instantiate empty withdrawals map to include in response (Update message to smart contract) let mut withdrawals_response: Vec<(Addr, Uint128)> = Vec::<(Addr, Uint128)>::new();