diff --git a/src/Stratis.Bitcoin.Features.PoA/Voting/VotingManager.cs b/src/Stratis.Bitcoin.Features.PoA/Voting/VotingManager.cs index 72fb813e61..2a059fb4cc 100644 --- a/src/Stratis.Bitcoin.Features.PoA/Voting/VotingManager.cs +++ b/src/Stratis.Bitcoin.Features.PoA/Voting/VotingManager.cs @@ -250,7 +250,7 @@ public List GetExpiredPolls() } /// - /// Tells us whether we have already voted to boot a federation member. + /// Tells us whether we have already voted on this federation member. /// public bool AlreadyVotingFor(VoteKey voteKey, byte[] federationMemberBytes) { diff --git a/src/Stratis.Features.Collateral/CollateralPoAMiner.cs b/src/Stratis.Features.Collateral/CollateralPoAMiner.cs index 72bb32362f..bf7f59b33f 100644 --- a/src/Stratis.Features.Collateral/CollateralPoAMiner.cs +++ b/src/Stratis.Features.Collateral/CollateralPoAMiner.cs @@ -8,6 +8,7 @@ using Stratis.Bitcoin.Connection; using Stratis.Bitcoin.Consensus; using Stratis.Bitcoin.Consensus.Validators; +using Stratis.Bitcoin.EventBus.CoreEvents; using Stratis.Bitcoin.Features.BlockStore.AddressIndexing; using Stratis.Bitcoin.Features.Miner; using Stratis.Bitcoin.Features.PoA; @@ -127,25 +128,21 @@ private void OnBeforeFillBlockTemplate() pendingAddFederationMemberPolls = pendingAddFederationMemberPolls.Where(p => !p.PubKeysHexVotedInFavor.Any(v => v.PubKey == this.federationManager.CurrentFederationKey.PubKey.ToString())).ToList(); if (!pendingAddFederationMemberPolls.Any()) + { + this.logger.LogDebug("There are no outstanding add member polls for this node to vote on."); return; - - IFederationMember collateralFederationMember = this.federationManager.GetCurrentFederationMember(); - - var poaConsensusFactory = this.network.Consensus.ConsensusFactory as PoAConsensusFactory; + } foreach (Poll poll in pendingAddFederationMemberPolls) { + this.logger.LogDebug($"Attempting to cast outstanding vote on poll '{poll.Id}'."); + ChainedHeader pollStartHeader = this.chainIndexer.GetHeader(poll.PollStartBlockData.Hash); ChainedHeader votingRequestHeader = pollStartHeader.Previous; - // Already checked? - if (this.joinFederationRequestMonitor.AlreadyChecked(votingRequestHeader.HashBlock)) - continue; - ChainedHeaderBlock blockData = this.consensusManager.GetBlockData(votingRequestHeader.HashBlock); - this.joinFederationRequestMonitor.OnBlockConnected(new Bitcoin.EventBus.CoreEvents.BlockConnected( - new ChainedHeaderBlock(blockData.Block, votingRequestHeader))); + this.joinFederationRequestMonitor.OnBlockConnected(new BlockConnected(new ChainedHeaderBlock(blockData.Block, votingRequestHeader))); } return; diff --git a/src/Stratis.Features.Collateral/JoinFederationRequestMonitor.cs b/src/Stratis.Features.Collateral/JoinFederationRequestMonitor.cs index 745d4d336f..a8e83af09e 100644 --- a/src/Stratis.Features.Collateral/JoinFederationRequestMonitor.cs +++ b/src/Stratis.Features.Collateral/JoinFederationRequestMonitor.cs @@ -4,7 +4,6 @@ using System.Threading.Tasks; using NBitcoin; using NLog; -using Stratis.Bitcoin.EventBus; using Stratis.Bitcoin.EventBus.CoreEvents; using Stratis.Bitcoin.Features.PoA; using Stratis.Bitcoin.Features.PoA.Voting; @@ -18,12 +17,10 @@ public class JoinFederationRequestMonitor { private readonly ILogger logger; private readonly ISignals signals; - private SubscriptionToken blockConnectedToken; private readonly VotingManager votingManager; private readonly Network network; private readonly Network counterChainNetwork; private readonly IFederationManager federationManager; - private readonly HashSet pollsCheckedWithJoinFederationRequestMonitor; public JoinFederationRequestMonitor(VotingManager votingManager, Network network, CounterChainNetworkWrapper counterChainNetworkWrapper, IFederationManager federationManager, ISignals signals) { @@ -33,14 +30,11 @@ public JoinFederationRequestMonitor(VotingManager votingManager, Network network this.network = network; this.counterChainNetwork = counterChainNetworkWrapper.CounterChainNetwork; this.federationManager = federationManager; - this.pollsCheckedWithJoinFederationRequestMonitor = new HashSet(); } - public bool AlreadyChecked(uint256 hash) => this.pollsCheckedWithJoinFederationRequestMonitor.Contains(hash); - public Task InitializeAsync() { - this.blockConnectedToken = this.signals.Subscribe(this.OnBlockConnected); + this.signals.Subscribe(this.OnBlockConnected); return Task.CompletedTask; } @@ -56,8 +50,6 @@ public void OnBlockConnected(BlockConnected blockConnectedData) List modifiedFederation = null; - this.pollsCheckedWithJoinFederationRequestMonitor.Add(blockConnectedData.ConnectedBlock.ChainedHeader.HashBlock); - List transactions = blockConnectedData.ConnectedBlock.Block.Transactions; var encoder = new JoinFederationRequestEncoder(); @@ -78,9 +70,12 @@ public void OnBlockConnected(BlockConnected blockConnectedData) continue; // Only mining federation members vote to include new members. - modifiedFederation = modifiedFederation ?? this.votingManager.GetModifiedFederation(blockConnectedData.ConnectedBlock.ChainedHeader); + modifiedFederation ??= this.votingManager.GetModifiedFederation(blockConnectedData.ConnectedBlock.ChainedHeader); if (!modifiedFederation.Any(m => m.PubKey == this.federationManager.CurrentFederationKey.PubKey)) + { + this.logger.Debug($"Ignoring as member '{this.federationManager.CurrentFederationKey.PubKey}' is not part of the federation at block '{blockConnectedData.ConnectedBlock.ChainedHeader}'."); return; + } // Check if the collateral amount is valid. decimal collateralAmount = request.CollateralAmount.ToDecimal(MoneyUnit.BTC); @@ -89,7 +84,6 @@ public void OnBlockConnected(BlockConnected blockConnectedData) if (collateralAmount != expectedCollateralAmount) { this.logger.Debug("Ignoring voting collateral amount '{0}', when expecting '{1}'.", collateralAmount, expectedCollateralAmount); - continue; } @@ -104,7 +98,6 @@ public void OnBlockConnected(BlockConnected blockConnectedData) if (this.votingManager.AlreadyVotingFor(VoteKey.AddFederationMember, federationMemberBytes)) { this.logger.Debug("Skipping because already voted for adding '{0}'.", request.PubKey.ToHex()); - continue; }