| 376 | } |
| 377 | |
| 378 | func (c *Chain) produceBlock(now time.Time) (err error) { |
| 379 | var ( |
| 380 | priv *asymmetric.PrivateKey |
| 381 | b *types.BPBlock |
| 382 | ) |
| 383 | |
| 384 | if priv, err = kms.GetLocalPrivateKey(); err != nil { |
| 385 | return |
| 386 | } |
| 387 | if b, err = c.produceAndStoreBlock(now, priv); err != nil { |
| 388 | return |
| 389 | } |
| 390 | |
| 391 | log.WithFields(log.Fields{ |
| 392 | "block_time": b.Timestamp(), |
| 393 | "block_hash": b.BlockHash().Short(4), |
| 394 | "parent_hash": b.ParentHash().Short(4), |
| 395 | }).Debug("produced new block") |
| 396 | |
| 397 | // Broadcast to other block producers |
| 398 | c.nonblockingBroadcastBlock(b) |
| 399 | return |
| 400 | } |
| 401 | |
| 402 | // advanceNextHeight does the check and runs block producing if its my turn. |
| 403 | func (c *Chain) advanceNextHeight(now time.Time, d time.Duration) { |