There are Hashmaps and HashmapAugs implementations.
Hashmap
Serialization
To create one provide in HashMap
constructor key length and optional value_serializer
func:
Copy new_dict = HashMap ( 267 , value_serializer =lambda src , dest : dest. store_coins (src))
# or
new_dict = HashMap ( 267 ). with_coins_values ()
Key should has one of the following type: int
, str
, bytes
, Address
. Value could be any if specified value_serializer
, otherwise value must be cell. To set a value use set
method:
Copy new_dict . set (key = Address ( 'EQBvW8Z5huBkMJYdnfAEM5JqTNkuWX3diqYENkWsIL0XggGG' ), value = 15 )\
. set (key = Address ( 'EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N' ), value = 10 )
Then call serialize
method:
Copy new_dict_cell = new_dict . serialize ()
print (new_dict_cell)
>>> 22 [ 817000 ] -> {
297 [BFF7ADE33CC37032184B0ECEF80219C935266C972CBEEEC553021B22D6105E8BC10000000780] ,
297 [BFC1EFEAA9731B94DA397E5E64622F5E63348B812AC5B4763A93F0DD201D0798D40000000780]
}
If you have not set any values, serialize return None
.
Parsing
You can parse dict using HashMap
's parse
method, or load it from a slice:
Copy def key_deserializer ( src ):
return Builder (). store_bits (src). to_slice (). load_address ()
def value_deserializer ( src ):
return src . load_coins ()
hashmap_e = Builder (). store_bit ( 1 ). store_dict (new_dict_cell). end_cell ()
print (hashmap_e. begin_parse (). load_dict ( 267 ))
print (new_dict_cell. begin_parse (). load_hashmap ( 267 , key_deserializer, value_deserializer))
print (HashMap. parse (new_dict_cell. begin_parse (), 267 , key_deserializer, value_deserializer))
>>> {118621468258109555883414559823777639640406072296410285331234498098430527437346690: <Slice 12[10F0] -> 0 refs>, 118630747841378569603204119301805376564831504145530059638093173869611524683674024: <Slice 12[10A0] -> 0 refs>}
>>> {Address<EQBvW8Z5huBkMJYdnfAEM5JqTNkuWX3diqYENkWsIL0XggGG>: 15, Address<EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N>: 10}
>>> {Address<EQBvW8Z5huBkMJYdnfAEM5JqTNkuWX3diqYENkWsIL0XggGG>: 15, Address<EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N>: 10}
HashmapAug
Currently there is no individual class for HashmapAugs, they are used only in TLB schemes deserialization. But you can load them and even parse from slices:
Copy class ShardAccounts ( TlbScheme ):
"""
_ (HashmapAugE 256 ShardAccount DepthBalanceInfo) = ShardAccounts;
"""
def serialize ( self , * args ):
...
@ classmethod
def deserialize ( cls , cell_slice : Slice):
return cell_slice . load_hashmap_aug_e (key_length = 256 ,
x_deserializer = ShardAccount.deserialize,
y_deserializer = DepthBalanceInfo.deserialize)
The load_hashmap_aug_e
method returns dict with parsed values and list with parsed extras.
Last updated 10 months ago