4 dbm "github.com/bytom/bytom/database/leveldb"
5 "github.com/bytom/bytom/database/storage"
6 "github.com/bytom/bytom/errors"
7 "github.com/bytom/bytom/protocol/bc"
8 "github.com/bytom/bytom/protocol/state"
9 "github.com/golang/protobuf/proto"
12 func CalcUtxoKey(hash *bc.Hash) []byte {
13 return append(UtxoKeyPrefix, hash.Bytes()...)
16 func getTransactionsUtxo(db dbm.DB, view *state.UtxoViewpoint, txs []*bc.Tx) error {
17 for _, tx := range txs {
18 for _, prevout := range tx.SpentOutputIDs {
19 if view.HasUtxo(&prevout) {
23 data := db.Get(CalcUtxoKey(&prevout))
28 var utxo storage.UtxoEntry
29 if err := proto.Unmarshal(data, &utxo); err != nil {
30 return errors.Wrap(err, "unmarshaling utxo entry")
33 view.Entries[prevout] = &utxo
40 func getUtxo(db dbm.DB, hash *bc.Hash) (*storage.UtxoEntry, error) {
41 var utxo storage.UtxoEntry
42 data := db.Get(CalcUtxoKey(hash))
44 return nil, errors.New("can't find utxo in db")
46 if err := proto.Unmarshal(data, &utxo); err != nil {
47 return nil, errors.Wrap(err, "unmarshaling utxo entry")
52 func saveUtxoView(batch dbm.Batch, view *state.UtxoViewpoint) error {
53 for key, entry := range view.Entries {
54 if entry.Spent && entry.Type != storage.CoinbaseUTXOType {
55 batch.Delete(CalcUtxoKey(&key))
59 b, err := proto.Marshal(entry)
61 return errors.Wrap(err, "marshaling utxo entry")
63 batch.Set(CalcUtxoKey(&key), b)
68 func SaveUtxoView(batch dbm.Batch, view *state.UtxoViewpoint) error {
69 return saveUtxoView(batch, view)