Zeth - Zerocash on Ethereum  0.8
Reference implementation of the Zeth protocol by Clearmatics
Public Member Functions | Static Public Member Functions | Public Attributes | List of all members
zeth.core.merkle_tree.MerkleTree Class Reference
Inheritance diagram for zeth.core.merkle_tree.MerkleTree:
Inheritance graph
[legend]

Public Member Functions

def __init__ (self, MerkleTreeData tree_data, int depth, ITreeHash tree_hash)
 
int get_num_entries (self)
 
bytes get_leaf (self, int index)
 
List[bytes] get_leaves (self)
 
bytes get_node (self, int layer_idx, int node_idx)
 
Iterator[Tuple[bytes, List[bytes]]] get_layers (self)
 
bytes get_root (self)
 
None insert (self, bytes value)
 
bytes recompute_root (self)
 

Static Public Member Functions

MerkleTree empty_with_depth (int depth, ITreeHash tree_hash)
 
MerkleTree empty_with_size (int num_leaves, ITreeHash tree_hash)
 

Public Attributes

 max_num_leaves
 
 depth
 
 tree_data
 
 num_new_leaves
 
 tree_hash
 

Detailed Description

Merkle tree structure matching that used in the mixer contract. Simple
implementation where unpopulated values (zeroes) are also stored.

Definition at line 60 of file merkle_tree.py.

Constructor & Destructor Documentation

◆ __init__()

def zeth.core.merkle_tree.MerkleTree.__init__ (   self,
MerkleTreeData  tree_data,
int  depth,
ITreeHash  tree_hash 
)

Definition at line 65 of file merkle_tree.py.

65  def __init__(
66  self,
67  tree_data: MerkleTreeData,
68  depth: int,
69  tree_hash: ITreeHash):
70  self.max_num_leaves = pow(2, depth)
71  self.depth = tree_data.depth
72  self.tree_data = tree_data
73  self.num_new_leaves = 0
74  self.tree_hash = tree_hash
75 

Member Function Documentation

◆ empty_with_depth()

MerkleTree zeth.core.merkle_tree.MerkleTree.empty_with_depth ( int  depth,
ITreeHash  tree_hash 
)
static

Definition at line 94 of file merkle_tree.py.

94  def empty_with_depth(depth: int, tree_hash: ITreeHash) -> MerkleTree:
95  return MerkleTree(
96  MerkleTree._empty_data_with_depth(depth, tree_hash), depth, tree_hash)
97 
Here is the caller graph for this function:

◆ empty_with_size()

MerkleTree zeth.core.merkle_tree.MerkleTree.empty_with_size ( int  num_leaves,
ITreeHash  tree_hash 
)
static

Definition at line 99 of file merkle_tree.py.

99  def empty_with_size(num_leaves: int, tree_hash: ITreeHash) -> MerkleTree:
100  depth = int(math.log(num_leaves, 2))
101  assert pow(2, depth) == num_leaves, f"Non-pow-2 size {num_leaves} given"
102  return MerkleTree.empty_with_depth(depth, tree_hash)
103 

◆ get_layers()

Iterator[Tuple[bytes, List[bytes]]] zeth.core.merkle_tree.MerkleTree.get_layers (   self)
Public layers iterator.

Definition at line 125 of file merkle_tree.py.

125  def get_layers(self) -> Iterator[Tuple[bytes, List[bytes]]]:
126  """
127  Public layers iterator.
128  """
129  assert self.num_new_leaves == 0
130  return self._get_layers()
131 
Here is the call graph for this function:

◆ get_leaf()

bytes zeth.core.merkle_tree.MerkleTree.get_leaf (   self,
int  index 
)

Definition at line 107 of file merkle_tree.py.

107  def get_leaf(self, index: int) -> bytes:
108  leaves = self.tree_data.layers[self.depth]
109  if index < len(leaves):
110  return leaves[index]
111  return ZERO_ENTRY
112 

◆ get_leaves()

List[bytes] zeth.core.merkle_tree.MerkleTree.get_leaves (   self)

Definition at line 113 of file merkle_tree.py.

113  def get_leaves(self) -> List[bytes]:
114  return self.tree_data.layers[self.depth]
115 

◆ get_node()

bytes zeth.core.merkle_tree.MerkleTree.get_node (   self,
int  layer_idx,
int  node_idx 
)

Definition at line 116 of file merkle_tree.py.

116  def get_node(self, layer_idx: int, node_idx: int) -> bytes:
117  assert layer_idx <= self.depth
118  assert self.num_new_leaves == 0
119  layer_idx = self.depth - layer_idx
120  layer = self.tree_data.layers[layer_idx]
121  if node_idx < len(layer):
122  return layer[node_idx]
123  return self.tree_data.default_values[layer_idx]
124 

◆ get_num_entries()

int zeth.core.merkle_tree.MerkleTree.get_num_entries (   self)

Definition at line 104 of file merkle_tree.py.

104  def get_num_entries(self) -> int:
105  return len(self.tree_data.layers[self.depth])
106 

◆ get_root()

bytes zeth.core.merkle_tree.MerkleTree.get_root (   self)

Definition at line 132 of file merkle_tree.py.

132  def get_root(self) -> bytes:
133  assert self.num_new_leaves == 0
134  return self.tree_data.layers[0][0]
135 
Here is the caller graph for this function:

◆ insert()

None zeth.core.merkle_tree.MerkleTree.insert (   self,
bytes  value 
)

Definition at line 136 of file merkle_tree.py.

136  def insert(self, value: bytes) -> None:
137  leaves = self.tree_data.layers[self.depth]
138  assert len(leaves) < self.max_num_leaves
139  leaves.append(value)
140  self.num_new_leaves = self.num_new_leaves + 1
141 

◆ recompute_root()

bytes zeth.core.merkle_tree.MerkleTree.recompute_root (   self)
After some new leaves have been added, perform the minimal set of hashes
to recompute the tree, expanding each layer to accommodate new nodes.

Definition at line 142 of file merkle_tree.py.

142  def recompute_root(self) -> bytes:
143  """
144  After some new leaves have been added, perform the minimal set of hashes
145  to recompute the tree, expanding each layer to accommodate new nodes.
146  """
147  if self.num_new_leaves == 0:
148  return self.get_root()
149 
150  layers_it = self._get_layers()
151 
152  layer_default, layer = next(layers_it)
153  end_idx = len(layer)
154  start_idx = end_idx - self.num_new_leaves
155  layer_size = self.max_num_leaves
156 
157  for parent_default, parent_layer in layers_it:
158  # Computation for each layer is performed in _recompute_layer, which
159  # also computes the start and end indices for the next layer in the
160  # tree.
161  start_idx, end_idx = _recompute_layer(
162  layer,
163  start_idx,
164  end_idx,
165  layer_default,
166  parent_layer,
167  self.tree_hash)
168  layer = parent_layer
169  layer_default = parent_default
170  layer_size = int(layer_size / 2)
171 
172  self.num_new_leaves = 0
173  assert len(layer) == 1
174  assert layer_size == 1
175  return layer[0]
176 
Here is the call graph for this function:

Member Data Documentation

◆ depth

zeth.core.merkle_tree.MerkleTree.depth

Definition at line 67 of file merkle_tree.py.

◆ max_num_leaves

zeth.core.merkle_tree.MerkleTree.max_num_leaves

Definition at line 66 of file merkle_tree.py.

◆ num_new_leaves

zeth.core.merkle_tree.MerkleTree.num_new_leaves

Definition at line 69 of file merkle_tree.py.

◆ tree_data

zeth.core.merkle_tree.MerkleTree.tree_data

Definition at line 68 of file merkle_tree.py.

◆ tree_hash

zeth.core.merkle_tree.MerkleTree.tree_hash

Definition at line 70 of file merkle_tree.py.


The documentation for this class was generated from the following file:
zeth.cli.zeth_deploy.int
int
Definition: zeth_deploy.py:27