Commit b4a6fb77 authored by madengji's avatar madengji Committed by vipwzw

support deposit multi target

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