stacktrie_test.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. // Copyright 2020 The go-ethereum Authors
  2. // This file is part of the go-ethereum library.
  3. //
  4. // The go-ethereum library is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU Lesser General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // The go-ethereum library is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU Lesser General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU Lesser General Public License
  15. // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
  16. package trie
  17. import (
  18. "bytes"
  19. "math/big"
  20. "testing"
  21. "github.com/ethereum/go-ethereum/common"
  22. "github.com/ethereum/go-ethereum/crypto"
  23. "github.com/ethereum/go-ethereum/ethdb/memorydb"
  24. )
  25. func TestStackTrieInsertAndHash(t *testing.T) {
  26. type KeyValueHash struct {
  27. K string // Hex string for key.
  28. V string // Value, directly converted to bytes.
  29. H string // Expected root hash after insert of (K, V) to an existing trie.
  30. }
  31. tests := [][]KeyValueHash{
  32. { // {0:0, 7:0, f:0}
  33. {"00", "v_______________________0___0", "5cb26357b95bb9af08475be00243ceb68ade0b66b5cd816b0c18a18c612d2d21"},
  34. {"70", "v_______________________0___1", "8ff64309574f7a437a7ad1628e690eb7663cfde10676f8a904a8c8291dbc1603"},
  35. {"f0", "v_______________________0___2", "9e3a01bd8d43efb8e9d4b5506648150b8e3ed1caea596f84ee28e01a72635470"},
  36. },
  37. { // {1:0cc, e:{1:fc, e:fc}}
  38. {"10cc", "v_______________________1___0", "233e9b257843f3dfdb1cce6676cdaf9e595ac96ee1b55031434d852bc7ac9185"},
  39. {"e1fc", "v_______________________1___1", "39c5e908ae83d0c78520c7c7bda0b3782daf594700e44546e93def8f049cca95"},
  40. {"eefc", "v_______________________1___2", "d789567559fd76fe5b7d9cc42f3750f942502ac1c7f2a466e2f690ec4b6c2a7c"},
  41. },
  42. { // {b:{a:ac, b:ac}, d:acc}
  43. {"baac", "v_______________________2___0", "8be1c86ba7ec4c61e14c1a9b75055e0464c2633ae66a055a24e75450156a5d42"},
  44. {"bbac", "v_______________________2___1", "8495159b9895a7d88d973171d737c0aace6fe6ac02a4769fff1bc43bcccce4cc"},
  45. {"dacc", "v_______________________2___2", "9bcfc5b220a27328deb9dc6ee2e3d46c9ebc9c69e78acda1fa2c7040602c63ca"},
  46. },
  47. { // {0:0cccc, 2:456{0:0, 2:2}
  48. {"00cccc", "v_______________________3___0", "e57dc2785b99ce9205080cb41b32ebea7ac3e158952b44c87d186e6d190a6530"},
  49. {"245600", "v_______________________3___1", "0335354adbd360a45c1871a842452287721b64b4234dfe08760b243523c998db"},
  50. {"245622", "v_______________________3___2", "9e6832db0dca2b5cf81c0e0727bfde6afc39d5de33e5720bccacc183c162104e"},
  51. },
  52. { // {1:4567{1:1c, 3:3c}, 3:0cccccc}
  53. {"1456711c", "v_______________________4___0", "f2389e78d98fed99f3e63d6d1623c1d4d9e8c91cb1d585de81fbc7c0e60d3529"},
  54. {"1456733c", "v_______________________4___1", "101189b3fab852be97a0120c03d95eefcf984d3ed639f2328527de6def55a9c0"},
  55. {"30cccccc", "v_______________________4___2", "3780ce111f98d15751dfde1eb21080efc7d3914b429e5c84c64db637c55405b3"},
  56. },
  57. { // 8800{1:f, 2:e, 3:d}
  58. {"88001f", "v_______________________5___0", "e817db50d84f341d443c6f6593cafda093fc85e773a762421d47daa6ac993bd5"},
  59. {"88002e", "v_______________________5___1", "d6e3e6047bdc110edd296a4d63c030aec451bee9d8075bc5a198eee8cda34f68"},
  60. {"88003d", "v_______________________5___2", "b6bdf8298c703342188e5f7f84921a402042d0e5fb059969dd53a6b6b1fb989e"},
  61. },
  62. { // 0{1:fc, 2:ec, 4:dc}
  63. {"01fc", "v_______________________6___0", "693268f2ca80d32b015f61cd2c4dba5a47a6b52a14c34f8e6945fad684e7a0d5"},
  64. {"02ec", "v_______________________6___1", "e24ddd44469310c2b785a2044618874bf486d2f7822603a9b8dce58d6524d5de"},
  65. {"04dc", "v_______________________6___2", "33fc259629187bbe54b92f82f0cd8083b91a12e41a9456b84fc155321e334db7"},
  66. },
  67. { // f{0:fccc, f:ff{0:f, f:f}}
  68. {"f0fccc", "v_______________________7___0", "b0966b5aa469a3e292bc5fcfa6c396ae7a657255eef552ea7e12f996de795b90"},
  69. {"ffff0f", "v_______________________7___1", "3b1ca154ec2a3d96d8d77bddef0abfe40a53a64eb03cecf78da9ec43799fa3d0"},
  70. {"ffffff", "v_______________________7___2", "e75463041f1be8252781be0ace579a44ea4387bf5b2739f4607af676f7719678"},
  71. },
  72. { // ff{0:f{0:f, f:f}, f:fcc}
  73. {"ff0f0f", "v_______________________8___0", "0928af9b14718ec8262ab89df430f1e5fbf66fac0fed037aff2b6767ae8c8684"},
  74. {"ff0fff", "v_______________________8___1", "d870f4d3ce26b0bf86912810a1960693630c20a48ba56be0ad04bc3e9ddb01e6"},
  75. {"ffffcc", "v_______________________8___2", "4239f10dd9d9915ecf2e047d6a576bdc1733ed77a30830f1bf29deaf7d8e966f"},
  76. },
  77. {
  78. {"123d", "x___________________________0", "fc453d88b6f128a77c448669710497380fa4588abbea9f78f4c20c80daa797d0"},
  79. {"123e", "x___________________________1", "5af48f2d8a9a015c1ff7fa8b8c7f6b676233bd320e8fb57fd7933622badd2cec"},
  80. {"123f", "x___________________________2", "1164d7299964e74ac40d761f9189b2a3987fae959800d0f7e29d3aaf3eae9e15"},
  81. },
  82. {
  83. {"123d", "x___________________________0", "fc453d88b6f128a77c448669710497380fa4588abbea9f78f4c20c80daa797d0"},
  84. {"123e", "x___________________________1", "5af48f2d8a9a015c1ff7fa8b8c7f6b676233bd320e8fb57fd7933622badd2cec"},
  85. {"124a", "x___________________________2", "661a96a669869d76b7231380da0649d013301425fbea9d5c5fae6405aa31cfce"},
  86. },
  87. {
  88. {"123d", "x___________________________0", "fc453d88b6f128a77c448669710497380fa4588abbea9f78f4c20c80daa797d0"},
  89. {"123e", "x___________________________1", "5af48f2d8a9a015c1ff7fa8b8c7f6b676233bd320e8fb57fd7933622badd2cec"},
  90. {"13aa", "x___________________________2", "6590120e1fd3ffd1a90e8de5bb10750b61079bb0776cca4414dd79a24e4d4356"},
  91. },
  92. {
  93. {"123d", "x___________________________0", "fc453d88b6f128a77c448669710497380fa4588abbea9f78f4c20c80daa797d0"},
  94. {"123e", "x___________________________1", "5af48f2d8a9a015c1ff7fa8b8c7f6b676233bd320e8fb57fd7933622badd2cec"},
  95. {"2aaa", "x___________________________2", "f869b40e0c55eace1918332ef91563616fbf0755e2b946119679f7ef8e44b514"},
  96. },
  97. {
  98. {"1234da", "x___________________________0", "1c4b4462e9f56a80ca0f5d77c0d632c41b0102290930343cf1791e971a045a79"},
  99. {"1234ea", "x___________________________1", "2f502917f3ba7d328c21c8b45ee0f160652e68450332c166d4ad02d1afe31862"},
  100. {"1234fa", "x___________________________2", "4f4e368ab367090d5bc3dbf25f7729f8bd60df84de309b4633a6b69ab66142c0"},
  101. },
  102. {
  103. {"1234da", "x___________________________0", "1c4b4462e9f56a80ca0f5d77c0d632c41b0102290930343cf1791e971a045a79"},
  104. {"1234ea", "x___________________________1", "2f502917f3ba7d328c21c8b45ee0f160652e68450332c166d4ad02d1afe31862"},
  105. {"1235aa", "x___________________________2", "21840121d11a91ac8bbad9a5d06af902a5c8d56a47b85600ba813814b7bfcb9b"},
  106. },
  107. {
  108. {"1234da", "x___________________________0", "1c4b4462e9f56a80ca0f5d77c0d632c41b0102290930343cf1791e971a045a79"},
  109. {"1234ea", "x___________________________1", "2f502917f3ba7d328c21c8b45ee0f160652e68450332c166d4ad02d1afe31862"},
  110. {"124aaa", "x___________________________2", "ea4040ddf6ae3fbd1524bdec19c0ab1581015996262006632027fa5cf21e441e"},
  111. },
  112. {
  113. {"1234da", "x___________________________0", "1c4b4462e9f56a80ca0f5d77c0d632c41b0102290930343cf1791e971a045a79"},
  114. {"1234ea", "x___________________________1", "2f502917f3ba7d328c21c8b45ee0f160652e68450332c166d4ad02d1afe31862"},
  115. {"13aaaa", "x___________________________2", "e4beb66c67e44f2dd8ba36036e45a44ff68f8d52942472b1911a45f886a34507"},
  116. },
  117. {
  118. {"1234da", "x___________________________0", "1c4b4462e9f56a80ca0f5d77c0d632c41b0102290930343cf1791e971a045a79"},
  119. {"1234ea", "x___________________________1", "2f502917f3ba7d328c21c8b45ee0f160652e68450332c166d4ad02d1afe31862"},
  120. {"2aaaaa", "x___________________________2", "5f5989b820ff5d76b7d49e77bb64f26602294f6c42a1a3becc669cd9e0dc8ec9"},
  121. },
  122. {
  123. {"000000", "x___________________________0", "3b32b7af0bddc7940e7364ee18b5a59702c1825e469452c8483b9c4e0218b55a"},
  124. {"1234da", "x___________________________1", "3ab152a1285dca31945566f872c1cc2f17a770440eda32aeee46a5e91033dde2"},
  125. {"1234ea", "x___________________________2", "0cccc87f96ddef55563c1b3be3c64fff6a644333c3d9cd99852cb53b6412b9b8"},
  126. {"1234fa", "x___________________________3", "65bb3aafea8121111d693ffe34881c14d27b128fd113fa120961f251fe28428d"},
  127. },
  128. {
  129. {"000000", "x___________________________0", "3b32b7af0bddc7940e7364ee18b5a59702c1825e469452c8483b9c4e0218b55a"},
  130. {"1234da", "x___________________________1", "3ab152a1285dca31945566f872c1cc2f17a770440eda32aeee46a5e91033dde2"},
  131. {"1234ea", "x___________________________2", "0cccc87f96ddef55563c1b3be3c64fff6a644333c3d9cd99852cb53b6412b9b8"},
  132. {"1235aa", "x___________________________3", "f670e4d2547c533c5f21e0045442e2ecb733f347ad6d29ef36e0f5ba31bb11a8"},
  133. },
  134. {
  135. {"000000", "x___________________________0", "3b32b7af0bddc7940e7364ee18b5a59702c1825e469452c8483b9c4e0218b55a"},
  136. {"1234da", "x___________________________1", "3ab152a1285dca31945566f872c1cc2f17a770440eda32aeee46a5e91033dde2"},
  137. {"1234ea", "x___________________________2", "0cccc87f96ddef55563c1b3be3c64fff6a644333c3d9cd99852cb53b6412b9b8"},
  138. {"124aaa", "x___________________________3", "c17464123050a9a6f29b5574bb2f92f6d305c1794976b475b7fb0316b6335598"},
  139. },
  140. {
  141. {"000000", "x___________________________0", "3b32b7af0bddc7940e7364ee18b5a59702c1825e469452c8483b9c4e0218b55a"},
  142. {"1234da", "x___________________________1", "3ab152a1285dca31945566f872c1cc2f17a770440eda32aeee46a5e91033dde2"},
  143. {"1234ea", "x___________________________2", "0cccc87f96ddef55563c1b3be3c64fff6a644333c3d9cd99852cb53b6412b9b8"},
  144. {"13aaaa", "x___________________________3", "aa8301be8cb52ea5cd249f5feb79fb4315ee8de2140c604033f4b3fff78f0105"},
  145. },
  146. {
  147. {"0000", "x___________________________0", "cb8c09ad07ae882136f602b3f21f8733a9f5a78f1d2525a8d24d1c13258000b2"},
  148. {"123d", "x___________________________1", "8f09663deb02f08958136410dc48565e077f76bb6c9d8c84d35fc8913a657d31"},
  149. {"123e", "x___________________________2", "0d230561e398c579e09a9f7b69ceaf7d3970f5a436fdb28b68b7a37c5bdd6b80"},
  150. {"123f", "x___________________________3", "80f7bad1893ca57e3443bb3305a517723a74d3ba831bcaca22a170645eb7aafb"},
  151. },
  152. {
  153. {"0000", "x___________________________0", "cb8c09ad07ae882136f602b3f21f8733a9f5a78f1d2525a8d24d1c13258000b2"},
  154. {"123d", "x___________________________1", "8f09663deb02f08958136410dc48565e077f76bb6c9d8c84d35fc8913a657d31"},
  155. {"123e", "x___________________________2", "0d230561e398c579e09a9f7b69ceaf7d3970f5a436fdb28b68b7a37c5bdd6b80"},
  156. {"124a", "x___________________________3", "383bc1bb4f019e6bc4da3751509ea709b58dd1ac46081670834bae072f3e9557"},
  157. },
  158. {
  159. {"0000", "x___________________________0", "cb8c09ad07ae882136f602b3f21f8733a9f5a78f1d2525a8d24d1c13258000b2"},
  160. {"123d", "x___________________________1", "8f09663deb02f08958136410dc48565e077f76bb6c9d8c84d35fc8913a657d31"},
  161. {"123e", "x___________________________2", "0d230561e398c579e09a9f7b69ceaf7d3970f5a436fdb28b68b7a37c5bdd6b80"},
  162. {"13aa", "x___________________________3", "ff0dc70ce2e5db90ee42a4c2ad12139596b890e90eb4e16526ab38fa465b35cf"},
  163. },
  164. }
  165. st := NewStackTrie(nil)
  166. for i, test := range tests {
  167. // The StackTrie does not allow Insert(), Hash(), Insert(), ...
  168. // so we will create new trie for every sequence length of inserts.
  169. for l := 1; l <= len(test); l++ {
  170. st.Reset()
  171. for j := 0; j < l; j++ {
  172. kv := &test[j]
  173. if err := st.TryUpdate(common.FromHex(kv.K), []byte(kv.V)); err != nil {
  174. t.Fatal(err)
  175. }
  176. }
  177. expected := common.HexToHash(test[l-1].H)
  178. if h := st.Hash(); h != expected {
  179. t.Errorf("%d(%d): root hash mismatch: %x, expected %x", i, l, h, expected)
  180. }
  181. }
  182. }
  183. }
  184. func TestSizeBug(t *testing.T) {
  185. st := NewStackTrie(nil)
  186. nt := NewEmpty(NewDatabase(memorydb.New()))
  187. leaf := common.FromHex("290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563")
  188. value := common.FromHex("94cf40d0d2b44f2b66e07cace1372ca42b73cf21a3")
  189. nt.TryUpdate(leaf, value)
  190. st.TryUpdate(leaf, value)
  191. if nt.Hash() != st.Hash() {
  192. t.Fatalf("error %x != %x", st.Hash(), nt.Hash())
  193. }
  194. }
  195. func TestEmptyBug(t *testing.T) {
  196. st := NewStackTrie(nil)
  197. nt := NewEmpty(NewDatabase(memorydb.New()))
  198. //leaf := common.FromHex("290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563")
  199. //value := common.FromHex("94cf40d0d2b44f2b66e07cace1372ca42b73cf21a3")
  200. kvs := []struct {
  201. K string
  202. V string
  203. }{
  204. {K: "405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace", V: "9496f4ec2bf9dab484cac6be589e8417d84781be08"},
  205. {K: "40edb63a35fcf86c08022722aa3287cdd36440d671b4918131b2514795fefa9c", V: "01"},
  206. {K: "b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6", V: "947a30f7736e48d6599356464ba4c150d8da0302ff"},
  207. {K: "c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b", V: "02"},
  208. }
  209. for _, kv := range kvs {
  210. nt.TryUpdate(common.FromHex(kv.K), common.FromHex(kv.V))
  211. st.TryUpdate(common.FromHex(kv.K), common.FromHex(kv.V))
  212. }
  213. if nt.Hash() != st.Hash() {
  214. t.Fatalf("error %x != %x", st.Hash(), nt.Hash())
  215. }
  216. }
  217. func TestValLength56(t *testing.T) {
  218. st := NewStackTrie(nil)
  219. nt := NewEmpty(NewDatabase(memorydb.New()))
  220. //leaf := common.FromHex("290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563")
  221. //value := common.FromHex("94cf40d0d2b44f2b66e07cace1372ca42b73cf21a3")
  222. kvs := []struct {
  223. K string
  224. V string
  225. }{
  226. {K: "405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace", V: "1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111"},
  227. }
  228. for _, kv := range kvs {
  229. nt.TryUpdate(common.FromHex(kv.K), common.FromHex(kv.V))
  230. st.TryUpdate(common.FromHex(kv.K), common.FromHex(kv.V))
  231. }
  232. if nt.Hash() != st.Hash() {
  233. t.Fatalf("error %x != %x", st.Hash(), nt.Hash())
  234. }
  235. }
  236. // TestUpdateSmallNodes tests a case where the leaves are small (both key and value),
  237. // which causes a lot of node-within-node. This case was found via fuzzing.
  238. func TestUpdateSmallNodes(t *testing.T) {
  239. st := NewStackTrie(nil)
  240. nt := NewEmpty(NewDatabase(memorydb.New()))
  241. kvs := []struct {
  242. K string
  243. V string
  244. }{
  245. {"63303030", "3041"}, // stacktrie.Update
  246. {"65", "3000"}, // stacktrie.Update
  247. }
  248. for _, kv := range kvs {
  249. nt.TryUpdate(common.FromHex(kv.K), common.FromHex(kv.V))
  250. st.TryUpdate(common.FromHex(kv.K), common.FromHex(kv.V))
  251. }
  252. if nt.Hash() != st.Hash() {
  253. t.Fatalf("error %x != %x", st.Hash(), nt.Hash())
  254. }
  255. }
  256. // TestUpdateVariableKeys contains a case which stacktrie fails: when keys of different
  257. // sizes are used, and the second one has the same prefix as the first, then the
  258. // stacktrie fails, since it's unable to 'expand' on an already added leaf.
  259. // For all practical purposes, this is fine, since keys are fixed-size length
  260. // in account and storage tries.
  261. //
  262. // The test is marked as 'skipped', and exists just to have the behaviour documented.
  263. // This case was found via fuzzing.
  264. func TestUpdateVariableKeys(t *testing.T) {
  265. t.SkipNow()
  266. st := NewStackTrie(nil)
  267. nt := NewEmpty(NewDatabase(memorydb.New()))
  268. kvs := []struct {
  269. K string
  270. V string
  271. }{
  272. {"0x33303534636532393561313031676174", "303030"},
  273. {"0x3330353463653239356131303167617430", "313131"},
  274. }
  275. for _, kv := range kvs {
  276. nt.TryUpdate(common.FromHex(kv.K), common.FromHex(kv.V))
  277. st.TryUpdate(common.FromHex(kv.K), common.FromHex(kv.V))
  278. }
  279. if nt.Hash() != st.Hash() {
  280. t.Fatalf("error %x != %x", st.Hash(), nt.Hash())
  281. }
  282. }
  283. // TestStacktrieNotModifyValues checks that inserting blobs of data into the
  284. // stacktrie does not mutate the blobs
  285. func TestStacktrieNotModifyValues(t *testing.T) {
  286. st := NewStackTrie(nil)
  287. { // Test a very small trie
  288. // Give it the value as a slice with large backing alloc,
  289. // so if the stacktrie tries to append, it won't have to realloc
  290. value := make([]byte, 1, 100)
  291. value[0] = 0x2
  292. want := common.CopyBytes(value)
  293. st.TryUpdate([]byte{0x01}, value)
  294. st.Hash()
  295. if have := value; !bytes.Equal(have, want) {
  296. t.Fatalf("tiny trie: have %#x want %#x", have, want)
  297. }
  298. st = NewStackTrie(nil)
  299. }
  300. // Test with a larger trie
  301. keyB := big.NewInt(1)
  302. keyDelta := big.NewInt(1)
  303. var vals [][]byte
  304. getValue := func(i int) []byte {
  305. if i%2 == 0 { // large
  306. return crypto.Keccak256(big.NewInt(int64(i)).Bytes())
  307. } else { //small
  308. return big.NewInt(int64(i)).Bytes()
  309. }
  310. }
  311. for i := 0; i < 1000; i++ {
  312. key := common.BigToHash(keyB)
  313. value := getValue(i)
  314. st.TryUpdate(key.Bytes(), value)
  315. vals = append(vals, value)
  316. keyB = keyB.Add(keyB, keyDelta)
  317. keyDelta.Add(keyDelta, common.Big1)
  318. }
  319. st.Hash()
  320. for i := 0; i < 1000; i++ {
  321. want := getValue(i)
  322. have := vals[i]
  323. if !bytes.Equal(have, want) {
  324. t.Fatalf("item %d, have %#x want %#x", i, have, want)
  325. }
  326. }
  327. }
  328. // TestStacktrieSerialization tests that the stacktrie works well if we
  329. // serialize/unserialize it a lot
  330. func TestStacktrieSerialization(t *testing.T) {
  331. var (
  332. st = NewStackTrie(nil)
  333. nt = NewEmpty(NewDatabase(memorydb.New()))
  334. keyB = big.NewInt(1)
  335. keyDelta = big.NewInt(1)
  336. vals [][]byte
  337. keys [][]byte
  338. )
  339. getValue := func(i int) []byte {
  340. if i%2 == 0 { // large
  341. return crypto.Keccak256(big.NewInt(int64(i)).Bytes())
  342. } else { //small
  343. return big.NewInt(int64(i)).Bytes()
  344. }
  345. }
  346. for i := 0; i < 10; i++ {
  347. vals = append(vals, getValue(i))
  348. keys = append(keys, common.BigToHash(keyB).Bytes())
  349. keyB = keyB.Add(keyB, keyDelta)
  350. keyDelta.Add(keyDelta, common.Big1)
  351. }
  352. for i, k := range keys {
  353. nt.TryUpdate(k, common.CopyBytes(vals[i]))
  354. }
  355. for i, k := range keys {
  356. blob, err := st.MarshalBinary()
  357. if err != nil {
  358. t.Fatal(err)
  359. }
  360. newSt, err := NewFromBinary(blob, nil)
  361. if err != nil {
  362. t.Fatal(err)
  363. }
  364. st = newSt
  365. st.TryUpdate(k, common.CopyBytes(vals[i]))
  366. }
  367. if have, want := st.Hash(), nt.Hash(); have != want {
  368. t.Fatalf("have %#x want %#x", have, want)
  369. }
  370. }