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  }