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
b4a6fb77
Commit
b4a6fb77
authored
Feb 23, 2021
by
madengji
Committed by
vipwzw
Sep 18, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
support deposit multi target
parent
b775d350
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
249 additions
and
175 deletions
+249
-175
mix.go
plugin/dapp/mix/commands/mix.go
+39
-46
authorize.go
plugin/dapp/mix/executor/authorize.go
+2
-2
deposit.go
plugin/dapp/mix/executor/deposit.go
+14
-10
transfer.go
plugin/dapp/mix/executor/transfer.go
+9
-3
withdraw.go
plugin/dapp/mix/executor/withdraw.go
+1
-1
mix.proto
plugin/dapp/mix/proto/mix.proto
+24
-19
mix.pb.go
plugin/dapp/mix/types/mix.pb.go
+0
-0
type.go
plugin/dapp/mix/types/type.go
+12
-0
exec.go
plugin/dapp/mix/wallet/exec.go
+32
-2
mix.go
plugin/dapp/mix/wallet/mix.go
+20
-17
mixbizdb.go
plugin/dapp/mix/wallet/mixbizdb.go
+11
-6
mixbizdb_test.go
plugin/dapp/mix/wallet/mixbizdb_test.go
+4
-4
txauth.go
plugin/dapp/mix/wallet/txauth.go
+2
-2
txdeposit.go
plugin/dapp/mix/wallet/txdeposit.go
+66
-34
txtransfer.go
plugin/dapp/mix/wallet/txtransfer.go
+0
-0
txwithdraw.go
plugin/dapp/mix/wallet/txwithdraw.go
+3
-2
util_test.go
plugin/dapp/mix/wallet/util_test.go
+10
-27
No files found.
plugin/dapp/mix/commands/mix.go
View file @
b4a6fb77
...
...
@@ -416,8 +416,8 @@ func createConfigPubKey(cmd *cobra.Command, args []string) {
func
mixConfigPaymentPubKeyParaCmd
()
*
cobra
.
Command
{
cmd
:=
&
cobra
.
Command
{
Use
:
"
pay
"
,
Short
:
"
mix payment pub key config
cmd"
,
Use
:
"
register
"
,
Short
:
"
receiver key register
cmd"
,
Run
:
createConfigPayPubKey
,
}
addPayPubKeyConfigFlags
(
cmd
)
...
...
@@ -629,7 +629,7 @@ func showMixTxs(cmd *cobra.Command, args []string) {
func
ShowPaymentPubKeyCmd
()
*
cobra
.
Command
{
cmd
:=
&
cobra
.
Command
{
Use
:
"paykey"
,
Short
:
"show
addr's payment pub
key info"
,
Short
:
"show
peer addr payment
key info"
,
Run
:
showPayment
,
}
addShowPaymentflags
(
cmd
)
...
...
@@ -637,7 +637,7 @@ func ShowPaymentPubKeyCmd() *cobra.Command {
}
func
addShowPaymentflags
(
cmd
*
cobra
.
Command
)
{
cmd
.
Flags
()
.
StringP
(
"addr"
,
"
s"
,
""
,
"mix tx hash
"
)
cmd
.
Flags
()
.
StringP
(
"addr"
,
"
a"
,
""
,
"account addr
"
)
cmd
.
MarkFlagRequired
(
"addr"
)
}
...
...
@@ -677,7 +677,7 @@ func WalletCmd() *cobra.Command {
func
ShowAccountPrivacyInfo
()
*
cobra
.
Command
{
cmd
:=
&
cobra
.
Command
{
Use
:
"keys"
,
Short
:
"show account privacy keys"
,
Short
:
"show account
note
privacy keys"
,
Run
:
accountPrivacy
,
}
accountPrivacyCmdFlags
(
cmd
)
...
...
@@ -685,17 +685,27 @@ func ShowAccountPrivacyInfo() *cobra.Command {
}
func
accountPrivacyCmdFlags
(
cmd
*
cobra
.
Command
)
{
cmd
.
Flags
()
.
StringP
(
"account"
,
"a"
,
""
,
"accounts"
)
cmd
.
MarkFlagRequired
(
"account"
)
cmd
.
Flags
()
.
StringP
(
"addr"
,
"a"
,
""
,
"user wallet addr"
)
cmd
.
Flags
()
.
StringP
(
"priv"
,
"p"
,
""
,
"user wallet privacy key,option"
)
cmd
.
Flags
()
.
Uint32P
(
"detail"
,
"d"
,
0
,
"if get payment priv keys,option"
)
}
func
accountPrivacy
(
cmd
*
cobra
.
Command
,
args
[]
string
)
{
rpcLaddr
,
_
:=
cmd
.
Flags
()
.
GetString
(
"rpc_laddr"
)
account
,
_
:=
cmd
.
Flags
()
.
GetString
(
"account"
)
priv
,
_
:=
cmd
.
Flags
()
.
GetString
(
"priv"
)
addr
,
_
:=
cmd
.
Flags
()
.
GetString
(
"addr"
)
detail
,
_
:=
cmd
.
Flags
()
.
GetUint32
(
"detail"
)
if
len
(
priv
)
==
0
&&
len
(
addr
)
==
0
{
fmt
.
Println
(
"err: one of addr or priv should be fill"
)
return
}
var
res
mixTy
.
WalletAddrPrivacy
ctx
:=
jsonclient
.
NewRPCCtx
(
rpcLaddr
,
"mix.ShowAccountPrivacyInfo"
,
&
types
.
ReqString
{
Data
:
account
},
&
res
)
ctx
:=
jsonclient
.
NewRPCCtx
(
rpcLaddr
,
"mix.ShowAccountPrivacyInfo"
,
&
mixTy
.
PaymentKeysReq
{
PrivKey
:
priv
,
Addr
:
addr
,
Detail
:
int32
(
detail
)
},
&
res
)
ctx
.
Run
()
}
...
...
@@ -1023,14 +1033,14 @@ func CreateDepositRawTxCmd() *cobra.Command {
}
func
depositSecretCmdFlags
(
cmd
*
cobra
.
Command
)
{
cmd
.
Flags
()
.
StringP
(
"
receiver"
,
"t"
,
""
,
"receiver addr
"
)
cmd
.
MarkFlagRequired
(
"
receiver
"
)
cmd
.
Flags
()
.
StringP
(
"
targets"
,
"t"
,
""
,
"target addrs,seperated by ','
"
)
cmd
.
MarkFlagRequired
(
"
targets
"
)
cmd
.
Flags
()
.
StringP
(
"return"
,
"r"
,
""
,
"return addr,optional"
)
cmd
.
Flags
()
.
StringP
(
"authorize"
,
"a"
,
""
,
"authorize addr,optional"
)
cmd
.
Flags
()
.
Uint64P
(
"amount"
,
"m"
,
0
,
"amount
"
)
cmd
.
Flags
()
.
StringP
(
"amount"
,
"m"
,
""
,
"amounts,seperated by ','
"
)
cmd
.
MarkFlagRequired
(
"amount"
)
cmd
.
Flags
()
.
StringP
(
"token"
,
"s"
,
"BTY"
,
"asset token, default BTY"
)
...
...
@@ -1044,33 +1054,30 @@ func depositSecretCmdFlags(cmd *cobra.Command) {
func
depositSecret
(
cmd
*
cobra
.
Command
,
args
[]
string
)
{
rpcLaddr
,
_
:=
cmd
.
Flags
()
.
GetString
(
"rpc_laddr"
)
paraName
,
_
:=
cmd
.
Flags
()
.
GetString
(
"paraName"
)
receiver
,
_
:=
cmd
.
Flags
()
.
GetString
(
"receiver
"
)
targets
,
_
:=
cmd
.
Flags
()
.
GetString
(
"targets
"
)
returnAddr
,
_
:=
cmd
.
Flags
()
.
GetString
(
"return"
)
authorize
,
_
:=
cmd
.
Flags
()
.
GetString
(
"authorize"
)
amount
,
_
:=
cmd
.
Flags
()
.
Get
Uint64
(
"amount"
)
amount
,
_
:=
cmd
.
Flags
()
.
Get
String
(
"amount"
)
assetExec
,
_
:=
cmd
.
Flags
()
.
GetString
(
"exec"
)
token
,
_
:=
cmd
.
Flags
()
.
GetString
(
"token"
)
path
,
_
:=
cmd
.
Flags
()
.
GetString
(
"path"
)
deposit
:=
&
mixTy
.
DepositInfo
{
Addr
:
receiver
,
ReceiverAddrs
:
targets
,
ReturnAddr
:
returnAddr
,
AuthorizeAddr
:
authorize
,
Amount
:
amount
,
}
circuits
:=
&
mixTy
.
CircuitPathInfo
{
Path
:
path
,
Amounts
:
amount
,
}
tx
:=
&
mixTy
.
DepositTxReq
{
Deposit
:
deposit
,
ZkPath
:
circuits
,
ZkPath
:
path
,
}
params
:=
&
mixTy
.
CreateRawTxReq
{
ActionTy
:
mixTy
.
MixActionDeposit
,
Data
:
types
.
Encode
(
tx
),
//Value:&mixTy.CreateRawTxReq_Deposit{Deposit:tx},
AssetExec
:
assetExec
,
AssetToken
:
token
,
Title
:
paraName
,
...
...
@@ -1092,17 +1099,17 @@ func CreateTransferRawTxCmd() *cobra.Command {
}
func
transferSecretCmdFlags
(
cmd
*
cobra
.
Command
)
{
cmd
.
Flags
()
.
StringP
(
"noteHash"
,
"n"
,
""
,
"note hash to spend"
)
cmd
.
Flags
()
.
StringP
(
"noteHash"
,
"n"
,
""
,
"note hash to spend
, seperate by ','
"
)
cmd
.
MarkFlagRequired
(
"noteHash"
)
cmd
.
Flags
()
.
StringP
(
"toAddr"
,
"t"
,
""
,
"transfer to addr"
)
cmd
.
Flags
()
.
StringP
(
"toAddr"
,
"t"
,
""
,
"transfer to addr
, only one addr
"
)
cmd
.
MarkFlagRequired
(
"toAddr"
)
cmd
.
Flags
()
.
StringP
(
"auth"
,
"a"
,
""
,
"transfer to auth addr,optional"
)
cmd
.
Flags
()
.
StringP
(
"returner"
,
"r"
,
""
,
"transfer to returner addr,optional"
)
cmd
.
Flags
()
.
Uint64P
(
"amount"
,
"m"
,
0
,
"transfer amount"
)
cmd
.
Flags
()
.
StringP
(
"amount"
,
"m"
,
""
,
"transfer amount"
)
cmd
.
MarkFlagRequired
(
"amount"
)
cmd
.
Flags
()
.
StringP
(
"token"
,
"s"
,
"BTY"
,
"asset token, default BTY"
)
...
...
@@ -1122,7 +1129,7 @@ func transferSecret(cmd *cobra.Command, args []string) {
toAddr
,
_
:=
cmd
.
Flags
()
.
GetString
(
"toAddr"
)
auth
,
_
:=
cmd
.
Flags
()
.
GetString
(
"auth"
)
returner
,
_
:=
cmd
.
Flags
()
.
GetString
(
"returner"
)
amount
,
_
:=
cmd
.
Flags
()
.
Get
Uint64
(
"amount"
)
amount
,
_
:=
cmd
.
Flags
()
.
Get
String
(
"amount"
)
inpath
,
_
:=
cmd
.
Flags
()
.
GetString
(
"inpath"
)
outpath
,
_
:=
cmd
.
Flags
()
.
GetString
(
"outpath"
)
...
...
@@ -1130,27 +1137,21 @@ func transferSecret(cmd *cobra.Command, args []string) {
assetExec
,
_
:=
cmd
.
Flags
()
.
GetString
(
"exec"
)
token
,
_
:=
cmd
.
Flags
()
.
GetString
(
"token"
)
inCircuits
:=
&
mixTy
.
CircuitPathInfo
{
Path
:
inpath
,
}
input
:=
&
mixTy
.
TransferInputTxReq
{
NoteHash
:
noteHash
,
ZkPath
:
inCircuits
,
NoteHash
s
:
noteHash
,
ZkPath
:
inpath
,
}
deposit
:=
&
mixTy
.
DepositInfo
{
Addr
:
toAddr
,
ReceiverAddrs
:
toAddr
,
ReturnAddr
:
returner
,
AuthorizeAddr
:
auth
,
Amount
:
amount
,
}
outCircuits
:=
&
mixTy
.
CircuitPathInfo
{
Path
:
outpath
,
Amounts
:
amount
,
}
output
:=
&
mixTy
.
TransferOutputTxReq
{
Deposit
:
deposit
,
ZkPath
:
out
Circuits
,
ZkPath
:
out
path
,
}
req
:=
&
mixTy
.
TransferTxReq
{
...
...
@@ -1206,14 +1207,10 @@ func withdrawSecret(cmd *cobra.Command, args []string) {
path
,
_
:=
cmd
.
Flags
()
.
GetString
(
"path"
)
circuits
:=
&
mixTy
.
CircuitPathInfo
{
Path
:
path
,
}
req
:=
&
mixTy
.
WithdrawTxReq
{
TotalAmount
:
amount
,
NoteHashs
:
noteHashs
,
ZkPath
:
circuits
,
ZkPath
:
path
,
}
params
:=
&
mixTy
.
CreateRawTxReq
{
...
...
@@ -1265,14 +1262,10 @@ func authSecret(cmd *cobra.Command, args []string) {
path
,
_
:=
cmd
.
Flags
()
.
GetString
(
"path"
)
circuits
:=
&
mixTy
.
CircuitPathInfo
{
Path
:
path
,
}
req
:=
&
mixTy
.
AuthTxReq
{
AuthorizeToAddr
:
toKey
,
NoteHash
:
noteHash
,
ZkPath
:
circuits
,
ZkPath
:
path
,
}
params
:=
&
mixTy
.
CreateRawTxReq
{
...
...
plugin/dapp/mix/executor/authorize.go
View file @
b4a6fb77
...
...
@@ -95,9 +95,9 @@ func (a *action) Authorize(authorize *mixTy.MixAuthorizeAction) (*types.Receipt,
receipt
:=
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
}
var
auths
,
authSpends
[]
string
for
_
,
in
:=
range
inputs
{
r
:=
makeReceipt
(
calcAuthorizeHashKey
(
in
.
AuthorizeHash
),
mixTy
.
TyLogAuthorizeSet
,
&
mixTy
.
ExistValue
{
Data
:
true
})
r
:=
makeReceipt
(
calcAuthorizeHashKey
(
in
.
AuthorizeHash
),
mixTy
.
TyLogAuthorizeSet
,
&
mixTy
.
ExistValue
{
Nullifier
:
in
.
AuthorizeHash
,
Exist
:
true
})
mergeReceipt
(
receipt
,
r
)
r
=
makeReceipt
(
calcAuthorizeSpendHashKey
(
in
.
AuthorizeSpendHash
),
mixTy
.
TyLogAuthorizeSpendSet
,
&
mixTy
.
ExistValue
{
Data
:
true
})
r
=
makeReceipt
(
calcAuthorizeSpendHashKey
(
in
.
AuthorizeSpendHash
),
mixTy
.
TyLogAuthorizeSpendSet
,
&
mixTy
.
ExistValue
{
Nullifier
:
in
.
AuthorizeSpendHash
,
Exist
:
true
})
mergeReceipt
(
receipt
,
r
)
auths
=
append
(
auths
,
in
.
AuthorizeHash
)
authSpends
=
append
(
authSpends
,
in
.
AuthorizeSpendHash
)
...
...
plugin/dapp/mix/executor/deposit.go
View file @
b4a6fb77
...
...
@@ -83,15 +83,17 @@ func (a *action) depositVerify(proof *mixTy.ZkProofInfo) (string, uint64, error)
4. add new commits to merkle tree
*/
func
(
a
*
action
)
Deposit
(
deposit
*
mixTy
.
MixDepositAction
)
(
*
types
.
Receipt
,
error
)
{
var
notes
[]
string
var
sum
uint64
//1. zk-proof校验
noteHash
,
amount
,
err
:=
a
.
depositVerify
(
deposit
.
Proof
)
for
_
,
p
:=
range
deposit
.
Proofs
{
noteHash
,
amount
,
err
:=
a
.
depositVerify
(
p
)
if
err
!=
nil
{
return
nil
,
err
return
nil
,
errors
.
Wrapf
(
err
,
"verify fail for input=%s"
,
p
.
PublicInput
)
}
sum
+=
amount
notes
=
append
(
notes
,
noteHash
)
}
////校验存款额,目前只支持一次只存一张支票
//if val != deposit.Amount {
// return nil, errors.Wrapf(mixTy.ErrInputParaNotMatch, "deposit amount=%d not equal proof amount=%d", deposit.Amount, val)
//}
//存款
cfg
:=
a
.
api
.
GetConfig
()
...
...
@@ -101,16 +103,18 @@ func (a *action) Deposit(deposit *mixTy.MixDepositAction) (*types.Receipt, error
}
//主链上存入toAddr为mix 执行器地址,平行链上为user.p.{}.mix执行器地址,execAddr和toAddr一致
execAddr
:=
address
.
ExecAddress
(
string
(
a
.
tx
.
Execer
))
receipt
,
err
:=
accoutDb
.
ExecTransfer
(
a
.
fromaddr
,
execAddr
,
execAddr
,
int64
(
amount
))
receipt
,
err
:=
accoutDb
.
ExecTransfer
(
a
.
fromaddr
,
execAddr
,
execAddr
,
int64
(
sum
))
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"
ExecTransfer
"
)
return
nil
,
errors
.
Wrapf
(
err
,
"
account save to exec
"
)
}
//push new commit to merkle tree
var
leaves
[][]
byte
leaves
=
append
(
leaves
,
transferFr2Bytes
(
noteHash
))
for
_
,
n
:=
range
notes
{
leaves
=
append
(
leaves
,
transferFr2Bytes
(
n
))
}
rpt
,
err
:=
pushTree
(
a
.
db
,
leaves
)
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
ors
.
Wrap
(
err
,
"pushTree"
)
}
mergeReceipt
(
receipt
,
rpt
)
...
...
plugin/dapp/mix/executor/transfer.go
View file @
b4a6fb77
...
...
@@ -111,17 +111,23 @@ func MixTransferInfoVerify(db dbm.KV, transfer *mixTy.MixTransferAction) ([]*mix
var
inputs
[]
*
mixTy
.
TransferInputPublicInput
var
outputs
[]
*
mixTy
.
TransferOutputPublicInput
in
,
err
:=
transferInputVerify
(
db
,
transfer
.
Input
)
//inputs
for
_
,
i
:=
range
transfer
.
Inputs
{
in
,
err
:=
transferInputVerify
(
db
,
i
)
if
err
!=
nil
{
return
nil
,
nil
,
err
}
inputs
=
append
(
inputs
,
in
)
}
//output
out
,
err
:=
transferOutputVerify
(
db
,
transfer
.
Output
)
if
err
!=
nil
{
return
nil
,
nil
,
err
}
outputs
=
append
(
outputs
,
out
)
//change
change
,
err
:=
transferOutputVerify
(
db
,
transfer
.
Change
)
if
err
!=
nil
{
return
nil
,
nil
,
err
...
...
@@ -129,7 +135,7 @@ func MixTransferInfoVerify(db dbm.KV, transfer *mixTy.MixTransferAction) ([]*mix
outputs
=
append
(
outputs
,
change
)
if
!
VerifyCommitValues
(
inputs
,
outputs
)
{
return
nil
,
nil
,
errors
.
Wrap
(
mixTy
.
ErrSpendInOutValueNotMatch
,
"verifyValue"
)
return
nil
,
nil
,
errors
.
Wrap
(
mixTy
.
ErrSpendInOutValueNotMatch
,
"verify
shield
Value"
)
}
return
inputs
,
outputs
,
nil
...
...
@@ -148,7 +154,7 @@ func (a *action) Transfer(transfer *mixTy.MixTransferAction) (*types.Receipt, er
receipt
:=
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
}
for
_
,
k
:=
range
inputs
{
r
:=
makeNullifierSetReceipt
(
k
.
NullifierHash
,
&
mixTy
.
ExistValue
{
Data
:
true
})
r
:=
makeNullifierSetReceipt
(
k
.
NullifierHash
,
&
mixTy
.
ExistValue
{
Nullifier
:
k
.
NullifierHash
,
Exist
:
true
})
mergeReceipt
(
receipt
,
r
)
}
...
...
plugin/dapp/mix/executor/withdraw.go
View file @
b4a6fb77
...
...
@@ -111,7 +111,7 @@ func (a *action) Withdraw(withdraw *mixTy.MixWithdrawAction) (*types.Receipt, er
//set nullifier
for
_
,
k
:=
range
nulliferSet
{
r
:=
makeNullifierSetReceipt
(
k
,
&
mixTy
.
ExistValue
{
Data
:
true
})
r
:=
makeNullifierSetReceipt
(
k
,
&
mixTy
.
ExistValue
{
Nullifier
:
k
,
Exist
:
true
})
mergeReceipt
(
receipt
,
r
)
}
return
receipt
,
nil
...
...
plugin/dapp/mix/proto/mix.proto
View file @
b4a6fb77
...
...
@@ -84,12 +84,12 @@ message ZkProofInfo {
}
message
MixDepositAction
{
ZkProofInfo
proof
=
1
;
repeated
ZkProofInfo
proofs
=
1
;
}
message
MixTransferAction
{
ZkProofInfo
input
=
1
;
repeated
ZkProofInfo
inputs
=
1
;
ZkProofInfo
output
=
2
;
ZkProofInfo
change
=
3
;
...
...
@@ -120,7 +120,6 @@ message MixAction {
}
message
DepositPublicInput
{
string
noteHash
=
1
;
string
amount
=
2
;
...
...
@@ -168,7 +167,8 @@ message VerifyProofInfo{
//nullifer 存在value
message
ExistValue
{
bool
data
=
1
;
string
nullifier
=
1
;
bool
exist
=
2
;
}
message
CommitTreeLeaves
{
...
...
@@ -248,22 +248,21 @@ message DecryptSecretData{
}
//path+filename, filename can take default
message
circuitPathInfo
{
string
path
=
1
;
}
//支持同时存入多个地址,多个地址具有相同的returnAddr和AuthorizeAddr,如果不同,则单个来存
message
DepositInfo
{
string
addr
=
1
;
string
receiverAddrs
=
1
;
string
returnAddr
=
2
;
string
authorizeAddr
=
3
;
uint64
amount
=
4
;
string
amounts
=
4
;
}
//钱包生成deposit tx
message
DepositTxReq
{
DepositInfo
deposit
=
1
;
circuitPathInfo
zkPath
=
2
;
string
zkPath
=
2
;
}
...
...
@@ -285,8 +284,8 @@ message TreePathProof{
//可withdraw 多个note
message
WithdrawTxReq
{
uint64
totalAmount
=
1
;
string
noteHashs
=
2
;
circuitPathInfo
zkPath
=
3
;
string
noteHashs
=
2
;
// seperate by ","
string
zkPath
=
3
;
}
...
...
@@ -306,7 +305,7 @@ message WithdrawProofRe{
message
AuthTxReq
{
string
noteHash
=
1
;
string
authorizeToAddr
=
3
;
circuitPathInfo
zkPath
=
4
;
string
zkPath
=
4
;
}
message
AuthProofRe
{
...
...
@@ -322,13 +321,13 @@ message AuthProofRe{
}
message
TransferInputTxReq
{
string
noteHash
=
1
;
circuitPathInfo
zkPath
=
2
;
string
noteHash
s
=
1
;
string
zkPath
=
2
;
}
message
TransferOutputTxReq
{
DepositInfo
deposit
=
1
;
circuitPathInfo
zkPath
=
2
;
string
zkPath
=
2
;
}
message
TransferTxReq
{
...
...
@@ -371,10 +370,10 @@ message TransferProofResp{
}
message
ShieldAmountRst
{
string
inputRandom
=
1
;
repeated
string
inputRandoms
=
1
;
string
outputRandom
=
2
;
string
changeRandom
=
3
;
ShieldAmount
input
=
4
;
repeated
ShieldAmount
inputs
=
4
;
ShieldAmount
output
=
5
;
ShieldAmount
change
=
6
;
...
...
@@ -390,6 +389,12 @@ message CreateRawTxReq{
}
message
PaymentKeysReq
{
string
privKey
=
1
;
//user wallet priv key
string
addr
=
2
;
//user addr
int32
detail
=
3
;
//获取私钥信息
}
enum
NoteStatus
{
UNDEF
=
0
;
VALID
=
1
;
//已授权可使用
...
...
plugin/dapp/mix/types/mix.pb.go
View file @
b4a6fb77
This diff is collapsed.
Click to expand it.
plugin/dapp/mix/types/type.go
View file @
b4a6fb77
...
...
@@ -74,6 +74,7 @@ func (p *MixType) GetLogMap() map[int64]*types.LogInfo {
TyLogCurrentCommitTreeLeaves
:
{
Ty
:
reflect
.
TypeOf
(
CommitTreeLeaves
{}),
Name
:
"LogCommitTreeLeaves"
},
TyLogCurrentCommitTreeRoots
:
{
Ty
:
reflect
.
TypeOf
(
CommitTreeRoots
{}),
Name
:
"LogCommitTreeRoots"
},
TyLogMixConfigPaymentKey
:
{
Ty
:
reflect
.
TypeOf
(
PaymentKey
{}),
Name
:
"LogConfigReceivingKey"
},
TyLogNulliferSet
:
{
Ty
:
reflect
.
TypeOf
(
ExistValue
{}),
Name
:
"LogNullifierSet"
},
}
}
...
...
@@ -157,6 +158,17 @@ func MulCurvePointH(val string) *twistededwards.Point {
return
&
pointV
}
func
GetCurveSum
(
points
...*
twistededwards
.
Point
)
*
twistededwards
.
Point
{
//Add之前需初始化pointSum,不能空值,不然会等于0
pointSum
:=
twistededwards
.
NewPoint
(
points
[
0
]
.
X
,
points
[
0
]
.
Y
)
for
_
,
a
:=
range
points
[
1
:
]
{
pointSum
.
Add
(
&
pointSum
,
a
)
}
return
&
pointSum
}
//A=B+C
func
CheckSumEqual
(
points
...*
twistededwards
.
Point
)
bool
{
if
len
(
points
)
<
2
{
...
...
plugin/dapp/mix/wallet/exec.go
View file @
b4a6fb77
...
...
@@ -5,12 +5,42 @@
package
wallet
import
(
"github.com/33cn/chain33/common"
"github.com/33cn/chain33/types"
mixTy
"github.com/33cn/plugin/plugin/dapp/mix/types"
"github.com/pkg/errors"
)
func
(
policy
*
mixPolicy
)
On_ShowAccountPrivacyInfo
(
req
*
types
.
ReqString
)
(
types
.
Message
,
error
)
{
return
policy
.
getAccountPrivacyKey
(
req
.
Data
)
func
(
policy
*
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"
)
}
//通过私钥获取
if
len
(
req
.
PrivKey
)
>
0
{
prikeybyte
,
err
:=
common
.
FromHex
(
req
.
PrivKey
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"privkey fromHex error,key=%s"
,
req
.
PrivKey
)
}
var
ret
mixTy
.
WalletAddrPrivacy
ret
.
Privacy
=
newPrivacyKey
(
prikeybyte
)
if
req
.
Detail
<=
0
{
ret
.
Privacy
.
EncryptKey
.
PrivKey
=
""
ret
.
Privacy
.
PaymentKey
.
SpendKey
=
""
}
return
&
ret
,
nil
}
//通过account 从钱包获取
keys
,
err
:=
policy
.
getAccountPrivacyKey
(
req
.
Addr
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"get account =%s privacy key"
,
req
.
Addr
)
}
if
req
.
Detail
<=
0
{
keys
.
Privacy
.
EncryptKey
.
PrivKey
=
""
keys
.
Privacy
.
PaymentKey
.
SpendKey
=
""
}
return
keys
,
nil
}
func
(
policy
*
mixPolicy
)
On_ShowAccountNoteInfo
(
req
*
types
.
ReqAddrs
)
(
types
.
Message
,
error
)
{
...
...
plugin/dapp/mix/wallet/mix.go
View file @
b4a6fb77
...
...
@@ -22,21 +22,27 @@ import (
const
CECBLOCKSIZE
=
32
// newPrivacyWithPrivKey create privacy from private key
//payment, payPrivKey=hash(privkey), payPubkey=hash(payPrivKey)
//DH crypt key, prikey=payPrikey, pubKey=payPrikey*G
func
newPrivacyKey
(
privKey
[]
byte
)
(
*
mixTy
.
AccountPrivacyKey
,
error
)
{
payPrivacyKey
:=
mimcHashByte
([][]
byte
{
privKey
})
/*
从secp256k1根私钥创建支票需要的私钥和公钥
payPrivKey = rootPrivKey *G_X25519 这样很难泄露rootPrivKey
支票收款key: ReceiveKey= hash(payPrivKey) --或者*G的X坐标值, 看哪个电路少?
DH加解密key: encryptPubKey= payPrivKey *G_X25519, 也是很安全的,只是电路里面目前不支持x25519
*/
func
newPrivacyKey
(
rootPrivKey
[]
byte
)
*
mixTy
.
AccountPrivacyKey
{
ecdh
:=
X25519
()
key
:=
ecdh
.
PublicKey
(
rootPrivKey
)
payPrivKey
:=
key
.
([
32
]
byte
)
//payPrivKey := mimcHashByte([][]byte{rootPrivKey})
paymentKey
:=
&
mixTy
.
PaymentKeyPair
{}
paymentKey
.
SpendKey
=
mixTy
.
Byte2Str
(
payPriv
acyKey
)
paymentKey
.
ReceiveKey
=
mixTy
.
Byte2Str
(
mimcHashByte
([][]
byte
{
payPriv
acyKey
}))
paymentKey
.
SpendKey
=
mixTy
.
Byte2Str
(
payPriv
Key
[
:
]
)
paymentKey
.
ReceiveKey
=
mixTy
.
Byte2Str
(
mimcHashByte
([][]
byte
{
payPriv
Key
[
:
]
}))
encryptKeyPair
:=
&
mixTy
.
EncryptKeyPair
{}
//ecdh := NewCurveBn256ECDH()
ecdh
:=
X25519
()
pubkey
:=
ecdh
.
PublicKey
(
payPrivacyKey
)
//需要Hex编码,而不腻使用fr.string, 模范围不同
encryptKeyPair
.
PrivKey
=
hex
.
EncodeToString
(
payPrivacyKey
)
pubkey
:=
ecdh
.
PublicKey
(
payPrivKey
)
//需要Hex编码,不要使用fr.string, 模范围不同
encryptKeyPair
.
PrivKey
=
hex
.
EncodeToString
(
payPrivKey
[
:
])
pubData
:=
pubkey
.
([
32
]
byte
)
encryptKeyPair
.
PubKey
=
hex
.
EncodeToString
(
pubData
[
:
])
...
...
@@ -44,7 +50,7 @@ func newPrivacyKey(privKey []byte) (*mixTy.AccountPrivacyKey, error) {
privacy
.
PaymentKey
=
paymentKey
privacy
.
EncryptKey
=
encryptKeyPair
return
privacy
,
nil
return
privacy
}
//CEC加密需要保证明文是秘钥的倍数,如果不是,则需要填充明文,在解密时候把填充物去掉
...
...
@@ -201,10 +207,7 @@ func (policy *mixPolicy) savePrivacyPair(addr string) (*mixTy.WalletAddrPrivacy,
}
bizlog
.
Info
(
"savePrivacyPair"
,
"pri"
,
common
.
ToHex
(
priv
.
Bytes
()),
"addr"
,
addr
)
newPrivacy
,
err
:=
newPrivacyKey
(
priv
.
Bytes
())
if
err
!=
nil
{
return
nil
,
err
}
newPrivacy
:=
newPrivacyKey
(
priv
.
Bytes
())
password
:=
[]
byte
(
policy
.
getWalletOperate
()
.
GetPassword
())
encryptered
:=
encryptDataWithPadding
(
password
,
types
.
Encode
(
newPrivacy
))
...
...
plugin/dapp/mix/wallet/mixbizdb.go
View file @
b4a6fb77
...
...
@@ -91,28 +91,33 @@ func (p *mixPolicy) processMixTx(tx *types.Transaction, height, index int64) (*t
}
func
(
p
*
mixPolicy
)
processDeposit
(
deposit
*
mixTy
.
MixDepositAction
,
heightIndex
string
,
table
*
table
.
Table
)
{
data
,
err
:=
mixTy
.
DecodePubInput
(
mixTy
.
VerifyType_DEPOSIT
,
deposit
.
Proof
.
PublicInput
)
for
_
,
proof
:=
range
deposit
.
Proofs
{
data
,
err
:=
mixTy
.
DecodePubInput
(
mixTy
.
VerifyType_DEPOSIT
,
proof
.
PublicInput
)
if
err
!=
nil
{
bizlog
.
Error
(
"processDeposit decode"
,
"pubInput"
,
deposit
.
P
roof
.
PublicInput
)
bizlog
.
Error
(
"processDeposit decode"
,
"pubInput"
,
p
roof
.
PublicInput
)
return
}
input
:=
data
.
(
*
mixTy
.
DepositPublicInput
)
p
.
processSecretGroup
(
input
.
NoteHash
,
deposit
.
Proof
.
Secrets
,
heightIndex
,
table
)
p
.
processSecretGroup
(
input
.
NoteHash
,
proof
.
Secrets
,
heightIndex
,
table
)
}
}
func
(
p
*
mixPolicy
)
processTransfer
(
transfer
*
mixTy
.
MixTransferAction
,
heightIndex
string
,
table
*
table
.
Table
)
{
var
nulls
[]
string
data
,
err
:=
mixTy
.
DecodePubInput
(
mixTy
.
VerifyType_TRANSFERINPUT
,
transfer
.
Input
.
PublicInput
)
for
_
,
in
:=
range
transfer
.
Inputs
{
data
,
err
:=
mixTy
.
DecodePubInput
(
mixTy
.
VerifyType_TRANSFERINPUT
,
in
.
PublicInput
)
if
err
!=
nil
{
bizlog
.
Error
(
"processTransfer.input decode"
,
"pubInput"
,
transfer
.
Input
.
PublicInput
)
bizlog
.
Error
(
"processTransfer.input decode"
,
"pubInput"
,
in
.
PublicInput
)
return
}
input
:=
data
.
(
*
mixTy
.
TransferInputPublicInput
)
nulls
=
append
(
nulls
,
input
.
NullifierHash
)
}
p
.
processNullifiers
(
nulls
,
table
)
//out
data
,
err
=
mixTy
.
DecodePubInput
(
mixTy
.
VerifyType_TRANSFEROUTPUT
,
transfer
.
Output
.
PublicInput
)
data
,
err
:
=
mixTy
.
DecodePubInput
(
mixTy
.
VerifyType_TRANSFEROUTPUT
,
transfer
.
Output
.
PublicInput
)
if
err
!=
nil
{
bizlog
.
Error
(
"processTransfer.output decode"
,
"pubInput"
,
transfer
.
Output
.
PublicInput
)
return
...
...
plugin/dapp/mix/wallet/mixbizdb_test.go
View file @
b4a6fb77
...
...
@@ -16,8 +16,8 @@ func TestNewPrivacyWithPrivKey(t *testing.T) {
keyByte
,
err
:=
hex
.
DecodeString
(
prikey
)
assert
.
Equal
(
t
,
nil
,
err
)
pairs
,
err
:=
newPrivacyKey
(
keyByte
)
assert
.
Equal
(
t
,
nil
,
err
)
pairs
:=
newPrivacyKey
(
keyByte
)
t
.
Log
(
"payPri"
,
pairs
.
PaymentKey
.
SpendKey
,
"payPub"
,
pairs
.
PaymentKey
.
ReceiveKey
)
t
.
Log
(
"crytoPub"
,
pairs
.
EncryptKey
.
PubKey
,
"crytoPri"
,
pairs
.
EncryptKey
.
PrivKey
)
...
...
@@ -87,8 +87,8 @@ func TestEncodeSecretData(t *testing.T) {
prikey
:=
"4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01"
keyByte
,
err
:=
hex
.
DecodeString
(
prikey
)
assert
.
Equal
(
t
,
nil
,
err
)
privacy
,
err
:=
newPrivacyKey
(
keyByte
)
assert
.
Equal
(
t
,
nil
,
err
)
privacy
:=
newPrivacyKey
(
keyByte
)
ret
:=
types
.
Encode
(
secret
)
hexRet
:=
hex
.
EncodeToString
(
ret
)
//assert.Nil(t,err)
...
...
plugin/dapp/mix/wallet/txauth.go
View file @
b4a6fb77
...
...
@@ -132,12 +132,12 @@ func (policy *mixPolicy) createAuthTx(req *mixTy.CreateRawTxReq) (*types.Transac
return
nil
,
err
}
proofInfo
,
err
:=
getZkProofKeys
(
auth
.
ZkPath
.
Path
+
mixTy
.
AuthCircuit
,
auth
.
ZkPath
.
Path
+
mixTy
.
AuthPk
,
*
input
)
proofInfo
,
err
:=
getZkProofKeys
(
auth
.
ZkPath
+
mixTy
.
AuthCircuit
,
auth
.
Zk
Path
+
mixTy
.
AuthPk
,
*
input
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"getZkProofKeys note=%s"
,
auth
.
NoteHash
)
}
//verify
if
err
:=
policy
.
verifyProofOnChain
(
mixTy
.
VerifyType_AUTHORIZE
,
proofInfo
,
auth
.
ZkPath
.
Path
+
mixTy
.
AuthVk
);
err
!=
nil
{
if
err
:=
policy
.
verifyProofOnChain
(
mixTy
.
VerifyType_AUTHORIZE
,
proofInfo
,
auth
.
ZkPath
+
mixTy
.
AuthVk
);
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"verifyProof fail for note=%s"
,
auth
.
NoteHash
)
}
...
...
plugin/dapp/mix/wallet/txdeposit.go
View file @
b4a6fb77
...
...
@@ -6,8 +6,8 @@ package wallet
import
(
"encoding/hex"
"fmt"
"strconv"
"strings"
"github.com/33cn/chain33/common/address"
...
...
@@ -32,38 +32,42 @@ type DepositInput struct {
NoteRandom
string
`tag:"secret"`
}
func
(
policy
*
mixPolicy
)
depositParams
(
re
q
*
mixTy
.
DepositInfo
)
(
*
mixTy
.
DepositProofResp
,
error
)
{
if
req
==
nil
||
len
(
req
.
Add
r
)
<=
0
{
return
nil
,
errors
.
Wrap
(
types
.
ErrInvalidParam
,
"
paymentAdd
r is nil"
)
func
(
policy
*
mixPolicy
)
depositParams
(
re
ceiver
,
returner
,
auth
,
amount
string
)
(
*
mixTy
.
DepositProofResp
,
error
)
{
if
len
(
receive
r
)
<=
0
{
return
nil
,
errors
.
Wrap
(
types
.
ErrInvalidParam
,
"
receive
r is nil"
)
}
if
req
.
Amount
<=
0
{
return
nil
,
errors
.
Wrapf
(
types
.
ErrInvalidParam
,
"deposit amount=%d need big than 0"
,
req
.
Amount
)
_
,
e
:=
strconv
.
ParseUint
(
amount
,
0
,
0
)
if
e
!=
nil
{
return
nil
,
errors
.
Wrapf
(
e
,
"deposit amount=%s"
,
amount
)
}
var
secret
mixTy
.
SecretData
secret
.
Amount
=
strconv
.
FormatUint
(
req
.
Amount
,
10
)
secret
.
Amount
=
amount
//1. nullifier 获取随机值
var
fr
fr_bn256
.
Element
fr
.
SetRandom
()
secret
.
NoteRandom
=
fr
.
String
()
//TODO 线上检查是否随机值在nullifer里面
// 获取receiving addr对应的paymentKey
toKey
,
e
:=
policy
.
getPaymentKey
(
req
.
Add
r
)
payKeys
,
e
:=
policy
.
getPaymentKey
(
receive
r
)
if
e
!=
nil
{
return
nil
,
errors
.
Wrapf
(
e
,
"get payment key for addr = %s"
,
re
q
.
Add
r
)
return
nil
,
errors
.
Wrapf
(
e
,
"get payment key for addr = %s"
,
re
ceive
r
)
}
secret
.
ReceiverKey
=
toKey
.
ReceiverKey
secret
.
ReceiverKey
=
payKeys
.
ReceiverKey
//获取return addr对应的key
var
returnKey
*
mixTy
.
PaymentKey
var
err
error
//如果Input不填,缺省空为“0”字符串
secret
.
ReturnKey
=
"0"
if
len
(
re
q
.
ReturnAdd
r
)
>
0
{
returnKey
,
err
=
policy
.
getPaymentKey
(
re
q
.
ReturnAdd
r
)
if
len
(
re
turne
r
)
>
0
{
returnKey
,
err
=
policy
.
getPaymentKey
(
re
turne
r
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"get payment key for return addr = %s"
,
re
q
.
ReturnAdd
r
)
return
nil
,
errors
.
Wrapf
(
err
,
"get payment key for return addr = %s"
,
re
turne
r
)
}
secret
.
ReturnKey
=
returnKey
.
ReceiverKey
}
...
...
@@ -71,10 +75,10 @@ func (policy *mixPolicy) depositParams(req *mixTy.DepositInfo) (*mixTy.DepositPr
//获取auth addr对应的key
var
authKey
*
mixTy
.
PaymentKey
secret
.
AuthorizeKey
=
"0"
if
len
(
req
.
AuthorizeAddr
)
>
0
{
authKey
,
err
=
policy
.
getPaymentKey
(
req
.
AuthorizeAddr
)
if
len
(
auth
)
>
0
{
authKey
,
err
=
policy
.
getPaymentKey
(
auth
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"get payment key for authorize addr = %s"
,
req
.
AuthorizeAddr
)
return
nil
,
errors
.
Wrapf
(
err
,
"get payment key for authorize addr = %s"
,
auth
)
}
secret
.
AuthorizeKey
=
authKey
.
ReceiverKey
}
...
...
@@ -83,22 +87,22 @@ func (policy *mixPolicy) depositParams(req *mixTy.DepositInfo) (*mixTy.DepositPr
data
:=
types
.
Encode
(
&
secret
)
var
group
mixTy
.
DHSecretGroup
secretData
,
err
:=
encryptData
(
toKey
.
EncryptKey
,
data
)
secretData
,
err
:=
encryptData
(
payKeys
.
EncryptKey
,
data
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"encryptData to addr = %s"
,
re
q
.
Add
r
)
return
nil
,
errors
.
Wrapf
(
err
,
"encryptData to addr = %s"
,
re
ceive
r
)
}
group
.
Receiver
=
hex
.
EncodeToString
(
types
.
Encode
(
secretData
))
if
returnKey
!=
nil
{
secretData
,
err
=
encryptData
(
returnKey
.
EncryptKey
,
data
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"encryptData to addr = %s"
,
re
q
.
ReturnAdd
r
)
return
nil
,
errors
.
Wrapf
(
err
,
"encryptData to addr = %s"
,
re
turne
r
)
}
group
.
Returner
=
hex
.
EncodeToString
(
types
.
Encode
(
secretData
))
}
if
authKey
!=
nil
{
secretData
,
err
=
encryptData
(
authKey
.
EncryptKey
,
data
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"encryptData to addr = %s"
,
req
.
AuthorizeAddr
)
return
nil
,
errors
.
Wrapf
(
err
,
"encryptData to addr = %s"
,
auth
)
}
group
.
Authorize
=
hex
.
EncodeToString
(
types
.
Encode
(
secretData
))
}
...
...
@@ -119,14 +123,9 @@ func (policy *mixPolicy) depositParams(req *mixTy.DepositInfo) (*mixTy.DepositPr
}
func
(
policy
*
mixPolicy
)
createDepositTx
(
req
*
mixTy
.
CreateRawTxReq
)
(
*
types
.
Transaction
,
error
)
{
var
deposit
mixTy
.
DepositTxReq
err
:=
types
.
Decode
(
req
.
Data
,
&
deposit
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"decode req fail"
)
}
func
(
policy
*
mixPolicy
)
getDepositProof
(
receiver
,
returner
,
auth
,
amount
,
zkPath
string
)
(
*
mixTy
.
ZkProofInfo
,
error
)
{
resp
,
err
:=
policy
.
depositParams
(
deposit
.
Deposi
t
)
resp
,
err
:=
policy
.
depositParams
(
receiver
,
returner
,
auth
,
amoun
t
)
if
err
!=
nil
{
return
nil
,
err
}
...
...
@@ -139,24 +138,57 @@ func (policy *mixPolicy) createDepositTx(req *mixTy.CreateRawTxReq) (*types.Tran
input
.
ReturnPubKey
=
resp
.
Proof
.
ReturnKey
input
.
NoteRandom
=
resp
.
Proof
.
NoteRandom
proofInfo
,
err
:=
getZkProofKeys
(
deposit
.
ZkPath
.
Path
+
mixTy
.
DepositCircuit
,
deposit
.
ZkPath
.
Path
+
mixTy
.
DepositPk
,
input
)
proofInfo
,
err
:=
getZkProofKeys
(
zkPath
+
mixTy
.
DepositCircuit
,
zk
Path
+
mixTy
.
DepositPk
,
input
)
if
err
!=
nil
{
return
nil
,
err
}
//线上验证proof,失败的原因有可能circuit,Pk和线上vk不匹配,或不是一起产生的版本
if
err
:=
policy
.
verifyProofOnChain
(
mixTy
.
VerifyType_DEPOSIT
,
proofInfo
,
deposit
.
ZkPath
.
Path
+
mixTy
.
DepositVk
);
err
!=
nil
{
if
err
:=
policy
.
verifyProofOnChain
(
mixTy
.
VerifyType_DEPOSIT
,
proofInfo
,
zk
Path
+
mixTy
.
DepositVk
);
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"verifyProof fail"
)
}
fmt
.
Println
(
"createDepositTx ok"
)
proofInfo
.
Secrets
=
resp
.
Secrets
return
policy
.
getDepositTx
(
strings
.
TrimSpace
(
req
.
Title
+
mixTy
.
MixX
),
proofInfo
)
return
proofInfo
,
nil
}
func
(
policy
*
mixPolicy
)
createDepositTx
(
req
*
mixTy
.
CreateRawTxReq
)
(
*
types
.
Transaction
,
error
)
{
var
deposit
mixTy
.
DepositTxReq
err
:=
types
.
Decode
(
req
.
Data
,
&
deposit
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"decode req fail"
)
}
if
deposit
.
Deposit
==
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"decode deposit fail"
)
}
if
len
(
deposit
.
ZkPath
)
==
0
{
deposit
.
ZkPath
=
"./"
}
//多个receiver
receivers
:=
strings
.
Split
(
deposit
.
Deposit
.
ReceiverAddrs
,
","
)
amounts
:=
strings
.
Split
(
deposit
.
Deposit
.
Amounts
,
","
)
if
len
(
receivers
)
!=
len
(
amounts
)
||
len
(
receivers
)
==
0
{
return
nil
,
errors
.
Wrapf
(
types
.
ErrInvalidParam
,
"not match receivers=%s and amounts=%s"
,
deposit
.
Deposit
.
ReceiverAddrs
,
deposit
.
Deposit
.
Amounts
)
}
var
proofs
[]
*
mixTy
.
ZkProofInfo
for
i
,
rcv
:=
range
receivers
{
p
,
err
:=
policy
.
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
policy
.
getDepositTx
(
strings
.
TrimSpace
(
req
.
Title
+
mixTy
.
MixX
),
proofs
)
}
func
(
policy
*
mixPolicy
)
getDepositTx
(
execName
string
,
proof
*
mixTy
.
ZkProofInfo
)
(
*
types
.
Transaction
,
error
)
{
func
(
policy
*
mixPolicy
)
getDepositTx
(
execName
string
,
proof
s
[]
*
mixTy
.
ZkProofInfo
)
(
*
types
.
Transaction
,
error
)
{
payload
:=
&
mixTy
.
MixDepositAction
{}
payload
.
Proof
=
proof
payload
.
Proof
s
=
proofs
cfg
:=
policy
.
getWalletOperate
()
.
GetAPI
()
.
GetConfig
()
action
:=
&
mixTy
.
MixAction
{
...
...
@@ -170,6 +202,6 @@ func (policy *mixPolicy) getDepositTx(execName string, proof *mixTy.ZkProofInfo)
To
:
address
.
ExecAddress
(
execName
),
Expire
:
types
.
Now
()
.
Unix
()
+
int64
(
300
),
//5 min
}
fmt
.
Println
(
"createDepositTx tx"
)
return
types
.
FormatTx
(
cfg
,
execName
,
tx
)
}
plugin/dapp/mix/wallet/txtransfer.go
View file @
b4a6fb77
This diff is collapsed.
Click to expand it.
plugin/dapp/mix/wallet/txwithdraw.go
View file @
b4a6fb77
...
...
@@ -136,12 +136,12 @@ func (policy *mixPolicy) createWithdrawTx(req *mixTy.CreateRawTxReq) (*types.Tra
return
nil
,
errors
.
Wrapf
(
err
,
"getWithdrawParams note=%s"
,
note
)
}
proofInfo
,
err
:=
getZkProofKeys
(
withdraw
.
ZkPath
.
Path
+
mixTy
.
WithdrawCircuit
,
withdraw
.
ZkPath
.
Path
+
mixTy
.
WithdrawPk
,
*
input
)
proofInfo
,
err
:=
getZkProofKeys
(
withdraw
.
ZkPath
+
mixTy
.
WithdrawCircuit
,
withdraw
.
Zk
Path
+
mixTy
.
WithdrawPk
,
*
input
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"getZkProofKeys note=%s"
,
note
)
}
//verify
if
err
:=
policy
.
verifyProofOnChain
(
mixTy
.
VerifyType_WITHDRAW
,
proofInfo
,
withdraw
.
ZkPath
.
Path
+
mixTy
.
WithdrawVk
);
err
!=
nil
{
if
err
:=
policy
.
verifyProofOnChain
(
mixTy
.
VerifyType_WITHDRAW
,
proofInfo
,
withdraw
.
ZkPath
+
mixTy
.
WithdrawVk
);
err
!=
nil
{
return
nil
,
errors
.
Wrapf
(
err
,
"verifyProof fail for note=%s"
,
note
)
}
...
...
@@ -153,6 +153,7 @@ func (policy *mixPolicy) createWithdrawTx(req *mixTy.CreateRawTxReq) (*types.Tra
proofs
=
append
(
proofs
,
proofInfo
)
}
//不设计找零操作,可以全部提取回来后再存入,提取的找零一定是本账户的,不利于隐私,而且提取操作功能不够单一
if
sum
!=
withdraw
.
TotalAmount
{
return
nil
,
errors
.
Wrapf
(
types
.
ErrInvalidParam
,
"amount not match req=%d,note.sum=%d"
,
withdraw
.
TotalAmount
,
sum
)
}
...
...
plugin/dapp/mix/wallet/util_test.go
View file @
b4a6fb77
...
...
@@ -13,33 +13,16 @@ import (
)
func
TestGetCommitValue
(
t
*
testing
.
T
)
{
var
note
,
transfer
,
minFee
uint64
note
=
100
transfer
=
60
var
out
,
change
,
minFee
,
sum
uint64
var
inputs
[]
uint64
inputs
=
[]
uint64
{
100
,
80
}
out
=
60
minFee
=
1
_
,
err
:=
getShieldValue
(
note
,
transfer
,
minFee
)
assert
.
Nil
(
t
,
err
)
//transfer > note
note
=
100
transfer
=
100
minFee
=
1
_
,
err
=
getShieldValue
(
note
,
transfer
,
minFee
)
t
.
Log
(
err
)
assert
.
NotNil
(
t
,
err
)
note
=
100
transfer
=
101
minFee
=
0
_
,
err
=
getShieldValue
(
note
,
transfer
,
minFee
)
t
.
Log
(
err
)
assert
.
NotNil
(
t
,
err
)
//change=0
note
=
100
transfer
=
99
minFee
=
1
_
,
err
=
getShieldValue
(
note
,
transfer
,
minFee
)
for
_
,
i
:=
range
inputs
{
sum
+=
i
}
change
=
sum
-
out
-
minFee
_
,
err
:=
getShieldValue
(
inputs
,
out
,
change
,
minFee
)
assert
.
Nil
(
t
,
err
)
a
:=
"0a9c010a4d3136323433323838333039363632323833373538343930323239313730303834393836343035373630373234353332323934333436353837323033353436363930353333373131303333323139124b3238383637383239373931373237373235343930333236303134303538313534363138303135353433383231393339363836333632313634323236303434353739313434393237383237331a82033078656663333331616261616139653039353966636536356163343364626534306364646139356534356261636163613161326166626265366637323533633132326233346264323337353932343066306237623836653363343635666131343065666332636665623861653035366234323163303665353062396532646564636236383963336536656435363636373731343235663736313931653831356665666633646432393965633535386261323731343238333131623130353364376265633864646163313733393632326238666138326438373336666531623332633835376438343330643634646637336530643265326238373932396335633762366437336534383365363130303561313361376531643730636637653834656132613235343166373235363834656266613737653235313232326466313039336230313964646165623963376134393763316538653737386462313730323636323536666666363332643437363738626633366634383361373334346666326330"
...
...
@@ -50,7 +33,7 @@ func TestGetCommitValue(t *testing.T) {
err
=
types
.
Decode
(
da
,
&
data
)
assert
.
Nil
(
t
,
err
)
fmt
.
Println
(
"data"
,
data
)
//
fmt.Println("data", data)
var
deposit
mixTy
.
DepositProofResp
deposit
.
NoteHash
=
"notehashstr"
...
...
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