diff --git a/Cargo.lock b/Cargo.lock index 1a1a2bd..3f000c4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -107,6 +107,7 @@ dependencies = [ "bitcoin", "dlctix", "serde", + "serdect", ] [[package]] @@ -287,6 +288,20 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "player_client" +version = "0.1.0" +dependencies = [ + "bitcoin", + "common", + "dlctix", + "hex", + "rand", + "serde", + "serde_cbor", + "serde_json", +] + [[package]] name = "ppv-lite86" version = "0.2.17" diff --git a/Cargo.toml b/Cargo.toml index 7bd6780..b8d309b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["demo/mm_server"] +members = ["demo/mm_server", "demo/player_client"] [package] name = "dlctix" diff --git a/demo/common/Cargo.toml b/demo/common/Cargo.toml index c2ac484..438f3a2 100644 --- a/demo/common/Cargo.toml +++ b/demo/common/Cargo.toml @@ -9,3 +9,4 @@ edition = "2021" bitcoin = "0.31.1" dlctix = { version = "0.0.4", path = "../.." } serde = "1.0.197" +serdect = "0.2.0" diff --git a/demo/common/src/lib.rs b/demo/common/src/lib.rs index 61ed740..d9cb6b1 100644 --- a/demo/common/src/lib.rs +++ b/demo/common/src/lib.rs @@ -14,12 +14,14 @@ pub type OutcomeOdds = BTreeMap; #[derive(Serialize, Deserialize)] pub struct ClientHello { pub player_pubkey: Point, + #[serde(serialize_with = "serdect::array::serialize_hex_lower_or_bin")] pub payout_hash: [u8; 32], } #[derive(Serialize, Deserialize)] pub struct ServerHello { pub player_id: PlayerID, + #[serde(serialize_with = "serdect::array::serialize_hex_lower_or_bin")] pub ticket_hash: [u8; 32], pub market_maker_pubkey: Point, pub event: EventAnnouncement, diff --git a/demo/mm_server/src/main.rs b/demo/mm_server/src/main.rs index 130c421..0abac7d 100644 --- a/demo/mm_server/src/main.rs +++ b/demo/mm_server/src/main.rs @@ -18,8 +18,7 @@ use std::{ }; fn run_server() -> Result<(), Box> { - let bind_addr = - env::var("MM_SERVER_BIND_ADDRESS").unwrap_or_else(|_| "0.0.0.0:1420".to_string()); + let bind_addr = env::var("MM_SERVER_ADDRESS").unwrap_or_else(|_| "0.0.0.0:1420".to_string()); let market_maker_seckey: Scalar = env::var("MM_SECRET_KEY")?.parse()?; let market_maker_pubkey = market_maker_seckey.base_point_mul(); diff --git a/demo/player_client/Cargo.toml b/demo/player_client/Cargo.toml new file mode 100644 index 0000000..b8ac6b0 --- /dev/null +++ b/demo/player_client/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "player_client" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +dlctix = { version = "0.0.4", path = "../.." } +serde_cbor = "0.11.2" +common = { path = "../common" } +bitcoin = "0.31.1" +rand = "0.8.5" +hex = "0.4.3" +serde = "1.0.197" +serde_json = "1.0.114" diff --git a/demo/player_client/src/main.rs b/demo/player_client/src/main.rs new file mode 100644 index 0000000..7b3a828 --- /dev/null +++ b/demo/player_client/src/main.rs @@ -0,0 +1,63 @@ +use bitcoin::Amount; +use common::{ClientHello, Intent, ServerHello}; +use dlctix::secp::Scalar; +use dlctix::{hashlock, Outcome}; + +use std::{env, error::Error, net}; + +fn run_client() -> Result<(), Box> { + let market_maker_server_address = env::var("MM_SERVER_ADDRESS")?; + + let mut rng = rand::thread_rng(); + + let payout_preimage = hashlock::preimage_random(&mut rng); + let payout_hash = hashlock::sha256(&payout_preimage); + + let seckey = Scalar::random(&mut rng); + let pubkey = seckey.base_point_mul(); + + println!("secret key: {:x}", seckey); + println!(" public key: {:x}", pubkey); + println!(""); + println!("payout preimage: {}", hex::encode(&payout_preimage)); + println!(" payout hash: {}", hex::encode(&payout_hash)); + println!(""); + + println!("Connecting to {}...", market_maker_server_address); + let conn = net::TcpStream::connect(&market_maker_server_address)?; + + println!("Connection established; sending ClientHello..."); + serde_cbor::to_writer( + &conn, + &ClientHello { + player_pubkey: pubkey, + payout_hash, + }, + )?; + + let server_hello: ServerHello = serde_cbor::from_reader(&conn)?; + println!( + "received ServerHello: {}", + serde_json::to_string_pretty(&server_hello).unwrap() + ); + + let intent = Intent { + outcome: Outcome::Attestation(0), + budget: Amount::from_sat(200_000), + }; + println!( + "sending Intent: {}", + serde_json::to_string_pretty(&intent).unwrap() + ); + serde_cbor::to_writer(&conn, &intent)?; + + Ok(()) +} + +fn main() { + if let Err(e) = run_client() { + eprintln!("fatal error: {}", e); + std::process::exit(1); + } + println!("exiting OK"); +}