Enum monotree::node::Node

source ·
pub enum Node<'a> {
    Soft(Cell<'a>),
    Hard(Cell<'a>, Cell<'a>),
}
Expand description

The only component of monotree. In a big picture, monotree simply consists of structured Nodes.

Schematic

There are two types of NodeSoft node and Hard node.

  • Hard: a node that has two real cells as components. two links to child nodes.
  • Soft: a node that has only one real cell and it has only one link going out to child node.
//              Root
//             /    \
//          NodeA   NodeB
//         /     \      \
//      NodeC   LeafB  LeafC
//       /
//     LeafA

where NodeA is a Hard node, NodeB and NodeC are Soft nodes.

Byte-Serialized View

Numbers in parentheses refer to byte length. By default HashLen = 32, BitsLen = 2.

SoftNode = Cell + 0x00(1), where
Cell = hash(HASH_LEN) + path(< HASH_LEN) + range_start(BitsLen) + range_end(BitsLen).
0x00 is an indicator for soft node.

HardNode = Cell_L + Cell_R + 0x01(1), where
Cell_L = hash_L(HASH_LEN) + path_L(< HASH_LEN) + range_L_start(BitsLen) + range_L_end(BitsLen)
Cell_R = path_R(< HASH_LEN) _ range_R_start(BitsLen) + range_R_end(BitsLen) + hash_R(HASH_LEN).
0x01 is an indicator for hard node.

To make Merkle proof easier, we purposely placed the hashes on outskirts of the serialized form. With only 1-bit information of left or right, provers can easily guess which side the hash he holds should be appended for the next step. Refer to verify_proof() implementation regarding on this discussion.

Variants§

§

Soft(Cell<'a>)

§

Hard(Cell<'a>, Cell<'a>)

Implementations§

source§

impl<'a> Node<'a>

source

pub fn new(lc: Cell<'a>, rc: Cell<'a>) -> Self

source

pub fn cells_from_bytes( bytes: &'a [u8], right: bool ) -> Result<(Cell<'a>, Cell<'a>)>

Construct Cells by deserializing bytes slice.

source

pub fn from_bytes(bytes: &'a [u8]) -> Result<Self>

Construct Node by deserializing bytes slice.

source

pub fn to_bytes(&self) -> Result<Vec<u8>>

Serialize Node into bytes.

Trait Implementations§

source§

impl<'a> Clone for Node<'a>

source§

fn clone(&self) -> Node<'a>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<'a> Debug for Node<'a>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a> RefUnwindSafe for Node<'a>

§

impl<'a> Send for Node<'a>

§

impl<'a> Sync for Node<'a>

§

impl<'a> Unpin for Node<'a>

§

impl<'a> UnwindSafe for Node<'a>

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> Same<T> for T

§

type Output = T

Should always be Self
source§

impl<T> ToOwned for Twhere T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere V: MultiLane<T>,

§

fn vzip(self) -> V