From 2b1ba14db5d31ad15cc255f3a4b64a3a5bf16638 Mon Sep 17 00:00:00 2001 From: antiochp <30642645+antiochp@users.noreply.github.com> Date: Tue, 1 Sep 2020 14:01:20 +0100 Subject: [PATCH 1/2] grin output_identifier refactoring --- impls/src/test_framework/mod.rs | 5 +++-- libwallet/src/internal/tx.rs | 2 +- libwallet/src/slate.rs | 16 +++++----------- libwallet/src/slate_versions/v4.rs | 4 ++-- 4 files changed, 11 insertions(+), 16 deletions(-) diff --git a/impls/src/test_framework/mod.rs b/impls/src/test_framework/mod.rs index b08964ce..4dd921b2 100644 --- a/impls/src/test_framework/mod.rs +++ b/impls/src/test_framework/mod.rs @@ -40,9 +40,10 @@ fn get_output_local(chain: &chain::Chain, commit: pedersen::Commitment) -> Optio if chain.get_unspent(commit).unwrap().is_some() { let block_height = chain.get_header_for_output(commit).unwrap().height; let output_pos = chain.get_output_pos(&commit).unwrap_or(0); - return Some(api::Output::new(&commit, block_height, output_pos)); + Some(api::Output::new(&commit, block_height, output_pos)) + } else { + None } - None } /// Get a kernel from the chain locally diff --git a/libwallet/src/internal/tx.rs b/libwallet/src/internal/tx.rs index ba3a64dc..f4c1f645 100644 --- a/libwallet/src/internal/tx.rs +++ b/libwallet/src/internal/tx.rs @@ -616,7 +616,7 @@ mod test { .unwrap(); let inputs: Vec = tx2.inputs().into(); - assert_eq!(tx1.outputs()[0].features, inputs[0].features); + assert_eq!(tx1.outputs()[0].features(), inputs[0].features); assert_eq!(tx1.outputs()[0].commitment(), inputs[0].commitment()); } diff --git a/libwallet/src/slate.rs b/libwallet/src/slate.rs index e8cc3b7c..222748f2 100644 --- a/libwallet/src/slate.rs +++ b/libwallet/src/slate.rs @@ -839,8 +839,8 @@ impl From<&Slate> for Option> { } for o in outs.iter() { ret_vec.push(CommitsV4 { - f: o.features.into(), - c: o.commit, + f: o.features().into(), + c: o.commitment(), p: Some(o.proof), }); } @@ -1020,14 +1020,8 @@ pub fn tx_from_slate_v4(slate: &SlateV4) -> Option { let mut tx = Transaction::empty().with_kernel(kernel); for c in coms.iter() { - match &c.p { - Some(p) => { - tx = tx.with_output(Output { - features: c.f.into(), - commit: c.c, - proof: p.clone(), - }) - } + match c.p { + Some(p) => tx = tx.with_output(Output::new(c.f.into(), c.c, p)), None => { tx = tx.with_input(Input { features: c.f.into(), @@ -1036,7 +1030,7 @@ pub fn tx_from_slate_v4(slate: &SlateV4) -> Option { } } } - tx.offset = slate.off.clone(); + tx = tx.with_offset(slate.off.clone()); Some(tx) } diff --git a/libwallet/src/slate_versions/v4.rs b/libwallet/src/slate_versions/v4.rs index 2564547d..bfcffc93 100644 --- a/libwallet/src/slate_versions/v4.rs +++ b/libwallet/src/slate_versions/v4.rs @@ -316,8 +316,8 @@ impl From<&Output> for CbOutputV4 { fn from(output: &Output) -> CbOutputV4 { CbOutputV4 { features: CbOutputFeatures::Coinbase, - commit: output.commit, - proof: output.proof, + commit: output.commitment(), + proof: output.proof(), } } } From 54627383ec969ad2690e38fe82296b975ad089cf Mon Sep 17 00:00:00 2001 From: antiochp <30642645+antiochp@users.noreply.github.com> Date: Thu, 3 Sep 2020 11:24:45 +0100 Subject: [PATCH 2/2] bump grin sha for master add test for tx json serialization --- Cargo.lock | 16 +++++------ impls/src/node_clients/http.rs | 52 ++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a2d33e9b..8dd28340 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1171,7 +1171,7 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" [[package]] name = "grin_api" version = "4.1.0-alpha.1" -source = "git+https://github.com/mimblewimble/grin#caa6b8c747788e32953950a2dfd0a7c1e5d29cd2" +source = "git+https://github.com/mimblewimble/grin#133089e9855686854c87d6fbe4d67df775918bee" dependencies = [ "bytes", "easy-jsonrpc-mw", @@ -1204,7 +1204,7 @@ dependencies = [ [[package]] name = "grin_chain" version = "4.1.0-alpha.1" -source = "git+https://github.com/mimblewimble/grin#caa6b8c747788e32953950a2dfd0a7c1e5d29cd2" +source = "git+https://github.com/mimblewimble/grin#133089e9855686854c87d6fbe4d67df775918bee" dependencies = [ "bit-vec", "bitflags 1.2.1", @@ -1228,7 +1228,7 @@ dependencies = [ [[package]] name = "grin_core" version = "4.1.0-alpha.1" -source = "git+https://github.com/mimblewimble/grin#caa6b8c747788e32953950a2dfd0a7c1e5d29cd2" +source = "git+https://github.com/mimblewimble/grin#133089e9855686854c87d6fbe4d67df775918bee" dependencies = [ "blake2-rfc", "byteorder", @@ -1254,7 +1254,7 @@ dependencies = [ [[package]] name = "grin_keychain" version = "4.1.0-alpha.1" -source = "git+https://github.com/mimblewimble/grin#caa6b8c747788e32953950a2dfd0a7c1e5d29cd2" +source = "git+https://github.com/mimblewimble/grin#133089e9855686854c87d6fbe4d67df775918bee" dependencies = [ "blake2-rfc", "byteorder", @@ -1276,7 +1276,7 @@ dependencies = [ [[package]] name = "grin_p2p" version = "4.1.0-alpha.1" -source = "git+https://github.com/mimblewimble/grin#caa6b8c747788e32953950a2dfd0a7c1e5d29cd2" +source = "git+https://github.com/mimblewimble/grin#133089e9855686854c87d6fbe4d67df775918bee" dependencies = [ "bitflags 1.2.1", "chrono", @@ -1297,7 +1297,7 @@ dependencies = [ [[package]] name = "grin_pool" version = "4.1.0-alpha.1" -source = "git+https://github.com/mimblewimble/grin#caa6b8c747788e32953950a2dfd0a7c1e5d29cd2" +source = "git+https://github.com/mimblewimble/grin#133089e9855686854c87d6fbe4d67df775918bee" dependencies = [ "blake2-rfc", "chrono", @@ -1331,7 +1331,7 @@ dependencies = [ [[package]] name = "grin_store" version = "4.1.0-alpha.1" -source = "git+https://github.com/mimblewimble/grin#caa6b8c747788e32953950a2dfd0a7c1e5d29cd2" +source = "git+https://github.com/mimblewimble/grin#133089e9855686854c87d6fbe4d67df775918bee" dependencies = [ "byteorder", "croaring-mw", @@ -1351,7 +1351,7 @@ dependencies = [ [[package]] name = "grin_util" version = "4.1.0-alpha.1" -source = "git+https://github.com/mimblewimble/grin#caa6b8c747788e32953950a2dfd0a7c1e5d29cd2" +source = "git+https://github.com/mimblewimble/grin#133089e9855686854c87d6fbe4d67df775918bee" dependencies = [ "backtrace", "base64 0.12.3", diff --git a/impls/src/node_clients/http.rs b/impls/src/node_clients/http.rs index 73a1fc06..6d1bd76c 100644 --- a/impls/src/node_clients/http.rs +++ b/impls/src/node_clients/http.rs @@ -370,3 +370,55 @@ impl NodeClient for HTTPNodeClient { Ok((res.last_retrieved_index, res.highest_index)) } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::core::core::KernelFeatures; + use crate::core::libtx::build; + use crate::core::libtx::ProofBuilder; + use crate::keychain::{ExtKeychain, Keychain}; + + fn tx1i1o() -> Transaction { + let keychain = ExtKeychain::from_random_seed(false).unwrap(); + let builder = ProofBuilder::new(&keychain); + let key_id1 = ExtKeychain::derive_key_id(1, 1, 0, 0, 0); + let key_id2 = ExtKeychain::derive_key_id(1, 2, 0, 0, 0); + let tx = build::transaction( + KernelFeatures::Plain { fee: 2 }, + &[build::input(5, key_id1), build::output(3, key_id2)], + &keychain, + &builder, + ) + .unwrap(); + tx + } + + // Wallet will "push" a transaction to node, serializing the transaction as json. + // We are testing the json structure is what we expect here. + #[test] + fn test_transaction_json_ser_deser() { + let tx1 = tx1i1o(); + let value = serde_json::to_value(&tx1).unwrap(); + + assert!(value["offset"].is_string()); + assert_eq!(value["body"]["inputs"][0]["features"], "Plain"); + assert!(value["body"]["inputs"][0]["commit"].is_string()); + assert_eq!(value["body"]["outputs"][0]["features"], "Plain"); + assert!(value["body"]["outputs"][0]["commit"].is_string()); + assert!(value["body"]["outputs"][0]["proof"].is_string()); + + // Note: Tx kernel "features" serialize in a slightly unexpected way. + assert_eq!(value["body"]["kernels"][0]["features"]["Plain"]["fee"], 2); + assert!(value["body"]["kernels"][0]["excess"].is_string()); + assert!(value["body"]["kernels"][0]["excess_sig"].is_string()); + + let tx2: Transaction = serde_json::from_value(value).unwrap(); + assert_eq!(tx1, tx2); + + let str = serde_json::to_string(&tx1).unwrap(); + println!("{}", str); + let tx2: Transaction = serde_json::from_str(&str).unwrap(); + assert_eq!(tx1, tx2); + } +}