github.com/dim4egster/coreth@v0.10.2/plugin/evm/message/syncable.go (about)

     1  // (c) 2021-2022, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package message
     5  
     6  import (
     7  	"fmt"
     8  
     9  	"github.com/dim4egster/qmallgo/ids"
    10  	"github.com/ethereum/go-ethereum/common"
    11  	"github.com/ethereum/go-ethereum/crypto"
    12  
    13  	"github.com/dim4egster/qmallgo/snow/engine/snowman/block"
    14  )
    15  
    16  var _ block.StateSummary = &SyncSummary{}
    17  
    18  // SyncSummary provides the information necessary to sync a node starting
    19  // at the given block.
    20  type SyncSummary struct {
    21  	BlockNumber uint64      `serialize:"true"`
    22  	BlockHash   common.Hash `serialize:"true"`
    23  	BlockRoot   common.Hash `serialize:"true"`
    24  	AtomicRoot  common.Hash `serialize:"true"`
    25  
    26  	summaryID  ids.ID
    27  	bytes      []byte
    28  	acceptImpl func(SyncSummary) (bool, error)
    29  }
    30  
    31  func NewSyncSummaryFromBytes(summaryBytes []byte, acceptImpl func(SyncSummary) (bool, error)) (SyncSummary, error) {
    32  	summary := SyncSummary{}
    33  	if codecVersion, err := Codec.Unmarshal(summaryBytes, &summary); err != nil {
    34  		return SyncSummary{}, err
    35  	} else if codecVersion != Version {
    36  		return SyncSummary{}, fmt.Errorf("failed to parse syncable summary due to unexpected codec version (%d != %d)", codecVersion, Version)
    37  	}
    38  
    39  	summary.bytes = summaryBytes
    40  	summaryID, err := ids.ToID(crypto.Keccak256(summaryBytes))
    41  	if err != nil {
    42  		return SyncSummary{}, err
    43  	}
    44  	summary.summaryID = summaryID
    45  	summary.acceptImpl = acceptImpl
    46  	return summary, nil
    47  }
    48  
    49  func NewSyncSummary(blockHash common.Hash, blockNumber uint64, blockRoot common.Hash, atomicRoot common.Hash) (SyncSummary, error) {
    50  	summary := SyncSummary{
    51  		BlockNumber: blockNumber,
    52  		BlockHash:   blockHash,
    53  		BlockRoot:   blockRoot,
    54  		AtomicRoot:  atomicRoot,
    55  	}
    56  	bytes, err := Codec.Marshal(Version, &summary)
    57  	if err != nil {
    58  		return SyncSummary{}, err
    59  	}
    60  
    61  	summary.bytes = bytes
    62  	summaryID, err := ids.ToID(crypto.Keccak256(bytes))
    63  	if err != nil {
    64  		return SyncSummary{}, err
    65  	}
    66  	summary.summaryID = summaryID
    67  
    68  	return summary, nil
    69  }
    70  
    71  func (s SyncSummary) Bytes() []byte {
    72  	return s.bytes
    73  }
    74  
    75  func (s SyncSummary) Height() uint64 {
    76  	return s.BlockNumber
    77  }
    78  
    79  func (s SyncSummary) ID() ids.ID {
    80  	return s.summaryID
    81  }
    82  
    83  func (s SyncSummary) String() string {
    84  	return fmt.Sprintf("SyncSummary(BlockHash=%s, BlockNumber=%d, BlockRoot=%s, AtomicRoot=%s)", s.BlockHash, s.BlockNumber, s.BlockRoot, s.AtomicRoot)
    85  }
    86  
    87  func (s SyncSummary) Accept() (bool, error) {
    88  	if s.acceptImpl == nil {
    89  		return false, fmt.Errorf("accept implementation not specified for summary: %s", s)
    90  	}
    91  	return s.acceptImpl(s)
    92  }