@ -24,7 +24,10 @@ import (
"github.com/ethereum/go-ethereum/rlp"
)
var receiptsPre = [ ] byte ( "receipts-" )
var (
receiptsPre = [ ] byte ( "receipts-" )
blockReceiptsPre = [ ] byte ( "receipts-block-" )
)
// PutTransactions stores the transactions in the given database
func PutTransactions ( db common . Database , block * types . Block , txs types . Transactions ) {
@ -85,17 +88,40 @@ func GetReceipt(db common.Database, txHash common.Hash) *types.Receipt {
return & receipt
}
// GetReceiptFromBlock returns all receipts with the given block
func GetReceiptsFromBlock ( db common . Database , block * types . Block ) types . Receipts {
// at some point we want:
//receipts := make(types.Receipts, len(block.Transactions()))
// but since we need to support legacy, we can't (yet)
// GetBlockReceipts returns the receipts generated by the transactions
// included in block's given hash.
func GetBlockReceipts ( db common . Database , hash common . Hash ) types . Receipts {
data , _ := db . Get ( append ( blockReceiptsPre , hash [ : ] ... ) )
if len ( data ) == 0 {
return nil
}
var receipts types . Receipts
for _ , tx := range block . Transactions ( ) {
if receipt := GetReceipt ( db , tx . Hash ( ) ) ; receipt != nil {
receipts = append ( receipts , receipt )
err := rlp . DecodeBytes ( data , & receipts )
if err != nil {
glog . V ( logger . Core ) . Infoln ( "GetReceiptse err" , err )
}
return receipts
}
return receipts
// PutBlockReceipts stores the block's transactions associated receipts
// and stores them by block hash in a single slice. This is required for
// forks and chain reorgs
func PutBlockReceipts ( db common . Database , block * types . Block , receipts types . Receipts ) error {
rs := make ( [ ] * types . ReceiptForStorage , len ( receipts ) )
for i , receipt := range receipts {
rs [ i ] = ( * types . ReceiptForStorage ) ( receipt )
}
bytes , err := rlp . EncodeToBytes ( rs )
if err != nil {
return err
}
hash := block . Hash ( )
err = db . Put ( append ( blockReceiptsPre , hash [ : ] ... ) , bytes )
if err != nil {
return err
}
return nil
}