mirror of https://github.com/vacp2p/pmtree.git
chore: update initialization function
This commit is contained in:
parent
c708ea9fda
commit
88ab1f459f
|
@ -4,6 +4,6 @@ use crate::*;
|
||||||
pub trait Database {
|
pub trait Database {
|
||||||
fn new(dbpath: &str) -> Self;
|
fn new(dbpath: &str) -> Self;
|
||||||
fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>>;
|
fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>>;
|
||||||
fn put(&mut self, key: &[u8]) -> Result<()>;
|
fn put(&mut self, key: &[u8], value: &[u8]) -> Result<()>;
|
||||||
fn delete(&mut self, key: &[u8]) -> Result<()>;
|
fn delete(&mut self, key: &[u8]) -> Result<()>;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,12 @@
|
||||||
|
pub trait ToBytes {
|
||||||
|
fn to_bytes(&self) -> Vec<u8>;
|
||||||
|
}
|
||||||
|
|
||||||
/// Trait that must be implemented for Hash Function
|
/// Trait that must be implemented for Hash Function
|
||||||
pub trait Hasher {
|
pub trait Hasher {
|
||||||
type Fr: Copy + Eq + Default;
|
type Fr: Copy + Eq + Default + From<Vec<u8>> + Into<Vec<u8>>;
|
||||||
|
|
||||||
fn new() -> Self;
|
fn new() -> Self;
|
||||||
|
fn default_leaf() -> Self::Fr;
|
||||||
fn hash(input: &[Self::Fr]) -> Self::Fr;
|
fn hash(input: &[Self::Fr]) -> Self::Fr;
|
||||||
}
|
}
|
||||||
|
|
33
src/tree.rs
33
src/tree.rs
|
@ -11,19 +11,39 @@ where
|
||||||
next_index: usize,
|
next_index: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) struct Key(usize, usize);
|
||||||
|
|
||||||
|
impl From<Key> for Vec<u8> {
|
||||||
|
fn from(key: Key) -> Vec<u8> {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<D, H> MerkleTree<D, H>
|
impl<D, H> MerkleTree<D, H>
|
||||||
where
|
where
|
||||||
D: Database,
|
D: Database,
|
||||||
H: Hasher,
|
H: Hasher,
|
||||||
{
|
{
|
||||||
/// Creates new `MerkleTree`
|
/// Creates new `MerkleTree`
|
||||||
pub fn new(depth: usize, dbpath: &str) -> Self {
|
pub fn new(depth: usize, dbpath: &str) -> Result<Self> {
|
||||||
Self {
|
// TODO: Use open instead of new, and check if the database is exists
|
||||||
db: Database::new(dbpath),
|
let mut db: D = Database::new(dbpath);
|
||||||
|
|
||||||
|
db.put(&Vec::<u8>::from(Key(depth, 0)), &H::default_leaf().into())?;
|
||||||
|
for i in (0..depth).rev() {
|
||||||
|
let prev = db.get(&Vec::<u8>::from(Key(i + 1, 0)))?.unwrap();
|
||||||
|
db.put(
|
||||||
|
&Vec::<u8>::from(Key(i, 0)),
|
||||||
|
&H::hash(&[prev.clone().into(), prev.into()]).into(),
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(Self {
|
||||||
|
db,
|
||||||
h: Hasher::new(),
|
h: Hasher::new(),
|
||||||
depth,
|
depth,
|
||||||
next_index: 0,
|
next_index: 0,
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Inserts a leaf to the next available index
|
/// Inserts a leaf to the next available index
|
||||||
|
@ -31,6 +51,11 @@ where
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Recalculates `Merkle Tree` from the specified key
|
||||||
|
fn recalculate_from(&mut self, key: usize) {
|
||||||
|
todo!()
|
||||||
|
}
|
||||||
|
|
||||||
/// Deletes a leaf at the `key` by setting it to its default value
|
/// Deletes a leaf at the `key` by setting it to its default value
|
||||||
pub fn delete(&mut self, key: usize) {
|
pub fn delete(&mut self, key: usize) {
|
||||||
todo!()
|
todo!()
|
||||||
|
|
Loading…
Reference in New Issue