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