@@ -12,6 +12,153 @@ defmodule Unit.SSZExTest do
12
12
assert { :error , ^ error_message } = SszEx . decode ( serialized , schema )
13
13
end
14
14
15
+ test "packing a list of uints" do
16
+ list_1 = [ 1 , 2 , 3 , 4 , 5 ]
17
+
18
+ expected_1 =
19
+ << 1 , 2 , 3 , 4 , 5 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
20
+ 0 , 0 >>
21
+
22
+ actual_1 = SszEx . pack ( list_1 , { :list , { :int , 8 } , 5 } )
23
+ assert expected_1 == actual_1
24
+
25
+ list_2 = [
26
+ 18_446_744_073_709_551_595 ,
27
+ 18_446_744_073_709_551_596 ,
28
+ 18_446_744_073_709_551_597 ,
29
+ 18_446_744_073_709_551_598 ,
30
+ 18_446_744_073_709_551_599 ,
31
+ 18_446_744_073_709_551_600 ,
32
+ 18_446_744_073_709_551_601 ,
33
+ 18_446_744_073_709_551_603 ,
34
+ 18_446_744_073_709_551_604 ,
35
+ 18_446_744_073_709_551_605 ,
36
+ 18_446_744_073_709_551_606 ,
37
+ 18_446_744_073_709_551_607 ,
38
+ 18_446_744_073_709_551_608 ,
39
+ 18_446_744_073_709_551_609 ,
40
+ 18_446_744_073_709_551_610 ,
41
+ 18_446_744_073_709_551_611 ,
42
+ 18_446_744_073_709_551_612 ,
43
+ 18_446_744_073_709_551_613 ,
44
+ 18_446_744_073_709_551_614 ,
45
+ 18_446_744_073_709_551_615
46
+ ]
47
+
48
+ expected_2 =
49
+ << 235 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 236 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 237 , 255 ,
50
+ 255 , 255 , 255 , 255 , 255 , 255 , 238 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 239 , 255 , 255 , 255 ,
51
+ 255 , 255 , 255 , 255 , 240 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 241 , 255 , 255 , 255 , 255 , 255 ,
52
+ 255 , 255 , 243 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 244 , 255 , 255 , 255 , 255 , 255 , 255 , 255 ,
53
+ 245 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 246 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 247 , 255 ,
54
+ 255 , 255 , 255 , 255 , 255 , 255 , 248 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 249 , 255 , 255 , 255 ,
55
+ 255 , 255 , 255 , 255 , 250 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 251 , 255 , 255 , 255 , 255 , 255 ,
56
+ 255 , 255 , 252 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 253 , 255 , 255 , 255 , 255 , 255 , 255 , 255 ,
57
+ 254 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 , 255 >>
58
+
59
+ actual_2 = SszEx . pack ( list_2 , { :list , { :int , 64 } , 15 } )
60
+ assert expected_2 == actual_2
61
+ end
62
+
63
+ test "packing a list of booleans" do
64
+ list = [ true , false , true , false , true ]
65
+
66
+ expected =
67
+ << 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
68
+ 0 , 0 >>
69
+
70
+ actual = SszEx . pack ( list , { :list , :bool , 5 } )
71
+ assert expected == actual
72
+ end
73
+
74
+ test "merklelization of chunks" do
75
+ ## Reference: https://github.com/ralexstokes/ssz-rs/blob/1f94d5dfc70c86dab672e91ac46af04a5f96c342/ssz-rs/src/merkleization/mod.rs#L371
76
+ ## https://github.com/ralexstokes/ssz-rs/blob/1f94d5dfc70c86dab672e91ac46af04a5f96c342/ssz-rs/src/merkleization/mod.rs#L416
77
+ zero = << 0 :: 256 >>
78
+
79
+ chunks = zero
80
+ root = SszEx . merkleize_chunks ( chunks )
81
+ expected_value = "0000000000000000000000000000000000000000000000000000000000000000"
82
+ assert root |> Base . encode16 ( case: :lower ) == expected_value
83
+
84
+ chunks = zero <> zero
85
+ root = chunks |> SszEx . merkleize_chunks ( 2 )
86
+ expected_value = "f5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b"
87
+ assert root |> Base . encode16 ( case: :lower ) == expected_value
88
+
89
+ ones = 0 .. 31 |> Enum . reduce ( << >> , fn _ , acc -> << 1 >> <> acc end )
90
+
91
+ chunks = ones <> ones
92
+ root = chunks |> SszEx . merkleize_chunks ( 2 )
93
+ expected_value = "7c8975e1e60a5c8337f28edf8c33c3b180360b7279644a9bc1af3c51e6220bf5"
94
+ assert root |> Base . encode16 ( case: :lower ) == expected_value
95
+
96
+ chunks = zero <> zero <> zero <> zero
97
+ root = chunks |> SszEx . merkleize_chunks ( 4 )
98
+ expected_value = "db56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71"
99
+ assert root |> Base . encode16 ( case: :lower ) == expected_value
100
+
101
+ chunks = zero <> zero <> zero <> zero <> zero <> zero <> zero <> zero
102
+ root = chunks |> SszEx . merkleize_chunks ( 8 )
103
+ expected_value = "c78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c"
104
+ assert root |> Base . encode16 ( case: :lower ) == expected_value
105
+
106
+ chunks = ones
107
+ root = chunks |> SszEx . merkleize_chunks ( 4 )
108
+ expected_value = "29797eded0e83376b70f2bf034cc0811ae7f1414653b1d720dfd18f74cf13309"
109
+ assert root |> Base . encode16 ( case: :lower ) == expected_value
110
+
111
+ twos = 0 .. 31 |> Enum . reduce ( << >> , fn _ , acc -> << 2 >> <> acc end )
112
+
113
+ chunks = twos
114
+ root = chunks |> SszEx . merkleize_chunks ( 8 )
115
+ expected_value = "fa4cf775712aa8a2fe5dcb5a517d19b2e9effcf58ff311b9fd8e4a7d308e6d00"
116
+ assert root |> Base . encode16 ( case: :lower ) == expected_value
117
+
118
+ chunks = ones <> ones <> ones
119
+ root = chunks |> SszEx . merkleize_chunks ( 4 )
120
+ expected_value = "65aa94f2b59e517abd400cab655f42821374e433e41b8fe599f6bb15484adcec"
121
+ assert root |> Base . encode16 ( case: :lower ) == expected_value
122
+
123
+ chunks = ones <> ones <> ones <> ones <> ones
124
+ root = chunks |> SszEx . merkleize_chunks ( 8 )
125
+ expected_value = "0ae67e34cba4ad2bbfea5dc39e6679b444021522d861fab00f05063c54341289"
126
+ assert root |> Base . encode16 ( case: :lower ) == expected_value
127
+
128
+ chunks = ones <> ones <> ones <> ones <> ones <> ones
129
+ root = chunks |> SszEx . merkleize_chunks ( 8 )
130
+ expected_value = "0ef7df63c204ef203d76145627b8083c49aa7c55ebdee2967556f55a4f65a238"
131
+ assert root |> Base . encode16 ( case: :lower ) == expected_value
132
+
133
+ ## Large Leaf Count
134
+
135
+ chunks = ones <> ones <> ones <> ones <> ones
136
+ root = chunks |> SszEx . merkleize_chunks ( 2 ** 10 )
137
+ expected_value = "2647cb9e26bd83eeb0982814b2ac4d6cc4a65d0d98637f1a73a4c06d3db0e6ce"
138
+ assert root |> Base . encode16 ( case: :lower ) == expected_value
139
+
140
+ ## TOO HEAVY COMPUTATION!
141
+ # chunks = 1..70 |> Enum.reduce(<<>>, fn _, acc -> acc <> ones end)
142
+ # leaf_count = 9_223_372_036_854_775_808 # 2 ** 63
143
+ # root = chunks |> SszEx.merkleize_chunks(leaf_count)
144
+ # expected_value = "9317695d95b5a3b46e976b5a9cbfcfccb600accaddeda9ac867cc9669b862979"
145
+ # assert root |> Base.encode16(case: :lower) == expected_value
146
+ end
147
+
148
+ test "hash tree root of list" do
149
+ ## reference: https://github.com/ralexstokes/ssz-rs/blob/1f94d5dfc70c86dab672e91ac46af04a5f96c342/ssz-rs/src/merkleization/mod.rs#L459
150
+
151
+ list = Stream . cycle ( [ 65_535 ] ) |> Enum . take ( 316 )
152
+ { :ok , root } = list |> SszEx . hash_tree_root ( { :list , { :int , 16 } , 1024 } )
153
+ expected_value = "d20d2246e1438d88de46f6f41c7b041f92b673845e51f2de93b944bf599e63b1"
154
+ assert root |> Base . encode16 ( case: :lower ) == expected_value
155
+
156
+ ## hash tree root of empty list
157
+ { :ok , root } = [ ] |> SszEx . hash_tree_root ( { :list , { :int , 16 } , 1024 } )
158
+ expected_value = "c9eece3e14d3c3db45c38bbf69a4cb7464981e2506d8424a0ba450dad9b9af30"
159
+ assert root |> Base . encode16 ( case: :lower ) == expected_value
160
+ end
161
+
15
162
test "serialize and deserialize uint" do
16
163
assert_roundtrip ( << 5 >> , 5 , { :int , 8 } )
17
164
assert_roundtrip ( << 5 , 0 >> , 5 , { :int , 16 } )
0 commit comments