void OnBlockDisconnected(BlockDisconnected blockDisconnected) { RemoveInvalidTransactionsAsync(blockDisconnected.DisconnectedBlock.Block).ConfigureAwait(false).GetAwaiter() .GetResult(); AddBackToMempoolAsync(blockDisconnected.DisconnectedBlock.Block).ConfigureAwait(false).GetAwaiter() .GetResult(); }
private void OnBlockDisconnected(BlockDisconnected blockDisconnected) { ChainedHeaderBlock chBlock = blockDisconnected.DisconnectedBlock; lock (this.locker) { foreach (Poll poll in this.polls.Where(x => !x.IsPending && x.PollExecutedBlockData?.Hash == chBlock.ChainedHeader.HashBlock).ToList()) { this.logger.LogDebug("Reverting poll execution '{0}'.", poll); this.pollResultExecutor.RevertChange(poll.VotingData); poll.PollExecutedBlockData = null; this.pollsRepository.UpdatePoll(poll); } } byte[] rawVotingData = this.votingDataEncoder.ExtractRawVotingData(chBlock.Block.Transactions[0]); if (rawVotingData == null) { this.logger.LogTrace("(-)[NO_VOTING_DATA]"); return; } List <VotingData> votingDataList = this.votingDataEncoder.Decode(rawVotingData); votingDataList.Reverse(); lock (this.locker) { foreach (VotingData votingData in votingDataList) { // Poll that was finished in the block being disconnected. Poll targetPoll = this.polls.Single(x => x.VotingData == votingData); this.logger.LogDebug("Reverting poll voting in favor: '{0}'.", targetPoll); if (targetPoll.PollVotedInFavorBlockData == new HashHeightPair(chBlock.ChainedHeader)) { targetPoll.PollVotedInFavorBlockData = null; this.pollsRepository.UpdatePoll(targetPoll); } // Pub key of a fed member that created voting data. string fedMemberKeyHex = this.slotsManager.GetPubKeyForTimestamp(chBlock.Block.Header.Time).ToHex(); targetPoll.PubKeysHexVotedInFavor.Remove(fedMemberKeyHex); if (targetPoll.PubKeysHexVotedInFavor.Count == 0) { this.polls.Remove(targetPoll); this.pollsRepository.RemovePolls(targetPoll.Id); this.logger.LogDebug("Poll with Id {0} was removed.", targetPoll.Id); } } } }
private void OnBlockDisconnected(BlockDisconnected blockDisconnected) { this.PollsRepository.Synchronous(() => { if (this.Synchronize(blockDisconnected.DisconnectedBlock.ChainedHeader)) { this.PollsRepository.WithTransaction(transaction => { this.UnProcessBlock(transaction, blockDisconnected.DisconnectedBlock); transaction.Commit(); }); } }); }
private void OnBlockDisconnected(BlockDisconnected blockDisconnected) { ChainedHeaderBlock chBlock = blockDisconnected.DisconnectedBlock; lock (this.locker) { foreach (Poll poll in this.polls.Where(x => !x.IsPending && x.PollExecutedBlockData?.Hash == chBlock.ChainedHeader.HashBlock).ToList()) { this.logger.Debug("Reverting poll execution '{0}'.", poll); this.pollResultExecutor.RevertChange(poll.VotingData); poll.PollExecutedBlockData = null; this.pollsRepository.UpdatePoll(poll); } } byte[] rawVotingData = this.votingDataEncoder.ExtractRawVotingData(chBlock.Block.Transactions[0]); if (rawVotingData == null) { this.logger.Trace("(-)[NO_VOTING_DATA]"); return; } List <VotingData> votingDataList = this.votingDataEncoder.Decode(rawVotingData); votingDataList.Reverse(); lock (this.locker) { foreach (VotingData votingData in votingDataList) { if (this.IsVotingOnMultisigMember(votingData)) { continue; } // If the poll is pending, that's the one we want. There should be maximum 1 of these. Poll targetPoll = this.polls.SingleOrDefault(x => x.VotingData == votingData && x.IsPending); // Otherwise, get the most recent poll. There could currently be unlimited of these, though they're harmless. if (targetPoll == null) { targetPoll = this.polls.Last(x => x.VotingData == votingData); } this.logger.Debug("Reverting poll voting in favor: '{0}'.", targetPoll); if (targetPoll.PollVotedInFavorBlockData == new HashHeightPair(chBlock.ChainedHeader)) { targetPoll.PollVotedInFavorBlockData = null; this.pollsRepository.UpdatePoll(targetPoll); } // Pub key of a fed member that created voting data. string fedMemberKeyHex = this.federationHistory.GetFederationMemberForBlock(chBlock.ChainedHeader).PubKey.ToHex(); targetPoll.PubKeysHexVotedInFavor.Remove(fedMemberKeyHex); if (targetPoll.PubKeysHexVotedInFavor.Count == 0) { this.polls.Remove(targetPoll); this.pollsRepository.RemovePolls(targetPoll.Id); this.logger.Debug("Poll with Id {0} was removed.", targetPoll.Id); } } } }
private void OnBlockDisconnected(BlockDisconnected blockDisconnected) { this.AddBackToMempoolAsync(blockDisconnected.DisconnectedBlock.Block).ConfigureAwait(false).GetAwaiter().GetResult(); }