(msg *blockProposalMsg)
| 1085 | } |
| 1086 | |
| 1087 | func (self *Server) processProposalMsg(msg *blockProposalMsg) { |
| 1088 | msgBlkNum := msg.GetBlockNum() |
| 1089 | blk, prevBlkHash := self.blockPool.getSealedBlock(msg.GetBlockNum() - 1) |
| 1090 | if blk == nil { |
| 1091 | log.Errorf("BlockProposal failed to GetPreBlock:%d", (msg.GetBlockNum() - 1)) |
| 1092 | return |
| 1093 | } |
| 1094 | |
| 1095 | msgPrevBlkHash := msg.Block.getPrevBlockHash() |
| 1096 | if prevBlkHash != msgPrevBlkHash { |
| 1097 | log.Errorf("BlockPrposalMessage check blocknum:%d,prevhash:%s,msg prevhash:%s", msg.GetBlockNum(), prevBlkHash.ToHexString(), msgPrevBlkHash.ToHexString()) |
| 1098 | self.msgPool.DropMsg(msg) |
| 1099 | return |
| 1100 | } |
| 1101 | if self.LastConfigBlockNum != math.MaxUint32 && blk.Info.LastConfigBlockNum != self.LastConfigBlockNum { |
| 1102 | log.Errorf("BlockPrposalMessage check LastConfigBlockNum blocknum:%d,prvLastConfigBlockNum:%d,self LastConfigBlockNum:%d", msg.GetBlockNum(), blk.Info.LastConfigBlockNum, self.LastConfigBlockNum) |
| 1103 | return |
| 1104 | } |
| 1105 | merkleRoot, err := self.blockPool.getExecMerkleRoot(msgBlkNum - 1) |
| 1106 | if err != nil { |
| 1107 | log.Errorf("failed to GetExecMerkleRoot: %s,blkNum:%d", err, (msgBlkNum - 1)) |
| 1108 | return |
| 1109 | } |
| 1110 | if msg.Block.getPrevBlockMerkleRoot() != merkleRoot { |
| 1111 | self.msgPool.DropMsg(msg) |
| 1112 | msgMerkleRoot := msg.Block.getPrevBlockMerkleRoot() |
| 1113 | log.Errorf("BlockPrposalMessage check MerkleRoot blocknum:%d,msg MerkleRoot:%s,self MerkleRoot:%s", msg.GetBlockNum(), msgMerkleRoot.ToHexString(), merkleRoot.ToHexString()) |
| 1114 | return |
| 1115 | } |
| 1116 | cfg := vconfig.ChainConfig{} |
| 1117 | if blk.getNewChainConfig() != nil { |
| 1118 | cfg = *blk.getNewChainConfig() |
| 1119 | if cfg.Hash() != self.config.Hash() { |
| 1120 | log.Errorf("processProposalMsg chainconfig unqeual to blockinfo cfg,view:(%d,%d),N:(%d,%d),C:(%d,%d),BlockMsgDelay:(%d,%d),HashMsgDelay:(%d,%d),PeerHandshakeTimeout:(%d,%d),posTable:(%v,%v),MaxBlockChangeView:(%d,%d)", cfg.View, self.config.View, cfg.N, self.config.N, cfg.C, |
| 1121 | self.config.C, cfg.BlockMsgDelay, self.config.BlockMsgDelay, cfg.HashMsgDelay, self.config.HashMsgDelay, cfg.PeerHandshakeTimeout, self.config.PeerHandshakeTimeout, cfg.PosTable, self.config.PosTable, cfg.MaxBlockChangeView, self.config.MaxBlockChangeView) |
| 1122 | self.msgPool.DropMsg(msg) |
| 1123 | return |
| 1124 | } |
| 1125 | } |
| 1126 | |
| 1127 | prevBlockTimestamp := blk.Block.Header.Timestamp |
| 1128 | currentBlockTimestamp := msg.Block.Block.Header.Timestamp |
| 1129 | if currentBlockTimestamp <= prevBlockTimestamp || currentBlockTimestamp > uint32(time.Now().Add(time.Minute*10).Unix()) { |
| 1130 | log.Errorf("BlockPrposalMessage check blocknum:%d,prevBlockTimestamp:%d,currentBlockTimestamp:%d", msg.GetBlockNum(), prevBlockTimestamp, currentBlockTimestamp) |
| 1131 | self.msgPool.DropMsg(msg) |
| 1132 | return |
| 1133 | } |
| 1134 | |
| 1135 | // verify VRF |
| 1136 | proposerPk := self.peerPool.GetPeerPubKey(msg.Block.getProposer()) |
| 1137 | if proposerPk == nil { |
| 1138 | log.Errorf("server %d failed to get proposer %d pk of block %d", |
| 1139 | self.Index, msg.Block.getProposer(), msgBlkNum) |
| 1140 | self.msgPool.DropMsg(msg) |
| 1141 | return |
| 1142 | } |
| 1143 | if err := verifyVrf(proposerPk, msgBlkNum, blk.getVrfValue(), msg.Block.getVrfValue(), msg.Block.getVrfProof()); err != nil { |
| 1144 | log.Errorf("server %d failed to verify vrf of block %d proposal from %d", |
no test coverage detected