core: check transaction/receipt count match when reconstructing blocks (#16272)
This commit is contained in:
parent
d43ffdbf6a
commit
63687f04e4
@ -723,10 +723,13 @@ func (bc *BlockChain) Rollback(chain []common.Hash) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SetReceiptsData computes all the non-consensus fields of the receipts
|
// SetReceiptsData computes all the non-consensus fields of the receipts
|
||||||
func SetReceiptsData(config *params.ChainConfig, block *types.Block, receipts types.Receipts) {
|
func SetReceiptsData(config *params.ChainConfig, block *types.Block, receipts types.Receipts) error {
|
||||||
signer := types.MakeSigner(config, block.Number())
|
signer := types.MakeSigner(config, block.Number())
|
||||||
|
|
||||||
transactions, logIndex := block.Transactions(), uint(0)
|
transactions, logIndex := block.Transactions(), uint(0)
|
||||||
|
if len(transactions) != len(receipts) {
|
||||||
|
return errors.New("transaction and receipt count mismatch")
|
||||||
|
}
|
||||||
|
|
||||||
for j := 0; j < len(receipts); j++ {
|
for j := 0; j < len(receipts); j++ {
|
||||||
// The transaction hash can be retrieved from the transaction itself
|
// The transaction hash can be retrieved from the transaction itself
|
||||||
@ -754,6 +757,7 @@ func SetReceiptsData(config *params.ChainConfig, block *types.Block, receipts ty
|
|||||||
logIndex++
|
logIndex++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// InsertReceiptChain attempts to complete an already existing header chain with
|
// InsertReceiptChain attempts to complete an already existing header chain with
|
||||||
@ -794,7 +798,9 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// Compute all the non-consensus fields of the receipts
|
// Compute all the non-consensus fields of the receipts
|
||||||
SetReceiptsData(bc.chainConfig, block, receipts)
|
if err := SetReceiptsData(bc.chainConfig, block, receipts); err != nil {
|
||||||
|
return i, fmt.Errorf("failed to set receipts data: %v", err)
|
||||||
|
}
|
||||||
// Write all the data out into the database
|
// Write all the data out into the database
|
||||||
if err := WriteBody(batch, block.Hash(), block.NumberU64(), block.Body()); err != nil {
|
if err := WriteBody(batch, block.Hash(), block.NumberU64(), block.Body()); err != nil {
|
||||||
return i, fmt.Errorf("failed to write block body: %v", err)
|
return i, fmt.Errorf("failed to write block body: %v", err)
|
||||||
|
@ -144,7 +144,9 @@ func GetBlockReceipts(ctx context.Context, odr OdrBackend, hash common.Hash, num
|
|||||||
genesis := core.GetCanonicalHash(odr.Database(), 0)
|
genesis := core.GetCanonicalHash(odr.Database(), 0)
|
||||||
config, _ := core.GetChainConfig(odr.Database(), genesis)
|
config, _ := core.GetChainConfig(odr.Database(), genesis)
|
||||||
|
|
||||||
core.SetReceiptsData(config, block, receipts)
|
if err := core.SetReceiptsData(config, block, receipts); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
core.WriteBlockReceipts(odr.Database(), hash, number, receipts)
|
core.WriteBlockReceipts(odr.Database(), hash, number, receipts)
|
||||||
}
|
}
|
||||||
return receipts, nil
|
return receipts, nil
|
||||||
|
Loading…
Reference in New Issue
Block a user