proof_test.go 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069
  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. // TestEmptyValueRangeProof tests normal range proof with both edge proofs
  762. // as the existent proof, but with an extra empty value included, which is a
  763. // noop technically, but practically should be rejected.
  764. func TestEmptyValueRangeProof(t *testing.T) {
  765. trie, values := randomTrie(512)
  766. var entries entrySlice
  767. for _, kv := range values {
  768. entries = append(entries, kv)
  769. }
  770. sort.Sort(entries)
  771. // Create a new entry with a slightly modified key
  772. mid := len(entries) / 2
  773. key := common.CopyBytes(entries[mid-1].k)
  774. for n := len(key) - 1; n >= 0; n-- {
  775. if key[n] < 0xff {
  776. key[n]++
  777. break
  778. }
  779. }
  780. noop := &kv{key, []byte{}, false}
  781. entries = append(append(append([]*kv{}, entries[:mid]...), noop), entries[mid:]...)
  782. start, end := 1, len(entries)-1
  783. proof := memorydb.New()
  784. if err := trie.Prove(entries[start].k, 0, proof); err != nil {
  785. t.Fatalf("Failed to prove the first node %v", err)
  786. }
  787. if err := trie.Prove(entries[end-1].k, 0, proof); err != nil {
  788. t.Fatalf("Failed to prove the last node %v", err)
  789. }
  790. var keys [][]byte
  791. var vals [][]byte
  792. for i := start; i < end; i++ {
  793. keys = append(keys, entries[i].k)
  794. vals = append(vals, entries[i].v)
  795. }
  796. _, err := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, vals, proof)
  797. if err == nil {
  798. t.Fatalf("Expected failure on noop entry")
  799. }
  800. }
  801. // TestAllElementsEmptyValueRangeProof tests the range proof with all elements,
  802. // but with an extra empty value included, which is a noop technically, but
  803. // practically should be rejected.
  804. func TestAllElementsEmptyValueRangeProof(t *testing.T) {
  805. trie, values := randomTrie(512)
  806. var entries entrySlice
  807. for _, kv := range values {
  808. entries = append(entries, kv)
  809. }
  810. sort.Sort(entries)
  811. // Create a new entry with a slightly modified key
  812. mid := len(entries) / 2
  813. key := common.CopyBytes(entries[mid-1].k)
  814. for n := len(key) - 1; n >= 0; n-- {
  815. if key[n] < 0xff {
  816. key[n]++
  817. break
  818. }
  819. }
  820. noop := &kv{key, []byte{}, false}
  821. entries = append(append(append([]*kv{}, entries[:mid]...), noop), entries[mid:]...)
  822. var keys [][]byte
  823. var vals [][]byte
  824. for i := 0; i < len(entries); i++ {
  825. keys = append(keys, entries[i].k)
  826. vals = append(vals, entries[i].v)
  827. }
  828. _, err := VerifyRangeProof(trie.Hash(), nil, nil, keys, vals, nil)
  829. if err == nil {
  830. t.Fatalf("Expected failure on noop entry")
  831. }
  832. }
  833. // mutateByte changes one byte in b.
  834. func mutateByte(b []byte) {
  835. for r := mrand.Intn(len(b)); ; {
  836. new := byte(mrand.Intn(255))
  837. if new != b[r] {
  838. b[r] = new
  839. break
  840. }
  841. }
  842. }
  843. func increseKey(key []byte) []byte {
  844. for i := len(key) - 1; i >= 0; i-- {
  845. key[i]++
  846. if key[i] != 0x0 {
  847. break
  848. }
  849. }
  850. return key
  851. }
  852. func decreseKey(key []byte) []byte {
  853. for i := len(key) - 1; i >= 0; i-- {
  854. key[i]--
  855. if key[i] != 0xff {
  856. break
  857. }
  858. }
  859. return key
  860. }
  861. func BenchmarkProve(b *testing.B) {
  862. trie, vals := randomTrie(100)
  863. var keys []string
  864. for k := range vals {
  865. keys = append(keys, k)
  866. }
  867. b.ResetTimer()
  868. for i := 0; i < b.N; i++ {
  869. kv := vals[keys[i%len(keys)]]
  870. proofs := memorydb.New()
  871. if trie.Prove(kv.k, 0, proofs); proofs.Len() == 0 {
  872. b.Fatalf("zero length proof for %x", kv.k)
  873. }
  874. }
  875. }
  876. func BenchmarkVerifyProof(b *testing.B) {
  877. trie, vals := randomTrie(100)
  878. root := trie.Hash()
  879. var keys []string
  880. var proofs []*memorydb.Database
  881. for k := range vals {
  882. keys = append(keys, k)
  883. proof := memorydb.New()
  884. trie.Prove([]byte(k), 0, proof)
  885. proofs = append(proofs, proof)
  886. }
  887. b.ResetTimer()
  888. for i := 0; i < b.N; i++ {
  889. im := i % len(keys)
  890. if _, err := VerifyProof(root, []byte(keys[im]), proofs[im]); err != nil {
  891. b.Fatalf("key %x: %v", keys[im], err)
  892. }
  893. }
  894. }
  895. func BenchmarkVerifyRangeProof10(b *testing.B) { benchmarkVerifyRangeProof(b, 10) }
  896. func BenchmarkVerifyRangeProof100(b *testing.B) { benchmarkVerifyRangeProof(b, 100) }
  897. func BenchmarkVerifyRangeProof1000(b *testing.B) { benchmarkVerifyRangeProof(b, 1000) }
  898. func BenchmarkVerifyRangeProof5000(b *testing.B) { benchmarkVerifyRangeProof(b, 5000) }
  899. func benchmarkVerifyRangeProof(b *testing.B, size int) {
  900. trie, vals := randomTrie(8192)
  901. var entries entrySlice
  902. for _, kv := range vals {
  903. entries = append(entries, kv)
  904. }
  905. sort.Sort(entries)
  906. start := 2
  907. end := start + size
  908. proof := memorydb.New()
  909. if err := trie.Prove(entries[start].k, 0, proof); err != nil {
  910. b.Fatalf("Failed to prove the first node %v", err)
  911. }
  912. if err := trie.Prove(entries[end-1].k, 0, proof); err != nil {
  913. b.Fatalf("Failed to prove the last node %v", err)
  914. }
  915. var keys [][]byte
  916. var values [][]byte
  917. for i := start; i < end; i++ {
  918. keys = append(keys, entries[i].k)
  919. values = append(values, entries[i].v)
  920. }
  921. b.ResetTimer()
  922. for i := 0; i < b.N; i++ {
  923. _, err := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, values, proof)
  924. if err != nil {
  925. b.Fatalf("Case %d(%d->%d) expect no error, got %v", i, start, end-1, err)
  926. }
  927. }
  928. }
  929. func BenchmarkVerifyRangeNoProof10(b *testing.B) { benchmarkVerifyRangeNoProof(b, 100) }
  930. func BenchmarkVerifyRangeNoProof500(b *testing.B) { benchmarkVerifyRangeNoProof(b, 500) }
  931. func BenchmarkVerifyRangeNoProof1000(b *testing.B) { benchmarkVerifyRangeNoProof(b, 1000) }
  932. func benchmarkVerifyRangeNoProof(b *testing.B, size int) {
  933. trie, vals := randomTrie(size)
  934. var entries entrySlice
  935. for _, kv := range vals {
  936. entries = append(entries, kv)
  937. }
  938. sort.Sort(entries)
  939. var keys [][]byte
  940. var values [][]byte
  941. for _, entry := range entries {
  942. keys = append(keys, entry.k)
  943. values = append(values, entry.v)
  944. }
  945. b.ResetTimer()
  946. for i := 0; i < b.N; i++ {
  947. _, err := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, values, nil)
  948. if err != nil {
  949. b.Fatalf("Expected no error, got %v", err)
  950. }
  951. }
  952. }
  953. func randomTrie(n int) (*Trie, map[string]*kv) {
  954. trie := new(Trie)
  955. vals := make(map[string]*kv)
  956. for i := byte(0); i < 100; i++ {
  957. value := &kv{common.LeftPadBytes([]byte{i}, 32), []byte{i}, false}
  958. value2 := &kv{common.LeftPadBytes([]byte{i + 10}, 32), []byte{i}, false}
  959. trie.Update(value.k, value.v)
  960. trie.Update(value2.k, value2.v)
  961. vals[string(value.k)] = value
  962. vals[string(value2.k)] = value2
  963. }
  964. for i := 0; i < n; i++ {
  965. value := &kv{randBytes(32), randBytes(20), false}
  966. trie.Update(value.k, value.v)
  967. vals[string(value.k)] = value
  968. }
  969. return trie, vals
  970. }
  971. func randBytes(n int) []byte {
  972. r := make([]byte, n)
  973. crand.Read(r)
  974. return r
  975. }
  976. func nonRandomTrie(n int) (*Trie, map[string]*kv) {
  977. trie := new(Trie)
  978. vals := make(map[string]*kv)
  979. max := uint64(0xffffffffffffffff)
  980. for i := uint64(0); i < uint64(n); i++ {
  981. value := make([]byte, 32)
  982. key := make([]byte, 32)
  983. binary.LittleEndian.PutUint64(key, i)
  984. binary.LittleEndian.PutUint64(value, i-max)
  985. //value := &kv{common.LeftPadBytes([]byte{i}, 32), []byte{i}, false}
  986. elem := &kv{key, value, false}
  987. trie.Update(elem.k, elem.v)
  988. vals[string(elem.k)] = elem
  989. }
  990. return trie, vals
  991. }