(blkNum uint32, sysTxs, userTxs []*types.Transaction, chainconfig *vconfig.ChainConfig)
| 225 | } |
| 226 | |
| 227 | func (self *Server) constructProposalMsg(blkNum uint32, sysTxs, userTxs []*types.Transaction, chainconfig *vconfig.ChainConfig) (*blockProposalMsg, error) { |
| 228 | |
| 229 | prevBlk, prevBlkHash := self.blockPool.getSealedBlock(blkNum - 1) |
| 230 | if prevBlk == nil { |
| 231 | return nil, fmt.Errorf("failed to get prevBlock (%d)", blkNum-1) |
| 232 | } |
| 233 | blocktimestamp := uint32(time.Now().Unix()) |
| 234 | if prevBlk.Block.Header.Timestamp >= blocktimestamp { |
| 235 | blocktimestamp = prevBlk.Block.Header.Timestamp + 1 |
| 236 | } |
| 237 | |
| 238 | vrfValue, vrfProof, err := computeVrf(self.account.PrivateKey, blkNum, prevBlk.getVrfValue()) |
| 239 | if err != nil { |
| 240 | return nil, fmt.Errorf("failed to get vrf and proof: %s", err) |
| 241 | } |
| 242 | |
| 243 | lastConfigBlkNum := prevBlk.Info.LastConfigBlockNum |
| 244 | if prevBlk.Info.NewChainConfig != nil { |
| 245 | lastConfigBlkNum = prevBlk.getBlockNum() |
| 246 | } |
| 247 | if chainconfig != nil { |
| 248 | lastConfigBlkNum = blkNum |
| 249 | } |
| 250 | vbftBlkInfo := &vconfig.VbftBlockInfo{ |
| 251 | Proposer: self.Index, |
| 252 | VrfValue: vrfValue, |
| 253 | VrfProof: vrfProof, |
| 254 | LastConfigBlockNum: lastConfigBlkNum, |
| 255 | NewChainConfig: chainconfig, |
| 256 | } |
| 257 | consensusPayload, err := json.Marshal(vbftBlkInfo) |
| 258 | if err != nil { |
| 259 | return nil, err |
| 260 | } |
| 261 | |
| 262 | emptyBlk, err := self.constructBlock(blkNum, prevBlkHash, sysTxs, consensusPayload, blocktimestamp) |
| 263 | if err != nil { |
| 264 | return nil, fmt.Errorf("failed to construct empty block: %s", err) |
| 265 | } |
| 266 | blk, err := self.constructBlock(blkNum, prevBlkHash, append(sysTxs, userTxs...), consensusPayload, blocktimestamp) |
| 267 | if err != nil { |
| 268 | return nil, fmt.Errorf("failed to constuct blk: %s", err) |
| 269 | } |
| 270 | merkleRoot, err := self.blockPool.getExecMerkleRoot(blkNum - 1) |
| 271 | if err != nil { |
| 272 | return nil, fmt.Errorf("failed to GetExecMerkleRoot: %s,blkNum:%d", err, (blkNum - 1)) |
| 273 | } |
| 274 | |
| 275 | msg := &blockProposalMsg{ |
| 276 | Block: &Block{ |
| 277 | Block: blk, |
| 278 | EmptyBlock: emptyBlk, |
| 279 | Info: vbftBlkInfo, |
| 280 | PrevBlockMerkleRoot: merkleRoot, |
| 281 | }, |
| 282 | } |
| 283 | |
| 284 | return msg, nil |
no test coverage detected