github.com/MetalBlockchain/subnet-evm@v0.4.9/trie/proof_test.go (about)

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