6 dbm "github.com/bytom/bytom/database/leveldb"
7 "github.com/bytom/bytom/errors"
8 "github.com/bytom/bytom/protocol/state"
11 // ContractPrefix contract prefix
12 var ContractPrefix = []byte("C:")
14 // CalcContractKey calculate contract key
15 func CalcContractKey(hash [32]byte) []byte {
16 return append(ContractPrefix, hash[:]...)
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
24 // key:"c:sha256(program.Code)" value:"txID+program.Code"
25 batch.Set(CalcContractKey(hash), value)
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)
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))
45 func getContract(db dbm.DB, hash [32]byte) ([]byte, error) {
46 data := db.Get(CalcContractKey(hash))
48 return nil, errors.New("can't find the registered contract by contract hash")
51 // data:"txID+program.Code" len(txID) == 32
53 return nil, errors.New("registered contract format error")