-
Notifications
You must be signed in to change notification settings - Fork 0
/
privacy.go
207 lines (176 loc) · 5.89 KB
/
privacy.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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
// Copyright Fuzamei Corp. 2018 All Rights Reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package types
import (
"encoding/json"
"reflect"
"github.com/bnchain/bnchain/types"
)
// PrivacyX privacy executor name
var PrivacyX = "privacy"
const (
// InvalidAction invalid action type
InvalidAction = 0
//action type for privacy
// ActionPublic2Privacy public to privacy action type
ActionPublic2Privacy = iota + 100
// ActionPrivacy2Privacy privacy to privacy action type
ActionPrivacy2Privacy
// ActionPrivacy2Public privacy to public action type
ActionPrivacy2Public
// log for privacy
// TyLogPrivacyFee privacy fee log type
TyLogPrivacyFee = 500
// TyLogPrivacyInput privacy input type
TyLogPrivacyInput = 501
// TyLogPrivacyOutput privacy output type
TyLogPrivacyOutput = 502
//SignNameOnetimeED25519 privacy name of crypto
SignNameOnetimeED25519 = "privacy.onetimeed25519"
// SignNameRing signature name ring
SignNameRing = "privacy.RingSignatue"
// OnetimeED25519 one time ED25519
OnetimeED25519 = 4
// RingBaseonED25519 ring raseon ED25519
RingBaseonED25519 = 5
// PrivacyMaxCount max mix utxo cout
PrivacyMaxCount = 16
// PrivacyTxFee privacy tx fee
PrivacyTxFee = types.Coin
)
// RescanUtxoFlag
const (
UtxoFlagNoScan int32 = 0
UtxoFlagScaning int32 = 1
UtxoFlagScanEnd int32 = 2
)
// RescanFlagMapint2string 常量字符串转换关系表
var RescanFlagMapint2string = map[int32]string{
UtxoFlagNoScan: "UtxoFlagNoScan",
UtxoFlagScaning: "UtxoFlagScaning",
UtxoFlagScanEnd: "UtxoFlagScanEnd",
}
var mapSignType2name = map[int]string{
OnetimeED25519: SignNameOnetimeED25519,
RingBaseonED25519: SignNameRing,
}
var mapSignName2Type = map[string]int{
SignNameOnetimeED25519: OnetimeED25519,
SignNameRing: RingBaseonED25519,
}
func init() {
// init executor type
types.AllowUserExec = append(types.AllowUserExec, []byte(PrivacyX))
types.RegistorExecutor(PrivacyX, NewType())
types.RegisterDappFork(PrivacyX, "Enable", 980000)
}
// PrivacyType declare PrivacyType class
type PrivacyType struct {
types.ExecTypeBase
}
// NewType create PrivacyType object
func NewType() *PrivacyType {
c := &PrivacyType{}
c.SetChild(c)
return c
}
// GetPayload get PrivacyType payload
func (t *PrivacyType) GetPayload() types.Message {
return &PrivacyAction{}
}
// GetName get PrivacyType name
func (t *PrivacyType) GetName() string {
return PrivacyX
}
// GetLogMap get PrivacyType log map
func (t *PrivacyType) GetLogMap() map[int64]*types.LogInfo {
return map[int64]*types.LogInfo{
TyLogPrivacyFee: {Ty: reflect.TypeOf(types.ReceiptExecAccountTransfer{}), Name: "LogPrivacyFee"},
TyLogPrivacyInput: {Ty: reflect.TypeOf(PrivacyInput{}), Name: "LogPrivacyInput"},
TyLogPrivacyOutput: {Ty: reflect.TypeOf(PrivacyOutput{}), Name: "LogPrivacyOutput"},
}
}
// GetTypeMap get PrivacyType type map
func (t *PrivacyType) GetTypeMap() map[string]int32 {
return map[string]int32{
"Public2Privacy": ActionPublic2Privacy,
"Privacy2Privacy": ActionPrivacy2Privacy,
"Privacy2Public": ActionPrivacy2Public,
}
}
// ActionName get PrivacyType action name
func (t PrivacyType) ActionName(tx *types.Transaction) string {
var action PrivacyAction
err := types.Decode(tx.Payload, &action)
if err != nil {
return "unknow-privacy-err"
}
return action.GetActionName()
}
// TODO 暂时不修改实现, 先完成结构的重构
// CreateTx create transaction
func (t *PrivacyType) CreateTx(action string, message json.RawMessage) (*types.Transaction, error) {
var tx *types.Transaction
return tx, nil
}
// Amount get amout
func (t *PrivacyType) Amount(tx *types.Transaction) (int64, error) {
return 0, nil
}
// GetCryptoDriver get crypto driver
func (t *PrivacyType) GetCryptoDriver(ty int) (string, error) {
if name, ok := mapSignType2name[ty]; ok {
return name, nil
}
return "", types.ErrNotSupport
}
// GetCryptoType get crypto type
func (t *PrivacyType) GetCryptoType(name string) (int, error) {
if ty, ok := mapSignName2Type[name]; ok {
return ty, nil
}
return 0, types.ErrNotSupport
}
// GetInput get action input information
func (action *PrivacyAction) GetInput() *PrivacyInput {
if action.GetTy() == ActionPrivacy2Privacy && action.GetPrivacy2Privacy() != nil {
return action.GetPrivacy2Privacy().GetInput()
} else if action.GetTy() == ActionPrivacy2Public && action.GetPrivacy2Public() != nil {
return action.GetPrivacy2Public().GetInput()
}
return nil
}
// GetOutput get action output information
func (action *PrivacyAction) GetOutput() *PrivacyOutput {
if action.GetTy() == ActionPublic2Privacy && action.GetPublic2Privacy() != nil {
return action.GetPublic2Privacy().GetOutput()
} else if action.GetTy() == ActionPrivacy2Privacy && action.GetPrivacy2Privacy() != nil {
return action.GetPrivacy2Privacy().GetOutput()
} else if action.GetTy() == ActionPrivacy2Public && action.GetPrivacy2Public() != nil {
return action.GetPrivacy2Public().GetOutput()
}
return nil
}
// GetActionName get action name
func (action *PrivacyAction) GetActionName() string {
if action.Ty == ActionPrivacy2Privacy && action.GetPrivacy2Privacy() != nil {
return "Privacy2Privacy"
} else if action.Ty == ActionPublic2Privacy && action.GetPublic2Privacy() != nil {
return "Public2Privacy"
} else if action.Ty == ActionPrivacy2Public && action.GetPrivacy2Public() != nil {
return "Privacy2Public"
}
return "unknow-privacy"
}
// GetTokenName get action token name
func (action *PrivacyAction) GetTokenName() string {
if action.GetTy() == ActionPublic2Privacy && action.GetPublic2Privacy() != nil {
return action.GetPublic2Privacy().GetTokenname()
} else if action.GetTy() == ActionPrivacy2Privacy && action.GetPrivacy2Privacy() != nil {
return action.GetPrivacy2Privacy().GetTokenname()
} else if action.GetTy() == ActionPrivacy2Public && action.GetPrivacy2Public() != nil {
return action.GetPrivacy2Public().GetTokenname()
}
return ""
}