Commit 9b794a19 authored by madengji's avatar madengji Committed by vipwzw

add unfrozen status

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