proof_test.go 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953
  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. }
  359. // TestAllElementsProof tests the range proof with all elements.
  360. // The edge proofs can be nil.
  361. func TestAllElementsProof(t *testing.T) {
  362. trie, vals := randomTrie(4096)
  363. var entries entrySlice
  364. for _, kv := range vals {
  365. entries = append(entries, kv)
  366. }
  367. sort.Sort(entries)
  368. var k [][]byte
  369. var v [][]byte
  370. for i := 0; i < len(entries); i++ {
  371. k = append(k, entries[i].k)
  372. v = append(v, entries[i].v)
  373. }
  374. _, _, _, _, err := VerifyRangeProof(trie.Hash(), nil, nil, k, v, nil)
  375. if err != nil {
  376. t.Fatalf("Expected no error, got %v", err)
  377. }
  378. // With edge proofs, it should still work.
  379. proof := memorydb.New()
  380. if err := trie.Prove(entries[0].k, 0, proof); err != nil {
  381. t.Fatalf("Failed to prove the first node %v", err)
  382. }
  383. if err := trie.Prove(entries[len(entries)-1].k, 0, proof); err != nil {
  384. t.Fatalf("Failed to prove the last node %v", err)
  385. }
  386. _, _, _, _, err = VerifyRangeProof(trie.Hash(), k[0], k[len(k)-1], k, v, proof)
  387. if err != nil {
  388. t.Fatalf("Expected no error, got %v", err)
  389. }
  390. // Even with non-existent edge proofs, it should still work.
  391. proof = memorydb.New()
  392. first := common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000").Bytes()
  393. last := common.HexToHash("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").Bytes()
  394. if err := trie.Prove(first, 0, proof); err != nil {
  395. t.Fatalf("Failed to prove the first node %v", err)
  396. }
  397. if err := trie.Prove(last, 0, proof); err != nil {
  398. t.Fatalf("Failed to prove the last node %v", err)
  399. }
  400. _, _, _, _, err = VerifyRangeProof(trie.Hash(), first, last, k, v, proof)
  401. if err != nil {
  402. t.Fatalf("Expected no error, got %v", err)
  403. }
  404. }
  405. // TestSingleSideRangeProof tests the range starts from zero.
  406. func TestSingleSideRangeProof(t *testing.T) {
  407. for i := 0; i < 64; i++ {
  408. trie := new(Trie)
  409. var entries entrySlice
  410. for i := 0; i < 4096; i++ {
  411. value := &kv{randBytes(32), randBytes(20), false}
  412. trie.Update(value.k, value.v)
  413. entries = append(entries, value)
  414. }
  415. sort.Sort(entries)
  416. var cases = []int{0, 1, 50, 100, 1000, 2000, len(entries) - 1}
  417. for _, pos := range cases {
  418. proof := memorydb.New()
  419. if err := trie.Prove(common.Hash{}.Bytes(), 0, proof); err != nil {
  420. t.Fatalf("Failed to prove the first node %v", err)
  421. }
  422. if err := trie.Prove(entries[pos].k, 0, proof); err != nil {
  423. t.Fatalf("Failed to prove the first node %v", err)
  424. }
  425. k := make([][]byte, 0)
  426. v := make([][]byte, 0)
  427. for i := 0; i <= pos; i++ {
  428. k = append(k, entries[i].k)
  429. v = append(v, entries[i].v)
  430. }
  431. _, _, _, _, err := VerifyRangeProof(trie.Hash(), common.Hash{}.Bytes(), k[len(k)-1], k, v, proof)
  432. if err != nil {
  433. t.Fatalf("Expected no error, got %v", err)
  434. }
  435. }
  436. }
  437. }
  438. // TestReverseSingleSideRangeProof tests the range ends with 0xffff...fff.
  439. func TestReverseSingleSideRangeProof(t *testing.T) {
  440. for i := 0; i < 64; i++ {
  441. trie := new(Trie)
  442. var entries entrySlice
  443. for i := 0; i < 4096; i++ {
  444. value := &kv{randBytes(32), randBytes(20), false}
  445. trie.Update(value.k, value.v)
  446. entries = append(entries, value)
  447. }
  448. sort.Sort(entries)
  449. var cases = []int{0, 1, 50, 100, 1000, 2000, len(entries) - 1}
  450. for _, pos := range cases {
  451. proof := memorydb.New()
  452. if err := trie.Prove(entries[pos].k, 0, proof); err != nil {
  453. t.Fatalf("Failed to prove the first node %v", err)
  454. }
  455. last := common.HexToHash("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")
  456. if err := trie.Prove(last.Bytes(), 0, proof); err != nil {
  457. t.Fatalf("Failed to prove the last node %v", err)
  458. }
  459. k := make([][]byte, 0)
  460. v := make([][]byte, 0)
  461. for i := pos; i < len(entries); i++ {
  462. k = append(k, entries[i].k)
  463. v = append(v, entries[i].v)
  464. }
  465. _, _, _, _, err := VerifyRangeProof(trie.Hash(), k[0], last.Bytes(), k, v, proof)
  466. if err != nil {
  467. t.Fatalf("Expected no error, got %v", err)
  468. }
  469. }
  470. }
  471. }
  472. // TestBadRangeProof tests a few cases which the proof is wrong.
  473. // The prover is expected to detect the error.
  474. func TestBadRangeProof(t *testing.T) {
  475. trie, vals := randomTrie(4096)
  476. var entries entrySlice
  477. for _, kv := range vals {
  478. entries = append(entries, kv)
  479. }
  480. sort.Sort(entries)
  481. for i := 0; i < 500; i++ {
  482. start := mrand.Intn(len(entries))
  483. end := mrand.Intn(len(entries)-start) + start + 1
  484. proof := memorydb.New()
  485. if err := trie.Prove(entries[start].k, 0, proof); err != nil {
  486. t.Fatalf("Failed to prove the first node %v", err)
  487. }
  488. if err := trie.Prove(entries[end-1].k, 0, proof); err != nil {
  489. t.Fatalf("Failed to prove the last node %v", err)
  490. }
  491. var keys [][]byte
  492. var vals [][]byte
  493. for i := start; i < end; i++ {
  494. keys = append(keys, entries[i].k)
  495. vals = append(vals, entries[i].v)
  496. }
  497. var first, last = keys[0], keys[len(keys)-1]
  498. testcase := mrand.Intn(6)
  499. var index int
  500. switch testcase {
  501. case 0:
  502. // Modified key
  503. index = mrand.Intn(end - start)
  504. keys[index] = randBytes(32) // In theory it can't be same
  505. case 1:
  506. // Modified val
  507. index = mrand.Intn(end - start)
  508. vals[index] = randBytes(20) // In theory it can't be same
  509. case 2:
  510. // Gapped entry slice
  511. index = mrand.Intn(end - start)
  512. if (index == 0 && start < 100) || (index == end-start-1 && end <= 100) {
  513. continue
  514. }
  515. keys = append(keys[:index], keys[index+1:]...)
  516. vals = append(vals[:index], vals[index+1:]...)
  517. case 3:
  518. // Out of order
  519. index1 := mrand.Intn(end - start)
  520. index2 := mrand.Intn(end - start)
  521. if index1 == index2 {
  522. continue
  523. }
  524. keys[index1], keys[index2] = keys[index2], keys[index1]
  525. vals[index1], vals[index2] = vals[index2], vals[index1]
  526. case 4:
  527. // Set random key to nil, do nothing
  528. index = mrand.Intn(end - start)
  529. keys[index] = nil
  530. case 5:
  531. // Set random value to nil, deletion
  532. index = mrand.Intn(end - start)
  533. vals[index] = nil
  534. }
  535. _, _, _, _, err := VerifyRangeProof(trie.Hash(), first, last, keys, vals, proof)
  536. if err == nil {
  537. t.Fatalf("%d Case %d index %d range: (%d->%d) expect error, got nil", i, testcase, index, start, end-1)
  538. }
  539. }
  540. }
  541. // TestGappedRangeProof focuses on the small trie with embedded nodes.
  542. // If the gapped node is embedded in the trie, it should be detected too.
  543. func TestGappedRangeProof(t *testing.T) {
  544. trie := new(Trie)
  545. var entries []*kv // Sorted entries
  546. for i := byte(0); i < 10; i++ {
  547. value := &kv{common.LeftPadBytes([]byte{i}, 32), []byte{i}, false}
  548. trie.Update(value.k, value.v)
  549. entries = append(entries, value)
  550. }
  551. first, last := 2, 8
  552. proof := memorydb.New()
  553. if err := trie.Prove(entries[first].k, 0, proof); err != nil {
  554. t.Fatalf("Failed to prove the first node %v", err)
  555. }
  556. if err := trie.Prove(entries[last-1].k, 0, proof); err != nil {
  557. t.Fatalf("Failed to prove the last node %v", err)
  558. }
  559. var keys [][]byte
  560. var vals [][]byte
  561. for i := first; i < last; i++ {
  562. if i == (first+last)/2 {
  563. continue
  564. }
  565. keys = append(keys, entries[i].k)
  566. vals = append(vals, entries[i].v)
  567. }
  568. _, _, _, _, err := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, vals, proof)
  569. if err == nil {
  570. t.Fatal("expect error, got nil")
  571. }
  572. }
  573. // TestSameSideProofs tests the element is not in the range covered by proofs
  574. func TestSameSideProofs(t *testing.T) {
  575. trie, vals := randomTrie(4096)
  576. var entries entrySlice
  577. for _, kv := range vals {
  578. entries = append(entries, kv)
  579. }
  580. sort.Sort(entries)
  581. pos := 1000
  582. first := decreseKey(common.CopyBytes(entries[pos].k))
  583. first = decreseKey(first)
  584. last := decreseKey(common.CopyBytes(entries[pos].k))
  585. proof := memorydb.New()
  586. if err := trie.Prove(first, 0, proof); err != nil {
  587. t.Fatalf("Failed to prove the first node %v", err)
  588. }
  589. if err := trie.Prove(last, 0, proof); err != nil {
  590. t.Fatalf("Failed to prove the last node %v", err)
  591. }
  592. _, _, _, _, err := VerifyRangeProof(trie.Hash(), first, last, [][]byte{entries[pos].k}, [][]byte{entries[pos].v}, proof)
  593. if err == nil {
  594. t.Fatalf("Expected error, got nil")
  595. }
  596. first = increseKey(common.CopyBytes(entries[pos].k))
  597. last = increseKey(common.CopyBytes(entries[pos].k))
  598. last = increseKey(last)
  599. proof = memorydb.New()
  600. if err := trie.Prove(first, 0, proof); err != nil {
  601. t.Fatalf("Failed to prove the first node %v", err)
  602. }
  603. if err := trie.Prove(last, 0, proof); err != nil {
  604. t.Fatalf("Failed to prove the last node %v", err)
  605. }
  606. _, _, _, _, err = VerifyRangeProof(trie.Hash(), first, last, [][]byte{entries[pos].k}, [][]byte{entries[pos].v}, proof)
  607. if err == nil {
  608. t.Fatalf("Expected error, got nil")
  609. }
  610. }
  611. func TestHasRightElement(t *testing.T) {
  612. trie := new(Trie)
  613. var entries entrySlice
  614. for i := 0; i < 4096; i++ {
  615. value := &kv{randBytes(32), randBytes(20), false}
  616. trie.Update(value.k, value.v)
  617. entries = append(entries, value)
  618. }
  619. sort.Sort(entries)
  620. var cases = []struct {
  621. start int
  622. end int
  623. hasMore bool
  624. }{
  625. {-1, 1, true}, // single element with non-existent left proof
  626. {0, 1, true}, // single element with existent left proof
  627. {0, 10, true},
  628. {50, 100, true},
  629. {50, len(entries), false}, // No more element expected
  630. {len(entries) - 1, len(entries), false}, // Single last element with two existent proofs(point to same key)
  631. {len(entries) - 1, -1, false}, // Single last element with non-existent right proof
  632. {0, len(entries), false}, // The whole set with existent left proof
  633. {-1, len(entries), false}, // The whole set with non-existent left proof
  634. {-1, -1, false}, // The whole set with non-existent left/right proof
  635. }
  636. for _, c := range cases {
  637. var (
  638. firstKey []byte
  639. lastKey []byte
  640. start = c.start
  641. end = c.end
  642. proof = memorydb.New()
  643. )
  644. if c.start == -1 {
  645. firstKey, start = common.Hash{}.Bytes(), 0
  646. if err := trie.Prove(firstKey, 0, proof); err != nil {
  647. t.Fatalf("Failed to prove the first node %v", err)
  648. }
  649. } else {
  650. firstKey = entries[c.start].k
  651. if err := trie.Prove(entries[c.start].k, 0, proof); err != nil {
  652. t.Fatalf("Failed to prove the first node %v", err)
  653. }
  654. }
  655. if c.end == -1 {
  656. lastKey, end = common.HexToHash("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").Bytes(), len(entries)
  657. if err := trie.Prove(lastKey, 0, proof); err != nil {
  658. t.Fatalf("Failed to prove the first node %v", err)
  659. }
  660. } else {
  661. lastKey = entries[c.end-1].k
  662. if err := trie.Prove(entries[c.end-1].k, 0, proof); err != nil {
  663. t.Fatalf("Failed to prove the first node %v", err)
  664. }
  665. }
  666. k := make([][]byte, 0)
  667. v := make([][]byte, 0)
  668. for i := start; i < end; i++ {
  669. k = append(k, entries[i].k)
  670. v = append(v, entries[i].v)
  671. }
  672. _, _, _, hasMore, err := VerifyRangeProof(trie.Hash(), firstKey, lastKey, k, v, proof)
  673. if err != nil {
  674. t.Fatalf("Expected no error, got %v", err)
  675. }
  676. if hasMore != c.hasMore {
  677. t.Fatalf("Wrong hasMore indicator, want %t, got %t", c.hasMore, hasMore)
  678. }
  679. }
  680. }
  681. // TestEmptyRangeProof tests the range proof with "no" element.
  682. // The first edge proof must be a non-existent proof.
  683. func TestEmptyRangeProof(t *testing.T) {
  684. trie, vals := randomTrie(4096)
  685. var entries entrySlice
  686. for _, kv := range vals {
  687. entries = append(entries, kv)
  688. }
  689. sort.Sort(entries)
  690. var cases = []struct {
  691. pos int
  692. err bool
  693. }{
  694. {len(entries) - 1, false},
  695. {500, true},
  696. }
  697. for _, c := range cases {
  698. proof := memorydb.New()
  699. first := increseKey(common.CopyBytes(entries[c.pos].k))
  700. if err := trie.Prove(first, 0, proof); err != nil {
  701. t.Fatalf("Failed to prove the first node %v", err)
  702. }
  703. db, tr, not, _, err := VerifyRangeProof(trie.Hash(), first, nil, nil, nil, proof)
  704. if c.err && err == nil {
  705. t.Fatalf("Expected error, got nil")
  706. }
  707. if !c.err && err != nil {
  708. t.Fatalf("Expected no error, got %v", err)
  709. }
  710. // If no error was returned, ensure the returned trie and database contains
  711. // the entire proof, since there's no value
  712. if !c.err {
  713. if err := tr.Prove(first, 0, memorydb.New()); err != nil {
  714. t.Errorf("returned trie doesn't contain original proof: %v", err)
  715. }
  716. if memdb := db.(*memorydb.Database); memdb.Len() != proof.Len() {
  717. t.Errorf("database entry count mismatch: have %d, want %d", memdb.Len(), proof.Len())
  718. }
  719. if not == nil {
  720. t.Errorf("missing notary")
  721. }
  722. }
  723. }
  724. }
  725. // TestBloatedProof tests a malicious proof, where the proof is more or less the
  726. // whole trie.
  727. func TestBloatedProof(t *testing.T) {
  728. // Use a small trie
  729. trie, kvs := nonRandomTrie(100)
  730. var entries entrySlice
  731. for _, kv := range kvs {
  732. entries = append(entries, kv)
  733. }
  734. sort.Sort(entries)
  735. var keys [][]byte
  736. var vals [][]byte
  737. proof := memorydb.New()
  738. for i, entry := range entries {
  739. trie.Prove(entry.k, 0, proof)
  740. if i == 50 {
  741. keys = append(keys, entry.k)
  742. vals = append(vals, entry.v)
  743. }
  744. }
  745. want := memorydb.New()
  746. trie.Prove(keys[0], 0, want)
  747. trie.Prove(keys[len(keys)-1], 0, want)
  748. _, _, notary, _, _ := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, vals, proof)
  749. if used := notary.Accessed().(*memorydb.Database); used.Len() != want.Len() {
  750. t.Fatalf("notary proof size mismatch: have %d, want %d", used.Len(), want.Len())
  751. }
  752. }
  753. // mutateByte changes one byte in b.
  754. func mutateByte(b []byte) {
  755. for r := mrand.Intn(len(b)); ; {
  756. new := byte(mrand.Intn(255))
  757. if new != b[r] {
  758. b[r] = new
  759. break
  760. }
  761. }
  762. }
  763. func increseKey(key []byte) []byte {
  764. for i := len(key) - 1; i >= 0; i-- {
  765. key[i]++
  766. if key[i] != 0x0 {
  767. break
  768. }
  769. }
  770. return key
  771. }
  772. func decreseKey(key []byte) []byte {
  773. for i := len(key) - 1; i >= 0; i-- {
  774. key[i]--
  775. if key[i] != 0xff {
  776. break
  777. }
  778. }
  779. return key
  780. }
  781. func BenchmarkProve(b *testing.B) {
  782. trie, vals := randomTrie(100)
  783. var keys []string
  784. for k := range vals {
  785. keys = append(keys, k)
  786. }
  787. b.ResetTimer()
  788. for i := 0; i < b.N; i++ {
  789. kv := vals[keys[i%len(keys)]]
  790. proofs := memorydb.New()
  791. if trie.Prove(kv.k, 0, proofs); proofs.Len() == 0 {
  792. b.Fatalf("zero length proof for %x", kv.k)
  793. }
  794. }
  795. }
  796. func BenchmarkVerifyProof(b *testing.B) {
  797. trie, vals := randomTrie(100)
  798. root := trie.Hash()
  799. var keys []string
  800. var proofs []*memorydb.Database
  801. for k := range vals {
  802. keys = append(keys, k)
  803. proof := memorydb.New()
  804. trie.Prove([]byte(k), 0, proof)
  805. proofs = append(proofs, proof)
  806. }
  807. b.ResetTimer()
  808. for i := 0; i < b.N; i++ {
  809. im := i % len(keys)
  810. if _, err := VerifyProof(root, []byte(keys[im]), proofs[im]); err != nil {
  811. b.Fatalf("key %x: %v", keys[im], err)
  812. }
  813. }
  814. }
  815. func BenchmarkVerifyRangeProof10(b *testing.B) { benchmarkVerifyRangeProof(b, 10) }
  816. func BenchmarkVerifyRangeProof100(b *testing.B) { benchmarkVerifyRangeProof(b, 100) }
  817. func BenchmarkVerifyRangeProof1000(b *testing.B) { benchmarkVerifyRangeProof(b, 1000) }
  818. func BenchmarkVerifyRangeProof5000(b *testing.B) { benchmarkVerifyRangeProof(b, 5000) }
  819. func benchmarkVerifyRangeProof(b *testing.B, size int) {
  820. trie, vals := randomTrie(8192)
  821. var entries entrySlice
  822. for _, kv := range vals {
  823. entries = append(entries, kv)
  824. }
  825. sort.Sort(entries)
  826. start := 2
  827. end := start + size
  828. proof := memorydb.New()
  829. if err := trie.Prove(entries[start].k, 0, proof); err != nil {
  830. b.Fatalf("Failed to prove the first node %v", err)
  831. }
  832. if err := trie.Prove(entries[end-1].k, 0, proof); err != nil {
  833. b.Fatalf("Failed to prove the last node %v", err)
  834. }
  835. var keys [][]byte
  836. var values [][]byte
  837. for i := start; i < end; i++ {
  838. keys = append(keys, entries[i].k)
  839. values = append(values, entries[i].v)
  840. }
  841. b.ResetTimer()
  842. for i := 0; i < b.N; i++ {
  843. _, _, _, _, err := VerifyRangeProof(trie.Hash(), keys[0], keys[len(keys)-1], keys, values, proof)
  844. if err != nil {
  845. b.Fatalf("Case %d(%d->%d) expect no error, got %v", i, start, end-1, err)
  846. }
  847. }
  848. }
  849. func randomTrie(n int) (*Trie, map[string]*kv) {
  850. trie := new(Trie)
  851. vals := make(map[string]*kv)
  852. for i := byte(0); i < 100; i++ {
  853. value := &kv{common.LeftPadBytes([]byte{i}, 32), []byte{i}, false}
  854. value2 := &kv{common.LeftPadBytes([]byte{i + 10}, 32), []byte{i}, false}
  855. trie.Update(value.k, value.v)
  856. trie.Update(value2.k, value2.v)
  857. vals[string(value.k)] = value
  858. vals[string(value2.k)] = value2
  859. }
  860. for i := 0; i < n; i++ {
  861. value := &kv{randBytes(32), randBytes(20), false}
  862. trie.Update(value.k, value.v)
  863. vals[string(value.k)] = value
  864. }
  865. return trie, vals
  866. }
  867. func randBytes(n int) []byte {
  868. r := make([]byte, n)
  869. crand.Read(r)
  870. return r
  871. }
  872. func nonRandomTrie(n int) (*Trie, map[string]*kv) {
  873. trie := new(Trie)
  874. vals := make(map[string]*kv)
  875. max := uint64(0xffffffffffffffff)
  876. for i := uint64(0); i < uint64(n); i++ {
  877. value := make([]byte, 32)
  878. key := make([]byte, 32)
  879. binary.LittleEndian.PutUint64(key, i)
  880. binary.LittleEndian.PutUint64(value, i-max)
  881. //value := &kv{common.LeftPadBytes([]byte{i}, 32), []byte{i}, false}
  882. elem := &kv{key, value, false}
  883. trie.Update(elem.k, elem.v)
  884. vals[string(elem.k)] = elem
  885. }
  886. return trie, vals
  887. }