private void OnCommit(AuthorizerCommitMsg item)
        {
            _log.LogInformation($"Consensus: OnCommit Called: BlockUIndex: {item.BlockIndex}");

            if (_activeConsensus.ContainsKey(item.BlockHash))
            {
                var state = _activeConsensus[item.BlockHash];
                state.AddCommitedResult(item);

                OnNodeActive(item.From);        // track latest activities via billboard
            }
            else
            {
                // maybe outof ordered message
                List <SourceSignedMessage> msgs;
                if (_outOfOrderedMessages.ContainsKey(item.BlockHash))
                {
                    msgs = _outOfOrderedMessages[item.BlockHash];
                }
                else
                {
                    msgs = new List <SourceSignedMessage>();
                    msgs.Add(item);
                }

                msgs.Add(item);
            }
        }
        private void CheckAuthorizedAllOk(AuthState state)
        {
            if (state.GetIsAuthoringSuccess(_board))
            {
                if (state.Saving)
                {
                    return;
                }

                state.Saving = true;
                _            = Task.Run(() =>
                {
                    // do commit
                    var block            = state.InputMsg.Block;
                    block.Authorizations = state.OutputMsgs.Select(a => a.AuthSign).ToList();

                    if (block.BlockType != BlockTypes.Consolidation)
                    {
                        // pickup UIndex
                        try
                        {
                            block.UIndex = state.ConsensusUIndex;
                        }
                        catch (Exception ex)
                        {
                            _log.LogError("Can't get UIndex. System fail: " + ex.Message);
                            return;
                        }
                    }

                    if (block.UIndex != _UIndexSeed - 1)
                    {
                        // local node out of sync
                        _UIndexSeed = block.UIndex + 1;
                        Mode        = ConsensusWorkingMode.OutofSyncWaiting;
                        LyraSystem.Singleton.TheBlockchain.Tell(new BlockChain.NeedSync {
                            ToUIndex = block.UIndex
                        });
                    }

                    block.UHash = SignableObject.CalculateHash($"{block.UIndex}|{block.Index}|{block.Hash}");

                    BlockChain.Singleton.AddBlock(block);

                    var msg = new AuthorizerCommitMsg
                    {
                        From       = NodeService.Instance.PosWallet.AccountId,
                        MsgType    = ChatMessageType.AuthorizerCommit,
                        BlockHash  = state.InputMsg.Block.Hash,
                        BlockIndex = block.UIndex,
                        Commited   = true
                    };

                    state.AddCommitedResult(msg);
                    Send2P2pNetwork(msg);

                    _log.LogInformation($"Consensus: OnPrepare Commited: BlockUIndex: {msg.BlockHash}");
                });
            }
        }
예제 #3
0
 public void AddCommitedResult(AuthorizerCommitMsg msg)
 {
     CommitMsgs.Add(msg);
     if (CommitMsgs.Count() >= ProtocolSettings.Default.ConsensusNumber)
     {
         Settled = true;
         Done.Set();
     }
 }
예제 #4
0
        public bool AddCommitedResult(AuthorizerCommitMsg msg)
        {
            //_log.LogInformation($"Commit msg from: {msg.From.Shorten()}");
            // check repeated message
            if (CommitMsgs.ToList().Any(a => a.From == msg.From))
            {
                return(false);
            }

            // check network state
            // !! only accept from svcBlock ( or associated view )
            // check for valid validators
            if (!CheckSenderValid(msg.From))
            {
                return(false);
            }

            CommitMsgs.Add(msg);

            return(true);
        }
예제 #5
0
        public bool AddCommitedResult(AuthorizerCommitMsg msg)
        {
            _log.LogInformation($"Commit msg from: {msg.From}");
            // check repeated message
            if (CommitMsgs.ToList().Any(a => a.From == msg.From))
            {
                return(false);
            }

            CommitMsgs.Add(msg);

            var CommitMsgList = CommitMsgs.ToList();

            if (CommitMsgList.Count(a => a.Consensus == ConsensusResult.Yay) >= ProtocolSettings.Default.ConsensusWinNumber ||
                CommitMsgList.Count(a => a.Consensus == ConsensusResult.Nay) >= ProtocolSettings.Default.ConsensusWinNumber)
            {
                _log.LogInformation($"Committed: {ConsensusUIndex}/{InputMsg.Block.Index} Yay: {CommitMsgs.Count(a => a.Consensus == ConsensusResult.Yay)} of {CommitMsgs.Select(a => a.From.Shorten()).Aggregate((x, y) => x + ", " + y)}");
                Settled = true;
                Done.Set();
            }
            return(true);
        }