public void AddSignature(BlockSignatures signatures, BlockProposalSignatures proposalSignatures, short issuer) { BlockData <BlockType> resultBlockData = null; BlockProposalSignatures resultProposalSignatures = null; Log.Trace($"Signature revision: {signatures.Revision} issuer: {issuer}.", this); lock (_lock) { _voteKeyProposals[signatures.BlockIssuer].TryGetValue(signatures.Revision, out var proposal); if (proposal != null) { proposal.AddSignature(signatures, proposalSignatures, issuer); if (proposal.IsBlockSignatureValid && proposal.IsBlockProposalSignatureValid) { resultBlockData = new BlockData <BlockType>(proposal.Block as BlockType, proposal.Signatures); resultProposalSignatures = proposal.ProposalSignatures; } } } if (resultBlockData != null && resultProposalSignatures != null) { _voteHandler.NewBlockAvailable(this, resultBlockData, resultProposalSignatures); } }
public void AddSignature(BlockSignatures signatures, BlockProposalSignatures proposalSignatures, short issuer) { var block = Block; if (block != null) { var memeberKey = _members.GetKey(issuer); if (signatures.IsSignatureValid(memeberKey?.PublicKey, issuer, block) && proposalSignatures.IsSignatureValid(memeberKey?.PublicKey, issuer, block)) { lock (_votes) { if (Signatures == null) { Signatures = new BlockSignatures(block); } if (ProposalSignatures == null) { ProposalSignatures = new BlockProposalSignatures(block); } Signatures.AddSignature(signatures.GetSignature(issuer)); ProposalSignatures.AddSignature(proposalSignatures.GetSignature(issuer)); } } } }
async Task PhaseTimerLoop() { while (true) { try { if (_cancelToken.IsCancellationRequested) { return; } _voteHandler.BroadcastCurrentRevision(this, NextBlockId, _localRevision); AddCurrentRevision(NextBlockId, _localRevision, LocalIssuer); await Task.Delay(750, _cancelToken.Token); if (_cancelToken.IsCancellationRequested) { return; } if (!HasEnoughLegitProposals()) { var localBlock = _voteHandler.GetBlockProposal(this, LastBlock, _localRevision); if (localBlock != null) { var vote = AddProposal(NextBlockId, _localRevision, localBlock, LocalIssuer); _voteHandler.BroadcastProposal(this, NextBlockId, _localRevision, localBlock); } } if (_cancelToken.IsCancellationRequested) { return; } await Task.Delay(750, _cancelToken.Token); if (_cancelToken.IsCancellationRequested) { return; } var proposal = GetBestProposal(); if (proposal == null) { goto repeat; } var block = proposal.Block; var blockSignatures = new BlockSignatures(block); blockSignatures.AddSignature(LocalIssuer, block, LocalIssuerKey); var blockProposalSignatures = new BlockProposalSignatures(block); blockProposalSignatures.AddSignature(LocalIssuer, block, LocalIssuerKey); _voteHandler.BroadcastSignature(this, blockSignatures, blockProposalSignatures); AddSignature(blockSignatures, blockProposalSignatures, LocalIssuer); if (_cancelToken.IsCancellationRequested) { return; } await Task.Delay(750, _cancelToken.Token); if (_cancelToken.IsCancellationRequested) { return; } repeat: Log.Trace($"No approved block found for blockid {NextBlockId} with revision {_localRevision}.", this); // get the highest revision with a certain amount of approval var approvedRevision = 0; lock (_lock) { var revisions = _revisionsVoteKeys.Reverse(); foreach (var r in revisions) { if ((r.Value.Count / (float)_members.Count + float.Epsilon) >= 0.5f) { approvedRevision = r.Key; break; } } } _localRevision++; if (approvedRevision > _localRevision) { Log.Trace($"Resetting revision from {_localRevision} to {approvedRevision} for blockid {NextBlockId}.", this); } _localRevision = Math.Max(_localRevision, approvedRevision); } catch (TaskCanceledException) { } catch (Exception ex) { Log.HandleException(ex, this); } } }
protected override void Unpack(Unpacker unpacker) { base.Unpack(unpacker); BlockSignatures = new BlockSignatures(unpacker); ProposalSignatures = new BlockProposalSignatures(unpacker); }
protected override void Pack(Packer packer) { base.Pack(packer); BlockSignatures.Pack(packer); ProposalSignatures.Pack(packer); }
public CouncilBlockSignatureMessage(BlockSignatures signatures, BlockProposalSignatures proposalSignatures, ChainType chainType, int chainId, uint chainIndex, short issuer, Key issuerKey) : base(CouncilMessageTypes.BlockSignature, chainType, chainId, chainIndex, issuer, issuerKey) { BlockSignatures = signatures; ProposalSignatures = proposalSignatures; }