github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/core/state/iterator_test.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 19:16:35</date>
    10  //</624450079956144128>
    11  
    12  
    13  package state
    14  
    15  import (
    16  	"bytes"
    17  	"testing"
    18  
    19  	"github.com/ethereum/go-ethereum/common"
    20  	"github.com/ethereum/go-ethereum/ethdb"
    21  )
    22  
    23  //测试节点迭代器是否确实遍历整个数据库内容。
    24  func TestNodeIteratorCoverage(t *testing.T) {
    25  //创建一些迭代的测试状态
    26  	db, root, _ := makeTestState()
    27  
    28  	state, err := New(root, db)
    29  	if err != nil {
    30  		t.Fatalf("failed to create state trie at %x: %v", root, err)
    31  	}
    32  //收集迭代器找到的所有节点散列
    33  	hashes := make(map[common.Hash]struct{})
    34  	for it := NewNodeIterator(state); it.Next(); {
    35  		if it.Hash != (common.Hash{}) {
    36  			hashes[it.Hash] = struct{}{}
    37  		}
    38  	}
    39  //交叉检查迭代哈希和数据库/nodepol内容
    40  	for hash := range hashes {
    41  		if _, err := db.TrieDB().Node(hash); err != nil {
    42  			t.Errorf("failed to retrieve reported node %x", hash)
    43  		}
    44  	}
    45  	for _, hash := range db.TrieDB().Nodes() {
    46  		if _, ok := hashes[hash]; !ok {
    47  			t.Errorf("state entry not reported %x", hash)
    48  		}
    49  	}
    50  	for _, key := range db.TrieDB().DiskDB().(*ethdb.MemDatabase).Keys() {
    51  		if bytes.HasPrefix(key, []byte("secure-key-")) {
    52  			continue
    53  		}
    54  		if _, ok := hashes[common.BytesToHash(key)]; !ok {
    55  			t.Errorf("state entry not reported %x", key)
    56  		}
    57  	}
    58  }
    59