proof_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package trie
  2. import (
  3. "bytes"
  4. crand "crypto/rand"
  5. mrand "math/rand"
  6. "testing"
  7. "time"
  8. "github.com/ethereum/go-ethereum/common"
  9. "github.com/ethereum/go-ethereum/rlp"
  10. )
  11. func init() {
  12. mrand.Seed(time.Now().Unix())
  13. }
  14. func TestProof(t *testing.T) {
  15. trie, vals := randomTrie(500)
  16. root := trie.Hash()
  17. for _, kv := range vals {
  18. proof := trie.Prove(kv.k)
  19. if proof == nil {
  20. t.Fatalf("missing key %x while constructing proof", kv.k)
  21. }
  22. val, err := VerifyProof(root, kv.k, proof)
  23. if err != nil {
  24. t.Fatalf("VerifyProof error for key %x: %v\nraw proof: %x", kv.k, err, proof)
  25. }
  26. if !bytes.Equal(val, kv.v) {
  27. t.Fatalf("VerifyProof returned wrong value for key %x: got %x, want %x", kv.k, val, kv.v)
  28. }
  29. }
  30. }
  31. func TestOneElementProof(t *testing.T) {
  32. trie := new(Trie)
  33. updateString(trie, "k", "v")
  34. proof := trie.Prove([]byte("k"))
  35. if proof == nil {
  36. t.Fatal("nil proof")
  37. }
  38. if len(proof) != 1 {
  39. t.Error("proof should have one element")
  40. }
  41. val, err := VerifyProof(trie.Hash(), []byte("k"), proof)
  42. if err != nil {
  43. t.Fatalf("VerifyProof error: %v\nraw proof: %x", err, proof)
  44. }
  45. if !bytes.Equal(val, []byte("v")) {
  46. t.Fatalf("VerifyProof returned wrong value: got %x, want 'k'", val)
  47. }
  48. }
  49. func TestVerifyBadProof(t *testing.T) {
  50. trie, vals := randomTrie(800)
  51. root := trie.Hash()
  52. for _, kv := range vals {
  53. proof := trie.Prove(kv.k)
  54. if proof == nil {
  55. t.Fatal("nil proof")
  56. }
  57. mutateByte(proof[mrand.Intn(len(proof))])
  58. if _, err := VerifyProof(root, kv.k, proof); err == nil {
  59. t.Fatalf("expected proof to fail for key %x", kv.k)
  60. }
  61. }
  62. }
  63. // mutateByte changes one byte in b.
  64. func mutateByte(b []byte) {
  65. for r := mrand.Intn(len(b)); ; {
  66. new := byte(mrand.Intn(255))
  67. if new != b[r] {
  68. b[r] = new
  69. break
  70. }
  71. }
  72. }
  73. func BenchmarkProve(b *testing.B) {
  74. trie, vals := randomTrie(100)
  75. var keys []string
  76. for k := range vals {
  77. keys = append(keys, k)
  78. }
  79. b.ResetTimer()
  80. for i := 0; i < b.N; i++ {
  81. kv := vals[keys[i%len(keys)]]
  82. if trie.Prove(kv.k) == nil {
  83. b.Fatalf("nil proof for %x", kv.k)
  84. }
  85. }
  86. }
  87. func BenchmarkVerifyProof(b *testing.B) {
  88. trie, vals := randomTrie(100)
  89. root := trie.Hash()
  90. var keys []string
  91. var proofs [][]rlp.RawValue
  92. for k := range vals {
  93. keys = append(keys, k)
  94. proofs = append(proofs, trie.Prove([]byte(k)))
  95. }
  96. b.ResetTimer()
  97. for i := 0; i < b.N; i++ {
  98. im := i % len(keys)
  99. if _, err := VerifyProof(root, []byte(keys[im]), proofs[im]); err != nil {
  100. b.Fatalf("key %x: error", keys[im], err)
  101. }
  102. }
  103. }
  104. func randomTrie(n int) (*Trie, map[string]*kv) {
  105. trie := new(Trie)
  106. vals := make(map[string]*kv)
  107. for i := byte(0); i < 100; i++ {
  108. value := &kv{common.LeftPadBytes([]byte{i}, 32), []byte{i}, false}
  109. value2 := &kv{common.LeftPadBytes([]byte{i + 10}, 32), []byte{i}, false}
  110. trie.Update(value.k, value.v)
  111. trie.Update(value2.k, value2.v)
  112. vals[string(value.k)] = value
  113. vals[string(value2.k)] = value2
  114. }
  115. for i := 0; i < n; i++ {
  116. value := &kv{randBytes(32), randBytes(20), false}
  117. trie.Update(value.k, value.v)
  118. vals[string(value.k)] = value
  119. }
  120. return trie, vals
  121. }
  122. func randBytes(n int) []byte {
  123. r := make([]byte, n)
  124. crand.Read(r)
  125. return r
  126. }