return nil
}
-//后一个节点的txstatus信息在哪里?
-func (c *Chain) saveSubBlock(block *types.Block, txStatus *bc.TransactionStatus) *types.Block {
+func (c *Chain) saveSubBlock(block *types.Block) *types.Block {
blockHash := block.Hash()
prevOrphans, ok := c.orphanManage.GetPrevOrphans(&blockHash)
if !ok {
bestBlock := block
for _, prevOrphan := range prevOrphans {
- orphanBlock, ok := c.orphanManage.Get(prevOrphan)
+ orphanBlock, txStatus, ok := c.orphanManage.Get(prevOrphan)
if !ok {
log.WithFields(log.Fields{"hash": prevOrphan.String()}).Warning("saveSubBlock fail to get block from orphanManage")
continue
continue
}
- if subBestBlock := c.saveSubBlock(orphanBlock, txStatus); subBestBlock.Height > bestBlock.Height {
+ if subBestBlock := c.saveSubBlock(orphanBlock); subBestBlock.Height > bestBlock.Height {
bestBlock = subBestBlock
}
}
}
if parent := c.index.GetNode(&block.PreviousBlockHash); parent == nil {
- c.orphanManage.Add(block)
+ c.orphanManage.Add(block, txStatus)
return true, nil
}
return false, err
}
- bestBlock := c.saveSubBlock(block, txStatus)
+ bestBlock := c.saveSubBlock(block)
bestBlockHash := bestBlock.Hash()
bestNode := c.index.GetNode(&bestBlockHash)
type orphanBlock struct {
*types.Block
+ *bc.TransactionStatus
expiration time.Time
}
}
// Add will add the block to OrphanManage
-func (o *OrphanManage) Add(block *types.Block) {
+func (o *OrphanManage) Add(block *types.Block, txStatus *bc.TransactionStatus) {
blockHash := block.Hash()
o.mtx.Lock()
defer o.mtx.Unlock()
return
}
- o.orphan[blockHash] = &orphanBlock{block, time.Now().Add(orphanBlockTTL)}
+ o.orphan[blockHash] = &orphanBlock{block, txStatus, time.Now().Add(orphanBlockTTL)}
o.prevOrphans[block.PreviousBlockHash] = append(o.prevOrphans[block.PreviousBlockHash], &blockHash)
log.WithFields(log.Fields{"hash": blockHash.String(), "height": block.Height}).Info("add block to orphan")
}
// Get return the orphan block by hash
-func (o *OrphanManage) Get(hash *bc.Hash) (*types.Block, bool) {
+func (o *OrphanManage) Get(hash *bc.Hash) (*types.Block, *bc.TransactionStatus, bool) {
o.mtx.RLock()
block, ok := o.orphan[*hash]
o.mtx.RUnlock()
- return block.Block, ok
+ return block.Block, block.TransactionStatus, ok
}
// GetPrevOrphans return the list of child orphans