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