Skip to content

Commit 624222e

Browse files
authored
[pythnet-sdk] Allow as_bytes()/to_bytes() for MerkleRoot/MerklePath (#866)
* feat: allow as_bytes() for MerkleRoot * feat: add borsh serialization to merkle types
1 parent 7847a79 commit 624222e

File tree

2 files changed

+45
-5
lines changed

2 files changed

+45
-5
lines changed

pythnet/pythnet_sdk/src/accumulators/merkle.rs

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,44 @@ const NODE_PREFIX: &[u8] = &[1];
3636
const NULL_PREFIX: &[u8] = &[2];
3737

3838
/// A MerklePath contains a list of hashes that form a proof for membership in a tree.
39-
#[derive(Clone, Default, Debug, Hash, PartialEq, Eq, Serialize, Deserialize)]
39+
#[derive(
40+
Clone,
41+
Default,
42+
Debug,
43+
Hash,
44+
PartialEq,
45+
Eq,
46+
Serialize,
47+
Deserialize,
48+
BorshSerialize,
49+
BorshDeserialize,
50+
)]
4051
pub struct MerklePath<H: Hasher>(Vec<H::Hash>);
4152

4253
/// A MerkleRoot contains the root hash of a MerkleTree.
43-
#[derive(Clone, Default, Debug, Hash, PartialEq, Eq, Serialize, Deserialize)]
54+
#[derive(
55+
Clone,
56+
Default,
57+
Debug,
58+
Hash,
59+
PartialEq,
60+
Eq,
61+
Serialize,
62+
Deserialize,
63+
BorshSerialize,
64+
BorshDeserialize,
65+
)]
4466
pub struct MerkleRoot<H: Hasher>(H::Hash);
4567

4668
/// A MerkleTree is a binary tree where each node is the hash of its children.
4769
#[derive(
4870
Debug, Clone, PartialEq, Eq, BorshSerialize, BorshDeserialize, Serialize, Deserialize, Default,
4971
)]
5072
pub struct MerkleTree<H: Hasher = Keccak256> {
51-
pub root: MerkleRoot<H>,
73+
pub root: MerkleRoot<H>,
74+
5275
#[serde(skip)]
76+
#[borsh_skip]
5377
pub nodes: Vec<H::Hash>,
5478
}
5579

@@ -68,6 +92,10 @@ impl<H: Hasher> MerkleRoot<H> {
6892
}
6993
current == self.0
7094
}
95+
96+
pub fn as_bytes(&self) -> &[u8] {
97+
self.0.as_ref()
98+
}
7199
}
72100

73101
/// Implements functionality for working with MerklePath (proofs).
@@ -76,6 +104,13 @@ impl<H: Hasher> MerklePath<H> {
76104
pub fn new(path: Vec<H::Hash>) -> Self {
77105
Self(path)
78106
}
107+
108+
pub fn to_bytes(&self) -> Vec<u8> {
109+
self.0
110+
.iter()
111+
.flat_map(|hash| hash.as_ref().to_vec())
112+
.collect()
113+
}
79114
}
80115

81116
/// Presents an Accumulator friendly interface for MerkleTree.

pythnet/pythnet_sdk/src/hashers.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
use {
2+
borsh::{
3+
BorshDeserialize,
4+
BorshSerialize,
5+
},
26
serde::{
37
Deserialize,
48
Serialize,
@@ -21,17 +25,18 @@ where
2125
Self: Clone,
2226
Self: Debug,
2327
Self: Default,
24-
Self: Serialize,
2528
{
2629
type Hash: Copy
2730
+ AsRef<[u8]>
31+
+ BorshSerialize
32+
+ BorshDeserialize
2833
+ Debug
2934
+ Default
3035
+ Eq
3136
+ std::hash::Hash
3237
+ PartialOrd
3338
+ PartialEq
34-
+ serde::Serialize
39+
+ Serialize
3540
+ for<'a> Deserialize<'a>;
3641

3742
fn hashv(data: &[impl AsRef<[u8]>]) -> Self::Hash;

0 commit comments

Comments
 (0)