()
| 1191 | } |
| 1192 | |
| 1193 | func (self *Server) processMsgEvent() error { |
| 1194 | select { |
| 1195 | case msg := <-self.msgC: |
| 1196 | |
| 1197 | log.Debugf("server %d process msg, block %d, type %d, current blk %d", |
| 1198 | self.Index, msg.GetBlockNum(), msg.Type(), self.GetCurrentBlockNo()) |
| 1199 | |
| 1200 | switch msg.Type() { |
| 1201 | case BlockProposalMessage: |
| 1202 | pMsg := msg.(*blockProposalMsg) |
| 1203 | |
| 1204 | if err := self.validateTxsInProposal(pMsg); err != nil { |
| 1205 | // TODO: report faulty proposal |
| 1206 | return fmt.Errorf("failed to validate tx in proposal: %s", err) |
| 1207 | } |
| 1208 | |
| 1209 | msgBlkNum := pMsg.GetBlockNum() |
| 1210 | if msgBlkNum == self.GetCurrentBlockNo() { |
| 1211 | // add proposal to block-pool |
| 1212 | if err := self.blockPool.newBlockProposal(pMsg); err != nil { |
| 1213 | if err == errDupProposal { |
| 1214 | // TODO: faulty proposer detected |
| 1215 | } |
| 1216 | log.Errorf("failed to add block proposal (%d): %s", msgBlkNum, err) |
| 1217 | return nil |
| 1218 | } |
| 1219 | |
| 1220 | if self.isProposer(msgBlkNum, pMsg.Block.getProposer()) { |
| 1221 | // check if agreed on prev-blockhash |
| 1222 | if err := self.verifyPrevBlockHash(msgBlkNum, pMsg); err != nil { |
| 1223 | // continue |
| 1224 | log.Errorf("failed verify prevBlockHash from proposer %d, blk %d", |
| 1225 | pMsg.Block.getProposer(), msgBlkNum) |
| 1226 | return nil |
| 1227 | } |
| 1228 | |
| 1229 | // stop proposal timer |
| 1230 | self.timer.CancelProposalTimer(msgBlkNum) |
| 1231 | if self.isEndorser(msgBlkNum, self.Index) { |
| 1232 | if err := self.endorseBlock(pMsg, false); err != nil { |
| 1233 | log.Errorf("failed to endorse block proposal (%d): %s", msgBlkNum, err) |
| 1234 | } |
| 1235 | } |
| 1236 | } else { |
| 1237 | if self.isProposer(msgBlkNum, self.Index) { |
| 1238 | for _, msg := range self.msgPool.GetProposalMsgs(msgBlkNum) { |
| 1239 | p := msg.(*blockProposalMsg) |
| 1240 | if p != nil && p.Block.getProposer() == self.Index { |
| 1241 | log.Infof("server %d rebroadcast proposal to %d, blk %d", |
| 1242 | self.Index, pMsg.Block.getProposer(), msgBlkNum) |
| 1243 | self.broadcast(msg) |
| 1244 | break |
| 1245 | } |
| 1246 | } |
| 1247 | } |
| 1248 | // makeProposalTimeout handles non-leader proposals |
| 1249 | } |
| 1250 | } else { |
no test coverage detected