github.com/ylsGit/go-ethereum@v1.6.5/core/state/sync.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 state
    18  
    19  import (
    20  	"bytes"
    21  	"math/big"
    22  
    23  	"github.com/ethereum/go-ethereum/common"
    24  	"github.com/ethereum/go-ethereum/rlp"
    25  	"github.com/ethereum/go-ethereum/trie"
    26  )
    27  
    28  // StateSync is the main state synchronisation scheduler, which provides yet the
    29  // unknown state hashes to retrieve, accepts node data associated with said hashes
    30  // and reconstructs the state database step by step until all is done.
    31  type StateSync trie.TrieSync
    32  
    33  // NewStateSync create a new state trie download scheduler.
    34  func NewStateSync(root common.Hash, database trie.DatabaseReader) *StateSync {
    35  	var syncer *trie.TrieSync
    36  
    37  	callback := func(leaf []byte, parent common.Hash) error {
    38  		var obj struct {
    39  			Nonce    uint64
    40  			Balance  *big.Int
    41  			Root     common.Hash
    42  			CodeHash []byte
    43  		}
    44  		if err := rlp.Decode(bytes.NewReader(leaf), &obj); err != nil {
    45  			return err
    46  		}
    47  		syncer.AddSubTrie(obj.Root, 64, parent, nil)
    48  		syncer.AddRawEntry(common.BytesToHash(obj.CodeHash), 64, parent)
    49  
    50  		return nil
    51  	}
    52  	syncer = trie.NewTrieSync(root, database, callback)
    53  	return (*StateSync)(syncer)
    54  }
    55  
    56  // Missing retrieves the known missing nodes from the state trie for retrieval.
    57  func (s *StateSync) Missing(max int) []common.Hash {
    58  	return (*trie.TrieSync)(s).Missing(max)
    59  }
    60  
    61  // Process injects a batch of retrieved trie nodes data, returning if something
    62  // was committed to the database and also the index of an entry if processing of
    63  // it failed.
    64  func (s *StateSync) Process(list []trie.SyncResult, dbw trie.DatabaseWriter) (bool, int, error) {
    65  	return (*trie.TrieSync)(s).Process(list, dbw)
    66  }
    67  
    68  // Pending returns the number of state entries currently pending for download.
    69  func (s *StateSync) Pending() int {
    70  	return (*trie.TrieSync)(s).Pending()
    71  }