Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
plugin
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
link33
plugin
Commits
9b794a19
Commit
9b794a19
authored
Feb 23, 2021
by
madengji
Committed by
vipwzw
Sep 18, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add unfrozen status
parent
b4a6fb77
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
196 additions
and
277 deletions
+196
-277
mix.go
plugin/dapp/mix/commands/mix.go
+0
-0
mix.md
plugin/dapp/mix/mix.md
+7
-0
mix.proto
plugin/dapp/mix/proto/mix.proto
+11
-16
rpc.go
plugin/dapp/mix/rpc/rpc.go
+3
-40
mix.pb.go
plugin/dapp/mix/types/mix.pb.go
+0
-0
exec.go
plugin/dapp/mix/wallet/exec.go
+15
-31
mix.go
plugin/dapp/mix/wallet/mix.go
+45
-54
mixbizdb.go
plugin/dapp/mix/wallet/mixbizdb.go
+31
-15
mixbiztable.go
plugin/dapp/mix/wallet/mixbiztable.go
+3
-0
mixstore.go
plugin/dapp/mix/wallet/mixstore.go
+0
-51
txauth.go
plugin/dapp/mix/wallet/txauth.go
+13
-11
txdeposit.go
plugin/dapp/mix/wallet/txdeposit.go
+17
-12
txtransfer.go
plugin/dapp/mix/wallet/txtransfer.go
+20
-17
txwithdraw.go
plugin/dapp/mix/wallet/txwithdraw.go
+17
-14
util.go
plugin/dapp/mix/wallet/util.go
+14
-16
No files found.
plugin/dapp/mix/commands/mix.go
View file @
9b794a19
This diff is collapsed.
Click to expand it.
plugin/dapp/mix/mix.md
0 → 100644
View file @
9b794a19
# mix 执行器 零知识证明隐私
## 场景
1.
存款,公转私,支持一次存入多个目标账户,目标账户隐藏,转账金额公开(需要验证金额足够)
1.
转账,私对私,花费某个支票,转账给目标账户,多出部分找零给自己,目标账户和金额全隐藏
1.
提款,私对公,花费某些支票,统一转出给签名地址,转账金额公开(验证),签名地址和支票账户不一定对应,也就是任何知道支票密码的人都可以提款
plugin/dapp/mix/proto/mix.proto
View file @
9b794a19
...
...
@@ -397,22 +397,19 @@ message PaymentKeysReq{
enum
NoteStatus
{
UNDEF
=
0
;
VALID
=
1
;
//已授权可使用
FROZEN
=
2
;
//未授权
USED
=
3
;
//已使用
VALID
=
1
;
//已授权可使用 相对消费者
USED
=
2
;
//已使用
FROZEN
=
3
;
//未授权
UNFROZEN
=
4
;
//已授权 相对授权者
}
enum
Role
{
SPENDER
=
0
;
RETURNER
=
1
;
AUTHORIZER
=
2
;
}
message
WalletIndexInfo
{
message
WalletNoteInfo
{
string
noteHash
=
1
;
string
nullifier
=
2
;
string
authorizeSpendHash
=
3
;
Role
role
=
4
;
string
authorizeHash
=
4
;
string
account
=
5
;
//账户地址
NoteStatus
status
=
6
;
SecretData
secret
=
7
;
...
...
@@ -420,7 +417,7 @@ message WalletIndexInfo {
}
message
WalletDbMixInfo
{
Wallet
IndexInfo
info
=
1
;
Wallet
NoteInfo
info
=
1
;
string
txIndex
=
2
;
}
...
...
@@ -429,19 +426,17 @@ message WalletMixIndexReq {
string
noteHash
=
1
;
string
nullifier
=
2
;
string
authorizeSpendHash
=
3
;
string
authorizeHash
=
4
;
string
account
=
5
;
int32
status
=
6
;
int32
count
=
7
;
int32
direction
=
8
;
}
message
Wallet
Index
Resp
{
repeated
Wallet
Index
Info
notes
=
1
;
message
Wallet
Note
Resp
{
repeated
Wallet
Note
Info
notes
=
1
;
}
message
WalletReqAddrs
{
repeated
string
addrs
=
1
;
}
message
WalletEnablePrivacyRst
{
string
addr
=
1
;
...
...
plugin/dapp/mix/rpc/rpc.go
View file @
9b794a19
...
...
@@ -65,13 +65,13 @@ func (c *Jrpc) ShowAccountPrivacyInfo(in *types.ReqString, result *json.RawMessa
/////////////////privacy///////////////
// ShowPrivacyAccountSpend display spend privacy account for json rpc
func
(
c
*
Jrpc
)
ShowAccountNoteInfo
(
in
*
types
.
ReqAddrs
,
result
*
json
.
RawMessage
)
error
{
if
0
==
len
(
in
.
Addrs
)
{
func
(
c
*
Jrpc
)
ShowAccountNoteInfo
(
in
*
mixTy
.
WalletMixIndexReq
,
result
*
json
.
RawMessage
)
error
{
if
in
==
nil
{
return
types
.
ErrInvalidParam
}
reply
,
err
:=
c
.
cli
.
ExecWalletFunc
(
mixTy
.
MixX
,
"ShowAccountNoteInfo"
,
in
)
if
err
!=
nil
{
log
.
Info
(
"ShowPrivacyAccountSpend
"
,
"return err info"
,
err
)
log
.
Error
(
"ShowAccountNoteInfo
"
,
"return err info"
,
err
)
return
err
}
*
result
,
err
=
types
.
PBToJSON
(
reply
)
...
...
@@ -134,43 +134,6 @@ func (c *Jrpc) DecryptSecretData(in *mixTy.DecryptSecretData, result *json.RawMe
return
err
}
//
//func (c *Jrpc) DepositProof(in *mixTy.DepositTxReq, result *json.RawMessage) error {
// reply, err := c.cli.ExecWalletFunc(mixTy.MixX, "DepositProof", in)
// if err != nil {
// return err
// }
// *result, err = types.PBToJSON(reply)
// return err
//}
//
//func (c *Jrpc) AuthProof(in *mixTy.AuthTxReq, result *json.RawMessage) error {
// reply, err := c.cli.ExecWalletFunc(mixTy.MixX, "AuthProof", in)
// if err != nil {
// return err
// }
// *result, err = types.PBToJSON(reply)
// return err
//}
//
//func (c *Jrpc) TransferProof(in *mixTy.TransferTxReq, result *json.RawMessage) error {
// reply, err := c.cli.ExecWalletFunc(mixTy.MixX, "TransferProof", in)
// if err != nil {
// return err
// }
// *result, err = types.PBToJSON(reply)
// return err
//}
//
//func (c *Jrpc) WithdrawProof(in *mixTy.WithdrawTxReq, result *json.RawMessage) error {
// reply, err := c.cli.ExecWalletFunc(mixTy.MixX, "WithdrawProof", in)
// if err != nil {
// return err
// }
// *result, err = types.PBToJSON(reply)
// return err
//}
func
(
c
*
Jrpc
)
CreateRawTransaction
(
in
*
mixTy
.
CreateRawTxReq
,
result
*
interface
{})
error
{
reply
,
err
:=
c
.
cli
.
ExecWalletFunc
(
mixTy
.
MixX
,
"CreateRawTransaction"
,
in
)
if
err
!=
nil
{
...
...
plugin/dapp/mix/types/mix.pb.go
View file @
9b794a19
This diff is collapsed.
Click to expand it.
plugin/dapp/mix/wallet/exec.go
View file @
9b794a19
...
...
@@ -11,7 +11,7 @@ import (
"github.com/pkg/errors"
)
func
(
p
olicy
*
mixPolicy
)
On_ShowAccountPrivacyInfo
(
req
*
mixTy
.
PaymentKeysReq
)
(
types
.
Message
,
error
)
{
func
(
p
*
mixPolicy
)
On_ShowAccountPrivacyInfo
(
req
*
mixTy
.
PaymentKeysReq
)
(
types
.
Message
,
error
)
{
if
len
(
req
.
Addr
)
==
0
&&
len
(
req
.
PrivKey
)
==
0
{
return
nil
,
errors
.
Wrapf
(
types
.
ErrInvalidParam
,
"addr or privkey need be set"
)
}
...
...
@@ -32,7 +32,7 @@ func (policy *mixPolicy) On_ShowAccountPrivacyInfo(req *mixTy.PaymentKeysReq) (t
}
//通过account 从钱包获取
keys
,
err
:=
p
olicy
.
getAccountPrivacyKey
(
req
.
Addr
)
keys
,
err
:=
p
.
getAccountPrivacyKey
(
req
.
Addr
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"get account =%s privacy key"
,
req
.
Addr
)
}
...
...
@@ -43,56 +43,40 @@ func (policy *mixPolicy) On_ShowAccountPrivacyInfo(req *mixTy.PaymentKeysReq) (t
return
keys
,
nil
}
func
(
p
olicy
*
mixPolicy
)
On_ShowAccountNoteInfo
(
req
*
types
.
ReqAddrs
)
(
types
.
Message
,
error
)
{
return
p
olicy
.
showAccountNoteInfo
(
req
.
Addrs
)
func
(
p
*
mixPolicy
)
On_ShowAccountNoteInfo
(
req
*
mixTy
.
WalletMixIndexReq
)
(
types
.
Message
,
error
)
{
return
p
.
showAccountNoteInfo
(
req
)
}
func
(
p
olicy
*
mixPolicy
)
On_GetRescanStatus
(
in
*
types
.
ReqNil
)
(
types
.
Message
,
error
)
{
return
&
types
.
ReqString
{
Data
:
p
olicy
.
getRescanStatus
()},
nil
func
(
p
*
mixPolicy
)
On_GetRescanStatus
(
in
*
types
.
ReqNil
)
(
types
.
Message
,
error
)
{
return
&
types
.
ReqString
{
Data
:
p
.
getRescanStatus
()},
nil
}
//重新扫描所有notes
func
(
p
olicy
*
mixPolicy
)
On_RescanNotes
(
in
*
types
.
ReqNil
)
(
types
.
Message
,
error
)
{
err
:=
p
olicy
.
tryRescanNotes
()
func
(
p
*
mixPolicy
)
On_RescanNotes
(
in
*
types
.
ReqNil
)
(
types
.
Message
,
error
)
{
err
:=
p
.
tryRescanNotes
()
if
err
!=
nil
{
bizlog
.
Error
(
"rescanUTXOs"
,
"err"
,
err
.
Error
())
}
return
&
types
.
ReqString
{
Data
:
"ok"
},
err
}
func
(
p
olicy
*
mixPolicy
)
On_EnablePrivacy
(
req
*
types
.
ReqAddrs
)
(
types
.
Message
,
error
)
{
return
p
olicy
.
enablePrivacy
(
req
.
Addrs
)
func
(
p
*
mixPolicy
)
On_EnablePrivacy
(
req
*
types
.
ReqAddrs
)
(
types
.
Message
,
error
)
{
return
p
.
enablePrivacy
(
req
.
Addrs
)
}
//func (p
olicy
*mixPolicy) On_EncodeSecretData(req *mixTy.SecretData) (types.Message, error) {
//func (p *mixPolicy) On_EncodeSecretData(req *mixTy.SecretData) (types.Message, error) {
// return encodeSecretData(req)
//}
func
(
p
olicy
*
mixPolicy
)
On_EncryptSecretData
(
req
*
mixTy
.
EncryptSecretData
)
(
types
.
Message
,
error
)
{
func
(
p
*
mixPolicy
)
On_EncryptSecretData
(
req
*
mixTy
.
EncryptSecretData
)
(
types
.
Message
,
error
)
{
return
encryptSecretData
(
req
)
}
func
(
p
olicy
*
mixPolicy
)
On_DecryptSecretData
(
req
*
mixTy
.
DecryptSecretData
)
(
types
.
Message
,
error
)
{
func
(
p
*
mixPolicy
)
On_DecryptSecretData
(
req
*
mixTy
.
DecryptSecretData
)
(
types
.
Message
,
error
)
{
return
decryptSecretData
(
req
)
}
//func (policy *mixPolicy) On_DepositProof(req *mixTy.CreateRawTxReq) (types.Message, error) {
// return policy.createDepositTx(req)
//}
//
//func (policy *mixPolicy) On_WithdrawProof(req *mixTy.CreateRawTxReq) (types.Message, error) {
// return policy.createWithdrawTx(req)
//}
//
//func (policy *mixPolicy) On_AuthProof(req *mixTy.CreateRawTxReq) (types.Message, error) {
// return policy.createAuthTx(req)
//}
//
//func (policy *mixPolicy) On_TransferProof(req *mixTy.CreateRawTxReq) (types.Message, error) {
// return policy.createTransferTx(req)
//}
func
(
policy
*
mixPolicy
)
On_CreateRawTransaction
(
req
*
mixTy
.
CreateRawTxReq
)
(
types
.
Message
,
error
)
{
return
policy
.
createRawTx
(
req
)
func
(
p
*
mixPolicy
)
On_CreateRawTransaction
(
req
*
mixTy
.
CreateRawTxReq
)
(
types
.
Message
,
error
)
{
return
p
.
createRawTx
(
req
)
}
plugin/dapp/mix/wallet/mix.go
View file @
9b794a19
...
...
@@ -147,9 +147,9 @@ func mimcHashCalc(sum []byte) []byte {
return
mimcbn256
.
Sum
(
"seed"
,
sum
)
}
func
(
p
olicy
*
mixPolicy
)
getPrivKeyByAddr
(
addr
string
)
(
crypto
.
PrivKey
,
error
)
{
func
(
p
*
mixPolicy
)
getPrivKeyByAddr
(
addr
string
)
(
crypto
.
PrivKey
,
error
)
{
//获取指定地址在钱包里的账户信息
Accountstor
,
err
:=
p
olicy
.
store
.
GetAccountByAddr
(
addr
)
Accountstor
,
err
:=
p
.
store
.
GetAccountByAddr
(
addr
)
if
err
!=
nil
{
bizlog
.
Error
(
"ProcSendToAddress"
,
"GetAccountByAddr err:"
,
err
)
return
nil
,
err
...
...
@@ -161,7 +161,7 @@ func (policy *mixPolicy) getPrivKeyByAddr(addr string) (crypto.PrivKey, error) {
bizlog
.
Error
(
"ProcSendToAddress"
,
"FromHex err"
,
err
)
return
nil
,
err
}
operater
:=
p
olicy
.
getWalletOperate
()
operater
:=
p
.
getWalletOperate
()
password
:=
[]
byte
(
operater
.
GetPassword
())
privkey
:=
wcom
.
CBCDecrypterPrivkey
(
password
,
prikeybyte
)
//通过privkey生成一个pubkey然后换算成对应的addr
...
...
@@ -178,30 +178,30 @@ func (policy *mixPolicy) getPrivKeyByAddr(addr string) (crypto.PrivKey, error) {
return
priv
,
nil
}
func
(
p
olicy
*
mixPolicy
)
getAccountPrivacyKey
(
addr
string
)
(
*
mixTy
.
WalletAddrPrivacy
,
error
)
{
if
data
,
_
:=
p
olicy
.
store
.
getAccountPrivacy
(
addr
);
data
!=
nil
{
func
(
p
*
mixPolicy
)
getAccountPrivacyKey
(
addr
string
)
(
*
mixTy
.
WalletAddrPrivacy
,
error
)
{
if
data
,
_
:=
p
.
store
.
getAccountPrivacy
(
addr
);
data
!=
nil
{
privacyInfo
:=
&
mixTy
.
AccountPrivacyKey
{}
password
:=
[]
byte
(
p
olicy
.
getWalletOperate
()
.
GetPassword
())
password
:=
[]
byte
(
p
.
getWalletOperate
()
.
GetPassword
())
decrypted
,
err
:=
decryptDataWithPading
(
password
,
data
)
if
err
!=
nil
{
return
p
olicy
.
savePrivacyPair
(
addr
)
return
p
.
savePrivacyPair
(
addr
)
}
//有可能修改了秘钥,如果解密失败,需要重新设置
err
=
types
.
Decode
(
decrypted
,
privacyInfo
)
if
err
!=
nil
{
return
p
olicy
.
savePrivacyPair
(
addr
)
return
p
.
savePrivacyPair
(
addr
)
}
return
&
mixTy
.
WalletAddrPrivacy
{
Privacy
:
privacyInfo
,
Addr
:
addr
},
nil
}
return
p
olicy
.
savePrivacyPair
(
addr
)
return
p
.
savePrivacyPair
(
addr
)
}
func
(
p
olicy
*
mixPolicy
)
savePrivacyPair
(
addr
string
)
(
*
mixTy
.
WalletAddrPrivacy
,
error
)
{
priv
,
err
:=
p
olicy
.
getPrivKeyByAddr
(
addr
)
func
(
p
*
mixPolicy
)
savePrivacyPair
(
addr
string
)
(
*
mixTy
.
WalletAddrPrivacy
,
error
)
{
priv
,
err
:=
p
.
getPrivKeyByAddr
(
addr
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"savePrivacyPair addr=%s"
,
addr
)
}
...
...
@@ -209,17 +209,17 @@ func (policy *mixPolicy) savePrivacyPair(addr string) (*mixTy.WalletAddrPrivacy,
bizlog
.
Info
(
"savePrivacyPair"
,
"pri"
,
common
.
ToHex
(
priv
.
Bytes
()),
"addr"
,
addr
)
newPrivacy
:=
newPrivacyKey
(
priv
.
Bytes
())
password
:=
[]
byte
(
p
olicy
.
getWalletOperate
()
.
GetPassword
())
password
:=
[]
byte
(
p
.
getWalletOperate
()
.
GetPassword
())
encryptered
:=
encryptDataWithPadding
(
password
,
types
.
Encode
(
newPrivacy
))
//save the privacy created to wallet db
p
olicy
.
store
.
setAccountPrivacy
(
addr
,
encryptered
)
p
.
store
.
setAccountPrivacy
(
addr
,
encryptered
)
return
&
mixTy
.
WalletAddrPrivacy
{
Privacy
:
newPrivacy
,
Addr
:
addr
},
nil
}
//查询钱包里面所有的地址对应的PrivacyKeys
func
(
p
olicy
*
mixPolicy
)
getWalletPrivacyKeys
()
([]
*
mixTy
.
WalletAddrPrivacy
,
error
)
{
func
(
p
*
mixPolicy
)
getWalletPrivacyKeys
()
([]
*
mixTy
.
WalletAddrPrivacy
,
error
)
{
//通过Account前缀查找获取钱包中的所有账户信息
WalletAccStores
,
err
:=
p
olicy
.
store
.
GetAccountByPrefix
(
"Account"
)
WalletAccStores
,
err
:=
p
.
store
.
GetAccountByPrefix
(
"Account"
)
if
err
!=
nil
||
len
(
WalletAccStores
)
==
0
{
bizlog
.
Info
(
"getPrivacyKeyPairs"
,
"store getAccountByPrefix error"
,
err
)
return
nil
,
err
...
...
@@ -228,7 +228,7 @@ func (policy *mixPolicy) getWalletPrivacyKeys() ([]*mixTy.WalletAddrPrivacy, err
var
infoPriRes
[]
*
mixTy
.
WalletAddrPrivacy
for
_
,
AccStore
:=
range
WalletAccStores
{
if
len
(
AccStore
.
Addr
)
!=
0
{
if
privacyInfo
,
err
:=
p
olicy
.
getAccountPrivacyKey
(
AccStore
.
Addr
);
err
==
nil
{
if
privacyInfo
,
err
:=
p
.
getAccountPrivacyKey
(
AccStore
.
Addr
);
err
==
nil
{
infoPriRes
=
append
(
infoPriRes
,
privacyInfo
)
}
}
...
...
@@ -243,38 +243,38 @@ func (policy *mixPolicy) getWalletPrivacyKeys() ([]*mixTy.WalletAddrPrivacy, err
}
func
(
p
olicy
*
mixPolicy
)
getRescanStatus
()
string
{
status
:=
p
olicy
.
store
.
getRescanNoteStatus
()
func
(
p
*
mixPolicy
)
getRescanStatus
()
string
{
status
:=
p
.
store
.
getRescanNoteStatus
()
return
mixTy
.
MixWalletRescanStatus
(
status
)
.
String
()
}
func
(
p
olicy
*
mixPolicy
)
tryRescanNotes
()
error
{
func
(
p
*
mixPolicy
)
tryRescanNotes
()
error
{
//未使能,直接使能
if
!
p
olicy
.
store
.
getPrivacyEnable
()
{
//p
olicy
.store.enablePrivacy()
if
!
p
.
store
.
getPrivacyEnable
()
{
//p.store.enablePrivacy()
return
errors
.
Wrap
(
types
.
ErrNotAllow
,
"privacy need enable firstly"
)
}
operater
:=
p
olicy
.
getWalletOperate
()
operater
:=
p
.
getWalletOperate
()
if
operater
.
IsWalletLocked
()
{
return
types
.
ErrWalletIsLocked
}
status
:=
p
olicy
.
store
.
getRescanNoteStatus
()
status
:=
p
.
store
.
getRescanNoteStatus
()
if
status
==
int32
(
mixTy
.
MixWalletRescanStatus_SCANNING
)
{
return
errors
.
Wrap
(
types
.
ErrNotAllow
,
"mix wallet is scanning"
)
}
p
olicy
.
store
.
setRescanNoteStatus
(
int32
(
mixTy
.
MixWalletRescanStatus_SCANNING
))
p
.
store
.
setRescanNoteStatus
(
int32
(
mixTy
.
MixWalletRescanStatus_SCANNING
))
go
p
olicy
.
rescanNotes
()
go
p
.
rescanNotes
()
return
nil
}
//从localdb中把Mix合约的交易按升序都获取出来依次处理
func
(
p
olicy
*
mixPolicy
)
rescanNotes
()
{
func
(
p
*
mixPolicy
)
rescanNotes
()
{
var
txInfo
mixTy
.
LocalMixTx
i
:=
0
operater
:=
p
olicy
.
getWalletOperate
()
operater
:=
p
.
getWalletOperate
()
for
{
select
{
case
<-
operater
.
GetWalletDone
()
:
...
...
@@ -324,19 +324,19 @@ func (policy *mixPolicy) rescanNotes() {
txInfo
.
Index
=
mixTxInfos
.
Txs
[
txcount
-
1
]
.
GetIndex
()
}
p
olicy
.
processPrivcyTxs
(
&
ReqHashes
)
p
.
processPrivcyTxs
(
&
ReqHashes
)
if
txcount
<
int
(
MaxTxHashsPerTime
)
{
break
}
}
p
olicy
.
store
.
setRescanNoteStatus
(
int32
(
mixTy
.
MixWalletRescanStatus_FINISHED
))
p
.
store
.
setRescanNoteStatus
(
int32
(
mixTy
.
MixWalletRescanStatus_FINISHED
))
return
}
func
(
p
olicy
*
mixPolicy
)
processPrivcyTxs
(
ReqHashes
*
types
.
ReqHashes
)
{
func
(
p
*
mixPolicy
)
processPrivcyTxs
(
ReqHashes
*
types
.
ReqHashes
)
{
//通过txhashs获取对应的txdetail
txDetails
,
err
:=
p
olicy
.
getWalletOperate
()
.
GetAPI
()
.
GetTransactionByHash
(
ReqHashes
)
txDetails
,
err
:=
p
.
getWalletOperate
()
.
GetAPI
()
.
GetTransactionByHash
(
ReqHashes
)
if
err
!=
nil
{
bizlog
.
Error
(
"processPrivcyTx"
,
"GetTransactionByHash error"
,
err
)
return
...
...
@@ -347,18 +347,18 @@ func (policy *mixPolicy) processPrivcyTxs(ReqHashes *types.ReqHashes) {
bizlog
.
Error
(
"processPrivcyTx wrong tx"
,
"receipt ty"
,
tx
.
Receipt
.
Ty
,
"hash"
,
common
.
ToHex
(
tx
.
Tx
.
Hash
()))
continue
}
set
,
err
:=
p
olicy
.
processMixTx
(
tx
.
Tx
,
tx
.
Height
,
tx
.
Index
)
set
,
err
:=
p
.
processMixTx
(
tx
.
Tx
,
tx
.
Height
,
tx
.
Index
)
if
err
!=
nil
{
bizlog
.
Error
(
"processPrivcyTx"
,
"processMixTx error"
,
err
)
continue
}
p
olicy
.
store
.
setKvs
(
set
)
p
.
store
.
setKvs
(
set
)
}
}
func
(
p
olicy
*
mixPolicy
)
enablePrivacy
(
addrs
[]
string
)
(
*
mixTy
.
ReqEnablePrivacyRst
,
error
)
{
func
(
p
*
mixPolicy
)
enablePrivacy
(
addrs
[]
string
)
(
*
mixTy
.
ReqEnablePrivacyRst
,
error
)
{
if
0
==
len
(
addrs
)
{
WalletAccStores
,
err
:=
p
olicy
.
store
.
GetAccountByPrefix
(
"Account"
)
WalletAccStores
,
err
:=
p
.
store
.
GetAccountByPrefix
(
"Account"
)
if
err
!=
nil
||
len
(
WalletAccStores
)
==
0
{
bizlog
.
Info
(
"enablePrivacy"
,
"GetAccountByPrefix:err"
,
err
)
return
nil
,
types
.
ErrNotFound
...
...
@@ -376,7 +376,7 @@ func (policy *mixPolicy) enablePrivacy(addrs []string) (*mixTy.ReqEnablePrivacyR
for
_
,
addr
:=
range
addrs
{
str
:=
""
isOK
:=
true
_
,
err
:=
p
olicy
.
getAccountPrivacyKey
(
addr
)
_
,
err
:=
p
.
getAccountPrivacyKey
(
addr
)
if
err
!=
nil
{
isOK
=
false
str
=
err
.
Error
()
...
...
@@ -390,34 +390,25 @@ func (policy *mixPolicy) enablePrivacy(addrs []string) (*mixTy.ReqEnablePrivacyR
rep
.
Results
=
append
(
rep
.
Results
,
priAddrResult
)
}
p
olicy
.
store
.
enablePrivacy
()
p
.
store
.
enablePrivacy
()
return
&
rep
,
nil
}
func
(
policy
*
mixPolicy
)
showAccountNoteInfo
(
addrs
[]
string
)
(
*
mixTy
.
WalletIndexResp
,
error
)
{
var
resps
mixTy
.
WalletIndexResp
for
_
,
addr
:=
range
addrs
{
var
req
mixTy
.
WalletMixIndexReq
req
.
Account
=
addr
resp
,
err
:=
policy
.
listMixInfos
(
&
req
)
if
err
!=
nil
{
return
nil
,
err
}
resps
.
Notes
=
append
(
resps
.
Notes
,
resp
.
(
*
mixTy
.
WalletIndexResp
)
.
Notes
...
)
}
return
&
resps
,
nil
func
(
p
*
mixPolicy
)
showAccountNoteInfo
(
req
*
mixTy
.
WalletMixIndexReq
)
(
*
mixTy
.
WalletNoteResp
,
error
)
{
resp
,
err
:=
p
.
listMixInfos
(
req
)
return
resp
.
(
*
mixTy
.
WalletNoteResp
),
err
}
func
(
p
olicy
*
mixPolicy
)
createRawTx
(
req
*
mixTy
.
CreateRawTxReq
)
(
*
types
.
Transaction
,
error
)
{
func
(
p
*
mixPolicy
)
createRawTx
(
req
*
mixTy
.
CreateRawTxReq
)
(
*
types
.
Transaction
,
error
)
{
switch
req
.
ActionTy
{
case
mixTy
.
MixActionDeposit
:
return
p
olicy
.
createDepositTx
(
req
)
return
p
.
createDepositTx
(
req
)
case
mixTy
.
MixActionWithdraw
:
return
p
olicy
.
createWithdrawTx
(
req
)
return
p
.
createWithdrawTx
(
req
)
case
mixTy
.
MixActionAuth
:
return
p
olicy
.
createAuthTx
(
req
)
return
p
.
createAuthTx
(
req
)
case
mixTy
.
MixActionTransfer
:
return
p
olicy
.
createTransferTx
(
req
)
return
p
.
createTransferTx
(
req
)
default
:
return
nil
,
errors
.
Wrapf
(
types
.
ErrInvalidParam
,
"action=%d"
,
req
.
ActionTy
)
}
...
...
plugin/dapp/mix/wallet/mixbizdb.go
View file @
9b794a19
...
...
@@ -144,6 +144,8 @@ func (p *mixPolicy) processAuth(auth *mixTy.MixAuthorizeAction, table *table.Tab
}
input
:=
out
.
(
*
mixTy
.
AuthorizePublicInput
)
updateAuthSpend
(
table
,
input
.
AuthorizeSpendHash
)
updateAuthHash
(
table
,
input
.
AuthorizeHash
)
}
func
(
p
*
mixPolicy
)
processNullifiers
(
nulls
[]
string
,
table
*
table
.
Table
)
{
...
...
@@ -189,11 +191,27 @@ func updateAuthSpend(ldb *table.Table, authSpend string) error {
return
ldb
.
Update
([]
byte
(
u
.
TxIndex
),
u
)
}
func
(
e
*
mixPolicy
)
listMixInfos
(
req
*
mixTy
.
WalletMixIndexReq
)
(
types
.
Message
,
error
)
{
func
updateAuthHash
(
ldb
*
table
.
Table
,
authHash
string
)
error
{
xs
,
err
:=
ldb
.
ListIndex
(
"authHash"
,
[]
byte
(
authHash
),
nil
,
1
,
0
)
if
err
!=
nil
||
len
(
xs
)
!=
1
{
bizlog
.
Error
(
"updateAuthHash update query List failed"
,
"key"
,
authHash
,
"err"
,
err
,
"len"
,
len
(
xs
))
return
nil
}
u
,
ok
:=
xs
[
0
]
.
Data
.
(
*
mixTy
.
WalletDbMixInfo
)
if
!
ok
{
bizlog
.
Error
(
"updateAuthSpend update decode failed"
,
"data"
,
xs
[
0
]
.
Data
)
return
nil
}
u
.
Info
.
Status
=
mixTy
.
NoteStatus_UNFROZEN
return
ldb
.
Update
([]
byte
(
u
.
TxIndex
),
u
)
}
func
(
p
*
mixPolicy
)
listMixInfos
(
req
*
mixTy
.
WalletMixIndexReq
)
(
types
.
Message
,
error
)
{
if
req
==
nil
{
return
nil
,
types
.
ErrInvalidParam
}
localDb
:=
e
.
getWalletOperate
()
.
GetDBStore
()
localDb
:=
p
.
getWalletOperate
()
.
GetDBStore
()
query
:=
NewMixTable
(
localDb
)
.
GetQuery
(
commondb
.
NewKVDB
(
localDb
))
var
primary
[]
byte
...
...
@@ -211,7 +229,7 @@ func (e *mixPolicy) listMixInfos(req *mixTy.WalletMixIndexReq) (types.Message, e
}
cur
:=
&
MixRow
{
WalletDbMixInfo
:
&
mixTy
.
WalletDbMixInfo
{
Info
:
&
mixTy
.
Wallet
Index
Info
{
WalletDbMixInfo
:
&
mixTy
.
WalletDbMixInfo
{
Info
:
&
mixTy
.
Wallet
Note
Info
{
NoteHash
:
req
.
NoteHash
,
Nullifier
:
req
.
Nullifier
,
AuthorizeSpendHash
:
req
.
AuthorizeSpendHash
,
...
...
@@ -233,7 +251,7 @@ func (e *mixPolicy) listMixInfos(req *mixTy.WalletMixIndexReq) (types.Message, e
if
len
(
rows
)
==
0
{
return
nil
,
types
.
ErrNotFound
}
var
resp
mixTy
.
Wallet
Index
Resp
var
resp
mixTy
.
Wallet
Note
Resp
for
_
,
row
:=
range
rows
{
r
,
ok
:=
row
.
Data
.
(
*
mixTy
.
WalletDbMixInfo
)
if
!
ok
{
...
...
@@ -245,8 +263,8 @@ func (e *mixPolicy) listMixInfos(req *mixTy.WalletMixIndexReq) (types.Message, e
return
&
resp
,
nil
}
func
(
e
*
mixPolicy
)
execAutoDelLocal
(
tx
*
types
.
Transaction
)
(
*
types
.
LocalDBSet
,
error
)
{
kvs
,
err
:=
e
.
store
.
DelRollbackKV
(
tx
,
tx
.
Execer
)
func
(
p
*
mixPolicy
)
execAutoDelLocal
(
tx
*
types
.
Transaction
)
(
*
types
.
LocalDBSet
,
error
)
{
kvs
,
err
:=
p
.
store
.
DelRollbackKV
(
tx
,
tx
.
Execer
)
if
err
!=
nil
{
return
nil
,
err
}
...
...
@@ -255,7 +273,7 @@ func (e *mixPolicy) execAutoDelLocal(tx *types.Transaction) (*types.LocalDBSet,
return
dbSet
,
nil
}
func
(
p
*
mixPolicy
)
addTable
(
info
*
mixTy
.
Wallet
Index
Info
,
heightIndex
string
,
table
*
table
.
Table
)
{
func
(
p
*
mixPolicy
)
addTable
(
info
*
mixTy
.
Wallet
Note
Info
,
heightIndex
string
,
table
*
table
.
Table
)
{
r
:=
&
mixTy
.
WalletDbMixInfo
{
Info
:
info
,
TxIndex
:
heightIndex
+
info
.
NoteHash
,
...
...
@@ -310,7 +328,7 @@ func (p *mixPolicy) processSecretGroup(noteHash string, secretGroup *mixTy.DHSec
}
}
func
(
p
*
mixPolicy
)
decodeSecret
(
noteHash
string
,
secretData
string
,
privacyKeys
[]
*
mixTy
.
WalletAddrPrivacy
)
(
*
mixTy
.
Wallet
Index
Info
,
error
)
{
func
(
p
*
mixPolicy
)
decodeSecret
(
noteHash
string
,
secretData
string
,
privacyKeys
[]
*
mixTy
.
WalletAddrPrivacy
)
(
*
mixTy
.
Wallet
Note
Info
,
error
)
{
var
dhSecret
mixTy
.
DHSecret
data
,
err
:=
hex
.
DecodeString
(
secretData
)
if
err
!=
nil
{
...
...
@@ -339,13 +357,14 @@ func (p *mixPolicy) decodeSecret(noteHash string, secretData string, privacyKeys
continue
}
bizlog
.
Info
(
"processSecret.decode rawData OK"
,
"notehash"
,
noteHash
,
"addr"
,
key
.
Addr
)
//wallet产生deposit tx时候 确保了三个key不同,除非自己构造相同key的交易
if
rawData
.
ReceiverKey
==
key
.
Privacy
.
PaymentKey
.
ReceiveKey
||
rawData
.
ReturnKey
==
key
.
Privacy
.
PaymentKey
.
ReceiveKey
||
rawData
.
AuthorizeKey
==
key
.
Privacy
.
PaymentKey
.
ReceiveKey
{
//decrypted, save database
var
info
mixTy
.
Wallet
Index
Info
var
info
mixTy
.
Wallet
Note
Info
info
.
NoteHash
=
noteHash
info
.
Nullifier
=
mixTy
.
Byte2Str
(
mimcHashString
([]
string
{
rawData
.
NoteRandom
}))
info
.
Nullifier
=
hex
.
EncodeToString
(
mimcHashString
([]
string
{
rawData
.
NoteRandom
}))
//如果自己是spender,则记录有关spenderAuthHash,如果是returner,则记录returnerAuthHash
//如果授权为spenderAuthHash,则根据授权hash索引到本地数据库,spender更新本地为VALID,returner侧不变仍为FROZEN,花费后,两端都变为USED
//如果授权为returnerAuthHash,则returner更新本地为VALID,spender侧仍为FROZEN,
...
...
@@ -353,13 +372,10 @@ func (p *mixPolicy) decodeSecret(noteHash string, secretData string, privacyKeys
if
len
(
rawData
.
AuthorizeKey
)
>
LENNULLKEY
{
switch
key
.
Privacy
.
PaymentKey
.
ReceiveKey
{
case
rawData
.
ReceiverKey
:
info
.
Role
=
mixTy
.
Role_SPENDER
info
.
AuthorizeSpendHash
=
mixTy
.
Byte2Str
(
mimcHashString
([]
string
{
rawData
.
ReceiverKey
,
rawData
.
Amount
,
rawData
.
NoteRandom
}))
case
rawData
.
ReturnKey
:
info
.
Role
=
mixTy
.
Role_RETURNER
info
.
AuthorizeSpendHash
=
mixTy
.
Byte2Str
(
mimcHashString
([]
string
{
rawData
.
ReturnKey
,
rawData
.
Amount
,
rawData
.
NoteRandom
}))
info
.
AuthorizeSpendHash
=
hex
.
EncodeToString
(
mimcHashString
([]
string
{
key
.
Privacy
.
PaymentKey
.
ReceiveKey
,
rawData
.
Amount
,
rawData
.
NoteRandom
}))
case
rawData
.
AuthorizeKey
:
info
.
Role
=
mixTy
.
Role_AUTHORIZER
info
.
AuthorizeHash
=
hex
.
EncodeToString
(
mimcHashString
([]
string
{
rawData
.
AuthorizeKey
,
rawData
.
NoteRandom
}))
}
}
...
...
plugin/dapp/mix/wallet/mixbiztable.go
View file @
9b794a19
...
...
@@ -22,6 +22,7 @@ var boardOpt = &table.Option{
Index
:
[]
string
{
"noteHash"
,
"nullifier"
,
"authHash"
,
"authSpendHash"
,
"account"
,
"status"
},
...
...
@@ -70,6 +71,8 @@ func (r *MixRow) Get(key string) ([]byte, error) {
return
[]
byte
(
r
.
Info
.
NoteHash
),
nil
case
"nullifier"
:
return
[]
byte
(
r
.
Info
.
Nullifier
),
nil
case
"authHash"
:
return
[]
byte
(
r
.
Info
.
AuthorizeHash
),
nil
case
"authSpendHash"
:
return
[]
byte
(
r
.
Info
.
AuthorizeSpendHash
),
nil
case
"account"
:
...
...
plugin/dapp/mix/wallet/mixstore.go
View file @
9b794a19
...
...
@@ -22,31 +22,6 @@ type mixStore struct {
*
wcom
.
Store
}
//
//func (store *mixStore) getAccountByPrefix(addr string) ([]*types.WalletAccountStore, error) {
// if len(addr) == 0 {
// bizlog.Error("getAccountByPrefix addr is nil")
// return nil, types.ErrInvalidParam
// }
// list := store.NewListHelper()
// accbytes := list.PrefixScan([]byte(addr))
// if len(accbytes) == 0 {
// bizlog.Error("getAccountByPrefix addr not exist")
// return nil, types.ErrAccountNotExist
// }
// WalletAccountStores := make([]*types.WalletAccountStore, len(accbytes))
// for index, accbyte := range accbytes {
// var walletaccount types.WalletAccountStore
// err := proto.Unmarshal(accbyte, &walletaccount)
// if err != nil {
// bizlog.Error("GetAccountByAddr", "proto.Unmarshal err:", err)
// return nil, types.ErrUnmarshal
// }
// WalletAccountStores[index] = &walletaccount
// }
// return WalletAccountStores, nil
//}
func
(
store
*
mixStore
)
getAccountPrivacy
(
addr
string
)
([]
byte
,
error
)
{
if
len
(
addr
)
==
0
{
return
nil
,
types
.
ErrInvalidParam
...
...
@@ -56,29 +31,6 @@ func (store *mixStore) getAccountPrivacy(addr string) ([]byte, error) {
}
//
//func (store *mixStore) getAccountByAddr(addr string) (*types.WalletAccountStore, error) {
// var account types.WalletAccountStore
// if len(addr) == 0 {
// bizlog.Error("GetAccountByAddr addr is nil")
// return nil, types.ErrInvalidParam
// }
// data, err := store.Get(calcMixAddrKey(addr))
// if data == nil || err != nil {
// if err != db.ErrNotFoundInDb {
// bizlog.Debug("GetAccountByAddr addr", "err", err)
// }
// return nil, types.ErrAddrNotExist
// }
//
// err = types.Decode(data, &account)
// if err != nil {
// bizlog.Error("GetAccountByAddr", "proto.Unmarshal err:", err)
// return nil, types.ErrUnmarshal
// }
// return &account, nil
//}
func
(
store
*
mixStore
)
setAccountPrivacy
(
addr
string
,
data
[]
byte
)
error
{
if
len
(
addr
)
==
0
{
bizlog
.
Error
(
"SetWalletAccountPrivacy addr is nil"
)
...
...
@@ -90,9 +42,6 @@ func (store *mixStore) setAccountPrivacy(addr string, data []byte) error {
}
store
.
GetDB
()
.
Set
(
calcMixAddrKey
(
addr
),
data
)
//newbatch := store.NewBatch(true)
//newbatch.Set(calcMixAddrKey(addr), data)
//newbatch.Write()
return
nil
}
...
...
plugin/dapp/mix/wallet/txauth.go
View file @
9b794a19
...
...
@@ -67,18 +67,20 @@ type AuthorizeInput struct {
Valid9
string
`tag:"secret"`
}
func
(
p
olicy
*
mixPolicy
)
getAuthParms
(
req
*
mixTy
.
AuthTxReq
)
(
*
AuthorizeInput
,
error
)
{
note
,
err
:=
p
olicy
.
getNoteInfo
(
req
.
NoteHash
,
mixTy
.
NoteStatus_FROZEN
)
func
(
p
*
mixPolicy
)
getAuthParms
(
req
*
mixTy
.
AuthTxReq
)
(
*
AuthorizeInput
,
error
)
{
note
,
err
:=
p
.
getNoteInfo
(
req
.
NoteHash
)
if
err
!=
nil
{
return
nil
,
err
}
if
note
.
Status
!=
mixTy
.
NoteStatus_FROZEN
{
return
nil
,
errors
.
Wrapf
(
types
.
ErrNotAllow
,
"wrong note status=%s"
,
note
.
Status
.
String
())
}
if
note
.
Secret
.
ReceiverKey
!=
req
.
AuthorizeToAddr
&&
note
.
Secret
.
ReturnKey
!=
req
.
AuthorizeToAddr
{
return
nil
,
errors
.
Wrapf
(
types
.
ErrInvalidParam
,
"note no match addr to AuthorizeToAddr=%s"
,
req
.
AuthorizeToAddr
)
}
//get spend privacy key
privacyKey
,
err
:=
p
olicy
.
getAccountPrivacyKey
(
note
.
Account
)
privacyKey
,
err
:=
p
.
getAccountPrivacyKey
(
note
.
Account
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"getAccountPrivacyKey addr=%s"
,
note
.
Account
)
}
...
...
@@ -110,7 +112,7 @@ func (policy *mixPolicy) getAuthParms(req *mixTy.AuthTxReq) (*AuthorizeInput, er
}
//get tree path
treeProof
,
err
:=
p
olicy
.
getTreeProof
(
note
.
NoteHash
)
treeProof
,
err
:=
p
.
getTreeProof
(
note
.
NoteHash
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"getTreeProof for hash=%s"
,
note
.
NoteHash
)
}
...
...
@@ -121,13 +123,13 @@ func (policy *mixPolicy) getAuthParms(req *mixTy.AuthTxReq) (*AuthorizeInput, er
}
func
(
p
olicy
*
mixPolicy
)
createAuthTx
(
req
*
mixTy
.
CreateRawTxReq
)
(
*
types
.
Transaction
,
error
)
{
func
(
p
*
mixPolicy
)
createAuthTx
(
req
*
mixTy
.
CreateRawTxReq
)
(
*
types
.
Transaction
,
error
)
{
var
auth
mixTy
.
AuthTxReq
err
:=
types
.
Decode
(
req
.
Data
,
&
auth
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"decode req fail"
)
}
input
,
err
:=
p
olicy
.
getAuthParms
(
&
auth
)
input
,
err
:=
p
.
getAuthParms
(
&
auth
)
if
err
!=
nil
{
return
nil
,
err
}
...
...
@@ -137,18 +139,18 @@ func (policy *mixPolicy) createAuthTx(req *mixTy.CreateRawTxReq) (*types.Transac
return
nil
,
errors
.
Wrapf
(
err
,
"getZkProofKeys note=%s"
,
auth
.
NoteHash
)
}
//verify
if
err
:=
p
olicy
.
verifyProofOnChain
(
mixTy
.
VerifyType_AUTHORIZE
,
proofInfo
,
auth
.
ZkPath
+
mixTy
.
AuthVk
);
err
!=
nil
{
if
err
:=
p
.
verifyProofOnChain
(
mixTy
.
VerifyType_AUTHORIZE
,
proofInfo
,
auth
.
ZkPath
+
mixTy
.
AuthVk
);
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"verifyProof fail for note=%s"
,
auth
.
NoteHash
)
}
return
p
olicy
.
getAuthTx
(
strings
.
TrimSpace
(
req
.
Title
+
mixTy
.
MixX
),
proofInfo
)
return
p
.
getAuthTx
(
strings
.
TrimSpace
(
req
.
Title
+
mixTy
.
MixX
),
proofInfo
)
}
func
(
p
olicy
*
mixPolicy
)
getAuthTx
(
execName
string
,
proof
*
mixTy
.
ZkProofInfo
)
(
*
types
.
Transaction
,
error
)
{
func
(
p
*
mixPolicy
)
getAuthTx
(
execName
string
,
proof
*
mixTy
.
ZkProofInfo
)
(
*
types
.
Transaction
,
error
)
{
payload
:=
&
mixTy
.
MixAuthorizeAction
{}
payload
.
Proof
=
proof
cfg
:=
p
olicy
.
getWalletOperate
()
.
GetAPI
()
.
GetConfig
()
cfg
:=
p
.
getWalletOperate
()
.
GetAPI
()
.
GetConfig
()
action
:=
&
mixTy
.
MixAction
{
Ty
:
mixTy
.
MixActionAuth
,
Value
:
&
mixTy
.
MixAction_Authorize
{
Authorize
:
payload
},
...
...
plugin/dapp/mix/wallet/txdeposit.go
View file @
9b794a19
...
...
@@ -32,7 +32,12 @@ type DepositInput struct {
NoteRandom
string
`tag:"secret"`
}
func
(
policy
*
mixPolicy
)
depositParams
(
receiver
,
returner
,
auth
,
amount
string
)
(
*
mixTy
.
DepositProofResp
,
error
)
{
func
(
p
*
mixPolicy
)
depositParams
(
receiver
,
returner
,
auth
,
amount
string
)
(
*
mixTy
.
DepositProofResp
,
error
)
{
if
receiver
==
returner
||
receiver
==
auth
||
returner
==
auth
{
return
nil
,
errors
.
Wrapf
(
types
.
ErrInvalidParam
,
"addrs should not be same to receiver=%s,return=%s,auth=%s"
,
receiver
,
returner
,
auth
)
}
if
len
(
receiver
)
<=
0
{
return
nil
,
errors
.
Wrap
(
types
.
ErrInvalidParam
,
"receiver is nil"
)
}
...
...
@@ -53,7 +58,7 @@ func (policy *mixPolicy) depositParams(receiver, returner, auth, amount string)
//TODO 线上检查是否随机值在nullifer里面
// 获取receiving addr对应的paymentKey
payKeys
,
e
:=
p
olicy
.
getPaymentKey
(
receiver
)
payKeys
,
e
:=
p
.
getPaymentKey
(
receiver
)
if
e
!=
nil
{
return
nil
,
errors
.
Wrapf
(
e
,
"get payment key for addr = %s"
,
receiver
)
}
...
...
@@ -65,7 +70,7 @@ func (policy *mixPolicy) depositParams(receiver, returner, auth, amount string)
//如果Input不填,缺省空为“0”字符串
secret
.
ReturnKey
=
"0"
if
len
(
returner
)
>
0
{
returnKey
,
err
=
p
olicy
.
getPaymentKey
(
returner
)
returnKey
,
err
=
p
.
getPaymentKey
(
returner
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"get payment key for return addr = %s"
,
returner
)
}
...
...
@@ -76,7 +81,7 @@ func (policy *mixPolicy) depositParams(receiver, returner, auth, amount string)
var
authKey
*
mixTy
.
PaymentKey
secret
.
AuthorizeKey
=
"0"
if
len
(
auth
)
>
0
{
authKey
,
err
=
p
olicy
.
getPaymentKey
(
auth
)
authKey
,
err
=
p
.
getPaymentKey
(
auth
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"get payment key for authorize addr = %s"
,
auth
)
}
...
...
@@ -123,9 +128,9 @@ func (policy *mixPolicy) depositParams(receiver, returner, auth, amount string)
}
func
(
p
olicy
*
mixPolicy
)
getDepositProof
(
receiver
,
returner
,
auth
,
amount
,
zkPath
string
)
(
*
mixTy
.
ZkProofInfo
,
error
)
{
func
(
p
*
mixPolicy
)
getDepositProof
(
receiver
,
returner
,
auth
,
amount
,
zkPath
string
)
(
*
mixTy
.
ZkProofInfo
,
error
)
{
resp
,
err
:=
p
olicy
.
depositParams
(
receiver
,
returner
,
auth
,
amount
)
resp
,
err
:=
p
.
depositParams
(
receiver
,
returner
,
auth
,
amount
)
if
err
!=
nil
{
return
nil
,
err
}
...
...
@@ -144,14 +149,14 @@ func (policy *mixPolicy) getDepositProof(receiver, returner, auth, amount, zkPat
}
//线上验证proof,失败的原因有可能circuit,Pk和线上vk不匹配,或不是一起产生的版本
if
err
:=
p
olicy
.
verifyProofOnChain
(
mixTy
.
VerifyType_DEPOSIT
,
proofInfo
,
zkPath
+
mixTy
.
DepositVk
);
err
!=
nil
{
if
err
:=
p
.
verifyProofOnChain
(
mixTy
.
VerifyType_DEPOSIT
,
proofInfo
,
zkPath
+
mixTy
.
DepositVk
);
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"verifyProof fail"
)
}
proofInfo
.
Secrets
=
resp
.
Secrets
return
proofInfo
,
nil
}
func
(
p
olicy
*
mixPolicy
)
createDepositTx
(
req
*
mixTy
.
CreateRawTxReq
)
(
*
types
.
Transaction
,
error
)
{
func
(
p
*
mixPolicy
)
createDepositTx
(
req
*
mixTy
.
CreateRawTxReq
)
(
*
types
.
Transaction
,
error
)
{
var
deposit
mixTy
.
DepositTxReq
err
:=
types
.
Decode
(
req
.
Data
,
&
deposit
)
if
err
!=
nil
{
...
...
@@ -175,22 +180,22 @@ func (policy *mixPolicy) createDepositTx(req *mixTy.CreateRawTxReq) (*types.Tran
var
proofs
[]
*
mixTy
.
ZkProofInfo
for
i
,
rcv
:=
range
receivers
{
p
,
err
:=
p
olicy
.
getDepositProof
(
rcv
,
deposit
.
Deposit
.
ReturnAddr
,
deposit
.
Deposit
.
AuthorizeAddr
,
amounts
[
i
],
deposit
.
ZkPath
)
p
,
err
:=
p
.
getDepositProof
(
rcv
,
deposit
.
Deposit
.
ReturnAddr
,
deposit
.
Deposit
.
AuthorizeAddr
,
amounts
[
i
],
deposit
.
ZkPath
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"get Deposit proof for=%s"
,
rcv
)
}
proofs
=
append
(
proofs
,
p
)
}
return
p
olicy
.
getDepositTx
(
strings
.
TrimSpace
(
req
.
Title
+
mixTy
.
MixX
),
proofs
)
return
p
.
getDepositTx
(
strings
.
TrimSpace
(
req
.
Title
+
mixTy
.
MixX
),
proofs
)
}
func
(
p
olicy
*
mixPolicy
)
getDepositTx
(
execName
string
,
proofs
[]
*
mixTy
.
ZkProofInfo
)
(
*
types
.
Transaction
,
error
)
{
func
(
p
*
mixPolicy
)
getDepositTx
(
execName
string
,
proofs
[]
*
mixTy
.
ZkProofInfo
)
(
*
types
.
Transaction
,
error
)
{
payload
:=
&
mixTy
.
MixDepositAction
{}
payload
.
Proofs
=
proofs
cfg
:=
p
olicy
.
getWalletOperate
()
.
GetAPI
()
.
GetConfig
()
cfg
:=
p
.
getWalletOperate
()
.
GetAPI
()
.
GetConfig
()
action
:=
&
mixTy
.
MixAction
{
Ty
:
mixTy
.
MixActionDeposit
,
Value
:
&
mixTy
.
MixAction_Deposit
{
Deposit
:
payload
},
...
...
plugin/dapp/mix/wallet/txtransfer.go
View file @
9b794a19
...
...
@@ -92,10 +92,10 @@ type TransferOutput struct {
AmountRandom
string
`tag:"secret"`
}
func
(
p
olicy
*
mixPolicy
)
getTransferInputPart
(
note
*
mixTy
.
WalletIndex
Info
)
(
*
TransferInput
,
error
)
{
func
(
p
*
mixPolicy
)
getTransferInputPart
(
note
*
mixTy
.
WalletNote
Info
)
(
*
TransferInput
,
error
)
{
//get spend privacy key
privacyKey
,
err
:=
p
olicy
.
getAccountPrivacyKey
(
note
.
Account
)
privacyKey
,
err
:=
p
.
getAccountPrivacyKey
(
note
.
Account
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"getAccountPrivacyKey addr=%s"
,
note
.
Account
)
}
...
...
@@ -133,7 +133,7 @@ func (policy *mixPolicy) getTransferInputPart(note *mixTy.WalletIndexInfo) (*Tra
input
.
AuthorizeFlag
=
"1"
}
treeProof
,
err
:=
p
olicy
.
getTreeProof
(
note
.
NoteHash
)
treeProof
,
err
:=
p
.
getTreeProof
(
note
.
NoteHash
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"getTreeProof for hash=%s"
,
note
.
NoteHash
)
}
...
...
@@ -143,13 +143,13 @@ func (policy *mixPolicy) getTransferInputPart(note *mixTy.WalletIndexInfo) (*Tra
return
&
input
,
nil
}
func
(
p
olicy
*
mixPolicy
)
getTransferOutput
(
req
*
mixTy
.
DepositInfo
)
(
*
TransferOutput
,
*
mixTy
.
DHSecretGroup
,
error
)
{
func
(
p
*
mixPolicy
)
getTransferOutput
(
req
*
mixTy
.
DepositInfo
)
(
*
TransferOutput
,
*
mixTy
.
DHSecretGroup
,
error
)
{
//目前只支持一个ReceiverAddr
if
strings
.
Contains
(
req
.
ReceiverAddrs
,
","
)
||
strings
.
Contains
(
req
.
Amounts
,
","
)
{
return
nil
,
nil
,
errors
.
Wrapf
(
types
.
ErrInvalidParam
,
"only support one addr or amount,addrs=%s,amount=%s"
,
req
.
ReceiverAddrs
,
req
.
Amounts
)
}
resp
,
err
:=
p
olicy
.
depositParams
(
req
.
ReceiverAddrs
,
req
.
ReturnAddr
,
req
.
AuthorizeAddr
,
req
.
Amounts
)
resp
,
err
:=
p
.
depositParams
(
req
.
ReceiverAddrs
,
req
.
ReturnAddr
,
req
.
AuthorizeAddr
,
req
.
Amounts
)
if
err
!=
nil
{
return
nil
,
nil
,
errors
.
Wrapf
(
err
,
"deposit toAddr=%s"
,
req
.
ReceiverAddrs
)
}
...
...
@@ -269,7 +269,7 @@ func getShieldValue(inputAmounts []uint64, outAmount, change, minTxFee uint64) (
return
rst
,
nil
}
func
(
p
olicy
*
mixPolicy
)
createTransferTx
(
req
*
mixTy
.
CreateRawTxReq
)
(
*
types
.
Transaction
,
error
)
{
func
(
p
*
mixPolicy
)
createTransferTx
(
req
*
mixTy
.
CreateRawTxReq
)
(
*
types
.
Transaction
,
error
)
{
var
transfer
mixTy
.
TransferTxReq
err
:=
types
.
Decode
(
req
.
Data
,
&
transfer
)
if
err
!=
nil
{
...
...
@@ -277,19 +277,22 @@ func (policy *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Tra
}
noteHashs
:=
strings
.
Split
(
transfer
.
GetInput
()
.
NoteHashs
,
","
)
var
notes
[]
*
mixTy
.
Wallet
Index
Info
var
notes
[]
*
mixTy
.
Wallet
Note
Info
for
_
,
h
:=
range
noteHashs
{
note
,
err
:=
p
olicy
.
getNoteInfo
(
h
,
mixTy
.
NoteStatus_VALID
)
note
,
err
:=
p
.
getNoteInfo
(
h
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"get note info for=%s"
,
h
)
}
if
note
.
Status
!=
mixTy
.
NoteStatus_VALID
&&
note
.
Status
!=
mixTy
.
NoteStatus_UNFROZEN
{
return
nil
,
errors
.
Wrapf
(
types
.
ErrNotAllow
,
"wrong note status=%s"
,
note
.
Status
.
String
())
}
notes
=
append
(
notes
,
note
)
}
//1.获取Input
var
inputParts
[]
*
TransferInput
for
_
,
n
:=
range
notes
{
input
,
err
:=
p
olicy
.
getTransferInputPart
(
n
)
input
,
err
:=
p
.
getTransferInputPart
(
n
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"getTransferInputPart note=%s"
,
n
.
NoteHash
)
}
...
...
@@ -319,7 +322,7 @@ func (policy *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Tra
if
sumInput
<
outAmount
+
uint64
(
mixTy
.
Privacy2PrivacyTxFee
)
{
return
nil
,
errors
.
Wrapf
(
types
.
ErrInvalidParam
,
"out amount=%d big than input=%d - fee=%d"
,
outAmount
,
sumInput
,
uint64
(
mixTy
.
Privacy2PrivacyTxFee
))
}
outPart
,
outDHSecret
,
err
:=
p
olicy
.
getTransferOutput
(
transfer
.
Output
.
Deposit
)
outPart
,
outDHSecret
,
err
:=
p
.
getTransferOutput
(
transfer
.
Output
.
Deposit
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"getTransferOutput for deposit"
)
}
...
...
@@ -333,7 +336,7 @@ func (policy *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Tra
ReceiverAddrs
:
notes
[
0
]
.
Account
,
Amounts
:
strconv
.
FormatUint
(
changeAmount
,
10
),
}
changePart
,
changeDHSecret
,
err
:=
p
olicy
.
getTransferOutput
(
change
)
changePart
,
changeDHSecret
,
err
:=
p
.
getTransferOutput
(
change
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"getTransferOutput change part "
)
}
...
...
@@ -368,7 +371,7 @@ func (policy *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Tra
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"verify.input getZkProofKeys,the i=%d"
,
i
)
}
if
err
:=
p
olicy
.
verifyProofOnChain
(
mixTy
.
VerifyType_TRANSFERINPUT
,
inputProof
,
transfer
.
Input
.
ZkPath
+
mixTy
.
TransInputVk
);
err
!=
nil
{
if
err
:=
p
.
verifyProofOnChain
(
mixTy
.
VerifyType_TRANSFERINPUT
,
inputProof
,
transfer
.
Input
.
ZkPath
+
mixTy
.
TransInputVk
);
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"input verifyProof fail,the i=%d"
,
i
)
}
inputProofs
=
append
(
inputProofs
,
inputProof
)
...
...
@@ -379,7 +382,7 @@ func (policy *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Tra
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"output getZkProofKeys"
)
}
if
err
:=
p
olicy
.
verifyProofOnChain
(
mixTy
.
VerifyType_TRANSFEROUTPUT
,
outputProof
,
transfer
.
Output
.
ZkPath
+
mixTy
.
TransOutputVk
);
err
!=
nil
{
if
err
:=
p
.
verifyProofOnChain
(
mixTy
.
VerifyType_TRANSFEROUTPUT
,
outputProof
,
transfer
.
Output
.
ZkPath
+
mixTy
.
TransOutputVk
);
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"output verifyProof fail"
)
}
outputProof
.
Secrets
=
outDHSecret
...
...
@@ -389,21 +392,21 @@ func (policy *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Tra
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"change getZkProofKeys"
)
}
if
err
:=
p
olicy
.
verifyProofOnChain
(
mixTy
.
VerifyType_TRANSFEROUTPUT
,
changeProof
,
transfer
.
Output
.
ZkPath
+
mixTy
.
TransOutputVk
);
err
!=
nil
{
if
err
:=
p
.
verifyProofOnChain
(
mixTy
.
VerifyType_TRANSFEROUTPUT
,
changeProof
,
transfer
.
Output
.
ZkPath
+
mixTy
.
TransOutputVk
);
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"change verifyProof fail"
)
}
changeProof
.
Secrets
=
changeDHSecret
return
p
olicy
.
getTransferTx
(
strings
.
TrimSpace
(
req
.
Title
+
mixTy
.
MixX
),
inputProofs
,
outputProof
,
changeProof
)
return
p
.
getTransferTx
(
strings
.
TrimSpace
(
req
.
Title
+
mixTy
.
MixX
),
inputProofs
,
outputProof
,
changeProof
)
}
func
(
p
olicy
*
mixPolicy
)
getTransferTx
(
execName
string
,
inputProofs
[]
*
mixTy
.
ZkProofInfo
,
proofs
...*
mixTy
.
ZkProofInfo
)
(
*
types
.
Transaction
,
error
)
{
func
(
p
*
mixPolicy
)
getTransferTx
(
execName
string
,
inputProofs
[]
*
mixTy
.
ZkProofInfo
,
proofs
...*
mixTy
.
ZkProofInfo
)
(
*
types
.
Transaction
,
error
)
{
payload
:=
&
mixTy
.
MixTransferAction
{}
payload
.
Inputs
=
inputProofs
payload
.
Output
=
proofs
[
1
]
payload
.
Change
=
proofs
[
2
]
cfg
:=
p
olicy
.
getWalletOperate
()
.
GetAPI
()
.
GetConfig
()
cfg
:=
p
.
getWalletOperate
()
.
GetAPI
()
.
GetConfig
()
action
:=
&
mixTy
.
MixAction
{
Ty
:
mixTy
.
MixActionTransfer
,
Value
:
&
mixTy
.
MixAction_Transfer
{
Transfer
:
payload
},
...
...
plugin/dapp/mix/wallet/txwithdraw.go
View file @
9b794a19
...
...
@@ -67,11 +67,14 @@ type WithdrawInput struct {
Valid9
string
`tag:"secret"`
}
func
(
p
olicy
*
mixPolicy
)
getWithdrawParams
(
noteHash
string
)
(
*
WithdrawInput
,
error
)
{
note
,
err
:=
p
olicy
.
getNoteInfo
(
noteHash
,
mixTy
.
NoteStatus_VALID
)
func
(
p
*
mixPolicy
)
getWithdrawParams
(
noteHash
string
)
(
*
WithdrawInput
,
error
)
{
note
,
err
:=
p
.
getNoteInfo
(
noteHash
)
if
err
!=
nil
{
return
nil
,
err
}
if
note
.
Status
!=
mixTy
.
NoteStatus_VALID
&&
note
.
Status
!=
mixTy
.
NoteStatus_UNFROZEN
{
return
nil
,
errors
.
Wrapf
(
types
.
ErrNotAllow
,
"wrong note status=%s"
,
note
.
Status
.
String
())
}
var
input
WithdrawInput
initTreePath
(
&
input
)
...
...
@@ -85,24 +88,24 @@ func (policy *mixPolicy) getWithdrawParams(noteHash string) (*WithdrawInput, err
input
.
AuthorizePubKey
=
note
.
Secret
.
AuthorizeKey
input
.
NoteRandom
=
note
.
Secret
.
NoteRandom
input
.
SpendFlag
=
"1"
if
note
.
Role
==
mixTy
.
Role_RETURNER
{
input
.
SpendFlag
=
"0"
}
input
.
AuthorizeFlag
=
"0"
if
len
(
input
.
AuthorizeSpendHash
)
>
LENNULLKEY
{
input
.
AuthorizeFlag
=
"1"
}
//get spend privacy key
privacyKey
,
err
:=
p
olicy
.
getAccountPrivacyKey
(
note
.
Account
)
privacyKey
,
err
:=
p
.
getAccountPrivacyKey
(
note
.
Account
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"getAccountPrivacyKey addr=%s"
,
note
.
Account
)
}
input
.
SpendPriKey
=
privacyKey
.
Privacy
.
PaymentKey
.
SpendKey
input
.
SpendFlag
=
"1"
if
privacyKey
.
Privacy
.
PaymentKey
.
ReceiveKey
==
input
.
ReturnPubKey
{
input
.
SpendFlag
=
"0"
}
//get tree path
treeProof
,
err
:=
p
olicy
.
getTreeProof
(
note
.
NoteHash
)
treeProof
,
err
:=
p
.
getTreeProof
(
note
.
NoteHash
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"getTreeProof for hash=%s"
,
note
.
NoteHash
)
}
...
...
@@ -113,7 +116,7 @@ func (policy *mixPolicy) getWithdrawParams(noteHash string) (*WithdrawInput, err
}
func
(
p
olicy
*
mixPolicy
)
createWithdrawTx
(
req
*
mixTy
.
CreateRawTxReq
)
(
*
types
.
Transaction
,
error
)
{
func
(
p
*
mixPolicy
)
createWithdrawTx
(
req
*
mixTy
.
CreateRawTxReq
)
(
*
types
.
Transaction
,
error
)
{
var
withdraw
mixTy
.
WithdrawTxReq
err
:=
types
.
Decode
(
req
.
Data
,
&
withdraw
)
if
err
!=
nil
{
...
...
@@ -131,7 +134,7 @@ func (policy *mixPolicy) createWithdrawTx(req *mixTy.CreateRawTxReq) (*types.Tra
var
sum
uint64
for
_
,
note
:=
range
notes
{
input
,
err
:=
p
olicy
.
getWithdrawParams
(
note
)
input
,
err
:=
p
.
getWithdrawParams
(
note
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"getWithdrawParams note=%s"
,
note
)
}
...
...
@@ -141,7 +144,7 @@ func (policy *mixPolicy) createWithdrawTx(req *mixTy.CreateRawTxReq) (*types.Tra
return
nil
,
errors
.
Wrapf
(
err
,
"getZkProofKeys note=%s"
,
note
)
}
//verify
if
err
:=
p
olicy
.
verifyProofOnChain
(
mixTy
.
VerifyType_WITHDRAW
,
proofInfo
,
withdraw
.
ZkPath
+
mixTy
.
WithdrawVk
);
err
!=
nil
{
if
err
:=
p
.
verifyProofOnChain
(
mixTy
.
VerifyType_WITHDRAW
,
proofInfo
,
withdraw
.
ZkPath
+
mixTy
.
WithdrawVk
);
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"verifyProof fail for note=%s"
,
note
)
}
...
...
@@ -158,16 +161,16 @@ func (policy *mixPolicy) createWithdrawTx(req *mixTy.CreateRawTxReq) (*types.Tra
return
nil
,
errors
.
Wrapf
(
types
.
ErrInvalidParam
,
"amount not match req=%d,note.sum=%d"
,
withdraw
.
TotalAmount
,
sum
)
}
return
p
olicy
.
getWithdrawTx
(
strings
.
TrimSpace
(
req
.
Title
+
mixTy
.
MixX
),
withdraw
.
TotalAmount
,
proofs
)
return
p
.
getWithdrawTx
(
strings
.
TrimSpace
(
req
.
Title
+
mixTy
.
MixX
),
withdraw
.
TotalAmount
,
proofs
)
}
func
(
p
olicy
*
mixPolicy
)
getWithdrawTx
(
execName
string
,
amount
uint64
,
proofs
[]
*
mixTy
.
ZkProofInfo
)
(
*
types
.
Transaction
,
error
)
{
func
(
p
*
mixPolicy
)
getWithdrawTx
(
execName
string
,
amount
uint64
,
proofs
[]
*
mixTy
.
ZkProofInfo
)
(
*
types
.
Transaction
,
error
)
{
payload
:=
&
mixTy
.
MixWithdrawAction
{}
payload
.
Amount
=
amount
payload
.
Proofs
=
proofs
cfg
:=
p
olicy
.
getWalletOperate
()
.
GetAPI
()
.
GetConfig
()
cfg
:=
p
.
getWalletOperate
()
.
GetAPI
()
.
GetConfig
()
action
:=
&
mixTy
.
MixAction
{
Ty
:
mixTy
.
MixActionWithdraw
,
Value
:
&
mixTy
.
MixAction_Withdraw
{
Withdraw
:
payload
},
...
...
plugin/dapp/mix/wallet/util.go
View file @
9b794a19
...
...
@@ -87,7 +87,7 @@ func decryptSecretData(req *mixTy.DecryptSecretData) (*mixTy.SecretData, error)
return
&
raw
,
nil
}
func
(
p
olicy
*
mixPolicy
)
verifyProofOnChain
(
ty
mixTy
.
VerifyType
,
proof
*
mixTy
.
ZkProofInfo
,
vkPath
string
)
error
{
func
(
p
*
mixPolicy
)
verifyProofOnChain
(
ty
mixTy
.
VerifyType
,
proof
*
mixTy
.
ZkProofInfo
,
vkPath
string
)
error
{
//vkpath verify
if
len
(
vkPath
)
>
0
{
vk
,
err
:=
getVerifyKey
(
vkPath
)
...
...
@@ -111,7 +111,7 @@ func (policy *mixPolicy) verifyProofOnChain(ty mixTy.VerifyType, proof *mixTy.Zk
Proof
:
proof
,
}
//onchain verify
_
,
err
:=
p
olicy
.
walletOperate
.
GetAPI
()
.
QueryChain
(
&
types
.
ChainExecutor
{
_
,
err
:=
p
.
walletOperate
.
GetAPI
()
.
QueryChain
(
&
types
.
ChainExecutor
{
Driver
:
"mix"
,
FuncName
:
"VerifyProof"
,
Param
:
types
.
Encode
(
verify
),
...
...
@@ -119,8 +119,8 @@ func (policy *mixPolicy) verifyProofOnChain(ty mixTy.VerifyType, proof *mixTy.Zk
return
err
}
func
(
p
olicy
*
mixPolicy
)
getPaymentKey
(
addr
string
)
(
*
mixTy
.
PaymentKey
,
error
)
{
msg
,
err
:=
p
olicy
.
walletOperate
.
GetAPI
()
.
QueryChain
(
&
types
.
ChainExecutor
{
func
(
p
*
mixPolicy
)
getPaymentKey
(
addr
string
)
(
*
mixTy
.
PaymentKey
,
error
)
{
msg
,
err
:=
p
.
walletOperate
.
GetAPI
()
.
QueryChain
(
&
types
.
ChainExecutor
{
Driver
:
"mix"
,
FuncName
:
"PaymentPubKey"
,
Param
:
types
.
Encode
(
&
types
.
ReqString
{
Data
:
addr
}),
...
...
@@ -131,8 +131,8 @@ func (policy *mixPolicy) getPaymentKey(addr string) (*mixTy.PaymentKey, error) {
return
msg
.
(
*
mixTy
.
PaymentKey
),
err
}
func
(
p
olicy
*
mixPolicy
)
getPathProof
(
leaf
string
)
(
*
mixTy
.
CommitTreeProve
,
error
)
{
msg
,
err
:=
p
olicy
.
walletOperate
.
GetAPI
()
.
QueryChain
(
&
types
.
ChainExecutor
{
func
(
p
*
mixPolicy
)
getPathProof
(
leaf
string
)
(
*
mixTy
.
CommitTreeProve
,
error
)
{
msg
,
err
:=
p
.
walletOperate
.
GetAPI
()
.
QueryChain
(
&
types
.
ChainExecutor
{
Driver
:
"mix"
,
FuncName
:
"GetTreePath"
,
Param
:
types
.
Encode
(
&
mixTy
.
TreeInfoReq
{
LeafHash
:
leaf
}),
...
...
@@ -143,32 +143,30 @@ func (policy *mixPolicy) getPathProof(leaf string) (*mixTy.CommitTreeProve, erro
return
msg
.
(
*
mixTy
.
CommitTreeProve
),
nil
}
func
(
p
olicy
*
mixPolicy
)
getNoteInfo
(
noteHash
string
,
noteStatus
mixTy
.
NoteStatus
)
(
*
mixTy
.
WalletIndex
Info
,
error
)
{
if
p
olicy
.
walletOperate
.
IsWalletLocked
()
{
func
(
p
*
mixPolicy
)
getNoteInfo
(
noteHash
string
)
(
*
mixTy
.
WalletNote
Info
,
error
)
{
if
p
.
walletOperate
.
IsWalletLocked
()
{
return
nil
,
types
.
ErrWalletIsLocked
}
var
index
mixTy
.
WalletMixIndexReq
index
.
NoteHash
=
noteHash
msg
,
err
:=
p
olicy
.
listMixInfos
(
&
index
)
msg
,
err
:=
p
.
listMixInfos
(
&
index
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"list noteHash=%s"
,
noteHash
)
}
resp
:=
msg
.
(
*
mixTy
.
Wallet
Index
Resp
)
resp
:=
msg
.
(
*
mixTy
.
Wallet
Note
Resp
)
if
len
(
resp
.
Notes
)
<
1
{
return
nil
,
errors
.
Wrapf
(
err
,
"list not found noteHash=%s"
,
noteHash
)
}
note
:=
msg
.
(
*
mixTy
.
WalletIndexResp
)
.
Notes
[
0
]
if
note
.
Status
!=
noteStatus
{
return
nil
,
errors
.
Wrapf
(
types
.
ErrNotAllow
,
"wrong note status=%s"
,
note
.
Status
.
String
())
}
note
:=
msg
.
(
*
mixTy
.
WalletNoteResp
)
.
Notes
[
0
]
return
note
,
nil
}
func
(
p
olicy
*
mixPolicy
)
getTreeProof
(
leaf
string
)
(
*
mixTy
.
TreePathProof
,
error
)
{
func
(
p
*
mixPolicy
)
getTreeProof
(
leaf
string
)
(
*
mixTy
.
TreePathProof
,
error
)
{
//get tree path
path
,
err
:=
p
olicy
.
getPathProof
(
leaf
)
path
,
err
:=
p
.
getPathProof
(
leaf
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"get tree proof for noteHash=%s"
,
leaf
)
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment