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);
+ }
+}