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

commit tree improve

parent f9c75bbd
#!/usr/bin/env bash
#1ks returner
#1ks returner chain31
MIX_CLI1="docker exec ${NODE1} /root/chain33-cli "
#1jr authorize
#1jr authorize chain32
MIX_CLI2="docker exec ${NODE2} /root/chain33-cli "
#1nl receiver
#1nl receiver chain30
MIX_CLI3="docker exec ${NODE4} /root/chain33-cli "
xsedfix=""
......
......@@ -202,6 +202,7 @@ func QueryCmd() *cobra.Command {
cmd.AddCommand(GetTreePathCmd())
cmd.AddCommand(GetTreeLeavesCmd())
cmd.AddCommand(GetTreeRootsCmd())
cmd.AddCommand(GetTreeStatusCmd())
cmd.AddCommand(ShowMixTxsCmd())
cmd.AddCommand(ShowPaymentPubKeyCmd())
return cmd
......@@ -267,7 +268,7 @@ func treeLeaves(cmd *cobra.Command, args []string) {
var params rpctypes.Query4Jrpc
params.Execer = mixTy.MixX
params.FuncName = "Query_GetLeavesList"
params.FuncName = "GetLeavesList"
req := mixTy.TreeInfoReq{
RootHash: root,
}
......@@ -285,20 +286,52 @@ func GetTreeRootsCmd() *cobra.Command {
Short: "Get archive roots",
Run: treeRoot,
}
//addGetPathCmdFlags(cmd)
addGetRootsflags(cmd)
return cmd
}
func addGetRootsflags(cmd *cobra.Command) {
cmd.Flags().Int64P("seq", "s", 0, "sequence, default 0 is for current status")
cmd.MarkFlagRequired("seq")
}
func treeRoot(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
seq, _ := cmd.Flags().GetInt64("seq")
var params rpctypes.Query4Jrpc
params.Execer = mixTy.MixX
params.FuncName = "GetRootList"
params.Payload = types.MustPBToJSON(&types.ReqInt{Height: seq})
var res mixTy.RootListResp
ctx := jsonclient.NewRPCCtx(rpcLaddr, "Chain33.Query", params, &res)
ctx.Run()
}
// GetTreeStatusCmd get commit leaves tree status
func GetTreeStatusCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "status",
Short: "Get commit leaves tree status",
Run: treeStatus,
}
//addGetRootsflags(cmd)
return cmd
}
func treeStatus(cmd *cobra.Command, args []string) {
rpcLaddr, _ := cmd.Flags().GetString("rpc_laddr")
var params rpctypes.Query4Jrpc
params.Execer = mixTy.MixX
params.FuncName = "GetTreeStatus"
params.Payload = types.MustPBToJSON(&types.ReqNil{})
var res mixTy.TreeListResp
var res mixTy.TreeStatusResp
ctx := jsonclient.NewRPCCtx(rpcLaddr, "Chain33.Query", params, &res)
ctx.Run()
}
......
......@@ -7,8 +7,6 @@ package executor
import (
"github.com/33cn/chain33/account"
"github.com/33cn/chain33/client"
"github.com/consensys/gurvy/bn256/fr"
dbm "github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/system/dapp"
......@@ -80,15 +78,3 @@ func makeReceipt(key []byte, logTy int32, data proto.Message) *types.Receipt {
},
}
}
func transferFr2Bytes(v string) []byte {
var leaf fr.Element
leaf.SetString(v)
return leaf.Bytes()
}
func transferFr2String(val []byte) string {
var leaf fr.Element
leaf.SetBytes(val)
return leaf.String()
}
......@@ -17,13 +17,17 @@ import (
func (a *action) authParamCheck(input *mixTy.AuthorizePublicInput) error {
//check tree rootHash exist
if !checkTreeRootHashExist(a.db, transferFr2Bytes(input.TreeRootHash)) {
exist, err := checkTreeRootHashExist(a.db, mixTy.Str2Byte(input.TreeRootHash))
if err != nil {
return errors.Wrapf(err, "roothash=%s not found", input.TreeRootHash)
}
if !exist {
return errors.Wrapf(mixTy.ErrTreeRootHashNotFound, "roothash=%s", input.TreeRootHash)
}
//authorize key should not exist
authKey := calcAuthorizeHashKey(input.AuthorizeHash)
_, err := a.db.Get(authKey)
_, err = a.db.Get(authKey)
if err == nil {
return errors.Wrapf(mixTy.ErrAuthorizeHashExist, "auth=%s", input.AuthorizeHash)
}
......
......@@ -6,37 +6,17 @@ package executor
import (
"bytes"
"encoding/hex"
dbm "github.com/33cn/chain33/common/db"
"github.com/33cn/chain33/types"
"github.com/33cn/plugin/plugin/dapp/mix/executor/merkletree"
mixTy "github.com/33cn/plugin/plugin/dapp/mix/types"
"github.com/consensys/gnark/crypto/hash/mimc/bn256"
"github.com/golang/protobuf/proto"
"github.com/pkg/errors"
)
func makeTreeLeavesReceipt(data *mixTy.CommitTreeLeaves) *types.Receipt {
return makeReceipt(calcCurrentCommitLeavesKey(), mixTy.TyLogCurrentCommitTreeLeaves, data)
}
func makeTreeRootsReceipt(data *mixTy.CommitTreeRoots) *types.Receipt {
return makeReceipt(calcCurrentCommitRootsKey(), mixTy.TyLogCurrentCommitTreeRoots, data)
}
func makeCurrentTreeReceipt(leaves *mixTy.CommitTreeLeaves, roots *mixTy.CommitTreeRoots) *types.Receipt {
r1 := makeTreeLeavesReceipt(leaves)
r2 := makeTreeRootsReceipt(roots)
return mergeReceipt(r1, r2)
}
func makeTreeRootLeavesReceipt(root string, data *mixTy.CommitTreeLeaves) *types.Receipt {
return makeReceipt(calcCommitTreeRootLeaves(root), mixTy.TyLogCommitTreeRootLeaves, data)
}
func makeTreeArchiveRootsReceipt(data *mixTy.CommitTreeRoots) *types.Receipt {
return makeReceipt(calcCommitTreeArchiveRootsKey(), mixTy.TyLogCommitTreeArchiveRoots, data)
}
func getCommitLeaves(db dbm.KV, key []byte) (*mixTy.CommitTreeLeaves, error) {
v, err := db.Get(key)
if err != nil {
......@@ -51,8 +31,38 @@ func getCommitLeaves(db dbm.KV, key []byte) (*mixTy.CommitTreeLeaves, error) {
return &leaves, nil
}
func getCurrentCommitTreeLeaves(db dbm.KV) (*mixTy.CommitTreeLeaves, error) {
return getCommitLeaves(db, calcCurrentCommitLeavesKey())
func getCommitTreeStatus(db dbm.KV) (*mixTy.CommitTreeStatus, error) {
v, err := db.Get(calcCommitTreeCurrentStatusKey())
if isNotFound(err) {
//系统初始化开始,没有任何状态,初始seq设为1,如果一个merkle树完成后,status清空状态,seq也要初始为1,作为数据库占位,不然会往前查找
return &mixTy.CommitTreeStatus{
SubTrees: &mixTy.CommitSubTrees{},
ArchiveRootsSeq: 1}, nil
}
if err != nil {
return nil, errors.Wrapf(err, "db.getCommitTreeStatus")
}
var status mixTy.CommitTreeStatus
err = types.Decode(v, &status)
if err != nil {
return nil, errors.Wrapf(err, "db.decode CommitTreeStatus")
}
return &status, nil
}
func getSubLeaves(db dbm.KV, currentSeq int32) (*mixTy.CommitTreeLeaves, error) {
var leaves mixTy.CommitTreeLeaves
for i := int32(1); i <= currentSeq; i++ {
l, err := getCommitLeaves(db, calcSubLeavesKey(i))
if err != nil {
return nil, errors.Wrapf(err, "getSubLeaves seq=%d", i)
}
leaves.Leaves = append(leaves.Leaves, l.Leaves...)
}
return &leaves, nil
}
func getCommitRootLeaves(db dbm.KV, rootHash string) (*mixTy.CommitTreeLeaves, error) {
......@@ -73,14 +83,15 @@ func getCommitTreeRoots(db dbm.KV, key []byte) (*mixTy.CommitTreeRoots, error) {
return &roots, nil
}
func getCurrentCommitTreeRoots(db dbm.KV) (*mixTy.CommitTreeRoots, error) {
return getCommitTreeRoots(db, calcCurrentCommitRootsKey())
func getSubRoots(db dbm.KV, seq int32) (*mixTy.CommitTreeRoots, error) {
return getCommitTreeRoots(db, calcSubRootsKey(seq))
}
func getArchiveCommitRoots(db dbm.KV) (*mixTy.CommitTreeRoots, error) {
return getCommitTreeRoots(db, calcCommitTreeArchiveRootsKey())
func getArchiveRoots(db dbm.KV, seq uint64) (*mixTy.CommitTreeRoots, error) {
return getCommitTreeRoots(db, calcArchiveRootsKey(seq))
}
//TODO seed config
func getNewTree() *merkletree.Tree {
return merkletree.New(bn256.NewMiMC("seed"))
}
......@@ -94,110 +105,273 @@ func calcTreeRoot(leaves *mixTy.CommitTreeLeaves) []byte {
}
func getNewCommitLeaves() (*mixTy.CommitTreeLeaves, *mixTy.CommitTreeRoots) {
leaves := &mixTy.CommitTreeLeaves{}
roots := &mixTy.CommitTreeRoots{}
func makeArchiveRootReceipt(seq uint64, root string) *types.Receipt {
key := calcArchiveRootsKey(seq)
log := &mixTy.ReceiptArchiveTreeRoot{
RootHash: root,
Seq: seq,
}
//第一个叶子节点都是固定的"00"字节
leaf := []byte("00")
leaves.Leaves = append(leaves.Leaves, leaf)
roots.Roots = append(roots.Roots, calcTreeRoot(leaves))
return &types.Receipt{
KV: []*types.KeyValue{
{Key: key, Value: types.Encode(&mixTy.CommitTreeRoots{Roots: [][]byte{mixTy.Str2Byte(root)}})},
},
Logs: []*types.ReceiptLog{
{
Ty: mixTy.TyLogCommitTreeArchiveRoot,
Log: types.Encode(log),
},
},
}
return leaves, roots
}
func initNewLeaves(leaf [][]byte) *types.Receipt {
leaves, roots := getNewCommitLeaves()
if len(leaf) > 0 {
leaves.Leaves = append(leaves.Leaves, leaf...)
roots.Roots = append(roots.Roots, calcTreeRoot(leaves))
func makeArchiveLeavesReceipt(root string, leaves *mixTy.CommitTreeLeaves) *types.Receipt {
key := calcCommitTreeRootLeaves(root)
log := &mixTy.ReceiptArchiveLeaves{
RootHash: root,
Count: int32(len(leaves.Leaves)),
LastLeaf: hex.EncodeToString(leaves.Leaves[len(leaves.Leaves)-1]),
}
return &types.Receipt{
KV: []*types.KeyValue{
{Key: key, Value: types.Encode(leaves)},
},
Logs: []*types.ReceiptLog{
{
Ty: mixTy.TyLogArchiveRootLeaves,
Log: types.Encode(log),
},
},
}
return makeCurrentTreeReceipt(leaves, roots)
}
func archiveRoots(db dbm.KV, root []byte, leaves *mixTy.CommitTreeLeaves) (*types.Receipt, error) {
receiptRootLeaves := makeTreeRootLeavesReceipt(transferFr2String(root), leaves)
func makeSubRootsReceipt(seq int32, root []byte) *types.Receipt {
key := calcSubRootsKey(seq)
log := &mixTy.ReceiptCommitSubRoots{
Seq: seq,
Root: mixTy.Byte2Str(root),
}
return &types.Receipt{
KV: []*types.KeyValue{
{Key: key, Value: types.Encode(&mixTy.CommitTreeRoots{Roots: [][]byte{root}})},
},
Logs: []*types.ReceiptLog{
{
Ty: mixTy.TyLogSubRoots,
Log: types.Encode(log),
},
},
}
archiveRoots, err := getArchiveCommitRoots(db)
if isNotFound(errors.Cause(err)) {
archiveRoots = &mixTy.CommitTreeRoots{}
err = nil
}
func makeSubLeavesReceipt(seq int32, leaf []byte) *types.Receipt {
key := calcSubLeavesKey(seq)
log := &mixTy.ReceiptCommitSubLeaves{
Seq: seq,
Leaf: mixTy.Byte2Str(leaf),
}
if err != nil {
return nil, err
return &types.Receipt{
KV: []*types.KeyValue{
{Key: key, Value: types.Encode(&mixTy.CommitTreeLeaves{Leaves: [][]byte{leaf}})},
},
Logs: []*types.ReceiptLog{
{
Ty: mixTy.TyLogSubLeaves,
Log: types.Encode(log),
},
},
}
archiveRoots.Roots = append(archiveRoots.Roots, root)
receiptArch := makeTreeArchiveRootsReceipt(archiveRoots)
return mergeReceipt(receiptRootLeaves, receiptArch), nil
}
/*
1. 增加到当前leaves 和roots
2. 如果leaves 达到最大比如1024,则按root归档leaves,并归档相应root
3. 归档同时初始化新的current leaves 和roots
func makeTreeStatusReceipt(prev, current *mixTy.CommitTreeStatus) *types.Receipt {
keyStatus := calcCommitTreeCurrentStatusKey()
log := &mixTy.ReceiptCommitTreeStatus{
Prev: prev,
Current: current,
}
*/
func pushTree(db dbm.KV, leaf [][]byte) (*types.Receipt, error) {
leaves, err := getCurrentCommitTreeLeaves(db)
if isNotFound(errors.Cause(err)) {
//系统初始状态
return initNewLeaves(leaf), nil
return &types.Receipt{
Ty: types.ExecOk,
KV: []*types.KeyValue{
{Key: keyStatus, Value: types.Encode(current)},
},
Logs: []*types.ReceiptLog{
{
Ty: mixTy.TyLogCommitTreeStatus,
Log: types.Encode(log),
},
},
}
if err != nil {
return nil, err
}
func getArchivedSubLeaves(db dbm.KV) (*mixTy.CommitTreeLeaves, error) {
var leaves mixTy.CommitTreeLeaves
//获取前1023个leaf
for i := int32(1); i < mixTy.MaxTreeLeaves; i++ {
r, err := getCommitLeaves(db, calcSubLeavesKey(i))
if err != nil {
return nil, errors.Wrapf(err, "getArchivedSubTreeLeaves,i=%d", i)
}
leaves.Leaves = append(leaves.Leaves, r.Leaves...)
}
return &leaves, nil
}
//Roots应该和Leaves保持一致,如果err 是不应该的。
roots, err := getCurrentCommitTreeRoots(db)
if isNotFound(errors.Cause(err)) {
roots = &mixTy.CommitTreeRoots{}
err = nil
func restoreSubTrees(subTrees *mixTy.CommitSubTrees) (*merkletree.Tree, error) {
tree := getNewTree()
for _, t := range subTrees.SubTrees {
err := tree.PushSubTree(int(t.Height), t.Hash)
if err != nil {
return nil, errors.Wrapf(err, "restoreSubTrees.pushSubTree=%d", t.Height)
}
}
return tree, nil
}
//merkle树由子树构成,任何一个节点都是一个子树,如果一个子树高度不为0,则是一个高阶子树,高阶子树可以直接参与root计算,不需要再统计其叶子节点
//高阶子树一定是一个完全子树,即左右叶子节点都存在,只有0阶子树不是完全子树,只有一个叶子
//为了计算1024个叶子节点任何一个新节点n的roothash,需要累计前n-1个叶子节点,由于1024个叶子存取耗时,这里只保存最多10个高阶子树即可计算roothash
func joinSubTrees(status *mixTy.CommitTreeStatus, leaf []byte) ([]byte, error) {
tree, err := restoreSubTrees(status.SubTrees)
if err != nil {
return nil, err
return nil, errors.Wrapf(err, "joinSubTrees")
}
tree.Push(leaf)
var newSubTrees mixTy.CommitSubTrees
allSubTrees := tree.GetAllSubTrees()
for _, s := range allSubTrees {
newSubTrees.SubTrees = append(newSubTrees.SubTrees, &mixTy.CommitSubTree{Height: int32(s.GetHeight()), Hash: s.GetSum()})
}
leaves.Leaves = append(leaves.Leaves, leaf...)
currentRoot := calcTreeRoot(leaves)
roots.Roots = append(roots.Roots, currentRoot)
r := makeCurrentTreeReceipt(leaves, roots)
status.SubTrees = &newSubTrees
return tree.Root(), nil
}
func joinLeaves(db dbm.KV, status *mixTy.CommitTreeStatus, leaf []byte) (*types.Receipt, error) {
receipts := &types.Receipt{Ty: types.ExecOk}
//seq从1开始记录前1023个叶子和root
if status.SubLeavesSeq < mixTy.MaxTreeLeaves {
status.SubLeavesSeq++
r := makeSubLeavesReceipt(status.SubLeavesSeq, leaf)
mergeReceipt(receipts, r)
//归档
if len(leaves.Leaves) >= mixTy.MaxTreeLeaves {
receiptArch, err := archiveRoots(db, currentRoot, leaves)
//恢复并重新计算子树
root, err := joinSubTrees(status, leaf)
if err != nil {
return nil, err
return nil, errors.Wrapf(err, "joinLeaves.joinSubTrees")
}
mergeReceipt(r, receiptArch)
//创建新的leaves
receiptNew := initNewLeaves(nil)
mergeReceipt(r, receiptNew)
r = makeSubRootsReceipt(status.SubLeavesSeq, root)
mergeReceipt(receipts, r)
return receipts, nil
}
return r, nil
//累积到1024个叶子,需要归档
sumLeaves, err := getArchivedSubLeaves(db)
if err != nil {
return nil, errors.Wrapf(err, "pushTree.joinLeaves")
}
//加第1024个leaf
sumLeaves.Leaves = append(sumLeaves.Leaves, leaf)
//重新计算1024个叶子root,确保正确
root := mixTy.Byte2Str(calcTreeRoot(sumLeaves))
//root-leaves保存leaves
r := makeArchiveLeavesReceipt(root, sumLeaves)
mergeReceipt(receipts, r)
//1024叶子的root归档到相应archiveSeq
r = makeArchiveRootReceipt(status.ArchiveRootsSeq, root)
mergeReceipt(receipts, r)
status.ArchiveRootsSeq++
//reset 重新开始统计
status.SubLeavesSeq = 0
status.SubTrees = &mixTy.CommitSubTrees{}
return receipts, nil
}
func checkTreeRootHashExist(db dbm.KV, hash []byte) bool {
var roots [][]byte
currentRoots, err := getCurrentCommitTreeRoots(db)
if err == nil {
roots = append(roots, currentRoots.Roots...)
/*
1. 增加到当前leaves 和roots
2. 如果leaves 达到最大比如1024,则按root归档leaves,并归档相应root
3. 归档同时初始化新的current leaves 和roots
*/
func pushTree(db dbm.KV, leaves [][]byte) (*types.Receipt, error) {
status, err := getCommitTreeStatus(db)
if err != nil {
return nil, err
}
archiveRoots, err := getArchiveCommitRoots(db)
if err == nil {
roots = append(roots, archiveRoots.Roots...)
prev := proto.Clone(status).(*mixTy.CommitTreeStatus)
receipts := &types.Receipt{Ty: types.ExecOk}
for i, leaf := range leaves {
if len(leaf) <= 0 {
return nil, errors.Wrapf(types.ErrInvalidParam, "the %d leaf is null", i)
}
r, err := joinLeaves(db, status, leaf)
if err != nil {
return nil, errors.Wrapf(err, "pushTree.joinLeaves leaf=%s", mixTy.Byte2Str(leaf))
}
mergeReceipt(receipts, r)
}
r := makeTreeStatusReceipt(prev, status)
mergeReceipt(receipts, r)
return receipts, nil
for _, k := range roots {
if bytes.Equal(k, hash) {
}
func checkExist(target []byte, list [][]byte) bool {
for _, r := range list {
if bytes.Equal(r, target) {
return true
}
}
return false
}
func checkTreeRootHashExist(db dbm.KV, hash []byte) (bool, error) {
status, err := getCommitTreeStatus(db)
if err != nil {
return false, errors.Wrapf(err, "checkTreeRootHashExist")
}
//查归档的subRoots,当前subSeq还未归档
for i := int32(1); i <= status.SubLeavesSeq; i++ {
subRoots, err := getSubRoots(db, i)
if err != nil {
return false, errors.Wrapf(err, "checkTreeRootHashExist.getSubRoots seq=%d", i)
}
if checkExist(hash, subRoots.Roots) {
return true, nil
}
}
//再查归档的roots
for i := status.ArchiveRootsSeq; i > 0; i-- {
subRoots, err := getArchiveRoots(db, i)
if err != nil {
return false, errors.Wrapf(err, "checkTreeRootHashExist.getArchiveRoots seq=%d", i)
}
if checkExist(hash, subRoots.Roots) {
return true, nil
}
}
return false, nil
}
......@@ -211,7 +385,6 @@ func getProveData(targetLeaf []byte, leaves [][]byte) (*mixTy.CommitTreeProve, e
break
}
}
//index=0的leaf是占位"00",不会和leaf相等
if !found {
return nil, mixTy.ErrLeafNotFound
}
......@@ -224,12 +397,12 @@ func getProveData(targetLeaf []byte, leaves [][]byte) (*mixTy.CommitTreeProve, e
root, proofSet, proofIndex, num := tree.Prove()
var prove mixTy.CommitTreeProve
prove.RootHash = transferFr2String(root)
prove.RootHash = mixTy.Byte2Str(root)
prove.ProofIndex = uint32(proofIndex)
prove.NumLeaves = uint32(num)
//set[0] 是targetLeaf
for _, s := range proofSet {
prove.ProofSet = append(prove.ProofSet, transferFr2String(s))
prove.ProofSet = append(prove.ProofSet, mixTy.Byte2Str(s))
}
helpers := merkletree.GenerateProofHelper(proofSet, proofIndex, num)
......@@ -248,9 +421,15 @@ func CalcTreeProve(db dbm.KV, rootHash, leaf string) (*mixTy.CommitTreeProve, er
if len(leaf) <= 0 {
return nil, errors.Wrap(types.ErrInvalidParam, "leaf is null")
}
leaves, err := getCurrentCommitTreeLeaves(db)
status, err := getCommitTreeStatus(db)
if err != nil {
return nil, errors.Wrapf(err, "CalcTreeProve.getCommitTreeStatus")
}
leaves, err := getSubLeaves(db, status.SubLeavesSeq)
if err == nil {
p, err := getProveData(transferFr2Bytes(leaf), leaves.Leaves)
p, err := getProveData(mixTy.Str2Byte(leaf), leaves.Leaves)
if err == nil {
return p, nil
}
......@@ -259,29 +438,27 @@ func CalcTreeProve(db dbm.KV, rootHash, leaf string) (*mixTy.CommitTreeProve, er
if len(rootHash) > 0 {
leaves, err := getCommitRootLeaves(db, rootHash)
if err != nil {
return nil, err
return nil, errors.Wrapf(err, "getCommitRootLeaves rootHash=%s", rootHash)
}
p, err := getProveData(transferFr2Bytes(leaf), leaves.Leaves)
//指定leaf 没有在指定的rootHash里面,返回错误,可以不指定rootHash 全局遍历
p, err := getProveData(mixTy.Str2Byte(leaf), leaves.Leaves)
if err != nil {
return nil, errors.Wrapf(err, "hash=%s,leaf=%s", rootHash, leaf)
}
return p, nil
}
roots, err := getArchiveCommitRoots(db)
if err == nil {
for _, root := range roots.Roots {
leaves, err := getCommitRootLeaves(db, transferFr2String(root))
for i := status.ArchiveRootsSeq; i > 0; i-- {
roots, err := getArchiveRoots(db, i)
leaves, err := getCommitRootLeaves(db, mixTy.Byte2Str(roots.Roots[0]))
if err == nil {
p, err := getProveData(mixTy.Str2Byte(leaf), leaves.Leaves)
if err == nil {
p, err := getProveData(transferFr2Bytes(leaf), leaves.Leaves)
if err == nil {
return p, nil
}
return p, nil
}
}
}
return nil, errors.Wrapf(err, "hash=%s,leaf=%s", rootHash, leaf)
return nil, errors.Wrapf(mixTy.ErrLeafNotFound, "hash=%s,leaf=%s", rootHash, leaf)
}
......@@ -110,7 +110,7 @@ func (a *action) Deposit(deposit *mixTy.MixDepositAction) (*types.Receipt, error
//push new commit to merkle tree
var leaves [][]byte
for _, n := range notes {
leaves = append(leaves, transferFr2Bytes(n))
leaves = append(leaves, mixTy.Str2Byte(n))
}
rpt, err := pushTree(a.db, leaves)
if err != nil {
......
......@@ -9,27 +9,33 @@ import (
)
var (
verifyKeys string
authPubKeys string
paymentPubKey string
verifyKeys string
authPubKeys string
paymentPubKey string
commitTreeCurrentStatus string
commitTreeSubRoots string
commitTreeSubLeaves string
commitTreeArchiveRoots string
commitTreeCurrentRoots string
commitTreeCurrentLeaves string
commitTreeRootLeaves string
authorizeHash string
authorizeSpendHash string
nullifierHash string
authorizeHash string
authorizeSpendHash string
nullifierHash string
)
func setPrefix() {
verifyKeys = "mavl-mix-verify-keys-"
authPubKeys = "mavl-mix-auth-pubkeys-"
paymentPubKey = "mavl-mix-payment-pubkey-"
commitTreeArchiveRoots = "mavl-mix-commitTree-roots-archive-"
commitTreeCurrentRoots = "mavl-mix-commitTree-roots-current-"
commitTreeCurrentLeaves = "mavl-mix-commitTree-current-leaves-"
commitTreeRootLeaves = "mavl-mix-commitTree-rootLeaves-"
commitTreeCurrentStatus = "mavl-mix-commitTree-current-status-"
commitTreeSubRoots = "mavl-mix-commitTree-sub-roots-"
commitTreeSubLeaves = "mavl-mix-commitTree-sub-leaves-"
commitTreeRootLeaves = "mavl-mix-commitTree-root-Leaves-"
commitTreeArchiveRoots = "mavl-mix-commitTree-archive-roots-"
authorizeHash = "mavl-mix-authorizeHash"
authorizeSpendHash = "mavl-mix-authorizeSpendHash-"
nullifierHash = "mavl-mix-nullifierHash"
......@@ -49,16 +55,20 @@ func getPaymentPubKey(addr string) []byte {
return []byte(fmt.Sprintf(paymentPubKey+"%s", addr))
}
func calcCommitTreeArchiveRootsKey() []byte {
return []byte(fmt.Sprintf(commitTreeArchiveRoots))
func calcCommitTreeCurrentStatusKey() []byte {
return []byte(fmt.Sprintf(commitTreeCurrentStatus))
}
func calcArchiveRootsKey(seq uint64) []byte {
return []byte(fmt.Sprintf(commitTreeArchiveRoots+"%022d", seq))
}
func calcCurrentCommitRootsKey() []byte {
return []byte(fmt.Sprintf(commitTreeCurrentRoots))
func calcSubRootsKey(seq int32) []byte {
return []byte(fmt.Sprintf(commitTreeSubRoots+"%010d", seq))
}
func calcCurrentCommitLeavesKey() []byte {
return []byte(fmt.Sprintf(commitTreeCurrentLeaves))
func calcSubLeavesKey(seq int32) []byte {
return []byte(fmt.Sprintf(commitTreeSubLeaves+"%010d", seq))
}
func calcCommitTreeRootLeaves(rootHash string) []byte {
......
......@@ -22,7 +22,7 @@ type Tree struct {
// tree. When a new leaf is inserted, it is inserted as a subtree of height
// 0. If there is another subtree of the same height, both can be removed,
// combined, and then inserted as a subtree of height n + 1.
head *subTree
head *SubTree
hash hash.Hash
// Helper variables used to construct proofs that the data at 'proofIndex'
......@@ -45,8 +45,8 @@ type Tree struct {
// A subTree contains the Merkle root of a complete (2^height leaves) subTree
// of the Tree. 'sum' is the Merkle root of the subTree. If 'next' is not nil,
// it will be a tree with a higher height.
type subTree struct {
next *subTree
type SubTree struct {
next *SubTree
height int // Int is okay because a height over 300 is physically unachievable.
sum []byte
}
......@@ -81,7 +81,7 @@ func nodeSum(h hash.Hash, a, b []byte) []byte {
}
// joinSubTrees combines two equal sized subTrees into a larger subTree.
func joinSubTrees(h hash.Hash, a, b *subTree) *subTree {
func joinSubTrees(h hash.Hash, a, b *SubTree) *SubTree {
// if DEBUG {
// if b.next != a {
// panic("invalid subtree join - 'a' is not paired with 'b'")
......@@ -91,7 +91,7 @@ func joinSubTrees(h hash.Hash, a, b *subTree) *subTree {
// }
// }
return &subTree{
return &SubTree{
next: a.next,
height: a.height + 1,
sum: nodeSum(h, a.sum, b.sum),
......@@ -190,7 +190,7 @@ func (t *Tree) Push(data []byte) {
// is going to be the data for cached trees, and is going to be the result
// of calling leafSum() on the data for standard trees. Doing a check here
// prevents needing to duplicate the entire 'Push' function for the trees.
t.head = &subTree{
t.head = &SubTree{
next: t.head,
height: 0,
}
......@@ -244,7 +244,7 @@ func (t *Tree) PushSubTree(height int, sum []byte) error {
}
// Insert the cached tree as the new head.
t.head = &subTree{
t.head = &SubTree{
height: height,
next: t.head,
sum: sum,
......@@ -340,3 +340,30 @@ func (t *Tree) joinAllSubTrees() {
t.head = joinSubTrees(t.hash, t.head.next, t.head)
}
}
func (t *Tree) GetAllSubTrees() []*SubTree {
var subs []*SubTree
if t.head == nil {
return nil
}
subs = append(subs, t.head)
head := t.head
for head.next != nil {
subs = append(subs, head.next)
head = head.next
}
//调换,从最初的开始
for i := 0; i < len(subs)/2; i++ {
subs[i], subs[len(subs)-1-i] = subs[len(subs)-1-i], subs[i]
}
return subs
}
func (t *SubTree) GetHeight() int {
return t.height
}
func (t *SubTree) GetSum() []byte {
return t.sum
}
......@@ -8,6 +8,7 @@ import (
"github.com/33cn/chain33/types"
mixTy "github.com/33cn/plugin/plugin/dapp/mix/types"
"github.com/pkg/errors"
)
// Query_GetTreePath 根据leaf获取path 证明和roothash
......@@ -24,18 +25,31 @@ func (m *Mix) Query_GetLeavesList(in *mixTy.TreeInfoReq) (types.Message, error)
return nil, types.ErrInvalidParam
}
var leaves *mixTy.CommitTreeLeaves
var err error
if len(in.RootHash) > 0 {
leaves, err = getCommitLeaves(m.GetStateDB(), calcCommitTreeRootLeaves(in.RootHash))
l, err := getCommitLeaves(m.GetStateDB(), calcCommitTreeRootLeaves(in.RootHash))
if err != nil {
return nil, err
}
leaves.Leaves = append(leaves.Leaves, l.Leaves...)
} else {
leaves, err = getCommitLeaves(m.GetStateDB(), calcCurrentCommitLeavesKey())
}
if err != nil {
return nil, err
status, err := getCommitTreeStatus(m.GetStateDB())
if err != nil {
return nil, err
}
for i := int32(1); i <= status.SubLeavesSeq; i++ {
l, err := getCommitLeaves(m.GetStateDB(), calcSubLeavesKey(i))
if err != nil {
return nil, errors.Wrapf(err, "get leaves of seq=%d", i)
}
leaves.Leaves = append(leaves.Leaves, l.Leaves...)
}
}
var resp mixTy.TreeListResp
for _, k := range leaves.Leaves {
resp.Leaves = append(resp.Leaves, transferFr2String(k))
resp.Leaves = append(resp.Leaves, mixTy.Byte2Str(k))
}
return &resp, nil
......@@ -43,19 +57,51 @@ func (m *Mix) Query_GetLeavesList(in *mixTy.TreeInfoReq) (types.Message, error)
}
// Query_GetRootList query title
func (m *Mix) Query_GetRootList(in *types.ReqNil) (types.Message, error) {
roots, err := getArchiveCommitRoots(m.GetStateDB())
if err != nil {
return nil, err
func (m *Mix) Query_GetRootList(in *types.ReqInt) (types.Message, error) {
var roots mixTy.CommitTreeRoots
if in.Height > 0 {
r, err := getArchiveRoots(m.GetStateDB(), uint64(in.Height))
if err != nil {
return nil, err
}
roots.Roots = append(roots.Roots, r.Roots...)
} else {
status, err := getCommitTreeStatus(m.GetStateDB())
if err != nil {
return nil, err
}
for i := int32(1); i <= status.SubLeavesSeq; i++ {
r, err := getSubRoots(m.GetStateDB(), i)
if err != nil {
return nil, errors.Wrapf(err, "get roots of seq=%d", i)
}
roots.Roots = append(roots.Roots, r.Roots...)
}
}
var resp mixTy.TreeListResp
var resp mixTy.RootListResp
for _, k := range roots.Roots {
resp.Leaves = append(resp.Leaves, transferFr2String(k))
resp.Roots = append(resp.Roots, mixTy.Byte2Str(k))
}
return &resp, nil
}
func (m *Mix) Query_GetTreeStatus(in *types.ReqNil) (types.Message, error) {
status, err := getCommitTreeStatus(m.GetStateDB())
if err != nil {
return nil, err
}
var resp mixTy.TreeStatusResp
resp.SubLeavesSeq = status.SubLeavesSeq
resp.ArchiveRootsSeq = status.ArchiveRootsSeq
for _, h := range status.SubTrees.SubTrees {
resp.SubTrees = append(resp.SubTrees, &mixTy.SubTreeResp{Height: h.Height, Hash: mixTy.Byte2Str(h.Hash)})
}
return &resp, nil
}
// Query_ListMixTxs 批量查询
func (m *Mix) Query_ListMixTxs(in *mixTy.MixTxListReq) (types.Message, error) {
return m.listMixInfos(in)
......
......@@ -161,7 +161,7 @@ func (a *action) Transfer(transfer *mixTy.MixTransferAction) (*types.Receipt, er
//push new commit to merkle tree
var leaves [][]byte
for _, h := range outputs {
leaves = append(leaves, transferFr2Bytes(h.NoteHash))
leaves = append(leaves, mixTy.Str2Byte(h.NoteHash))
}
rpt, err := pushTree(a.db, leaves)
if err != nil {
......
......@@ -19,13 +19,17 @@ import (
func spendVerify(db dbm.KV, treeRootHash, nulliferHash, authorizeSpendHash string) error {
//zk-proof校验
//check tree rootHash exist
if !checkTreeRootHashExist(db, transferFr2Bytes(treeRootHash)) {
exist, err := checkTreeRootHashExist(db, mixTy.Str2Byte(treeRootHash))
if err != nil {
return errors.Wrapf(err, "roothash=%s not found", treeRootHash)
}
if !exist {
return errors.Wrapf(mixTy.ErrTreeRootHashNotFound, "roothash=%s", treeRootHash)
}
//nullifier should not exist
nullifierKey := calcNullifierHashKey(nulliferHash)
_, err := db.Get(nullifierKey)
_, err = db.Get(nullifierKey)
if err == nil {
return errors.Wrapf(mixTy.ErrNulliferHashExist, "nullifier=%s", nulliferHash)
}
......
......@@ -171,6 +171,54 @@ message ExistValue {
bool exist = 2;
}
//子树用高度和hash描述,2^10=1024个叶子节点,子树高度不会超过10
message CommitSubTree{
int32 height = 1;
bytes hash = 2;
}
//merkel tree由子树和叶子组成,三种场景:1,初始只一个叶子, 2,全是子树, 3,子树加一个叶子,不会有两个叶子,两个叶子一定构成子树
message CommitSubTrees{
repeated CommitSubTree subTrees = 1;
}
//描述当前commitTree的状态
//一颗merkel树1024叶子,考虑数据库读取原因,每个叶子都会存到相应seq db,待第1024次时候归档,重新开始新的merkle树,
message CommitTreeStatus{
CommitSubTrees subTrees = 1;
//1~1024叶子的归档
int32 subLeavesSeq = 2;
//root的归档 从1开始,数据库占位,不然全空会往前搜索
uint64 archiveRootsSeq = 3;
}
message ReceiptCommitTreeStatus{
CommitTreeStatus prev = 1;
CommitTreeStatus current = 2;
}
message ReceiptCommitSubLeaves{
int32 seq = 1;
string leaf = 2;
}
message ReceiptCommitSubRoots{
int32 seq = 1;
string root = 2;
}
message ReceiptArchiveLeaves{
int32 count = 1;
string rootHash = 2;
string lastLeaf = 3;
}
message ReceiptArchiveTreeRoot{
uint64 seq = 1;
string rootHash = 2;
}
message CommitTreeLeaves {
repeated bytes leaves = 1;
}
......@@ -196,6 +244,20 @@ message TreeInfoReq{
message TreeListResp{
repeated string leaves = 1;
}
message RootListResp{
repeated string roots = 1;
}
message SubTreeResp{
int32 height = 1;
string hash = 2;
}
message TreeStatusResp{
int32 subLeavesSeq = 1;
uint64 archiveRootsSeq = 2;
repeated SubTreeResp subTrees = 3;
}
// mix wallet part
// receiverPubKey = hash(spendPriKey) for zk-snark note spend
......
......@@ -19,20 +19,21 @@ const (
// 执行器的日志类型
const (
// TyLogParacrossCommit commit log key
TyLogMixLocalDeposit = 750
TyLogMixLocalNullifier = 751
TyLogMixLocalAuth = 752
TyLogMixLocalAuthSpend = 753
TyLogMixConfigVk = 754
TyLogMixConfigAuth = 755
TyLogCurrentCommitTreeLeaves = 756
TyLogCurrentCommitTreeRoots = 757
TyLogCommitTreeRootLeaves = 758
TyLogCommitTreeArchiveRoots = 759
TyLogNulliferSet = 760
TyLogAuthorizeSet = 761
TyLogAuthorizeSpendSet = 762
TyLogMixConfigPaymentKey = 763
TyLogMixLocalDeposit = 750
TyLogMixLocalNullifier = 751
TyLogMixLocalAuth = 752
TyLogMixLocalAuthSpend = 753
TyLogMixConfigVk = 754
TyLogMixConfigAuth = 755
TyLogSubLeaves = 756
TyLogSubRoots = 757
TyLogArchiveRootLeaves = 758
TyLogCommitTreeArchiveRoot = 759
TyLogCommitTreeStatus = 760
TyLogNulliferSet = 761
TyLogAuthorizeSet = 762
TyLogAuthorizeSpendSet = 763
TyLogMixConfigPaymentKey = 764
)
//action type
......
......@@ -1338,6 +1338,396 @@ func (m *ExistValue) GetExist() bool {
return false
}
//子树用高度和hash描述,2^10=1024个叶子节点,子树高度不会超过10
type CommitSubTree struct {
Height int32 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"`
Hash []byte `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
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}
}
func (m *CommitSubTree) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CommitSubTree.Unmarshal(m, b)
}
func (m *CommitSubTree) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_CommitSubTree.Marshal(b, m, deterministic)
}
func (m *CommitSubTree) XXX_Merge(src proto.Message) {
xxx_messageInfo_CommitSubTree.Merge(m, src)
}
func (m *CommitSubTree) XXX_Size() int {
return xxx_messageInfo_CommitSubTree.Size(m)
}
func (m *CommitSubTree) XXX_DiscardUnknown() {
xxx_messageInfo_CommitSubTree.DiscardUnknown(m)
}
var xxx_messageInfo_CommitSubTree proto.InternalMessageInfo
func (m *CommitSubTree) GetHeight() int32 {
if m != nil {
return m.Height
}
return 0
}
func (m *CommitSubTree) GetHash() []byte {
if m != nil {
return m.Hash
}
return nil
}
//merkel tree由子树和叶子组成,三种场景:1,初始只一个叶子, 2,全是子树, 3,子树加一个叶子,不会有两个叶子,两个叶子一定构成子树
type CommitSubTrees struct {
SubTrees []*CommitSubTree `protobuf:"bytes,1,rep,name=subTrees,proto3" json:"subTrees,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
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}
}
func (m *CommitSubTrees) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CommitSubTrees.Unmarshal(m, b)
}
func (m *CommitSubTrees) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_CommitSubTrees.Marshal(b, m, deterministic)
}
func (m *CommitSubTrees) XXX_Merge(src proto.Message) {
xxx_messageInfo_CommitSubTrees.Merge(m, src)
}
func (m *CommitSubTrees) XXX_Size() int {
return xxx_messageInfo_CommitSubTrees.Size(m)
}
func (m *CommitSubTrees) XXX_DiscardUnknown() {
xxx_messageInfo_CommitSubTrees.DiscardUnknown(m)
}
var xxx_messageInfo_CommitSubTrees proto.InternalMessageInfo
func (m *CommitSubTrees) GetSubTrees() []*CommitSubTree {
if m != nil {
return m.SubTrees
}
return nil
}
//描述当前commitTree的状态
//一颗merkel树1024叶子,考虑数据库读取原因,单个子树存8个叶子,分128次,待第128次时候归档,重新开始新的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"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
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}
}
func (m *CommitTreeStatus) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CommitTreeStatus.Unmarshal(m, b)
}
func (m *CommitTreeStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_CommitTreeStatus.Marshal(b, m, deterministic)
}
func (m *CommitTreeStatus) XXX_Merge(src proto.Message) {
xxx_messageInfo_CommitTreeStatus.Merge(m, src)
}
func (m *CommitTreeStatus) XXX_Size() int {
return xxx_messageInfo_CommitTreeStatus.Size(m)
}
func (m *CommitTreeStatus) XXX_DiscardUnknown() {
xxx_messageInfo_CommitTreeStatus.DiscardUnknown(m)
}
var xxx_messageInfo_CommitTreeStatus proto.InternalMessageInfo
func (m *CommitTreeStatus) GetSubTrees() *CommitSubTrees {
if m != nil {
return m.SubTrees
}
return nil
}
func (m *CommitTreeStatus) GetSubLeavesSeq() int32 {
if m != nil {
return m.SubLeavesSeq
}
return 0
}
func (m *CommitTreeStatus) GetArchiveRootsSeq() uint64 {
if m != nil {
return m.ArchiveRootsSeq
}
return 0
}
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"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
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}
}
func (m *ReceiptCommitTreeStatus) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReceiptCommitTreeStatus.Unmarshal(m, b)
}
func (m *ReceiptCommitTreeStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ReceiptCommitTreeStatus.Marshal(b, m, deterministic)
}
func (m *ReceiptCommitTreeStatus) XXX_Merge(src proto.Message) {
xxx_messageInfo_ReceiptCommitTreeStatus.Merge(m, src)
}
func (m *ReceiptCommitTreeStatus) XXX_Size() int {
return xxx_messageInfo_ReceiptCommitTreeStatus.Size(m)
}
func (m *ReceiptCommitTreeStatus) XXX_DiscardUnknown() {
xxx_messageInfo_ReceiptCommitTreeStatus.DiscardUnknown(m)
}
var xxx_messageInfo_ReceiptCommitTreeStatus proto.InternalMessageInfo
func (m *ReceiptCommitTreeStatus) GetPrev() *CommitTreeStatus {
if m != nil {
return m.Prev
}
return nil
}
func (m *ReceiptCommitTreeStatus) GetCurrent() *CommitTreeStatus {
if m != nil {
return m.Current
}
return nil
}
type ReceiptCommitSubLeaves struct {
Seq int32 `protobuf:"varint,1,opt,name=seq,proto3" json:"seq,omitempty"`
Leaf string `protobuf:"bytes,2,opt,name=leaf,proto3" json:"leaf,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
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}
}
func (m *ReceiptCommitSubLeaves) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReceiptCommitSubLeaves.Unmarshal(m, b)
}
func (m *ReceiptCommitSubLeaves) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ReceiptCommitSubLeaves.Marshal(b, m, deterministic)
}
func (m *ReceiptCommitSubLeaves) XXX_Merge(src proto.Message) {
xxx_messageInfo_ReceiptCommitSubLeaves.Merge(m, src)
}
func (m *ReceiptCommitSubLeaves) XXX_Size() int {
return xxx_messageInfo_ReceiptCommitSubLeaves.Size(m)
}
func (m *ReceiptCommitSubLeaves) XXX_DiscardUnknown() {
xxx_messageInfo_ReceiptCommitSubLeaves.DiscardUnknown(m)
}
var xxx_messageInfo_ReceiptCommitSubLeaves proto.InternalMessageInfo
func (m *ReceiptCommitSubLeaves) GetSeq() int32 {
if m != nil {
return m.Seq
}
return 0
}
func (m *ReceiptCommitSubLeaves) GetLeaf() string {
if m != nil {
return m.Leaf
}
return ""
}
type ReceiptCommitSubRoots struct {
Seq int32 `protobuf:"varint,1,opt,name=seq,proto3" json:"seq,omitempty"`
Root string `protobuf:"bytes,2,opt,name=root,proto3" json:"root,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
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}
}
func (m *ReceiptCommitSubRoots) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReceiptCommitSubRoots.Unmarshal(m, b)
}
func (m *ReceiptCommitSubRoots) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ReceiptCommitSubRoots.Marshal(b, m, deterministic)
}
func (m *ReceiptCommitSubRoots) XXX_Merge(src proto.Message) {
xxx_messageInfo_ReceiptCommitSubRoots.Merge(m, src)
}
func (m *ReceiptCommitSubRoots) XXX_Size() int {
return xxx_messageInfo_ReceiptCommitSubRoots.Size(m)
}
func (m *ReceiptCommitSubRoots) XXX_DiscardUnknown() {
xxx_messageInfo_ReceiptCommitSubRoots.DiscardUnknown(m)
}
var xxx_messageInfo_ReceiptCommitSubRoots proto.InternalMessageInfo
func (m *ReceiptCommitSubRoots) GetSeq() int32 {
if m != nil {
return m.Seq
}
return 0
}
func (m *ReceiptCommitSubRoots) GetRoot() string {
if m != nil {
return m.Root
}
return ""
}
type ReceiptArchiveLeaves struct {
Count int32 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"`
RootHash string `protobuf:"bytes,2,opt,name=rootHash,proto3" json:"rootHash,omitempty"`
LastLeaf string `protobuf:"bytes,3,opt,name=lastLeaf,proto3" json:"lastLeaf,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
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}
}
func (m *ReceiptArchiveLeaves) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReceiptArchiveLeaves.Unmarshal(m, b)
}
func (m *ReceiptArchiveLeaves) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ReceiptArchiveLeaves.Marshal(b, m, deterministic)
}
func (m *ReceiptArchiveLeaves) XXX_Merge(src proto.Message) {
xxx_messageInfo_ReceiptArchiveLeaves.Merge(m, src)
}
func (m *ReceiptArchiveLeaves) XXX_Size() int {
return xxx_messageInfo_ReceiptArchiveLeaves.Size(m)
}
func (m *ReceiptArchiveLeaves) XXX_DiscardUnknown() {
xxx_messageInfo_ReceiptArchiveLeaves.DiscardUnknown(m)
}
var xxx_messageInfo_ReceiptArchiveLeaves proto.InternalMessageInfo
func (m *ReceiptArchiveLeaves) GetCount() int32 {
if m != nil {
return m.Count
}
return 0
}
func (m *ReceiptArchiveLeaves) GetRootHash() string {
if m != nil {
return m.RootHash
}
return ""
}
func (m *ReceiptArchiveLeaves) GetLastLeaf() string {
if m != nil {
return m.LastLeaf
}
return ""
}
type ReceiptArchiveTreeRoot struct {
Seq uint64 `protobuf:"varint,1,opt,name=seq,proto3" json:"seq,omitempty"`
RootHash string `protobuf:"bytes,2,opt,name=rootHash,proto3" json:"rootHash,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
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}
}
func (m *ReceiptArchiveTreeRoot) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReceiptArchiveTreeRoot.Unmarshal(m, b)
}
func (m *ReceiptArchiveTreeRoot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ReceiptArchiveTreeRoot.Marshal(b, m, deterministic)
}
func (m *ReceiptArchiveTreeRoot) XXX_Merge(src proto.Message) {
xxx_messageInfo_ReceiptArchiveTreeRoot.Merge(m, src)
}
func (m *ReceiptArchiveTreeRoot) XXX_Size() int {
return xxx_messageInfo_ReceiptArchiveTreeRoot.Size(m)
}
func (m *ReceiptArchiveTreeRoot) XXX_DiscardUnknown() {
xxx_messageInfo_ReceiptArchiveTreeRoot.DiscardUnknown(m)
}
var xxx_messageInfo_ReceiptArchiveTreeRoot proto.InternalMessageInfo
func (m *ReceiptArchiveTreeRoot) GetSeq() uint64 {
if m != nil {
return m.Seq
}
return 0
}
func (m *ReceiptArchiveTreeRoot) GetRootHash() string {
if m != nil {
return m.RootHash
}
return ""
}
type CommitTreeLeaves struct {
Leaves [][]byte `protobuf:"bytes,1,rep,name=leaves,proto3" json:"leaves,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
......@@ -1349,7 +1739,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{20}
return fileDescriptor_5c21d519a9be369a, []int{28}
}
func (m *CommitTreeLeaves) XXX_Unmarshal(b []byte) error {
......@@ -1388,7 +1778,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{21}
return fileDescriptor_5c21d519a9be369a, []int{29}
}
func (m *CommitTreeRoots) XXX_Unmarshal(b []byte) error {
......@@ -1431,7 +1821,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{22}
return fileDescriptor_5c21d519a9be369a, []int{30}
}
func (m *CommitTreeProve) XXX_Unmarshal(b []byte) error {
......@@ -1499,7 +1889,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{23}
return fileDescriptor_5c21d519a9be369a, []int{31}
}
func (m *TreeInfoReq) XXX_Unmarshal(b []byte) error {
......@@ -1545,7 +1935,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{24}
return fileDescriptor_5c21d519a9be369a, []int{32}
}
func (m *TreeListResp) XXX_Unmarshal(b []byte) error {
......@@ -1573,6 +1963,147 @@ func (m *TreeListResp) GetLeaves() []string {
return nil
}
type RootListResp struct {
Roots []string `protobuf:"bytes,1,rep,name=roots,proto3" json:"roots,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
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}
}
func (m *RootListResp) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RootListResp.Unmarshal(m, b)
}
func (m *RootListResp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_RootListResp.Marshal(b, m, deterministic)
}
func (m *RootListResp) XXX_Merge(src proto.Message) {
xxx_messageInfo_RootListResp.Merge(m, src)
}
func (m *RootListResp) XXX_Size() int {
return xxx_messageInfo_RootListResp.Size(m)
}
func (m *RootListResp) XXX_DiscardUnknown() {
xxx_messageInfo_RootListResp.DiscardUnknown(m)
}
var xxx_messageInfo_RootListResp proto.InternalMessageInfo
func (m *RootListResp) GetRoots() []string {
if m != nil {
return m.Roots
}
return nil
}
type SubTreeResp struct {
Height int32 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"`
Hash string `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
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}
}
func (m *SubTreeResp) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SubTreeResp.Unmarshal(m, b)
}
func (m *SubTreeResp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_SubTreeResp.Marshal(b, m, deterministic)
}
func (m *SubTreeResp) XXX_Merge(src proto.Message) {
xxx_messageInfo_SubTreeResp.Merge(m, src)
}
func (m *SubTreeResp) XXX_Size() int {
return xxx_messageInfo_SubTreeResp.Size(m)
}
func (m *SubTreeResp) XXX_DiscardUnknown() {
xxx_messageInfo_SubTreeResp.DiscardUnknown(m)
}
var xxx_messageInfo_SubTreeResp proto.InternalMessageInfo
func (m *SubTreeResp) GetHeight() int32 {
if m != nil {
return m.Height
}
return 0
}
func (m *SubTreeResp) GetHash() string {
if m != nil {
return m.Hash
}
return ""
}
type TreeStatusResp struct {
SubLeavesSeq int32 `protobuf:"varint,1,opt,name=subLeavesSeq,proto3" json:"subLeavesSeq,omitempty"`
ArchiveRootsSeq uint64 `protobuf:"varint,2,opt,name=archiveRootsSeq,proto3" json:"archiveRootsSeq,omitempty"`
SubTrees []*SubTreeResp `protobuf:"bytes,3,rep,name=subTrees,proto3" json:"subTrees,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
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}
}
func (m *TreeStatusResp) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TreeStatusResp.Unmarshal(m, b)
}
func (m *TreeStatusResp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_TreeStatusResp.Marshal(b, m, deterministic)
}
func (m *TreeStatusResp) XXX_Merge(src proto.Message) {
xxx_messageInfo_TreeStatusResp.Merge(m, src)
}
func (m *TreeStatusResp) XXX_Size() int {
return xxx_messageInfo_TreeStatusResp.Size(m)
}
func (m *TreeStatusResp) XXX_DiscardUnknown() {
xxx_messageInfo_TreeStatusResp.DiscardUnknown(m)
}
var xxx_messageInfo_TreeStatusResp proto.InternalMessageInfo
func (m *TreeStatusResp) GetSubLeavesSeq() int32 {
if m != nil {
return m.SubLeavesSeq
}
return 0
}
func (m *TreeStatusResp) GetArchiveRootsSeq() uint64 {
if m != nil {
return m.ArchiveRootsSeq
}
return 0
}
func (m *TreeStatusResp) GetSubTrees() []*SubTreeResp {
if m != nil {
return m.SubTrees
}
return nil
}
// mix wallet part
// receiverPubKey = hash(spendPriKey) for zk-snark note spend
type PaymentKeyPair struct {
......@@ -1587,7 +2118,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{25}
return fileDescriptor_5c21d519a9be369a, []int{36}
}
func (m *PaymentKeyPair) XXX_Unmarshal(b []byte) error {
......@@ -1637,7 +2168,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{26}
return fileDescriptor_5c21d519a9be369a, []int{37}
}
func (m *EncryptKeyPair) XXX_Unmarshal(b []byte) error {
......@@ -1686,7 +2217,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{27}
return fileDescriptor_5c21d519a9be369a, []int{38}
}
func (m *AccountPrivacyKey) XXX_Unmarshal(b []byte) error {
......@@ -1733,7 +2264,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{28}
return fileDescriptor_5c21d519a9be369a, []int{39}
}
func (m *WalletAddrPrivacy) XXX_Unmarshal(b []byte) error {
......@@ -1783,7 +2314,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{29}
return fileDescriptor_5c21d519a9be369a, []int{40}
}
func (m *SecretData) XXX_Unmarshal(b []byte) error {
......@@ -1851,7 +2382,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{30}
return fileDescriptor_5c21d519a9be369a, []int{41}
}
func (m *EncryptSecretData) XXX_Unmarshal(b []byte) error {
......@@ -1899,7 +2430,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{31}
return fileDescriptor_5c21d519a9be369a, []int{42}
}
func (m *DecryptSecretData) XXX_Unmarshal(b []byte) error {
......@@ -1956,7 +2487,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{32}
return fileDescriptor_5c21d519a9be369a, []int{43}
}
func (m *DepositInfo) XXX_Unmarshal(b []byte) error {
......@@ -2018,7 +2549,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{33}
return fileDescriptor_5c21d519a9be369a, []int{44}
}
func (m *DepositTxReq) XXX_Unmarshal(b []byte) error {
......@@ -2066,7 +2597,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{34}
return fileDescriptor_5c21d519a9be369a, []int{45}
}
func (m *DepositProofResp) XXX_Unmarshal(b []byte) error {
......@@ -2121,7 +2652,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{35}
return fileDescriptor_5c21d519a9be369a, []int{46}
}
func (m *TreePathProof) XXX_Unmarshal(b []byte) error {
......@@ -2177,7 +2708,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{36}
return fileDescriptor_5c21d519a9be369a, []int{47}
}
func (m *WithdrawTxReq) XXX_Unmarshal(b []byte) error {
......@@ -2237,7 +2768,7 @@ 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{37}
return fileDescriptor_5c21d519a9be369a, []int{48}
}
func (m *WithdrawProofRe) XXX_Unmarshal(b []byte) error {
......@@ -2328,7 +2859,7 @@ func (m *AuthTxReq) Reset() { *m = AuthTxReq{} }
func (m *AuthTxReq) String() string { return proto.CompactTextString(m) }
func (*AuthTxReq) ProtoMessage() {}
func (*AuthTxReq) Descriptor() ([]byte, []int) {
return fileDescriptor_5c21d519a9be369a, []int{38}
return fileDescriptor_5c21d519a9be369a, []int{49}
}
func (m *AuthTxReq) XXX_Unmarshal(b []byte) error {
......@@ -2388,7 +2919,7 @@ 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{39}
return fileDescriptor_5c21d519a9be369a, []int{50}
}
func (m *AuthProofRe) XXX_Unmarshal(b []byte) error {
......@@ -2477,7 +3008,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{40}
return fileDescriptor_5c21d519a9be369a, []int{51}
}
func (m *TransferInputTxReq) XXX_Unmarshal(b []byte) error {
......@@ -2524,7 +3055,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{41}
return fileDescriptor_5c21d519a9be369a, []int{52}
}
func (m *TransferOutputTxReq) XXX_Unmarshal(b []byte) error {
......@@ -2571,7 +3102,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{42}
return fileDescriptor_5c21d519a9be369a, []int{53}
}
func (m *TransferTxReq) XXX_Unmarshal(b []byte) error {
......@@ -2619,7 +3150,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{43}
return fileDescriptor_5c21d519a9be369a, []int{54}
}
func (m *ShieldAmount) XXX_Unmarshal(b []byte) error {
......@@ -2674,7 +3205,7 @@ 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{44}
return fileDescriptor_5c21d519a9be369a, []int{55}
}
func (m *TransferInputProof) XXX_Unmarshal(b []byte) error {
......@@ -2780,7 +3311,7 @@ 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{45}
return fileDescriptor_5c21d519a9be369a, []int{56}
}
func (m *TransferOutputProof) XXX_Unmarshal(b []byte) error {
......@@ -2849,7 +3380,7 @@ 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{46}
return fileDescriptor_5c21d519a9be369a, []int{57}
}
func (m *TransferProofResp) XXX_Unmarshal(b []byte) error {
......@@ -2907,7 +3438,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{47}
return fileDescriptor_5c21d519a9be369a, []int{58}
}
func (m *ShieldAmountRst) XXX_Unmarshal(b []byte) error {
......@@ -2987,7 +3518,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{48}
return fileDescriptor_5c21d519a9be369a, []int{59}
}
func (m *CreateRawTxReq) XXX_Unmarshal(b []byte) error {
......@@ -3070,7 +3601,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{49}
return fileDescriptor_5c21d519a9be369a, []int{60}
}
func (m *PaymentKeysReq) XXX_Unmarshal(b []byte) error {
......@@ -3129,7 +3660,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{50}
return fileDescriptor_5c21d519a9be369a, []int{61}
}
func (m *WalletNoteInfo) XXX_Unmarshal(b []byte) error {
......@@ -3211,7 +3742,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{51}
return fileDescriptor_5c21d519a9be369a, []int{62}
}
func (m *WalletDbMixInfo) XXX_Unmarshal(b []byte) error {
......@@ -3264,7 +3795,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{52}
return fileDescriptor_5c21d519a9be369a, []int{63}
}
func (m *WalletMixIndexReq) XXX_Unmarshal(b []byte) error {
......@@ -3352,7 +3883,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{53}
return fileDescriptor_5c21d519a9be369a, []int{64}
}
func (m *WalletNoteResp) XXX_Unmarshal(b []byte) error {
......@@ -3393,7 +3924,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{54}
return fileDescriptor_5c21d519a9be369a, []int{65}
}
func (m *WalletEnablePrivacyRst) XXX_Unmarshal(b []byte) error {
......@@ -3446,7 +3977,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{55}
return fileDescriptor_5c21d519a9be369a, []int{66}
}
func (m *WalletEnablePrivacyResp) XXX_Unmarshal(b []byte) error {
......@@ -3487,7 +4018,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{56}
return fileDescriptor_5c21d519a9be369a, []int{67}
}
func (m *LocalMixTx) XXX_Unmarshal(b []byte) error {
......@@ -3545,7 +4076,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{57}
return fileDescriptor_5c21d519a9be369a, []int{68}
}
func (m *MixTxListReq) XXX_Unmarshal(b []byte) error {
......@@ -3619,7 +4150,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{58}
return fileDescriptor_5c21d519a9be369a, []int{69}
}
func (m *MixTxListResp) XXX_Unmarshal(b []byte) error {
......@@ -3660,7 +4191,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{59}
return fileDescriptor_5c21d519a9be369a, []int{70}
}
func (m *PrivacyAddrResult) XXX_Unmarshal(b []byte) error {
......@@ -3713,7 +4244,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{60}
return fileDescriptor_5c21d519a9be369a, []int{71}
}
func (m *ReqEnablePrivacyRst) XXX_Unmarshal(b []byte) error {
......@@ -3767,11 +4298,22 @@ func init() {
proto.RegisterType((*AuthorizePublicInput)(nil), "types.AuthorizePublicInput")
proto.RegisterType((*VerifyProofInfo)(nil), "types.VerifyProofInfo")
proto.RegisterType((*ExistValue)(nil), "types.ExistValue")
proto.RegisterType((*CommitSubTree)(nil), "types.CommitSubTree")
proto.RegisterType((*CommitSubTrees)(nil), "types.CommitSubTrees")
proto.RegisterType((*CommitTreeStatus)(nil), "types.CommitTreeStatus")
proto.RegisterType((*ReceiptCommitTreeStatus)(nil), "types.ReceiptCommitTreeStatus")
proto.RegisterType((*ReceiptCommitSubLeaves)(nil), "types.ReceiptCommitSubLeaves")
proto.RegisterType((*ReceiptCommitSubRoots)(nil), "types.ReceiptCommitSubRoots")
proto.RegisterType((*ReceiptArchiveLeaves)(nil), "types.ReceiptArchiveLeaves")
proto.RegisterType((*ReceiptArchiveTreeRoot)(nil), "types.ReceiptArchiveTreeRoot")
proto.RegisterType((*CommitTreeLeaves)(nil), "types.CommitTreeLeaves")
proto.RegisterType((*CommitTreeRoots)(nil), "types.CommitTreeRoots")
proto.RegisterType((*CommitTreeProve)(nil), "types.CommitTreeProve")
proto.RegisterType((*TreeInfoReq)(nil), "types.TreeInfoReq")
proto.RegisterType((*TreeListResp)(nil), "types.TreeListResp")
proto.RegisterType((*RootListResp)(nil), "types.RootListResp")
proto.RegisterType((*SubTreeResp)(nil), "types.SubTreeResp")
proto.RegisterType((*TreeStatusResp)(nil), "types.TreeStatusResp")
proto.RegisterType((*PaymentKeyPair)(nil), "types.PaymentKeyPair")
proto.RegisterType((*EncryptKeyPair)(nil), "types.EncryptKeyPair")
proto.RegisterType((*AccountPrivacyKey)(nil), "types.AccountPrivacyKey")
......@@ -3815,169 +4357,187 @@ func init() {
}
var fileDescriptor_5c21d519a9be369a = []byte{
// 2588 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0x4b, 0x6f, 0x1b, 0xc9,
0x11, 0xd6, 0x0c, 0x5f, 0x62, 0x89, 0x94, 0xa8, 0xb6, 0x57, 0x4b, 0x0b, 0x1b, 0x43, 0xe9, 0x75,
0xd6, 0x5a, 0x39, 0x70, 0x16, 0xf2, 0x66, 0x83, 0x00, 0x59, 0x27, 0x5c, 0x93, 0xb2, 0xb8, 0xb6,
0x28, 0xa1, 0x45, 0xf9, 0xb5, 0xd8, 0x00, 0x63, 0xb2, 0x25, 0x0d, 0x4c, 0x71, 0xe8, 0x99, 0xa1,
0x4c, 0xed, 0x2d, 0x48, 0x80, 0x20, 0xb7, 0x00, 0x39, 0xe4, 0x16, 0x20, 0xa7, 0xec, 0x39, 0x08,
0x72, 0xc8, 0x0f, 0xc8, 0x21, 0xe7, 0xfc, 0x80, 0xdc, 0x72, 0xcf, 0x2f, 0x08, 0xaa, 0x1f, 0x33,
0xdd, 0x23, 0xea, 0xe5, 0x6c, 0x80, 0x1c, 0x72, 0x63, 0xd5, 0x54, 0xd7, 0x54, 0x7d, 0x55, 0x5d,
0x5d, 0x5d, 0x43, 0x28, 0x1f, 0xf9, 0x93, 0xbb, 0xa3, 0x30, 0x88, 0x03, 0x52, 0x88, 0x4f, 0x46,
0x3c, 0x5a, 0xae, 0xf4, 0x82, 0xa3, 0xa3, 0x60, 0x28, 0x99, 0xcb, 0x8b, 0x71, 0xe8, 0x0d, 0x23,
0xaf, 0x17, 0xfb, 0x9a, 0x45, 0x3f, 0x87, 0xb9, 0x17, 0xaf, 0x9e, 0xf0, 0xd0, 0xdf, 0x3f, 0x79,
0xc4, 0x4f, 0xc8, 0x77, 0x20, 0x8f, 0x0b, 0xeb, 0xce, 0x8a, 0xb3, 0x3a, 0xbf, 0xbe, 0x78, 0x57,
0x68, 0xb9, 0x2b, 0x9f, 0x77, 0x4f, 0x46, 0x9c, 0x89, 0xc7, 0xe4, 0x3a, 0x14, 0x8e, 0xbd, 0xc1,
0x98, 0xd7, 0xdd, 0x15, 0x67, 0xb5, 0xcc, 0x24, 0x41, 0x3f, 0x81, 0x8a, 0xa1, 0x2b, 0x22, 0x1f,
0x40, 0xbe, 0xef, 0xc5, 0x5e, 0xdd, 0x59, 0xc9, 0xad, 0xce, 0xad, 0x13, 0xa5, 0xcc, 0x10, 0x61,
0xe2, 0x39, 0xbd, 0x09, 0xb3, 0x8d, 0x71, 0x7c, 0x28, 0xd6, 0x10, 0xc8, 0xbf, 0xe2, 0x27, 0x91,
0x58, 0x53, 0x66, 0xe2, 0x37, 0x7d, 0x09, 0xb0, 0xe3, 0x9d, 0x1c, 0xf1, 0x61, 0x8c, 0x26, 0x12,
0xc8, 0x7b, 0xfd, 0x7e, 0x28, 0x4c, 0x2c, 0x33, 0xf1, 0x9b, 0xac, 0xc0, 0x5c, 0xc8, 0x7b, 0xdc,
0x3f, 0xe6, 0xe1, 0x23, 0x7e, 0xa2, 0xac, 0x32, 0x59, 0xe4, 0x26, 0x00, 0x1f, 0xf6, 0xc2, 0x93,
0x11, 0xea, 0xa8, 0xe7, 0x84, 0x80, 0xc1, 0xa1, 0xff, 0x72, 0x60, 0x61, 0xcb, 0x9f, 0x3c, 0x08,
0x86, 0xfb, 0xfe, 0x41, 0x43, 0x20, 0x44, 0x6e, 0x81, 0xdb, 0x3d, 0x51, 0x50, 0x5c, 0x57, 0xd6,
0x27, 0x32, 0x02, 0x0d, 0xb7, 0x7b, 0x42, 0xee, 0x40, 0x51, 0xca, 0x8b, 0xd7, 0xce, 0xaf, 0x5f,
0xcb, 0x4a, 0x36, 0x7a, 0x31, 0x53, 0x22, 0x64, 0x1d, 0xca, 0xc7, 0xda, 0x7b, 0x61, 0xc5, 0x54,
0x5c, 0x36, 0x67, 0x58, 0x2a, 0x46, 0x96, 0xa1, 0xe4, 0x49, 0x78, 0xea, 0x79, 0xb4, 0x7b, 0x73,
0x86, 0x69, 0x06, 0xb9, 0x07, 0x30, 0x4a, 0xa0, 0xa9, 0x17, 0x84, 0x42, 0x1d, 0xb5, 0x14, 0xb3,
0xcd, 0x19, 0x66, 0x88, 0x7d, 0x56, 0x52, 0xd1, 0xa3, 0x3f, 0x82, 0xd9, 0xe6, 0xe6, 0x2e, 0xef,
0x85, 0x3c, 0x26, 0x75, 0x28, 0x8d, 0xb8, 0x84, 0x4f, 0x22, 0xab, 0x49, 0xb2, 0x04, 0xc5, 0x48,
0xc8, 0x28, 0x5c, 0x15, 0x45, 0x39, 0x54, 0xf5, 0xea, 0x87, 0x61, 0x30, 0x1e, 0x91, 0x65, 0x98,
0xd5, 0x90, 0x2b, 0x1d, 0x09, 0x2d, 0x9f, 0xc5, 0xe3, 0x70, 0xc8, 0x43, 0xa5, 0x26, 0xa1, 0xc9,
0x7b, 0x50, 0x46, 0x7f, 0x82, 0xd0, 0xff, 0x8a, 0xab, 0xd0, 0xa4, 0x0c, 0x3a, 0xc6, 0x0c, 0xdd,
0x09, 0x83, 0x60, 0xbf, 0x3d, 0xdc, 0x0f, 0x30, 0xf5, 0x46, 0x48, 0xa8, 0x37, 0x48, 0x02, 0x13,
0x60, 0x34, 0x7e, 0x39, 0xf0, 0x7b, 0xed, 0xe1, 0x68, 0xac, 0x0d, 0x35, 0x59, 0xe4, 0x2e, 0x94,
0xa4, 0xdd, 0x91, 0xc2, 0x5d, 0x47, 0xd4, 0xf2, 0x81, 0x69, 0x21, 0x7a, 0x1f, 0x6a, 0x5b, 0xfe,
0xa4, 0xc9, 0x47, 0x41, 0xe4, 0xc7, 0x2a, 0x7a, 0x6b, 0x50, 0x14, 0xaf, 0x8b, 0x4e, 0xa5, 0x74,
0x62, 0x1f, 0x53, 0x12, 0xf4, 0xb7, 0x0e, 0x2c, 0x6e, 0xf9, 0x93, 0x2e, 0xee, 0xb8, 0x7d, 0x1e,
0xa6, 0x1a, 0x7c, 0x34, 0xe7, 0x5c, 0x0d, 0x52, 0x02, 0x65, 0x83, 0x71, 0xac, 0xdd, 0x39, 0x43,
0x56, 0x4a, 0xa0, 0x6c, 0xef, 0xd0, 0x1b, 0x1e, 0xf0, 0x53, 0x49, 0x65, 0xc8, 0x4a, 0x09, 0xfa,
0x54, 0x18, 0xf6, 0xd4, 0x8f, 0x0f, 0xfb, 0xa1, 0xf7, 0x46, 0x19, 0xb6, 0x04, 0x45, 0xef, 0x28,
0x18, 0x0f, 0x63, 0x81, 0x6b, 0x9e, 0x29, 0xca, 0x70, 0xd9, 0xbd, 0xd0, 0xe5, 0xfb, 0x40, 0xb6,
0xfc, 0x49, 0x43, 0x47, 0x4e, 0x69, 0x5e, 0x35, 0x03, 0x36, 0x5d, 0x81, 0x14, 0xa0, 0x7f, 0x76,
0xa1, 0x8c, 0x0a, 0xe4, 0xba, 0x79, 0x70, 0x63, 0x99, 0x8b, 0x05, 0xe6, 0xc6, 0x27, 0xe4, 0x23,
0x28, 0xf6, 0xc4, 0x7e, 0x52, 0x70, 0x2c, 0x4d, 0xd9, 0x67, 0x7e, 0x30, 0xdc, 0x9c, 0x61, 0x4a,
0x8e, 0xdc, 0x83, 0x52, 0x5f, 0xc6, 0x4f, 0xa1, 0xf2, 0x6e, 0xba, 0xc4, 0x0a, 0x2c, 0xee, 0x28,
0x25, 0x49, 0x3e, 0x81, 0xd9, 0x37, 0x0a, 0x1a, 0xb1, 0xdd, 0xe6, 0xd6, 0xeb, 0xe9, 0x2a, 0x1b,
0xb4, 0xcd, 0x19, 0x96, 0xc8, 0xe2, 0xba, 0x58, 0xc5, 0x5a, 0xed, 0x43, 0x63, 0x9d, 0x9d, 0x05,
0xb8, 0x4e, 0xcb, 0x92, 0x1f, 0x9a, 0xc9, 0x5f, 0x14, 0x0b, 0x6f, 0xa4, 0x0b, 0x33, 0x60, 0x62,
0x61, 0x48, 0xa4, 0xd3, 0x7d, 0xbc, 0x09, 0x44, 0xf9, 0xb3, 0x63, 0x64, 0xfc, 0x32, 0xcc, 0x0e,
0x83, 0x98, 0x6f, 0x7a, 0xd1, 0xa1, 0xde, 0x8e, 0x9a, 0x36, 0xc2, 0xad, 0xf6, 0xb4, 0xa4, 0xe8,
0x1f, 0x1c, 0xb8, 0xa6, 0x9d, 0x34, 0x75, 0x51, 0xa8, 0xc4, 0x21, 0xe7, 0x2c, 0x08, 0x62, 0x43,
0x9f, 0xc5, 0x23, 0xb7, 0xa0, 0x3a, 0x1c, 0x0f, 0x06, 0xfe, 0xbe, 0xcf, 0x43, 0x21, 0x24, 0x55,
0xdb, 0x4c, 0x72, 0x17, 0x48, 0xe2, 0xc1, 0xee, 0x88, 0x0f, 0xfb, 0x42, 0x54, 0xee, 0xfa, 0x29,
0x4f, 0x0c, 0x4b, 0xf3, 0x96, 0xa5, 0xff, 0x70, 0xa0, 0xae, 0x61, 0x15, 0x36, 0xbe, 0x85, 0xb9,
0xd1, 0xa1, 0xcf, 0x07, 0xfd, 0x86, 0x50, 0xf8, 0x4c, 0x9b, 0x6b, 0x31, 0xb3, 0x52, 0xcf, 0x95,
0xa5, 0x36, 0xf3, 0x0c, 0xa7, 0xf2, 0x67, 0x3a, 0x75, 0x0a, 0xaa, 0xc2, 0x14, 0xa8, 0xe8, 0xcf,
0x1d, 0xb8, 0xa1, 0x5d, 0xdc, 0x16, 0xfb, 0xfc, 0xb2, 0xe1, 0xfd, 0x06, 0x7d, 0xa3, 0x7f, 0x71,
0xe0, 0x7a, 0x92, 0x86, 0x57, 0x05, 0x79, 0x15, 0x16, 0x3c, 0x63, 0x6d, 0x7a, 0x38, 0x67, 0xd9,
0x68, 0x4c, 0xc2, 0x32, 0x52, 0xc2, 0x66, 0x5e, 0x15, 0x68, 0xfa, 0x53, 0x58, 0x90, 0xa7, 0x6a,
0x7a, 0x80, 0x7c, 0x3b, 0xa9, 0x2b, 0x53, 0x1b, 0x1c, 0x2c, 0x35, 0x49, 0xc9, 0x72, 0x2f, 0x2a,
0x59, 0x3f, 0x01, 0x68, 0x4d, 0xfc, 0x28, 0x7e, 0x82, 0xfb, 0x10, 0x0f, 0xb2, 0x24, 0x82, 0x0a,
0x8e, 0x94, 0x81, 0x27, 0x17, 0x47, 0x59, 0xa1, 0x75, 0x96, 0x49, 0x82, 0xae, 0x41, 0xed, 0x41,
0x70, 0x74, 0xe4, 0xc7, 0xdd, 0x90, 0xf3, 0xc7, 0xdc, 0x3b, 0xe6, 0x11, 0xe6, 0xfc, 0x40, 0xfc,
0x12, 0xa7, 0x44, 0x85, 0x29, 0x8a, 0xde, 0x86, 0x85, 0x54, 0x16, 0x31, 0x8e, 0x50, 0x69, 0x88,
0x3f, 0x94, 0xa4, 0x24, 0xe8, 0xef, 0x1d, 0x53, 0x72, 0x27, 0x0c, 0x8e, 0xb9, 0x38, 0x81, 0xed,
0x50, 0x25, 0x34, 0x3e, 0x13, 0xfe, 0xec, 0x8a, 0x43, 0x1e, 0x3b, 0xaf, 0x84, 0xc6, 0xce, 0x69,
0x24, 0xdd, 0xee, 0xf3, 0x89, 0x88, 0x4a, 0x95, 0x19, 0x1c, 0xe9, 0xf4, 0x91, 0xb4, 0x5c, 0x44,
0xa2, 0xca, 0x52, 0x06, 0xb6, 0x15, 0x87, 0x7c, 0x30, 0xe2, 0x61, 0x54, 0x2f, 0xac, 0xe4, 0x56,
0xab, 0x4c, 0x93, 0xb4, 0x05, 0x73, 0x68, 0x9c, 0x40, 0x93, 0xbf, 0xbe, 0xc8, 0xbc, 0x01, 0xf7,
0xf6, 0x8d, 0xa2, 0x92, 0xd0, 0xf4, 0x03, 0xa8, 0x08, 0xe4, 0xfc, 0x28, 0x66, 0x3c, 0x1a, 0x65,
0xb0, 0x2b, 0x27, 0xd8, 0x3d, 0x86, 0xf9, 0xb4, 0x21, 0xda, 0xf1, 0xfc, 0x10, 0x1d, 0x53, 0xed,
0x49, 0xda, 0xf4, 0x18, 0x1c, 0x7c, 0x6b, 0x84, 0x89, 0x94, 0x26, 0x6d, 0x42, 0xd3, 0xcf, 0x60,
0xbe, 0x95, 0x34, 0x8f, 0x42, 0x1b, 0xf6, 0x4f, 0xa1, 0x7f, 0x6c, 0xf6, 0x4f, 0x92, 0x44, 0x8b,
0x46, 0x66, 0xea, 0x2b, 0x8a, 0xfe, 0xcc, 0x81, 0xc5, 0x46, 0xaf, 0x87, 0xbb, 0x6c, 0x27, 0xf4,
0x8f, 0xbd, 0x9e, 0xe8, 0xf6, 0xbe, 0x6f, 0x75, 0x74, 0xf2, 0xcc, 0x7c, 0xe7, 0x54, 0x47, 0x87,
0xaf, 0x34, 0x7b, 0x3a, 0x5c, 0x66, 0xf4, 0xb7, 0xae, 0xb5, 0xcc, 0xb6, 0xd4, 0x6a, 0x7b, 0xbf,
0x80, 0xc5, 0xa7, 0xde, 0x60, 0xc0, 0xe3, 0x46, 0xbf, 0x1f, 0x2a, 0x2b, 0xc8, 0xba, 0x74, 0xc5,
0xeb, 0xe9, 0xf7, 0xeb, 0x93, 0xec, 0x94, 0xb5, 0x4c, 0x0b, 0x26, 0x5d, 0xb9, 0x9b, 0x76, 0xe5,
0xf4, 0x6b, 0x07, 0x40, 0xf6, 0x56, 0x4d, 0x2f, 0xf6, 0xb2, 0x4d, 0xba, 0x73, 0xba, 0x49, 0x7f,
0x0f, 0xca, 0xb2, 0x29, 0x4c, 0xc1, 0x4a, 0x19, 0x58, 0x6f, 0x92, 0x1d, 0x9e, 0x36, 0xf1, 0x16,
0xef, 0xac, 0xd3, 0x02, 0x63, 0x8d, 0xc5, 0x91, 0x79, 0xc3, 0x7e, 0x70, 0xa4, 0xaa, 0xad, 0xc1,
0xa1, 0x2d, 0x58, 0x54, 0x28, 0x19, 0x06, 0xa7, 0x8d, 0xaf, 0x63, 0x36, 0xbe, 0x66, 0xab, 0xec,
0x5a, 0xad, 0x32, 0xfd, 0x12, 0x16, 0x9b, 0xfc, 0xb2, 0x6a, 0x30, 0x2f, 0x42, 0xdf, 0xcc, 0x0b,
0x41, 0x99, 0xea, 0x73, 0xb6, 0xfa, 0xdf, 0x38, 0x30, 0xa7, 0x0e, 0x7a, 0x51, 0xca, 0x6e, 0x41,
0x55, 0xc3, 0x87, 0xf1, 0x8b, 0xd4, 0x0b, 0x6c, 0xa6, 0xcc, 0x73, 0x04, 0xb1, 0x91, 0x06, 0xc8,
0xe0, 0x58, 0x95, 0x57, 0x88, 0x64, 0x2b, 0xaf, 0x90, 0xaa, 0x43, 0x49, 0x62, 0x19, 0x29, 0x68,
0x35, 0x49, 0xbb, 0x50, 0x51, 0x46, 0x75, 0x27, 0xb8, 0x93, 0xbf, 0x9b, 0xb6, 0x5d, 0x76, 0xcb,
0x67, 0x98, 0x9e, 0xf6, 0x5b, 0x4b, 0x50, 0xfc, 0xea, 0xd5, 0x8e, 0x17, 0xeb, 0x9d, 0xad, 0x28,
0xfa, 0x4b, 0x07, 0x6a, 0xba, 0xa9, 0xc1, 0x62, 0x23, 0x36, 0xf7, 0x79, 0x67, 0xde, 0x6d, 0xbb,
0x68, 0xeb, 0xd2, 0x9e, 0x06, 0x42, 0xdf, 0x15, 0xae, 0x7a, 0x13, 0xf0, 0xa1, 0x2a, 0xaa, 0xa8,
0x17, 0x1f, 0x0a, 0x4b, 0x2e, 0x75, 0xf0, 0x2d, 0x63, 0x3b, 0x28, 0x17, 0xe9, 0x8a, 0xaa, 0x69,
0xb3, 0x26, 0xe6, 0xec, 0x9a, 0x78, 0x00, 0x55, 0xdd, 0x7d, 0x49, 0x2c, 0x57, 0x60, 0x2e, 0x0e,
0x62, 0x6f, 0xd0, 0x30, 0x7b, 0x73, 0x93, 0x25, 0xca, 0xaf, 0x82, 0x20, 0xd2, 0x7b, 0x26, 0x61,
0x18, 0xe8, 0xe6, 0x2c, 0x74, 0xff, 0xe6, 0xc2, 0x42, 0xd2, 0xe7, 0x49, 0x78, 0xc9, 0x87, 0x56,
0x9e, 0x4e, 0x45, 0x50, 0xa7, 0xee, 0x7f, 0xa7, 0xd5, 0x33, 0xa3, 0x9b, 0xcf, 0x44, 0x97, 0x42,
0x45, 0x14, 0xdf, 0x1d, 0x55, 0x63, 0xe5, 0x16, 0xb6, 0x78, 0x08, 0x85, 0xa0, 0x37, 0x06, 0xde,
0x81, 0x68, 0xa5, 0xcb, 0x2c, 0x65, 0x58, 0x69, 0x2e, 0x24, 0x4a, 0x99, 0x34, 0x17, 0x52, 0xeb,
0x50, 0x8e, 0xe5, 0x91, 0x19, 0xec, 0xd7, 0x67, 0xad, 0xf4, 0xb0, 0x92, 0x80, 0xa5, 0x62, 0xd4,
0x87, 0x32, 0x36, 0x48, 0x32, 0x62, 0xe7, 0xa5, 0xa8, 0xd9, 0x0d, 0x75, 0x03, 0x63, 0xaf, 0x65,
0xd9, 0x46, 0xdc, 0xf2, 0x56, 0xdc, 0xfe, 0xe8, 0xc2, 0x1c, 0xbe, 0x4b, 0xc7, 0xec, 0xb6, 0x7d,
0xb9, 0x3a, 0x3b, 0xe9, 0x6f, 0x02, 0xe0, 0x3b, 0xac, 0x1e, 0xcc, 0xe0, 0x60, 0xa2, 0x09, 0x4a,
0xc1, 0x2b, 0xcd, 0x32, 0x59, 0xe8, 0x18, 0x92, 0x66, 0x74, 0x34, 0x7d, 0x46, 0xa4, 0x0b, 0x97,
0x8a, 0x74, 0x31, 0x03, 0x92, 0x15, 0xc5, 0x52, 0x36, 0x8a, 0x6f, 0x13, 0x9f, 0xcf, 0x81, 0x58,
0x37, 0x05, 0x19, 0x28, 0x6b, 0xe3, 0x38, 0x67, 0x6f, 0x1c, 0xbb, 0x2c, 0x7d, 0x01, 0xd7, 0xec,
0x96, 0xfc, 0x9b, 0xac, 0x79, 0x31, 0x56, 0x1a, 0xa9, 0x5c, 0xaa, 0xfd, 0x1e, 0x14, 0xc4, 0x30,
0x40, 0x29, 0xbd, 0x91, 0x78, 0x9a, 0xf5, 0x86, 0x49, 0x39, 0xb2, 0x9e, 0x99, 0x19, 0x2c, 0x67,
0x56, 0x18, 0x36, 0xeb, 0xd9, 0x01, 0x5d, 0x83, 0xca, 0xae, 0xd1, 0xf1, 0x93, 0x0a, 0x38, 0xcf,
0x14, 0x20, 0xce, 0x33, 0xa4, 0x9e, 0x2b, 0x33, 0x9d, 0xe7, 0xf4, 0xeb, 0x5c, 0x06, 0x4b, 0x59,
0x11, 0x2f, 0x9d, 0x86, 0xff, 0x2f, 0x1c, 0x46, 0x62, 0x92, 0x1f, 0x40, 0xc5, 0xbc, 0x6b, 0xd5,
0xcb, 0x62, 0x99, 0x1e, 0x20, 0x9a, 0x41, 0x61, 0x96, 0xa0, 0x68, 0x85, 0x24, 0x5f, 0x36, 0x34,
0xa0, 0x5a, 0x21, 0x83, 0x47, 0xff, 0xe9, 0x64, 0x53, 0xf5, 0x8a, 0xb1, 0x32, 0x51, 0x75, 0x33,
0xa8, 0x5e, 0xf1, 0x0c, 0x3d, 0xe5, 0x69, 0xfe, 0x6d, 0x3d, 0x2d, 0x4c, 0xf1, 0xf4, 0xef, 0x0e,
0x2c, 0x6a, 0x4f, 0xd3, 0x5e, 0xe1, 0xc7, 0x50, 0x8d, 0xcd, 0x4c, 0x3d, 0x6f, 0x0f, 0xc9, 0x55,
0xb6, 0x3c, 0xb9, 0x0f, 0x95, 0xd8, 0x0b, 0x0f, 0x78, 0xbc, 0x7d, 0xf1, 0x8e, 0x92, 0x0a, 0x2c,
0x79, 0x5c, 0x2f, 0x27, 0x6e, 0x6a, 0x7d, 0xee, 0xe2, 0xf5, 0xa6, 0x3c, 0xfd, 0x85, 0x0b, 0x0b,
0x16, 0x32, 0x91, 0x80, 0x43, 0x6c, 0x74, 0xe9, 0xb9, 0xbe, 0xe3, 0x58, 0x3c, 0x94, 0x91, 0x3b,
0x5b, 0x41, 0x26, 0x63, 0x67, 0xf1, 0x50, 0x46, 0xbe, 0x4b, 0xc9, 0xa8, 0x5e, 0xda, 0xe4, 0x91,
0x3b, 0xc9, 0xac, 0x32, 0x2f, 0x46, 0x7f, 0x53, 0xa3, 0xa5, 0x87, 0x95, 0x77, 0x92, 0xc2, 0x53,
0x38, 0x3b, 0xb4, 0x7a, 0x5a, 0x79, 0x27, 0x99, 0x56, 0x16, 0xcf, 0x11, 0x56, 0xe3, 0xca, 0xbf,
0x3a, 0x30, 0xff, 0x20, 0xe4, 0x1e, 0xf6, 0xea, 0x6f, 0x92, 0x33, 0x56, 0x7e, 0xc4, 0xe8, 0xea,
0x01, 0x61, 0x42, 0xe3, 0x45, 0x44, 0x7c, 0x74, 0xc0, 0x0c, 0xab, 0xc8, 0x0f, 0x0c, 0x62, 0xc0,
0x1c, 0x45, 0x3c, 0x6e, 0x4d, 0x78, 0x4f, 0xf7, 0x48, 0x09, 0x43, 0x1c, 0x8d, 0x48, 0x74, 0x83,
0x57, 0x7c, 0xa8, 0x3f, 0x0d, 0xa4, 0x1c, 0xbc, 0x62, 0xc7, 0x7e, 0x3c, 0xe0, 0xaa, 0x32, 0x48,
0x42, 0xdf, 0xf7, 0xf0, 0x92, 0x54, 0x12, 0x26, 0x24, 0x57, 0xa1, 0x25, 0x28, 0xca, 0xe1, 0xbd,
0x28, 0x03, 0x05, 0xa6, 0x28, 0xfa, 0xc4, 0xbc, 0x81, 0x46, 0xe8, 0xc7, 0xd9, 0x77, 0xc6, 0x29,
0xd7, 0x29, 0xd4, 0xdb, 0xe7, 0xb1, 0xe7, 0x0f, 0x84, 0x8d, 0x05, 0xa6, 0x28, 0xfa, 0x6b, 0x17,
0xe6, 0xe5, 0x25, 0xae, 0x13, 0xc4, 0xe2, 0x3e, 0x7d, 0x6e, 0x13, 0x62, 0x0d, 0x29, 0xdc, 0xec,
0x90, 0xe2, 0xaa, 0xa5, 0xf7, 0xd4, 0xd8, 0x26, 0x3f, 0x6d, 0x6c, 0x83, 0x97, 0x07, 0x79, 0x77,
0x54, 0x1b, 0x58, 0x93, 0xa2, 0xe9, 0x8c, 0xbd, 0x78, 0x1c, 0x09, 0x74, 0xd3, 0x89, 0x0c, 0xba,
0xb2, 0x2b, 0x1e, 0x30, 0x25, 0x60, 0xf4, 0xa7, 0xa5, 0x0b, 0xfa, 0x53, 0xfa, 0x04, 0x16, 0x24,
0x22, 0xcd, 0x97, 0x5b, 0xfe, 0x44, 0x40, 0xf2, 0x21, 0xe4, 0xfd, 0xe1, 0x7e, 0x90, 0xb9, 0x51,
0xdb, 0xb8, 0x31, 0x21, 0x82, 0xd6, 0xc6, 0x13, 0x39, 0xee, 0x50, 0xf7, 0x3b, 0x45, 0xd2, 0x5f,
0xb9, 0xfa, 0xbe, 0x2c, 0xd4, 0xf6, 0xf9, 0x85, 0x2d, 0xdf, 0xff, 0x16, 0xda, 0x4b, 0x16, 0xda,
0x85, 0x04, 0xda, 0xeb, 0x50, 0x90, 0xf2, 0x32, 0x95, 0x25, 0x81, 0xb6, 0xf7, 0xfd, 0x90, 0xcb,
0x8f, 0x5b, 0x32, 0x97, 0x53, 0x06, 0xfd, 0xd4, 0xcc, 0x3a, 0x51, 0x71, 0xef, 0x40, 0x01, 0xfd,
0xd6, 0xdf, 0x36, 0xce, 0xc0, 0x58, 0xca, 0x50, 0x06, 0x4b, 0xf2, 0x41, 0x6b, 0xe8, 0xbd, 0x1c,
0x70, 0x35, 0x53, 0xc0, 0x1a, 0x37, 0xed, 0x03, 0x1f, 0x81, 0xbc, 0x1f, 0x6d, 0x3f, 0x52, 0xa3,
0x33, 0xf1, 0x9b, 0xd4, 0x20, 0x77, 0x14, 0x1d, 0x28, 0xb4, 0xf0, 0x27, 0xed, 0xc0, 0xbb, 0xd3,
0x74, 0xa2, 0x6d, 0xf7, 0xa0, 0x10, 0xf2, 0x68, 0xa4, 0x6d, 0xfb, 0x96, 0x65, 0x5b, 0xd6, 0x04,
0x26, 0x65, 0x69, 0x07, 0xe0, 0x71, 0xd0, 0xf3, 0x06, 0x5b, 0xfe, 0xa4, 0x3b, 0x41, 0x1b, 0x0e,
0xd3, 0x10, 0x8b, 0xdf, 0x08, 0xe8, 0x21, 0xf7, 0x0f, 0x0e, 0xe5, 0xe9, 0x90, 0x63, 0x8a, 0x42,
0x40, 0xfd, 0x64, 0x5e, 0x96, 0x63, 0x92, 0xa0, 0xbf, 0x73, 0xa0, 0x22, 0x74, 0xc9, 0x69, 0xd5,
0x6b, 0x33, 0xd3, 0x1c, 0x2b, 0xd3, 0x92, 0x97, 0xb9, 0x53, 0x5f, 0x96, 0x9b, 0xfe, 0xb2, 0xbc,
0xf1, 0xb2, 0x34, 0xa6, 0x85, 0x33, 0x63, 0x5a, 0xcc, 0xc6, 0xf4, 0x63, 0xa8, 0x1a, 0xf6, 0x45,
0x23, 0xf2, 0x3e, 0xe4, 0xe2, 0x89, 0x06, 0x4d, 0x6f, 0xb8, 0x14, 0x13, 0x86, 0x4f, 0xe9, 0x16,
0x2c, 0x2a, 0xec, 0xf0, 0xee, 0xc2, 0x78, 0x34, 0x1e, 0xfc, 0x27, 0x51, 0x6c, 0xc3, 0x35, 0xc6,
0x5f, 0x9f, 0x4a, 0x8b, 0x75, 0x28, 0x85, 0x42, 0xb5, 0x36, 0x47, 0x4f, 0xa5, 0x4e, 0xbd, 0x9b,
0x69, 0xc1, 0xb5, 0x2f, 0x01, 0xd2, 0xd1, 0x2e, 0x99, 0x83, 0x52, 0xb3, 0xb5, 0xb3, 0xbd, 0xdb,
0xee, 0xd6, 0x66, 0x48, 0x05, 0x66, 0x9f, 0xb6, 0xbb, 0x9b, 0x4d, 0xd6, 0x78, 0x5a, 0x73, 0xc8,
0x22, 0x54, 0xbb, 0xac, 0xd1, 0xd9, 0xdd, 0x68, 0xb1, 0x76, 0x67, 0x67, 0xaf, 0x5b, 0x73, 0x09,
0x81, 0x79, 0xcd, 0xda, 0xde, 0xeb, 0x22, 0x2f, 0x47, 0xaa, 0x50, 0x6e, 0xec, 0x75, 0x37, 0xb7,
0x59, 0xfb, 0x45, 0xab, 0x96, 0x5f, 0x5b, 0x17, 0x70, 0xa5, 0xdf, 0x83, 0x09, 0x40, 0x51, 0xbe,
0xaf, 0x36, 0x43, 0x66, 0x21, 0x8f, 0x37, 0xb5, 0x9a, 0x83, 0xef, 0x55, 0x85, 0xbf, 0xe6, 0xae,
0xbd, 0x2f, 0x52, 0x20, 0xf9, 0x62, 0x45, 0x4a, 0x90, 0x6b, 0xf4, 0xfb, 0xb5, 0x19, 0x5c, 0xdb,
0xe4, 0x03, 0x1e, 0xf3, 0x9a, 0xb3, 0xb6, 0x01, 0x90, 0x16, 0x40, 0x52, 0x86, 0xc2, 0x5e, 0xa7,
0xd9, 0xda, 0xa8, 0xcd, 0xe0, 0xcf, 0x27, 0x8d, 0xc7, 0xed, 0x66, 0xcd, 0x41, 0xfd, 0x7b, 0xbb,
0xad, 0x66, 0xcd, 0xc5, 0x95, 0x1b, 0x6c, 0xfb, 0x45, 0xab, 0x53, 0xcb, 0xa1, 0x5b, 0x7b, 0x1d,
0x45, 0xe5, 0xd7, 0x3e, 0x85, 0x77, 0xb6, 0xfc, 0x89, 0x4c, 0x72, 0xc6, 0xa3, 0x9e, 0x37, 0x54,
0x2a, 0x67, 0x21, 0xdf, 0x6e, 0x3e, 0x6e, 0x49, 0x1c, 0x76, 0x1f, 0x34, 0x3a, 0x9d, 0x76, 0xe7,
0x61, 0xcd, 0x41, 0x6a, 0xa3, 0xdd, 0x69, 0xef, 0x6e, 0xa2, 0xe2, 0xf5, 0x3f, 0x39, 0x00, 0x47,
0xfe, 0x44, 0xcf, 0x05, 0x3f, 0x86, 0x85, 0x87, 0x19, 0x3d, 0x55, 0x15, 0x03, 0xc6, 0x5f, 0x77,
0xfc, 0xc1, 0x72, 0x2d, 0x25, 0x77, 0xe3, 0xd0, 0x1f, 0x1e, 0xd0, 0x19, 0xf2, 0x11, 0xcc, 0xc9,
0x25, 0xe8, 0xd1, 0xa5, 0x56, 0xdc, 0x87, 0xaa, 0x15, 0x7d, 0xb2, 0x90, 0x0a, 0x89, 0x91, 0xd6,
0xf2, 0x72, 0xca, 0xc8, 0xe6, 0x09, 0x9d, 0x79, 0x59, 0x14, 0x7f, 0x6d, 0xb8, 0xf7, 0xef, 0x00,
0x00, 0x00, 0xff, 0xff, 0xfd, 0x6a, 0xf8, 0xd1, 0x0f, 0x21, 0x00, 0x00,
// 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,
}
// Reference imports to suppress errors if they are not otherwise used.
......
......@@ -69,12 +69,15 @@ func (p *MixType) GetName() string {
// GetLogMap get receipt log map
func (p *MixType) GetLogMap() map[int64]*types.LogInfo {
return map[int64]*types.LogInfo{
TyLogMixConfigVk: {Ty: reflect.TypeOf(ZkVerifyKeys{}), Name: "LogMixConfigVk"},
TyLogMixConfigAuth: {Ty: reflect.TypeOf(AuthKeys{}), Name: "LogMixConfigAuthPubKey"},
TyLogCurrentCommitTreeLeaves: {Ty: reflect.TypeOf(CommitTreeLeaves{}), Name: "LogCommitTreeLeaves"},
TyLogCurrentCommitTreeRoots: {Ty: reflect.TypeOf(CommitTreeRoots{}), Name: "LogCommitTreeRoots"},
TyLogMixConfigPaymentKey: {Ty: reflect.TypeOf(PaymentKey{}), Name: "LogConfigReceivingKey"},
TyLogNulliferSet: {Ty: reflect.TypeOf(ExistValue{}), Name: "LogNullifierSet"},
TyLogMixConfigVk: {Ty: reflect.TypeOf(ZkVerifyKeys{}), Name: "LogMixConfigVk"},
TyLogMixConfigAuth: {Ty: reflect.TypeOf(AuthKeys{}), Name: "LogMixConfigAuthPubKey"},
TyLogSubLeaves: {Ty: reflect.TypeOf(ReceiptCommitSubLeaves{}), Name: "LogSubLeaves"},
TyLogCommitTreeStatus: {Ty: reflect.TypeOf(ReceiptCommitTreeStatus{}), Name: "LogCommitTreeStatus"},
TyLogSubRoots: {Ty: reflect.TypeOf(ReceiptCommitSubRoots{}), Name: "LogSubRoots"},
TyLogArchiveRootLeaves: {Ty: reflect.TypeOf(ReceiptArchiveLeaves{}), Name: "LogArchiveRootLeaves"},
TyLogCommitTreeArchiveRoot: {Ty: reflect.TypeOf(ReceiptArchiveTreeRoot{}), Name: "LogCommitTreeArchiveRoot"},
TyLogMixConfigPaymentKey: {Ty: reflect.TypeOf(PaymentKey{}), Name: "LogConfigReceivingKey"},
TyLogNulliferSet: {Ty: reflect.TypeOf(ExistValue{}), Name: "LogNullifierSet"},
}
}
......
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