Skip to content

Commit 2c54383

Browse files
committed
Improve transaction serialization.
1 parent 216bca3 commit 2c54383

File tree

9 files changed

+79
-6
lines changed

9 files changed

+79
-6
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

arm/src/action_tree.rs

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,42 @@
1+
use crate::utils::{bytes_to_words, words_to_bytes};
12
use crate::{
23
merkle_path::{MerklePath, PADDING_LEAF},
34
utils::hash_two,
45
};
56
use risc0_zkvm::sha::Digest;
6-
use serde::{Deserialize, Serialize};
7+
use serde::{Deserialize, Deserializer, Serialize, Serializer};
8+
use serde_bytes::ByteBuf;
79

810
#[derive(Debug, Deserialize, Clone, PartialEq, Eq, Serialize)]
911
#[cfg_attr(feature = "nif", serde(rename = "Elixir.Anoma.Arm.MerkleTree"))]
1012
pub struct MerkleTree {
13+
#[serde(
14+
deserialize_with = "deserialize_leaves",
15+
serialize_with = "serialize_leaves"
16+
)]
1117
pub leaves: Vec<Vec<u32>>,
1218
}
1319

20+
pub fn serialize_leaves<S>(t: &[Vec<u32>], s: S) -> Result<S::Ok, S::Error>
21+
where
22+
S: Serializer,
23+
{
24+
t.iter()
25+
.map(|t| ByteBuf::from(words_to_bytes(t)))
26+
.collect::<Vec<ByteBuf>>()
27+
.serialize(s)
28+
}
29+
30+
pub fn deserialize_leaves<'de, D>(deserializer: D) -> Result<Vec<Vec<u32>>, D::Error>
31+
where
32+
D: Deserializer<'de>,
33+
{
34+
Ok(Vec::<ByteBuf>::deserialize(deserializer)?
35+
.into_iter()
36+
.map(|t| bytes_to_words(&t.into_vec()))
37+
.collect())
38+
}
39+
1440
impl MerkleTree {
1541
pub fn new(leaves: Vec<Digest>) -> Self {
1642
let leaves = leaves

arm/src/compliance.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::{
22
merkle_path::MerklePath,
33
nullifier_key::NullifierKey,
44
resource::Resource,
5-
utils::{bytes_to_words, words_to_bytes},
5+
utils::{bytes_to_words, vec_u32, words_to_bytes},
66
};
77
use hex::FromHex;
88
use k256::{
@@ -23,12 +23,19 @@ lazy_static! {
2323
#[derive(Clone, Debug, Default, serde::Serialize, serde::Deserialize)]
2424
#[cfg_attr(feature = "nif", serde(rename = "Elixir.Anoma.Arm.ComplianceInstance"))]
2525
pub struct ComplianceInstance {
26+
#[serde(with = "vec_u32")]
2627
pub consumed_nullifier: Vec<u32>,
28+
#[serde(with = "vec_u32")]
2729
pub consumed_logic_ref: Vec<u32>,
30+
#[serde(with = "vec_u32")]
2831
pub consumed_commitment_tree_root: Vec<u32>,
32+
#[serde(with = "vec_u32")]
2933
pub created_commitment: Vec<u32>,
34+
#[serde(with = "vec_u32")]
3035
pub created_logic_ref: Vec<u32>,
36+
#[serde(with = "vec_u32")]
3137
pub delta_x: Vec<u32>,
38+
#[serde(with = "vec_u32")]
3239
pub delta_y: Vec<u32>,
3340
}
3441

@@ -40,6 +47,7 @@ pub struct ComplianceWitness {
4047
/// The path from the consumed commitment to the root in the commitment tree
4148
pub merkle_path: MerklePath,
4249
/// The existing root for the ephemeral resource
50+
#[serde(with = "vec_u32")]
4351
pub ephemeral_root: Vec<u32>,
4452
/// Nullifier key of the consumed resource
4553
pub nf_key: NullifierKey,

arm/src/logic_instance.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
use crate::utils::vec_u32;
12
use serde::{Deserialize, Serialize};
23

34
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
45
#[cfg_attr(feature = "nif", serde(rename = "Elixir.Anoma.Arm.LogicInstance"))]
56
pub struct LogicInstance {
7+
#[serde(with = "vec_u32")]
68
pub tag: Vec<u32>,
79
pub is_consumed: bool,
10+
#[serde(with = "vec_u32")]
811
pub root: Vec<u32>,
912
pub app_data: AppData,
1013
}
@@ -21,6 +24,7 @@ pub struct AppData {
2124
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
2225
#[cfg_attr(feature = "nif", serde(rename = "Elixir.Anoma.Arm.ExpirableBlob"))]
2326
pub struct ExpirableBlob {
27+
#[serde(with = "vec_u32")]
2428
pub blob: Vec<u32>,
2529
pub deletion_criterion: u32,
2630
}

arm/src/logic_proof.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::{
88
resource::Resource,
99
resource_logic::TrivialLogicWitness,
1010
test_logic::TestLogicWitness,
11-
utils::words_to_bytes,
11+
utils::{vec_u32, words_to_bytes},
1212
};
1313
use rand::Rng;
1414
use risc0_zkvm::{
@@ -52,6 +52,7 @@ pub struct LogicVerifier {
5252
pub proof: Vec<u8>,
5353
#[serde(with = "serde_bytes")]
5454
pub instance: Vec<u8>,
55+
#[serde(with = "vec_u32")]
5556
pub verifying_key: Vec<u32>,
5657
}
5758

@@ -61,7 +62,9 @@ pub struct LogicVerifier {
6162
serde(rename = "Elixir.Anoma.Arm.LogicVerifierInputs")
6263
)]
6364
pub struct LogicVerifierInputs {
65+
#[serde(with = "vec_u32")]
6466
pub tag: Vec<u32>,
67+
#[serde(with = "vec_u32")]
6568
pub verifying_key: Vec<u32>,
6669
pub app_data: AppData,
6770
#[serde(with = "serde_bytes")]

arm/src/transaction.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ where
3737
#[derive(Clone, Debug, Deserialize, Serialize)]
3838
#[cfg_attr(feature = "nif", serde(rename = "Elixir.Anoma.Arm.Delta"))]
3939
pub enum Delta {
40-
#[cfg_attr(feature = "nif", serde(rename = "Elixir.Anoma.Arm.Delta.DeltaWitness"))]
40+
#[cfg_attr(feature = "nif", serde(rename = "witness"))]
4141
Witness(DeltaWitness),
42-
#[cfg_attr(feature = "nif", serde(rename = "Elixir.Anoma.Arm.Delta.DeltaProof"))]
42+
#[cfg_attr(feature = "nif", serde(rename = "proof"))]
4343
Proof(DeltaProof),
4444
}
4545

arm/src/utils.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,28 @@ pub fn words_to_bytes(words: &[u32]) -> &[u8] {
2828
bytemuck::cast_slice(words)
2929
}
3030

31+
pub mod vec_u32 {
32+
use crate::utils::{bytes_to_words, words_to_bytes};
33+
use serde::{Deserialize, Deserializer, Serialize, Serializer};
34+
use serde_bytes::ByteBuf;
35+
36+
pub fn serialize<S>(t: &[u32], s: S) -> Result<S::Ok, S::Error>
37+
where
38+
S: Serializer,
39+
{
40+
ByteBuf::from(words_to_bytes(t)).serialize(s)
41+
}
42+
43+
pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u32>, D::Error>
44+
where
45+
D: Deserializer<'de>,
46+
{
47+
Ok(bytes_to_words(
48+
&ByteBuf::deserialize(deserializer)?.into_vec(),
49+
))
50+
}
51+
}
52+
3153
pub fn hash_two(left: &[u32], right: &[u32]) -> Vec<u32> {
3254
let mut words = Vec::with_capacity(2 * DIGEST_WORDS);
3355
words.extend_from_slice(left);

examples/simple_transfer_application/simple_transfer_witness/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ edition = "2021"
66
[dependencies]
77
arm = { path = "../../../arm", default-features = false }
88
serde = { version = "1.0.197", default-features = false }
9+
serde_bytes = { version = "0.11.19", default-features = false }
910
rand = "0.8"

examples/simple_transfer_application/simple_transfer_witness/src/lib.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use arm::{
1010
merkle_path::MerklePath,
1111
nullifier_key::NullifierKey,
1212
resource::Resource,
13-
utils::{bytes_to_words, hash_bytes, words_to_bytes},
13+
utils::{bytes_to_words, hash_bytes, vec_u32, words_to_bytes},
1414
};
1515
use serde::{Deserialize, Serialize};
1616
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
@@ -39,24 +39,32 @@ pub struct EncryptionInfo {
3939
// randomly generated for persistent resource_ciphertext
4040
pub sender_sk: SecretKey,
4141
// randomly generated for persistent resource_ciphertext(12 bytes)
42+
#[serde(with = "serde_bytes")]
4243
pub encryption_nonce: Vec<u8>,
4344
// The discovery ciphertext for the resource
45+
#[serde(with = "vec_u32")]
4446
pub discovery_cipher: Vec<u32>,
4547
}
4648

4749
#[derive(Clone, Debug, Serialize, Deserialize)]
4850
pub struct ForwarderInfo {
4951
pub call_type: CallType,
52+
#[serde(with = "serde_bytes")]
5053
pub forwarder_addr: Vec<u8>,
54+
#[serde(with = "serde_bytes")]
5155
pub token_addr: Vec<u8>,
56+
#[serde(with = "serde_bytes")]
5257
pub user_addr: Vec<u8>,
5358
pub permit_info: Option<PermitInfo>,
5459
}
5560

5661
#[derive(Clone, Debug, Serialize, Deserialize)]
5762
pub struct PermitInfo {
63+
#[serde(with = "serde_bytes")]
5864
pub permit_nonce: Vec<u8>,
65+
#[serde(with = "serde_bytes")]
5966
pub permit_deadline: Vec<u8>,
67+
#[serde(with = "serde_bytes")]
6068
pub permit_sig: Vec<u8>,
6169
}
6270

0 commit comments

Comments
 (0)