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