Enum 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> Freeze for Node<'a>

§

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 T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

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

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

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

Source§

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

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. 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 T
where 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 for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

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 T
where U: Into<T>,

Source§

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 T
where U: TryFrom<T>,

Source§

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.
Source§

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

Source§

fn vzip(self) -> V