|
|
|
@ -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 |
|
|
|
|
} |
|
|
|
|