diff --git a/core/blockchain.go b/core/blockchain.go index 3eee75df71..50bcf3c2c7 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -1387,25 +1387,37 @@ func (bc *BlockChain) update() { // BadBlockArgs represents the entries in the list returned when bad blocks are queried. type BadBlockArgs struct { - Hash common.Hash `json:"hash"` - Header *types.Header `json:"header"` + Hash common.Hash `json:"hash"` + Header *types.Header `json:"header"` + BlockRLP string `json:"blockrlp"` } // BadBlocks returns a list of the last 'bad blocks' that the client has seen on the network func (bc *BlockChain) BadBlocks() ([]BadBlockArgs, error) { - headers := make([]BadBlockArgs, 0, bc.badBlocks.Len()) + blocks := make([]BadBlockArgs, 0, bc.badBlocks.Len()) + var ( + err error + rlpData []byte + ) for _, hash := range bc.badBlocks.Keys() { - if hdr, exist := bc.badBlocks.Peek(hash); exist { - header := hdr.(*types.Header) - headers = append(headers, BadBlockArgs{header.Hash(), header}) + if blk, exist := bc.badBlocks.Peek(hash); exist { + block := blk.(*types.Block) + rlpData, err = rlp.EncodeToBytes(block) + if err != nil { + break + } + blocks = append(blocks, BadBlockArgs{ + Hash: block.Hash(), + Header: block.Header(), + BlockRLP: fmt.Sprintf("%x", rlpData)}) } } - return headers, nil + return blocks, err } // addBadBlock adds a bad block to the bad-block LRU cache func (bc *BlockChain) addBadBlock(block *types.Block) { - bc.badBlocks.Add(block.Header().Hash(), block.Header()) + bc.badBlocks.Add(block.Hash(), block) } // reportBlock logs a bad block error.