浏览代码

[pythnet-sdk] Allow as_bytes()/to_bytes() for MerkleRoot/MerklePath (#866)

* feat: allow as_bytes() for MerkleRoot

* feat: add borsh serialization to merkle types
Reisen 2 年之前
父节点
当前提交
624222e0c8
共有 2 个文件被更改,包括 45 次插入5 次删除
  1. 38 3
      pythnet/pythnet_sdk/src/accumulators/merkle.rs
  2. 7 2
      pythnet/pythnet_sdk/src/hashers.rs

+ 38 - 3
pythnet/pythnet_sdk/src/accumulators/merkle.rs

@@ -36,11 +36,33 @@ const NODE_PREFIX: &[u8] = &[1];
 const NULL_PREFIX: &[u8] = &[2];
 
 /// A MerklePath contains a list of hashes that form a proof for membership in a tree.
-#[derive(Clone, Default, Debug, Hash, PartialEq, Eq, Serialize, Deserialize)]
+#[derive(
+    Clone,
+    Default,
+    Debug,
+    Hash,
+    PartialEq,
+    Eq,
+    Serialize,
+    Deserialize,
+    BorshSerialize,
+    BorshDeserialize,
+)]
 pub struct MerklePath<H: Hasher>(Vec<H::Hash>);
 
 /// A MerkleRoot contains the root hash of a MerkleTree.
-#[derive(Clone, Default, Debug, Hash, PartialEq, Eq, Serialize, Deserialize)]
+#[derive(
+    Clone,
+    Default,
+    Debug,
+    Hash,
+    PartialEq,
+    Eq,
+    Serialize,
+    Deserialize,
+    BorshSerialize,
+    BorshDeserialize,
+)]
 pub struct MerkleRoot<H: Hasher>(H::Hash);
 
 /// A MerkleTree is a binary tree where each node is the hash of its children.
@@ -48,8 +70,10 @@ pub struct MerkleRoot<H: Hasher>(H::Hash);
     Debug, Clone, PartialEq, Eq, BorshSerialize, BorshDeserialize, Serialize, Deserialize, Default,
 )]
 pub struct MerkleTree<H: Hasher = Keccak256> {
-    pub root:  MerkleRoot<H>,
+    pub root: MerkleRoot<H>,
+
     #[serde(skip)]
+    #[borsh_skip]
     pub nodes: Vec<H::Hash>,
 }
 
@@ -68,6 +92,10 @@ impl<H: Hasher> MerkleRoot<H> {
         }
         current == self.0
     }
+
+    pub fn as_bytes(&self) -> &[u8] {
+        self.0.as_ref()
+    }
 }
 
 /// Implements functionality for working with MerklePath (proofs).
@@ -76,6 +104,13 @@ impl<H: Hasher> MerklePath<H> {
     pub fn new(path: Vec<H::Hash>) -> Self {
         Self(path)
     }
+
+    pub fn to_bytes(&self) -> Vec<u8> {
+        self.0
+            .iter()
+            .flat_map(|hash| hash.as_ref().to_vec())
+            .collect()
+    }
 }
 
 /// Presents an Accumulator friendly interface for MerkleTree.

+ 7 - 2
pythnet/pythnet_sdk/src/hashers.rs

@@ -1,4 +1,8 @@
 use {
+    borsh::{
+        BorshDeserialize,
+        BorshSerialize,
+    },
     serde::{
         Deserialize,
         Serialize,
@@ -21,17 +25,18 @@ where
     Self: Clone,
     Self: Debug,
     Self: Default,
-    Self: Serialize,
 {
     type Hash: Copy
         + AsRef<[u8]>
+        + BorshSerialize
+        + BorshDeserialize
         + Debug
         + Default
         + Eq
         + std::hash::Hash
         + PartialOrd
         + PartialEq
-        + serde::Serialize
+        + Serialize
         + for<'a> Deserialize<'a>;
 
     fn hashv(data: &[impl AsRef<[u8]>]) -> Self::Hash;