4 dbm "github.com/tendermint/tmlibs/db"
6 "github.com/golang/protobuf/proto"
7 "github.com/vapor/database/storage"
8 "github.com/vapor/errors"
9 "github.com/vapor/protocol/bc"
10 "github.com/vapor/protocol/state"
13 const utxoPreFix = "UT:"
15 func calcUtxoKey(hash *bc.Hash) []byte {
16 return []byte(utxoPreFix + hash.String())
19 func getTransactionsUtxo(db dbm.DB, view *state.UtxoViewpoint, txs []*bc.Tx) error {
20 for _, tx := range txs {
21 for _, prevout := range tx.SpentOutputIDs {
22 if view.HasUtxo(&prevout) {
25 data := db.Get(calcUtxoKey(&prevout))
29 var utxo storage.UtxoEntry
30 if err := proto.Unmarshal(data, &utxo); err != nil {
31 return errors.Wrap(err, "unmarshaling utxo entry")
34 view.Entries[prevout] = &utxo
41 func getUtxo(db dbm.DB, hash *bc.Hash) (*storage.UtxoEntry, error) {
42 var utxo storage.UtxoEntry
43 data := db.Get(calcUtxoKey(hash))
45 return nil, errors.New("can't find utxo in db")
47 if err := proto.Unmarshal(data, &utxo); err != nil {
48 return nil, errors.Wrap(err, "unmarshaling utxo entry")
53 func saveUtxoView(batch dbm.Batch, view *state.UtxoViewpoint) error {
54 for key, entry := range view.Entries {
55 if entry.Spent && !entry.IsCoinBase && !entry.IsCliam {
56 batch.Delete(calcUtxoKey(&key))
60 b, err := proto.Marshal(entry)
62 return errors.Wrap(err, "marshaling utxo entry")
64 batch.Set(calcUtxoKey(&key), b)
69 func SaveUtxoView(batch dbm.Batch, view *state.UtxoViewpoint) error {
70 return saveUtxoView(batch, view)