4 "github.com/golang/protobuf/proto"
5 dbm "github.com/vapor/database/leveldb"
6 "github.com/vapor/database/storage"
7 "github.com/vapor/errors"
8 "github.com/vapor/protocol/bc"
9 "github.com/vapor/protocol/state"
12 const utxoPreFix = "UT:"
14 func calcUtxoKey(hash *bc.Hash) []byte {
15 return []byte(utxoPreFix + hash.String())
18 func getTransactionsUtxo(db dbm.DB, view *state.UtxoViewpoint, txs []*bc.Tx) error {
19 for _, tx := range txs {
20 for _, prevout := range tx.SpentOutputIDs {
21 if view.HasUtxo(&prevout) {
25 data := db.Get(calcUtxoKey(&prevout))
30 var utxo storage.UtxoEntry
31 if err := proto.Unmarshal(data, &utxo); err != nil {
32 return errors.Wrap(err, "unmarshaling utxo entry")
35 view.Entries[prevout] = &utxo
42 func getUtxo(db dbm.DB, hash *bc.Hash) (*storage.UtxoEntry, error) {
43 var utxo storage.UtxoEntry
44 data := db.Get(calcUtxoKey(hash))
46 return nil, errors.New("can't find utxo in db")
48 if err := proto.Unmarshal(data, &utxo); err != nil {
49 return nil, errors.Wrap(err, "unmarshaling utxo entry")
54 func saveUtxoView(batch dbm.Batch, view *state.UtxoViewpoint) error {
55 for key, entry := range view.Entries {
56 if entry.Spent && !entry.IsCoinBase {
57 batch.Delete(calcUtxoKey(&key))
61 b, err := proto.Marshal(entry)
63 return errors.Wrap(err, "marshaling utxo entry")
65 batch.Set(calcUtxoKey(&key), b)
70 func SaveUtxoView(batch dbm.Batch, view *state.UtxoViewpoint) error {
71 return saveUtxoView(batch, view)