|
|
@@ -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)
|
|
|
- var receipts types.Receipts
|
|
|
- for _, tx := range block.Transactions() {
|
|
|
- if receipt := GetReceipt(db, tx.Hash()); receipt != nil {
|
|
|
- receipts = append(receipts, receipt)
|
|
|
- }
|
|
|
+// 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
|
|
|
+ err := rlp.DecodeBytes(data, &receipts)
|
|
|
+ if err != nil {
|
|
|
+ glog.V(logger.Core).Infoln("GetReceiptse err", err)
|
|
|
+ }
|
|
|
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
|
|
|
+}
|