github.com/sixexorg/magnetic-ring@v0.0.0-20191119090307-31705a21e419/store/mainchain/storages/receipt_store.go (about) 1 package storages 2 3 import ( 4 "bytes" 5 6 "github.com/sixexorg/magnetic-ring/common" 7 "github.com/sixexorg/magnetic-ring/common/sink" 8 "github.com/sixexorg/magnetic-ring/core/mainchain/types" 9 "github.com/sixexorg/magnetic-ring/store/db" 10 mcom "github.com/sixexorg/magnetic-ring/store/mainchain/common" 11 ) 12 13 //prototype pattern 14 type ReceiptStore struct { 15 enableCache bool 16 dbDir string 17 store *db.LevelDBStore 18 } 19 20 func NewReceiptStore(dbDir string, enableCache bool) (*ReceiptStore, error) { 21 var err error 22 store, err := db.NewLevelDBStore(dbDir) 23 if err != nil { 24 return nil, err 25 } 26 receiptStore := &ReceiptStore{ 27 dbDir: dbDir, 28 store: store, 29 enableCache: enableCache, 30 } 31 return receiptStore, nil 32 } 33 34 func (this *ReceiptStore) NewBatch() { 35 this.store.NewBatch() 36 } 37 func (this *ReceiptStore) CommitTo() error { 38 return this.store.BatchCommit() 39 } 40 func (this *ReceiptStore) BatchSave(receipts types.Receipts) { 41 for _, v := range receipts { 42 sk := sink.NewZeroCopySink(nil) 43 sk.WriteBool(v.Status) 44 sk.WriteUint64(v.GasUsed) 45 this.store.Put(this.getKey(v.TxHash), sk.Bytes()) 46 } 47 } 48 func (this *ReceiptStore) GetReceipt(txHash common.Hash) (*types.Receipt, error) { 49 key := this.getKey(txHash) 50 val, err := this.store.Get(key) 51 if err != nil { 52 return nil, err 53 } 54 receipt := &types.Receipt{} 55 buff := bytes.NewBuffer(key[1:]) 56 buff.Write(val) 57 err = receipt.Deserialize(buff) 58 if err != nil { 59 return nil, err 60 } 61 return receipt, nil 62 } 63 64 func (this *ReceiptStore) getKey(txHash common.Hash) []byte { 65 buff := make([]byte, 1+common.HashLength) 66 buff[0] = byte(mcom.ST_RECEIPT) 67 copy(buff[1:common.HashLength+1], txHash[:]) 68 return buff 69 }