@@ -26,6 +26,166 @@ import (
26
26
"github.com/XinFinOrg/XDPoSChain/ethdb/memorydb"
27
27
)
28
28
29
+ func TestStackTrieInsertAndHash (t * testing.T ) {
30
+ type KeyValueHash struct {
31
+ K string // Hex string for key.
32
+ V string // Value, directly converted to bytes.
33
+ H string // Expected root hash after insert of (K, V) to an existing trie.
34
+ }
35
+ tests := [][]KeyValueHash {
36
+ { // {0:0, 7:0, f:0}
37
+ {"00" , "v_______________________0___0" , "5cb26357b95bb9af08475be00243ceb68ade0b66b5cd816b0c18a18c612d2d21" },
38
+ {"70" , "v_______________________0___1" , "8ff64309574f7a437a7ad1628e690eb7663cfde10676f8a904a8c8291dbc1603" },
39
+ {"f0" , "v_______________________0___2" , "9e3a01bd8d43efb8e9d4b5506648150b8e3ed1caea596f84ee28e01a72635470" },
40
+ },
41
+ { // {1:0cc, e:{1:fc, e:fc}}
42
+ {"10cc" , "v_______________________1___0" , "233e9b257843f3dfdb1cce6676cdaf9e595ac96ee1b55031434d852bc7ac9185" },
43
+ {"e1fc" , "v_______________________1___1" , "39c5e908ae83d0c78520c7c7bda0b3782daf594700e44546e93def8f049cca95" },
44
+ {"eefc" , "v_______________________1___2" , "d789567559fd76fe5b7d9cc42f3750f942502ac1c7f2a466e2f690ec4b6c2a7c" },
45
+ },
46
+ { // {b:{a:ac, b:ac}, d:acc}
47
+ {"baac" , "v_______________________2___0" , "8be1c86ba7ec4c61e14c1a9b75055e0464c2633ae66a055a24e75450156a5d42" },
48
+ {"bbac" , "v_______________________2___1" , "8495159b9895a7d88d973171d737c0aace6fe6ac02a4769fff1bc43bcccce4cc" },
49
+ {"dacc" , "v_______________________2___2" , "9bcfc5b220a27328deb9dc6ee2e3d46c9ebc9c69e78acda1fa2c7040602c63ca" },
50
+ },
51
+ { // {0:0cccc, 2:456{0:0, 2:2}
52
+ {"00cccc" , "v_______________________3___0" , "e57dc2785b99ce9205080cb41b32ebea7ac3e158952b44c87d186e6d190a6530" },
53
+ {"245600" , "v_______________________3___1" , "0335354adbd360a45c1871a842452287721b64b4234dfe08760b243523c998db" },
54
+ {"245622" , "v_______________________3___2" , "9e6832db0dca2b5cf81c0e0727bfde6afc39d5de33e5720bccacc183c162104e" },
55
+ },
56
+ { // {1:4567{1:1c, 3:3c}, 3:0cccccc}
57
+ {"1456711c" , "v_______________________4___0" , "f2389e78d98fed99f3e63d6d1623c1d4d9e8c91cb1d585de81fbc7c0e60d3529" },
58
+ {"1456733c" , "v_______________________4___1" , "101189b3fab852be97a0120c03d95eefcf984d3ed639f2328527de6def55a9c0" },
59
+ {"30cccccc" , "v_______________________4___2" , "3780ce111f98d15751dfde1eb21080efc7d3914b429e5c84c64db637c55405b3" },
60
+ },
61
+ { // 8800{1:f, 2:e, 3:d}
62
+ {"88001f" , "v_______________________5___0" , "e817db50d84f341d443c6f6593cafda093fc85e773a762421d47daa6ac993bd5" },
63
+ {"88002e" , "v_______________________5___1" , "d6e3e6047bdc110edd296a4d63c030aec451bee9d8075bc5a198eee8cda34f68" },
64
+ {"88003d" , "v_______________________5___2" , "b6bdf8298c703342188e5f7f84921a402042d0e5fb059969dd53a6b6b1fb989e" },
65
+ },
66
+ { // 0{1:fc, 2:ec, 4:dc}
67
+ {"01fc" , "v_______________________6___0" , "693268f2ca80d32b015f61cd2c4dba5a47a6b52a14c34f8e6945fad684e7a0d5" },
68
+ {"02ec" , "v_______________________6___1" , "e24ddd44469310c2b785a2044618874bf486d2f7822603a9b8dce58d6524d5de" },
69
+ {"04dc" , "v_______________________6___2" , "33fc259629187bbe54b92f82f0cd8083b91a12e41a9456b84fc155321e334db7" },
70
+ },
71
+ { // f{0:fccc, f:ff{0:f, f:f}}
72
+ {"f0fccc" , "v_______________________7___0" , "b0966b5aa469a3e292bc5fcfa6c396ae7a657255eef552ea7e12f996de795b90" },
73
+ {"ffff0f" , "v_______________________7___1" , "3b1ca154ec2a3d96d8d77bddef0abfe40a53a64eb03cecf78da9ec43799fa3d0" },
74
+ {"ffffff" , "v_______________________7___2" , "e75463041f1be8252781be0ace579a44ea4387bf5b2739f4607af676f7719678" },
75
+ },
76
+ { // ff{0:f{0:f, f:f}, f:fcc}
77
+ {"ff0f0f" , "v_______________________8___0" , "0928af9b14718ec8262ab89df430f1e5fbf66fac0fed037aff2b6767ae8c8684" },
78
+ {"ff0fff" , "v_______________________8___1" , "d870f4d3ce26b0bf86912810a1960693630c20a48ba56be0ad04bc3e9ddb01e6" },
79
+ {"ffffcc" , "v_______________________8___2" , "4239f10dd9d9915ecf2e047d6a576bdc1733ed77a30830f1bf29deaf7d8e966f" },
80
+ },
81
+ {
82
+ {"123d" , "x___________________________0" , "fc453d88b6f128a77c448669710497380fa4588abbea9f78f4c20c80daa797d0" },
83
+ {"123e" , "x___________________________1" , "5af48f2d8a9a015c1ff7fa8b8c7f6b676233bd320e8fb57fd7933622badd2cec" },
84
+ {"123f" , "x___________________________2" , "1164d7299964e74ac40d761f9189b2a3987fae959800d0f7e29d3aaf3eae9e15" },
85
+ },
86
+ {
87
+ {"123d" , "x___________________________0" , "fc453d88b6f128a77c448669710497380fa4588abbea9f78f4c20c80daa797d0" },
88
+ {"123e" , "x___________________________1" , "5af48f2d8a9a015c1ff7fa8b8c7f6b676233bd320e8fb57fd7933622badd2cec" },
89
+ {"124a" , "x___________________________2" , "661a96a669869d76b7231380da0649d013301425fbea9d5c5fae6405aa31cfce" },
90
+ },
91
+ {
92
+ {"123d" , "x___________________________0" , "fc453d88b6f128a77c448669710497380fa4588abbea9f78f4c20c80daa797d0" },
93
+ {"123e" , "x___________________________1" , "5af48f2d8a9a015c1ff7fa8b8c7f6b676233bd320e8fb57fd7933622badd2cec" },
94
+ {"13aa" , "x___________________________2" , "6590120e1fd3ffd1a90e8de5bb10750b61079bb0776cca4414dd79a24e4d4356" },
95
+ },
96
+ {
97
+ {"123d" , "x___________________________0" , "fc453d88b6f128a77c448669710497380fa4588abbea9f78f4c20c80daa797d0" },
98
+ {"123e" , "x___________________________1" , "5af48f2d8a9a015c1ff7fa8b8c7f6b676233bd320e8fb57fd7933622badd2cec" },
99
+ {"2aaa" , "x___________________________2" , "f869b40e0c55eace1918332ef91563616fbf0755e2b946119679f7ef8e44b514" },
100
+ },
101
+ {
102
+ {"1234da" , "x___________________________0" , "1c4b4462e9f56a80ca0f5d77c0d632c41b0102290930343cf1791e971a045a79" },
103
+ {"1234ea" , "x___________________________1" , "2f502917f3ba7d328c21c8b45ee0f160652e68450332c166d4ad02d1afe31862" },
104
+ {"1234fa" , "x___________________________2" , "4f4e368ab367090d5bc3dbf25f7729f8bd60df84de309b4633a6b69ab66142c0" },
105
+ },
106
+ {
107
+ {"1234da" , "x___________________________0" , "1c4b4462e9f56a80ca0f5d77c0d632c41b0102290930343cf1791e971a045a79" },
108
+ {"1234ea" , "x___________________________1" , "2f502917f3ba7d328c21c8b45ee0f160652e68450332c166d4ad02d1afe31862" },
109
+ {"1235aa" , "x___________________________2" , "21840121d11a91ac8bbad9a5d06af902a5c8d56a47b85600ba813814b7bfcb9b" },
110
+ },
111
+ {
112
+ {"1234da" , "x___________________________0" , "1c4b4462e9f56a80ca0f5d77c0d632c41b0102290930343cf1791e971a045a79" },
113
+ {"1234ea" , "x___________________________1" , "2f502917f3ba7d328c21c8b45ee0f160652e68450332c166d4ad02d1afe31862" },
114
+ {"124aaa" , "x___________________________2" , "ea4040ddf6ae3fbd1524bdec19c0ab1581015996262006632027fa5cf21e441e" },
115
+ },
116
+ {
117
+ {"1234da" , "x___________________________0" , "1c4b4462e9f56a80ca0f5d77c0d632c41b0102290930343cf1791e971a045a79" },
118
+ {"1234ea" , "x___________________________1" , "2f502917f3ba7d328c21c8b45ee0f160652e68450332c166d4ad02d1afe31862" },
119
+ {"13aaaa" , "x___________________________2" , "e4beb66c67e44f2dd8ba36036e45a44ff68f8d52942472b1911a45f886a34507" },
120
+ },
121
+ {
122
+ {"1234da" , "x___________________________0" , "1c4b4462e9f56a80ca0f5d77c0d632c41b0102290930343cf1791e971a045a79" },
123
+ {"1234ea" , "x___________________________1" , "2f502917f3ba7d328c21c8b45ee0f160652e68450332c166d4ad02d1afe31862" },
124
+ {"2aaaaa" , "x___________________________2" , "5f5989b820ff5d76b7d49e77bb64f26602294f6c42a1a3becc669cd9e0dc8ec9" },
125
+ },
126
+ {
127
+ {"000000" , "x___________________________0" , "3b32b7af0bddc7940e7364ee18b5a59702c1825e469452c8483b9c4e0218b55a" },
128
+ {"1234da" , "x___________________________1" , "3ab152a1285dca31945566f872c1cc2f17a770440eda32aeee46a5e91033dde2" },
129
+ {"1234ea" , "x___________________________2" , "0cccc87f96ddef55563c1b3be3c64fff6a644333c3d9cd99852cb53b6412b9b8" },
130
+ {"1234fa" , "x___________________________3" , "65bb3aafea8121111d693ffe34881c14d27b128fd113fa120961f251fe28428d" },
131
+ },
132
+ {
133
+ {"000000" , "x___________________________0" , "3b32b7af0bddc7940e7364ee18b5a59702c1825e469452c8483b9c4e0218b55a" },
134
+ {"1234da" , "x___________________________1" , "3ab152a1285dca31945566f872c1cc2f17a770440eda32aeee46a5e91033dde2" },
135
+ {"1234ea" , "x___________________________2" , "0cccc87f96ddef55563c1b3be3c64fff6a644333c3d9cd99852cb53b6412b9b8" },
136
+ {"1235aa" , "x___________________________3" , "f670e4d2547c533c5f21e0045442e2ecb733f347ad6d29ef36e0f5ba31bb11a8" },
137
+ },
138
+ {
139
+ {"000000" , "x___________________________0" , "3b32b7af0bddc7940e7364ee18b5a59702c1825e469452c8483b9c4e0218b55a" },
140
+ {"1234da" , "x___________________________1" , "3ab152a1285dca31945566f872c1cc2f17a770440eda32aeee46a5e91033dde2" },
141
+ {"1234ea" , "x___________________________2" , "0cccc87f96ddef55563c1b3be3c64fff6a644333c3d9cd99852cb53b6412b9b8" },
142
+ {"124aaa" , "x___________________________3" , "c17464123050a9a6f29b5574bb2f92f6d305c1794976b475b7fb0316b6335598" },
143
+ },
144
+ {
145
+ {"000000" , "x___________________________0" , "3b32b7af0bddc7940e7364ee18b5a59702c1825e469452c8483b9c4e0218b55a" },
146
+ {"1234da" , "x___________________________1" , "3ab152a1285dca31945566f872c1cc2f17a770440eda32aeee46a5e91033dde2" },
147
+ {"1234ea" , "x___________________________2" , "0cccc87f96ddef55563c1b3be3c64fff6a644333c3d9cd99852cb53b6412b9b8" },
148
+ {"13aaaa" , "x___________________________3" , "aa8301be8cb52ea5cd249f5feb79fb4315ee8de2140c604033f4b3fff78f0105" },
149
+ },
150
+ {
151
+ {"0000" , "x___________________________0" , "cb8c09ad07ae882136f602b3f21f8733a9f5a78f1d2525a8d24d1c13258000b2" },
152
+ {"123d" , "x___________________________1" , "8f09663deb02f08958136410dc48565e077f76bb6c9d8c84d35fc8913a657d31" },
153
+ {"123e" , "x___________________________2" , "0d230561e398c579e09a9f7b69ceaf7d3970f5a436fdb28b68b7a37c5bdd6b80" },
154
+ {"123f" , "x___________________________3" , "80f7bad1893ca57e3443bb3305a517723a74d3ba831bcaca22a170645eb7aafb" },
155
+ },
156
+ {
157
+ {"0000" , "x___________________________0" , "cb8c09ad07ae882136f602b3f21f8733a9f5a78f1d2525a8d24d1c13258000b2" },
158
+ {"123d" , "x___________________________1" , "8f09663deb02f08958136410dc48565e077f76bb6c9d8c84d35fc8913a657d31" },
159
+ {"123e" , "x___________________________2" , "0d230561e398c579e09a9f7b69ceaf7d3970f5a436fdb28b68b7a37c5bdd6b80" },
160
+ {"124a" , "x___________________________3" , "383bc1bb4f019e6bc4da3751509ea709b58dd1ac46081670834bae072f3e9557" },
161
+ },
162
+ {
163
+ {"0000" , "x___________________________0" , "cb8c09ad07ae882136f602b3f21f8733a9f5a78f1d2525a8d24d1c13258000b2" },
164
+ {"123d" , "x___________________________1" , "8f09663deb02f08958136410dc48565e077f76bb6c9d8c84d35fc8913a657d31" },
165
+ {"123e" , "x___________________________2" , "0d230561e398c579e09a9f7b69ceaf7d3970f5a436fdb28b68b7a37c5bdd6b80" },
166
+ {"13aa" , "x___________________________3" , "ff0dc70ce2e5db90ee42a4c2ad12139596b890e90eb4e16526ab38fa465b35cf" },
167
+ },
168
+ }
169
+ st := NewStackTrie (nil )
170
+ for i , test := range tests {
171
+ // The StackTrie does not allow Insert(), Hash(), Insert(), ...
172
+ // so we will create new trie for every sequence length of inserts.
173
+ for l := 1 ; l <= len (test ); l ++ {
174
+ st .Reset ()
175
+ for j := 0 ; j < l ; j ++ {
176
+ kv := & test [j ]
177
+ if err := st .TryUpdate (common .FromHex (kv .K ), []byte (kv .V )); err != nil {
178
+ t .Fatal (err )
179
+ }
180
+ }
181
+ expected := common .HexToHash (test [l - 1 ].H )
182
+ if h := st .Hash (); h != expected {
183
+ t .Errorf ("%d(%d): root hash mismatch: %x, expected %x" , i , l , h , expected )
184
+ }
185
+ }
186
+ }
187
+ }
188
+
29
189
func TestSizeBug (t * testing.T ) {
30
190
st := NewStackTrie (nil )
31
191
nt , _ := New (common.Hash {}, NewDatabase (memorydb .New ()))
0 commit comments