(proposal *blockProposalMsg, forEmpty bool)
| 1956 | } |
| 1957 | |
| 1958 | func (self *Server) commitBlock(proposal *blockProposalMsg, forEmpty bool) error { |
| 1959 | // for each round, we can only commit one block |
| 1960 | if proposal.Block.getProposer() == self.Index { |
| 1961 | return nil |
| 1962 | } |
| 1963 | blkNum := proposal.GetBlockNum() |
| 1964 | if self.blockPool.committedForBlock(blkNum) { |
| 1965 | return nil |
| 1966 | } |
| 1967 | |
| 1968 | var blkHash common.Uint256 |
| 1969 | if !forEmpty { |
| 1970 | blkHash = proposal.Block.Block.Hash() |
| 1971 | } else { |
| 1972 | if proposal.Block.EmptyBlock == nil { |
| 1973 | return fmt.Errorf("blk %d proposal from %d has no empty proposal", blkNum, proposal.Block.getProposer()) |
| 1974 | } |
| 1975 | blkHash = proposal.Block.EmptyBlock.Hash() |
| 1976 | } |
| 1977 | |
| 1978 | endorses := make([]*blockEndorseMsg, 0) |
| 1979 | for _, msg := range self.msgPool.GetEndorsementsMsgs(blkNum) { |
| 1980 | if e := msg.(*blockEndorseMsg); e != nil { |
| 1981 | if bytes.Compare(blkHash[:], e.EndorsedBlockHash[:]) == 0 && e.EndorseForEmpty == forEmpty { |
| 1982 | endorses = append(endorses, e) |
| 1983 | } |
| 1984 | } |
| 1985 | } |
| 1986 | |
| 1987 | // build commit msg |
| 1988 | commitMsg, err := self.constructCommitMsg(proposal, endorses, forEmpty) |
| 1989 | if err != nil { |
| 1990 | return fmt.Errorf("failed to construct commit msg: %s", err) |
| 1991 | } |
| 1992 | |
| 1993 | // set the block as committed-block |
| 1994 | if err := self.blockPool.setProposalCommitted(proposal, forEmpty); err != nil { |
| 1995 | return fmt.Errorf("failed to set proposal as committed: %s", err) |
| 1996 | } |
| 1997 | |
| 1998 | self.processConsensusMsg(commitMsg) |
| 1999 | // if node is committer of current round |
| 2000 | if forEmpty || self.isCommitter(blkNum, self.Index) { |
| 2001 | h, _ := HashMsg(commitMsg) |
| 2002 | self.msgPool.AddMsg(commitMsg, h) |
| 2003 | log.Infof("committer %d, set block %d committed, from server %d", |
| 2004 | self.Index, blkNum, proposal.Block.getProposer()) |
| 2005 | // broadcast my commitment |
| 2006 | self.broadcast(commitMsg) |
| 2007 | return nil |
| 2008 | } |
| 2009 | |
| 2010 | // start commit timer |
| 2011 | // TODO: committing may have reached consensus before received endorsement, handle this |
| 2012 | if err := self.timer.StartCommitTimer(blkNum); err != nil { |
| 2013 | return fmt.Errorf("commitBlock startcommittimer err: %s", err) |
| 2014 | } |
| 2015 | return nil |
no test coverage detected