Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
plugin
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
JIRA
JIRA
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
link33
plugin
Commits
ffc16dbd
Commit
ffc16dbd
authored
Mar 02, 2021
by
madengji
Committed by
vipwzw
Sep 18, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
commit tree improve
parent
f9c75bbd
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
1313 additions
and
400 deletions
+1313
-400
testcase.sh
plugin/dapp/mix/cmd/build/testcase.sh
+3
-3
mix.go
plugin/dapp/mix/commands/mix.go
+36
-3
action.go
plugin/dapp/mix/executor/action.go
+0
-14
authorize.go
plugin/dapp/mix/executor/authorize.go
+6
-2
committree.go
plugin/dapp/mix/executor/committree.go
+289
-112
deposit.go
plugin/dapp/mix/executor/deposit.go
+1
-1
kv.go
plugin/dapp/mix/executor/kv.go
+28
-18
tree.go
plugin/dapp/mix/executor/merkletree/tree.go
+34
-7
query.go
plugin/dapp/mix/executor/query.go
+59
-13
transfer.go
plugin/dapp/mix/executor/transfer.go
+1
-1
withdraw.go
plugin/dapp/mix/executor/withdraw.go
+6
-2
mix.proto
plugin/dapp/mix/proto/mix.proto
+62
-0
mix.go
plugin/dapp/mix/types/mix.go
+15
-14
mix.pb.go
plugin/dapp/mix/types/mix.pb.go
+764
-204
type.go
plugin/dapp/mix/types/type.go
+9
-6
No files found.
plugin/dapp/mix/cmd/build/testcase.sh
View file @
ffc16dbd
#!/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
=
""
...
...
plugin/dapp/mix/commands/mix.go
View file @
ffc16dbd
...
...
@@ -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
,
}
//addGetPathCmdF
lags(cmd)
addGetRootsf
lags
(
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
.
Tree
List
Resp
var
res
mixTy
.
Tree
Status
Resp
ctx
:=
jsonclient
.
NewRPCCtx
(
rpcLaddr
,
"Chain33.Query"
,
params
,
&
res
)
ctx
.
Run
()
}
...
...
plugin/dapp/mix/executor/action.go
View file @
ffc16dbd
...
...
@@ -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
()
}
plugin/dapp/mix/executor/authorize.go
View file @
ffc16dbd
...
...
@@ -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
)
}
...
...
plugin/dapp/mix/executor/committree.go
View file @
ffc16dbd
...
...
@@ -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
get
CurrentCommitTreeRoots
(
db
dbm
.
KV
)
(
*
mixTy
.
CommitTreeRoots
,
error
)
{
return
getCommitTreeRoots
(
db
,
calc
CurrentCommitRootsKey
(
))
func
get
SubRoots
(
db
dbm
.
KV
,
seq
int32
)
(
*
mixTy
.
CommitTreeRoots
,
error
)
{
return
getCommitTreeRoots
(
db
,
calc
SubRootsKey
(
seq
))
}
func
getArchive
CommitRoots
(
db
dbm
.
KV
)
(
*
mixTy
.
CommitTreeRoots
,
error
)
{
return
getCommitTreeRoots
(
db
,
calc
CommitTreeArchiveRootsKey
(
))
func
getArchive
Roots
(
db
dbm
.
KV
,
seq
uint64
)
(
*
mixTy
.
CommitTreeRoots
,
error
)
{
return
getCommitTreeRoots
(
db
,
calc
ArchiveRootsKey
(
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
,
err
ors
.
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
,
err
ors
.
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
)
}
plugin/dapp/mix/executor/deposit.go
View file @
ffc16dbd
...
...
@@ -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
{
...
...
plugin/dapp/mix/executor/kv.go
View file @
ffc16dbd
...
...
@@ -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
calc
CurrentCommitRootsKey
(
)
[]
byte
{
return
[]
byte
(
fmt
.
Sprintf
(
commitTree
CurrentRoots
))
func
calc
SubRootsKey
(
seq
int32
)
[]
byte
{
return
[]
byte
(
fmt
.
Sprintf
(
commitTree
SubRoots
+
"%010d"
,
seq
))
}
func
calc
CurrentCommitLeavesKey
(
)
[]
byte
{
return
[]
byte
(
fmt
.
Sprintf
(
commitTree
CurrentLeaves
))
func
calc
SubLeavesKey
(
seq
int32
)
[]
byte
{
return
[]
byte
(
fmt
.
Sprintf
(
commitTree
SubLeaves
+
"%010d"
,
seq
))
}
func
calcCommitTreeRootLeaves
(
rootHash
string
)
[]
byte
{
...
...
plugin/dapp/mix/executor/merkletree/tree.go
View file @
ffc16dbd
...
...
@@ -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
*
s
ubTree
head
*
S
ubTree
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
s
ubTree
struct
{
next
*
s
ubTree
type
S
ubTree
struct
{
next
*
S
ubTree
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
)
*
s
ubTree
{
func
joinSubTrees
(
h
hash
.
Hash
,
a
,
b
*
SubTree
)
*
S
ubTree
{
// 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
&
s
ubTree
{
return
&
S
ubTree
{
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
=
&
s
ubTree
{
t
.
head
=
&
S
ubTree
{
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
=
&
s
ubTree
{
t
.
head
=
&
S
ubTree
{
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
}
plugin/dapp/mix/executor/query.go
View file @
ffc16dbd
...
...
@@ -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
)
...
...
plugin/dapp/mix/executor/transfer.go
View file @
ffc16dbd
...
...
@@ -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
{
...
...
plugin/dapp/mix/executor/withdraw.go
View file @
ffc16dbd
...
...
@@ -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
)
}
...
...
plugin/dapp/mix/proto/mix.proto
View file @
ffc16dbd
...
...
@@ -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
...
...
plugin/dapp/mix/types/mix.go
View file @
ffc16dbd
...
...
@@ -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
...
...
plugin/dapp/mix/types/mix.pb.go
View file @
ffc16dbd
...
...
@@ -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
{
2
0
}
return
fileDescriptor_5c21d519a9be369a
,
[]
int
{
2
8
}
}
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
{
2
1
}
return
fileDescriptor_5c21d519a9be369a
,
[]
int
{
2
9
}
}
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.
...
...
plugin/dapp/mix/types/type.go
View file @
ffc16dbd
...
...
@@ -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"
},
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment