/
exec.go
95 lines (77 loc) · 2.56 KB
/
exec.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package executor
import (
"github.com/33cn/chain33/common/address"
dbm "github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/types"
"github.com/33cn/plugin/plugin/dapp/cert/authority"
ct "github.com/33cn/plugin/plugin/dapp/cert/types"
)
func CertUserStoreKey(addr string) (key []byte) {
return append([]byte("mavl-"+ct.CertX+"-"), address.FormatAddrKey(addr)...)
}
func isAdminAddr(addr string, db dbm.KV) bool {
manageKey := types.ManageKey(ct.AdminKey)
data, err := db.Get([]byte(manageKey))
if err != nil {
clog.Error("getSuperAddr", "error", err)
return false
}
var item types.ConfigItem
err = types.Decode(data, &item)
if err != nil {
clog.Error("isSuperAddr", "Decode", data)
return false
}
for _, op := range item.GetArr().Value {
if op == addr {
return true
}
}
return false
}
func (c *Cert) Exec_New(payload *ct.CertNew, tx *types.Transaction, index int) (*types.Receipt, error) {
var logs []*types.ReceiptLog
var kv []*types.KeyValue
var receipt *types.Receipt
if !isAdminAddr(tx.From(), c.GetStateDB()) {
clog.Error("Exec_New", "error", "Exec_New need admin address")
return nil, ct.ErrPermissionDeny
}
receipt = &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}
return receipt, nil
}
func (c *Cert) Exec_Update(payload *ct.CertUpdate, tx *types.Transaction, index int) (*types.Receipt, error) {
var logs []*types.ReceiptLog
var kv []*types.KeyValue
var receipt *types.Receipt
if !isAdminAddr(tx.From(), c.GetStateDB()) {
clog.Error("Exec_Update", "error", "Exec_Update need admin address")
return nil, ct.ErrPermissionDeny
}
receipt = &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}
return receipt, nil
}
func (c *Cert) Exec_Normal(payload *ct.CertNormal, tx *types.Transaction, index int) (*types.Receipt, error) {
var logs []*types.ReceiptLog
var kv []*types.KeyValue
var receipt *types.Receipt
// 从proto中解码signature
sn, err := authority.Author.GetSnFromByte(tx.Signature)
if err != nil {
clog.Error("Exec_Normal get sn from signature failed", "error", err)
return nil, err
}
storekv := &types.KeyValue{Key: CertUserStoreKey(tx.From()), Value: sn}
c.GetStateDB().Set(storekv.Key, storekv.Value)
kv = append(kv, storekv)
receipt = &types.Receipt{Ty: types.ExecOk, KV: kv, Logs: logs}
return receipt, nil
}
func (c *Cert) Query_CertValidSNByAddr(req *ct.ReqQueryValidCertSN) (types.Message, error) {
sn, err := c.GetStateDB().Get(CertUserStoreKey(req.Addr))
if err != nil {
clog.Error("Query_CertValidSNByAddr", "error", err)
return nil, err
}
return &ct.RepQueryValidCertSN{Sn: sn}, nil
}