proof_test.go 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990
  1. // Copyright 2015 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. crand "crypto/rand"
  20. "encoding/binary"
  21. mrand "math/rand"
  22. "sort"
  23. "testing"
  24. "time"
  25. "github.com/ethereum/go-ethereum/common"
  26. "github.com/ethereum/go-ethereum/crypto"
  27. "github.com/ethereum/go-ethereum/ethdb/memorydb"
  28. )
  29. func init() {
  30. mrand.Seed(time.Now().Unix())
  31. }
  32. // makeProvers creates Merkle trie provers based on different implementations to
  33. // test all variations.
  34. func makeProvers(trie *Trie) []func(key []byte) *memorydb.Database {
  35. var provers []func(key []byte) *memorydb.Database
  36. // Create a direct trie based Merkle prover
  37. provers = append(provers, func(key []byte) *memorydb.Database {
  38. proof := memorydb.New()
  39. trie.Prove(key, 0, proof)
  40. return proof
  41. })
  42. // Create a leaf iterator based Merkle prover
  43. provers = append(provers, func(key []byte) *memorydb.Database {
  44. proof := memorydb.New()
  45. if it := NewIterator(trie.NodeIterator(key)); it.Next() && bytes.Equal(key, it.Key) {
  46. for _, p := range it.Prove() {
  47. proof.Put(crypto.Keccak256(p), p)
  48. }
  49. }
  50. return proof
  51. })
  52. return provers
  53. }
  54. func TestProof(t *testing.T) {
  55. trie, vals := randomTrie(500)
  56. root := trie.Hash()
  57. for i, prover := range makeProvers(trie) {
  58. for _, kv := range vals {
  59. proof := prover(kv.k)
  60. if proof == nil {
  61. t.Fatalf("prover %d: missing key %x while constructing proof", i, kv.k)
  62. }
  63. val, err := VerifyProof(root, kv.k, proof)
  64. if err != nil {
  65. t.Fatalf("prover %d: failed to verify proof for key %x: %v\nraw proof: %x", i, kv.k, err, proof)
  66. }
  67. if !bytes.Equal(val, kv.v) {
  68. t.Fatalf("prover %d: verified value mismatch for key %x: have %x, want %x", i, kv.k, val, kv.v)
  69. }
  70. }
  71. }
  72. }
  73. func TestOneElementProof(t *testing.T) {
  74. trie := new(Trie)
  75. updateString(trie, "k", "v")
  76. for i, prover := range makeProvers(trie) {
  77. proof := prover([]byte("k"))
  78. if proof == nil {
  79. t.Fatalf("prover %d: nil proof", i)
  80. }
  81. if proof.Len() != 1 {
  82. t.Errorf("prover %d: proof should have one element", i)
  83. }
  84. val, err := VerifyProof(trie.Hash(), []byte("k"), proof)
  85. if err != nil {
  86. t.Fatalf("prover %d: failed to verify proof: %v\nraw proof: %x", i, err, proof)
  87. }
  88. if !bytes.Equal(val, []byte("v")) {
  89. t.Fatalf("prover %d: verified value mismatch: have %x, want 'k'", i, val)
  90. }
  91. }
  92. }
  93. func TestBadProof(t *testing.T) {
  94. trie, vals := randomTrie(800)
  95. root := trie.Hash()
  96. for i, prover := range makeProvers(trie) {
  97. for _, kv := range vals {
  98. proof := prover(kv.k)
  99. if proof == nil {
  100. t.Fatalf("prover %d: nil proof", i)
  101. }
  102. it := proof.NewIterator(nil, nil)
  103. for i, d := 0, mrand.Intn(proof.Len()); i <= d; i++ {
  104. it.Next()
  105. }
  106. key := it.Key()
  107. val, _ := proof.Get(key)
  108. proof.Delete(key)
  109. it.Release()
  110. mutateByte(val)
  111. proof.Put(crypto.Keccak256(val), val)
  112. if _, err := VerifyProof(root, kv.k, proof); err == nil {
  113. t.Fatalf("prover %d: expected proof to fail for key %x", i, kv.k)
  114. }
  115. }
  116. }
  117. }
  118. // Tests that missing keys can also be proven. The test explicitly uses a single
  119. // entry trie and checks for missing keys both before and after the single entry.
  120. func TestMissingKeyProof(t *testing.T) {
  121. trie := new(Trie)
  122. updateString(trie, "k", "v")
  123. for i, key := range []string{"a", "j", "l", "z"} {
  124. proof := memorydb.New()
  125. trie.Prove([]byte(key), 0, proof)
  126. if proof.Len() != 1 {
  127. t.Errorf("test %d: proof should have one element", i)
  128. }
  129. val, err := VerifyProof(trie.Hash(), []byte(key), proof)
  130. if err != nil {
  131. t.Fatalf("test %d: failed to verify proof: %v\nraw proof: %x", i, err, proof)
  132. }
  133. if val != nil {
  134. t.Fatalf("test %d: verified value mismatch: have %x, want nil", i, val)
  135. }
  136. }
  137. }
  138. type entrySlice []*kv
  139. func (p entrySlice) Len() int { return len(p) }
  140. func (p entrySlice) Less(i, j int) bool { return bytes.Compare(p[i].k, p[j].k) < 0 }
  141. func (p entrySlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
  142. // TestRangeProof tests normal range proof with both edge proofs
  143. // as the existent proof. The test cases are generated randomly.
  144. func TestRangeProof(t *testing.T) {
  145. trie, vals := randomTrie(4096)
  146. var entries entrySlice
  147. for _, kv := range vals {
  148. entries = append(entries, kv)
  149. }
  150. sort.Sort(entries)
  151. for i := 0; i < 500; i++ {
  152. start := mrand.Intn(len(entries))
  153. end := mrand.Intn(len(entries)-start) + start + 1
  154. proof := memorydb.New()
  155. if err := trie.Prove(entries[start].k, 0, proof); err != nil {
  156. t.Fatalf("Failed to prove the first node %v", err)
  157. }
  158. if err := trie.Prove(entries[end-1].k, 0, proof); err != nil {
  159. t.Fatalf("Failed to prove the last node %v", err)
  160. }
  161. var keys [][]byte
  162. var vals [][]byte
  163. for i := start; i < end; i++ {
  164. keys = append(keys, entries[i].k)
  165. vals = append(vals, entries[i].v)
  166. }
  167. _, err := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, vals, proof)
  168. if err != nil {
  169. t.Fatalf("Case %d(%d->%d) expect no error, got %v", i, start, end-1, err)
  170. }
  171. }
  172. }
  173. // TestRangeProof tests normal range proof with two non-existent proofs.
  174. // The test cases are generated randomly.
  175. func TestRangeProofWithNonExistentProof(t *testing.T) {
  176. trie, vals := randomTrie(4096)
  177. var entries entrySlice
  178. for _, kv := range vals {
  179. entries = append(entries, kv)
  180. }
  181. sort.Sort(entries)
  182. for i := 0; i < 500; i++ {
  183. start := mrand.Intn(len(entries))
  184. end := mrand.Intn(len(entries)-start) + start + 1
  185. proof := memorydb.New()
  186. // Short circuit if the decreased key is same with the previous key
  187. first := decreseKey(common.CopyBytes(entries[start].k))
  188. if start != 0 && bytes.Equal(first, entries[start-1].k) {
  189. continue
  190. }
  191. // Short circuit if the decreased key is underflow
  192. if bytes.Compare(first, entries[start].k) > 0 {
  193. continue
  194. }
  195. // Short circuit if the increased key is same with the next key
  196. last := increseKey(common.CopyBytes(entries[end-1].k))
  197. if end != len(entries) && bytes.Equal(last, entries[end].k) {
  198. continue
  199. }
  200. // Short circuit if the increased key is overflow
  201. if bytes.Compare(last, entries[end-1].k) < 0 {
  202. continue
  203. }
  204. if err := trie.Prove(first, 0, proof); err != nil {
  205. t.Fatalf("Failed to prove the first node %v", err)
  206. }
  207. if err := trie.Prove(last, 0, proof); err != nil {
  208. t.Fatalf("Failed to prove the last node %v", err)
  209. }
  210. var keys [][]byte
  211. var vals [][]byte
  212. for i := start; i < end; i++ {
  213. keys = append(keys, entries[i].k)
  214. vals = append(vals, entries[i].v)
  215. }
  216. _, err := VerifyRangeProof(trie.Hash(), first, last, keys, vals, proof)
  217. if err != nil {
  218. t.Fatalf("Case %d(%d->%d) expect no error, got %v", i, start, end-1, err)
  219. }
  220. }
  221. // Special case, two edge proofs for two edge key.
  222. proof := memorydb.New()
  223. first := common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000").Bytes()
  224. last := common.HexToHash("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").Bytes()
  225. if err := trie.Prove(first, 0, proof); err != nil {
  226. t.Fatalf("Failed to prove the first node %v", err)
  227. }
  228. if err := trie.Prove(last, 0, proof); err != nil {
  229. t.Fatalf("Failed to prove the last node %v", err)
  230. }
  231. var k [][]byte
  232. var v [][]byte
  233. for i := 0; i < len(entries); i++ {
  234. k = append(k, entries[i].k)
  235. v = append(v, entries[i].v)
  236. }
  237. _, err := VerifyRangeProof(trie.Hash(), first, last, k, v, proof)
  238. if err != nil {
  239. t.Fatal("Failed to verify whole rang with non-existent edges")
  240. }
  241. }
  242. // TestRangeProofWithInvalidNonExistentProof tests such scenarios:
  243. // - There exists a gap between the first element and the left edge proof
  244. // - There exists a gap between the last element and the right edge proof
  245. func TestRangeProofWithInvalidNonExistentProof(t *testing.T) {
  246. trie, vals := randomTrie(4096)
  247. var entries entrySlice
  248. for _, kv := range vals {
  249. entries = append(entries, kv)
  250. }
  251. sort.Sort(entries)
  252. // Case 1
  253. start, end := 100, 200
  254. first := decreseKey(common.CopyBytes(entries[start].k))
  255. proof := memorydb.New()
  256. if err := trie.Prove(first, 0, proof); err != nil {
  257. t.Fatalf("Failed to prove the first node %v", err)
  258. }
  259. if err := trie.Prove(entries[end-1].k, 0, proof); err != nil {
  260. t.Fatalf("Failed to prove the last node %v", err)
  261. }
  262. start = 105 // Gap created
  263. k := make([][]byte, 0)
  264. v := make([][]byte, 0)
  265. for i := start; i < end; i++ {
  266. k = append(k, entries[i].k)
  267. v = append(v, entries[i].v)
  268. }
  269. _, err := VerifyRangeProof(trie.Hash(), first, k[len(k)-1], k, v, proof)
  270. if err == nil {
  271. t.Fatalf("Expected to detect the error, got nil")
  272. }
  273. // Case 2
  274. start, end = 100, 200
  275. last := increseKey(common.CopyBytes(entries[end-1].k))
  276. proof = memorydb.New()
  277. if err := trie.Prove(entries[start].k, 0, proof); err != nil {
  278. t.Fatalf("Failed to prove the first node %v", err)
  279. }
  280. if err := trie.Prove(last, 0, proof); err != nil {
  281. t.Fatalf("Failed to prove the last node %v", err)
  282. }
  283. end = 195 // Capped slice
  284. k = make([][]byte, 0)
  285. v = make([][]byte, 0)
  286. for i := start; i < end; i++ {
  287. k = append(k, entries[i].k)
  288. v = append(v, entries[i].v)
  289. }
  290. _, err = VerifyRangeProof(trie.Hash(), k[0], last, k, v, proof)
  291. if err == nil {
  292. t.Fatalf("Expected to detect the error, got nil")
  293. }
  294. }
  295. // TestOneElementRangeProof tests the proof with only one
  296. // element. The first edge proof can be existent one or
  297. // non-existent one.
  298. func TestOneElementRangeProof(t *testing.T) {
  299. trie, vals := randomTrie(4096)
  300. var entries entrySlice
  301. for _, kv := range vals {
  302. entries = append(entries, kv)
  303. }
  304. sort.Sort(entries)
  305. // One element with existent edge proof, both edge proofs
  306. // point to the SAME key.
  307. start := 1000
  308. proof := memorydb.New()
  309. if err := trie.Prove(entries[start].k, 0, proof); err != nil {
  310. t.Fatalf("Failed to prove the first node %v", err)
  311. }
  312. _, err := VerifyRangeProof(trie.Hash(), entries[start].k, entries[start].k, [][]byte{entries[start].k}, [][]byte{entries[start].v}, proof)
  313. if err != nil {
  314. t.Fatalf("Expected no error, got %v", err)
  315. }
  316. // One element with left non-existent edge proof
  317. start = 1000
  318. first := decreseKey(common.CopyBytes(entries[start].k))
  319. proof = memorydb.New()
  320. if err := trie.Prove(first, 0, proof); err != nil {
  321. t.Fatalf("Failed to prove the first node %v", err)
  322. }
  323. if err := trie.Prove(entries[start].k, 0, proof); err != nil {
  324. t.Fatalf("Failed to prove the last node %v", err)
  325. }
  326. _, err = VerifyRangeProof(trie.Hash(), first, entries[start].k, [][]byte{entries[start].k}, [][]byte{entries[start].v}, proof)
  327. if err != nil {
  328. t.Fatalf("Expected no error, got %v", err)
  329. }
  330. // One element with right non-existent edge proof
  331. start = 1000
  332. last := increseKey(common.CopyBytes(entries[start].k))
  333. proof = memorydb.New()
  334. if err := trie.Prove(entries[start].k, 0, proof); err != nil {
  335. t.Fatalf("Failed to prove the first node %v", err)
  336. }
  337. if err := trie.Prove(last, 0, proof); err != nil {
  338. t.Fatalf("Failed to prove the last node %v", err)
  339. }
  340. _, err = VerifyRangeProof(trie.Hash(), entries[start].k, last, [][]byte{entries[start].k}, [][]byte{entries[start].v}, proof)
  341. if err != nil {
  342. t.Fatalf("Expected no error, got %v", err)
  343. }
  344. // One element with two non-existent edge proofs
  345. start = 1000
  346. first, last = decreseKey(common.CopyBytes(entries[start].k)), increseKey(common.CopyBytes(entries[start].k))
  347. proof = memorydb.New()
  348. if err := trie.Prove(first, 0, proof); err != nil {
  349. t.Fatalf("Failed to prove the first node %v", err)
  350. }
  351. if err := trie.Prove(last, 0, proof); err != nil {
  352. t.Fatalf("Failed to prove the last node %v", err)
  353. }
  354. _, err = VerifyRangeProof(trie.Hash(), first, last, [][]byte{entries[start].k}, [][]byte{entries[start].v}, proof)
  355. if err != nil {
  356. t.Fatalf("Expected no error, got %v", err)
  357. }
  358. // Test the mini trie with only a single element.
  359. tinyTrie := new(Trie)
  360. entry := &kv{randBytes(32), randBytes(20), false}
  361. tinyTrie.Update(entry.k, entry.v)
  362. first = common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000").Bytes()
  363. last = entry.k
  364. proof = memorydb.New()
  365. if err := tinyTrie.Prove(first, 0, proof); err != nil {
  366. t.Fatalf("Failed to prove the first node %v", err)
  367. }
  368. if err := tinyTrie.Prove(last, 0, proof); err != nil {
  369. t.Fatalf("Failed to prove the last node %v", err)
  370. }
  371. _, err = VerifyRangeProof(tinyTrie.Hash(), first, last, [][]byte{entry.k}, [][]byte{entry.v}, proof)
  372. if err != nil {
  373. t.Fatalf("Expected no error, got %v", err)
  374. }
  375. }
  376. // TestAllElementsProof tests the range proof with all elements.
  377. // The edge proofs can be nil.
  378. func TestAllElementsProof(t *testing.T) {
  379. trie, vals := randomTrie(4096)
  380. var entries entrySlice
  381. for _, kv := range vals {
  382. entries = append(entries, kv)
  383. }
  384. sort.Sort(entries)
  385. var k [][]byte
  386. var v [][]byte
  387. for i := 0; i < len(entries); i++ {
  388. k = append(k, entries[i].k)
  389. v = append(v, entries[i].v)
  390. }
  391. _, err := VerifyRangeProof(trie.Hash(), nil, nil, k, v, nil)
  392. if err != nil {
  393. t.Fatalf("Expected no error, got %v", err)
  394. }
  395. // With edge proofs, it should still work.
  396. proof := memorydb.New()
  397. if err := trie.Prove(entries[0].k, 0, proof); err != nil {
  398. t.Fatalf("Failed to prove the first node %v", err)
  399. }
  400. if err := trie.Prove(entries[len(entries)-1].k, 0, proof); err != nil {
  401. t.Fatalf("Failed to prove the last node %v", err)
  402. }
  403. _, err = VerifyRangeProof(trie.Hash(), k[0], k[len(k)-1], k, v, proof)
  404. if err != nil {
  405. t.Fatalf("Expected no error, got %v", err)
  406. }
  407. // Even with non-existent edge proofs, it should still work.
  408. proof = memorydb.New()
  409. first := common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000").Bytes()
  410. last := common.HexToHash("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").Bytes()
  411. if err := trie.Prove(first, 0, proof); err != nil {
  412. t.Fatalf("Failed to prove the first node %v", err)
  413. }
  414. if err := trie.Prove(last, 0, proof); err != nil {
  415. t.Fatalf("Failed to prove the last node %v", err)
  416. }
  417. _, err = VerifyRangeProof(trie.Hash(), first, last, k, v, proof)
  418. if err != nil {
  419. t.Fatalf("Expected no error, got %v", err)
  420. }
  421. }
  422. // TestSingleSideRangeProof tests the range starts from zero.
  423. func TestSingleSideRangeProof(t *testing.T) {
  424. for i := 0; i < 64; i++ {
  425. trie := new(Trie)
  426. var entries entrySlice
  427. for i := 0; i < 4096; i++ {
  428. value := &kv{randBytes(32), randBytes(20), false}
  429. trie.Update(value.k, value.v)
  430. entries = append(entries, value)
  431. }
  432. sort.Sort(entries)
  433. var cases = []int{0, 1, 50, 100, 1000, 2000, len(entries) - 1}
  434. for _, pos := range cases {
  435. proof := memorydb.New()
  436. if err := trie.Prove(common.Hash{}.Bytes(), 0, proof); err != nil {
  437. t.Fatalf("Failed to prove the first node %v", err)
  438. }
  439. if err := trie.Prove(entries[pos].k, 0, proof); err != nil {
  440. t.Fatalf("Failed to prove the first node %v", err)
  441. }
  442. k := make([][]byte, 0)
  443. v := make([][]byte, 0)
  444. for i := 0; i <= pos; i++ {
  445. k = append(k, entries[i].k)
  446. v = append(v, entries[i].v)
  447. }
  448. _, err := VerifyRangeProof(trie.Hash(), common.Hash{}.Bytes(), k[len(k)-1], k, v, proof)
  449. if err != nil {
  450. t.Fatalf("Expected no error, got %v", err)
  451. }
  452. }
  453. }
  454. }
  455. // TestReverseSingleSideRangeProof tests the range ends with 0xffff...fff.
  456. func TestReverseSingleSideRangeProof(t *testing.T) {
  457. for i := 0; i < 64; i++ {
  458. trie := new(Trie)
  459. var entries entrySlice
  460. for i := 0; i < 4096; i++ {
  461. value := &kv{randBytes(32), randBytes(20), false}
  462. trie.Update(value.k, value.v)
  463. entries = append(entries, value)
  464. }
  465. sort.Sort(entries)
  466. var cases = []int{0, 1, 50, 100, 1000, 2000, len(entries) - 1}
  467. for _, pos := range cases {
  468. proof := memorydb.New()
  469. if err := trie.Prove(entries[pos].k, 0, proof); err != nil {
  470. t.Fatalf("Failed to prove the first node %v", err)
  471. }
  472. last := common.HexToHash("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")
  473. if err := trie.Prove(last.Bytes(), 0, proof); err != nil {
  474. t.Fatalf("Failed to prove the last node %v", err)
  475. }
  476. k := make([][]byte, 0)
  477. v := make([][]byte, 0)
  478. for i := pos; i < len(entries); i++ {
  479. k = append(k, entries[i].k)
  480. v = append(v, entries[i].v)
  481. }
  482. _, err := VerifyRangeProof(trie.Hash(), k[0], last.Bytes(), k, v, proof)
  483. if err != nil {
  484. t.Fatalf("Expected no error, got %v", err)
  485. }
  486. }
  487. }
  488. }
  489. // TestBadRangeProof tests a few cases which the proof is wrong.
  490. // The prover is expected to detect the error.
  491. func TestBadRangeProof(t *testing.T) {
  492. trie, vals := randomTrie(4096)
  493. var entries entrySlice
  494. for _, kv := range vals {
  495. entries = append(entries, kv)
  496. }
  497. sort.Sort(entries)
  498. for i := 0; i < 500; i++ {
  499. start := mrand.Intn(len(entries))
  500. end := mrand.Intn(len(entries)-start) + start + 1
  501. proof := memorydb.New()
  502. if err := trie.Prove(entries[start].k, 0, proof); err != nil {
  503. t.Fatalf("Failed to prove the first node %v", err)
  504. }
  505. if err := trie.Prove(entries[end-1].k, 0, proof); err != nil {
  506. t.Fatalf("Failed to prove the last node %v", err)
  507. }
  508. var keys [][]byte
  509. var vals [][]byte
  510. for i := start; i < end; i++ {
  511. keys = append(keys, entries[i].k)
  512. vals = append(vals, entries[i].v)
  513. }
  514. var first, last = keys[0], keys[len(keys)-1]
  515. testcase := mrand.Intn(6)
  516. var index int
  517. switch testcase {
  518. case 0:
  519. // Modified key
  520. index = mrand.Intn(end - start)
  521. keys[index] = randBytes(32) // In theory it can't be same
  522. case 1:
  523. // Modified val
  524. index = mrand.Intn(end - start)
  525. vals[index] = randBytes(20) // In theory it can't be same
  526. case 2:
  527. // Gapped entry slice
  528. index = mrand.Intn(end - start)
  529. if (index == 0 && start < 100) || (index == end-start-1 && end <= 100) {
  530. continue
  531. }
  532. keys = append(keys[:index], keys[index+1:]...)
  533. vals = append(vals[:index], vals[index+1:]...)
  534. case 3:
  535. // Out of order
  536. index1 := mrand.Intn(end - start)
  537. index2 := mrand.Intn(end - start)
  538. if index1 == index2 {
  539. continue
  540. }
  541. keys[index1], keys[index2] = keys[index2], keys[index1]
  542. vals[index1], vals[index2] = vals[index2], vals[index1]
  543. case 4:
  544. // Set random key to nil, do nothing
  545. index = mrand.Intn(end - start)
  546. keys[index] = nil
  547. case 5:
  548. // Set random value to nil, deletion
  549. index = mrand.Intn(end - start)
  550. vals[index] = nil
  551. }
  552. _, err := VerifyRangeProof(trie.Hash(), first, last, keys, vals, proof)
  553. if err == nil {
  554. t.Fatalf("%d Case %d index %d range: (%d->%d) expect error, got nil", i, testcase, index, start, end-1)
  555. }
  556. }
  557. }
  558. // TestGappedRangeProof focuses on the small trie with embedded nodes.
  559. // If the gapped node is embedded in the trie, it should be detected too.
  560. func TestGappedRangeProof(t *testing.T) {
  561. trie := new(Trie)
  562. var entries []*kv // Sorted entries
  563. for i := byte(0); i < 10; i++ {
  564. value := &kv{common.LeftPadBytes([]byte{i}, 32), []byte{i}, false}
  565. trie.Update(value.k, value.v)
  566. entries = append(entries, value)
  567. }
  568. first, last := 2, 8
  569. proof := memorydb.New()
  570. if err := trie.Prove(entries[first].k, 0, proof); err != nil {
  571. t.Fatalf("Failed to prove the first node %v", err)
  572. }
  573. if err := trie.Prove(entries[last-1].k, 0, proof); err != nil {
  574. t.Fatalf("Failed to prove the last node %v", err)
  575. }
  576. var keys [][]byte
  577. var vals [][]byte
  578. for i := first; i < last; i++ {
  579. if i == (first+last)/2 {
  580. continue
  581. }
  582. keys = append(keys, entries[i].k)
  583. vals = append(vals, entries[i].v)
  584. }
  585. _, err := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, vals, proof)
  586. if err == nil {
  587. t.Fatal("expect error, got nil")
  588. }
  589. }
  590. // TestSameSideProofs tests the element is not in the range covered by proofs
  591. func TestSameSideProofs(t *testing.T) {
  592. trie, vals := randomTrie(4096)
  593. var entries entrySlice
  594. for _, kv := range vals {
  595. entries = append(entries, kv)
  596. }
  597. sort.Sort(entries)
  598. pos := 1000
  599. first := decreseKey(common.CopyBytes(entries[pos].k))
  600. first = decreseKey(first)
  601. last := decreseKey(common.CopyBytes(entries[pos].k))
  602. proof := memorydb.New()
  603. if err := trie.Prove(first, 0, proof); err != nil {
  604. t.Fatalf("Failed to prove the first node %v", err)
  605. }
  606. if err := trie.Prove(last, 0, proof); err != nil {
  607. t.Fatalf("Failed to prove the last node %v", err)
  608. }
  609. _, err := VerifyRangeProof(trie.Hash(), first, last, [][]byte{entries[pos].k}, [][]byte{entries[pos].v}, proof)
  610. if err == nil {
  611. t.Fatalf("Expected error, got nil")
  612. }
  613. first = increseKey(common.CopyBytes(entries[pos].k))
  614. last = increseKey(common.CopyBytes(entries[pos].k))
  615. last = increseKey(last)
  616. proof = memorydb.New()
  617. if err := trie.Prove(first, 0, proof); err != nil {
  618. t.Fatalf("Failed to prove the first node %v", err)
  619. }
  620. if err := trie.Prove(last, 0, proof); err != nil {
  621. t.Fatalf("Failed to prove the last node %v", err)
  622. }
  623. _, err = VerifyRangeProof(trie.Hash(), first, last, [][]byte{entries[pos].k}, [][]byte{entries[pos].v}, proof)
  624. if err == nil {
  625. t.Fatalf("Expected error, got nil")
  626. }
  627. }
  628. func TestHasRightElement(t *testing.T) {
  629. trie := new(Trie)
  630. var entries entrySlice
  631. for i := 0; i < 4096; i++ {
  632. value := &kv{randBytes(32), randBytes(20), false}
  633. trie.Update(value.k, value.v)
  634. entries = append(entries, value)
  635. }
  636. sort.Sort(entries)
  637. var cases = []struct {
  638. start int
  639. end int
  640. hasMore bool
  641. }{
  642. {-1, 1, true}, // single element with non-existent left proof
  643. {0, 1, true}, // single element with existent left proof
  644. {0, 10, true},
  645. {50, 100, true},
  646. {50, len(entries), false}, // No more element expected
  647. {len(entries) - 1, len(entries), false}, // Single last element with two existent proofs(point to same key)
  648. {len(entries) - 1, -1, false}, // Single last element with non-existent right proof
  649. {0, len(entries), false}, // The whole set with existent left proof
  650. {-1, len(entries), false}, // The whole set with non-existent left proof
  651. {-1, -1, false}, // The whole set with non-existent left/right proof
  652. }
  653. for _, c := range cases {
  654. var (
  655. firstKey []byte
  656. lastKey []byte
  657. start = c.start
  658. end = c.end
  659. proof = memorydb.New()
  660. )
  661. if c.start == -1 {
  662. firstKey, start = common.Hash{}.Bytes(), 0
  663. if err := trie.Prove(firstKey, 0, proof); err != nil {
  664. t.Fatalf("Failed to prove the first node %v", err)
  665. }
  666. } else {
  667. firstKey = entries[c.start].k
  668. if err := trie.Prove(entries[c.start].k, 0, proof); err != nil {
  669. t.Fatalf("Failed to prove the first node %v", err)
  670. }
  671. }
  672. if c.end == -1 {
  673. lastKey, end = common.HexToHash("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").Bytes(), len(entries)
  674. if err := trie.Prove(lastKey, 0, proof); err != nil {
  675. t.Fatalf("Failed to prove the first node %v", err)
  676. }
  677. } else {
  678. lastKey = entries[c.end-1].k
  679. if err := trie.Prove(entries[c.end-1].k, 0, proof); err != nil {
  680. t.Fatalf("Failed to prove the first node %v", err)
  681. }
  682. }
  683. k := make([][]byte, 0)
  684. v := make([][]byte, 0)
  685. for i := start; i < end; i++ {
  686. k = append(k, entries[i].k)
  687. v = append(v, entries[i].v)
  688. }
  689. hasMore, err := VerifyRangeProof(trie.Hash(), firstKey, lastKey, k, v, proof)
  690. if err != nil {
  691. t.Fatalf("Expected no error, got %v", err)
  692. }
  693. if hasMore != c.hasMore {
  694. t.Fatalf("Wrong hasMore indicator, want %t, got %t", c.hasMore, hasMore)
  695. }
  696. }
  697. }
  698. // TestEmptyRangeProof tests the range proof with "no" element.
  699. // The first edge proof must be a non-existent proof.
  700. func TestEmptyRangeProof(t *testing.T) {
  701. trie, vals := randomTrie(4096)
  702. var entries entrySlice
  703. for _, kv := range vals {
  704. entries = append(entries, kv)
  705. }
  706. sort.Sort(entries)
  707. var cases = []struct {
  708. pos int
  709. err bool
  710. }{
  711. {len(entries) - 1, false},
  712. {500, true},
  713. }
  714. for _, c := range cases {
  715. proof := memorydb.New()
  716. first := increseKey(common.CopyBytes(entries[c.pos].k))
  717. if err := trie.Prove(first, 0, proof); err != nil {
  718. t.Fatalf("Failed to prove the first node %v", err)
  719. }
  720. _, err := VerifyRangeProof(trie.Hash(), first, nil, nil, nil, proof)
  721. if c.err && err == nil {
  722. t.Fatalf("Expected error, got nil")
  723. }
  724. if !c.err && err != nil {
  725. t.Fatalf("Expected no error, got %v", err)
  726. }
  727. }
  728. }
  729. // TestBloatedProof tests a malicious proof, where the proof is more or less the
  730. // whole trie. Previously we didn't accept such packets, but the new APIs do, so
  731. // lets leave this test as a bit weird, but present.
  732. func TestBloatedProof(t *testing.T) {
  733. // Use a small trie
  734. trie, kvs := nonRandomTrie(100)
  735. var entries entrySlice
  736. for _, kv := range kvs {
  737. entries = append(entries, kv)
  738. }
  739. sort.Sort(entries)
  740. var keys [][]byte
  741. var vals [][]byte
  742. proof := memorydb.New()
  743. // In the 'malicious' case, we add proofs for every single item
  744. // (but only one key/value pair used as leaf)
  745. for i, entry := range entries {
  746. trie.Prove(entry.k, 0, proof)
  747. if i == 50 {
  748. keys = append(keys, entry.k)
  749. vals = append(vals, entry.v)
  750. }
  751. }
  752. // For reference, we use the same function, but _only_ prove the first
  753. // and last element
  754. want := memorydb.New()
  755. trie.Prove(keys[0], 0, want)
  756. trie.Prove(keys[len(keys)-1], 0, want)
  757. if _, err := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, vals, proof); err != nil {
  758. t.Fatalf("expected bloated proof to succeed, got %v", err)
  759. }
  760. }
  761. // mutateByte changes one byte in b.
  762. func mutateByte(b []byte) {
  763. for r := mrand.Intn(len(b)); ; {
  764. new := byte(mrand.Intn(255))
  765. if new != b[r] {
  766. b[r] = new
  767. break
  768. }
  769. }
  770. }
  771. func increseKey(key []byte) []byte {
  772. for i := len(key) - 1; i >= 0; i-- {
  773. key[i]++
  774. if key[i] != 0x0 {
  775. break
  776. }
  777. }
  778. return key
  779. }
  780. func decreseKey(key []byte) []byte {
  781. for i := len(key) - 1; i >= 0; i-- {
  782. key[i]--
  783. if key[i] != 0xff {
  784. break
  785. }
  786. }
  787. return key
  788. }
  789. func BenchmarkProve(b *testing.B) {
  790. trie, vals := randomTrie(100)
  791. var keys []string
  792. for k := range vals {
  793. keys = append(keys, k)
  794. }
  795. b.ResetTimer()
  796. for i := 0; i < b.N; i++ {
  797. kv := vals[keys[i%len(keys)]]
  798. proofs := memorydb.New()
  799. if trie.Prove(kv.k, 0, proofs); proofs.Len() == 0 {
  800. b.Fatalf("zero length proof for %x", kv.k)
  801. }
  802. }
  803. }
  804. func BenchmarkVerifyProof(b *testing.B) {
  805. trie, vals := randomTrie(100)
  806. root := trie.Hash()
  807. var keys []string
  808. var proofs []*memorydb.Database
  809. for k := range vals {
  810. keys = append(keys, k)
  811. proof := memorydb.New()
  812. trie.Prove([]byte(k), 0, proof)
  813. proofs = append(proofs, proof)
  814. }
  815. b.ResetTimer()
  816. for i := 0; i < b.N; i++ {
  817. im := i % len(keys)
  818. if _, err := VerifyProof(root, []byte(keys[im]), proofs[im]); err != nil {
  819. b.Fatalf("key %x: %v", keys[im], err)
  820. }
  821. }
  822. }
  823. func BenchmarkVerifyRangeProof10(b *testing.B) { benchmarkVerifyRangeProof(b, 10) }
  824. func BenchmarkVerifyRangeProof100(b *testing.B) { benchmarkVerifyRangeProof(b, 100) }
  825. func BenchmarkVerifyRangeProof1000(b *testing.B) { benchmarkVerifyRangeProof(b, 1000) }
  826. func BenchmarkVerifyRangeProof5000(b *testing.B) { benchmarkVerifyRangeProof(b, 5000) }
  827. func benchmarkVerifyRangeProof(b *testing.B, size int) {
  828. trie, vals := randomTrie(8192)
  829. var entries entrySlice
  830. for _, kv := range vals {
  831. entries = append(entries, kv)
  832. }
  833. sort.Sort(entries)
  834. start := 2
  835. end := start + size
  836. proof := memorydb.New()
  837. if err := trie.Prove(entries[start].k, 0, proof); err != nil {
  838. b.Fatalf("Failed to prove the first node %v", err)
  839. }
  840. if err := trie.Prove(entries[end-1].k, 0, proof); err != nil {
  841. b.Fatalf("Failed to prove the last node %v", err)
  842. }
  843. var keys [][]byte
  844. var values [][]byte
  845. for i := start; i < end; i++ {
  846. keys = append(keys, entries[i].k)
  847. values = append(values, entries[i].v)
  848. }
  849. b.ResetTimer()
  850. for i := 0; i < b.N; i++ {
  851. _, err := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, values, proof)
  852. if err != nil {
  853. b.Fatalf("Case %d(%d->%d) expect no error, got %v", i, start, end-1, err)
  854. }
  855. }
  856. }
  857. func BenchmarkVerifyRangeNoProof10(b *testing.B) { benchmarkVerifyRangeNoProof(b, 100) }
  858. func BenchmarkVerifyRangeNoProof500(b *testing.B) { benchmarkVerifyRangeNoProof(b, 500) }
  859. func BenchmarkVerifyRangeNoProof1000(b *testing.B) { benchmarkVerifyRangeNoProof(b, 1000) }
  860. func benchmarkVerifyRangeNoProof(b *testing.B, size int) {
  861. trie, vals := randomTrie(size)
  862. var entries entrySlice
  863. for _, kv := range vals {
  864. entries = append(entries, kv)
  865. }
  866. sort.Sort(entries)
  867. var keys [][]byte
  868. var values [][]byte
  869. for _, entry := range entries {
  870. keys = append(keys, entry.k)
  871. values = append(values, entry.v)
  872. }
  873. b.ResetTimer()
  874. for i := 0; i < b.N; i++ {
  875. _, err := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, values, nil)
  876. if err != nil {
  877. b.Fatalf("Expected no error, got %v", err)
  878. }
  879. }
  880. }
  881. func randomTrie(n int) (*Trie, map[string]*kv) {
  882. trie := new(Trie)
  883. vals := make(map[string]*kv)
  884. for i := byte(0); i < 100; i++ {
  885. value := &kv{common.LeftPadBytes([]byte{i}, 32), []byte{i}, false}
  886. value2 := &kv{common.LeftPadBytes([]byte{i + 10}, 32), []byte{i}, false}
  887. trie.Update(value.k, value.v)
  888. trie.Update(value2.k, value2.v)
  889. vals[string(value.k)] = value
  890. vals[string(value2.k)] = value2
  891. }
  892. for i := 0; i < n; i++ {
  893. value := &kv{randBytes(32), randBytes(20), false}
  894. trie.Update(value.k, value.v)
  895. vals[string(value.k)] = value
  896. }
  897. return trie, vals
  898. }
  899. func randBytes(n int) []byte {
  900. r := make([]byte, n)
  901. crand.Read(r)
  902. return r
  903. }
  904. func nonRandomTrie(n int) (*Trie, map[string]*kv) {
  905. trie := new(Trie)
  906. vals := make(map[string]*kv)
  907. max := uint64(0xffffffffffffffff)
  908. for i := uint64(0); i < uint64(n); i++ {
  909. value := make([]byte, 32)
  910. key := make([]byte, 32)
  911. binary.LittleEndian.PutUint64(key, i)
  912. binary.LittleEndian.PutUint64(value, i-max)
  913. //value := &kv{common.LeftPadBytes([]byte{i}, 32), []byte{i}, false}
  914. elem := &kv{key, value, false}
  915. trie.Update(elem.k, elem.v)
  916. vals[string(elem.k)] = elem
  917. }
  918. return trie, vals
  919. }