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

support token asset to mix

parent ffc16dbd
......@@ -203,6 +203,17 @@ useBalance=false
ethMapFromExecutor="paracross"
ethMapFromSymbol="coins.bty"
[exec.sub.mix]
#私对私的交易费,交易比较大,需要多的手续费
txFee=0
#私对私token转账,花费token(true)还是BTY(false),
tokenFee=false
#curve H point
pointHX="10190477835300927557649934238820360529458681672073866116232821892325659279502"
pointHY="7969140283216448215269095418467361784159407896899334866715345504515077887397"
#电路最大支持1024个叶子hash,10 level, 配置可以小于1024,但不能大于
maxTreeLeaves=1024
#系统中所有的fork,默认用chain33的测试网络的
#但是我们可以替换
[fork.system]
......
......@@ -289,6 +289,17 @@ evmGasLimit=2000000
#evm内部调试输出,指令级的,默认关闭,0:关闭;1:打开
evmDebugEnable=0
[exec.sub.mix]
#私对私的交易费,交易比较大,需要多的手续费
txFee=100000000
#私对私token转账,花费token(true)还是BTY(false),
tokenFee=false
#curve H point
pointHX="10190477835300927557649934238820360529458681672073866116232821892325659279502"
pointHY="7969140283216448215269095418467361784159407896899334866715345504515077887397"
#电路最大支持1024个叶子hash,10 level, 配置可以小于1024,但不能大于
maxTreeLeaves=1024
[metrics]
#是否使能发送metrics数据的发送
enableMetrics=false
......
......@@ -75,6 +75,8 @@ function mix_enable_privacy() {
function mix_transfer() {
echo "=========== # mix chain transfer ============="
${CLI} send coins send_exec -a 10 -e mix -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01
##config mix key
${CLI} send coins transfer -a 10 -n transfer -t 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4 -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01
#authorize
......@@ -95,7 +97,7 @@ function mix_transfer() {
#1nl
${CLI} send mix config register -r 1499328046806813717988379826525346013601394010052157072491414645500411978017 -e 0abaa15456580365b90f84f22186f99250f4198f8df7319bcced1606085a1e01 -a 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -k 0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115
${CLI} send coins send_exec -a 10 -e mix -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01
${CLI} send mix config register -r 7166643181671374870524536201432214798965258692016821447324045928745450625215 -e a97592e700eb0f87c5738b35c8d460ce33a4a59bde6128081ddd042c3c262f76 -a 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs -k 0xcacb1f5d51700aea07fca2246ab43b0917d70405c65edea9b5063d72eb5c6b71
##config deposit circuit vk
${CLI} send mix config vk -c 0 -z 1f8b08000000000000ff6c51795053eb15ff4e7281e0f086f5098ff7221114509692581441b4611111c160559055960b449280240842adb22b8bb2094a0551912aa853d08a452bd2a9a0b6022e55c74e519246a86804b57a04f47612c4ce74fad76fbeb3fc96efb0f509db97c96303186da533c449bbc5b2e4207a3730f90428007f600a09b00204c0946b910f4c2501235166bc449c10284bcf54c881a923842c640ad8006c9a2f98dd0096af1b30c50458be7c2d12e2c814b10158f4725d990d2c1f3760f61360f9f0bfa2408b84f09812dda060b60c2ca11b30a5045842be1609b1640e008081bf8496d23285aea70f1c4268a68c0de025576464262878b9bc8038a9342e844ee6c5cb04eecb5d0304c2a424b18cf6e2f9d112c5ff69f0f6cca604cedc2630070970e6c6b52f421631156c00cedc926e840510ae730bdb66330898436c00ee372b41bcc8e8af62fcff8a5512008020606a0921364c0d0bc0e47fe7b44d60aab5ba553add6ff5ea39ddd2595dedd7cc670eb3003891d17245865896acbd0d1811f285b261f2b55a141e0cb7b2cb5650edb824f244cad4c47a677cb79d9f3af5278f179fceaa06a59e13a140a1e16052f395a5279fe3dd5daf4b7c827f27c3965a8db9c42a568956cd1569b6966b34444bd656dd347cc6e1d5396c7655c9f5e679b762a85bf4d63b6dc6e3683e154f697e9d900d14662bd4cea71f769860daaf9e29ad7e5f4630708c2ffca3dbeb22341067b4bee93adfaa63fbebd588fb6b3f0812b1d1f042e1b5d6e66348d78f979ab3252a5cb8e831a97d193108149aced4bdfbe866f102b3cb9c573f3cd583b8c0a37d6fe391ad13e8c0bd292de84bc9224417f556fb83f4bb9ad17eec513f393a62b7f11e5e0d77e106e7d4cbd1f17ec1314596e21250382a6ee82e81db3cac1cbc6c5a6716f21794e839af0f2e6fb1409e1337356a91c24ce76e68ec3d377d7fad06472a2e5dfce870d1057d068523aedce275e812c95bb7e2674da78142faec8cc3631bcb30dc6cd9dd417ff75a0f9b2637ab0d0a6346d15594f45e31fac3351d5b8da5bd5cffb6d20377da08e61936c4b6a1cf1249596e8c4883662182ebde669272a030e7173762854fcda3d1652235ae6fbbe9306a869e4e9e3c7a60086d565c7137aec997135d58a030f183e9b0d71beb1cecf922d967b7ab780d3a58efda1059ff3210ad8397b9de342fb5060a6704ab948eaa497d0c88c813559e18106268cdcec20df6515de894f1a863ba6b8385cedf49ae6f9b5e627704ae2e6f5c5d3becf80a237f7c78e08972b0131dbb970ac63a0b95406191c86ba86ce6ed760c1f8ebfdc1013b516190ff5a6b0c6f43cfcf1d6b9e9c8a74577bfdec23fe2efe53e71337fc347ead1fec495ce6a9ceaeb332eff94db8c40e7b6557f1fa7010a8befddf68f3d7e5c8d92dc54e9ab8190f14ff9675c3ae6cb5468ec6eb0addbfe70b3cedc33bf7962cde26732c4d223e951c6b41c43db1bc2e78ff45aa1f9be36eaf829f942a0d07695fab9881e2358909fd56568726112853baa944dde45ada8d7f253dbb48745b6eef3d840e1991ddd4e752bfb3568edf95b16e768423dfee374f89e9ea43f44a3b5eb0d5159c9f81aa0f09893af2ad33d7b0be6d8d92efba567340f6d9a0ff5f23a1d2b70e96f060aa5fd7f5611a03086ebfc990afcc11e1f74da5e36ce085a8e575b8cab07bd5bab90ea0a335ac0242502856f72345b64de03121c7bffd387fb862987f19fcec985574e4def442b2b7dffe755c9095ab225bd597eff3a58a1c4c5df63a8a9e7f528d43f62ee961a96e887862396df755c3b6f0714f2df0e0cfb35f956a388256ffdf9b0751ef6ee55e9494d3e37a1e59de97fc38bde294280cd094953d0ebe2e429fa42695aa64cc1d918e21f1b16b8c99ffc270000ffff603a413108060000 -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01
......@@ -112,7 +114,7 @@ function mix_transfer() {
function mix_deposit() {
hash=$(${CLI} send mix deposit -m 1000000000 -p ./gnark/circuit/deposit/ -t 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -a 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR -r 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4 -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01)
hash=$(${CLI} send mix deposit -m 1000000000 -p ./gnark/circuit/deposit/ -r 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -a 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR -f 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4 -e coins -s bty -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01)
echo "${hash}"
query_tx "${CLI}" "${hash}"
......@@ -124,7 +126,7 @@ function mix_deposit() {
authHash=$(${MIX_CLI2} mix wallet notes -a 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR -s 3 | jq -r ".notes[0].noteHash")
authKey=$(${MIX_CLI2} mix wallet notes -a 1JRNjdEqp4LJ5fqycUBm9ayCKSeeskgMKR -s 3 | jq -r ".notes[0].secret.returnKey")
echo "authHash=$authHash,authKey=$authKey"
hash=$(${MIX_CLI2} send mix auth -n "$authHash" -a "$authKey" -p ./gnark/circuit/authorize/ -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01)
hash=$(${MIX_CLI2} send mix auth -n "$authHash" -a "$authKey" -p ./gnark/circuit/authorize/ -e coins -s bty -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01)
echo "${hash}"
query_tx "${MIX_CLI2}" "${hash}"
......@@ -132,7 +134,7 @@ function mix_deposit() {
echo "transfer to 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k"
transHash=$(${MIX_CLI1} mix wallet notes -a 1KSBd17H7ZK8iT37aJztFB22XGwsPTdwE4 -s 1 | jq -r ".notes[0].noteHash")
hash=$(${MIX_CLI1} send mix transfer -m 600000000 -n "$transHash" -t 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -i ./gnark/circuit/transfer/input/ -o ./gnark/circuit/transfer/output/ -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01)
hash=$(${MIX_CLI1} send mix transfer -m 600000000 -n "$transHash" -t 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -i ./gnark/circuit/transfer/input/ -o ./gnark/circuit/transfer/output/ -e coins -s bty -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01)
echo "${hash}"
query_tx "${CLI}" "${hash}"
......@@ -140,7 +142,7 @@ function mix_deposit() {
echo "withdraw"
withdrawHash=$(${MIX_CLI3} mix wallet notes -a 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -s 1 | jq -r ".notes[0].noteHash")
hash=$(${MIX_CLI3} send mix withdraw -m 600000000 -n "$withdrawHash" -p ./gnark/circuit/withdraw/ -k 0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115)
hash=$(${MIX_CLI3} send mix withdraw -m 600000000 -n "$withdrawHash" -p ./gnark/circuit/withdraw/ -e coins -s bty -k 0x7a80a1f75d7360c6123c32a78ecf978c1ac55636f87892df38d8b85a9aeff115)
echo "${hash}"
query_tx "${CLI}" "${hash}"
......@@ -155,6 +157,65 @@ function mix_deposit() {
}
function mix_token_test() {
echo "config token fee"
tokenAddr=$(${CLI} mix query txfee -e token -s GD | jq -r ".data")
echo "tokenAddr=$tokenAddr"
hash=$(${CLI} send coins transfer -a 10 -n transfer -t "$tokenAddr" -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01)
echo "${hash}"
query_tx "${CLI}" "${hash}"
echo "token-blacklist"
hash=$(${CLI} send config config_tx -o add -c "token-blacklist" -v "BTY" -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01)
echo "${hash}"
query_tx "${CLI}" "${hash}"
echo "precreate"
hash=$(${CLI} send token precreate -f 0.001 -i test -n guodunjifen -a 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv -p 0 -s GD -t 10000 -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv)
echo "${hash}"
query_tx "${CLI}" "${hash}"
echo "finishcreate"
hash=$(${CLI} send token finish -f 0.001 -a 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv -s GD -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv)
echo "${hash}"
query_tx "${CLI}" "${hash}"
${CLI} token created
echo "send_exec"
hash=$(${CLI} send token send_exec -a 100 -e mix -s GD -k 12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv)
echo "${hash}"
query_tx "${CLI}" "${hash}"
echo "mix deposit"
hash=$(${CLI} send mix deposit -m 1000000000 -p ./gnark/circuit/deposit/ -r 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -e token -s GD -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01)
echo "${hash}"
query_tx "${CLI}" "${hash}"
query_note "${MIX_CLI3}" 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k 1
echo "transfer to 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs"
transHash=$(${MIX_CLI3} mix wallet notes -a 1NLHPEcbTWWxxU3dGUZBhayjrCHD3psX7k -s 1 | jq -r ".notes[0].noteHash")
hash=$(${MIX_CLI3} send mix transfer -m 600000000 -n "$transHash" -t 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs -i ./gnark/circuit/transfer/input/ -o ./gnark/circuit/transfer/output/ -e token -s GD -k 4257D8692EF7FE13C68B65D6A52F03933DB2FA5CE8FAF210B5B8B80C721CED01)
echo "${hash}"
query_tx "${CLI}" "${hash}"
query_note "${MIX_CLI3}" 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs 1
echo "withdraw token GD"
withdrawHash=$(${MIX_CLI3} mix wallet notes -a 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs -s 1 | jq -r ".notes[0].noteHash")
hash=$(${MIX_CLI3} send mix withdraw -m 600000000 -n "$withdrawHash" -p ./gnark/circuit/withdraw/ -e token -s GD -k 0xcacb1f5d51700aea07fca2246ab43b0917d70405c65edea9b5063d72eb5c6b71)
echo "${hash}"
query_tx "${CLI}" "${hash}"
query_note "${MIX_CLI3}" 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs 2
${CLI} account balance -a 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs -e mix
balance=$(${CLI} asset balance -a 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs -e mix --asset_exec token --asset_symbol GD | jq -r ".balance")
if [ "${balance}" != "6.0000" ]; then
echo "account 1MCftFynyvG2F4ED5mdHYgziDxx6vDrScs should be 6.0000, real is $balance"
# exit 1
fi
}
function query_note() {
block_wait "${1}" 1
......@@ -201,6 +262,7 @@ function query_tx() {
function mix_test() {
echo "=========== # mix chain test ============="
mix_deposit
mix_token_test
}
function mix() {
......
......@@ -205,9 +205,50 @@ func QueryCmd() *cobra.Command {
cmd.AddCommand(GetTreeStatusCmd())
cmd.AddCommand(ShowMixTxsCmd())
cmd.AddCommand(ShowPaymentPubKeyCmd())
cmd.AddCommand(mixTokenTxFeeParaCmd())
return cmd
}
func mixTokenTxFeeParaCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "txfee",
Short: "query token tx fee addr",
Run: createTokenTxFee,
}
addTokenTxFeeFlags(cmd)
return cmd
}
func addTokenTxFeeFlags(cmd *cobra.Command) {
cmd.Flags().StringP("exec", "e", "", "asset exec")
cmd.MarkFlagRequired("exec")
cmd.Flags().StringP("symbol", "s", "", "asset symbol")
cmd.MarkFlagRequired("symbol")
}
func createTokenTxFee(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
exec, _ := cmd.Flags().GetString("exec")
symbol, _ := cmd.Flags().GetString("symbol")
var params rpctypes.Query4Jrpc
params.Execer = mixTy.MixX
params.FuncName = "TokenFeeAddr"
req := mixTy.TokenTxFee{
AssetExec: exec,
AssetSymbol: symbol,
}
params.Payload = types.MustPBToJSON(&req)
var res types.ReplyString
ctx := jsonclient.NewRPCCtx(rpcLaddr, "Chain33.Query", params, &res)
ctx.Run()
}
// GetParaInfoCmd get para chain status by height
func GetTreePathCmd() *cobra.Command {
cmd := &cobra.Command{
......@@ -225,19 +266,28 @@ func addGetPathCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("leaf", "l", "", "leaf hash")
cmd.MarkFlagRequired("leaf")
cmd.Flags().StringP("exec", "e", "", "asset exec")
cmd.MarkFlagRequired("exec")
cmd.Flags().StringP("symbol", "s", "", "asset symbol")
cmd.MarkFlagRequired("symbol")
}
func treePath(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
root, _ := cmd.Flags().GetString("root")
leaf, _ := cmd.Flags().GetString("leaf")
exec, _ := cmd.Flags().GetString("exec")
symbol, _ := cmd.Flags().GetString("symbol")
var params rpctypes.Query4Jrpc
params.Execer = mixTy.MixX
params.FuncName = "GetTreePath"
req := mixTy.TreeInfoReq{
RootHash: root,
LeafHash: leaf,
RootHash: root,
LeafHash: leaf,
AssetExec: exec,
AssetSymbol: symbol,
}
params.Payload = types.MustPBToJSON(&req)
......@@ -260,17 +310,26 @@ func GetTreeLeavesCmd() *cobra.Command {
func addGetLeavesCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("root", "r", "", "tree root hash, null means current leaves")
cmd.Flags().StringP("exec", "e", "", "asset exec")
cmd.MarkFlagRequired("exec")
cmd.Flags().StringP("symbol", "s", "", "asset symbol")
cmd.MarkFlagRequired("symbol")
}
func treeLeaves(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
root, _ := cmd.Flags().GetString("root")
exec, _ := cmd.Flags().GetString("exec")
symbol, _ := cmd.Flags().GetString("symbol")
var params rpctypes.Query4Jrpc
params.Execer = mixTy.MixX
params.FuncName = "GetLeavesList"
req := mixTy.TreeInfoReq{
RootHash: root,
RootHash: root,
AssetExec: exec,
AssetSymbol: symbol,
}
params.Payload = types.MustPBToJSON(&req)
......@@ -291,20 +350,27 @@ func GetTreeRootsCmd() *cobra.Command {
}
func addGetRootsflags(cmd *cobra.Command) {
cmd.Flags().Int64P("seq", "s", 0, "sequence, default 0 is for current status")
cmd.Flags().Uint64P("seq", "q", 0, "sequence, default 0 is for current status")
cmd.MarkFlagRequired("seq")
cmd.Flags().StringP("exec", "e", "", "asset exec")
cmd.MarkFlagRequired("exec")
cmd.Flags().StringP("symbol", "s", "", "asset symbol")
cmd.MarkFlagRequired("symbol")
}
func treeRoot(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
seq, _ := cmd.Flags().GetInt64("seq")
seq, _ := cmd.Flags().GetUint64("seq")
exec, _ := cmd.Flags().GetString("exec")
symbol, _ := cmd.Flags().GetString("symbol")
var params rpctypes.Query4Jrpc
params.Execer = mixTy.MixX
params.FuncName = "GetRootList"
params.Payload = types.MustPBToJSON(&types.ReqInt{Height: seq})
params.Payload = types.MustPBToJSON(&mixTy.TreeInfoReq{RootHeight: seq, AssetExec: exec, AssetSymbol: symbol})
var res mixTy.RootListResp
ctx := jsonclient.NewRPCCtx(rpcLaddr, "Chain33.Query", params, &res)
......@@ -318,18 +384,28 @@ func GetTreeStatusCmd() *cobra.Command {
Short: "Get commit leaves tree status",
Run: treeStatus,
}
//addGetRootsflags(cmd)
addGetTreeStatusflags(cmd)
return cmd
}
func addGetTreeStatusflags(cmd *cobra.Command) {
cmd.Flags().StringP("exec", "e", "", "asset exec")
cmd.MarkFlagRequired("exec")
cmd.Flags().StringP("symbol", "s", "", "asset symbol")
cmd.MarkFlagRequired("symbol")
}
func treeStatus(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
exec, _ := cmd.Flags().GetString("exec")
symbol, _ := cmd.Flags().GetString("symbol")
var params rpctypes.Query4Jrpc
params.Execer = mixTy.MixX
params.FuncName = "GetTreeStatus"
params.Payload = types.MustPBToJSON(&types.ReqNil{})
params.Payload = types.MustPBToJSON(&mixTy.TreeInfoReq{AssetExec: exec, AssetSymbol: symbol})
var res mixTy.TreeStatusResp
ctx := jsonclient.NewRPCCtx(rpcLaddr, "Chain33.Query", params, &res)
......@@ -810,20 +886,24 @@ func CreateDepositRawTxCmd() *cobra.Command {
}
func depositSecretCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("targets", "t", "", "target addrs,seperated by ','")
cmd.MarkFlagRequired("targets")
cmd.Flags().StringP("receiver", "r", "", "receiver addrs,seperated by ','")
cmd.MarkFlagRequired("receiver")
cmd.Flags().StringP("return", "r", "", "return addr,optional")
cmd.Flags().StringP("return", "f", "", "return addr,optional")
cmd.Flags().StringP("authorize", "a", "", "authorize addr,optional")
cmd.Flags().StringP("amount", "m", "", "amounts,seperated by ','")
cmd.MarkFlagRequired("amount")
cmd.Flags().StringP("token", "s", "BTY", "asset token, default BTY")
cmd.Flags().StringP("exec", "e", "coins", "asset executor(coins, token, paracross), default coins")
cmd.Flags().StringP("symbol", "s", "BTY", "asset symbol,like BTY")
cmd.MarkFlagRequired("symbol")
cmd.Flags().StringP("exec", "e", "coins", "asset executor(coins, token)")
cmd.MarkFlagRequired("exec")
cmd.Flags().StringP("path", "p", "", "deposit circuit path")
cmd.MarkFlagRequired("path")
cmd.Flags().StringP("path", "p", "", "deposit circuit path ")
cmd.Flags().Int32P("privacy", "w", 0, "get zk privacy data print, 1:print, default not")
cmd.Flags().Int32P("verify", "v", 0, "verify on chain:0 on local:1, default 0 ")
......@@ -832,19 +912,19 @@ func depositSecretCmdFlags(cmd *cobra.Command) {
func depositSecret(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
paraName, _ := cmd.Flags().GetString("paraName")
targets, _ := cmd.Flags().GetString("targets")
receiver, _ := cmd.Flags().GetString("receiver")
returnAddr, _ := cmd.Flags().GetString("return")
authorize, _ := cmd.Flags().GetString("authorize")
amount, _ := cmd.Flags().GetString("amount")
assetExec, _ := cmd.Flags().GetString("exec")
token, _ := cmd.Flags().GetString("token")
symbol, _ := cmd.Flags().GetString("symbol")
path, _ := cmd.Flags().GetString("path")
privacy, _ := cmd.Flags().GetInt32("privacy")
verify, _ := cmd.Flags().GetInt32("verify")
deposit := &mixTy.DepositInfo{
ReceiverAddrs: targets,
ReceiverAddrs: receiver,
ReturnAddr: returnAddr,
AuthorizeAddr: authorize,
Amounts: amount,
......@@ -856,13 +936,13 @@ func depositSecret(cmd *cobra.Command, args []string) {
}
params := &mixTy.CreateRawTxReq{
ActionTy: mixTy.MixActionDeposit,
Data: types.Encode(tx),
AssetExec: assetExec,
AssetToken: token,
Title: paraName,
Privacy: privacy,
Verify: verify,
ActionTy: mixTy.MixActionDeposit,
Data: types.Encode(tx),
AssetExec: assetExec,
AssetSymbol: symbol,
Title: paraName,
Privacy: privacy,
Verify: verify,
}
ctx := jsonclient.NewRPCCtx(rpcLaddr, "mix.CreateRawTransaction", params, nil)
......@@ -894,8 +974,10 @@ func transferSecretCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("amount", "m", "", "transfer amount")
cmd.MarkFlagRequired("amount")
cmd.Flags().StringP("token", "s", "BTY", "asset token, default BTY")
cmd.Flags().StringP("exec", "e", "coins", "asset executor(coins, token, paracross), default coins")
cmd.Flags().StringP("symbol", "s", "BTY", "asset token, like BTY")
cmd.MarkFlagRequired("symbol")
cmd.Flags().StringP("exec", "e", "coins", "asset executor(coins, token)")
cmd.MarkFlagRequired("exec")
cmd.Flags().StringP("inpath", "i", "", "input path ")
cmd.MarkFlagRequired("inpath")
......@@ -920,7 +1002,7 @@ func transferSecret(cmd *cobra.Command, args []string) {
outpath, _ := cmd.Flags().GetString("outpath")
assetExec, _ := cmd.Flags().GetString("exec")
token, _ := cmd.Flags().GetString("token")
symbol, _ := cmd.Flags().GetString("symbol")
privacy, _ := cmd.Flags().GetInt32("privacy")
verify, _ := cmd.Flags().GetInt32("verify")
......@@ -948,13 +1030,13 @@ func transferSecret(cmd *cobra.Command, args []string) {
}
params := &mixTy.CreateRawTxReq{
ActionTy: mixTy.MixActionTransfer,
Data: types.Encode(req),
AssetExec: assetExec,
AssetToken: token,
Title: paraName,
Privacy: privacy,
Verify: verify,
ActionTy: mixTy.MixActionTransfer,
Data: types.Encode(req),
AssetExec: assetExec,
AssetSymbol: symbol,
Title: paraName,
Privacy: privacy,
Verify: verify,
}
ctx := jsonclient.NewRPCCtx(rpcLaddr, "mix.CreateRawTransaction", params, nil)
......@@ -979,8 +1061,10 @@ func withdrawSecretCmdFlags(cmd *cobra.Command) {
cmd.Flags().Uint64P("amount", "m", 0, "total amount")
cmd.MarkFlagRequired("amount")
cmd.Flags().StringP("token", "s", "BTY", "asset token, default BTY")
cmd.Flags().StringP("symbol", "s", "BTY", "asset token, default BTY")
cmd.MarkFlagRequired("symbol")
cmd.Flags().StringP("exec", "e", "coins", "asset executor(coins, token, paracross), default coins")
cmd.MarkFlagRequired("exec")
cmd.Flags().StringP("path", "p", "", "withdraw pk file ")
cmd.MarkFlagRequired("path")
......@@ -997,7 +1081,7 @@ func withdrawSecret(cmd *cobra.Command, args []string) {
amount, _ := cmd.Flags().GetUint64("amount")
assetExec, _ := cmd.Flags().GetString("exec")
token, _ := cmd.Flags().GetString("token")
symbol, _ := cmd.Flags().GetString("symbol")
path, _ := cmd.Flags().GetString("path")
privacy, _ := cmd.Flags().GetInt32("privacy")
......@@ -1010,13 +1094,13 @@ func withdrawSecret(cmd *cobra.Command, args []string) {
}
params := &mixTy.CreateRawTxReq{
ActionTy: mixTy.MixActionWithdraw,
Data: types.Encode(req),
AssetExec: assetExec,
AssetToken: token,
Title: paraName,
Privacy: privacy,
Verify: verify,
ActionTy: mixTy.MixActionWithdraw,
Data: types.Encode(req),
AssetExec: assetExec,
AssetSymbol: symbol,
Title: paraName,
Privacy: privacy,
Verify: verify,
}
ctx := jsonclient.NewRPCCtx(rpcLaddr, "mix.CreateRawTransaction", params, nil)
......@@ -1041,8 +1125,10 @@ func authSecretCmdFlags(cmd *cobra.Command) {
cmd.Flags().StringP("toKey", "a", "", "authorize to key")
cmd.MarkFlagRequired("toKey")
cmd.Flags().StringP("token", "s", "BTY", "asset token, default BTY")
cmd.Flags().StringP("symbol", "s", "BTY", "asset token, default BTY")
cmd.MarkFlagRequired("symbol")
cmd.Flags().StringP("exec", "e", "coins", "asset executor(coins, token, paracross), default coins")
cmd.MarkFlagRequired("exec")
cmd.Flags().StringP("path", "p", "", "auth path file ")
cmd.MarkFlagRequired("path")
......@@ -1059,7 +1145,7 @@ func authSecret(cmd *cobra.Command, args []string) {
toKey, _ := cmd.Flags().GetString("toKey")
assetExec, _ := cmd.Flags().GetString("exec")
token, _ := cmd.Flags().GetString("token")
symbol, _ := cmd.Flags().GetString("symbol")
path, _ := cmd.Flags().GetString("path")
......@@ -1073,13 +1159,13 @@ func authSecret(cmd *cobra.Command, args []string) {
}
params := &mixTy.CreateRawTxReq{
ActionTy: mixTy.MixActionAuth,
Data: types.Encode(req),
AssetExec: assetExec,
AssetToken: token,
Title: paraName,
Privacy: privacy,
Verify: verify,
ActionTy: mixTy.MixActionAuth,
Data: types.Encode(req),
AssetExec: assetExec,
AssetSymbol: symbol,
Title: paraName,
Privacy: privacy,
Verify: verify,
}
ctx := jsonclient.NewRPCCtx(rpcLaddr, "mix.CreateRawTransaction", params, nil)
......
......@@ -15,11 +15,11 @@ import (
"github.com/pkg/errors"
)
func (a *action) authParamCheck(input *mixTy.AuthorizePublicInput) error {
func (a *action) authParamCheck(exec, symbol string, input *mixTy.AuthorizePublicInput) error {
//check tree rootHash exist
exist, err := checkTreeRootHashExist(a.db, mixTy.Str2Byte(input.TreeRootHash))
exist, err := checkTreeRootHashExist(a.db, exec, symbol, mixTy.Str2Byte(input.TreeRootHash))
if err != nil {
return errors.Wrapf(err, "roothash=%s not found", input.TreeRootHash)
return errors.Wrapf(err, "roothash=%s not found,exec=%s,symbol=%s", input.TreeRootHash, exec, symbol)
}
if !exist {
return errors.Wrapf(mixTy.ErrTreeRootHashNotFound, "roothash=%s", input.TreeRootHash)
......@@ -54,7 +54,7 @@ func (a *action) authParamCheck(input *mixTy.AuthorizePublicInput) error {
return nil
}
func (a *action) authorizeVerify(proof *mixTy.ZkProofInfo) (*mixTy.AuthorizePublicInput, error) {
func (a *action) authorizeVerify(exec, symbol string, proof *mixTy.ZkProofInfo) (*mixTy.AuthorizePublicInput, error) {
var input mixTy.AuthorizePublicInput
data, err := hex.DecodeString(proof.PublicInput)
if err != nil {
......@@ -65,7 +65,7 @@ func (a *action) authorizeVerify(proof *mixTy.ZkProofInfo) (*mixTy.AuthorizePubl
return nil, errors.Wrapf(err, "unmarshal string=%s", proof.PublicInput)
}
err = a.authParamCheck(&input)
err = a.authParamCheck(exec, symbol, &input)
if err != nil {
return nil, err
}
......@@ -90,7 +90,8 @@ func (a *action) authorizeVerify(proof *mixTy.ZkProofInfo) (*mixTy.AuthorizePubl
func (a *action) Authorize(authorize *mixTy.MixAuthorizeAction) (*types.Receipt, error) {
var inputs []*mixTy.AuthorizePublicInput
in, err := a.authorizeVerify(authorize.Proof)
execer, symbol := mixTy.GetAssetExecSymbol(a.api.GetConfig(), authorize.AssetExec, authorize.AssetSymbol)
in, err := a.authorizeVerify(execer, symbol, authorize.Proof)
if err != nil {
return nil, err
}
......
......@@ -31,11 +31,13 @@ func getCommitLeaves(db dbm.KV, key []byte) (*mixTy.CommitTreeLeaves, error) {
return &leaves, nil
}
func getCommitTreeStatus(db dbm.KV) (*mixTy.CommitTreeStatus, error) {
v, err := db.Get(calcCommitTreeCurrentStatusKey())
func getCommitTreeStatus(db dbm.KV, assetExec, assetSymbol string) (*mixTy.CommitTreeStatus, error) {
v, err := db.Get(calcCommitTreeCurrentStatusKey(assetExec, assetSymbol))
if isNotFound(err) {
//系统初始化开始,没有任何状态,初始seq设为1,如果一个merkle树完成后,status清空状态,seq也要初始为1,作为数据库占位,不然会往前查找
return &mixTy.CommitTreeStatus{
AssetExec: assetExec,
AssetSymbol: assetSymbol,
SubTrees: &mixTy.CommitSubTrees{},
ArchiveRootsSeq: 1}, nil
}
......@@ -52,10 +54,10 @@ func getCommitTreeStatus(db dbm.KV) (*mixTy.CommitTreeStatus, error) {
return &status, nil
}
func getSubLeaves(db dbm.KV, currentSeq int32) (*mixTy.CommitTreeLeaves, error) {
func getSubLeaves(db dbm.KV, exec, symbol string, currentSeq int32) (*mixTy.CommitTreeLeaves, error) {
var leaves mixTy.CommitTreeLeaves
for i := int32(1); i <= currentSeq; i++ {
l, err := getCommitLeaves(db, calcSubLeavesKey(i))
l, err := getCommitLeaves(db, calcSubLeavesKey(exec, symbol, i))
if err != nil {
return nil, errors.Wrapf(err, "getSubLeaves seq=%d", i)
}
......@@ -65,8 +67,8 @@ func getSubLeaves(db dbm.KV, currentSeq int32) (*mixTy.CommitTreeLeaves, error)
return &leaves, nil
}
func getCommitRootLeaves(db dbm.KV, rootHash string) (*mixTy.CommitTreeLeaves, error) {
return getCommitLeaves(db, calcCommitTreeRootLeaves(rootHash))
func getCommitRootLeaves(db dbm.KV, exec, symbol, rootHash string) (*mixTy.CommitTreeLeaves, error) {
return getCommitLeaves(db, calcCommitTreeRootLeaves(exec, symbol, rootHash))
}
func getCommitTreeRoots(db dbm.KV, key []byte) (*mixTy.CommitTreeRoots, error) {
......@@ -83,12 +85,12 @@ func getCommitTreeRoots(db dbm.KV, key []byte) (*mixTy.CommitTreeRoots, error) {
return &roots, nil
}
func getSubRoots(db dbm.KV, seq int32) (*mixTy.CommitTreeRoots, error) {
return getCommitTreeRoots(db, calcSubRootsKey(seq))
func getSubRoots(db dbm.KV, exec, symbol string, seq int32) (*mixTy.CommitTreeRoots, error) {
return getCommitTreeRoots(db, calcSubRootsKey(exec, symbol, seq))
}
func getArchiveRoots(db dbm.KV, seq uint64) (*mixTy.CommitTreeRoots, error) {
return getCommitTreeRoots(db, calcArchiveRootsKey(seq))
func getArchiveRoots(db dbm.KV, exec, symbol string, seq uint64) (*mixTy.CommitTreeRoots, error) {
return getCommitTreeRoots(db, calcArchiveRootsKey(exec, symbol, seq))
}
//TODO seed config
......@@ -105,8 +107,8 @@ func calcTreeRoot(leaves *mixTy.CommitTreeLeaves) []byte {
}
func makeArchiveRootReceipt(seq uint64, root string) *types.Receipt {
key := calcArchiveRootsKey(seq)
func makeArchiveRootReceipt(exec, symbol string, seq uint64, root string) *types.Receipt {
key := calcArchiveRootsKey(exec, symbol, seq)
log := &mixTy.ReceiptArchiveTreeRoot{
RootHash: root,
Seq: seq,
......@@ -126,9 +128,9 @@ func makeArchiveRootReceipt(seq uint64, root string) *types.Receipt {
}
func makeArchiveLeavesReceipt(root string, leaves *mixTy.CommitTreeLeaves) *types.Receipt {
func makeArchiveLeavesReceipt(exec, symbol, root string, leaves *mixTy.CommitTreeLeaves) *types.Receipt {
key := calcCommitTreeRootLeaves(root)
key := calcCommitTreeRootLeaves(exec, symbol, root)
log := &mixTy.ReceiptArchiveLeaves{
RootHash: root,
Count: int32(len(leaves.Leaves)),
......@@ -148,8 +150,8 @@ func makeArchiveLeavesReceipt(root string, leaves *mixTy.CommitTreeLeaves) *type
}
func makeSubRootsReceipt(seq int32, root []byte) *types.Receipt {
key := calcSubRootsKey(seq)
func makeSubRootsReceipt(exec, symbol string, seq int32, root []byte) *types.Receipt {
key := calcSubRootsKey(exec, symbol, seq)
log := &mixTy.ReceiptCommitSubRoots{
Seq: seq,
Root: mixTy.Byte2Str(root),
......@@ -168,8 +170,8 @@ func makeSubRootsReceipt(seq int32, root []byte) *types.Receipt {
}
func makeSubLeavesReceipt(seq int32, leaf []byte) *types.Receipt {
key := calcSubLeavesKey(seq)
func makeSubLeavesReceipt(exec, symbol string, seq int32, leaf []byte) *types.Receipt {
key := calcSubLeavesKey(exec, symbol, seq)
log := &mixTy.ReceiptCommitSubLeaves{
Seq: seq,
Leaf: mixTy.Byte2Str(leaf),
......@@ -188,8 +190,8 @@ func makeSubLeavesReceipt(seq int32, leaf []byte) *types.Receipt {
}
func makeTreeStatusReceipt(prev, current *mixTy.CommitTreeStatus) *types.Receipt {
keyStatus := calcCommitTreeCurrentStatusKey()
func makeTreeStatusReceipt(exec, symbol string, prev, current *mixTy.CommitTreeStatus) *types.Receipt {
keyStatus := calcCommitTreeCurrentStatusKey(exec, symbol)
log := &mixTy.ReceiptCommitTreeStatus{
Prev: prev,
Current: current,
......@@ -210,11 +212,11 @@ func makeTreeStatusReceipt(prev, current *mixTy.CommitTreeStatus) *types.Receipt
}
func getArchivedSubLeaves(db dbm.KV) (*mixTy.CommitTreeLeaves, error) {
func getArchivedSubLeaves(db dbm.KV, exec, symbol string, maxTreeLeaves int32) (*mixTy.CommitTreeLeaves, error) {
var leaves mixTy.CommitTreeLeaves
//获取前1023个leaf
for i := int32(1); i < mixTy.MaxTreeLeaves; i++ {
r, err := getCommitLeaves(db, calcSubLeavesKey(i))
for i := int32(1); i < maxTreeLeaves; i++ {
r, err := getCommitLeaves(db, calcSubLeavesKey(exec, symbol, i))
if err != nil {
return nil, errors.Wrapf(err, "getArchivedSubTreeLeaves,i=%d", i)
}
......@@ -258,14 +260,14 @@ func joinSubTrees(status *mixTy.CommitTreeStatus, leaf []byte) ([]byte, error) {
}
func joinLeaves(db dbm.KV, status *mixTy.CommitTreeStatus, leaf []byte) (*types.Receipt, error) {
func joinLeaves(db dbm.KV, status *mixTy.CommitTreeStatus, leaf []byte, maxTreeLeaves int32) (*types.Receipt, error) {
receipts := &types.Receipt{Ty: types.ExecOk}
//seq从1开始记录前1023个叶子和root
if status.SubLeavesSeq < mixTy.MaxTreeLeaves {
if status.SubLeavesSeq < maxTreeLeaves {
status.SubLeavesSeq++
r := makeSubLeavesReceipt(status.SubLeavesSeq, leaf)
r := makeSubLeavesReceipt(status.AssetExec, status.AssetSymbol, status.SubLeavesSeq, leaf)
mergeReceipt(receipts, r)
//恢复并重新计算子树
......@@ -273,14 +275,14 @@ func joinLeaves(db dbm.KV, status *mixTy.CommitTreeStatus, leaf []byte) (*types.
if err != nil {
return nil, errors.Wrapf(err, "joinLeaves.joinSubTrees")
}
r = makeSubRootsReceipt(status.SubLeavesSeq, root)
r = makeSubRootsReceipt(status.AssetExec, status.AssetSymbol, status.SubLeavesSeq, root)
mergeReceipt(receipts, r)
return receipts, nil
}
//累积到1024个叶子,需要归档
sumLeaves, err := getArchivedSubLeaves(db)
sumLeaves, err := getArchivedSubLeaves(db, status.AssetExec, status.AssetSymbol, maxTreeLeaves)
if err != nil {
return nil, errors.Wrapf(err, "pushTree.joinLeaves")
}
......@@ -289,11 +291,11 @@ func joinLeaves(db dbm.KV, status *mixTy.CommitTreeStatus, leaf []byte) (*types.
//重新计算1024个叶子root,确保正确
root := mixTy.Byte2Str(calcTreeRoot(sumLeaves))
//root-leaves保存leaves
r := makeArchiveLeavesReceipt(root, sumLeaves)
r := makeArchiveLeavesReceipt(status.AssetExec, status.AssetSymbol, root, sumLeaves)
mergeReceipt(receipts, r)
//1024叶子的root归档到相应archiveSeq
r = makeArchiveRootReceipt(status.ArchiveRootsSeq, root)
r = makeArchiveRootReceipt(status.AssetExec, status.AssetSymbol, status.ArchiveRootsSeq, root)
mergeReceipt(receipts, r)
status.ArchiveRootsSeq++
......@@ -309,8 +311,9 @@ func joinLeaves(db dbm.KV, status *mixTy.CommitTreeStatus, leaf []byte) (*types.
2. 如果leaves 达到最大比如1024,则按root归档leaves,并归档相应root
3. 归档同时初始化新的current leaves 和roots
*/
func pushTree(db dbm.KV, leaves [][]byte) (*types.Receipt, error) {
status, err := getCommitTreeStatus(db)
func pushTree(db dbm.KV, exec, symbol string, leaves [][]byte, maxTreeLeaves int32) (*types.Receipt, error) {
status, err := getCommitTreeStatus(db, exec, symbol)
if err != nil {
return nil, err
}
......@@ -322,13 +325,13 @@ func pushTree(db dbm.KV, leaves [][]byte) (*types.Receipt, error) {
if len(leaf) <= 0 {
return nil, errors.Wrapf(types.ErrInvalidParam, "the %d leaf is null", i)
}
r, err := joinLeaves(db, status, leaf)
r, err := joinLeaves(db, status, leaf, maxTreeLeaves)
if err != nil {
return nil, errors.Wrapf(err, "pushTree.joinLeaves leaf=%s", mixTy.Byte2Str(leaf))
}
mergeReceipt(receipts, r)
}
r := makeTreeStatusReceipt(prev, status)
r := makeTreeStatusReceipt(exec, symbol, prev, status)
mergeReceipt(receipts, r)
return receipts, nil
......@@ -343,15 +346,15 @@ func checkExist(target []byte, list [][]byte) bool {
return false
}
func checkTreeRootHashExist(db dbm.KV, hash []byte) (bool, error) {
status, err := getCommitTreeStatus(db)
func checkTreeRootHashExist(db dbm.KV, exec, symbol string, hash []byte) (bool, error) {
status, err := getCommitTreeStatus(db, exec, symbol)
if err != nil {
return false, errors.Wrapf(err, "checkTreeRootHashExist")
}
//查归档的subRoots,当前subSeq还未归档
for i := int32(1); i <= status.SubLeavesSeq; i++ {
subRoots, err := getSubRoots(db, i)
subRoots, err := getSubRoots(db, exec, symbol, i)
if err != nil {
return false, errors.Wrapf(err, "checkTreeRootHashExist.getSubRoots seq=%d", i)
}
......@@ -362,7 +365,7 @@ func checkTreeRootHashExist(db dbm.KV, hash []byte) (bool, error) {
//再查归档的roots
for i := status.ArchiveRootsSeq; i > 0; i-- {
subRoots, err := getArchiveRoots(db, i)
subRoots, err := getArchiveRoots(db, exec, symbol, i)
if err != nil {
return false, errors.Wrapf(err, "checkTreeRootHashExist.getArchiveRoots seq=%d", i)
}
......@@ -417,17 +420,17 @@ func getProveData(targetLeaf []byte, leaves [][]byte) (*mixTy.CommitTreeProve, e
//1. 首先在当前tree查找
//2. 如果提供了rootHash,则根据roothash+leaf查找,否则全局遍历查找
func CalcTreeProve(db dbm.KV, rootHash, leaf string) (*mixTy.CommitTreeProve, error) {
func CalcTreeProve(db dbm.KV, exec, symbol, rootHash, leaf string) (*mixTy.CommitTreeProve, error) {
if len(leaf) <= 0 {
return nil, errors.Wrap(types.ErrInvalidParam, "leaf is null")
}
status, err := getCommitTreeStatus(db)
status, err := getCommitTreeStatus(db, exec, symbol)
if err != nil {
return nil, errors.Wrapf(err, "CalcTreeProve.getCommitTreeStatus")
}
leaves, err := getSubLeaves(db, status.SubLeavesSeq)
leaves, err := getSubLeaves(db, exec, symbol, status.SubLeavesSeq)
if err == nil {
p, err := getProveData(mixTy.Str2Byte(leaf), leaves.Leaves)
if err == nil {
......@@ -436,7 +439,7 @@ func CalcTreeProve(db dbm.KV, rootHash, leaf string) (*mixTy.CommitTreeProve, er
}
if len(rootHash) > 0 {
leaves, err := getCommitRootLeaves(db, rootHash)
leaves, err := getCommitRootLeaves(db, exec, symbol, rootHash)
if err != nil {
return nil, errors.Wrapf(err, "getCommitRootLeaves rootHash=%s", rootHash)
}
......@@ -449,8 +452,8 @@ func CalcTreeProve(db dbm.KV, rootHash, leaf string) (*mixTy.CommitTreeProve, er
}
for i := status.ArchiveRootsSeq; i > 0; i-- {
roots, err := getArchiveRoots(db, i)
leaves, err := getCommitRootLeaves(db, mixTy.Byte2Str(roots.Roots[0]))
roots, err := getArchiveRoots(db, exec, symbol, i)
leaves, err := getCommitRootLeaves(db, exec, symbol, mixTy.Byte2Str(roots.Roots[0]))
if err == nil {
p, err := getProveData(mixTy.Str2Byte(leaf), leaves.Leaves)
if err == nil {
......
......@@ -158,7 +158,7 @@ func (a *action) ConfigDeleteAuthPubKey(key string) (*types.Receipt, error) {
}
func makeConfigPaymentKeyReceipt(data *mixTy.PaymentKey) *types.Receipt {
key := getPaymentPubKey(data.Addr)
key := calcReceivingKey(data.Addr)
return &types.Receipt{
Ty: types.ExecOk,
KV: []*types.KeyValue{
......@@ -172,7 +172,7 @@ func makeConfigPaymentKeyReceipt(data *mixTy.PaymentKey) *types.Receipt {
}
func GetPaymentPubKey(db dbm.KV, addr string) (*mixTy.PaymentKey, error) {
key := getPaymentPubKey(addr)
key := calcReceivingKey(addr)
v, err := db.Get(key)
if err != nil {
return nil, errors.Wrapf(err, "get db")
......
......@@ -97,9 +97,10 @@ func (a *action) Deposit(deposit *mixTy.MixDepositAction) (*types.Receipt, error
//存款
cfg := a.api.GetConfig()
accoutDb, err := createAccount(cfg, "", "", a.db)
execer, symbol := mixTy.GetAssetExecSymbol(cfg, deposit.AssetExec, deposit.AssetSymbol)
accoutDb, err := createAccount(cfg, execer, symbol, a.db)
if err != nil {
return nil, errors.Wrapf(err, "createAccount")
return nil, errors.Wrapf(err, "createAccount,execer=%s,symbol=%s", execer, symbol)
}
//主链上存入toAddr为mix 执行器地址,平行链上为user.p.{}.mix执行器地址,execAddr和toAddr一致
execAddr := address.ExecAddress(string(a.tx.Execer))
......@@ -112,7 +113,9 @@ func (a *action) Deposit(deposit *mixTy.MixDepositAction) (*types.Receipt, error
for _, n := range notes {
leaves = append(leaves, mixTy.Str2Byte(n))
}
rpt, err := pushTree(a.db, leaves)
conf := types.ConfSub(cfg, mixTy.MixX)
maxTreeLeaves := conf.GInt("maxTreeLeaves")
rpt, err := pushTree(a.db, execer, symbol, leaves, int32(maxTreeLeaves))
if err != nil {
return nil, errors.Wrap(err, "pushTree")
}
......
......@@ -9,9 +9,9 @@ import (
)
var (
verifyKeys string
authPubKeys string
paymentPubKey string
verifyKeys string
authPubKeys string
receivingKey string
commitTreeCurrentStatus string
commitTreeSubRoots string
......@@ -27,7 +27,7 @@ var (
func setPrefix() {
verifyKeys = "mavl-mix-verify-keys-"
authPubKeys = "mavl-mix-auth-pubkeys-"
paymentPubKey = "mavl-mix-payment-pubkey-"
receivingKey = "mavl-mix-receiving-key-"
commitTreeCurrentStatus = "mavl-mix-commitTree-current-status-"
......@@ -51,28 +51,28 @@ func getAuthPubKeysKey() []byte {
return []byte(fmt.Sprintf(authPubKeys))
}
func getPaymentPubKey(addr string) []byte {
return []byte(fmt.Sprintf(paymentPubKey+"%s", addr))
func calcReceivingKey(addr string) []byte {
return []byte(fmt.Sprintf(receivingKey+"%s", addr))
}
func calcCommitTreeCurrentStatusKey() []byte {
return []byte(fmt.Sprintf(commitTreeCurrentStatus))
func calcCommitTreeCurrentStatusKey(exec, symbol string) []byte {
return []byte(fmt.Sprintf(commitTreeCurrentStatus+"%s-%s", exec, symbol))
}
func calcArchiveRootsKey(seq uint64) []byte {
return []byte(fmt.Sprintf(commitTreeArchiveRoots+"%022d", seq))
func calcArchiveRootsKey(exec, symbol string, seq uint64) []byte {
return []byte(fmt.Sprintf(commitTreeArchiveRoots+"%s-%s-%022d", exec, symbol, seq))
}
func calcSubRootsKey(seq int32) []byte {
return []byte(fmt.Sprintf(commitTreeSubRoots+"%010d", seq))
func calcSubRootsKey(exec, symbol string, seq int32) []byte {
return []byte(fmt.Sprintf(commitTreeSubRoots+"%s-%s-%010d", exec, symbol, seq))
}
func calcSubLeavesKey(seq int32) []byte {
return []byte(fmt.Sprintf(commitTreeSubLeaves+"%010d", seq))
func calcSubLeavesKey(exec, symbol string, seq int32) []byte {
return []byte(fmt.Sprintf(commitTreeSubLeaves+"%s-%s-%010d", exec, symbol, seq))
}
func calcCommitTreeRootLeaves(rootHash string) []byte {
return []byte(fmt.Sprintf(commitTreeRootLeaves+"%s", rootHash))
func calcCommitTreeRootLeaves(exec, symbol string, rootHash string) []byte {
return []byte(fmt.Sprintf(commitTreeRootLeaves+"%s-%s-%s", exec, symbol, rootHash))
}
func calcAuthorizeHashKey(hash string) []byte {
......
......@@ -63,7 +63,8 @@ func (m *Mix) CheckTx(tx *types.Transaction, index int) error {
// mix隐私交易,只私对私需要特殊签名验证
return m.DriverBase.CheckTx(tx, index)
}
_, _, err := MixTransferInfoVerify(m.GetStateDB(), action.GetTransfer())
_, _, err := MixTransferInfoVerify(m.GetAPI().GetConfig(), m.GetStateDB(), action.GetTransfer())
if err != nil {
mlog.Error("checkTx", "err", err, "txhash", common.ToHex(tx.Hash()))
return err
......
......@@ -5,6 +5,7 @@
package executor
import (
"github.com/33cn/chain33/common/address"
"github.com/33cn/chain33/types"
mixTy "github.com/33cn/plugin/plugin/dapp/mix/types"
......@@ -16,7 +17,7 @@ func (m *Mix) Query_GetTreePath(in *mixTy.TreeInfoReq) (types.Message, error) {
if in == nil {
return nil, types.ErrInvalidParam
}
return CalcTreeProve(m.GetStateDB(), in.RootHash, in.LeafHash)
return CalcTreeProve(m.GetStateDB(), in.AssetExec, in.AssetSymbol, in.RootHash, in.LeafHash)
}
// Query_GetTreeList query paracross title
......@@ -27,18 +28,18 @@ func (m *Mix) Query_GetLeavesList(in *mixTy.TreeInfoReq) (types.Message, error)
var leaves *mixTy.CommitTreeLeaves
if len(in.RootHash) > 0 {
l, err := getCommitLeaves(m.GetStateDB(), calcCommitTreeRootLeaves(in.RootHash))
l, err := getCommitLeaves(m.GetStateDB(), calcCommitTreeRootLeaves(in.AssetExec, in.AssetSymbol, in.RootHash))
if err != nil {
return nil, err
}
leaves.Leaves = append(leaves.Leaves, l.Leaves...)
} else {
status, err := getCommitTreeStatus(m.GetStateDB())
status, err := getCommitTreeStatus(m.GetStateDB(), in.AssetExec, in.AssetSymbol)
if err != nil {
return nil, err
}
for i := int32(1); i <= status.SubLeavesSeq; i++ {
l, err := getCommitLeaves(m.GetStateDB(), calcSubLeavesKey(i))
l, err := getCommitLeaves(m.GetStateDB(), calcSubLeavesKey(in.AssetExec, in.AssetSymbol, i))
if err != nil {
return nil, errors.Wrapf(err, "get leaves of seq=%d", i)
}
......@@ -57,21 +58,21 @@ func (m *Mix) Query_GetLeavesList(in *mixTy.TreeInfoReq) (types.Message, error)
}
// Query_GetRootList query title
func (m *Mix) Query_GetRootList(in *types.ReqInt) (types.Message, error) {
func (m *Mix) Query_GetRootList(in *mixTy.TreeInfoReq) (types.Message, error) {
var roots mixTy.CommitTreeRoots
if in.Height > 0 {
r, err := getArchiveRoots(m.GetStateDB(), uint64(in.Height))
if in.RootHeight > 0 {
r, err := getArchiveRoots(m.GetStateDB(), in.AssetExec, in.AssetSymbol, in.RootHeight)
if err != nil {
return nil, err
}
roots.Roots = append(roots.Roots, r.Roots...)
} else {
status, err := getCommitTreeStatus(m.GetStateDB())
status, err := getCommitTreeStatus(m.GetStateDB(), in.AssetExec, in.AssetSymbol)
if err != nil {
return nil, err
}
for i := int32(1); i <= status.SubLeavesSeq; i++ {
r, err := getSubRoots(m.GetStateDB(), i)
r, err := getSubRoots(m.GetStateDB(), in.AssetExec, in.AssetSymbol, i)
if err != nil {
return nil, errors.Wrapf(err, "get roots of seq=%d", i)
}
......@@ -87,8 +88,8 @@ func (m *Mix) Query_GetRootList(in *types.ReqInt) (types.Message, error) {
return &resp, nil
}
func (m *Mix) Query_GetTreeStatus(in *types.ReqNil) (types.Message, error) {
status, err := getCommitTreeStatus(m.GetStateDB())
func (m *Mix) Query_GetTreeStatus(in *mixTy.TreeInfoReq) (types.Message, error) {
status, err := getCommitTreeStatus(m.GetStateDB(), in.AssetExec, in.AssetSymbol)
if err != nil {
return nil, err
}
......@@ -113,7 +114,16 @@ func (m *Mix) Query_PaymentPubKey(addr *types.ReqString) (types.Message, error)
}
// Query_PaymentPubKey 批量查询
// Query_VerifyProof 批量查询
func (m *Mix) Query_VerifyProof(req *mixTy.VerifyProofInfo) (types.Message, error) {
return &types.ReqNil{}, zkProofVerify(m.GetStateDB(), req.Proof, req.Ty)
}
// Query_TokenFeeAddr 私对私token转账,代扣地址查询, 需预先转账主代币到相应资产地址下面才能完成私对私的转账,代扣地址coins不能提回
func (m *Mix) Query_TokenFeeAddr(req *mixTy.TokenTxFee) (types.Message, error) {
if req == nil || len(req.AssetExec) == 0 || len(req.AssetSymbol) == 0 {
return nil, errors.Wrapf(types.ErrInvalidParam, "asset exec or symbol not filled")
}
return &types.ReplyString{Data: address.ExecAddress(mixTy.MixX + req.AssetExec + req.AssetSymbol)}, nil
}
......@@ -8,6 +8,8 @@ import (
"encoding/hex"
"encoding/json"
"github.com/33cn/chain33/common/address"
"github.com/33cn/chain33/types"
mixTy "github.com/33cn/plugin/plugin/dapp/mix/types"
"github.com/consensys/gurvy/bn256/twistededwards"
......@@ -21,7 +23,7 @@ import (
2. check if exist in authorize pool and nullifier pool
*/
func transferInputVerify(db dbm.KV, proof *mixTy.ZkProofInfo) (*mixTy.TransferInputPublicInput, error) {
func transferInputVerify(db dbm.KV, execer, symbol string, proof *mixTy.ZkProofInfo) (*mixTy.TransferInputPublicInput, error) {
var input mixTy.TransferInputPublicInput
data, err := hex.DecodeString(proof.PublicInput)
if err != nil {
......@@ -32,7 +34,7 @@ func transferInputVerify(db dbm.KV, proof *mixTy.ZkProofInfo) (*mixTy.TransferIn
return nil, errors.Wrapf(err, "transferInput verify unmarshal string=%s", proof.PublicInput)
}
err = spendVerify(db, input.TreeRootHash, input.NullifierHash, input.AuthorizeSpendHash)
err = spendVerify(db, execer, symbol, input.TreeRootHash, input.NullifierHash, input.AuthorizeSpendHash)
if err != nil {
return nil, errors.Wrap(err, "transferInput verify spendVerify")
}
......@@ -71,7 +73,7 @@ func transferOutputVerify(db dbm.KV, proof *mixTy.ZkProofInfo) (*mixTy.TransferO
}
func VerifyCommitValues(inputs []*mixTy.TransferInputPublicInput, outputs []*mixTy.TransferOutputPublicInput) bool {
func VerifyCommitValues(inputs []*mixTy.TransferInputPublicInput, outputs []*mixTy.TransferOutputPublicInput, txFee uint64) bool {
var inputPoints, outputPoints []*twistededwards.Point
for _, in := range inputs {
var p twistededwards.Point
......@@ -89,7 +91,7 @@ func VerifyCommitValues(inputs []*mixTy.TransferInputPublicInput, outputs []*mix
//out value add fee
//对于平行链来说, 隐私交易需要一个公共账户扣主链的手续费,隐私交易只需要扣平行链执行器内的费用即可
//由于平行链的隐私交易没有实际扣平行链mix合约的手续费,平行链Mix合约会有手续费留下,平行链隐私可以考虑手续费为0
outputPoints = append(outputPoints, mixTy.MulCurvePointG(uint64(mixTy.Privacy2PrivacyTxFee)))
outputPoints = append(outputPoints, mixTy.MulCurvePointG(txFee))
//sum input and output
sumInput := inputPoints[0]
......@@ -107,13 +109,15 @@ func VerifyCommitValues(inputs []*mixTy.TransferInputPublicInput, outputs []*mix
return false
}
func MixTransferInfoVerify(db dbm.KV, transfer *mixTy.MixTransferAction) ([]*mixTy.TransferInputPublicInput, []*mixTy.TransferOutputPublicInput, error) {
func MixTransferInfoVerify(cfg *types.Chain33Config, db dbm.KV, transfer *mixTy.MixTransferAction) ([]*mixTy.TransferInputPublicInput, []*mixTy.TransferOutputPublicInput, error) {
var inputs []*mixTy.TransferInputPublicInput
var outputs []*mixTy.TransferOutputPublicInput
execer, symbol := mixTy.GetAssetExecSymbol(cfg, transfer.AssetExec, transfer.AssetSymbol)
txFee := mixTy.GetTransferTxFee(cfg, execer)
//inputs
for _, i := range transfer.Inputs {
in, err := transferInputVerify(db, i)
in, err := transferInputVerify(db, execer, symbol, i)
if err != nil {
return nil, nil, err
}
......@@ -134,25 +138,63 @@ func MixTransferInfoVerify(db dbm.KV, transfer *mixTy.MixTransferAction) ([]*mix
}
outputs = append(outputs, change)
if !VerifyCommitValues(inputs, outputs) {
if !VerifyCommitValues(inputs, outputs, uint64(txFee)) {
return nil, nil, errors.Wrap(mixTy.ErrSpendInOutValueNotMatch, "verify shieldValue")
}
return inputs, outputs, nil
}
//1. 如果
func (a *action) processTransferFee(exec, symbol string) (*types.Receipt, error) {
cfg := a.api.GetConfig()
accoutDb, err := createAccount(cfg, exec, symbol, a.db)
if err != nil {
return nil, err
}
txFee := mixTy.GetTransferTxFee(cfg, exec)
execAddr := address.ExecAddress(string(a.tx.Execer))
//需要mix执行器下的mix账户扣fee, 和mix 扣coins或token手续费保持一致,不然会看到mix的coins账户下和mix的mix账户下不一致
accFrom := accoutDb.LoadExecAccount(execAddr, execAddr)
if accFrom.GetBalance()-txFee >= 0 {
copyfrom := *accFrom
accFrom.Balance = accFrom.GetBalance() - txFee
receiptBalance := &types.ReceiptAccountTransfer{Prev: &copyfrom, Current: accFrom}
set := accoutDb.GetExecKVSet(execAddr, accFrom)
feelog := &types.ReceiptLog{Ty: types.TyLogFee, Log: types.Encode(receiptBalance)}
return &types.Receipt{
Ty: types.ExecOk,
KV: set,
Logs: append([]*types.ReceiptLog{}, feelog),
}, nil
}
return nil, types.ErrNoBalance
}
/*
1. verify(zk-proof, sum value of spend and new commits)
2. check if exist in authorize pool and nullifier pool
3. add nullifier to pool
*/
func (a *action) Transfer(transfer *mixTy.MixTransferAction) (*types.Receipt, error) {
inputs, outputs, err := MixTransferInfoVerify(a.db, transfer)
inputs, outputs, err := MixTransferInfoVerify(a.api.GetConfig(), a.db, transfer)
if err != nil {
return nil, errors.Wrap(err, "Transfer.MixTransferInfoVerify")
}
receipt := &types.Receipt{Ty: types.ExecOk}
execer, symbol := mixTy.GetAssetExecSymbol(a.api.GetConfig(), transfer.AssetExec, transfer.AssetSymbol)
//扣除交易费
rTxFee, err := a.processTransferFee(execer, symbol)
if err != nil {
return nil, errors.Wrapf(err, "processTransferFee fail")
}
mergeReceipt(receipt, rTxFee)
for _, k := range inputs {
r := makeNullifierSetReceipt(k.NullifierHash, &mixTy.ExistValue{Nullifier: k.NullifierHash, Exist: true})
mergeReceipt(receipt, r)
......@@ -163,7 +205,10 @@ func (a *action) Transfer(transfer *mixTy.MixTransferAction) (*types.Receipt, er
for _, h := range outputs {
leaves = append(leaves, mixTy.Str2Byte(h.NoteHash))
}
rpt, err := pushTree(a.db, leaves)
conf := types.ConfSub(a.api.GetConfig(), mixTy.MixX)
maxTreeLeaves := conf.GInt("maxTreeLeaves")
rpt, err := pushTree(a.db, execer, symbol, leaves, int32(maxTreeLeaves))
if err != nil {
return nil, errors.Wrap(err, "transfer.pushTree")
}
......
......@@ -16,10 +16,10 @@ import (
"github.com/pkg/errors"
)
func spendVerify(db dbm.KV, treeRootHash, nulliferHash, authorizeSpendHash string) error {
func spendVerify(db dbm.KV, exec, symbol string, treeRootHash, nulliferHash, authorizeSpendHash string) error {
//zk-proof校验
//check tree rootHash exist
exist, err := checkTreeRootHashExist(db, mixTy.Str2Byte(treeRootHash))
exist, err := checkTreeRootHashExist(db, exec, symbol, mixTy.Str2Byte(treeRootHash))
if err != nil {
return errors.Wrapf(err, "roothash=%s not found", treeRootHash)
}
......@@ -50,7 +50,7 @@ func spendVerify(db dbm.KV, treeRootHash, nulliferHash, authorizeSpendHash strin
}
func (a *action) withdrawVerify(proof *mixTy.ZkProofInfo) (string, uint64, error) {
func (a *action) withdrawVerify(exec, symbol string, proof *mixTy.ZkProofInfo) (string, uint64, error) {
var input mixTy.WithdrawPublicInput
data, err := hex.DecodeString(proof.PublicInput)
if err != nil {
......@@ -65,7 +65,7 @@ func (a *action) withdrawVerify(proof *mixTy.ZkProofInfo) (string, uint64, error
return "", 0, errors.Wrapf(err, "parseUint=%s", input.Amount)
}
err = spendVerify(a.db, input.TreeRootHash, input.NullifierHash, input.AuthorizeSpendHash)
err = spendVerify(a.db, exec, symbol, input.TreeRootHash, input.NullifierHash, input.AuthorizeSpendHash)
if err != nil {
return "", 0, err
}
......@@ -85,10 +85,12 @@ func (a *action) withdrawVerify(proof *mixTy.ZkProofInfo) (string, uint64, error
3. set nullifier exist
*/
func (a *action) Withdraw(withdraw *mixTy.MixWithdrawAction) (*types.Receipt, error) {
exec, symbol := mixTy.GetAssetExecSymbol(a.api.GetConfig(), withdraw.AssetExec, withdraw.AssetSymbol)
var nulliferSet []string
var sumValue uint64
for _, k := range withdraw.Proofs {
nulfier, v, err := a.withdrawVerify(k)
nulfier, v, err := a.withdrawVerify(exec, symbol, k)
if err != nil {
return nil, err
}
......@@ -102,7 +104,7 @@ func (a *action) Withdraw(withdraw *mixTy.MixWithdrawAction) (*types.Receipt, er
//withdraw value
cfg := a.api.GetConfig()
accoutDb, err := createAccount(cfg, "", "", a.db)
accoutDb, err := createAccount(cfg, exec, symbol, a.db)
if err != nil {
return nil, err
}
......
......@@ -60,7 +60,8 @@ message MixConfigAction {
oneof value {
ZkVerifyKey verifyKey = 3;
string authKey = 4;
PaymentKey paymentKey = 5;
PaymentKey paymentKey = 5;
}
}
......@@ -84,25 +85,34 @@ message ZkProofInfo {
}
message MixDepositAction {
repeated ZkProofInfo proofs = 1;
string assetExec = 1;
string assetSymbol = 2;
repeated ZkProofInfo proofs = 3;
}
message MixTransferAction {
repeated ZkProofInfo inputs = 1;
ZkProofInfo output = 2;
ZkProofInfo change = 3;
string assetExec = 1;
string assetSymbol = 2;
repeated ZkProofInfo inputs = 3;
ZkProofInfo output = 4;
ZkProofInfo change = 5;
}
message MixWithdrawAction {
uint64 amount = 1;
repeated ZkProofInfo proofs = 2;
string assetExec = 1;
string assetSymbol = 2;
uint64 amount = 3;
repeated ZkProofInfo proofs = 4;
}
message MixAuthorizeAction {
ZkProofInfo proof = 1;
string assetExec = 1;
string assetSymbol = 2;
ZkProofInfo proof = 3;
}
......@@ -190,6 +200,8 @@ message CommitTreeStatus{
int32 subLeavesSeq = 2;
//root的归档 从1开始,数据库占位,不然全空会往前搜索
uint64 archiveRootsSeq = 3;
string assetExec = 4;
string assetSymbol = 5;
}
......@@ -239,6 +251,9 @@ message CommitTreeProve {
message TreeInfoReq{
string rootHash = 1;
string leafHash = 2;
string assetExec = 3;
string assetSymbol = 4;
uint64 rootHeight = 5;
}
message TreeListResp{
......@@ -295,6 +310,8 @@ message SecretData{
string authorizeKey = 3;
string amount = 4;
string noteRandom = 5;
string assetExec = 6;
string assetSymbol = 7;
}
......@@ -351,17 +368,6 @@ message WithdrawTxReq{
}
message WithdrawProofRe{
SecretData secret = 1;
string nullifierHash = 2;
string authorizeSpendHash = 3;
string noteHash = 4;
string spendPrivKey = 5;
string spendFlag = 6;
string authorizeFlag = 7;
TreePathProof treeProof = 8;
}
//只授权一个note,超过一个,toAddr不好设置
message AuthTxReq{
......@@ -370,17 +376,6 @@ message AuthTxReq{
string zkPath = 4;
}
message AuthProofRe{
SecretData proof = 1;
string authPubKey = 2;
string authPrivKey = 3;
string authHash = 4;
string authorizeSpendHash = 5;
string noteHash = 6;
string spendFlag = 7;
TreePathProof treeProof = 8;
}
message TransferInputTxReq{
string noteHashs = 1;
......@@ -403,33 +398,7 @@ message ShieldAmount{
string Y = 2;
}
message TransferInputProof{
SecretData proof = 1;
string nullifierHash = 2;
string authorizeSpendHash = 3;
string noteHash = 4;
string spendPrivKey = 5;
string spendFlag = 6;
string authorizeFlag = 7;
TreePathProof treeProof = 8;
ShieldAmount shieldAmount = 9;
string amountRandom = 10;
}
message TransferOutputProof{
SecretData proof = 1;
string noteHash = 2;
DHSecretGroup secrets = 3;
ShieldAmount shieldAmount = 4;
string amountRandom = 5;
}
message TransferProofResp{
TransferInputProof transferInput = 1;
TransferOutputProof targetOutput = 2;
TransferOutputProof changeOutput = 3;
}
message ShieldAmountRst{
repeated string inputRandoms = 1;
......@@ -445,7 +414,7 @@ message CreateRawTxReq{
int32 actionTy = 1;
bytes data = 4;
string assetExec = 2;
string assetToken = 3;
string assetSymbol = 3;
string title = 6; //平行链名字
int32 privacy = 7; //1:打印隐私数据
int32 verify = 8; //0:链上验证,1:本地验证
......@@ -476,6 +445,7 @@ message WalletNoteInfo {
string authorizeHash = 4;
string account = 5; //账户地址
NoteStatus status = 6;
SecretData secret = 7;
}
......@@ -487,14 +457,14 @@ message WalletDbMixInfo {
message WalletMixIndexReq {
string noteHash = 1;
string nullifier = 2;
string noteHash = 1;
string nullifier = 2;
string authorizeSpendHash = 3;
string authorizeHash = 4;
string account = 5;
int32 status = 6;
int32 count = 7;
int32 direction = 8;
string account = 5;
int32 status = 6;
int32 count = 7;
int32 direction = 8;
}
message WalletNoteResp {
......
......@@ -6,14 +6,13 @@ package types
import (
"github.com/33cn/chain33/common/log/log15"
"github.com/33cn/chain33/types"
)
var tlog = log15.New("module", MixX)
const (
MaxTreeLeaves = 1024
TreeLevel = 10
//MaxTreeLeaves = 1024
TreeLevel = 10
)
// 执行器的日志类型
......@@ -45,15 +44,6 @@ const (
MixActionAuth
)
//curve H point
const (
PointHX = "10190477835300927557649934238820360529458681672073866116232821892325659279502"
PointHY = "7969140283216448215269095418467361784159407896899334866715345504515077887397"
)
//mix transfer tx fee
const Privacy2PrivacyTxFee = types.Coin
//circuits default file name
const (
DepositCircuit = "circuit_deposit.r1cs"
......
......@@ -79,9 +79,10 @@ var MixConfigType_name = map[int32]string{
}
var MixConfigType_value = map[string]int32{
"Verify": 0,
"Auth": 1,
"Payment": 2,
"Verify": 0,
"Auth": 1,
"Payment": 2,
"TokenFee": 3,
}
func (x MixConfigType) String() string {
......@@ -359,6 +360,61 @@ func (m *PaymentKey) GetEncryptKey() string {
return ""
}
type TokenTxFee struct {
AssetExec string `protobuf:"bytes,1,opt,name=assetExec,proto3" json:"assetExec,omitempty"`
AssetSymbol string `protobuf:"bytes,2,opt,name=assetSymbol,proto3" json:"assetSymbol,omitempty"`
Amount uint64 `protobuf:"varint,3,opt,name=amount,proto3" json:"amount,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *TokenTxFee) Reset() { *m = TokenTxFee{} }
func (m *TokenTxFee) String() string { return proto.CompactTextString(m) }
func (*TokenTxFee) ProtoMessage() {}
func (*TokenTxFee) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{4}
}
func (m *TokenTxFee) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TokenTxFee.Unmarshal(m, b)
}
func (m *TokenTxFee) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_TokenTxFee.Marshal(b, m, deterministic)
}
func (m *TokenTxFee) XXX_Merge(src proto.Message) {
xxx_messageInfo_TokenTxFee.Merge(m, src)
}
func (m *TokenTxFee) XXX_Size() int {
return xxx_messageInfo_TokenTxFee.Size(m)
}
func (m *TokenTxFee) XXX_DiscardUnknown() {
xxx_messageInfo_TokenTxFee.DiscardUnknown(m)
}
var xxx_messageInfo_TokenTxFee proto.InternalMessageInfo
func (m *TokenTxFee) GetAssetExec() string {
if m != nil {
return m.AssetExec
}
return ""
}
func (m *TokenTxFee) GetAssetSymbol() string {
if m != nil {
return m.AssetSymbol
}
return ""
}
func (m *TokenTxFee) GetAmount() uint64 {
if m != nil {
return m.Amount
}
return 0
}
//config verify parameter for proof
//当前authPk=mimc_hash(prikey),没有X,Y值
type MixConfigAction struct {
......@@ -368,6 +424,7 @@ type MixConfigAction struct {
// *MixConfigAction_VerifyKey
// *MixConfigAction_AuthKey
// *MixConfigAction_PaymentKey
// *MixConfigAction_TokenFee
Value isMixConfigAction_Value `protobuf_oneof:"value"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
......@@ -378,7 +435,7 @@ func (m *MixConfigAction) Reset() { *m = MixConfigAction{} }
func (m *MixConfigAction) String() string { return proto.CompactTextString(m) }
func (*MixConfigAction) ProtoMessage() {}
func (*MixConfigAction) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{4}
return fileDescriptor_5c21d519a9be369a, []int{5}
}
func (m *MixConfigAction) XXX_Unmarshal(b []byte) error {
......@@ -429,12 +486,18 @@ type MixConfigAction_PaymentKey struct {
PaymentKey *PaymentKey `protobuf:"bytes,5,opt,name=paymentKey,proto3,oneof"`
}
type MixConfigAction_TokenFee struct {
TokenFee *TokenTxFee `protobuf:"bytes,6,opt,name=tokenFee,proto3,oneof"`
}
func (*MixConfigAction_VerifyKey) isMixConfigAction_Value() {}
func (*MixConfigAction_AuthKey) isMixConfigAction_Value() {}
func (*MixConfigAction_PaymentKey) isMixConfigAction_Value() {}
func (*MixConfigAction_TokenFee) isMixConfigAction_Value() {}
func (m *MixConfigAction) GetValue() isMixConfigAction_Value {
if m != nil {
return m.Value
......@@ -463,12 +526,20 @@ func (m *MixConfigAction) GetPaymentKey() *PaymentKey {
return nil
}
func (m *MixConfigAction) GetTokenFee() *TokenTxFee {
if x, ok := m.GetValue().(*MixConfigAction_TokenFee); ok {
return x.TokenFee
}
return nil
}
// XXX_OneofWrappers is for the internal use of the proto package.
func (*MixConfigAction) XXX_OneofWrappers() []interface{} {
return []interface{}{
(*MixConfigAction_VerifyKey)(nil),
(*MixConfigAction_AuthKey)(nil),
(*MixConfigAction_PaymentKey)(nil),
(*MixConfigAction_TokenFee)(nil),
}
}
......@@ -485,7 +556,7 @@ func (m *DHSecret) Reset() { *m = DHSecret{} }
func (m *DHSecret) String() string { return proto.CompactTextString(m) }
func (*DHSecret) ProtoMessage() {}
func (*DHSecret) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{5}
return fileDescriptor_5c21d519a9be369a, []int{6}
}
func (m *DHSecret) XXX_Unmarshal(b []byte) error {
......@@ -534,7 +605,7 @@ func (m *DHSecretGroup) Reset() { *m = DHSecretGroup{} }
func (m *DHSecretGroup) String() string { return proto.CompactTextString(m) }
func (*DHSecretGroup) ProtoMessage() {}
func (*DHSecretGroup) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{6}
return fileDescriptor_5c21d519a9be369a, []int{7}
}
func (m *DHSecretGroup) XXX_Unmarshal(b []byte) error {
......@@ -589,7 +660,7 @@ func (m *ZkProofInfo) Reset() { *m = ZkProofInfo{} }
func (m *ZkProofInfo) String() string { return proto.CompactTextString(m) }
func (*ZkProofInfo) ProtoMessage() {}
func (*ZkProofInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{7}
return fileDescriptor_5c21d519a9be369a, []int{8}
}
func (m *ZkProofInfo) XXX_Unmarshal(b []byte) error {
......@@ -632,7 +703,9 @@ func (m *ZkProofInfo) GetSecrets() *DHSecretGroup {
}
type MixDepositAction struct {
Proofs []*ZkProofInfo `protobuf:"bytes,1,rep,name=proofs,proto3" json:"proofs,omitempty"`
AssetExec string `protobuf:"bytes,1,opt,name=assetExec,proto3" json:"assetExec,omitempty"`
AssetSymbol string `protobuf:"bytes,2,opt,name=assetSymbol,proto3" json:"assetSymbol,omitempty"`
Proofs []*ZkProofInfo `protobuf:"bytes,3,rep,name=proofs,proto3" json:"proofs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -642,7 +715,7 @@ func (m *MixDepositAction) Reset() { *m = MixDepositAction{} }
func (m *MixDepositAction) String() string { return proto.CompactTextString(m) }
func (*MixDepositAction) ProtoMessage() {}
func (*MixDepositAction) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{8}
return fileDescriptor_5c21d519a9be369a, []int{9}
}
func (m *MixDepositAction) XXX_Unmarshal(b []byte) error {
......@@ -663,6 +736,20 @@ func (m *MixDepositAction) XXX_DiscardUnknown() {
var xxx_messageInfo_MixDepositAction proto.InternalMessageInfo
func (m *MixDepositAction) GetAssetExec() string {
if m != nil {
return m.AssetExec
}
return ""
}
func (m *MixDepositAction) GetAssetSymbol() string {
if m != nil {
return m.AssetSymbol
}
return ""
}
func (m *MixDepositAction) GetProofs() []*ZkProofInfo {
if m != nil {
return m.Proofs
......@@ -671,9 +758,11 @@ func (m *MixDepositAction) GetProofs() []*ZkProofInfo {
}
type MixTransferAction struct {
Inputs []*ZkProofInfo `protobuf:"bytes,1,rep,name=inputs,proto3" json:"inputs,omitempty"`
Output *ZkProofInfo `protobuf:"bytes,2,opt,name=output,proto3" json:"output,omitempty"`
Change *ZkProofInfo `protobuf:"bytes,3,opt,name=change,proto3" json:"change,omitempty"`
AssetExec string `protobuf:"bytes,1,opt,name=assetExec,proto3" json:"assetExec,omitempty"`
AssetSymbol string `protobuf:"bytes,2,opt,name=assetSymbol,proto3" json:"assetSymbol,omitempty"`
Inputs []*ZkProofInfo `protobuf:"bytes,3,rep,name=inputs,proto3" json:"inputs,omitempty"`
Output *ZkProofInfo `protobuf:"bytes,4,opt,name=output,proto3" json:"output,omitempty"`
Change *ZkProofInfo `protobuf:"bytes,5,opt,name=change,proto3" json:"change,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -683,7 +772,7 @@ func (m *MixTransferAction) Reset() { *m = MixTransferAction{} }
func (m *MixTransferAction) String() string { return proto.CompactTextString(m) }
func (*MixTransferAction) ProtoMessage() {}
func (*MixTransferAction) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{9}
return fileDescriptor_5c21d519a9be369a, []int{10}
}
func (m *MixTransferAction) XXX_Unmarshal(b []byte) error {
......@@ -704,6 +793,20 @@ func (m *MixTransferAction) XXX_DiscardUnknown() {
var xxx_messageInfo_MixTransferAction proto.InternalMessageInfo
func (m *MixTransferAction) GetAssetExec() string {
if m != nil {
return m.AssetExec
}
return ""
}
func (m *MixTransferAction) GetAssetSymbol() string {
if m != nil {
return m.AssetSymbol
}
return ""
}
func (m *MixTransferAction) GetInputs() []*ZkProofInfo {
if m != nil {
return m.Inputs
......@@ -726,8 +829,10 @@ func (m *MixTransferAction) GetChange() *ZkProofInfo {
}
type MixWithdrawAction struct {
Amount uint64 `protobuf:"varint,1,opt,name=amount,proto3" json:"amount,omitempty"`
Proofs []*ZkProofInfo `protobuf:"bytes,2,rep,name=proofs,proto3" json:"proofs,omitempty"`
AssetExec string `protobuf:"bytes,1,opt,name=assetExec,proto3" json:"assetExec,omitempty"`
AssetSymbol string `protobuf:"bytes,2,opt,name=assetSymbol,proto3" json:"assetSymbol,omitempty"`
Amount uint64 `protobuf:"varint,3,opt,name=amount,proto3" json:"amount,omitempty"`
Proofs []*ZkProofInfo `protobuf:"bytes,4,rep,name=proofs,proto3" json:"proofs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -737,7 +842,7 @@ func (m *MixWithdrawAction) Reset() { *m = MixWithdrawAction{} }
func (m *MixWithdrawAction) String() string { return proto.CompactTextString(m) }
func (*MixWithdrawAction) ProtoMessage() {}
func (*MixWithdrawAction) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{10}
return fileDescriptor_5c21d519a9be369a, []int{11}
}
func (m *MixWithdrawAction) XXX_Unmarshal(b []byte) error {
......@@ -758,6 +863,20 @@ func (m *MixWithdrawAction) XXX_DiscardUnknown() {
var xxx_messageInfo_MixWithdrawAction proto.InternalMessageInfo
func (m *MixWithdrawAction) GetAssetExec() string {
if m != nil {
return m.AssetExec
}
return ""
}
func (m *MixWithdrawAction) GetAssetSymbol() string {
if m != nil {
return m.AssetSymbol
}
return ""
}
func (m *MixWithdrawAction) GetAmount() uint64 {
if m != nil {
return m.Amount
......@@ -773,7 +892,9 @@ func (m *MixWithdrawAction) GetProofs() []*ZkProofInfo {
}
type MixAuthorizeAction struct {
Proof *ZkProofInfo `protobuf:"bytes,1,opt,name=proof,proto3" json:"proof,omitempty"`
AssetExec string `protobuf:"bytes,1,opt,name=assetExec,proto3" json:"assetExec,omitempty"`
AssetSymbol string `protobuf:"bytes,2,opt,name=assetSymbol,proto3" json:"assetSymbol,omitempty"`
Proof *ZkProofInfo `protobuf:"bytes,3,opt,name=proof,proto3" json:"proof,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -783,7 +904,7 @@ func (m *MixAuthorizeAction) Reset() { *m = MixAuthorizeAction{} }
func (m *MixAuthorizeAction) String() string { return proto.CompactTextString(m) }
func (*MixAuthorizeAction) ProtoMessage() {}
func (*MixAuthorizeAction) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{11}
return fileDescriptor_5c21d519a9be369a, []int{12}
}
func (m *MixAuthorizeAction) XXX_Unmarshal(b []byte) error {
......@@ -804,6 +925,20 @@ func (m *MixAuthorizeAction) XXX_DiscardUnknown() {
var xxx_messageInfo_MixAuthorizeAction proto.InternalMessageInfo
func (m *MixAuthorizeAction) GetAssetExec() string {
if m != nil {
return m.AssetExec
}
return ""
}
func (m *MixAuthorizeAction) GetAssetSymbol() string {
if m != nil {
return m.AssetSymbol
}
return ""
}
func (m *MixAuthorizeAction) GetProof() *ZkProofInfo {
if m != nil {
return m.Proof
......@@ -829,7 +964,7 @@ func (m *MixAction) Reset() { *m = MixAction{} }
func (m *MixAction) String() string { return proto.CompactTextString(m) }
func (*MixAction) ProtoMessage() {}
func (*MixAction) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{12}
return fileDescriptor_5c21d519a9be369a, []int{13}
}
func (m *MixAction) XXX_Unmarshal(b []byte) error {
......@@ -956,7 +1091,7 @@ func (m *DepositPublicInput) Reset() { *m = DepositPublicInput{} }
func (m *DepositPublicInput) String() string { return proto.CompactTextString(m) }
func (*DepositPublicInput) ProtoMessage() {}
func (*DepositPublicInput) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{13}
return fileDescriptor_5c21d519a9be369a, []int{14}
}
func (m *DepositPublicInput) XXX_Unmarshal(b []byte) error {
......@@ -1005,7 +1140,7 @@ func (m *WithdrawPublicInput) Reset() { *m = WithdrawPublicInput{} }
func (m *WithdrawPublicInput) String() string { return proto.CompactTextString(m) }
func (*WithdrawPublicInput) ProtoMessage() {}
func (*WithdrawPublicInput) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{14}
return fileDescriptor_5c21d519a9be369a, []int{15}
}
func (m *WithdrawPublicInput) XXX_Unmarshal(b []byte) error {
......@@ -1069,7 +1204,7 @@ func (m *TransferInputPublicInput) Reset() { *m = TransferInputPublicInp
func (m *TransferInputPublicInput) String() string { return proto.CompactTextString(m) }
func (*TransferInputPublicInput) ProtoMessage() {}
func (*TransferInputPublicInput) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{15}
return fileDescriptor_5c21d519a9be369a, []int{16}
}
func (m *TransferInputPublicInput) XXX_Unmarshal(b []byte) error {
......@@ -1138,7 +1273,7 @@ func (m *TransferOutputPublicInput) Reset() { *m = TransferOutputPublicI
func (m *TransferOutputPublicInput) String() string { return proto.CompactTextString(m) }
func (*TransferOutputPublicInput) ProtoMessage() {}
func (*TransferOutputPublicInput) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{16}
return fileDescriptor_5c21d519a9be369a, []int{17}
}
func (m *TransferOutputPublicInput) XXX_Unmarshal(b []byte) error {
......@@ -1194,7 +1329,7 @@ func (m *AuthorizePublicInput) Reset() { *m = AuthorizePublicInput{} }
func (m *AuthorizePublicInput) String() string { return proto.CompactTextString(m) }
func (*AuthorizePublicInput) ProtoMessage() {}
func (*AuthorizePublicInput) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{17}
return fileDescriptor_5c21d519a9be369a, []int{18}
}
func (m *AuthorizePublicInput) XXX_Unmarshal(b []byte) error {
......@@ -1255,7 +1390,7 @@ func (m *VerifyProofInfo) Reset() { *m = VerifyProofInfo{} }
func (m *VerifyProofInfo) String() string { return proto.CompactTextString(m) }
func (*VerifyProofInfo) ProtoMessage() {}
func (*VerifyProofInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{18}
return fileDescriptor_5c21d519a9be369a, []int{19}
}
func (m *VerifyProofInfo) XXX_Unmarshal(b []byte) error {
......@@ -1303,7 +1438,7 @@ func (m *ExistValue) Reset() { *m = ExistValue{} }
func (m *ExistValue) String() string { return proto.CompactTextString(m) }
func (*ExistValue) ProtoMessage() {}
func (*ExistValue) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{19}
return fileDescriptor_5c21d519a9be369a, []int{20}
}
func (m *ExistValue) XXX_Unmarshal(b []byte) error {
......@@ -1351,7 +1486,7 @@ func (m *CommitSubTree) Reset() { *m = CommitSubTree{} }
func (m *CommitSubTree) String() string { return proto.CompactTextString(m) }
func (*CommitSubTree) ProtoMessage() {}
func (*CommitSubTree) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{20}
return fileDescriptor_5c21d519a9be369a, []int{21}
}
func (m *CommitSubTree) XXX_Unmarshal(b []byte) error {
......@@ -1398,7 +1533,7 @@ func (m *CommitSubTrees) Reset() { *m = CommitSubTrees{} }
func (m *CommitSubTrees) String() string { return proto.CompactTextString(m) }
func (*CommitSubTrees) ProtoMessage() {}
func (*CommitSubTrees) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{21}
return fileDescriptor_5c21d519a9be369a, []int{22}
}
func (m *CommitSubTrees) XXX_Unmarshal(b []byte) error {
......@@ -1427,13 +1562,15 @@ func (m *CommitSubTrees) GetSubTrees() []*CommitSubTree {
}
//描述当前commitTree的状态
//一颗merkel树1024叶子,考虑数据库读取原因,单个子树存8个叶子,分128次,待第128次时候归档,重新开始新的merkle树,
//一颗merkel树1024叶子,考虑数据库读取原因,每个叶子都会存到相应seq db,待第1024次时候归档,重新开始新的merkle树,
type CommitTreeStatus struct {
SubTrees *CommitSubTrees `protobuf:"bytes,1,opt,name=subTrees,proto3" json:"subTrees,omitempty"`
//1~1024叶子的归档
SubLeavesSeq int32 `protobuf:"varint,2,opt,name=subLeavesSeq,proto3" json:"subLeavesSeq,omitempty"`
//root的归档 从1开始,数据库占位,不然全空会往前搜索
ArchiveRootsSeq uint64 `protobuf:"varint,3,opt,name=archiveRootsSeq,proto3" json:"archiveRootsSeq,omitempty"`
AssetExec string `protobuf:"bytes,4,opt,name=assetExec,proto3" json:"assetExec,omitempty"`
AssetSymbol string `protobuf:"bytes,5,opt,name=assetSymbol,proto3" json:"assetSymbol,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -1443,7 +1580,7 @@ func (m *CommitTreeStatus) Reset() { *m = CommitTreeStatus{} }
func (m *CommitTreeStatus) String() string { return proto.CompactTextString(m) }
func (*CommitTreeStatus) ProtoMessage() {}
func (*CommitTreeStatus) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{22}
return fileDescriptor_5c21d519a9be369a, []int{23}
}
func (m *CommitTreeStatus) XXX_Unmarshal(b []byte) error {
......@@ -1485,6 +1622,20 @@ func (m *CommitTreeStatus) GetArchiveRootsSeq() uint64 {
return 0
}
func (m *CommitTreeStatus) GetAssetExec() string {
if m != nil {
return m.AssetExec
}
return ""
}
func (m *CommitTreeStatus) GetAssetSymbol() string {
if m != nil {
return m.AssetSymbol
}
return ""
}
type ReceiptCommitTreeStatus struct {
Prev *CommitTreeStatus `protobuf:"bytes,1,opt,name=prev,proto3" json:"prev,omitempty"`
Current *CommitTreeStatus `protobuf:"bytes,2,opt,name=current,proto3" json:"current,omitempty"`
......@@ -1497,7 +1648,7 @@ func (m *ReceiptCommitTreeStatus) Reset() { *m = ReceiptCommitTreeStatus
func (m *ReceiptCommitTreeStatus) String() string { return proto.CompactTextString(m) }
func (*ReceiptCommitTreeStatus) ProtoMessage() {}
func (*ReceiptCommitTreeStatus) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{23}
return fileDescriptor_5c21d519a9be369a, []int{24}
}
func (m *ReceiptCommitTreeStatus) XXX_Unmarshal(b []byte) error {
......@@ -1544,7 +1695,7 @@ func (m *ReceiptCommitSubLeaves) Reset() { *m = ReceiptCommitSubLeaves{}
func (m *ReceiptCommitSubLeaves) String() string { return proto.CompactTextString(m) }
func (*ReceiptCommitSubLeaves) ProtoMessage() {}
func (*ReceiptCommitSubLeaves) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{24}
return fileDescriptor_5c21d519a9be369a, []int{25}
}
func (m *ReceiptCommitSubLeaves) XXX_Unmarshal(b []byte) error {
......@@ -1591,7 +1742,7 @@ func (m *ReceiptCommitSubRoots) Reset() { *m = ReceiptCommitSubRoots{} }
func (m *ReceiptCommitSubRoots) String() string { return proto.CompactTextString(m) }
func (*ReceiptCommitSubRoots) ProtoMessage() {}
func (*ReceiptCommitSubRoots) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{25}
return fileDescriptor_5c21d519a9be369a, []int{26}
}
func (m *ReceiptCommitSubRoots) XXX_Unmarshal(b []byte) error {
......@@ -1639,7 +1790,7 @@ func (m *ReceiptArchiveLeaves) Reset() { *m = ReceiptArchiveLeaves{} }
func (m *ReceiptArchiveLeaves) String() string { return proto.CompactTextString(m) }
func (*ReceiptArchiveLeaves) ProtoMessage() {}
func (*ReceiptArchiveLeaves) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{26}
return fileDescriptor_5c21d519a9be369a, []int{27}
}
func (m *ReceiptArchiveLeaves) XXX_Unmarshal(b []byte) error {
......@@ -1693,7 +1844,7 @@ func (m *ReceiptArchiveTreeRoot) Reset() { *m = ReceiptArchiveTreeRoot{}
func (m *ReceiptArchiveTreeRoot) String() string { return proto.CompactTextString(m) }
func (*ReceiptArchiveTreeRoot) ProtoMessage() {}
func (*ReceiptArchiveTreeRoot) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{27}
return fileDescriptor_5c21d519a9be369a, []int{28}
}
func (m *ReceiptArchiveTreeRoot) XXX_Unmarshal(b []byte) error {
......@@ -1739,7 +1890,7 @@ func (m *CommitTreeLeaves) Reset() { *m = CommitTreeLeaves{} }
func (m *CommitTreeLeaves) String() string { return proto.CompactTextString(m) }
func (*CommitTreeLeaves) ProtoMessage() {}
func (*CommitTreeLeaves) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{28}
return fileDescriptor_5c21d519a9be369a, []int{29}
}
func (m *CommitTreeLeaves) XXX_Unmarshal(b []byte) error {
......@@ -1778,7 +1929,7 @@ func (m *CommitTreeRoots) Reset() { *m = CommitTreeRoots{} }
func (m *CommitTreeRoots) String() string { return proto.CompactTextString(m) }
func (*CommitTreeRoots) ProtoMessage() {}
func (*CommitTreeRoots) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{29}
return fileDescriptor_5c21d519a9be369a, []int{30}
}
func (m *CommitTreeRoots) XXX_Unmarshal(b []byte) error {
......@@ -1821,7 +1972,7 @@ func (m *CommitTreeProve) Reset() { *m = CommitTreeProve{} }
func (m *CommitTreeProve) String() string { return proto.CompactTextString(m) }
func (*CommitTreeProve) ProtoMessage() {}
func (*CommitTreeProve) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{30}
return fileDescriptor_5c21d519a9be369a, []int{31}
}
func (m *CommitTreeProve) XXX_Unmarshal(b []byte) error {
......@@ -1880,6 +2031,9 @@ func (m *CommitTreeProve) GetHelpers() []uint32 {
type TreeInfoReq struct {
RootHash string `protobuf:"bytes,1,opt,name=rootHash,proto3" json:"rootHash,omitempty"`
LeafHash string `protobuf:"bytes,2,opt,name=leafHash,proto3" json:"leafHash,omitempty"`
AssetExec string `protobuf:"bytes,3,opt,name=assetExec,proto3" json:"assetExec,omitempty"`
AssetSymbol string `protobuf:"bytes,4,opt,name=assetSymbol,proto3" json:"assetSymbol,omitempty"`
RootHeight uint64 `protobuf:"varint,5,opt,name=rootHeight,proto3" json:"rootHeight,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -1889,7 +2043,7 @@ func (m *TreeInfoReq) Reset() { *m = TreeInfoReq{} }
func (m *TreeInfoReq) String() string { return proto.CompactTextString(m) }
func (*TreeInfoReq) ProtoMessage() {}
func (*TreeInfoReq) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{31}
return fileDescriptor_5c21d519a9be369a, []int{32}
}
func (m *TreeInfoReq) XXX_Unmarshal(b []byte) error {
......@@ -1924,6 +2078,27 @@ func (m *TreeInfoReq) GetLeafHash() string {
return ""
}
func (m *TreeInfoReq) GetAssetExec() string {
if m != nil {
return m.AssetExec
}
return ""
}
func (m *TreeInfoReq) GetAssetSymbol() string {
if m != nil {
return m.AssetSymbol
}
return ""
}
func (m *TreeInfoReq) GetRootHeight() uint64 {
if m != nil {
return m.RootHeight
}
return 0
}
type TreeListResp struct {
Leaves []string `protobuf:"bytes,1,rep,name=leaves,proto3" json:"leaves,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
......@@ -1935,7 +2110,7 @@ func (m *TreeListResp) Reset() { *m = TreeListResp{} }
func (m *TreeListResp) String() string { return proto.CompactTextString(m) }
func (*TreeListResp) ProtoMessage() {}
func (*TreeListResp) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{32}
return fileDescriptor_5c21d519a9be369a, []int{33}
}
func (m *TreeListResp) XXX_Unmarshal(b []byte) error {
......@@ -1974,7 +2149,7 @@ func (m *RootListResp) Reset() { *m = RootListResp{} }
func (m *RootListResp) String() string { return proto.CompactTextString(m) }
func (*RootListResp) ProtoMessage() {}
func (*RootListResp) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{33}
return fileDescriptor_5c21d519a9be369a, []int{34}
}
func (m *RootListResp) XXX_Unmarshal(b []byte) error {
......@@ -2014,7 +2189,7 @@ func (m *SubTreeResp) Reset() { *m = SubTreeResp{} }
func (m *SubTreeResp) String() string { return proto.CompactTextString(m) }
func (*SubTreeResp) ProtoMessage() {}
func (*SubTreeResp) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{34}
return fileDescriptor_5c21d519a9be369a, []int{35}
}
func (m *SubTreeResp) XXX_Unmarshal(b []byte) error {
......@@ -2062,7 +2237,7 @@ func (m *TreeStatusResp) Reset() { *m = TreeStatusResp{} }
func (m *TreeStatusResp) String() string { return proto.CompactTextString(m) }
func (*TreeStatusResp) ProtoMessage() {}
func (*TreeStatusResp) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{35}
return fileDescriptor_5c21d519a9be369a, []int{36}
}
func (m *TreeStatusResp) XXX_Unmarshal(b []byte) error {
......@@ -2118,7 +2293,7 @@ func (m *PaymentKeyPair) Reset() { *m = PaymentKeyPair{} }
func (m *PaymentKeyPair) String() string { return proto.CompactTextString(m) }
func (*PaymentKeyPair) ProtoMessage() {}
func (*PaymentKeyPair) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{36}
return fileDescriptor_5c21d519a9be369a, []int{37}
}
func (m *PaymentKeyPair) XXX_Unmarshal(b []byte) error {
......@@ -2168,7 +2343,7 @@ func (m *EncryptKeyPair) Reset() { *m = EncryptKeyPair{} }
func (m *EncryptKeyPair) String() string { return proto.CompactTextString(m) }
func (*EncryptKeyPair) ProtoMessage() {}
func (*EncryptKeyPair) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{37}
return fileDescriptor_5c21d519a9be369a, []int{38}
}
func (m *EncryptKeyPair) XXX_Unmarshal(b []byte) error {
......@@ -2217,7 +2392,7 @@ func (m *AccountPrivacyKey) Reset() { *m = AccountPrivacyKey{} }
func (m *AccountPrivacyKey) String() string { return proto.CompactTextString(m) }
func (*AccountPrivacyKey) ProtoMessage() {}
func (*AccountPrivacyKey) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{38}
return fileDescriptor_5c21d519a9be369a, []int{39}
}
func (m *AccountPrivacyKey) XXX_Unmarshal(b []byte) error {
......@@ -2264,7 +2439,7 @@ func (m *WalletAddrPrivacy) Reset() { *m = WalletAddrPrivacy{} }
func (m *WalletAddrPrivacy) String() string { return proto.CompactTextString(m) }
func (*WalletAddrPrivacy) ProtoMessage() {}
func (*WalletAddrPrivacy) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{39}
return fileDescriptor_5c21d519a9be369a, []int{40}
}
func (m *WalletAddrPrivacy) XXX_Unmarshal(b []byte) error {
......@@ -2305,6 +2480,8 @@ type SecretData struct {
AuthorizeKey string `protobuf:"bytes,3,opt,name=authorizeKey,proto3" json:"authorizeKey,omitempty"`
Amount string `protobuf:"bytes,4,opt,name=amount,proto3" json:"amount,omitempty"`
NoteRandom string `protobuf:"bytes,5,opt,name=noteRandom,proto3" json:"noteRandom,omitempty"`
AssetExec string `protobuf:"bytes,6,opt,name=assetExec,proto3" json:"assetExec,omitempty"`
AssetSymbol string `protobuf:"bytes,7,opt,name=assetSymbol,proto3" json:"assetSymbol,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
......@@ -2314,7 +2491,7 @@ func (m *SecretData) Reset() { *m = SecretData{} }
func (m *SecretData) String() string { return proto.CompactTextString(m) }
func (*SecretData) ProtoMessage() {}
func (*SecretData) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{40}
return fileDescriptor_5c21d519a9be369a, []int{41}
}
func (m *SecretData) XXX_Unmarshal(b []byte) error {
......@@ -2370,6 +2547,20 @@ func (m *SecretData) GetNoteRandom() string {
return ""
}
func (m *SecretData) GetAssetExec() string {
if m != nil {
return m.AssetExec
}
return ""
}
func (m *SecretData) GetAssetSymbol() string {
if m != nil {
return m.AssetSymbol
}
return ""
}
type EncryptSecretData struct {
Secret string `protobuf:"bytes,1,opt,name=secret,proto3" json:"secret,omitempty"`
PeerKey string `protobuf:"bytes,2,opt,name=peerKey,proto3" json:"peerKey,omitempty"`
......@@ -2382,7 +2573,7 @@ func (m *EncryptSecretData) Reset() { *m = EncryptSecretData{} }
func (m *EncryptSecretData) String() string { return proto.CompactTextString(m) }
func (*EncryptSecretData) ProtoMessage() {}
func (*EncryptSecretData) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{41}
return fileDescriptor_5c21d519a9be369a, []int{42}
}
func (m *EncryptSecretData) XXX_Unmarshal(b []byte) error {
......@@ -2430,7 +2621,7 @@ func (m *DecryptSecretData) Reset() { *m = DecryptSecretData{} }
func (m *DecryptSecretData) String() string { return proto.CompactTextString(m) }
func (*DecryptSecretData) ProtoMessage() {}
func (*DecryptSecretData) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{42}
return fileDescriptor_5c21d519a9be369a, []int{43}
}
func (m *DecryptSecretData) XXX_Unmarshal(b []byte) error {
......@@ -2487,7 +2678,7 @@ func (m *DepositInfo) Reset() { *m = DepositInfo{} }
func (m *DepositInfo) String() string { return proto.CompactTextString(m) }
func (*DepositInfo) ProtoMessage() {}
func (*DepositInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{43}
return fileDescriptor_5c21d519a9be369a, []int{44}
}
func (m *DepositInfo) XXX_Unmarshal(b []byte) error {
......@@ -2549,7 +2740,7 @@ func (m *DepositTxReq) Reset() { *m = DepositTxReq{} }
func (m *DepositTxReq) String() string { return proto.CompactTextString(m) }
func (*DepositTxReq) ProtoMessage() {}
func (*DepositTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{44}
return fileDescriptor_5c21d519a9be369a, []int{45}
}
func (m *DepositTxReq) XXX_Unmarshal(b []byte) error {
......@@ -2597,7 +2788,7 @@ func (m *DepositProofResp) Reset() { *m = DepositProofResp{} }
func (m *DepositProofResp) String() string { return proto.CompactTextString(m) }
func (*DepositProofResp) ProtoMessage() {}
func (*DepositProofResp) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{45}
return fileDescriptor_5c21d519a9be369a, []int{46}
}
func (m *DepositProofResp) XXX_Unmarshal(b []byte) error {
......@@ -2652,7 +2843,7 @@ func (m *TreePathProof) Reset() { *m = TreePathProof{} }
func (m *TreePathProof) String() string { return proto.CompactTextString(m) }
func (*TreePathProof) ProtoMessage() {}
func (*TreePathProof) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{46}
return fileDescriptor_5c21d519a9be369a, []int{47}
}
func (m *TreePathProof) XXX_Unmarshal(b []byte) error {
......@@ -2708,7 +2899,7 @@ func (m *WithdrawTxReq) Reset() { *m = WithdrawTxReq{} }
func (m *WithdrawTxReq) String() string { return proto.CompactTextString(m) }
func (*WithdrawTxReq) ProtoMessage() {}
func (*WithdrawTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{47}
return fileDescriptor_5c21d519a9be369a, []int{48}
}
func (m *WithdrawTxReq) XXX_Unmarshal(b []byte) error {
......@@ -2750,101 +2941,6 @@ func (m *WithdrawTxReq) GetZkPath() string {
return ""
}
type WithdrawProofRe struct {
Secret *SecretData `protobuf:"bytes,1,opt,name=secret,proto3" json:"secret,omitempty"`
NullifierHash string `protobuf:"bytes,2,opt,name=nullifierHash,proto3" json:"nullifierHash,omitempty"`
AuthorizeSpendHash string `protobuf:"bytes,3,opt,name=authorizeSpendHash,proto3" json:"authorizeSpendHash,omitempty"`
NoteHash string `protobuf:"bytes,4,opt,name=noteHash,proto3" json:"noteHash,omitempty"`
SpendPrivKey string `protobuf:"bytes,5,opt,name=spendPrivKey,proto3" json:"spendPrivKey,omitempty"`
SpendFlag string `protobuf:"bytes,6,opt,name=spendFlag,proto3" json:"spendFlag,omitempty"`
AuthorizeFlag string `protobuf:"bytes,7,opt,name=authorizeFlag,proto3" json:"authorizeFlag,omitempty"`
TreeProof *TreePathProof `protobuf:"bytes,8,opt,name=treeProof,proto3" json:"treeProof,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *WithdrawProofRe) Reset() { *m = WithdrawProofRe{} }
func (m *WithdrawProofRe) String() string { return proto.CompactTextString(m) }
func (*WithdrawProofRe) ProtoMessage() {}
func (*WithdrawProofRe) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{48}
}
func (m *WithdrawProofRe) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_WithdrawProofRe.Unmarshal(m, b)
}
func (m *WithdrawProofRe) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_WithdrawProofRe.Marshal(b, m, deterministic)
}
func (m *WithdrawProofRe) XXX_Merge(src proto.Message) {
xxx_messageInfo_WithdrawProofRe.Merge(m, src)
}
func (m *WithdrawProofRe) XXX_Size() int {
return xxx_messageInfo_WithdrawProofRe.Size(m)
}
func (m *WithdrawProofRe) XXX_DiscardUnknown() {
xxx_messageInfo_WithdrawProofRe.DiscardUnknown(m)
}
var xxx_messageInfo_WithdrawProofRe proto.InternalMessageInfo
func (m *WithdrawProofRe) GetSecret() *SecretData {
if m != nil {
return m.Secret
}
return nil
}
func (m *WithdrawProofRe) GetNullifierHash() string {
if m != nil {
return m.NullifierHash
}
return ""
}
func (m *WithdrawProofRe) GetAuthorizeSpendHash() string {
if m != nil {
return m.AuthorizeSpendHash
}
return ""
}
func (m *WithdrawProofRe) GetNoteHash() string {
if m != nil {
return m.NoteHash
}
return ""
}
func (m *WithdrawProofRe) GetSpendPrivKey() string {
if m != nil {
return m.SpendPrivKey
}
return ""
}
func (m *WithdrawProofRe) GetSpendFlag() string {
if m != nil {
return m.SpendFlag
}
return ""
}
func (m *WithdrawProofRe) GetAuthorizeFlag() string {
if m != nil {
return m.AuthorizeFlag
}
return ""
}
func (m *WithdrawProofRe) GetTreeProof() *TreePathProof {
if m != nil {
return m.TreeProof
}
return nil
}
//只授权一个note,超过一个,toAddr不好设置
type AuthTxReq struct {
NoteHash string `protobuf:"bytes,1,opt,name=noteHash,proto3" json:"noteHash,omitempty"`
......@@ -2901,101 +2997,6 @@ func (m *AuthTxReq) GetZkPath() string {
return ""
}
type AuthProofRe struct {
Proof *SecretData `protobuf:"bytes,1,opt,name=proof,proto3" json:"proof,omitempty"`
AuthPubKey string `protobuf:"bytes,2,opt,name=authPubKey,proto3" json:"authPubKey,omitempty"`
AuthPrivKey string `protobuf:"bytes,3,opt,name=authPrivKey,proto3" json:"authPrivKey,omitempty"`
AuthHash string `protobuf:"bytes,4,opt,name=authHash,proto3" json:"authHash,omitempty"`
AuthorizeSpendHash string `protobuf:"bytes,5,opt,name=authorizeSpendHash,proto3" json:"authorizeSpendHash,omitempty"`
NoteHash string `protobuf:"bytes,6,opt,name=noteHash,proto3" json:"noteHash,omitempty"`
SpendFlag string `protobuf:"bytes,7,opt,name=spendFlag,proto3" json:"spendFlag,omitempty"`
TreeProof *TreePathProof `protobuf:"bytes,8,opt,name=treeProof,proto3" json:"treeProof,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *AuthProofRe) Reset() { *m = AuthProofRe{} }
func (m *AuthProofRe) String() string { return proto.CompactTextString(m) }
func (*AuthProofRe) ProtoMessage() {}
func (*AuthProofRe) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{50}
}
func (m *AuthProofRe) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AuthProofRe.Unmarshal(m, b)
}
func (m *AuthProofRe) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_AuthProofRe.Marshal(b, m, deterministic)
}
func (m *AuthProofRe) XXX_Merge(src proto.Message) {
xxx_messageInfo_AuthProofRe.Merge(m, src)
}
func (m *AuthProofRe) XXX_Size() int {
return xxx_messageInfo_AuthProofRe.Size(m)
}
func (m *AuthProofRe) XXX_DiscardUnknown() {
xxx_messageInfo_AuthProofRe.DiscardUnknown(m)
}
var xxx_messageInfo_AuthProofRe proto.InternalMessageInfo
func (m *AuthProofRe) GetProof() *SecretData {
if m != nil {
return m.Proof
}
return nil
}
func (m *AuthProofRe) GetAuthPubKey() string {
if m != nil {
return m.AuthPubKey
}
return ""
}
func (m *AuthProofRe) GetAuthPrivKey() string {
if m != nil {
return m.AuthPrivKey
}
return ""
}
func (m *AuthProofRe) GetAuthHash() string {
if m != nil {
return m.AuthHash
}
return ""
}
func (m *AuthProofRe) GetAuthorizeSpendHash() string {
if m != nil {
return m.AuthorizeSpendHash
}
return ""
}
func (m *AuthProofRe) GetNoteHash() string {
if m != nil {
return m.NoteHash
}
return ""
}
func (m *AuthProofRe) GetSpendFlag() string {
if m != nil {
return m.SpendFlag
}
return ""
}
func (m *AuthProofRe) GetTreeProof() *TreePathProof {
if m != nil {
return m.TreeProof
}
return nil
}
type TransferInputTxReq struct {
NoteHashs string `protobuf:"bytes,1,opt,name=noteHashs,proto3" json:"noteHashs,omitempty"`
ZkPath string `protobuf:"bytes,2,opt,name=zkPath,proto3" json:"zkPath,omitempty"`
......@@ -3008,7 +3009,7 @@ func (m *TransferInputTxReq) Reset() { *m = TransferInputTxReq{} }
func (m *TransferInputTxReq) String() string { return proto.CompactTextString(m) }
func (*TransferInputTxReq) ProtoMessage() {}
func (*TransferInputTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{51}
return fileDescriptor_5c21d519a9be369a, []int{50}
}
func (m *TransferInputTxReq) XXX_Unmarshal(b []byte) error {
......@@ -3055,7 +3056,7 @@ func (m *TransferOutputTxReq) Reset() { *m = TransferOutputTxReq{} }
func (m *TransferOutputTxReq) String() string { return proto.CompactTextString(m) }
func (*TransferOutputTxReq) ProtoMessage() {}
func (*TransferOutputTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{52}
return fileDescriptor_5c21d519a9be369a, []int{51}
}
func (m *TransferOutputTxReq) XXX_Unmarshal(b []byte) error {
......@@ -3102,7 +3103,7 @@ func (m *TransferTxReq) Reset() { *m = TransferTxReq{} }
func (m *TransferTxReq) String() string { return proto.CompactTextString(m) }
func (*TransferTxReq) ProtoMessage() {}
func (*TransferTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{53}
return fileDescriptor_5c21d519a9be369a, []int{52}
}
func (m *TransferTxReq) XXX_Unmarshal(b []byte) error {
......@@ -3150,7 +3151,7 @@ func (m *ShieldAmount) Reset() { *m = ShieldAmount{} }
func (m *ShieldAmount) String() string { return proto.CompactTextString(m) }
func (*ShieldAmount) ProtoMessage() {}
func (*ShieldAmount) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{54}
return fileDescriptor_5c21d519a9be369a, []int{53}
}
func (m *ShieldAmount) XXX_Unmarshal(b []byte) error {
......@@ -3185,243 +3186,6 @@ func (m *ShieldAmount) GetY() string {
return ""
}
type TransferInputProof struct {
Proof *SecretData `protobuf:"bytes,1,opt,name=proof,proto3" json:"proof,omitempty"`
NullifierHash string `protobuf:"bytes,2,opt,name=nullifierHash,proto3" json:"nullifierHash,omitempty"`
AuthorizeSpendHash string `protobuf:"bytes,3,opt,name=authorizeSpendHash,proto3" json:"authorizeSpendHash,omitempty"`
NoteHash string `protobuf:"bytes,4,opt,name=noteHash,proto3" json:"noteHash,omitempty"`
SpendPrivKey string `protobuf:"bytes,5,opt,name=spendPrivKey,proto3" json:"spendPrivKey,omitempty"`
SpendFlag string `protobuf:"bytes,6,opt,name=spendFlag,proto3" json:"spendFlag,omitempty"`
AuthorizeFlag string `protobuf:"bytes,7,opt,name=authorizeFlag,proto3" json:"authorizeFlag,omitempty"`
TreeProof *TreePathProof `protobuf:"bytes,8,opt,name=treeProof,proto3" json:"treeProof,omitempty"`
ShieldAmount *ShieldAmount `protobuf:"bytes,9,opt,name=shieldAmount,proto3" json:"shieldAmount,omitempty"`
AmountRandom string `protobuf:"bytes,10,opt,name=amountRandom,proto3" json:"amountRandom,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *TransferInputProof) Reset() { *m = TransferInputProof{} }
func (m *TransferInputProof) String() string { return proto.CompactTextString(m) }
func (*TransferInputProof) ProtoMessage() {}
func (*TransferInputProof) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{55}
}
func (m *TransferInputProof) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TransferInputProof.Unmarshal(m, b)
}
func (m *TransferInputProof) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_TransferInputProof.Marshal(b, m, deterministic)
}
func (m *TransferInputProof) XXX_Merge(src proto.Message) {
xxx_messageInfo_TransferInputProof.Merge(m, src)
}
func (m *TransferInputProof) XXX_Size() int {
return xxx_messageInfo_TransferInputProof.Size(m)
}
func (m *TransferInputProof) XXX_DiscardUnknown() {
xxx_messageInfo_TransferInputProof.DiscardUnknown(m)
}
var xxx_messageInfo_TransferInputProof proto.InternalMessageInfo
func (m *TransferInputProof) GetProof() *SecretData {
if m != nil {
return m.Proof
}
return nil
}
func (m *TransferInputProof) GetNullifierHash() string {
if m != nil {
return m.NullifierHash
}
return ""
}
func (m *TransferInputProof) GetAuthorizeSpendHash() string {
if m != nil {
return m.AuthorizeSpendHash
}
return ""
}
func (m *TransferInputProof) GetNoteHash() string {
if m != nil {
return m.NoteHash
}
return ""
}
func (m *TransferInputProof) GetSpendPrivKey() string {
if m != nil {
return m.SpendPrivKey
}
return ""
}
func (m *TransferInputProof) GetSpendFlag() string {
if m != nil {
return m.SpendFlag
}
return ""
}
func (m *TransferInputProof) GetAuthorizeFlag() string {
if m != nil {
return m.AuthorizeFlag
}
return ""
}
func (m *TransferInputProof) GetTreeProof() *TreePathProof {
if m != nil {
return m.TreeProof
}
return nil
}
func (m *TransferInputProof) GetShieldAmount() *ShieldAmount {
if m != nil {
return m.ShieldAmount
}
return nil
}
func (m *TransferInputProof) GetAmountRandom() string {
if m != nil {
return m.AmountRandom
}
return ""
}
type TransferOutputProof struct {
Proof *SecretData `protobuf:"bytes,1,opt,name=proof,proto3" json:"proof,omitempty"`
NoteHash string `protobuf:"bytes,2,opt,name=noteHash,proto3" json:"noteHash,omitempty"`
Secrets *DHSecretGroup `protobuf:"bytes,3,opt,name=secrets,proto3" json:"secrets,omitempty"`
ShieldAmount *ShieldAmount `protobuf:"bytes,4,opt,name=shieldAmount,proto3" json:"shieldAmount,omitempty"`
AmountRandom string `protobuf:"bytes,5,opt,name=amountRandom,proto3" json:"amountRandom,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *TransferOutputProof) Reset() { *m = TransferOutputProof{} }
func (m *TransferOutputProof) String() string { return proto.CompactTextString(m) }
func (*TransferOutputProof) ProtoMessage() {}
func (*TransferOutputProof) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{56}
}
func (m *TransferOutputProof) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TransferOutputProof.Unmarshal(m, b)
}
func (m *TransferOutputProof) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_TransferOutputProof.Marshal(b, m, deterministic)
}
func (m *TransferOutputProof) XXX_Merge(src proto.Message) {
xxx_messageInfo_TransferOutputProof.Merge(m, src)
}
func (m *TransferOutputProof) XXX_Size() int {
return xxx_messageInfo_TransferOutputProof.Size(m)
}
func (m *TransferOutputProof) XXX_DiscardUnknown() {
xxx_messageInfo_TransferOutputProof.DiscardUnknown(m)
}
var xxx_messageInfo_TransferOutputProof proto.InternalMessageInfo
func (m *TransferOutputProof) GetProof() *SecretData {
if m != nil {
return m.Proof
}
return nil
}
func (m *TransferOutputProof) GetNoteHash() string {
if m != nil {
return m.NoteHash
}
return ""
}
func (m *TransferOutputProof) GetSecrets() *DHSecretGroup {
if m != nil {
return m.Secrets
}
return nil
}
func (m *TransferOutputProof) GetShieldAmount() *ShieldAmount {
if m != nil {
return m.ShieldAmount
}
return nil
}
func (m *TransferOutputProof) GetAmountRandom() string {
if m != nil {
return m.AmountRandom
}
return ""
}
type TransferProofResp struct {
TransferInput *TransferInputProof `protobuf:"bytes,1,opt,name=transferInput,proto3" json:"transferInput,omitempty"`
TargetOutput *TransferOutputProof `protobuf:"bytes,2,opt,name=targetOutput,proto3" json:"targetOutput,omitempty"`
ChangeOutput *TransferOutputProof `protobuf:"bytes,3,opt,name=changeOutput,proto3" json:"changeOutput,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *TransferProofResp) Reset() { *m = TransferProofResp{} }
func (m *TransferProofResp) String() string { return proto.CompactTextString(m) }
func (*TransferProofResp) ProtoMessage() {}
func (*TransferProofResp) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{57}
}
func (m *TransferProofResp) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TransferProofResp.Unmarshal(m, b)
}
func (m *TransferProofResp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_TransferProofResp.Marshal(b, m, deterministic)
}
func (m *TransferProofResp) XXX_Merge(src proto.Message) {
xxx_messageInfo_TransferProofResp.Merge(m, src)
}
func (m *TransferProofResp) XXX_Size() int {
return xxx_messageInfo_TransferProofResp.Size(m)
}
func (m *TransferProofResp) XXX_DiscardUnknown() {
xxx_messageInfo_TransferProofResp.DiscardUnknown(m)
}
var xxx_messageInfo_TransferProofResp proto.InternalMessageInfo
func (m *TransferProofResp) GetTransferInput() *TransferInputProof {
if m != nil {
return m.TransferInput
}
return nil
}
func (m *TransferProofResp) GetTargetOutput() *TransferOutputProof {
if m != nil {
return m.TargetOutput
}
return nil
}
func (m *TransferProofResp) GetChangeOutput() *TransferOutputProof {
if m != nil {
return m.ChangeOutput
}
return nil
}
type ShieldAmountRst struct {
InputRandoms []string `protobuf:"bytes,1,rep,name=inputRandoms,proto3" json:"inputRandoms,omitempty"`
OutputRandom string `protobuf:"bytes,2,opt,name=outputRandom,proto3" json:"outputRandom,omitempty"`
......@@ -3438,7 +3202,7 @@ func (m *ShieldAmountRst) Reset() { *m = ShieldAmountRst{} }
func (m *ShieldAmountRst) String() string { return proto.CompactTextString(m) }
func (*ShieldAmountRst) ProtoMessage() {}
func (*ShieldAmountRst) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{58}
return fileDescriptor_5c21d519a9be369a, []int{54}
}
func (m *ShieldAmountRst) XXX_Unmarshal(b []byte) error {
......@@ -3505,7 +3269,7 @@ type CreateRawTxReq struct {
ActionTy int32 `protobuf:"varint,1,opt,name=actionTy,proto3" json:"actionTy,omitempty"`
Data []byte `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"`
AssetExec string `protobuf:"bytes,2,opt,name=assetExec,proto3" json:"assetExec,omitempty"`
AssetToken string `protobuf:"bytes,3,opt,name=assetToken,proto3" json:"assetToken,omitempty"`
AssetSymbol string `protobuf:"bytes,3,opt,name=assetSymbol,proto3" json:"assetSymbol,omitempty"`
Title string `protobuf:"bytes,6,opt,name=title,proto3" json:"title,omitempty"`
Privacy int32 `protobuf:"varint,7,opt,name=privacy,proto3" json:"privacy,omitempty"`
Verify int32 `protobuf:"varint,8,opt,name=verify,proto3" json:"verify,omitempty"`
......@@ -3518,7 +3282,7 @@ func (m *CreateRawTxReq) Reset() { *m = CreateRawTxReq{} }
func (m *CreateRawTxReq) String() string { return proto.CompactTextString(m) }
func (*CreateRawTxReq) ProtoMessage() {}
func (*CreateRawTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{59}
return fileDescriptor_5c21d519a9be369a, []int{55}
}
func (m *CreateRawTxReq) XXX_Unmarshal(b []byte) error {
......@@ -3560,9 +3324,9 @@ func (m *CreateRawTxReq) GetAssetExec() string {
return ""
}
func (m *CreateRawTxReq) GetAssetToken() string {
func (m *CreateRawTxReq) GetAssetSymbol() string {
if m != nil {
return m.AssetToken
return m.AssetSymbol
}
return ""
}
......@@ -3601,7 +3365,7 @@ func (m *PaymentKeysReq) Reset() { *m = PaymentKeysReq{} }
func (m *PaymentKeysReq) String() string { return proto.CompactTextString(m) }
func (*PaymentKeysReq) ProtoMessage() {}
func (*PaymentKeysReq) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{60}
return fileDescriptor_5c21d519a9be369a, []int{56}
}
func (m *PaymentKeysReq) XXX_Unmarshal(b []byte) error {
......@@ -3660,7 +3424,7 @@ func (m *WalletNoteInfo) Reset() { *m = WalletNoteInfo{} }
func (m *WalletNoteInfo) String() string { return proto.CompactTextString(m) }
func (*WalletNoteInfo) ProtoMessage() {}
func (*WalletNoteInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{61}
return fileDescriptor_5c21d519a9be369a, []int{57}
}
func (m *WalletNoteInfo) XXX_Unmarshal(b []byte) error {
......@@ -3742,7 +3506,7 @@ func (m *WalletDbMixInfo) Reset() { *m = WalletDbMixInfo{} }
func (m *WalletDbMixInfo) String() string { return proto.CompactTextString(m) }
func (*WalletDbMixInfo) ProtoMessage() {}
func (*WalletDbMixInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{62}
return fileDescriptor_5c21d519a9be369a, []int{58}
}
func (m *WalletDbMixInfo) XXX_Unmarshal(b []byte) error {
......@@ -3795,7 +3559,7 @@ func (m *WalletMixIndexReq) Reset() { *m = WalletMixIndexReq{} }
func (m *WalletMixIndexReq) String() string { return proto.CompactTextString(m) }
func (*WalletMixIndexReq) ProtoMessage() {}
func (*WalletMixIndexReq) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{63}
return fileDescriptor_5c21d519a9be369a, []int{59}
}
func (m *WalletMixIndexReq) XXX_Unmarshal(b []byte) error {
......@@ -3883,7 +3647,7 @@ func (m *WalletNoteResp) Reset() { *m = WalletNoteResp{} }
func (m *WalletNoteResp) String() string { return proto.CompactTextString(m) }
func (*WalletNoteResp) ProtoMessage() {}
func (*WalletNoteResp) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{64}
return fileDescriptor_5c21d519a9be369a, []int{60}
}
func (m *WalletNoteResp) XXX_Unmarshal(b []byte) error {
......@@ -3924,7 +3688,7 @@ func (m *WalletEnablePrivacyRst) Reset() { *m = WalletEnablePrivacyRst{}
func (m *WalletEnablePrivacyRst) String() string { return proto.CompactTextString(m) }
func (*WalletEnablePrivacyRst) ProtoMessage() {}
func (*WalletEnablePrivacyRst) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{65}
return fileDescriptor_5c21d519a9be369a, []int{61}
}
func (m *WalletEnablePrivacyRst) XXX_Unmarshal(b []byte) error {
......@@ -3977,7 +3741,7 @@ func (m *WalletEnablePrivacyResp) Reset() { *m = WalletEnablePrivacyResp
func (m *WalletEnablePrivacyResp) String() string { return proto.CompactTextString(m) }
func (*WalletEnablePrivacyResp) ProtoMessage() {}
func (*WalletEnablePrivacyResp) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{66}
return fileDescriptor_5c21d519a9be369a, []int{62}
}
func (m *WalletEnablePrivacyResp) XXX_Unmarshal(b []byte) error {
......@@ -4018,7 +3782,7 @@ func (m *LocalMixTx) Reset() { *m = LocalMixTx{} }
func (m *LocalMixTx) String() string { return proto.CompactTextString(m) }
func (*LocalMixTx) ProtoMessage() {}
func (*LocalMixTx) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{67}
return fileDescriptor_5c21d519a9be369a, []int{63}
}
func (m *LocalMixTx) XXX_Unmarshal(b []byte) error {
......@@ -4076,7 +3840,7 @@ func (m *MixTxListReq) Reset() { *m = MixTxListReq{} }
func (m *MixTxListReq) String() string { return proto.CompactTextString(m) }
func (*MixTxListReq) ProtoMessage() {}
func (*MixTxListReq) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{68}
return fileDescriptor_5c21d519a9be369a, []int{64}
}
func (m *MixTxListReq) XXX_Unmarshal(b []byte) error {
......@@ -4150,7 +3914,7 @@ func (m *MixTxListResp) Reset() { *m = MixTxListResp{} }
func (m *MixTxListResp) String() string { return proto.CompactTextString(m) }
func (*MixTxListResp) ProtoMessage() {}
func (*MixTxListResp) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{69}
return fileDescriptor_5c21d519a9be369a, []int{65}
}
func (m *MixTxListResp) XXX_Unmarshal(b []byte) error {
......@@ -4191,7 +3955,7 @@ func (m *PrivacyAddrResult) Reset() { *m = PrivacyAddrResult{} }
func (m *PrivacyAddrResult) String() string { return proto.CompactTextString(m) }
func (*PrivacyAddrResult) ProtoMessage() {}
func (*PrivacyAddrResult) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{70}
return fileDescriptor_5c21d519a9be369a, []int{66}
}
func (m *PrivacyAddrResult) XXX_Unmarshal(b []byte) error {
......@@ -4244,7 +4008,7 @@ func (m *ReqEnablePrivacyRst) Reset() { *m = ReqEnablePrivacyRst{} }
func (m *ReqEnablePrivacyRst) String() string { return proto.CompactTextString(m) }
func (*ReqEnablePrivacyRst) ProtoMessage() {}
func (*ReqEnablePrivacyRst) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{71}
return fileDescriptor_5c21d519a9be369a, []int{67}
}
func (m *ReqEnablePrivacyRst) XXX_Unmarshal(b []byte) error {
......@@ -4282,6 +4046,7 @@ func init() {
proto.RegisterType((*ZkVerifyKeys)(nil), "types.ZkVerifyKeys")
proto.RegisterType((*AuthKeys)(nil), "types.AuthKeys")
proto.RegisterType((*PaymentKey)(nil), "types.PaymentKey")
proto.RegisterType((*TokenTxFee)(nil), "types.TokenTxFee")
proto.RegisterType((*MixConfigAction)(nil), "types.MixConfigAction")
proto.RegisterType((*DHSecret)(nil), "types.DHSecret")
proto.RegisterType((*DHSecretGroup)(nil), "types.DHSecretGroup")
......@@ -4326,16 +4091,11 @@ func init() {
proto.RegisterType((*DepositProofResp)(nil), "types.DepositProofResp")
proto.RegisterType((*TreePathProof)(nil), "types.TreePathProof")
proto.RegisterType((*WithdrawTxReq)(nil), "types.WithdrawTxReq")
proto.RegisterType((*WithdrawProofRe)(nil), "types.WithdrawProofRe")
proto.RegisterType((*AuthTxReq)(nil), "types.AuthTxReq")
proto.RegisterType((*AuthProofRe)(nil), "types.AuthProofRe")
proto.RegisterType((*TransferInputTxReq)(nil), "types.TransferInputTxReq")
proto.RegisterType((*TransferOutputTxReq)(nil), "types.TransferOutputTxReq")
proto.RegisterType((*TransferTxReq)(nil), "types.TransferTxReq")
proto.RegisterType((*ShieldAmount)(nil), "types.ShieldAmount")
proto.RegisterType((*TransferInputProof)(nil), "types.TransferInputProof")
proto.RegisterType((*TransferOutputProof)(nil), "types.TransferOutputProof")
proto.RegisterType((*TransferProofResp)(nil), "types.TransferProofResp")
proto.RegisterType((*ShieldAmountRst)(nil), "types.ShieldAmountRst")
proto.RegisterType((*CreateRawTxReq)(nil), "types.CreateRawTxReq")
proto.RegisterType((*PaymentKeysReq)(nil), "types.PaymentKeysReq")
......@@ -4357,187 +4117,178 @@ func init() {
}
var fileDescriptor_5c21d519a9be369a = []byte{
// 2867 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0x4b, 0x6f, 0x23, 0xc7,
0x11, 0xd6, 0xf0, 0x29, 0x96, 0x48, 0x89, 0xea, 0x95, 0xb5, 0xb4, 0xe0, 0x18, 0x9b, 0xf6, 0xc6,
0x5e, 0x6b, 0x83, 0x8d, 0xad, 0x75, 0x1c, 0x18, 0x89, 0x37, 0xa1, 0x57, 0x94, 0x25, 0x7b, 0x45,
0x09, 0x4d, 0xee, 0xae, 0x1f, 0x70, 0x80, 0x11, 0xd9, 0x92, 0x06, 0x4b, 0x71, 0xb8, 0x33, 0x4d,
0x99, 0xf2, 0x2d, 0x48, 0x80, 0x20, 0x97, 0x20, 0x80, 0x0f, 0xb9, 0x05, 0xc8, 0x29, 0x3e, 0x07,
0x41, 0x0e, 0xf9, 0x01, 0x39, 0xe4, 0x9c, 0x1f, 0x90, 0x5b, 0xee, 0xf9, 0x05, 0x41, 0xf5, 0x63,
0xa6, 0x7b, 0x44, 0xea, 0xe1, 0x38, 0x40, 0x0e, 0xb9, 0x4d, 0x15, 0xab, 0x6b, 0xaa, 0xbf, 0x7a,
0x74, 0x55, 0x0f, 0xa1, 0x72, 0x12, 0x4c, 0xee, 0x8d, 0xa2, 0x50, 0x84, 0xa4, 0x28, 0xce, 0x46,
0x3c, 0x5e, 0xab, 0xf6, 0xc2, 0x93, 0x93, 0x70, 0xa8, 0x98, 0x6b, 0xcb, 0x22, 0xf2, 0x87, 0xb1,
0xdf, 0x13, 0x81, 0x61, 0xd1, 0x0f, 0x60, 0xe1, 0x93, 0x67, 0x4f, 0x78, 0x14, 0x1c, 0x9e, 0x7d,
0xc8, 0xcf, 0xc8, 0x77, 0xa0, 0x80, 0x0b, 0x1b, 0xde, 0x2d, 0xef, 0xce, 0xe2, 0xc6, 0xf2, 0x3d,
0xa9, 0xe5, 0x9e, 0xfa, 0xbd, 0x7b, 0x36, 0xe2, 0x4c, 0xfe, 0x4c, 0x56, 0xa0, 0x78, 0xea, 0x0f,
0xc6, 0xbc, 0x91, 0xbb, 0xe5, 0xdd, 0xa9, 0x30, 0x45, 0xd0, 0xb7, 0xa1, 0x6a, 0xe9, 0x8a, 0xc9,
0xab, 0x50, 0xe8, 0xfb, 0xc2, 0x6f, 0x78, 0xb7, 0xf2, 0x77, 0x16, 0x36, 0x88, 0x56, 0x66, 0x89,
0x30, 0xf9, 0x3b, 0x7d, 0x19, 0xe6, 0x9b, 0x63, 0x71, 0x2c, 0xd7, 0x10, 0x28, 0x3c, 0xe3, 0x67,
0xb1, 0x5c, 0x53, 0x61, 0xf2, 0x99, 0x1e, 0x00, 0xec, 0xfb, 0x67, 0x27, 0x7c, 0x28, 0xd0, 0x44,
0x02, 0x05, 0xbf, 0xdf, 0x8f, 0xa4, 0x89, 0x15, 0x26, 0x9f, 0xc9, 0x2d, 0x58, 0x88, 0x78, 0x8f,
0x07, 0xa7, 0x3c, 0xfa, 0x90, 0x9f, 0x69, 0xab, 0x6c, 0x16, 0x79, 0x19, 0x80, 0x0f, 0x7b, 0xd1,
0xd9, 0x08, 0x75, 0x34, 0xf2, 0x52, 0xc0, 0xe2, 0xd0, 0x7f, 0x79, 0xb0, 0xb4, 0x1b, 0x4c, 0x1e,
0x86, 0xc3, 0xc3, 0xe0, 0xa8, 0x29, 0x11, 0x22, 0xb7, 0x21, 0xd7, 0x3d, 0xd3, 0x50, 0xac, 0x68,
0xeb, 0x13, 0x19, 0x89, 0x46, 0xae, 0x7b, 0x46, 0xee, 0x42, 0x49, 0xc9, 0xcb, 0xd7, 0x2e, 0x6e,
0xdc, 0xc8, 0x4a, 0x36, 0x7b, 0x82, 0x69, 0x11, 0xb2, 0x01, 0x95, 0x53, 0xb3, 0x7b, 0x69, 0xc5,
0x54, 0x5c, 0xb6, 0xe7, 0x58, 0x2a, 0x46, 0xd6, 0xa0, 0xec, 0x2b, 0x78, 0x1a, 0x05, 0xb4, 0x7b,
0x7b, 0x8e, 0x19, 0x06, 0xb9, 0x0f, 0x30, 0x4a, 0xa0, 0x69, 0x14, 0xa5, 0x42, 0xe3, 0xb5, 0x14,
0xb3, 0xed, 0x39, 0x66, 0x89, 0xbd, 0x57, 0xd6, 0xde, 0xa3, 0x3f, 0x82, 0xf9, 0xcd, 0xed, 0x0e,
0xef, 0x45, 0x5c, 0x90, 0x06, 0x94, 0x47, 0x5c, 0xc1, 0xa7, 0x90, 0x35, 0x24, 0x59, 0x85, 0x52,
0x2c, 0x65, 0x34, 0xae, 0x9a, 0xa2, 0x1c, 0x6a, 0x66, 0xf5, 0xfb, 0x51, 0x38, 0x1e, 0x91, 0x35,
0x98, 0x37, 0x90, 0x6b, 0x1d, 0x09, 0xad, 0x7e, 0x13, 0xe3, 0x68, 0xc8, 0x23, 0xad, 0x26, 0xa1,
0xc9, 0x4b, 0x50, 0xc1, 0xfd, 0x84, 0x51, 0xf0, 0x05, 0xd7, 0xae, 0x49, 0x19, 0x74, 0x8c, 0x11,
0xba, 0x1f, 0x85, 0xe1, 0xe1, 0xce, 0xf0, 0x30, 0xc4, 0xd0, 0x1b, 0x21, 0xa1, 0xdf, 0xa0, 0x08,
0x0c, 0x80, 0xd1, 0xf8, 0x60, 0x10, 0xf4, 0x76, 0x86, 0xa3, 0xb1, 0x31, 0xd4, 0x66, 0x91, 0x7b,
0x50, 0x56, 0x76, 0xc7, 0x1a, 0x77, 0xe3, 0x51, 0x67, 0x0f, 0xcc, 0x08, 0xd1, 0x07, 0x50, 0xdf,
0x0d, 0x26, 0x9b, 0x7c, 0x14, 0xc6, 0x81, 0xd0, 0xde, 0x5b, 0x87, 0x92, 0x7c, 0x5d, 0x7c, 0x2e,
0xa4, 0x13, 0xfb, 0x98, 0x96, 0xa0, 0xbf, 0xf5, 0x60, 0x79, 0x37, 0x98, 0x74, 0x31, 0xe3, 0x0e,
0x79, 0x94, 0x6a, 0x08, 0xd0, 0x9c, 0x0b, 0x35, 0x28, 0x09, 0x94, 0x0d, 0xc7, 0xc2, 0x6c, 0x67,
0x86, 0xac, 0x92, 0x40, 0xd9, 0xde, 0xb1, 0x3f, 0x3c, 0xe2, 0xe7, 0x82, 0xca, 0x92, 0x55, 0x12,
0xf4, 0xa9, 0x34, 0xec, 0x69, 0x20, 0x8e, 0xfb, 0x91, 0xff, 0xb9, 0x36, 0x6c, 0x15, 0x4a, 0xfe,
0x49, 0x38, 0x1e, 0x0a, 0x89, 0x6b, 0x81, 0x69, 0xca, 0xda, 0x72, 0xee, 0xd2, 0x2d, 0x3f, 0x00,
0xb2, 0x1b, 0x4c, 0x9a, 0xc6, 0x73, 0x5a, 0xf3, 0x1d, 0xdb, 0x61, 0xd3, 0x15, 0x28, 0x01, 0xfa,
0xe7, 0x1c, 0x54, 0x50, 0x81, 0x5a, 0xb7, 0x08, 0x39, 0xa1, 0x62, 0xb1, 0xc8, 0x72, 0xe2, 0x8c,
0xbc, 0x01, 0xa5, 0x9e, 0xcc, 0x27, 0x0d, 0xc7, 0xea, 0x94, 0x3c, 0x0b, 0xc2, 0xe1, 0xf6, 0x1c,
0xd3, 0x72, 0xe4, 0x3e, 0x94, 0xfb, 0xca, 0x7f, 0x1a, 0x95, 0x9b, 0xe9, 0x12, 0xc7, 0xb1, 0x98,
0x51, 0x5a, 0x92, 0xbc, 0x0d, 0xf3, 0x9f, 0x6b, 0x68, 0x64, 0xba, 0x2d, 0x6c, 0x34, 0xd2, 0x55,
0x2e, 0x68, 0xdb, 0x73, 0x2c, 0x91, 0xc5, 0x75, 0x42, 0xfb, 0x5a, 0xe7, 0xa1, 0xb5, 0xce, 0x8d,
0x02, 0x5c, 0x67, 0x64, 0xc9, 0x3b, 0x76, 0xf0, 0x97, 0xe4, 0xc2, 0x17, 0xd3, 0x85, 0x19, 0x30,
0xb1, 0x30, 0x24, 0xd2, 0x69, 0x1e, 0x6f, 0x03, 0xd1, 0xfb, 0xd9, 0xb7, 0x22, 0x7e, 0x0d, 0xe6,
0x87, 0xa1, 0xe0, 0xdb, 0x7e, 0x7c, 0x6c, 0xd2, 0xd1, 0xd0, 0x96, 0xbb, 0x75, 0x4e, 0x2b, 0x8a,
0xfe, 0xc1, 0x83, 0x1b, 0x66, 0x93, 0xb6, 0x2e, 0x0a, 0x55, 0x11, 0x71, 0xce, 0xc2, 0x50, 0x58,
0xfa, 0x1c, 0x1e, 0xb9, 0x0d, 0xb5, 0xe1, 0x78, 0x30, 0x08, 0x0e, 0x03, 0x1e, 0x49, 0x21, 0xa5,
0xda, 0x65, 0x92, 0x7b, 0x40, 0x92, 0x1d, 0x74, 0x46, 0x7c, 0xd8, 0x97, 0xa2, 0x2a, 0xeb, 0xa7,
0xfc, 0x62, 0x59, 0x5a, 0x70, 0x2c, 0xfd, 0x87, 0x07, 0x0d, 0x03, 0xab, 0xb4, 0xf1, 0x6b, 0x98,
0x1b, 0x1f, 0x07, 0x7c, 0xd0, 0x6f, 0x4a, 0x85, 0x1f, 0x19, 0x73, 0x1d, 0x66, 0x56, 0xea, 0x63,
0x6d, 0xa9, 0xcb, 0x9c, 0xb1, 0xa9, 0xc2, 0xcc, 0x4d, 0x9d, 0x83, 0xaa, 0x38, 0x05, 0x2a, 0xfa,
0x73, 0x0f, 0x5e, 0x34, 0x5b, 0xdc, 0x93, 0x79, 0x7e, 0x55, 0xf7, 0x7e, 0x83, 0x7b, 0xa3, 0x7f,
0xf1, 0x60, 0x25, 0x09, 0xc3, 0xeb, 0x82, 0x7c, 0x07, 0x96, 0x7c, 0x6b, 0x6d, 0x7a, 0x38, 0x67,
0xd9, 0x68, 0x4c, 0xc2, 0xb2, 0x42, 0xc2, 0x65, 0x5e, 0x17, 0x68, 0xfa, 0x53, 0x58, 0x52, 0xa7,
0x6a, 0x7a, 0x80, 0x7c, 0x3b, 0xa9, 0x2b, 0x53, 0x1b, 0x1c, 0x2c, 0x35, 0x49, 0xc9, 0xca, 0x5d,
0x56, 0xb2, 0x7e, 0x02, 0xd0, 0x9a, 0x04, 0xb1, 0x78, 0x82, 0x79, 0x88, 0x07, 0x59, 0xe2, 0x41,
0x0d, 0x47, 0xca, 0xc0, 0x93, 0x8b, 0xa3, 0xac, 0xd4, 0x3a, 0xcf, 0x14, 0x41, 0x7f, 0x08, 0xb5,
0x87, 0xe1, 0xc9, 0x49, 0x20, 0x3a, 0xe3, 0x83, 0x6e, 0xc4, 0x39, 0x06, 0xfc, 0x31, 0x0f, 0x8e,
0x8e, 0x85, 0xae, 0x7d, 0x9a, 0xc2, 0xbe, 0xe7, 0xd8, 0x64, 0x55, 0x95, 0xc9, 0x67, 0xfa, 0x1e,
0x2c, 0x3a, 0x8b, 0x63, 0xf2, 0x06, 0xcc, 0xc7, 0xfa, 0x59, 0x1f, 0x31, 0xe6, 0x9c, 0x73, 0x04,
0x59, 0x22, 0x45, 0xbf, 0xf4, 0xa0, 0xae, 0x7e, 0x43, 0xba, 0x23, 0x7c, 0x31, 0x8e, 0xc9, 0x9b,
0x8e, 0x1a, 0x04, 0xe1, 0x85, 0x69, 0x6a, 0xe2, 0x54, 0x0f, 0x86, 0x43, 0x3c, 0x3e, 0x78, 0xc4,
0xfd, 0x53, 0x1e, 0x77, 0xf8, 0x73, 0x69, 0x67, 0x91, 0x39, 0x3c, 0x19, 0x0e, 0x51, 0xef, 0x38,
0x38, 0x95, 0x11, 0x22, 0xc5, 0xf2, 0xf2, 0xb8, 0xc9, 0xb2, 0xe9, 0x19, 0xdc, 0x64, 0xd8, 0x3b,
0x8c, 0xc4, 0x39, 0xdb, 0xee, 0x42, 0x61, 0x14, 0xf1, 0x53, 0x6d, 0xd7, 0x4d, 0xc7, 0xae, 0x54,
0x8c, 0x49, 0x21, 0xf2, 0x26, 0x94, 0x7b, 0xe3, 0x28, 0xe2, 0x43, 0x73, 0x8a, 0xce, 0x94, 0x37,
0x72, 0xf4, 0x01, 0xac, 0x3a, 0xaf, 0xee, 0x98, 0x1d, 0x90, 0x3a, 0xe4, 0x63, 0xfe, 0x5c, 0xfb,
0x05, 0x1f, 0xd1, 0x29, 0x03, 0xee, 0x1f, 0xea, 0xa0, 0x96, 0xcf, 0xf4, 0x5d, 0x78, 0x21, 0xbb,
0x5e, 0x6e, 0x6b, 0xfa, 0xf2, 0x28, 0x0c, 0x4d, 0x11, 0x96, 0xcf, 0xb4, 0x0f, 0x2b, 0x7a, 0x79,
0x53, 0x61, 0xa2, 0x5f, 0xbe, 0x02, 0xc5, 0x5e, 0x72, 0x40, 0x17, 0x99, 0x22, 0x64, 0x5f, 0x65,
0x12, 0xd0, 0xf4, 0x55, 0x26, 0xf9, 0xd6, 0x60, 0x7e, 0xe0, 0xc7, 0xe2, 0x11, 0x1a, 0xa8, 0xb2,
0x29, 0xa1, 0xe9, 0x56, 0xb2, 0x49, 0xfd, 0x96, 0xae, 0x4e, 0x5b, 0xdb, 0xca, 0x82, 0xb2, 0xf2,
0x82, 0x77, 0xd0, 0x75, 0x3b, 0x78, 0xb4, 0xa5, 0xab, 0x50, 0x1a, 0xc8, 0x27, 0x19, 0x81, 0x55,
0xa6, 0x29, 0xfa, 0x1a, 0x2c, 0xa5, 0xb2, 0x0a, 0x92, 0x15, 0x28, 0xa2, 0x2a, 0x23, 0xa9, 0x08,
0xfa, 0x7b, 0xcf, 0x96, 0xdc, 0x8f, 0xc2, 0x53, 0xee, 0x18, 0xe1, 0x9d, 0xdf, 0xa8, 0x4c, 0xc7,
0x8e, 0xec, 0x51, 0x71, 0x70, 0x48, 0x68, 0x6c, 0xfc, 0x47, 0x2a, 0x6b, 0xfb, 0x7c, 0x22, 0x61,
0xa8, 0x31, 0x8b, 0xa3, 0x72, 0xf6, 0x44, 0x59, 0x2e, 0x0b, 0x49, 0x8d, 0xa5, 0x0c, 0xec, 0x8a,
0x8f, 0xf9, 0x60, 0xc4, 0xa3, 0xb8, 0x51, 0xbc, 0x95, 0xbf, 0x53, 0x63, 0x86, 0xa4, 0x2d, 0x58,
0x40, 0xe3, 0x64, 0x31, 0xc8, 0x60, 0x34, 0xc5, 0x3c, 0x0c, 0x0c, 0x1b, 0x3f, 0x43, 0xd3, 0x57,
0xa1, 0x2a, 0x91, 0x0b, 0x62, 0xc1, 0x78, 0x3c, 0xca, 0x60, 0x57, 0x49, 0xb0, 0xbb, 0x0d, 0x55,
0x44, 0x2c, 0x91, 0x73, 0x80, 0xab, 0x18, 0xe0, 0xde, 0x81, 0x05, 0x93, 0xe0, 0x5a, 0xd9, 0xa5,
0xa5, 0xa4, 0xa2, 0x4b, 0xc9, 0xaf, 0x3d, 0x58, 0xb4, 0xb2, 0x01, 0x97, 0x67, 0x33, 0xda, 0xbb,
0x5a, 0x46, 0xe7, 0xa6, 0x66, 0x34, 0xb9, 0x67, 0x95, 0x94, 0xbc, 0xd3, 0x4b, 0x5a, 0x26, 0x5b,
0x75, 0xe9, 0x11, 0x2c, 0xa6, 0x13, 0xcc, 0xbe, 0x1f, 0x44, 0xe8, 0x4a, 0x3d, 0x4f, 0xa4, 0x53,
0x8a, 0xc5, 0x41, 0x9c, 0x63, 0xac, 0xfc, 0xe9, 0x29, 0x93, 0xd0, 0x58, 0x29, 0x5b, 0xc9, 0xb4,
0x27, 0xb5, 0xe1, 0xc0, 0x13, 0x05, 0xa7, 0xf6, 0xc0, 0xa3, 0x48, 0x84, 0x6d, 0x64, 0x9f, 0x55,
0x9a, 0xa2, 0x3f, 0xf3, 0x60, 0xb9, 0xd9, 0x93, 0x79, 0xb7, 0x1f, 0x05, 0xa7, 0x7e, 0x4f, 0x8e,
0x67, 0xdf, 0x77, 0x46, 0x30, 0xb7, 0x58, 0xba, 0x1b, 0xb0, 0x87, 0x30, 0x5c, 0x66, 0x0d, 0xa4,
0x39, 0x67, 0x99, 0x6b, 0xa9, 0x33, 0xa7, 0x7e, 0x0a, 0xcb, 0x4f, 0xfd, 0xc1, 0x80, 0x8b, 0x66,
0xbf, 0x1f, 0x69, 0x2b, 0xc8, 0x86, 0xda, 0x8a, 0xdf, 0x33, 0xef, 0x37, 0xad, 0xe7, 0x39, 0x6b,
0x99, 0x11, 0x4c, 0xc6, 0xe8, 0x5c, 0x3a, 0x46, 0xd3, 0xaf, 0x3c, 0x00, 0x35, 0x0c, 0x6d, 0xfa,
0xc2, 0xcf, 0x4e, 0xd5, 0xde, 0xf9, 0xa9, 0xfa, 0x25, 0xa8, 0xa8, 0x29, 0x2e, 0x05, 0x2b, 0x65,
0x60, 0xfc, 0x24, 0x47, 0x72, 0x3a, 0x75, 0x3b, 0xbc, 0x59, 0xed, 0x1d, 0xfa, 0x1a, 0xbb, 0x19,
0xe6, 0x0f, 0xfb, 0xe1, 0x89, 0x6e, 0x8f, 0x2c, 0x0e, 0x6d, 0xc1, 0xb2, 0x46, 0xc9, 0x32, 0x38,
0x9d, 0x54, 0x3d, 0x7b, 0x52, 0xb5, 0x67, 0xdb, 0x9c, 0x33, 0xdb, 0xd2, 0xcf, 0x60, 0x79, 0x93,
0x5f, 0x55, 0x0d, 0xc6, 0x45, 0x14, 0xd8, 0x71, 0x21, 0x29, 0x5b, 0x7d, 0xde, 0x55, 0xff, 0xa5,
0x07, 0x0b, 0xba, 0x33, 0x97, 0xbd, 0xc7, 0x6d, 0xa8, 0x19, 0xf8, 0xd0, 0x7f, 0xb1, 0x7e, 0x81,
0xcb, 0x54, 0x71, 0x8e, 0x20, 0x36, 0x53, 0x07, 0x59, 0x1c, 0xa7, 0x55, 0x92, 0x22, 0xd9, 0x56,
0x49, 0x4a, 0x35, 0xa0, 0xac, 0xb0, 0x8c, 0x35, 0xb4, 0x86, 0xa4, 0x5d, 0xa8, 0x6a, 0xa3, 0xba,
0x13, 0xac, 0x5d, 0xdf, 0x4d, 0xe7, 0x24, 0x77, 0x46, 0xb3, 0x4c, 0x4f, 0x07, 0xa4, 0x55, 0x28,
0x7d, 0xf1, 0x6c, 0xdf, 0x17, 0xa6, 0x7c, 0x68, 0x8a, 0xfe, 0xd2, 0x83, 0xba, 0x99, 0x42, 0xb0,
0xbc, 0xca, 0x12, 0x72, 0x51, 0x93, 0xfa, 0x9a, 0xdb, 0x65, 0x99, 0x5e, 0x2c, 0x75, 0x84, 0x19,
0xee, 0xaf, 0x3b, 0xba, 0x07, 0x50, 0x93, 0xe7, 0x86, 0x2f, 0x8e, 0xa5, 0x25, 0x57, 0xea, 0x54,
0xd7, 0x70, 0x7e, 0x53, 0x8b, 0xcc, 0x19, 0x62, 0x68, 0xfb, 0x14, 0xc8, 0xbb, 0xa7, 0xc0, 0x11,
0xd4, 0xcc, 0xb8, 0xa4, 0xb0, 0xbc, 0x05, 0x0b, 0x22, 0x14, 0xfe, 0xa0, 0x69, 0x0f, 0xd3, 0x36,
0x4b, 0x1e, 0x38, 0x1a, 0x82, 0xd8, 0xe4, 0x4c, 0xc2, 0xb0, 0xd0, 0xcd, 0x3b, 0xe8, 0xfe, 0x2d,
0x07, 0x4b, 0xc9, 0x60, 0xa6, 0xe0, 0x25, 0xaf, 0x3b, 0x71, 0x3a, 0x15, 0x41, 0x13, 0xba, 0xff,
0x9d, 0xd9, 0xcc, 0xf6, 0x6e, 0x21, 0xe3, 0x5d, 0x3c, 0x3c, 0x50, 0x70, 0x5f, 0xd7, 0x58, 0x95,
0xc2, 0x0e, 0x0f, 0xa1, 0x90, 0xf4, 0xd6, 0xc0, 0x3f, 0x92, 0xb3, 0x6f, 0x85, 0xa5, 0x0c, 0x27,
0xcc, 0xa5, 0x44, 0x39, 0x13, 0xe6, 0x52, 0x6a, 0x03, 0x2a, 0x42, 0x35, 0x09, 0xe1, 0x61, 0x63,
0xde, 0x09, 0x0f, 0x27, 0x08, 0x58, 0x2a, 0x46, 0x03, 0xa8, 0xe0, 0x44, 0xa3, 0x3c, 0x76, 0x51,
0x88, 0xda, 0xe3, 0x4b, 0x37, 0xb4, 0x72, 0x2d, 0xcb, 0xb6, 0xfc, 0x56, 0x70, 0xfc, 0xf6, 0xc7,
0x1c, 0x2c, 0xe0, 0xbb, 0x8c, 0xcf, 0x5e, 0x73, 0x6f, 0x43, 0x66, 0x07, 0xfd, 0xcb, 0x00, 0xf8,
0x0e, 0x67, 0x68, 0xb2, 0x38, 0x18, 0x68, 0x92, 0xd2, 0xf0, 0x2a, 0xb3, 0x6c, 0x16, 0x6e, 0x0c,
0x49, 0xdb, 0x3b, 0x86, 0x9e, 0xe1, 0xe9, 0xe2, 0x95, 0x3c, 0x5d, 0xca, 0x80, 0xe4, 0x78, 0xb1,
0x9c, 0xf5, 0xe2, 0xd7, 0xf1, 0xcf, 0x07, 0x40, 0x9c, 0xd1, 0x5e, 0x39, 0xca, 0x49, 0x1c, 0x6f,
0x76, 0xe2, 0xb8, 0x65, 0xe9, 0x53, 0xb8, 0xe1, 0xce, 0xd0, 0xdf, 0x64, 0xcd, 0x13, 0x58, 0x69,
0x94, 0x72, 0xa5, 0xf6, 0x7b, 0x50, 0x94, 0xb7, 0x77, 0x5a, 0xe9, 0x8b, 0xc9, 0x4e, 0xb3, 0xbb,
0x61, 0x4a, 0x8e, 0x6c, 0x64, 0x2e, 0xf9, 0xd6, 0x32, 0x2b, 0x2c, 0x9b, 0xcd, 0x65, 0x1f, 0x5d,
0x87, 0x6a, 0xc7, 0x1a, 0xd1, 0x49, 0x15, 0xbc, 0x8f, 0x34, 0x20, 0xde, 0x47, 0x48, 0x7d, 0xac,
0xcd, 0xf4, 0x3e, 0xa6, 0x5f, 0xe5, 0x33, 0x58, 0xaa, 0x8a, 0x78, 0xe5, 0x30, 0xfc, 0x7f, 0xe1,
0xb0, 0x02, 0x93, 0xfc, 0x00, 0xaa, 0xf6, 0xe5, 0x48, 0xa3, 0x22, 0x97, 0x99, 0x1b, 0x7f, 0xdb,
0x29, 0xcc, 0x11, 0x94, 0xad, 0x90, 0xe2, 0xab, 0x86, 0x06, 0x74, 0x2b, 0x64, 0xf1, 0xe8, 0x3f,
0xbd, 0x6c, 0xa8, 0x5e, 0xd3, 0x57, 0x36, 0xaa, 0xb9, 0x0c, 0xaa, 0xd7, 0x3c, 0x43, 0xcf, 0xed,
0xb4, 0xf0, 0x75, 0x77, 0x5a, 0x9c, 0xb2, 0xd3, 0xbf, 0x7b, 0xb0, 0x6c, 0x76, 0x9a, 0xf6, 0x0a,
0x3f, 0x86, 0x9a, 0xb0, 0x23, 0xf5, 0xa2, 0x1c, 0x52, 0xab, 0x5c, 0x79, 0xf2, 0x00, 0xaa, 0xc2,
0x8f, 0x8e, 0xb8, 0xd8, 0xbb, 0x3c, 0xa3, 0x94, 0x02, 0x47, 0x1e, 0xd7, 0xab, 0x2b, 0x72, 0xbd,
0x3e, 0x7f, 0xf9, 0x7a, 0x5b, 0x9e, 0xfe, 0x22, 0x07, 0x4b, 0x0e, 0x32, 0xb1, 0x84, 0x43, 0x26,
0xba, 0xda, 0xb9, 0x19, 0xd7, 0x1c, 0x1e, 0xca, 0xa8, 0xcc, 0xd6, 0x90, 0x29, 0xdf, 0x39, 0x3c,
0x94, 0x51, 0xef, 0xd2, 0x32, 0xba, 0x97, 0xb6, 0x79, 0xe4, 0x6e, 0xf2, 0x71, 0xa1, 0x20, 0xe7,
0xab, 0xa9, 0xde, 0x32, 0x5f, 0x17, 0xee, 0x26, 0x85, 0xa7, 0x38, 0xdb, 0xb5, 0xe6, 0xf3, 0xc2,
0xdd, 0xe4, 0xf3, 0x42, 0xe9, 0x02, 0x61, 0xfd, 0x7d, 0xe1, 0xaf, 0x1e, 0x2c, 0x3e, 0x8c, 0xb8,
0x8f, 0xbd, 0xfa, 0xe7, 0xc9, 0x19, 0xab, 0xbe, 0x3a, 0x76, 0xcd, 0x8d, 0x7e, 0x42, 0xe3, 0x20,
0x22, 0xbf, 0x12, 0x16, 0xd4, 0xbd, 0x16, 0x3e, 0xcb, 0x2f, 0x42, 0x71, 0xcc, 0x45, 0x6b, 0xc2,
0x7b, 0xa6, 0x47, 0x4a, 0x18, 0xf2, 0x68, 0x44, 0xa2, 0x1b, 0x3e, 0xe3, 0x43, 0xf3, 0x2d, 0x2f,
0xe5, 0xe0, 0x6c, 0x2c, 0x02, 0x31, 0xe0, 0xba, 0x32, 0x28, 0xc2, 0xcc, 0x7b, 0x38, 0x24, 0x95,
0xa5, 0x09, 0xc9, 0x28, 0xb4, 0x0a, 0x25, 0xf5, 0xb5, 0x4d, 0x96, 0x81, 0x22, 0xd3, 0x14, 0x7d,
0x62, 0x4f, 0xa0, 0x31, 0xee, 0x63, 0xf6, 0xcc, 0x38, 0x65, 0x9c, 0x42, 0xbd, 0x7d, 0x2e, 0xfc,
0x60, 0x20, 0x6d, 0x2c, 0x32, 0x4d, 0xd1, 0xdf, 0xe4, 0x60, 0x51, 0x0d, 0x71, 0xed, 0x50, 0xc8,
0x1b, 0x84, 0x0b, 0x9b, 0x10, 0xe7, 0x56, 0x31, 0x97, 0xbd, 0x55, 0xbc, 0x6e, 0xe9, 0x3d, 0x77,
0xcf, 0x5a, 0x98, 0x76, 0xcf, 0x8a, 0xc3, 0x83, 0x9a, 0x1d, 0x75, 0x02, 0x1b, 0x52, 0x36, 0x9d,
0xf2, 0x8a, 0x40, 0xa2, 0x9b, 0x5e, 0xa1, 0xe2, 0x56, 0xf4, 0xdd, 0x81, 0x16, 0xb0, 0xfa, 0xd3,
0xf2, 0x25, 0xfd, 0x29, 0x7d, 0x02, 0x4b, 0x0a, 0x91, 0xcd, 0x83, 0xdd, 0x60, 0x22, 0x21, 0x79,
0x1d, 0x0a, 0xc1, 0xf0, 0x30, 0xcc, 0x4c, 0xd4, 0x2e, 0x6e, 0x4c, 0x8a, 0xa0, 0xb5, 0x62, 0xa2,
0x2e, 0x78, 0xf4, 0x7c, 0xa7, 0x49, 0xfa, 0xab, 0x9c, 0x99, 0x97, 0xa5, 0xda, 0x3e, 0xbf, 0xb4,
0xe5, 0xfb, 0xdf, 0x42, 0x7b, 0xd5, 0x41, 0xbb, 0x98, 0x40, 0x9b, 0x5c, 0x06, 0x96, 0xed, 0xcb,
0xc0, 0x97, 0xa0, 0xd2, 0x0f, 0x22, 0xae, 0xbe, 0x46, 0xab, 0x58, 0x4e, 0x19, 0xf4, 0x5d, 0x3b,
0xea, 0x64, 0xc5, 0xbd, 0x0b, 0x45, 0xdc, 0xb7, 0xb9, 0x29, 0x9e, 0x81, 0xb1, 0x92, 0xa1, 0x0c,
0x56, 0xd5, 0x0f, 0xad, 0xa1, 0x7f, 0x30, 0xe0, 0xfa, 0x4e, 0x01, 0x6b, 0xdc, 0xb4, 0x2f, 0xf2,
0x04, 0x0a, 0x41, 0xbc, 0xf7, 0xa1, 0xbe, 0xeb, 0x96, 0xcf, 0xa4, 0x0e, 0xf9, 0x93, 0xf8, 0x48,
0xa3, 0x85, 0x8f, 0xb4, 0x0d, 0x37, 0xa7, 0xe9, 0x44, 0xdb, 0xee, 0x43, 0x31, 0xe2, 0xf1, 0xc8,
0xd8, 0xf6, 0x2d, 0xc7, 0xb6, 0xac, 0x09, 0x4c, 0xc9, 0xd2, 0x36, 0xc0, 0xa3, 0xb0, 0xe7, 0x0f,
0x76, 0x83, 0x49, 0x77, 0x92, 0x5c, 0x73, 0x79, 0xe9, 0x35, 0x97, 0x75, 0x25, 0x86, 0x96, 0xe5,
0x93, 0x2b, 0xb1, 0x15, 0x6c, 0xdc, 0xcc, 0x0d, 0x61, 0x9e, 0x29, 0x82, 0xfe, 0xce, 0x83, 0xaa,
0xd4, 0xa5, 0xee, 0xdd, 0x9e, 0xdb, 0x91, 0xe6, 0x39, 0x91, 0x36, 0xed, 0x4e, 0xcd, 0x7a, 0x59,
0x7e, 0xfa, 0xcb, 0x0a, 0xd6, 0xcb, 0x52, 0x9f, 0x16, 0x67, 0xfa, 0xb4, 0x94, 0xf5, 0xe9, 0x5b,
0x50, 0xb3, 0xec, 0x8b, 0x47, 0xe4, 0x15, 0xc8, 0x8b, 0x89, 0x01, 0xcd, 0x24, 0x5c, 0x8a, 0x09,
0xc3, 0x5f, 0xe9, 0x2e, 0x2c, 0x6b, 0xec, 0x70, 0x76, 0x61, 0x3c, 0x1e, 0x0f, 0xfe, 0x13, 0x2f,
0xee, 0xc0, 0x0d, 0xc6, 0x9f, 0x9f, 0x0b, 0x8b, 0x0d, 0x28, 0x47, 0x52, 0xb5, 0x31, 0xc7, 0xdc,
0x4a, 0x9d, 0x7b, 0x37, 0x33, 0x82, 0xeb, 0x9f, 0x01, 0xa4, 0xdf, 0x62, 0xc8, 0x02, 0x94, 0x37,
0x5b, 0xfb, 0x7b, 0x9d, 0x9d, 0x6e, 0x7d, 0x8e, 0x54, 0x61, 0xfe, 0xe9, 0x4e, 0x77, 0x7b, 0x93,
0x35, 0x9f, 0xd6, 0x3d, 0xb2, 0x0c, 0xb5, 0x2e, 0x6b, 0xb6, 0x3b, 0x5b, 0x2d, 0xb6, 0xd3, 0xde,
0x7f, 0xdc, 0xad, 0xe7, 0x08, 0x81, 0x45, 0xc3, 0xda, 0x7b, 0xdc, 0x45, 0x5e, 0x9e, 0xd4, 0xa0,
0xd2, 0x7c, 0xdc, 0xdd, 0xde, 0x63, 0x3b, 0x9f, 0xb4, 0xea, 0x85, 0xf5, 0x0d, 0x09, 0x57, 0xfa,
0x07, 0x0e, 0x02, 0x50, 0x52, 0xef, 0xab, 0xcf, 0x91, 0x79, 0x28, 0xe0, 0xa4, 0x56, 0xf7, 0xf0,
0xbd, 0xba, 0xf0, 0xd7, 0x73, 0xeb, 0xaf, 0xc8, 0x10, 0x48, 0x3e, 0x31, 0x93, 0x32, 0xe4, 0x9b,
0xfd, 0x7e, 0x7d, 0x0e, 0xd7, 0x6e, 0xf2, 0x01, 0x17, 0xbc, 0xee, 0xad, 0x6f, 0x01, 0xa4, 0x05,
0x90, 0x54, 0xa0, 0xf8, 0xb8, 0xbd, 0xd9, 0xda, 0xaa, 0xcf, 0xe1, 0xe3, 0x93, 0xe6, 0xa3, 0x9d,
0xcd, 0xba, 0x87, 0xfa, 0x1f, 0x77, 0x5a, 0x9b, 0xf5, 0x1c, 0xae, 0xdc, 0x62, 0x7b, 0x9f, 0xb4,
0xda, 0xf5, 0x3c, 0x6e, 0xeb, 0x71, 0x5b, 0x53, 0x85, 0xf5, 0x77, 0xe1, 0x85, 0xdd, 0x60, 0xa2,
0x82, 0x9c, 0xf1, 0xb8, 0xe7, 0x0f, 0xb5, 0xca, 0x79, 0x28, 0xec, 0x6c, 0x3e, 0x6a, 0x29, 0x1c,
0x3a, 0x0f, 0x9b, 0xed, 0xf6, 0x4e, 0xfb, 0xfd, 0xba, 0x87, 0xd4, 0xd6, 0x4e, 0x7b, 0xa7, 0xb3,
0x8d, 0x8a, 0x37, 0xfe, 0xe4, 0x01, 0x9c, 0x04, 0x13, 0x73, 0x2f, 0xf8, 0x16, 0x2c, 0xbd, 0x9f,
0xd1, 0x53, 0xd3, 0x3e, 0x60, 0xfc, 0x79, 0x3b, 0x18, 0xac, 0xd5, 0x53, 0xb2, 0x23, 0xa2, 0x60,
0x78, 0x44, 0xe7, 0xc8, 0x1b, 0xb0, 0xa0, 0x96, 0xe0, 0x8e, 0xae, 0xb4, 0xe2, 0x01, 0xd4, 0x1c,
0xef, 0x93, 0xa5, 0x54, 0x48, 0x5e, 0x69, 0xad, 0xad, 0xa5, 0x8c, 0x6c, 0x9c, 0xd0, 0xb9, 0x83,
0x92, 0xfc, 0x2f, 0xd2, 0xfd, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x4d, 0x9d, 0x05, 0x41, 0xc0,
0x24, 0x00, 0x00,
// 2726 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x1a, 0xcb, 0x6e, 0x23, 0xc7,
0x51, 0x43, 0x0e, 0x5f, 0x25, 0x52, 0xa2, 0x7a, 0x65, 0x2d, 0x2d, 0x38, 0x86, 0xd2, 0xde, 0xd8,
0xb2, 0x14, 0xc8, 0xb6, 0xd6, 0x36, 0x60, 0x24, 0x36, 0x4c, 0x2f, 0x29, 0x8b, 0xb6, 0x44, 0x09,
0x43, 0x6a, 0xd7, 0x0f, 0x38, 0xc0, 0x88, 0x6c, 0x89, 0x83, 0x25, 0x39, 0xdc, 0x99, 0xa1, 0x96,
0xf4, 0xc1, 0x40, 0x90, 0x00, 0x41, 0x2e, 0x41, 0x80, 0x1c, 0x72, 0x0b, 0x10, 0x04, 0x41, 0x7e,
0x20, 0xc8, 0x21, 0x5f, 0x90, 0x7b, 0x0e, 0xb9, 0xe6, 0x98, 0xcf, 0x08, 0xaa, 0x1f, 0x33, 0xdd,
0x24, 0x25, 0xed, 0xc6, 0x7b, 0xc8, 0x6d, 0xaa, 0x54, 0x5d, 0x55, 0x5d, 0x55, 0x5d, 0x2f, 0x0a,
0x0a, 0x03, 0x6f, 0xb2, 0x37, 0x0a, 0xfc, 0xc8, 0x27, 0x99, 0x68, 0x3a, 0x62, 0xe1, 0x66, 0xb1,
0xe3, 0x0f, 0x06, 0xfe, 0x50, 0x20, 0x37, 0xd7, 0xa2, 0xc0, 0x1d, 0x86, 0x6e, 0x27, 0xf2, 0x14,
0x8a, 0x7e, 0x06, 0xcb, 0x5f, 0x3d, 0x7e, 0xc8, 0x02, 0xef, 0x62, 0xfa, 0x39, 0x9b, 0x92, 0x1f,
0x81, 0x8d, 0x07, 0x2b, 0xd6, 0x96, 0xb5, 0xbd, 0xb2, 0xbf, 0xb6, 0xc7, 0xb9, 0xec, 0x89, 0xbf,
0xb7, 0xa7, 0x23, 0xe6, 0xf0, 0x3f, 0x93, 0x75, 0xc8, 0x5c, 0xb9, 0xfd, 0x31, 0xab, 0xa4, 0xb6,
0xac, 0xed, 0x82, 0x23, 0x00, 0xfa, 0x3e, 0x14, 0x35, 0x5e, 0x21, 0x79, 0x1d, 0xec, 0xae, 0x1b,
0xb9, 0x15, 0x6b, 0x2b, 0xbd, 0xbd, 0xbc, 0x4f, 0x24, 0x33, 0x8d, 0xc4, 0xe1, 0x7f, 0xa7, 0xaf,
0x42, 0xbe, 0x3a, 0x8e, 0x7a, 0xfc, 0x0c, 0x01, 0xfb, 0x31, 0x9b, 0x86, 0xfc, 0x4c, 0xc1, 0xe1,
0xdf, 0xf4, 0x1c, 0xe0, 0xd4, 0x9d, 0x0e, 0xd8, 0x30, 0x42, 0x15, 0x09, 0xd8, 0x6e, 0xb7, 0x1b,
0x70, 0x15, 0x0b, 0x0e, 0xff, 0x26, 0x5b, 0xb0, 0x1c, 0xb0, 0x0e, 0xf3, 0xae, 0x58, 0xf0, 0x39,
0x9b, 0x4a, 0xad, 0x74, 0x14, 0x79, 0x15, 0x80, 0x0d, 0x3b, 0xc1, 0x74, 0x84, 0x3c, 0x2a, 0x69,
0x4e, 0xa0, 0x61, 0x68, 0x17, 0xa0, 0xed, 0x3f, 0x66, 0xc3, 0xf6, 0xe4, 0x80, 0x31, 0xf2, 0x0a,
0x14, 0xdc, 0x30, 0x64, 0x51, 0x7d, 0xc2, 0x3a, 0x52, 0x50, 0x82, 0x40, 0x69, 0x1c, 0x68, 0x4d,
0x07, 0xe7, 0x7e, 0x5f, 0x49, 0xd3, 0x50, 0x64, 0x03, 0xb2, 0xee, 0xc0, 0x1f, 0x0f, 0x23, 0x2e,
0xc9, 0x76, 0x24, 0x44, 0xff, 0x94, 0x82, 0xd5, 0x63, 0x6f, 0xf2, 0xc0, 0x1f, 0x5e, 0x78, 0x97,
0x55, 0xee, 0x07, 0x72, 0x0f, 0x52, 0xed, 0xa9, 0x34, 0xf8, 0xba, 0xb4, 0x51, 0x4c, 0xc3, 0x6d,
0x9e, 0x6a, 0x4f, 0xc9, 0x2e, 0x64, 0x05, 0x3d, 0x17, 0xb7, 0xb2, 0x7f, 0x67, 0x96, 0xb2, 0xda,
0x89, 0x1c, 0x49, 0x42, 0xf6, 0xa1, 0x70, 0xa5, 0x6c, 0xcc, 0x35, 0x58, 0x68, 0xfd, 0xc3, 0x25,
0x27, 0x21, 0x23, 0x9b, 0x90, 0x73, 0x85, 0x13, 0x2a, 0x36, 0x5e, 0xe8, 0x70, 0xc9, 0x51, 0x08,
0x72, 0x1f, 0x60, 0x14, 0x3b, 0xa0, 0x92, 0xe1, 0x0c, 0x55, 0x6c, 0x24, 0x9e, 0x39, 0x5c, 0x72,
0x34, 0x32, 0xf2, 0x16, 0xe4, 0x23, 0xb4, 0xe8, 0x01, 0x63, 0x95, 0xac, 0x71, 0x24, 0x31, 0xf4,
0xe1, 0x92, 0x13, 0x13, 0x7d, 0x92, 0x93, 0x41, 0x45, 0x7f, 0x0a, 0xf9, 0xda, 0x61, 0x8b, 0x75,
0x02, 0x16, 0x91, 0x0a, 0xe4, 0x46, 0x4c, 0x78, 0x55, 0xf8, 0x41, 0x81, 0x68, 0xe3, 0x90, 0xd3,
0x48, 0x07, 0x48, 0x88, 0x32, 0x28, 0xa9, 0xd3, 0x9f, 0x06, 0xfe, 0x78, 0x44, 0x36, 0x21, 0xaf,
0x22, 0x41, 0xf2, 0x88, 0x61, 0xf1, 0xb7, 0x68, 0x1c, 0x0c, 0x59, 0x20, 0xd9, 0xc4, 0x30, 0x0f,
0x82, 0x71, 0xd4, 0xf3, 0x03, 0xef, 0x5b, 0x26, 0x23, 0x26, 0x41, 0xd0, 0x31, 0x3e, 0x9c, 0xd3,
0xc0, 0xf7, 0x2f, 0x1a, 0xc3, 0x0b, 0x1f, 0x5f, 0xc4, 0x08, 0x01, 0x29, 0x41, 0x00, 0x18, 0x29,
0xa3, 0xf1, 0x79, 0xdf, 0xeb, 0x34, 0x86, 0xa3, 0xb1, 0x52, 0x54, 0x47, 0x91, 0x3d, 0xc8, 0x09,
0xbd, 0x43, 0xe9, 0x28, 0x15, 0x02, 0xc6, 0x1d, 0x1c, 0x45, 0x44, 0xbf, 0x83, 0xf2, 0xb1, 0x37,
0xa9, 0xb1, 0x91, 0x1f, 0x7a, 0x91, 0x74, 0xf7, 0xf7, 0x8d, 0xd6, 0x1d, 0xc8, 0x72, 0x75, 0x51,
0x05, 0xf3, 0xa5, 0xc6, 0xf7, 0x73, 0x24, 0x05, 0xfd, 0x97, 0x05, 0x6b, 0xc7, 0xde, 0xa4, 0x8d,
0x89, 0xe4, 0x82, 0x05, 0x2f, 0x4e, 0x03, 0x0f, 0xcd, 0x71, 0xa3, 0x06, 0x82, 0x02, 0x69, 0xfd,
0x71, 0x84, 0xe6, 0xb4, 0x67, 0x22, 0x5b, 0xa3, 0x15, 0x14, 0x48, 0xdb, 0xe9, 0xb9, 0xc3, 0x4b,
0x26, 0x83, 0x76, 0x21, 0xad, 0xa0, 0xa0, 0xbf, 0x17, 0x37, 0x7b, 0xe4, 0x45, 0xbd, 0x6e, 0xe0,
0x3e, 0x7d, 0x41, 0x37, 0xbb, 0x26, 0x13, 0x68, 0x36, 0xb7, 0x6f, 0xb5, 0xf9, 0x77, 0x40, 0x8e,
0xbd, 0x49, 0x55, 0x85, 0xde, 0x0b, 0xd2, 0x6c, 0x5b, 0x45, 0x6c, 0xfa, 0x5a, 0xd3, 0x08, 0x02,
0xfa, 0xb7, 0x14, 0x14, 0x50, 0x01, 0x21, 0x77, 0x05, 0x52, 0x91, 0x78, 0x8c, 0x19, 0x27, 0x15,
0x4d, 0xc9, 0xdb, 0x90, 0xed, 0xf0, 0x0c, 0xc4, 0x85, 0x2c, 0xef, 0x6f, 0x2c, 0xc8, 0x4c, 0x9e,
0x3f, 0x3c, 0x5c, 0x72, 0x24, 0x1d, 0xb9, 0x0f, 0xb9, 0xae, 0x08, 0x60, 0x29, 0xfb, 0x6e, 0x72,
0xc4, 0x88, 0x6c, 0xcc, 0x41, 0x92, 0x92, 0xbc, 0x0f, 0xf9, 0xa7, 0xd2, 0x35, 0xd2, 0xf1, 0x95,
0xe4, 0x94, 0xe9, 0x34, 0xcc, 0x2a, 0x8a, 0x16, 0xcf, 0x45, 0x32, 0x58, 0x65, 0x10, 0x68, 0xe7,
0xcc, 0x30, 0xe6, 0xd9, 0x48, 0x62, 0xc8, 0x07, 0xfa, 0xeb, 0x17, 0xf9, 0xeb, 0xe5, 0xe4, 0xe0,
0x8c, 0x33, 0x30, 0x95, 0xc6, 0xd4, 0x49, 0x22, 0x3b, 0x04, 0x22, 0xef, 0x73, 0xaa, 0x3d, 0xf9,
0x4d, 0xc8, 0x0f, 0xfd, 0x88, 0x1d, 0xba, 0x61, 0x4f, 0xe5, 0x23, 0x05, 0x6b, 0xe1, 0x22, 0x93,
0x9a, 0x2c, 0x1c, 0x7f, 0xb1, 0xe0, 0x8e, 0xba, 0xa4, 0xce, 0x8b, 0x42, 0x31, 0x0a, 0x18, 0x73,
0x7c, 0x3f, 0xd2, 0xf8, 0x19, 0x38, 0x72, 0x0f, 0x4a, 0xc3, 0x71, 0xbf, 0xef, 0x5d, 0x78, 0x2c,
0xe0, 0x44, 0x82, 0xb5, 0x89, 0x24, 0x7b, 0x40, 0xe2, 0x1b, 0xb4, 0x46, 0x6c, 0xd8, 0xe5, 0xa4,
0x22, 0xed, 0x2d, 0xf8, 0x8b, 0xa6, 0xa9, 0x6d, 0x68, 0xfa, 0x6f, 0x0b, 0x2a, 0xca, 0xac, 0x5c,
0xc7, 0xff, 0x41, 0xdd, 0xb0, 0xe7, 0xb1, 0x7e, 0xb7, 0xca, 0x19, 0x7e, 0xa1, 0xd4, 0x35, 0x90,
0xb3, 0x54, 0x5f, 0x4a, 0x4d, 0x4d, 0xe4, 0x35, 0x97, 0xb2, 0xaf, 0xbd, 0xd4, 0x9c, 0xa9, 0x32,
0x0b, 0x4c, 0x45, 0x7f, 0x61, 0xc1, 0xcb, 0xea, 0x8a, 0x27, 0x3c, 0xd1, 0x3c, 0xab, 0x7b, 0x5f,
0xe0, 0xdd, 0xe8, 0xdf, 0x2d, 0x58, 0x8f, 0xc3, 0xf0, 0x79, 0x8d, 0xbc, 0x0d, 0xab, 0xae, 0x76,
0x36, 0x69, 0x9a, 0x66, 0xd1, 0xa8, 0x4c, 0x8c, 0xd2, 0x42, 0xc2, 0x44, 0x3e, 0xaf, 0xa1, 0xe9,
0xcf, 0x60, 0x55, 0xf4, 0x21, 0x49, 0x05, 0xfd, 0x61, 0x9c, 0x57, 0x16, 0x36, 0x9e, 0x98, 0x6a,
0xe2, 0x94, 0x95, 0xba, 0x2d, 0x65, 0x7d, 0x0c, 0x50, 0x9f, 0x78, 0x61, 0xf4, 0x10, 0xdf, 0x21,
0xa6, 0xca, 0xd8, 0x83, 0x2a, 0x55, 0xc6, 0x08, 0x2c, 0xdd, 0x0c, 0x69, 0x39, 0xd7, 0xbc, 0x23,
0x00, 0xfa, 0x13, 0x28, 0x3d, 0xf0, 0x07, 0x03, 0x2f, 0x6a, 0x8d, 0xcf, 0xdb, 0x01, 0x63, 0x18,
0xf0, 0x3d, 0xe6, 0x5d, 0xf6, 0x22, 0x99, 0xfb, 0x24, 0x84, 0xfd, 0x68, 0x4f, 0xbd, 0xaa, 0xa2,
0xc3, 0xbf, 0xe9, 0x27, 0xb0, 0x62, 0x1c, 0x0e, 0xc9, 0xdb, 0x90, 0x0f, 0xe5, 0xb7, 0xec, 0x87,
0x55, 0xa1, 0x37, 0x08, 0x9d, 0x98, 0x8a, 0xfe, 0xd3, 0x82, 0xb2, 0xf8, 0x1b, 0xc2, 0xad, 0xc8,
0x8d, 0xc6, 0x21, 0x79, 0xc7, 0x60, 0x83, 0x46, 0x78, 0x69, 0x11, 0x9b, 0x30, 0xe1, 0x83, 0xe1,
0x10, 0x8e, 0xcf, 0x8f, 0x98, 0x7b, 0xc5, 0xc2, 0x16, 0x7b, 0xc2, 0xf5, 0xcc, 0x38, 0x06, 0x8e,
0x87, 0x43, 0xd0, 0xe9, 0x79, 0x57, 0x3c, 0x42, 0x38, 0x99, 0x28, 0x57, 0xb3, 0x68, 0xb3, 0xea,
0xd8, 0xb7, 0x54, 0x9d, 0xcc, 0x5c, 0xd5, 0xa1, 0x53, 0xb8, 0xeb, 0x60, 0xf3, 0x35, 0x8a, 0xe6,
0xee, 0xb6, 0x0b, 0xf6, 0x28, 0x60, 0x57, 0xf2, 0x5e, 0x77, 0x8d, 0x7b, 0x25, 0x64, 0x0e, 0x27,
0x22, 0xef, 0x40, 0xae, 0x33, 0x0e, 0x02, 0x26, 0x33, 0xe5, 0x0d, 0xf4, 0x8a, 0x8e, 0x7e, 0x04,
0x1b, 0x86, 0xe8, 0x96, 0xb2, 0x00, 0x29, 0x43, 0x3a, 0x64, 0x4f, 0xa4, 0x5f, 0xf1, 0x13, 0x9d,
0xda, 0x67, 0xee, 0x85, 0x7c, 0x14, 0xfc, 0x9b, 0x7e, 0x08, 0x2f, 0xcd, 0x9e, 0xe7, 0x66, 0x59,
0x7c, 0x3c, 0xf0, 0x7d, 0x95, 0xc4, 0xf9, 0x37, 0xed, 0xc2, 0xba, 0x3c, 0x5e, 0x15, 0x36, 0x95,
0xc2, 0xd7, 0x21, 0xd3, 0xe1, 0x79, 0x54, 0x9c, 0x17, 0x00, 0x6f, 0x4c, 0xd5, 0x03, 0x56, 0x8d,
0xa9, 0x7a, 0xbc, 0x9b, 0x90, 0xef, 0xbb, 0x61, 0x74, 0x84, 0x0a, 0x8a, 0xd7, 0x18, 0xc3, 0xf4,
0x20, 0xbe, 0xa4, 0x94, 0xd2, 0x96, 0xcf, 0x5e, 0xd7, 0xd2, 0x16, 0x5a, 0xde, 0x20, 0x83, 0xee,
0xe8, 0xc1, 0x27, 0x35, 0xdd, 0x80, 0x6c, 0x9f, 0x7f, 0xf1, 0x08, 0x2e, 0x3a, 0x12, 0xa2, 0x6f,
0xc0, 0x6a, 0x42, 0x2b, 0x4c, 0xb2, 0x0e, 0x19, 0x64, 0xa5, 0x28, 0x05, 0x40, 0xff, 0x68, 0xe9,
0x94, 0xa7, 0x81, 0x7f, 0xc5, 0x0c, 0x25, 0xac, 0xf9, 0x8b, 0xf2, 0xe7, 0xdc, 0xe2, 0x4d, 0x3e,
0x0e, 0x84, 0x31, 0x8c, 0x03, 0xdd, 0x48, 0xbc, 0xfa, 0x2e, 0x9b, 0x70, 0x33, 0x94, 0x1c, 0x0d,
0x23, 0xde, 0xfc, 0x40, 0x68, 0xce, 0x03, 0xb5, 0xe4, 0x24, 0x08, 0x1c, 0x2b, 0x7a, 0xac, 0x3f,
0x62, 0x41, 0x58, 0xc9, 0x6c, 0xa5, 0xb7, 0x4b, 0x8e, 0x02, 0xe9, 0x9f, 0x2d, 0x58, 0x46, 0xed,
0x78, 0x36, 0x99, 0x31, 0xd2, 0x02, 0xfd, 0x30, 0x32, 0x74, 0x03, 0x2a, 0xd8, 0x7c, 0x28, 0xe9,
0x5b, 0x1e, 0x8a, 0x3d, 0xdf, 0x9e, 0xbd, 0x0a, 0xc0, 0xe5, 0x88, 0x94, 0x93, 0xe1, 0x5e, 0xd3,
0x30, 0xf4, 0x75, 0x28, 0x72, 0xd7, 0x78, 0x61, 0xe4, 0xb0, 0x70, 0x34, 0xe3, 0x9c, 0x42, 0xec,
0x9c, 0x7b, 0x50, 0x44, 0x97, 0xc4, 0x74, 0x86, 0x67, 0x0a, 0xca, 0x33, 0x1f, 0xc0, 0xb2, 0xca,
0x40, 0x92, 0xd9, 0xad, 0xb9, 0xae, 0x20, 0x73, 0xdd, 0x6f, 0x2c, 0x58, 0xd1, 0x9e, 0x1b, 0x1e,
0x9f, 0x4d, 0x39, 0xd6, 0xb3, 0xa5, 0x9c, 0xd4, 0xe2, 0x94, 0xb3, 0xa7, 0xe5, 0x3c, 0x73, 0x3c,
0xd0, 0x54, 0xd6, 0x12, 0xe7, 0x11, 0xac, 0x24, 0x43, 0xe9, 0xa9, 0xeb, 0x05, 0xdc, 0x96, 0x62,
0xe2, 0x4b, 0xe6, 0x48, 0x0d, 0x83, 0x7e, 0x0c, 0xb1, 0x34, 0x25, 0x65, 0x30, 0x86, 0x31, 0x95,
0xd7, 0xe3, 0x35, 0x01, 0xe7, 0x86, 0x23, 0x69, 0xe0, 0x5d, 0xe9, 0x23, 0xa9, 0x00, 0xd1, 0x6c,
0x23, 0xbd, 0x98, 0x4a, 0x88, 0xfe, 0xdc, 0x82, 0xb5, 0x6a, 0x87, 0x3f, 0xec, 0xd3, 0xc0, 0xbb,
0x72, 0x3b, 0x7c, 0xe2, 0x7e, 0xcf, 0x98, 0xaa, 0xcd, 0x6c, 0x6e, 0x5e, 0xc0, 0x98, 0xab, 0xdf,
0x33, 0x36, 0x19, 0x29, 0xe3, 0x98, 0xa9, 0xa9, 0xb1, 0xe0, 0xf8, 0x1a, 0xd6, 0x1e, 0xb9, 0xfd,
0x3e, 0x8b, 0xaa, 0xdd, 0x6e, 0x20, 0xb5, 0x20, 0xfb, 0xe2, 0x2a, 0x6e, 0x47, 0xc9, 0x57, 0xbd,
0xf1, 0x9c, 0xb6, 0x8e, 0x22, 0x8c, 0xf7, 0x2f, 0xa9, 0x64, 0xff, 0x42, 0xff, 0x63, 0x01, 0x88,
0x71, 0xb5, 0xe6, 0x46, 0xee, 0xec, 0x3a, 0xc6, 0x9a, 0x5f, 0xc7, 0xbc, 0x02, 0x05, 0x31, 0x67,
0x27, 0xc6, 0x4a, 0x10, 0x18, 0x3f, 0x71, 0xcf, 0x90, 0xac, 0x6b, 0x0c, 0xdc, 0x75, 0xfd, 0x27,
0xfa, 0x1a, 0xdb, 0x2d, 0xc7, 0x1d, 0x76, 0xfd, 0x81, 0xac, 0x40, 0x1a, 0xc6, 0x7c, 0x97, 0xd9,
0x5b, 0xde, 0x65, 0x6e, 0xbe, 0x80, 0xd5, 0x61, 0x4d, 0x5a, 0x59, 0xbb, 0x70, 0xb2, 0x8b, 0xb0,
0xf4, 0x5d, 0x84, 0xbe, 0xbd, 0x48, 0x19, 0xdb, 0x0b, 0xfa, 0x0d, 0xac, 0xd5, 0xd8, 0xb3, 0xb2,
0xc1, 0xb8, 0x0a, 0x3c, 0x3d, 0xae, 0x38, 0xa4, 0xb3, 0x4f, 0x9b, 0xec, 0x7f, 0x67, 0xc1, 0xb2,
0x1c, 0x3d, 0x78, 0x73, 0x75, 0x0f, 0x4a, 0xca, 0xfc, 0xe8, 0xff, 0x50, 0x0a, 0x30, 0x91, 0xe2,
0x9d, 0xa0, 0x13, 0xaa, 0x89, 0x83, 0x35, 0x8c, 0xd1, 0x0b, 0x72, 0x92, 0xd9, 0x5e, 0x90, 0x53,
0x55, 0x20, 0x27, 0x7c, 0x11, 0x4a, 0xd7, 0x28, 0x90, 0xb6, 0xa1, 0x28, 0x95, 0x6a, 0x4f, 0x30,
0xb7, 0xfe, 0x38, 0x19, 0x04, 0x2d, 0xa3, 0xa3, 0xd3, 0x54, 0x4f, 0x26, 0xc0, 0x0d, 0xc8, 0x7e,
0xfb, 0xf8, 0xd4, 0x8d, 0x54, 0xfa, 0x91, 0x10, 0xfd, 0x95, 0x05, 0x65, 0x35, 0x66, 0x61, 0xfe,
0xe7, 0x29, 0xe8, 0xa6, 0x2e, 0xfc, 0x0d, 0xb3, 0x8d, 0x54, 0xcd, 0x66, 0xe2, 0x08, 0xb5, 0xbe,
0x79, 0xde, 0xe5, 0x8c, 0x07, 0x25, 0x5e, 0xd8, 0xdc, 0xa8, 0xc7, 0x35, 0x79, 0xa6, 0x56, 0x7c,
0x13, 0x07, 0x54, 0x71, 0x48, 0x15, 0x39, 0x05, 0xeb, 0x65, 0x2a, 0x6d, 0x96, 0xa9, 0x4b, 0x28,
0xa9, 0x79, 0x50, 0xd8, 0x72, 0x0b, 0x96, 0x23, 0x3f, 0x72, 0xfb, 0x62, 0x3c, 0x90, 0x65, 0x5e,
0x47, 0xf1, 0x8a, 0x28, 0x4d, 0x10, 0xaa, 0x37, 0x17, 0x23, 0x34, 0xeb, 0xa6, 0x0d, 0xeb, 0x7a,
0x50, 0xc0, 0x29, 0x43, 0x08, 0xb9, 0xc9, 0xaa, 0xfa, 0x48, 0xd1, 0xf6, 0xb5, 0xf0, 0x98, 0x45,
0x6b, 0xa2, 0x6c, 0x43, 0xd4, 0x67, 0x40, 0x8c, 0xc9, 0x51, 0xc8, 0x34, 0xd4, 0xb6, 0xae, 0x57,
0xdb, 0x0c, 0x8a, 0xaf, 0xe1, 0x8e, 0x39, 0xa2, 0xbd, 0xc8, 0x88, 0x8b, 0xd0, 0xcf, 0x82, 0xb9,
0x60, 0xfb, 0x16, 0x64, 0xf8, 0x76, 0x4a, 0x32, 0x55, 0x8b, 0x82, 0xf9, 0xdb, 0x38, 0x82, 0x8e,
0xec, 0xc7, 0x4b, 0x2c, 0x11, 0x83, 0x9b, 0x33, 0x27, 0x34, 0x9d, 0xd5, 0x32, 0x8b, 0xee, 0x40,
0xb1, 0xa5, 0x4d, 0x80, 0xa4, 0x08, 0xd6, 0x17, 0xd2, 0x20, 0xd6, 0x17, 0x08, 0x7d, 0x29, 0xd5,
0xb4, 0xbe, 0xa4, 0xbf, 0x4c, 0xc1, 0xaa, 0x4e, 0xec, 0x84, 0x7c, 0x2e, 0xe4, 0xc2, 0x45, 0x22,
0x54, 0x0d, 0x80, 0x81, 0x43, 0x1a, 0x21, 0x4d, 0xe6, 0x4f, 0xc1, 0xd0, 0xc0, 0x21, 0x8d, 0x58,
0x99, 0x49, 0x1a, 0x99, 0x9d, 0x75, 0x1c, 0xd9, 0x8d, 0x17, 0x7a, 0x62, 0xbd, 0xa5, 0xd6, 0xd5,
0x86, 0x4e, 0x6a, 0xa3, 0xb7, 0x1b, 0x1b, 0x43, 0x2c, 0x68, 0x16, 0x13, 0xcb, 0x95, 0xde, 0x6e,
0xbc, 0xd2, 0xcb, 0xde, 0x40, 0x2c, 0x77, 0x7a, 0xff, 0xb0, 0x60, 0xe5, 0x41, 0xc0, 0x5c, 0xcc,
0xfe, 0x4f, 0xe3, 0x10, 0x16, 0x3f, 0x80, 0xb4, 0xd5, 0x12, 0x2b, 0x86, 0xb1, 0xb4, 0xf1, 0x1f,
0x2c, 0x6c, 0x31, 0xca, 0xe1, 0xb7, 0x59, 0x2f, 0x52, 0xb7, 0xd4, 0x8b, 0xf4, 0x7c, 0x1f, 0xb7,
0x0e, 0x99, 0xc8, 0x8b, 0xfa, 0x4c, 0xd6, 0x1a, 0x01, 0xa8, 0x1e, 0x02, 0x0b, 0x6f, 0x8e, 0x2b,
0x11, 0x97, 0xd7, 0x0d, 0xc8, 0x8a, 0xa5, 0x7c, 0x25, 0x2f, 0x5a, 0x2f, 0x01, 0xd1, 0x87, 0x7a,
0x57, 0x13, 0xe2, 0x4d, 0xae, 0xef, 0x43, 0x16, 0x94, 0x68, 0xe4, 0xdb, 0x65, 0x91, 0xeb, 0x09,
0x25, 0x33, 0x8e, 0x84, 0xe8, 0x6f, 0x53, 0xb0, 0x22, 0x1a, 0x83, 0xa6, 0x1f, 0xf1, 0xae, 0xf7,
0xc6, 0x57, 0x6e, 0x8c, 0xd2, 0xa9, 0xd9, 0x51, 0xfa, 0x79, 0x97, 0x48, 0x73, 0xcb, 0x05, 0x7b,
0xd1, 0x72, 0x01, 0x0b, 0x8a, 0xe8, 0x47, 0x64, 0x3d, 0x57, 0x20, 0x79, 0x13, 0xb2, 0x21, 0x6f,
0x3b, 0xb9, 0x75, 0x93, 0xbd, 0x01, 0x5e, 0x45, 0xf6, 0xa3, 0x92, 0x80, 0x93, 0x8a, 0xda, 0x9a,
0xbb, 0x2e, 0xeb, 0xab, 0x5f, 0x10, 0x1e, 0xc2, 0xaa, 0xb0, 0x48, 0xed, 0xfc, 0xd8, 0x9b, 0x70,
0x93, 0xbc, 0x09, 0xb6, 0x37, 0xbc, 0xf0, 0x67, 0xba, 0x34, 0xd3, 0x6e, 0x0e, 0x27, 0x41, 0x6d,
0xa3, 0x89, 0x98, 0x4a, 0x64, 0xcd, 0x97, 0x20, 0xfd, 0x75, 0x4a, 0xf5, 0x60, 0x9c, 0x6d, 0x97,
0xdd, 0x9a, 0x53, 0xff, 0xbf, 0xac, 0xbd, 0x61, 0x58, 0x3b, 0x13, 0x9b, 0x36, 0x9e, 0x60, 0x73,
0xfa, 0x04, 0xfb, 0x0a, 0x14, 0xba, 0x5e, 0xc0, 0xc4, 0x8f, 0x56, 0x22, 0x96, 0x13, 0x04, 0xfd,
0x50, 0x8f, 0x3a, 0x5e, 0xb1, 0x77, 0x21, 0x83, 0xf7, 0x56, 0xeb, 0x91, 0x6b, 0x6c, 0x2c, 0x68,
0xa8, 0x03, 0x1b, 0xe2, 0x0f, 0xf5, 0xa1, 0x7b, 0xde, 0x67, 0xb2, 0x4f, 0xc5, 0x2c, 0xb7, 0xe8,
0xe7, 0x41, 0x02, 0xb6, 0x17, 0x9e, 0x7c, 0x2e, 0x17, 0x3c, 0xfc, 0x1b, 0xc7, 0xe1, 0x41, 0x78,
0x29, 0xad, 0x85, 0x9f, 0xb4, 0x09, 0x77, 0x17, 0xf1, 0x44, 0xdd, 0xee, 0x43, 0x26, 0x60, 0xe1,
0x48, 0xe9, 0xf6, 0x03, 0x43, 0xb7, 0x59, 0x15, 0x1c, 0x41, 0x4b, 0x9b, 0x00, 0x47, 0x7e, 0xc7,
0xed, 0x1f, 0x7b, 0x93, 0xf6, 0x24, 0x1e, 0x9d, 0xac, 0x64, 0x74, 0xd2, 0xc6, 0x2c, 0xd4, 0x2c,
0x1d, 0x8f, 0x59, 0xeb, 0x58, 0x4e, 0xd4, 0x58, 0x9b, 0x76, 0x04, 0x40, 0xff, 0x60, 0x41, 0x91,
0xf3, 0x12, 0xb3, 0xdc, 0x13, 0x3d, 0xd2, 0x2c, 0x23, 0xd2, 0x16, 0xcd, 0x69, 0x9a, 0xb0, 0xf4,
0x62, 0x61, 0xb6, 0x26, 0x2c, 0xf1, 0x69, 0xe6, 0x5a, 0x9f, 0x66, 0x67, 0x7d, 0xfa, 0x2e, 0x94,
0x34, 0xfd, 0xc2, 0x11, 0x79, 0x0d, 0xd2, 0xd1, 0x44, 0x19, 0x4d, 0x3d, 0xb8, 0xc4, 0x26, 0x0e,
0xfe, 0x95, 0x1e, 0xc3, 0x9a, 0xb4, 0x1d, 0x36, 0x07, 0x0e, 0x0b, 0xc7, 0xfd, 0xef, 0xe3, 0xc5,
0x06, 0xdc, 0x71, 0xd8, 0x93, 0xb9, 0xb0, 0xd8, 0x87, 0x5c, 0xc0, 0x59, 0x2b, 0x75, 0xd4, 0xa4,
0x33, 0x27, 0xdb, 0x51, 0x84, 0x3b, 0xdf, 0x00, 0x24, 0x0b, 0x48, 0xb2, 0x0c, 0xb9, 0x5a, 0xfd,
0xf4, 0xa4, 0xd5, 0x68, 0x97, 0x97, 0x48, 0x11, 0xf2, 0x8f, 0x1a, 0xed, 0xc3, 0x9a, 0x53, 0x7d,
0x54, 0xb6, 0xc8, 0x1a, 0x94, 0xda, 0x4e, 0xb5, 0xd9, 0x3a, 0xa8, 0x3b, 0x8d, 0xe6, 0xe9, 0x59,
0xbb, 0x9c, 0x22, 0x04, 0x56, 0x14, 0xea, 0xe4, 0xac, 0x8d, 0xb8, 0x34, 0x29, 0x41, 0xa1, 0x7a,
0xd6, 0x3e, 0x3c, 0x71, 0x1a, 0x5f, 0xd5, 0xcb, 0xf6, 0xce, 0xc7, 0xdc, 0x5c, 0xc9, 0xef, 0xbc,
0x04, 0x20, 0x2b, 0xe4, 0x95, 0x97, 0x48, 0x1e, 0x6c, 0x6c, 0xbb, 0xca, 0x16, 0xca, 0x95, 0x89,
0xbf, 0x9c, 0x42, 0xb9, 0x6d, 0xf9, 0x7b, 0x69, 0x39, 0xbd, 0xf3, 0x1a, 0x0f, 0x88, 0xf8, 0x57,
0x16, 0x92, 0x83, 0x74, 0xb5, 0xdb, 0x2d, 0x2f, 0x21, 0xa7, 0x1a, 0xeb, 0xb3, 0x88, 0x95, 0xad,
0x9d, 0x03, 0x80, 0x24, 0x1d, 0x92, 0x02, 0x64, 0xce, 0x9a, 0xb5, 0xfa, 0x41, 0x79, 0x09, 0x3f,
0x1f, 0x56, 0x8f, 0x1a, 0xb5, 0xb2, 0x85, 0xd2, 0xce, 0x5a, 0xf5, 0x5a, 0x39, 0x85, 0x27, 0x0f,
0x9c, 0x93, 0xaf, 0xea, 0xcd, 0x72, 0x1a, 0x85, 0x9d, 0x35, 0x25, 0x64, 0xef, 0x7c, 0x08, 0x2f,
0x1d, 0x7b, 0x13, 0x11, 0xf2, 0x0e, 0x0b, 0x3b, 0xee, 0x50, 0xb2, 0xcc, 0x83, 0xdd, 0xa8, 0x1d,
0xd5, 0x85, 0x55, 0x5a, 0x0f, 0xaa, 0xcd, 0x66, 0xa3, 0xf9, 0x69, 0xd9, 0x42, 0xe8, 0xa0, 0xd1,
0x6c, 0xb4, 0x0e, 0x91, 0xf1, 0xfe, 0x5f, 0x2d, 0x80, 0x81, 0x37, 0x51, 0x93, 0xe7, 0xbb, 0xb0,
0xfa, 0xe9, 0x0c, 0x9f, 0x92, 0xf4, 0x88, 0xc3, 0x9e, 0x34, 0xbd, 0xfe, 0x66, 0x39, 0x01, 0x5b,
0x51, 0xe0, 0x0d, 0x2f, 0xe9, 0x12, 0x79, 0x1b, 0x96, 0xc5, 0x11, 0xbc, 0xd1, 0x33, 0x9d, 0xf8,
0x08, 0x4a, 0x46, 0x2c, 0x90, 0xd5, 0x84, 0x88, 0x0f, 0x3d, 0x9b, 0x9b, 0x09, 0x62, 0x36, 0x6a,
0xe8, 0xd2, 0x79, 0x96, 0xff, 0x9b, 0xc4, 0xfd, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x88, 0x9b,
0x8d, 0x70, 0x5b, 0x21, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
......
......@@ -13,7 +13,9 @@ import (
"github.com/pkg/errors"
log "github.com/33cn/chain33/common/log/log15"
coins "github.com/33cn/chain33/system/dapp/coins/types"
"github.com/33cn/chain33/types"
token "github.com/33cn/plugin/plugin/dapp/token/types"
"github.com/consensys/gurvy/bn256/fr"
"github.com/consensys/gurvy/bn256/twistededwards"
)
......@@ -150,12 +152,12 @@ func MulCurvePointG(val interface{}) *twistededwards.Point {
return &point
}
func MulCurvePointH(val string) *twistededwards.Point {
func MulCurvePointH(pointHX, pointHY, val string) *twistededwards.Point {
v := fr.FromInterface(val)
var pointV, pointH twistededwards.Point
pointH.X.SetString(PointHX)
pointH.Y.SetString(PointHY)
pointH.X.SetString(pointHX)
pointH.Y.SetString(pointHY)
pointV.ScalarMul(&pointH, *v.FromMont())
return &pointV
......@@ -216,3 +218,25 @@ func GetFrRandom() string {
var f fr.Element
return f.SetRandom().String()
}
func GetAssetExecSymbol(cfg *types.Chain33Config, execer, symbol string) (string, string) {
if symbol == "" {
return coins.CoinsX, cfg.GetCoinSymbol()
}
if execer == "" {
return token.TokenX, symbol
}
return execer, symbol
}
func GetTransferTxFee(cfg *types.Chain33Config, assetExecer string) int64 {
conf := types.ConfSub(cfg, MixX)
txFee := conf.GInt("txFee")
tokenFee := conf.IsEnable("tokenFee")
//一切非coins的token资产 在tokenFee=false都不收txfee,特殊地址代扣
if assetExecer != coins.CoinsX && !tokenFee {
return 0
}
//tokenFee=true或者coins都按txfee数量收txFee
return txFee
}
......@@ -288,7 +288,7 @@ func (p *mixPolicy) rescanNotes() {
// 1 先获取隐私合约地址相关交易
var reqInfo mixTy.MixTxListReq
reqInfo.Direction = 0
reqInfo.Count = int32(MaxTxHashsPerTime)
reqInfo.Count = int32(maxTxHashsPerTime)
if i == 0 {
reqInfo.Height = -1
......@@ -327,7 +327,7 @@ func (p *mixPolicy) rescanNotes() {
}
p.processPrivcyTxs(&ReqHashes)
if txcount < int(MaxTxHashsPerTime) {
if txcount < int(maxTxHashsPerTime) {
break
}
}
......
......@@ -15,17 +15,17 @@ import (
"github.com/33cn/chain33/common/crypto"
"github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/common/log/log15"
coins "github.com/33cn/chain33/system/dapp/coins/types"
"github.com/33cn/chain33/types"
wcom "github.com/33cn/chain33/wallet/common"
mixTy "github.com/33cn/plugin/plugin/dapp/mix/types"
"github.com/pkg/errors"
)
var (
bizlog = log15.New("module", "wallet.mix")
// MaxTxHashsPerTime 单词处理的最大哈希书
MaxTxHashsPerTime int64 = 100
// maxTxNumPerBlock 单个区块最大数
maxTxNumPerBlock int64 = types.MaxTxsPerBlock
maxTxHashsPerTime int64 = 100
)
func init() {
......@@ -168,7 +168,10 @@ func (policy *mixPolicy) SignTransaction(key crypto.PrivKey, req *types.ReqSignR
}
if action.Ty == mixTy.MixActionTransfer {
// 隐私交易的私对私、私对公需要进行特殊签名
policy.signatureTx(tx, action.GetTransfer())
err = policy.signatureTx(tx, action.GetTransfer())
if err != nil {
return
}
} else {
tx.Sign(int32(policy.getWalletOperate().GetSignType()), key)
}
......@@ -178,14 +181,30 @@ func (policy *mixPolicy) SignTransaction(key crypto.PrivKey, req *types.ReqSignR
}
func (policy *mixPolicy) signatureTx(tx *types.Transaction, transfer *mixTy.MixTransferAction) error {
if len(transfer.AssetSymbol) == 0 || len(transfer.AssetExec) == 0 {
return errors.Wrapf(types.ErrInvalidParam, "asset exec or symbol need be fill")
}
//1.如果是coins 执行器,默认符号是BTY,扣mix执行器地址的手续费
//2.如果token执行器, 如果tokenFee=false,则不扣token,且不以token做交易费,需要从另一个特殊地址mixtoken扣bty交易费,chain33发交易费给mixtoken地址
// 不然从mix执行器扣交易费会导致基于coins的隐私余额 入账和出账不平
//3.如果配置项tokenFee=true 则从以token扣手续费,地址是mix执行器的token资产
cfg := policy.getWalletOperate().GetAPI().GetConfig()
conf := types.ConfSub(cfg, mixTy.MixX)
tokenFee := conf.IsEnable("tokenFee")
payFeeAddr := mixTy.MixX
if transfer.AssetExec != coins.CoinsX && !tokenFee {
payFeeAddr = mixTy.MixX + transfer.AssetExec + transfer.AssetSymbol
}
mixSignData := types.Encode(transfer)
tx.Fee = mixTy.Privacy2PrivacyTxFee
tx.Fee = conf.GInt("txFee")
tx.Signature = &types.Signature{
Ty: MixSignID,
Signature: common.BytesToHash(mixSignData).Bytes(),
// 这里填的是mix合约的公钥,让框架保持一致
Pubkey: address.ExecPubKey(cfg.ExecName(mixTy.MixX)),
Pubkey: address.ExecPubKey(payFeeAddr),
}
return nil
}
......@@ -112,7 +112,7 @@ func (p *mixPolicy) getAuthParms(req *mixTy.AuthTxReq) (*AuthorizeInput, error)
}
//get tree path
treeProof, err := p.getTreeProof(note.NoteHash)
treeProof, err := p.getTreeProof(note.Secret.AssetExec, note.Secret.AssetSymbol, note.NoteHash)
if err != nil {
return nil, errors.Wrapf(err, "getTreeProof for hash=%s", note.NoteHash)
}
......@@ -134,6 +134,10 @@ func (p *mixPolicy) createAuthTx(req *mixTy.CreateRawTxReq) (*types.Transaction,
return nil, err
}
if len(req.AssetExec) == 0 || len(req.AssetSymbol) == 0 {
return nil, errors.Wrapf(types.ErrInvalidParam, "asset exec=%s or symbol=%s not filled", req.AssetExec, req.AssetSymbol)
}
proofInfo, err := getZkProofKeys(auth.ZkPath+mixTy.AuthCircuit, auth.ZkPath+mixTy.AuthPk, *input, req.Privacy)
if err != nil {
return nil, errors.Wrapf(err, "getZkProofKeys note=%s", auth.NoteHash)
......@@ -143,12 +147,14 @@ func (p *mixPolicy) createAuthTx(req *mixTy.CreateRawTxReq) (*types.Transaction,
return nil, errors.Wrapf(err, "verifyProof fail for note=%s", auth.NoteHash)
}
return p.getAuthTx(strings.TrimSpace(req.Title+mixTy.MixX), proofInfo)
return p.getAuthTx(strings.TrimSpace(req.Title+mixTy.MixX), req.AssetExec, req.AssetSymbol, proofInfo)
}
func (p *mixPolicy) getAuthTx(execName string, proof *mixTy.ZkProofInfo) (*types.Transaction, error) {
func (p *mixPolicy) getAuthTx(execName string, exec, symbol string, proof *mixTy.ZkProofInfo) (*types.Transaction, error) {
payload := &mixTy.MixAuthorizeAction{}
payload.Proof = proof
payload.AssetExec = exec
payload.AssetSymbol = symbol
cfg := p.getWalletOperate().GetAPI().GetConfig()
action := &mixTy.MixAction{
......
......@@ -32,12 +32,17 @@ type DepositInput struct {
NoteRandom string `tag:"secret"`
}
func (p *mixPolicy) depositParams(receiver, returner, auth, amount string) (*mixTy.DepositProofResp, error) {
func (p *mixPolicy) depositParams(exec, symbol, receiver, returner, auth, amount string) (*mixTy.DepositProofResp, error) {
if len(receiver) > 0 && len(returner) > 0 && (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)
}
//deposit 产生的secret需要确定的资产符号
if len(exec) == 0 || len(symbol) == 0 {
return nil, errors.Wrapf(types.ErrInvalidParam, "asset exec=%s or symbol=%s not filled", exec, symbol)
}
if len(receiver) <= 0 {
return nil, errors.Wrap(types.ErrInvalidParam, "receiver is nil")
}
......@@ -49,6 +54,8 @@ func (p *mixPolicy) depositParams(receiver, returner, auth, amount string) (*mix
var secret mixTy.SecretData
secret.Amount = amount
secret.AssetExec = exec
secret.AssetSymbol = symbol
//1. nullifier 获取随机值
var fr fr_bn256.Element
......@@ -123,14 +130,15 @@ func (p *mixPolicy) depositParams(receiver, returner, auth, amount string) (*mix
secret.Amount,
secret.NoteRandom,
}
//exec,symbol没有计算进去,不然在电路中也要引入资产,noteRandom应该足够随机区分一个note了,不然Nullifier也要区分资产
resp.NoteHash = mixTy.Byte2Str(mimcHashString(keys))
return &resp, nil
}
func (p *mixPolicy) getDepositProof(receiver, returner, auth, amount, zkPath string, verifyOnChain, privacyPrint int32) (*mixTy.ZkProofInfo, error) {
func (p *mixPolicy) getDepositProof(exec, symbol, receiver, returner, auth, amount, zkPath string, verifyOnChain, privacyPrint int32) (*mixTy.ZkProofInfo, error) {
resp, err := p.depositParams(receiver, returner, auth, amount)
resp, err := p.depositParams(exec, symbol, receiver, returner, auth, amount)
if err != nil {
return nil, err
}
......@@ -180,20 +188,22 @@ func (p *mixPolicy) createDepositTx(req *mixTy.CreateRawTxReq) (*types.Transacti
var proofs []*mixTy.ZkProofInfo
for i, rcv := range receivers {
p, err := p.getDepositProof(rcv, deposit.Deposit.ReturnAddr, deposit.Deposit.AuthorizeAddr, amounts[i], deposit.ZkPath, req.Verify, req.Privacy)
p, err := p.getDepositProof(req.AssetExec, req.AssetSymbol, rcv, deposit.Deposit.ReturnAddr, deposit.Deposit.AuthorizeAddr, amounts[i], deposit.ZkPath, req.Verify, req.Privacy)
if err != nil {
return nil, errors.Wrapf(err, "get Deposit proof for=%s", rcv)
}
proofs = append(proofs, p)
}
return p.getDepositTx(strings.TrimSpace(req.Title+mixTy.MixX), proofs)
return p.getDepositTx(strings.TrimSpace(req.Title+mixTy.MixX), req.AssetExec, req.AssetSymbol, proofs)
}
func (p *mixPolicy) getDepositTx(execName string, proofs []*mixTy.ZkProofInfo) (*types.Transaction, error) {
func (p *mixPolicy) getDepositTx(execName string, assetExec, assetSymbol string, proofs []*mixTy.ZkProofInfo) (*types.Transaction, error) {
payload := &mixTy.MixDepositAction{}
payload.Proofs = proofs
payload.AssetExec = assetExec
payload.AssetSymbol = assetSymbol
cfg := p.getWalletOperate().GetAPI().GetConfig()
action := &mixTy.MixAction{
......
......@@ -132,7 +132,7 @@ func (p *mixPolicy) getTransferInputPart(note *mixTy.WalletNoteInfo) (*TransferI
input.AuthorizeFlag = "1"
}
treeProof, err := p.getTreeProof(note.NoteHash)
treeProof, err := p.getTreeProof(note.Secret.AssetExec, note.Secret.AssetSymbol, note.NoteHash)
if err != nil {
return nil, errors.Wrapf(err, "getTreeProof for hash=%s", note.NoteHash)
}
......@@ -142,13 +142,13 @@ func (p *mixPolicy) getTransferInputPart(note *mixTy.WalletNoteInfo) (*TransferI
return &input, nil
}
func (p *mixPolicy) getTransferOutput(req *mixTy.DepositInfo) (*TransferOutput, *mixTy.DHSecretGroup, error) {
func (p *mixPolicy) getTransferOutput(exec, symbol string, req *mixTy.DepositInfo) (*TransferOutput, *mixTy.DHSecretGroup, error) {
//目前只支持一个ReceiverAddr
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",
req.ReceiverAddrs, req.Amounts)
}
resp, err := p.depositParams(req.ReceiverAddrs, req.ReturnAddr, req.AuthorizeAddr, req.Amounts)
resp, err := p.depositParams(exec, symbol, req.ReceiverAddrs, req.ReturnAddr, req.AuthorizeAddr, req.Amounts)
if err != nil {
return nil, nil, errors.Wrapf(err, "deposit toAddr=%s", req.ReceiverAddrs)
}
......@@ -166,7 +166,7 @@ func (p *mixPolicy) getTransferOutput(req *mixTy.DepositInfo) (*TransferOutput,
}
//input = output+找零+交易费
func getShieldValue(inputAmounts []uint64, outAmount, change, minTxFee uint64) (*mixTy.ShieldAmountRst, error) {
func getShieldValue(cfg *types.Chain33Config, inputAmounts []uint64, outAmount, change, minTxFee uint64) (*mixTy.ShieldAmountRst, error) {
var sum uint64
for _, i := range inputAmounts {
sum += i
......@@ -227,13 +227,17 @@ func getShieldValue(inputAmounts []uint64, outAmount, change, minTxFee uint64) (
return nil, errors.Wrapf(types.ErrInvalidParam, "random sumIn=%s not equal sumOut=%s", rSumIn.String(), rSumOut.String())
}
conf := types.ConfSub(cfg, mixTy.MixX)
pointHX := conf.GStr("pointHX")
pointHY := conf.GStr("pointHY")
var inputHPoints []*twistededwards.Point
for _, i := range rInputs {
inputHPoints = append(inputHPoints, mixTy.MulCurvePointH(i.String()))
inputHPoints = append(inputHPoints, mixTy.MulCurvePointH(pointHX, pointHY, i.String()))
}
//noteH := mixTy.MulCurvePointH(rNote.String())
outH := mixTy.MulCurvePointH(rOut.String())
changeH := mixTy.MulCurvePointH(rChange.String())
outH := mixTy.MulCurvePointH(pointHX, pointHY, rOut.String())
changeH := mixTy.MulCurvePointH(pointHX, pointHY, rChange.String())
//fmt.Println("change",changeRandom.String())
//fmt.Println("transfer",transRandom.String())
//fmt.Println("note",noteRandom.String())
......@@ -275,6 +279,10 @@ func (p *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Transact
return nil, errors.Wrap(err, "decode req fail")
}
if len(req.AssetExec) == 0 || len(req.AssetSymbol) == 0 {
return nil, errors.Wrapf(types.ErrInvalidParam, "asset exec=%s or symbol=%s not filled", req.AssetExec, req.AssetSymbol)
}
noteHashs := strings.Split(transfer.GetInput().NoteHashs, ",")
var notes []*mixTy.WalletNoteInfo
for _, h := range noteHashs {
......@@ -285,6 +293,10 @@ func (p *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Transact
if note.Status != mixTy.NoteStatus_VALID && note.Status != mixTy.NoteStatus_UNFROZEN {
return nil, errors.Wrapf(types.ErrNotAllow, "wrong note status=%s", note.Status.String())
}
if note.Secret.AssetExec != req.AssetExec || note.Secret.AssetSymbol != req.AssetSymbol {
return nil, errors.Wrapf(types.ErrInvalidParam, "note=%s,exec=%s,sym=%s not equal req's exec=%s,symbol=%s",
h, note.Secret.AssetExec, note.Secret.AssetSymbol, req.AssetExec, req.AssetSymbol)
}
notes = append(notes, note)
}
......@@ -311,6 +323,12 @@ func (p *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Transact
}
//2. 获取output
//1.如果平行链,fee可以设为0
//2. 如果token,且不收token费,则txfee=0, 单纯扣特殊地址mixtoken的bty
//3. 如果token,且tokenFee=true,则按fee收token数量作为交易费
txFee := mixTy.GetTransferTxFee(p.walletOperate.GetAPI().GetConfig(), req.AssetExec)
outAmount, err := strconv.ParseUint(transfer.Output.Deposit.Amounts, 10, 64)
if err != nil {
return nil, errors.Wrapf(err, "output part parseUint=%s", transfer.Output.Deposit.Amounts)
......@@ -318,10 +336,10 @@ func (p *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Transact
if outAmount == 0 {
return nil, errors.Wrapf(err, "output part amount=0, parseUint=%s", transfer.Output.Deposit.Amounts)
}
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))
if sumInput < outAmount+uint64(txFee) {
return nil, errors.Wrapf(types.ErrInvalidParam, "out amount=%d big than input=%d - fee=%d", outAmount, sumInput, uint64(txFee))
}
outPart, outDHSecret, err := p.getTransferOutput(transfer.Output.Deposit)
outPart, outDHSecret, err := p.getTransferOutput(req.AssetExec, req.AssetSymbol, transfer.Output.Deposit)
if err != nil {
return nil, errors.Wrap(err, "getTransferOutput for deposit")
}
......@@ -330,19 +348,19 @@ func (p *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Transact
//3. 获取找零,并扣除手续费
//如果找零为0也需要设置,否则只有一个输入一个输出,H部分的随机数要相等,就能推测出转账值来
//在transfer output 部分特殊处理,如果amount是0的值则不加进tree
changeAmount := sumInput - outAmount - uint64(mixTy.Privacy2PrivacyTxFee)
changeAmount := sumInput - outAmount - uint64(txFee)
change := &mixTy.DepositInfo{
ReceiverAddrs: notes[0].Account,
Amounts: strconv.FormatUint(changeAmount, 10),
}
changePart, changeDHSecret, err := p.getTransferOutput(change)
changePart, changeDHSecret, err := p.getTransferOutput(req.AssetExec, req.AssetSymbol, change)
if err != nil {
return nil, errors.Wrap(err, "getTransferOutput change part ")
}
bizlog.Info("transferProof deposit to change succ")
//获取shieldValue 输入输出对amount隐藏
shieldValue, err := getShieldValue(inputAmounts, outAmount, changeAmount, uint64(mixTy.Privacy2PrivacyTxFee))
shieldValue, err := getShieldValue(p.walletOperate.GetAPI().GetConfig(), inputAmounts, outAmount, changeAmount, uint64(txFee))
if err != nil {
return nil, err
}
......@@ -396,14 +414,16 @@ func (p *mixPolicy) createTransferTx(req *mixTy.CreateRawTxReq) (*types.Transact
}
changeProof.Secrets = changeDHSecret
return p.getTransferTx(strings.TrimSpace(req.Title+mixTy.MixX), inputProofs, outputProof, changeProof)
return p.getTransferTx(strings.TrimSpace(req.Title+mixTy.MixX), req.AssetExec, req.AssetSymbol, inputProofs, outputProof, changeProof)
}
func (p *mixPolicy) getTransferTx(execName string, inputProofs []*mixTy.ZkProofInfo, proofs ...*mixTy.ZkProofInfo) (*types.Transaction, error) {
func (p *mixPolicy) getTransferTx(execName, assetExec, assetSymbol string, inputProofs []*mixTy.ZkProofInfo, output, change *mixTy.ZkProofInfo) (*types.Transaction, error) {
payload := &mixTy.MixTransferAction{}
payload.AssetExec = assetExec
payload.AssetSymbol = assetSymbol
payload.Inputs = inputProofs
payload.Output = proofs[0]
payload.Change = proofs[1]
payload.Output = output
payload.Change = change
cfg := p.getWalletOperate().GetAPI().GetConfig()
action := &mixTy.MixAction{
......
......@@ -67,7 +67,7 @@ type WithdrawInput struct {
Valid9 string `tag:"secret"`
}
func (p *mixPolicy) getWithdrawParams(noteHash string) (*WithdrawInput, error) {
func (p *mixPolicy) getWithdrawParams(exec, symbol, noteHash string) (*WithdrawInput, error) {
note, err := p.getNoteInfo(noteHash)
if err != nil {
return nil, err
......@@ -76,6 +76,11 @@ func (p *mixPolicy) getWithdrawParams(noteHash string) (*WithdrawInput, error) {
return nil, errors.Wrapf(types.ErrNotAllow, "wrong note status=%s", note.Status.String())
}
if note.Secret.AssetExec != exec || note.Secret.AssetSymbol != symbol {
return nil, errors.Wrapf(types.ErrInvalidParam, "exec=%s,sym=%s not equal req's exec=%s,symbol=%s",
note.Secret.AssetExec, note.Secret.AssetSymbol, exec, symbol)
}
var input WithdrawInput
initTreePath(&input)
input.NullifierHash = note.Nullifier
......@@ -105,7 +110,7 @@ func (p *mixPolicy) getWithdrawParams(noteHash string) (*WithdrawInput, error) {
}
//get tree path
treeProof, err := p.getTreeProof(note.NoteHash)
treeProof, err := p.getTreeProof(note.Secret.AssetExec, note.Secret.AssetSymbol, note.NoteHash)
if err != nil {
return nil, errors.Wrapf(err, "getTreeProof for hash=%s", note.NoteHash)
}
......@@ -122,6 +127,11 @@ func (p *mixPolicy) createWithdrawTx(req *mixTy.CreateRawTxReq) (*types.Transact
if err != nil {
return nil, errors.Wrap(err, "decode req fail")
}
if len(req.AssetExec) == 0 || len(req.AssetSymbol) == 0 {
return nil, errors.Wrapf(types.ErrInvalidParam, "asset exec=%s or symbol=%s not filled", req.AssetExec, req.AssetSymbol)
}
if withdraw.TotalAmount <= 0 {
return nil, errors.Wrapf(types.ErrInvalidParam, "totalAmount=%d", withdraw.TotalAmount)
}
......@@ -134,7 +144,7 @@ func (p *mixPolicy) createWithdrawTx(req *mixTy.CreateRawTxReq) (*types.Transact
var sum uint64
for _, note := range notes {
input, err := p.getWithdrawParams(note)
input, err := p.getWithdrawParams(req.AssetExec, req.AssetSymbol, note)
if err != nil {
return nil, errors.Wrapf(err, "getWithdrawParams note=%s", note)
}
......@@ -161,12 +171,14 @@ func (p *mixPolicy) createWithdrawTx(req *mixTy.CreateRawTxReq) (*types.Transact
return nil, errors.Wrapf(types.ErrInvalidParam, "amount not match req=%d,note.sum=%d", withdraw.TotalAmount, sum)
}
return p.getWithdrawTx(strings.TrimSpace(req.Title+mixTy.MixX), withdraw.TotalAmount, proofs)
return p.getWithdrawTx(strings.TrimSpace(req.Title+mixTy.MixX), req.AssetExec, req.AssetSymbol, withdraw.TotalAmount, proofs)
}
func (p *mixPolicy) getWithdrawTx(execName string, amount uint64, proofs []*mixTy.ZkProofInfo) (*types.Transaction, error) {
func (p *mixPolicy) getWithdrawTx(execName, assetExec, assetSymbol string, amount uint64, proofs []*mixTy.ZkProofInfo) (*types.Transaction, error) {
payload := &mixTy.MixWithdrawAction{}
payload.AssetExec = assetExec
payload.AssetSymbol = assetSymbol
payload.Amount = amount
payload.Proofs = proofs
......
......@@ -127,11 +127,11 @@ func (p *mixPolicy) getPaymentKey(addr string) (*mixTy.PaymentKey, error) {
return msg.(*mixTy.PaymentKey), err
}
func (p *mixPolicy) getPathProof(leaf string) (*mixTy.CommitTreeProve, error) {
func (p *mixPolicy) getPathProof(exec, symbol, leaf string) (*mixTy.CommitTreeProve, error) {
msg, err := p.walletOperate.GetAPI().QueryChain(&types.ChainExecutor{
Driver: "mix",
FuncName: "GetTreePath",
Param: types.Encode(&mixTy.TreeInfoReq{LeafHash: leaf}),
Param: types.Encode(&mixTy.TreeInfoReq{AssetExec: exec, AssetSymbol: symbol, LeafHash: leaf}),
})
if err != nil {
return nil, err
......@@ -160,11 +160,11 @@ func (p *mixPolicy) getNoteInfo(noteHash string) (*mixTy.WalletNoteInfo, error)
return note, nil
}
func (p *mixPolicy) getTreeProof(leaf string) (*mixTy.TreePathProof, error) {
func (p *mixPolicy) getTreeProof(exec, symbol, leaf string) (*mixTy.TreePathProof, error) {
//get tree path
path, err := p.getPathProof(leaf)
path, err := p.getPathProof(exec, symbol, leaf)
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,exec=%s,symbol=%s", leaf, exec, symbol)
}
var proof mixTy.TreePathProof
proof.TreePath = path.ProofSet[1:]
......
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