Commit e9e31f64 authored by mdj33's avatar mdj33 Committed by vipwzw

improve proto and readme

parent adb1932c
......@@ -108,7 +108,7 @@ function mix_transfer() {
}
function mix_deposit() {
hash=$(${CLI} send mix deposit -m 1000000000 -p ./gnark/ -w "" -v true -t 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -a 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR -r 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4 -e coins -s bty -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01)
hash=$(${CLI} send mix deposit -m 1000000000 -p ./gnark/ -v true -t 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -a 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR -r 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4 -e coins -s bty -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01)
echo "${hash}"
query_tx "${CLI}" "${hash}"
......@@ -120,7 +120,7 @@ function mix_deposit() {
authHash=$(${MIX_CLI32} mix wallet notes -a 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR -s 3 | jq -r ".notes[0].noteHash")
authKey=$(${MIX_CLI32} mix wallet notes -a 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR -s 3 | jq -r ".notes[0].secret.returnKey")
echo "authHash=$authHash,authKey=$authKey"
rawData=$(${MIX_CLI32} mix auth -n "$authHash" -a "$authKey" -p ./gnark/ -w "" -v true -e coins -s bty)
rawData=$(${MIX_CLI32} mix auth -n "$authHash" -a "$authKey" -p ./gnark/ -v true -e coins -s bty)
signData=$(${CLI} wallet sign -d "$rawData" -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01)
hash=$(${CLI} wallet send -d "$signData")
echo "${hash}"
......@@ -130,7 +130,7 @@ function mix_deposit() {
echo "transfer to 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k"
transHash=$(${MIX_CLI31} mix wallet notes -a 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4 -s 1 | jq -r ".notes[0].noteHash")
rawData=$(${MIX_CLI31} mix transfer -m 600000000 -n "$transHash" -t 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -p ./gnark/ -w "" -v true -e coins -s bty)
rawData=$(${MIX_CLI31} mix transfer -m 600000000 -n "$transHash" -t 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -p ./gnark/ -v true -e coins -s bty)
signData=$(${CLI} wallet sign -d "$rawData" -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01)
hash=$(${CLI} wallet send -d "$signData")
echo "${hash}"
......@@ -140,7 +140,7 @@ function mix_deposit() {
echo "withdraw"
withdrawHash=$(${MIX_CLI30} mix wallet notes -a 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -s 1 | jq -r ".notes[0].noteHash")
rawData=$(${MIX_CLI30} mix withdraw -m 600000000 -n "$withdrawHash" -p ./gnark/ -w "" -v true -e coins -s bty)
rawData=$(${MIX_CLI30} mix withdraw -m 600000000 -n "$withdrawHash" -p ./gnark/ -v true -e coins -s bty)
signData=$(${CLI} wallet sign -d "$rawData" -k 0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115)
hash=$(${CLI} wallet send -d "$signData")
......@@ -189,14 +189,14 @@ function mix_token_test() {
query_tx "${CLI}" "${hash}"
echo "mix deposit"
hash=$(${CLI} send mix deposit -m 1000000000 -p ./gnark/ -w "" -v true -t 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -e token -s GD -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01)
hash=$(${CLI} send mix deposit -m 1000000000 -p ./gnark/ -v true -t 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -e token -s GD -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01)
echo "${hash}"
query_tx "${CLI}" "${hash}"
query_note "${MIX_CLI30}" 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k 1
echo "transfer to 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs"
transHash=$(${MIX_CLI30} mix wallet notes -a 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -s 1 | jq -r ".notes[0].noteHash")
rawData=$(${MIX_CLI30} mix transfer -m 600000000 -n "$transHash" -t 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs -p ./gnark/ -w "" -v true -e token -s GD)
rawData=$(${MIX_CLI30} mix transfer -m 600000000 -n "$transHash" -t 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs -p ./gnark/ -v true -e token -s GD)
signData=$(${CLI} wallet sign -d "$rawData" -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01)
hash=$(${CLI} wallet send -d "$signData")
echo "${hash}"
......@@ -206,7 +206,7 @@ function mix_token_test() {
echo "withdraw token GD"
withdrawHash=$(${MIX_CLI30} mix wallet notes -a 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs -s 1 | jq -r ".notes[0].noteHash")
rawData=$(${MIX_CLI30} mix withdraw -m 600000000 -n "$withdrawHash" -p ./gnark/ -w "" -v true -e token -s GD)
rawData=$(${MIX_CLI30} mix withdraw -m 600000000 -n "$withdrawHash" -p ./gnark/ -v true -e token -s GD)
signData=$(${CLI} wallet sign -d "$rawData" -k 0xcacb1f5d51700aea07fca2246ab43b0917d70405c65edea9b5063d72eb5c6b71)
hash=$(${CLI} wallet send -d "$signData")
echo "${hash}"
......
......@@ -584,7 +584,7 @@ func accountPrivacyCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("priv", "p", "", "user wallet addr's privacy key,option")
cmd.Flags().Uint32P("detail", "d", 0, "if get keys' privacy keys,option")
cmd.Flags().BoolP("detail", "d", false, "if get keys' privacy keys,option")
}
......@@ -592,7 +592,7 @@ func accountPrivacy(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
priv, _ := cmd.Flags().GetString("priv")
addr, _ := cmd.Flags().GetString("addr")
detail, _ := cmd.Flags().GetUint32("detail")
detail, _ := cmd.Flags().GetBool("detail")
if len(priv) == 0 && len(addr) == 0 {
fmt.Println("err: one of addr or priv should be fill")
......@@ -600,7 +600,7 @@ func accountPrivacy(cmd *cobra.Command, args []string) {
}
var res mixTy.WalletAddrPrivacy
ctx := jsonclient.NewRPCCtx(rpcLaddr, "mix.ShowAccountPrivacyInfo", &mixTy.PaymentKeysReq{PrivKey: priv, Addr: addr, Detail: int32(detail)}, &res)
ctx := jsonclient.NewRPCCtx(rpcLaddr, "mix.ShowAccountPrivacyInfo", &mixTy.PaymentKeysReq{PrivKey: priv, Addr: addr, Detail: detail}, &res)
ctx.Run()
}
......@@ -831,7 +831,7 @@ func decodeSecret(cmd *cobra.Command, args []string) {
fmt.Println(string(rst))
}
// ShowAccountPrivacyInfo get para chain status by height
// EncryptSecretDataCmd encrypt secret data
func EncryptSecretDataCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "encrypt",
......@@ -846,19 +846,19 @@ func encryptSecrettCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("secret", "s", "", "raw secret data")
cmd.MarkFlagRequired("secret")
cmd.Flags().StringP("peerKey", "a", "", "peer pub key ")
cmd.MarkFlagRequired("peerKey")
cmd.Flags().StringP("peerPubKey", "u", "", "peer secret pub key ")
cmd.MarkFlagRequired("peerPubKey")
}
func encryptSecret(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
secret, _ := cmd.Flags().GetString("secret")
peerKey, _ := cmd.Flags().GetString("peerKey")
peerPubKey, _ := cmd.Flags().GetString("peerPubKey")
req := mixTy.EncryptSecretData{
Secret: secret,
PeerKey: peerKey,
PeerSecretPubKey: peerPubKey,
}
var res mixTy.DHSecret
......@@ -881,11 +881,11 @@ func decryptSecrettCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("secret", "s", "", "raw secret data")
cmd.MarkFlagRequired("secret")
cmd.Flags().StringP("pri", "p", "", "receiving pri key")
cmd.Flags().StringP("pri", "p", "", "self secret private key")
cmd.MarkFlagRequired("pri")
cmd.Flags().StringP("peerKey", "a", "", "ephemeral pub key X")
cmd.MarkFlagRequired("peerKey")
cmd.Flags().StringP("oneTimePubKey", "u", "", "peer one time pub key")
cmd.MarkFlagRequired("oneTimePubKey")
}
......@@ -893,12 +893,12 @@ func decryptSecret(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
secret, _ := cmd.Flags().GetString("secret")
pri, _ := cmd.Flags().GetString("pri")
peerKey, _ := cmd.Flags().GetString("peerKey")
oneTimePubKey, _ := cmd.Flags().GetString("oneTimePubKey")
req := mixTy.DecryptSecretData{
Secret: secret,
PeerKey: peerKey,
PriKey: pri,
OneTimePubKey: oneTimePubKey,
SecretPriKey: pri,
}
var res mixTy.SecretData
......@@ -951,7 +951,6 @@ func depositSecretCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("path", "p", "", "deposit circuit path")
cmd.MarkFlagRequired("path")
cmd.Flags().StringP("proof", "w", "", "proof string to test")
cmd.Flags().BoolP("verify", "v", false, "verify on chain:true on local:false ")
}
......@@ -967,7 +966,6 @@ func depositSecret(cmd *cobra.Command, args []string) {
symbol, _ := cmd.Flags().GetString("symbol")
path, _ := cmd.Flags().GetString("path")
proof, _ := cmd.Flags().GetString("proof")
verify, _ := cmd.Flags().GetBool("verify")
deposit := &mixTy.DepositInfo{
......@@ -988,7 +986,6 @@ func depositSecret(cmd *cobra.Command, args []string) {
AssetExec: assetExec,
AssetSymbol: symbol,
Title: paraName,
ZkProof: proof,
VerifyOnChain: verify,
}
......@@ -1029,7 +1026,6 @@ func transferSecretCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("path", "p", "", "input path ")
cmd.MarkFlagRequired("path")
cmd.Flags().StringP("proof", "w", "", "proof string to test")
cmd.Flags().BoolP("verify", "v", false, "verify on chain:true on local:false, default false ")
}
......@@ -1048,7 +1044,6 @@ func transferSecret(cmd *cobra.Command, args []string) {
assetExec, _ := cmd.Flags().GetString("exec")
symbol, _ := cmd.Flags().GetString("symbol")
proof, _ := cmd.Flags().GetString("proof")
verify, _ := cmd.Flags().GetBool("verify")
input := &mixTy.TransferInputTxReq{
......@@ -1078,7 +1073,6 @@ func transferSecret(cmd *cobra.Command, args []string) {
AssetExec: assetExec,
AssetSymbol: symbol,
Title: paraName,
ZkProof: proof,
VerifyOnChain: verify,
}
......@@ -1112,7 +1106,6 @@ func withdrawSecretCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("path", "p", "", "withdraw pk file ")
cmd.MarkFlagRequired("path")
cmd.Flags().StringP("proof", "w", "", "proof string to test")
cmd.Flags().BoolP("verify", "v", false, "verify on chain:true on local:false, default false ")
}
......@@ -1127,7 +1120,6 @@ func withdrawSecret(cmd *cobra.Command, args []string) {
symbol, _ := cmd.Flags().GetString("symbol")
path, _ := cmd.Flags().GetString("path")
proof, _ := cmd.Flags().GetString("proof")
verify, _ := cmd.Flags().GetBool("verify")
req := &mixTy.WithdrawTxReq{
......@@ -1142,7 +1134,6 @@ func withdrawSecret(cmd *cobra.Command, args []string) {
AssetExec: assetExec,
AssetSymbol: symbol,
Title: paraName,
ZkProof: proof,
VerifyOnChain: verify,
}
......@@ -1176,7 +1167,6 @@ func authSecretCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("path", "p", "", "auth path file ")
cmd.MarkFlagRequired("path")
cmd.Flags().StringP("proof", "w", "", "proof string to test")
cmd.Flags().BoolP("verify", "v", false, "verify on chain:true on local:false, default false ")
}
......@@ -1192,7 +1182,6 @@ func authSecret(cmd *cobra.Command, args []string) {
path, _ := cmd.Flags().GetString("path")
proof, _ := cmd.Flags().GetString("proof")
verify, _ := cmd.Flags().GetBool("verify")
req := &mixTy.AuthTxReq{
......@@ -1207,7 +1196,6 @@ func authSecret(cmd *cobra.Command, args []string) {
AssetExec: assetExec,
AssetSymbol: symbol,
Title: paraName,
ZkProof: proof,
VerifyOnChain: verify,
}
......
# mix 执行器 零知识证明隐私
# mix执行器 基于零知识证明的混币隐私合约
## 场景
1. 存款,公转私,支持一次存入多个目标账户,目标账户隐藏,转账金额公开(需要验证金额足够)
1. 转账,私对私,花费某个支票,转账给目标账户,多出部分找零给自己,目标账户和金额全隐藏
1. 提款,私对公,花费某些支票,统一转出给签名地址,转账金额公开(验证),签名地址和支票账户不一定对应,也就是任何知道支票密码的人都可以提款
1. 存款,公转私,支持一次存入一个或多个目标账户,目标账户隐藏(自己或对方账户),转账金额公开(需要验证金额足够),生成未花费支票
1. 转账,私对私,花费某个支票,生成新支票即转账给目标账户,多出部分找零给自己,花费、目标和找零金额全隐藏
1. 提款,私对公,花费某些支票,统一转出给签名地址,转账金额公开(验证)
1. 授权,私对私,授权账户对某一请求其授权的转账支票授权,接收者或发送者都可看到支票在自己名下,但是锁定状态,
授权者授权接收者或者发送者为可花费用户,可花费用户才能花费此支票。
## 介绍
1. 任一希望接收支票的用户需要先注册支票接收账号和秘密加密公钥
1.1 支票账号分为接收key和花费key,花费key为用户链钱包账号私钥在c25519曲线上的公钥同时,花费key作为支票私钥,
计算hash值生成支票接收key。发送者使用对方的钱包地址即可检索其支票接收key,构建发送交易
1.2 为发送加密消息,接收者需要注册其加密公钥,发送者使用临时私钥和对方加密公钥生成密码,对消息对称加密
1. 支票有接收key,发送key,授权key,还有支票随机数等构成计算其hash,存到merkle树上。知道hash秘密数字的所有者
即可通过构建零知识证明,花费此支票。花费支票需要提供花费key,发送者虽然知道秘密数字也无法花费此支票。
1. 发送者用接收者的加密公钥和一次性临时私钥把支票私密数据进行加密,一次性临时公钥和秘密消息发送到链上,接收者可使用其加密私钥解密消息
1. 接收者需要使用加密私钥逐一检索尝试解密任一新的加密消息,解密成功即是发送给自己的加密消息
1. 对于需要授权的支票,发送者,授权者,接收者均可看到此支票,处于锁定状态,不能花费,只有授权者授权后,被授权方才可花费
##授权
1. 授权账户可以是任意账户,不需要注册公共授权账户,存款方需要自己保证授权地址ok,否则接收方和返回方都不能花费
syntax = "proto3";
package types;
option go_package = "../types";
//DH one time pubkey with secret
message DHSecret{
string oneTimePubKey = 1;
string secret = 2;
}
//Diff-Helman 加密group, for spender, returner, authorizer to decrypt
message DHSecretGroup{
string receiver = 1;
string returner = 2;
string authorize = 3;
}
// note payment account
// receiveKey = hash(spendKey)
message NoteKeyPair {
string receiveKey = 1;
string spendKey = 2;
}
// diff-hellman crypto key pair
// secretPrivKey = wallet private key * G_25519
// secretPubKey = secretPrivKey * G_25519
message EncryptSecretKeyPair {
string secretPrivKey = 1;
string secretPubKey = 2;
}
//spend pair for note proof
//crypt pair for DH crypt/decrypt
message AccountPrivacyKey {
NoteKeyPair paymentKey = 1;
EncryptSecretKeyPair secretKey = 2;
}
message WalletAddrPrivacy {
AccountPrivacyKey privacy = 1;
string addr = 2;
}
message SecretData{
string receiverKey = 1;
string returnKey = 2;
string authorizeKey = 3;
string amount = 4;
string noteRandom = 5;
string assetExec = 6;
string assetSymbol = 7;
}
message EncryptSecretData{
string secret = 1;
string peerSecretPubKey = 2;
}
message DecryptSecretData{
string secret = 1;
string secretPriKey = 2;
string oneTimePubKey = 3;
}
syntax = "proto3";
package types;
option go_package = "../types";
//子树用高度和hash描述,2^10=1024个叶子节点,子树高度不会超过10
message CommitSubTree{
int32 height = 1;
bytes hash = 2;
}
//merkel tree由子树和叶子组成,三种场景:1,初始只一个叶子, 2,全是子树, 3,子树加一个叶子,不会有两个叶子,两个叶子一定构成子树
message CommitSubTrees{
repeated CommitSubTree subTrees = 1;
}
//描述当前commitTree的状态
//一颗merkel树1024叶子,考虑数据库读取原因,每个叶子都会存到相应seq db,待第1024次时候归档,重新开始新的merkle树,
message CommitTreeStatus{
CommitSubTrees subTrees = 1;
//1~1024叶子的归档
int32 subLeavesSeq = 2;
//root的归档 从1开始,数据库占位,不然全空会往前搜索
uint64 archiveRootsSeq = 3;
string assetExec = 4;
string assetSymbol = 5;
}
message ReceiptCommitTreeStatus{
CommitTreeStatus prev = 1;
CommitTreeStatus current = 2;
}
message ReceiptCommitSubLeaves{
int32 seq = 1;
string leaf = 2;
}
message ReceiptCommitSubRoots{
int32 seq = 1;
string root = 2;
}
message ReceiptArchiveLeaves{
int32 count = 1;
string rootHash = 2;
string lastLeaf = 3;
}
message ReceiptArchiveTreeRoot{
uint64 seq = 1;
string rootHash = 2;
}
message CommitTreeLeaves {
repeated bytes leaves = 1;
}
message CommitTreeRoots {
repeated bytes roots = 1;
}
message CommitTreeProve {
string rootHash = 1;
repeated string proofSet = 2;
uint32 proofIndex = 3;
uint32 numLeaves = 4;
repeated uint32 helpers = 5;
}
message TreeInfoReq{
string rootHash = 1;
string leafHash = 2;
string assetExec = 3;
string assetSymbol = 4;
uint64 rootHeight = 5;
}
message TreeListResp{
repeated string leaves = 1;
}
message RootListResp{
repeated string roots = 1;
}
message SubTreeResp{
int32 height = 1;
string hash = 2;
}
message TreeStatusResp{
int32 subLeavesSeq = 1;
uint64 archiveRootsSeq = 2;
repeated SubTreeResp subTrees = 3;
}
message TreePathProof{
string treeRootHash = 1;
repeated string treePath = 2;
repeated uint32 helpers = 3;
}
syntax = "proto3";
import "common.proto";
import "transaction.proto";
import "cryptokey.proto";
package types;
option go_package = "../types";
......@@ -74,18 +73,7 @@ message MixConfigAction {
}
}
//DH one time pubkey with secret
message DHSecret{
string oneTimePubKey = 1;
string secret = 2;
}
//Diff-Helman 加密group, for spender, returner, authorizer to decrypt
message DHSecretGroup{
string receiver = 1;
string returner = 2;
string authorize = 3;
}
message ZkProofInfo {
string proof = 1;
......@@ -153,319 +141,6 @@ message ExistValue {
}
//子树用高度和hash描述,2^10=1024个叶子节点,子树高度不会超过10
message CommitSubTree{
int32 height = 1;
bytes hash = 2;
}
//merkel tree由子树和叶子组成,三种场景:1,初始只一个叶子, 2,全是子树, 3,子树加一个叶子,不会有两个叶子,两个叶子一定构成子树
message CommitSubTrees{
repeated CommitSubTree subTrees = 1;
}
//描述当前commitTree的状态
//一颗merkel树1024叶子,考虑数据库读取原因,每个叶子都会存到相应seq db,待第1024次时候归档,重新开始新的merkle树,
message CommitTreeStatus{
CommitSubTrees subTrees = 1;
//1~1024叶子的归档
int32 subLeavesSeq = 2;
//root的归档 从1开始,数据库占位,不然全空会往前搜索
uint64 archiveRootsSeq = 3;
string assetExec = 4;
string assetSymbol = 5;
}
message ReceiptCommitTreeStatus{
CommitTreeStatus prev = 1;
CommitTreeStatus current = 2;
}
message ReceiptCommitSubLeaves{
int32 seq = 1;
string leaf = 2;
}
message ReceiptCommitSubRoots{
int32 seq = 1;
string root = 2;
}
message ReceiptArchiveLeaves{
int32 count = 1;
string rootHash = 2;
string lastLeaf = 3;
}
message ReceiptArchiveTreeRoot{
uint64 seq = 1;
string rootHash = 2;
}
message CommitTreeLeaves {
repeated bytes leaves = 1;
}
message CommitTreeRoots {
repeated bytes roots = 1;
}
message CommitTreeProve {
string rootHash = 1;
repeated string proofSet = 2;
uint32 proofIndex = 3;
uint32 numLeaves = 4;
repeated uint32 helpers = 5;
}
message TreeInfoReq{
string rootHash = 1;
string leafHash = 2;
string assetExec = 3;
string assetSymbol = 4;
uint64 rootHeight = 5;
}
message TreeListResp{
repeated string leaves = 1;
}
message RootListResp{
repeated string roots = 1;
}
message SubTreeResp{
int32 height = 1;
string hash = 2;
}
message TreeStatusResp{
int32 subLeavesSeq = 1;
uint64 archiveRootsSeq = 2;
repeated SubTreeResp subTrees = 3;
}
// mix wallet part
// receiverPubKey = hash(spendPriKey) for zk-snark note spend
message PaymentKeyPair {
string receiveKey = 1;
string spendKey = 2;
}
// pub = priv*G for diff-helman crypto
// out: take spender's tempPrikey*pubkey as password, tempPubkey show in note
// spender: take self prikey*tempPubkey as password to decode
message EncryptKeyPair {
string privKey = 1;
string pubKey = 2;
}
//spend pair for note proof
//crypt pair for DH crypt/decrypt
message AccountPrivacyKey {
PaymentKeyPair paymentKey = 1;
EncryptKeyPair encryptKey = 2;
}
message WalletAddrPrivacy {
AccountPrivacyKey privacy = 1;
string addr = 2;
}
message SecretData{
string receiverKey = 1;
string returnKey = 2;
string authorizeKey = 3;
string amount = 4;
string noteRandom = 5;
string assetExec = 6;
string assetSymbol = 7;
}
message EncryptSecretData{
string secret = 1;
string peerKey = 2;
}
message DecryptSecretData{
string secret = 1;
string priKey = 2;
string peerKey = 3;
}
//支持同时存入多个地址,多个地址具有相同的returnAddr和AuthorizeAddr,如果不同,则单个来存
message DepositInfo{
string receiverAddrs = 1;
string returnAddr = 2;
string authorizeAddr = 3;
string amounts = 4;
}
//钱包生成deposit tx
message DepositTxReq{
DepositInfo deposit = 1;
string zkPath = 2;
}
message DepositProofResp{
string noteHash = 1;
SecretData proof = 2;
DHSecretGroup secrets = 3;
}
message TreePathProof{
string treeRootHash = 1;
repeated string treePath = 2;
repeated uint32 helpers = 3;
}
//可withdraw 多个note
message WithdrawTxReq{
uint64 totalAmount = 1;
string noteHashs = 2; // seperate by ","
string zkPath = 3;
}
//只授权一个note,超过一个,toAddr不好设置
message AuthTxReq{
string noteHash = 1;
string authorizeToAddr = 3;
string zkPath = 4;
}
message TransferInputTxReq{
string noteHashs = 1;
}
message TransferOutputTxReq{
DepositInfo deposit = 1;
}
message TransferTxReq{
TransferInputTxReq input = 1;
TransferOutputTxReq output = 2;
string zkPath = 3;
}
message CreateZkKeyFileReq{
int32 ty = 1;
string savePath = 2;
}
//加密了的input/output amount
message ShieldAmount{
string X = 1;
string Y = 2;
}
message ShieldAmountRst{
repeated string inputRandoms = 1;
string outputRandom = 2;
string changeRandom = 3;
repeated ShieldAmount inputs = 4;
ShieldAmount output = 5;
ShieldAmount change = 6;
}
message CreateRawTxReq{
int32 actionTy = 1;
bytes data = 4;
string assetExec = 2;
string assetSymbol = 3;
string title = 6; //平行链名字
string zkProof = 7; //输入证明内容,方便测试,空:读pk文件产生proof
bool verifyOnChain = 8; //true:链上验证,false:本地验证
}
message PaymentKeysReq{
string privKey = 1; //user wallet priv key
string addr = 2; //user addr
int32 detail = 3; //获取私钥信息
}
enum NoteStatus{
UNDEF = 0;
VALID = 1; //已授权可使用 相对消费者
USED = 2; //已使用
FROZEN = 3; //未授权
UNFROZEN = 4; //已授权 相对授权者
}
message WalletNoteInfo {
string noteHash = 1;
string nullifier = 2;
string authorizeSpendHash = 3;
string authorizeHash = 4;
string account = 5; //账户地址
NoteStatus status = 6;
SecretData secret = 7;
}
message WalletDbMixInfo {
WalletNoteInfo info = 1;
string txIndex = 2;
}
message WalletMixIndexReq {
string noteHash = 1;
string nullifier = 2;
string authorizeSpendHash = 3;
string authorizeHash = 4;
string account = 5;
int32 status = 6;
int32 count = 7;
int32 direction = 8;
}
message WalletNoteResp {
repeated WalletNoteInfo notes = 1;
}
message WalletEnablePrivacyRst{
string addr = 1;
bool isOK = 2;
string msg = 3;
}
message WalletEnablePrivacyResp{
repeated WalletEnablePrivacyRst resps = 1;
}
enum MixWalletRescanStatus{
IDLE = 0;
SCANNING = 1;
FINISHED = 2;
}
///////localdb index query
message LocalMixTx {
......@@ -487,23 +162,3 @@ message MixTxListReq{
message MixTxListResp{
repeated LocalMixTx txs = 1;
}
message PrivacyAddrResult{
string addr = 1;
bool isOK = 2;
string msg = 3;
}
message ReqEnablePrivacyRst{
repeated PrivacyAddrResult results = 1;
}
service mixPrivacy {
// 扫描UTXO以及获取扫描UTXO后的状态
rpc GetRescanStatus(ReqNil) returns (ReqString) {}
// 使能隐私账户
rpc RescanNotes(ReqNil) returns (ReqString) {}
// 创建隐私交易
rpc EnablePrivacy(ReqAddrs) returns (ReqEnablePrivacyRst) {}
}
\ No newline at end of file
syntax = "proto3";
import "common.proto";
import "transaction.proto";
import "cryptokey.proto";
package types;
option go_package = "../types";
//支持同时存入多个地址,多个地址具有相同的returnAddr和AuthorizeAddr,如果不同,则单个来存
message DepositInfo{
string receiverAddrs = 1;
string returnAddr = 2;
string authorizeAddr = 3;
string amounts = 4;
}
//钱包生成deposit tx
message DepositTxReq{
DepositInfo deposit = 1;
string zkPath = 2;
}
message DepositProofResp{
string noteHash = 1;
SecretData proof = 2;
DHSecretGroup secrets = 3;
}
//可withdraw 多个note
message WithdrawTxReq{
uint64 totalAmount = 1;
string noteHashs = 2; // seperate by ","
string zkPath = 3;
}
//只授权一个note,超过一个,toAddr不好设置
message AuthTxReq{
string noteHash = 1;
string authorizeToAddr = 2;
string zkPath = 3;
}
message TransferInputTxReq{
string noteHashs = 1;
}
message TransferOutputTxReq{
DepositInfo deposit = 1;
}
message TransferTxReq{
TransferInputTxReq input = 1;
TransferOutputTxReq output = 2;
string zkPath = 3;
}
message CreateZkKeyFileReq{
int32 ty = 1;
string savePath = 2;
}
//加密了的input/output amount
message ShieldAmount{
string X = 1;
string Y = 2;
}
message ShieldAmountRst{
repeated string inputRandoms = 1;
string outputRandom = 2;
string changeRandom = 3;
repeated ShieldAmount inputs = 4;
ShieldAmount output = 5;
ShieldAmount change = 6;
}
message CreateRawTxReq{
int32 actionTy = 1;
bytes data = 4;
string assetExec = 2;
string assetSymbol = 3;
string title = 6; //平行链名字
bool verifyOnChain = 7; //true:链上验证,false:本地验证
}
message PaymentKeysReq{
string privKey = 1; //user wallet priv key
string addr = 2; //user addr
bool detail = 3; //获取私钥信息
}
enum NoteStatus{
UNDEF = 0;
VALID = 1; //已授权可使用 相对消费者
USED = 2; //已使用
FROZEN = 3; //未授权
UNFROZEN = 4; //已授权 相对授权者
}
message WalletNoteInfo {
string noteHash = 1;
string nullifier = 2;
string authorizeSpendHash = 3;
string authorizeHash = 4;
string account = 5; //账户地址
NoteStatus status = 6;
SecretData secret = 7;
}
message WalletDbMixInfo {
WalletNoteInfo info = 1;
string txIndex = 2;
}
message WalletMixIndexReq {
string noteHash = 1;
string nullifier = 2;
string authorizeSpendHash = 3;
string authorizeHash = 4;
string account = 5;
int32 status = 6;
int32 count = 7;
int32 direction = 8;
}
message WalletNoteResp {
repeated WalletNoteInfo notes = 1;
}
message WalletEnablePrivacyRst{
string addr = 1;
bool isOK = 2;
string msg = 3;
}
message WalletEnablePrivacyResp{
repeated WalletEnablePrivacyRst resps = 1;
}
enum MixWalletRescanStatus{
IDLE = 0;
SCANNING = 1;
FINISHED = 2;
}
message PrivacyAddrResult{
string addr = 1;
bool isOK = 2;
string msg = 3;
}
message ReqEnablePrivacyRst{
repeated PrivacyAddrResult results = 1;
}
service mixPrivacy {
// 扫描UTXO以及获取扫描UTXO后的状态
rpc GetRescanStatus(ReqNil) returns (ReqString) {}
// 使能隐私账户
rpc RescanNotes(ReqNil) returns (ReqString) {}
// 创建隐私交易
rpc EnablePrivacy(ReqAddrs) returns (ReqEnablePrivacyRst) {}
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
......@@ -24,6 +24,7 @@ const CECBLOCKSIZE = 32
从secp256k1根私钥创建支票需要的私钥和公钥
payPrivKey = rootPrivKey *G_X25519 这样很难泄露rootPrivKey
支票花费key: payPrivKey
支票收款key: ReceiveKey= hash(payPrivKey) --或者*G的X坐标值, 看哪个电路少?
DH加解密key: encryptPubKey= payPrivKey *G_X25519, 也是很安全的,只是电路里面目前不支持x25519
*/
......@@ -35,20 +36,20 @@ func newPrivacyKey(rootPrivKey []byte) *mixTy.AccountPrivacyKey {
//payPrivKey := mimcHashByte([][]byte{rootPrivKey})
//payPrivKey 可能超出fr的模,spendKey是payPrivKey对fr取的模,有可能和payPrivKey不相等,这里用spendKey取hash
//mimcHashByte 会对输入参数对fr取模,在电路上不会影响ReceiveKey
paymentKey := &mixTy.PaymentKeyPair{}
paymentKey := &mixTy.NoteKeyPair{}
paymentKey.SpendKey = mixTy.Byte2Str(payPrivKey[:])
paymentKey.ReceiveKey = mixTy.Byte2Str(mimcHashByte([][]byte{mixTy.Str2Byte(paymentKey.SpendKey)}))
encryptKeyPair := &mixTy.EncryptKeyPair{}
encryptKeyPair := &mixTy.EncryptSecretKeyPair{}
pubkey := ecdh.PublicKey(payPrivKey)
//加解密是在x25519域,需要Hex编码,不要使用fr.string, 模范围不同
encryptKeyPair.PrivKey = hex.EncodeToString(payPrivKey[:])
encryptKeyPair.SecretPrivKey = hex.EncodeToString(payPrivKey[:])
pubData := pubkey.([32]byte)
encryptKeyPair.PubKey = hex.EncodeToString(pubData[:])
encryptKeyPair.SecretPubKey = hex.EncodeToString(pubData[:])
privacy := &mixTy.AccountPrivacyKey{}
privacy.PaymentKey = paymentKey
privacy.EncryptKey = encryptKeyPair
privacy.SecretKey = encryptKeyPair
return privacy
}
......
......@@ -24,8 +24,8 @@ func (p *mixPolicy) On_ShowAccountPrivacyInfo(req *mixTy.PaymentKeysReq) (types.
}
var ret mixTy.WalletAddrPrivacy
ret.Privacy = newPrivacyKey(prikeybyte)
if req.Detail <= 0 {
ret.Privacy.EncryptKey.PrivKey = ""
if !req.Detail {
ret.Privacy.SecretKey.SecretPrivKey = ""
ret.Privacy.PaymentKey.SpendKey = ""
}
return &ret, nil
......@@ -36,8 +36,8 @@ func (p *mixPolicy) On_ShowAccountPrivacyInfo(req *mixTy.PaymentKeysReq) (types.
if err != nil {
return nil, errors.Wrapf(err, "get account =%s privacy key", req.Addr)
}
if req.Detail <= 0 {
keys.Privacy.EncryptKey.PrivKey = ""
if !req.Detail {
keys.Privacy.SecretKey.SecretPrivKey = ""
keys.Privacy.PaymentKey.SpendKey = ""
}
return keys, nil
......@@ -65,10 +65,6 @@ func (p *mixPolicy) On_EnablePrivacy(req *types.ReqAddrs) (types.Message, error)
return p.enablePrivacy(req.Addrs)
}
//func (p *mixPolicy) On_EncodeSecretData(req *mixTy.SecretData) (types.Message, error) {
// return encodeSecretData(req)
//}
func (p *mixPolicy) On_EncryptSecretData(req *mixTy.EncryptSecretData) (types.Message, error) {
return encryptSecretData(req)
}
......
......@@ -358,7 +358,7 @@ func (p *mixPolicy) decodeSecret(noteHash string, secretData string, privacyKeys
if err != nil {
return nil, errors.Wrapf(err, "decode for notehash=%s,crypt=%s", noteHash, dhSecret.Secret)
}
decryptData, err := decryptData(key.Privacy.EncryptKey.PrivKey, dhSecret.OneTimePubKey, cryptData)
decryptData, err := decryptData(key.Privacy.SecretKey.SecretPrivKey, dhSecret.OneTimePubKey, cryptData)
if err != nil {
bizlog.Debug("processSecret.decryptData fail", "decrypt for notehash", noteHash, "secret", secretData, "addr", key.Addr, "err", err)
continue
......
......@@ -37,7 +37,7 @@ func encryptSecretData(req *mixTy.EncryptSecretData) (*mixTy.DHSecret, error) {
return nil, errors.Wrap(err, "decode secret")
}
return encryptData(req.PeerKey, secret)
return encryptData(req.PeerSecretPubKey, secret)
}
func decryptSecretData(req *mixTy.DecryptSecretData) (*mixTy.SecretData, error) {
......@@ -45,7 +45,7 @@ func decryptSecretData(req *mixTy.DecryptSecretData) (*mixTy.SecretData, error)
if err != nil {
return nil, errors.Wrap(err, "decode req.secret")
}
decrypt, err := decryptData(req.PriKey, req.PeerKey, secret)
decrypt, err := decryptData(req.SecretPriKey, req.OneTimePubKey, secret)
if err != nil {
return nil, errors.Wrap(err, "decrypt secret")
}
......
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