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}"); }); } }
public void AddCommitedResult(AuthorizerCommitMsg msg) { CommitMsgs.Add(msg); if (CommitMsgs.Count() >= ProtocolSettings.Default.ConsensusNumber) { Settled = true; Done.Set(); } }
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); }
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); }