Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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));
                    }
                }
            }
        }
Exemplo n.º 3
0
        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;
 }