aboutsummaryrefslogtreecommitdiffstats
path: root/core/transaction_util.go
diff options
context:
space:
mode:
Diffstat (limited to 'core/transaction_util.go')
-rw-r--r--core/transaction_util.go50
1 files changed, 42 insertions, 8 deletions
diff --git a/core/transaction_util.go b/core/transaction_util.go
index bbb215d91..cb5d6c7f7 100644
--- a/core/transaction_util.go
+++ b/core/transaction_util.go
@@ -8,6 +8,9 @@ import (
"github.com/ethereum/go-ethereum/rlp"
)
+var receiptsPre = []byte("receipts-")
+
+// PutTransactions stores the transactions in the given database
func PutTransactions(db common.Database, block *types.Block, txs types.Transactions) {
for i, tx := range block.Transactions() {
rlpEnc, err := rlp.EncodeToBytes(tx)
@@ -34,18 +37,49 @@ func PutTransactions(db common.Database, block *types.Block, txs types.Transacti
}
}
-func PutReceipts(db common.Database, hash common.Hash, receipts types.Receipts) error {
- storageReceipts := make([]*types.ReceiptForStorage, len(receipts))
- for i, receipt := range receipts {
- storageReceipts[i] = (*types.ReceiptForStorage)(receipt)
+// PutReceipts stores the receipts in the current database
+func PutReceipts(db common.Database, receipts types.Receipts) error {
+ for _, receipt := range receipts {
+ storageReceipt := (*types.ReceiptForStorage)(receipt)
+ bytes, err := rlp.EncodeToBytes(storageReceipt)
+ if err != nil {
+ return err
+ }
+ err = db.Put(append(receiptsPre, receipt.TxHash[:]...), bytes)
+ if err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
+// GetReceipt returns a receipt by hash
+func GetReceipt(db common.Database, txHash common.Hash) *types.Receipt {
+ data, _ := db.Get(append(receiptsPre, txHash[:]...))
+ if len(data) == 0 {
+ return nil
}
- bytes, err := rlp.EncodeToBytes(storageReceipts)
+ var receipt types.Receipt
+ err := rlp.DecodeBytes(data, &receipt)
if err != nil {
- return err
+ glog.V(logger.Error).Infoln("GetReceipt err:", err)
}
+ return &receipt
+}
- db.Put(append(receiptsPre, hash[:]...), bytes)
+// 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)
+ }
+ }
- return nil
+ return receipts
}