github.com/MetalBlockchain/subnet-evm@v0.4.9/trie/sync_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  	"fmt"
    31  
    32  	"github.com/MetalBlockchain/subnet-evm/ethdb/memorydb"
    33  	"github.com/ethereum/go-ethereum/common"
    34  )
    35  
    36  // makeTestTrie create a sample test trie to test node-wise reconstruction.
    37  func makeTestTrie() (*Database, *StateTrie, map[string][]byte) {
    38  	// Create an empty trie
    39  	triedb := NewDatabase(memorydb.New())
    40  	trie, _ := NewStateTrie(common.Hash{}, common.Hash{}, triedb)
    41  
    42  	// Fill it with some arbitrary data
    43  	content := make(map[string][]byte)
    44  	for i := byte(0); i < 255; i++ {
    45  		// Map the same data under multiple keys
    46  		key, val := common.LeftPadBytes([]byte{1, i}, 32), []byte{i}
    47  		content[string(key)] = val
    48  		trie.Update(key, val)
    49  
    50  		key, val = common.LeftPadBytes([]byte{2, i}, 32), []byte{i}
    51  		content[string(key)] = val
    52  		trie.Update(key, val)
    53  
    54  		// Add some other data to inflate the trie
    55  		for j := byte(3); j < 13; j++ {
    56  			key, val = common.LeftPadBytes([]byte{j, i}, 32), []byte{j, i}
    57  			content[string(key)] = val
    58  			trie.Update(key, val)
    59  		}
    60  	}
    61  	root, nodes, err := trie.Commit(false)
    62  	if err != nil {
    63  		panic(fmt.Errorf("failed to commit trie %v", err))
    64  	}
    65  	if err := triedb.Update(NewWithNodeSet(nodes)); err != nil {
    66  		panic(fmt.Errorf("failed to commit db %v", err))
    67  	}
    68  	// Re-create the trie based on the new state
    69  	trie, _ = NewSecure(common.Hash{}, root, triedb)
    70  	return triedb, trie, content
    71  }