Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(dot/sync): Gossip BlockAnnounceMessage only after successfully imported #2885

Merged
merged 18 commits into from
Oct 21, 2022
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
3c2a92f
fix: gossip block announce only after block sucessfully imported
EclesioMeloJunior Oct 10, 2022
069109b
chore: imported block could be a best block
EclesioMeloJunior Oct 10, 2022
b3c1cea
chore: fix lint warns
EclesioMeloJunior Oct 11, 2022
f9c0d52
chore: simplify bool var, remove unneeded comment
EclesioMeloJunior Oct 11, 2022
abf6330
Merge branch 'development' into eclesio/fix/import-block-announce
EclesioMeloJunior Oct 11, 2022
67b3710
Merge branch 'eclesio/fix/import-block-announce' of github.com:ChainS…
EclesioMeloJunior Oct 11, 2022
35b18ff
wip: maybe propagate message when we have the block
EclesioMeloJunior Oct 11, 2022
efbf67f
Merge branch 'development' into eclesio/fix/import-block-announce
EclesioMeloJunior Oct 12, 2022
48fcdf6
chore: change test to check `propagate` var is `false`
EclesioMeloJunior Oct 13, 2022
80c8616
chore: increase code coverage + fix tests
EclesioMeloJunior Oct 13, 2022
642b847
chore: fix lint warns
EclesioMeloJunior Oct 13, 2022
a539478
chore: solving error wrapping
EclesioMeloJunior Oct 13, 2022
6eea08b
chore: remove useless comment
EclesioMeloJunior Oct 14, 2022
7cccaf9
chore: address comment
EclesioMeloJunior Oct 18, 2022
2615216
Merge branch 'development' into eclesio/fix/import-block-announce
EclesioMeloJunior Oct 20, 2022
1cde08c
chore: fix inverted `errors.Is` check
EclesioMeloJunior Oct 20, 2022
5b004be
chore
EclesioMeloJunior Oct 21, 2022
b04ed3b
Merge branch 'development' into eclesio/fix/import-block-announce
EclesioMeloJunior Oct 21, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 39 additions & 11 deletions dot/core/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -127,40 +127,68 @@ func (s *Service) StorageRoot() (common.Hash, error) {

// HandleBlockImport handles a block that was imported via the network
func (s *Service) HandleBlockImport(block *types.Block, state *rtstorage.TrieState) error {
return s.handleBlock(block, state)
err := s.handleBlock(block, state)
if err != nil {
return fmt.Errorf("handling block: %s", err)
EclesioMeloJunior marked this conversation as resolved.
Show resolved Hide resolved
}

isBestBlock := false
bestBlockHash := s.blockState.BestBlockHash()

if bestBlockHash.Equal(block.Header.Hash()) {
isBestBlock = true
}
EclesioMeloJunior marked this conversation as resolved.
Show resolved Hide resolved

blockAnnounce, err := createBlockAnnounce(block, isBestBlock)
if err != nil {
logger.Errorf("creating block announce: %s", err)
EclesioMeloJunior marked this conversation as resolved.
Show resolved Hide resolved
}

s.net.GossipMessage(blockAnnounce)
EclesioMeloJunior marked this conversation as resolved.
Show resolved Hide resolved
return nil
}

// HandleBlockProduced handles a block that was produced by us
// It is handled the same as an imported block in terms of state updates; the only difference
// is we send a BlockAnnounceMessage to our peers.
func (s *Service) HandleBlockProduced(block *types.Block, state *rtstorage.TrieState) error {
if err := s.handleBlock(block, state); err != nil {
return err
err := s.handleBlock(block, state)
if err != nil {
return fmt.Errorf("handling block: %s", err)
}

const isBestBlock = true
blockAnnounce, err := createBlockAnnounce(block, isBestBlock)
EclesioMeloJunior marked this conversation as resolved.
Show resolved Hide resolved
if err != nil {
logger.Errorf("creating block announce: %s", err)
EclesioMeloJunior marked this conversation as resolved.
Show resolved Hide resolved
}

s.net.GossipMessage(blockAnnounce)
EclesioMeloJunior marked this conversation as resolved.
Show resolved Hide resolved
return nil
}

func createBlockAnnounce(block *types.Block, isBestBlock bool) (
blockAnnounce *network.BlockAnnounceMessage, err error) {
digest := types.NewDigest()
for i := range block.Header.Digest.Types {
digestValue, err := block.Header.Digest.Types[i].Value()
if err != nil {
return fmt.Errorf("getting value of digest type at index %d: %w", i, err)
return nil, fmt.Errorf("getting value of digest type at index %d: %w", i, err)
}
err = digest.Add(digestValue)
if err != nil {
return err
return nil, err
EclesioMeloJunior marked this conversation as resolved.
Show resolved Hide resolved
}
}

msg := &network.BlockAnnounceMessage{
return &network.BlockAnnounceMessage{
ParentHash: block.Header.ParentHash,
Number: block.Header.Number,
StateRoot: block.Header.StateRoot,
ExtrinsicsRoot: block.Header.ExtrinsicsRoot,
Digest: digest,
BestBlock: true,
}

s.net.GossipMessage(msg)
return nil
BestBlock: isBestBlock,
}, nil
}

func (s *Service) handleBlock(block *types.Block, state *rtstorage.TrieState) error {
Expand Down
11 changes: 5 additions & 6 deletions dot/network/block_announce.go
Original file line number Diff line number Diff line change
Expand Up @@ -203,14 +203,13 @@ func (s *Service) validateBlockAnnounceHandshake(from peer.ID, hs Handshake) err
// if some more blocks are required to sync the announced block, the node will open a sync stream
// with its peer and send a BlockRequest message
func (s *Service) handleBlockAnnounceMessage(from peer.ID, msg NotificationsMessage) (propagate bool, err error) {
propagate = false

EclesioMeloJunior marked this conversation as resolved.
Show resolved Hide resolved
bam, ok := msg.(*BlockAnnounceMessage)
if !ok {
return false, errors.New("invalid message")
}

if err = s.syncer.HandleBlockAnnounce(from, bam); err != nil {
return false, err
return propagate, errors.New("invalid message")
EclesioMeloJunior marked this conversation as resolved.
Show resolved Hide resolved
}

return true, nil
err = s.syncer.HandleBlockAnnounce(from, bam)
return propagate, err
EclesioMeloJunior marked this conversation as resolved.
Show resolved Hide resolved
}
1 change: 1 addition & 0 deletions dot/sync/chain_processor.go
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,7 @@ func (s *chainProcessor) handleBlock(block *types.Block) error {
}

logger.Debugf("🔗 imported block number %d with hash %s", block.Header.Number, block.Header.Hash())
// should we announce the block here?
EclesioMeloJunior marked this conversation as resolved.
Show resolved Hide resolved

blockHash := block.Header.Hash()
s.telemetry.SendMessage(telemetry.NewBlockImport(
Expand Down
2 changes: 1 addition & 1 deletion dot/sync/chain_sync.go
Original file line number Diff line number Diff line change
Expand Up @@ -632,7 +632,7 @@ func (cs *chainSync) dispatchWorker(w *worker) {
"start hash %s, target hash %s, "+
"request data %d, direction %s",
w.id,
w.startNumber, w.targetNumber,
*w.startNumber, *w.targetNumber,
EclesioMeloJunior marked this conversation as resolved.
Show resolved Hide resolved
w.startHash, w.targetHash,
w.requestData, w.direction)

Expand Down