1+ from typing import (
2+ Any ,
3+ Dict ,
4+ Iterator ,
5+ List ,
6+ Optional ,
7+ Sequence ,
8+ Tuple ,
9+ Union ,
10+ )
11+
112from eth_hash .auto import (
213 keccak ,
314)
4-
515from trie .constants import (
616 BLANK_HASH ,
717 BRANCH_TYPE ,
3040
3141
3242class BinaryTrie :
33- def __init__ (self , db , root_hash = BLANK_HASH ):
43+ def __init__ (self , db : Dict [ bytes , bytes ], root_hash : bytes = BLANK_HASH ) -> None :
3444 self .db = db
3545 validate_is_bytes (root_hash )
3646 self .root_hash = root_hash
3747
38- def get (self , key ) :
48+ def get (self , key : bytes ) -> Optional [ bytes ] :
3949 """
4050 Fetches the value with a given keypath from the given node.
4151
@@ -45,7 +55,7 @@ def get(self, key):
4555
4656 return self ._get (self .root_hash , encode_to_bin (key ))
4757
48- def _get (self , node_hash , keypath ) :
58+ def _get (self , node_hash : bytes , keypath : bytes ) -> Optional [ bytes ] :
4959 """
5060 Note: keypath should be in binary array format, i.e., encoded by encode_to_bin()
5161 """
@@ -76,7 +86,7 @@ def _get(self, node_hash, keypath):
7686 else :
7787 return self ._get (right_child , keypath [1 :])
7888
79- def set (self , key , value ) :
89+ def set (self , key : bytes , value : bytes ) -> None :
8090 """
8191 Sets the value at the given keypath from the given node
8292
@@ -87,7 +97,11 @@ def set(self, key, value):
8797
8898 self .root_hash = self ._set (self .root_hash , encode_to_bin (key ), value )
8999
90- def _set (self , node_hash , keypath , value , if_delete_subtrie = False ):
100+ def _set (self ,
101+ node_hash : bytes ,
102+ keypath : bytes ,
103+ value : bytes ,
104+ if_delete_subtrie : bool = False ) -> bytes :
91105 """
92106 If if_delete_subtrie is set to True, what it will do is that it take in a
93107 keypath and traverse til the end of keypath, then delete the whole subtrie
@@ -155,14 +169,14 @@ def _set(self, node_hash, keypath, value, if_delete_subtrie=False):
155169
156170 def _set_kv_node (
157171 self ,
158- keypath ,
159- node_hash ,
160- node_type ,
161- left_child ,
162- right_child ,
163- value ,
164- if_delete_subtrie = False ,
165- ):
172+ keypath : bytes ,
173+ node_hash : bytes ,
174+ node_type : int ,
175+ left_child : bytes ,
176+ right_child : bytes ,
177+ value : bytes ,
178+ if_delete_subtrie : bool = False ,
179+ ) -> bytes :
166180 # Keypath prefixes match
167181 if if_delete_subtrie :
168182 if len (keypath ) < len (left_child ) and keypath == left_child [: len (keypath )]:
@@ -257,13 +271,13 @@ def _set_kv_node(
257271
258272 def _set_branch_node (
259273 self ,
260- keypath ,
261- node_type ,
262- left_child ,
263- right_child ,
264- value ,
265- if_delete_subtrie = False ,
266- ):
274+ keypath : bytes ,
275+ node_type : int ,
276+ left_child : bytes ,
277+ right_child : bytes ,
278+ value : bytes ,
279+ if_delete_subtrie : bool = False ,
280+ ) -> bytes :
267281 # Which child node to update? Depends on first bit in keypath
268282 if keypath [:1 ] == BYTE_0 :
269283 new_left_child = self ._set (
@@ -303,20 +317,20 @@ def _set_branch_node(
303317 encode_branch_node (new_left_child , new_right_child )
304318 )
305319
306- def exists (self , key ) :
320+ def exists (self , key : bytes ) -> bool :
307321 validate_is_bytes (key )
308322
309323 return self .get (key ) is not None
310324
311- def delete (self , key ) :
325+ def delete (self , key : bytes ) -> None :
312326 """
313327 Equals to setting the value to None
314328 """
315329 validate_is_bytes (key )
316330
317331 self .root_hash = self ._set (self .root_hash , encode_to_bin (key ), b"" )
318332
319- def delete_subtrie (self , key ) :
333+ def delete_subtrie (self , key : bytes ) -> None :
320334 """
321335 Given a key prefix, delete the whole subtrie that starts with the key prefix.
322336
@@ -337,19 +351,19 @@ def delete_subtrie(self, key):
337351 # Convenience
338352 #
339353 @property
340- def root_node (self ):
354+ def root_node (self ) -> bytes :
341355 return self .db [self .root_hash ]
342356
343357 @root_node .setter
344- def root_node (self , node ) :
358+ def root_node (self , node : bytes ) -> None :
345359 validate_is_bin_node (node )
346360
347361 self .root_hash = self ._hash_and_save (node )
348362
349363 #
350364 # Utils
351365 #
352- def _hash_and_save (self , node ) :
366+ def _hash_and_save (self , node : bytes ) -> bytes :
353367 """
354368 Saves a node into the database and returns its hash
355369 """
@@ -362,14 +376,14 @@ def _hash_and_save(self, node):
362376 #
363377 # Dictionary API
364378 #
365- def __getitem__ (self , key ) :
379+ def __getitem__ (self , key : bytes ) -> Optional [ bytes ] :
366380 return self .get (key )
367381
368- def __setitem__ (self , key , value ) :
382+ def __setitem__ (self , key : bytes , value : bytes ) -> None :
369383 return self .set (key , value )
370384
371- def __delitem__ (self , key ) :
385+ def __delitem__ (self , key : bytes ) -> None :
372386 return self .delete (key )
373387
374- def __contains__ (self , key ) :
388+ def __contains__ (self , key : bytes ) -> bool :
375389 return self .exists (key )
0 commit comments