From 7456122dafbc1262cee71607485f04f303a46e7d Mon Sep 17 00:00:00 2001 From: NathanBSC Date: Mon, 24 Jul 2023 14:34:57 +0800 Subject: [PATCH 1/3] vote: backup validator sync votes from corresponding mining validator --- core/vote/vote_manager.go | 26 +++++++++++++++++++++++--- core/vote/vote_signer.go | 4 ++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/core/vote/vote_manager.go b/core/vote/vote_manager.go index dcab5c38dd..62eb0d6bb3 100644 --- a/core/vote/vote_manager.go +++ b/core/vote/vote_manager.go @@ -32,6 +32,10 @@ type VoteManager struct { chainHeadCh chan core.ChainHeadEvent chainHeadSub event.Subscription + // used for backup validators to sync votes from corresponding mining validator + syncVoteCh chan core.NewVoteEvent + syncVoteSub event.Subscription + pool *VotePool signer *VoteSigner journal *VoteJournal @@ -46,9 +50,9 @@ func NewVoteManager(eth Backend, chainconfig *params.ChainConfig, chain *core.Bl chain: chain, chainconfig: chainconfig, chainHeadCh: make(chan core.ChainHeadEvent, chainHeadChanSize), - - pool: pool, - engine: engine, + syncVoteCh: make(chan core.NewVoteEvent, voteBufferForPut), + pool: pool, + engine: engine, } // Create voteSigner. @@ -69,6 +73,7 @@ func NewVoteManager(eth Backend, chainconfig *params.ChainConfig, chain *core.Bl // Subscribe to chain head event. voteManager.chainHeadSub = voteManager.chain.SubscribeChainHeadEvent(voteManager.chainHeadCh) + voteManager.syncVoteSub = voteManager.pool.SubscribeNewVoteEvent(voteManager.syncVoteCh) go voteManager.loop() @@ -164,6 +169,21 @@ func (voteManager *VoteManager) loop() { voteManager.pool.PutVote(voteMessage) votesManagerCounter.Inc(1) } + case event := <-voteManager.syncVoteCh: + voteMessage := event.Vote + if voteManager.eth.IsMining() || !voteManager.signer.UsingKey(&voteMessage.VoteAddress) { + continue + } + if err := voteManager.journal.WriteVote(voteMessage); err != nil { + log.Error("Failed to write vote into journal", "err", err) + voteJournalErrorCounter.Inc(1) + continue + } + log.Debug("vote manager synced vote", "votedBlockNumber", voteMessage.Data.TargetNumber, "votedBlockHash", voteMessage.Data.TargetHash, "voteMessageHash", voteMessage.Hash()) + votesManagerCounter.Inc(1) + case <-voteManager.syncVoteSub.Err(): + log.Debug("voteManager subscribed votes failed") + return case <-voteManager.chainHeadSub.Err(): log.Debug("voteManager subscribed chainHead failed") return diff --git a/core/vote/vote_signer.go b/core/vote/vote_signer.go index e6c8010b0b..03d89d53c7 100644 --- a/core/vote/vote_signer.go +++ b/core/vote/vote_signer.go @@ -104,3 +104,7 @@ func (signer *VoteSigner) SignVote(vote *types.VoteEnvelope) error { copy(vote.Signature[:], signature.Marshal()[:]) return nil } + +func (signer *VoteSigner) UsingKey(bLSPublicKey *types.BLSPublicKey) bool { + return types.BLSPublicKey(signer.pubKey) == *bLSPublicKey +} From bdf86f25579bdf9b1e2d6496dc78b9f6c61fdd8b Mon Sep 17 00:00:00 2001 From: NathanBSC Date: Mon, 24 Jul 2023 20:58:45 +0800 Subject: [PATCH 2/3] improve: use bytes.Equal to compare bls pubkeys --- core/vote/vote_signer.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/vote/vote_signer.go b/core/vote/vote_signer.go index 03d89d53c7..c2cda513f0 100644 --- a/core/vote/vote_signer.go +++ b/core/vote/vote_signer.go @@ -1,6 +1,7 @@ package vote import ( + "bytes" "context" "fmt" "io/ioutil" @@ -106,5 +107,5 @@ func (signer *VoteSigner) SignVote(vote *types.VoteEnvelope) error { } func (signer *VoteSigner) UsingKey(bLSPublicKey *types.BLSPublicKey) bool { - return types.BLSPublicKey(signer.pubKey) == *bLSPublicKey + return bytes.Equal(signer.pubKey[:], bLSPublicKey[:]) } From 65f5ee60825f3e8bb341545dded2cdc1f1e65c98 Mon Sep 17 00:00:00 2001 From: NathanBSC Date: Mon, 31 Jul 2023 10:50:05 +0800 Subject: [PATCH 3/3] vote: unsubscrible channels when exit loop --- core/vote/vote_manager.go | 3 +++ core/vote/vote_pool.go | 2 ++ 2 files changed, 5 insertions(+) diff --git a/core/vote/vote_manager.go b/core/vote/vote_manager.go index 62eb0d6bb3..eb99588f13 100644 --- a/core/vote/vote_manager.go +++ b/core/vote/vote_manager.go @@ -82,6 +82,9 @@ func NewVoteManager(eth Backend, chainconfig *params.ChainConfig, chain *core.Bl func (voteManager *VoteManager) loop() { log.Debug("vote manager routine loop started") + defer voteManager.chainHeadSub.Unsubscribe() + defer voteManager.syncVoteSub.Unsubscribe() + events := voteManager.eth.EventMux().Subscribe(downloader.StartEvent{}, downloader.DoneEvent{}, downloader.FailedEvent{}) defer func() { log.Debug("vote manager loop defer func occur") diff --git a/core/vote/vote_pool.go b/core/vote/vote_pool.go index 28369ed07c..bd38122e71 100644 --- a/core/vote/vote_pool.go +++ b/core/vote/vote_pool.go @@ -92,6 +92,8 @@ func NewVotePool(chainconfig *params.ChainConfig, chain *core.BlockChain, engine // loop is the vote pool's main even loop, waiting for and reacting to outside blockchain events and votes channel event. func (pool *VotePool) loop() { + defer pool.chainHeadSub.Unsubscribe() + for { select { // Handle ChainHeadEvent.