OSDN Git Service

apply_vote_to_utxo_view (#1991)
[bytom/bytom.git] / database / contract_view.go
1 package database
2
3 import (
4         "bytes"
5
6         dbm "github.com/bytom/bytom/database/leveldb"
7         "github.com/bytom/bytom/errors"
8         "github.com/bytom/bytom/protocol/state"
9 )
10
11 // ContractPrefix contract prefix
12 var ContractPrefix = []byte("C:")
13
14 // CalcContractKey calculate contract key
15 func CalcContractKey(hash [32]byte) []byte {
16         return append(ContractPrefix, hash[:]...)
17 }
18
19 func saveContractView(db dbm.DB, batch dbm.Batch, view *state.ContractViewpoint) error {
20         for hash, value := range view.AttachEntries {
21                 data := db.Get(CalcContractKey(hash))
22                 // contract is not exist
23                 if data == nil {
24                         // key:"c:sha256(program.Code)" value:"txID+program.Code"
25                         batch.Set(CalcContractKey(hash), value)
26                 }
27                 // contract is deleted in the same batch
28                 if v, ok := view.DetachEntries[hash]; ok && bytes.Equal(data, v) {
29                         batch.Set(CalcContractKey(hash), value)
30                 }
31         }
32         return nil
33 }
34
35 func deleteContractView(db dbm.DB, batch dbm.Batch, view *state.ContractViewpoint) error {
36         for hash, value := range view.DetachEntries {
37                 // rollback is forbidden if contract register transaction id is different
38                 if bytes.Equal(db.Get(CalcContractKey(hash)), value) {
39                         batch.Delete(CalcContractKey(hash))
40                 }
41         }
42         return nil
43 }
44
45 func getContract(db dbm.DB, hash [32]byte) ([]byte, error) {
46         data := db.Get(CalcContractKey(hash))
47         if data == nil {
48                 return nil, errors.New("can't find the registered contract by contract hash")
49         }
50
51         // data:"txID+program.Code" len(txID) == 32
52         if len(data) <= 32 {
53                 return nil, errors.New("registered contract format error")
54         }
55
56         return data[32:], nil
57 }