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 }