From a59897cc87f3ad3afe716a93cd0a5e9a3af7ce7b Mon Sep 17 00:00:00 2001 From: austinabell Date: Fri, 27 Nov 2020 11:45:55 -0500 Subject: [PATCH 1/3] Update message json format to match Lotus --- vm/address/src/lib.rs | 1 + vm/message/Cargo.toml | 2 +- vm/message/src/signed_message.rs | 6 +++++- vm/message/src/unsigned_message.rs | 6 +++++- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/vm/address/src/lib.rs b/vm/address/src/lib.rs index 5ec8944c4108..ae2d03c7c27e 100644 --- a/vm/address/src/lib.rs +++ b/vm/address/src/lib.rs @@ -41,6 +41,7 @@ const MAX_ADDRESS_LEN: usize = 84 + 2; const MAINNET_PREFIX: &str = "f"; const TESTNET_PREFIX: &str = "t"; +#[cfg(feature = "json")] const UNDEF_ADDR_STRING: &str = ""; // TODO pull network from config (probably) diff --git a/vm/message/Cargo.toml b/vm/message/Cargo.toml index 7d00c0c93dea..ad052d201a20 100644 --- a/vm/message/Cargo.toml +++ b/vm/message/Cargo.toml @@ -28,6 +28,6 @@ fil_types = { path = "../../types", optional = true, version = "0.1" } serde_json = "1.0" [features] -json = ["base64", "crypto/json", "forest_json_utils"] +json = ["base64", "crypto/json", "forest_json_utils", "cid/json"] # TODO try to prune out this dependency before releasing proofs = ["fil_types"] diff --git a/vm/message/src/signed_message.rs b/vm/message/src/signed_message.rs index ab12edb5c7cf..650dbcd83c56 100644 --- a/vm/message/src/signed_message.rs +++ b/vm/message/src/signed_message.rs @@ -127,8 +127,9 @@ impl Cbor for SignedMessage { pub mod json { use super::*; use crate::unsigned_message; + use cid::Cid; use crypto::signature; - use serde::{Deserialize, Deserializer, Serialize, Serializer}; + use serde::{ser, Deserialize, Deserializer, Serialize, Serializer}; /// Wrapper for serializing and deserializing a SignedMessage from JSON. #[derive(Deserialize, Serialize)] @@ -157,10 +158,13 @@ pub mod json { message: &'a UnsignedMessage, #[serde(with = "signature::json")] signature: &'a Signature, + #[serde(rename = "CID", with = "cid::json")] + cid: Cid, } SignedMessageSer { message: &m.message, signature: &m.signature, + cid: m.cid().map_err(ser::Error::custom)?, } .serialize(serializer) } diff --git a/vm/message/src/unsigned_message.rs b/vm/message/src/unsigned_message.rs index f6b60566e4cf..0e16e9bd5925 100644 --- a/vm/message/src/unsigned_message.rs +++ b/vm/message/src/unsigned_message.rs @@ -214,7 +214,8 @@ impl Cbor for UnsignedMessage {} #[cfg(feature = "json")] pub mod json { use super::*; - use serde::de; + use cid::Cid; + use serde::{de, ser}; /// Wrapper for serializing and deserializing a UnsignedMessage from JSON. #[derive(Deserialize, Serialize, Debug)] @@ -253,6 +254,8 @@ pub mod json { #[serde(rename = "Method")] method_num: u64, params: Option, + #[serde(rename = "CID", with = "cid::json")] + cid: Cid, } pub fn serialize(m: &UnsignedMessage, serializer: S) -> Result @@ -270,6 +273,7 @@ pub mod json { gas_premium: m.gas_premium.to_string(), method_num: m.method_num, params: Some(base64::encode(m.params.bytes())), + cid: m.cid().map_err(ser::Error::custom)?, } .serialize(serializer) } From 311fdcfe40c3e394ba5f03ffa946d241d1cae1f9 Mon Sep 17 00:00:00 2001 From: austinabell Date: Fri, 27 Nov 2020 11:54:30 -0500 Subject: [PATCH 2/3] Update json tests --- vm/message/tests/message_json_test.rs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/vm/message/tests/message_json_test.rs b/vm/message/tests/message_json_test.rs index ab208899fadb..64b24c3a9403 100644 --- a/vm/message/tests/message_json_test.rs +++ b/vm/message/tests/message_json_test.rs @@ -22,7 +22,7 @@ use vm::Serialized; #[test] fn unsigned_symmetric_json() { - let message_json = r#"{"Version":9,"To":"t01234","From":"t01234","Nonce":42,"Value":"0","GasLimit":1,"GasFeeCap":"2","GasPremium":"9","Method":1,"Params":"Ynl0ZSBhcnJheQ=="}"#; + let message_json = r#"{"Version":9,"To":"t01234","From":"t01234","Nonce":42,"Value":"0","GasLimit":1,"GasFeeCap":"2","GasPremium":"9","Method":1,"Params":"Ynl0ZSBhcnJheQ==","CID":{"/":"bafy2bzacea5z7ywqogtuxykqcis76lrhl4fl27bg63firldlry5ml6bbahoy6"}}"#; // Deserialize let UnsignedMessageJson(cid_d) = from_str(message_json).unwrap(); @@ -34,7 +34,7 @@ fn unsigned_symmetric_json() { #[test] fn signed_symmetric_json() { - let message_json = r#"{"Message":{"Version":9,"To":"t01234","From":"t01234","Nonce":42,"Value":"0","GasLimit":1,"GasFeeCap":"2","GasPremium":"9","Method":1,"Params":"Ynl0ZSBhcnJheQ=="},"Signature":{"Type":2,"Data":"Ynl0ZSBhcnJheQ=="}}"#; + let message_json = r#"{"Message":{"Version":9,"To":"t01234","From":"t01234","Nonce":42,"Value":"0","GasLimit":1,"GasFeeCap":"2","GasPremium":"9","Method":1,"Params":"Ynl0ZSBhcnJheQ==","CID":{"/":"bafy2bzacea5z7ywqogtuxykqcis76lrhl4fl27bg63firldlry5ml6bbahoy6"}},"Signature":{"Type":2,"Data":"Ynl0ZSBhcnJheQ=="},"CID":{"/":"bafy2bzacea5z7ywqogtuxykqcis76lrhl4fl27bg63firldlry5ml6bbahoy6"}}"#; // Deserialize let SignedMessageJson(cid_d) = from_str(message_json).unwrap(); @@ -87,7 +87,8 @@ fn message_json_annotations() { "GasFeeCap": "10", "GasLimit": 8, "Method": 7, - "Params": "" + "Params": "", + "CID": { "/": "bafy2bzaced25ah2r4gcerysjyrjqpqw72jvdy5ziwxk53ldxibktwmgkfgc22" } }, "signed": { "Message": { @@ -100,12 +101,14 @@ fn message_json_annotations() { "GasFeeCap": "10", "GasLimit": 8, "Method": 7, - "Params": "" + "Params": "", + "CID": { "/": "bafy2bzaced25ah2r4gcerysjyrjqpqw72jvdy5ziwxk53ldxibktwmgkfgc22" } }, "Signature": { "Type": 2, "Data": "AAE=" - } + }, + "CID": { "/": "bafy2bzaced25ah2r4gcerysjyrjqpqw72jvdy5ziwxk53ldxibktwmgkfgc22" } } } "#; From b76450951bf25f6da0571a34d9a8a0c064865d2f Mon Sep 17 00:00:00 2001 From: austinabell Date: Fri, 27 Nov 2020 12:29:53 -0500 Subject: [PATCH 3/3] Make cid field optional --- ipld/cid/src/json.rs | 20 ++++++++++++++++++++ vm/message/src/signed_message.rs | 6 +++--- vm/message/src/unsigned_message.rs | 6 +++--- vm/message/tests/message_json_test.rs | 9 +++------ 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/ipld/cid/src/json.rs b/ipld/cid/src/json.rs index fafee20410ef..0717981d3f96 100644 --- a/ipld/cid/src/json.rs +++ b/ipld/cid/src/json.rs @@ -75,3 +75,23 @@ pub mod vec { deserializer.deserialize_any(GoVecVisitor::::new()) } } + +pub mod opt { + use super::{Cid, CidJson, CidJsonRef}; + use serde::{self, Deserialize, Deserializer, Serialize, Serializer}; + + pub fn serialize(v: &Option, serializer: S) -> Result + where + S: Serializer, + { + v.as_ref().map(|s| CidJsonRef(s)).serialize(serializer) + } + + pub fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> + where + D: Deserializer<'de>, + { + let s: Option = Deserialize::deserialize(deserializer)?; + Ok(s.map(|v| v.0)) + } +} diff --git a/vm/message/src/signed_message.rs b/vm/message/src/signed_message.rs index 650dbcd83c56..70add79f7763 100644 --- a/vm/message/src/signed_message.rs +++ b/vm/message/src/signed_message.rs @@ -158,13 +158,13 @@ pub mod json { message: &'a UnsignedMessage, #[serde(with = "signature::json")] signature: &'a Signature, - #[serde(rename = "CID", with = "cid::json")] - cid: Cid, + #[serde(default, rename = "CID", with = "cid::json::opt")] + cid: Option, } SignedMessageSer { message: &m.message, signature: &m.signature, - cid: m.cid().map_err(ser::Error::custom)?, + cid: Some(m.cid().map_err(ser::Error::custom)?), } .serialize(serializer) } diff --git a/vm/message/src/unsigned_message.rs b/vm/message/src/unsigned_message.rs index 0e16e9bd5925..37c313fc1ef4 100644 --- a/vm/message/src/unsigned_message.rs +++ b/vm/message/src/unsigned_message.rs @@ -254,8 +254,8 @@ pub mod json { #[serde(rename = "Method")] method_num: u64, params: Option, - #[serde(rename = "CID", with = "cid::json")] - cid: Cid, + #[serde(default, rename = "CID", with = "cid::json::opt")] + cid: Option, } pub fn serialize(m: &UnsignedMessage, serializer: S) -> Result @@ -273,7 +273,7 @@ pub mod json { gas_premium: m.gas_premium.to_string(), method_num: m.method_num, params: Some(base64::encode(m.params.bytes())), - cid: m.cid().map_err(ser::Error::custom)?, + cid: Some(m.cid().map_err(ser::Error::custom)?), } .serialize(serializer) } diff --git a/vm/message/tests/message_json_test.rs b/vm/message/tests/message_json_test.rs index 64b24c3a9403..3562fcf8f09e 100644 --- a/vm/message/tests/message_json_test.rs +++ b/vm/message/tests/message_json_test.rs @@ -87,8 +87,7 @@ fn message_json_annotations() { "GasFeeCap": "10", "GasLimit": 8, "Method": 7, - "Params": "", - "CID": { "/": "bafy2bzaced25ah2r4gcerysjyrjqpqw72jvdy5ziwxk53ldxibktwmgkfgc22" } + "Params": "" }, "signed": { "Message": { @@ -101,14 +100,12 @@ fn message_json_annotations() { "GasFeeCap": "10", "GasLimit": 8, "Method": 7, - "Params": "", - "CID": { "/": "bafy2bzaced25ah2r4gcerysjyrjqpqw72jvdy5ziwxk53ldxibktwmgkfgc22" } + "Params": "" }, "Signature": { "Type": 2, "Data": "AAE=" - }, - "CID": { "/": "bafy2bzaced25ah2r4gcerysjyrjqpqw72jvdy5ziwxk53ldxibktwmgkfgc22" } + } } } "#;