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
e78a46ce
Commit
e78a46ce
authored
Oct 13, 2021
by
harrylee
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update broker
parent
6e5ca49f
Pipeline
#8128
failed with stages
in 0 seconds
Changes
7
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
367 additions
and
162 deletions
+367
-162
brokerdb.go
plugin/dapp/broker/executor/brokerdb.go
+97
-65
exec.go
plugin/dapp/broker/executor/exec.go
+3
-3
kv.go
plugin/dapp/broker/executor/kv.go
+7
-3
query.go
plugin/dapp/broker/executor/query.go
+18
-10
broker.proto
plugin/dapp/broker/proto/broker.proto
+27
-5
broker.go
plugin/dapp/broker/types/broker.go
+4
-0
broker.pb.go
plugin/dapp/broker/types/broker.pb.go
+211
-76
No files found.
plugin/dapp/broker/executor/brokerdb.go
View file @
e78a46ce
...
...
@@ -22,6 +22,11 @@ type BrokerDB struct {
index
int
}
var
(
// DefaultManagerAddr 默认管理员地址
DefaultManagerAddr
=
"12qyocayNF7Lv6C9qW4avxs2E7U41fKSfv"
)
func
newBrokerDB
(
b
*
broker
,
tx
*
types
.
Transaction
,
index
int
)
*
BrokerDB
{
hash
:=
tx
.
Hash
()
fromaddr
:=
tx
.
From
()
...
...
@@ -30,12 +35,12 @@ func newBrokerDB(b *broker, tx *types.Transaction, index int) *BrokerDB {
}
//GetKVSet ...
func
(
b
*
BrokerDB
)
GetMetaKVSet
(
req
uint64
,
meta
*
brokertypes
.
Meta
)
(
kvset
[]
*
types
.
KeyValue
)
{
if
req
==
brokertypes
.
Req_Callback
{
func
(
b
*
BrokerDB
)
GetMetaKVSet
(
req
uint64
,
meta
*
brokertypes
.
Meta
)
(
kvset
[]
*
types
.
KeyValue
)
{
if
req
==
brokertypes
.
Req_Callback
{
kvset
=
append
(
kvset
,
&
types
.
KeyValue
{
Key
:
calCallBackMetaKey
(),
Value
:
types
.
Encode
(
meta
)})
}
else
if
req
==
brokertypes
.
Req_Inner
{
}
else
if
req
==
brokertypes
.
Req_Inner
{
kvset
=
append
(
kvset
,
&
types
.
KeyValue
{
Key
:
calInnerMetaKey
(),
Value
:
types
.
Encode
(
meta
)})
}
else
if
req
==
brokertypes
.
Req_DstRollback
{
}
else
if
req
==
brokertypes
.
Req_DstRollback
{
kvset
=
append
(
kvset
,
&
types
.
KeyValue
{
Key
:
calDstRollBackMetaKey
(),
Value
:
types
.
Encode
(
meta
)})
}
return
kvset
...
...
@@ -43,14 +48,28 @@ func (b *BrokerDB) GetMetaKVSet(req uint64,meta *brokertypes.Meta) (kvset []*typ
//GetKVSet ...
func
(
b
*
BrokerDB
)
GetEventKVSet
(
event
*
brokertypes
.
InterchainEvent
)
(
kvset
[]
*
types
.
KeyValue
)
{
kvset
=
append
(
kvset
,
&
types
.
KeyValue
{
Key
:
calServicePair
(
event
.
GetSrcServiceID
(),
event
.
GetDstServiceID
(),
event
.
Index
),
Value
:
types
.
Encode
(
event
)})
kvset
=
append
(
kvset
,
&
types
.
KeyValue
{
Key
:
calServicePair
(
event
.
GetSrcServiceID
(),
event
.
GetDstServiceID
(),
event
.
Index
),
Value
:
types
.
Encode
(
event
)})
return
kvset
}
//初始化broker
func
(
b
*
BrokerDB
)
initBroker
(
payload
*
brokertypes
.
Init
)
(
*
types
.
Receipt
,
error
)
{
//权限检查且只能初始化一次
if
b
.
fromaddr
!=
getManagerAddr
(
b
.
api
.
GetConfig
(),
b
.
db
,
brokerAdmin
,
DefaultManagerAddr
)
{
return
nil
,
fmt
.
Errorf
(
"the addr %s is not admin"
,
b
.
fromaddr
)
}
receipt
:=
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
}
receipt
.
KV
=
append
(
receipt
.
KV
,
&
types
.
KeyValue
{
Key
:
BxhIDKey
(),
Value
:
types
.
Encode
(
payload
)})
receipt
.
Ty
=
brokertypes
.
TyInitLog
return
receipt
,
nil
}
//其他执行器注册授权
func
(
b
*
BrokerDB
)
register
(
payload
*
brokertypes
.
Register
)
(
*
types
.
Receipt
,
error
)
{
return
nil
,
nil
}
//管理员审批
func
(
b
*
BrokerDB
)
audit
(
payload
*
brokertypes
.
Audit
)
(
*
types
.
Receipt
,
error
)
{
...
...
@@ -60,9 +79,9 @@ func (b *BrokerDB) audit(payload *brokertypes.Audit) (*types.Receipt, error) {
func
(
b
*
BrokerDB
)
updateIndex
(
payload
*
brokertypes
.
UpdateIndex
)
(
*
types
.
Receipt
,
error
)
{
//FIXME 权限检查
receipt
:=
&
types
.
Receipt
{
Ty
:
types
.
ExecOk
}
if
payload
.
ReqType
==
brokertypes
.
Req_Inner
{
meta
,
err
:=
getMeta
(
b
.
db
,
calInnerMetaKey
())
if
err
!=
nil
{
if
payload
.
ReqType
==
brokertypes
.
Req_Inner
{
meta
,
err
:=
getMeta
(
b
.
db
,
calInnerMetaKey
())
if
err
!=
nil
{
meta
=
&
brokertypes
.
Meta
{
Meta
:
make
(
map
[
string
]
uint64
),
XXX_NoUnkeyedLiteral
:
struct
{}{},
...
...
@@ -70,19 +89,18 @@ func (b *BrokerDB) updateIndex(payload *brokertypes.UpdateIndex) (*types.Receipt
XXX_sizecache
:
0
,
}
}
idx
:=
meta
.
Meta
[
genServicePair
(
payload
.
SrcServiceID
,
payload
.
DstServiceID
)]
idx
:=
meta
.
Meta
[
genServicePair
(
payload
.
SrcServiceID
,
payload
.
DstServiceID
)]
if
payload
.
SequenceNum
!=
idx
+
1
{
return
nil
,
fmt
.
Errorf
(
"incorrect index, expect %d"
,
idx
+
1
)
return
nil
,
fmt
.
Errorf
(
"incorrect index, expect %d"
,
idx
+
1
)
}
meta
.
Meta
[
genServicePair
(
payload
.
SrcServiceID
,
payload
.
DstServiceID
)]
=
idx
+
1
kvset
:=
b
.
GetMetaKVSet
(
payload
.
ReqType
,
meta
)
kvset
=
append
(
kvset
,
&
types
.
KeyValue
{
Key
:
inMsgKey
(
genServicePair
(
payload
.
SrcServiceID
,
payload
.
DstServiceID
),
idx
+
1
),
Value
:
types
.
Encode
(
payload
.
Response
)})
receipt
.
KV
=
append
(
receipt
.
KV
,
kvset
...
)
meta
.
Meta
[
genServicePair
(
payload
.
SrcServiceID
,
payload
.
DstServiceID
)]
=
idx
+
1
kvset
:=
b
.
GetMetaKVSet
(
payload
.
ReqType
,
meta
)
kvset
=
append
(
kvset
,
&
types
.
KeyValue
{
Key
:
inMsgKey
(
genServicePair
(
payload
.
SrcServiceID
,
payload
.
DstServiceID
),
idx
+
1
),
Value
:
types
.
Encode
(
payload
.
Response
)})
receipt
.
KV
=
append
(
receipt
.
KV
,
kvset
...
)
}
else
if
payload
.
ReqType
==
brokertypes
.
Req_Callback
{
meta
,
err
:=
getMeta
(
b
.
db
,
calCallBackMetaKey
())
if
err
!=
nil
{
}
else
if
payload
.
ReqType
==
brokertypes
.
Req_Callback
{
meta
,
err
:=
getMeta
(
b
.
db
,
calCallBackMetaKey
())
if
err
!=
nil
{
meta
=
&
brokertypes
.
Meta
{
Meta
:
make
(
map
[
string
]
uint64
),
XXX_NoUnkeyedLiteral
:
struct
{}{},
...
...
@@ -90,18 +108,18 @@ func (b *BrokerDB) updateIndex(payload *brokertypes.UpdateIndex) (*types.Receipt
XXX_sizecache
:
0
,
}
}
idx
:=
meta
.
Meta
[
genServicePair
(
payload
.
SrcServiceID
,
payload
.
DstServiceID
)]
idx
:=
meta
.
Meta
[
genServicePair
(
payload
.
SrcServiceID
,
payload
.
DstServiceID
)]
if
payload
.
SequenceNum
!=
idx
+
1
{
return
nil
,
fmt
.
Errorf
(
"incorrect index, expect %d"
,
idx
+
1
)
return
nil
,
fmt
.
Errorf
(
"incorrect index, expect %d"
,
idx
+
1
)
}
meta
.
Meta
[
genServicePair
(
payload
.
SrcServiceID
,
payload
.
DstServiceID
)]
=
idx
+
1
kvset
:=
b
.
GetMetaKVSet
(
payload
.
ReqType
,
meta
)
kvset
=
append
(
kvset
,
&
types
.
KeyValue
{
Key
:
outMsgKey
(
genServicePair
(
payload
.
SrcServiceID
,
payload
.
DstServiceID
),
idx
+
1
),
Value
:
types
.
Encode
(
payload
.
Response
)})
receipt
.
KV
=
append
(
receipt
.
KV
,
kvset
...
)
}
else
if
payload
.
ReqType
==
brokertypes
.
Req_DstRollback
{
//todo
meta
,
err
:=
getMeta
(
b
.
db
,
calDstRollBackMetaKey
())
if
err
!=
nil
{
meta
.
Meta
[
genServicePair
(
payload
.
SrcServiceID
,
payload
.
DstServiceID
)]
=
idx
+
1
kvset
:=
b
.
GetMetaKVSet
(
payload
.
ReqType
,
meta
)
kvset
=
append
(
kvset
,
&
types
.
KeyValue
{
Key
:
outMsgKey
(
genServicePair
(
payload
.
SrcServiceID
,
payload
.
DstServiceID
),
idx
+
1
),
Value
:
types
.
Encode
(
payload
.
Response
)})
receipt
.
KV
=
append
(
receipt
.
KV
,
kvset
...
)
}
else
if
payload
.
ReqType
==
brokertypes
.
Req_DstRollback
{
//todo
meta
,
err
:=
getMeta
(
b
.
db
,
calDstRollBackMetaKey
())
if
err
!=
nil
{
meta
=
&
brokertypes
.
Meta
{
Meta
:
make
(
map
[
string
]
uint64
),
XXX_NoUnkeyedLiteral
:
struct
{}{},
...
...
@@ -109,13 +127,13 @@ func (b *BrokerDB) updateIndex(payload *brokertypes.UpdateIndex) (*types.Receipt
XXX_sizecache
:
0
,
}
}
idx
:=
meta
.
Meta
[
genServicePair
(
payload
.
SrcServiceID
,
payload
.
DstServiceID
)]
idx
:=
meta
.
Meta
[
genServicePair
(
payload
.
SrcServiceID
,
payload
.
DstServiceID
)]
if
payload
.
SequenceNum
<
idx
+
1
{
return
nil
,
fmt
.
Errorf
(
"incorrect dstrollback index, expect %d"
,
idx
+
1
)
return
nil
,
fmt
.
Errorf
(
"incorrect dstrollback index, expect %d"
,
idx
+
1
)
}
meta
.
Meta
[
genServicePair
(
payload
.
SrcServiceID
,
payload
.
DstServiceID
)]
=
payload
.
SequenceNum
kvset
:=
b
.
GetMetaKVSet
(
payload
.
ReqType
,
meta
)
receipt
.
KV
=
append
(
receipt
.
KV
,
kvset
...
)
meta
.
Meta
[
genServicePair
(
payload
.
SrcServiceID
,
payload
.
DstServiceID
)]
=
payload
.
SequenceNum
kvset
:=
b
.
GetMetaKVSet
(
payload
.
ReqType
,
meta
)
receipt
.
KV
=
append
(
receipt
.
KV
,
kvset
...
)
}
log
:=
&
brokertypes
.
ReceiptBrokerLog
{
Value
:
&
brokertypes
.
ReceiptBrokerLog_UpdateIndex
{
payload
},
Ty
:
brokertypes
.
TyEmitInterchainEventAction
}
receiptlog
:=
&
types
.
ReceiptLog
{
Ty
:
brokertypes
.
TyUpdateIndexLog
,
Log
:
types
.
Encode
(
log
)}
...
...
@@ -142,17 +160,17 @@ func (b *BrokerDB) emitInterchainEvent(payload *brokertypes.InterchainEvent) (*t
XXX_sizecache
:
0
,
}
}
currServiceID
,
err
:=
b
.
getCurrServiceID
()
if
err
!=
nil
{
return
nil
,
err
currServiceID
,
err
:=
b
.
getCurrServiceID
()
if
err
!=
nil
{
return
nil
,
err
}
payload
.
SrcServiceID
=
currServiceID
payload
.
SrcServiceID
=
currServiceID
//idx :=meta.Meta[genServicePair(currServiceID, payload.DstServiceID)]
meta
.
Meta
[
genServicePair
(
currServiceID
,
payload
.
DstServiceID
)]
++
kvset
:=
&
types
.
KeyValue
{
Key
:
calOutterMetaKey
(),
Value
:
types
.
Encode
(
meta
)}
payload
.
Index
=
meta
.
Meta
[
genServicePair
(
currServiceID
,
payload
.
DstServiceID
)]
receipt
.
KV
=
append
(
receipt
.
KV
,
kvset
)
receipt
.
KV
=
append
(
receipt
.
KV
,
b
.
GetEventKVSet
(
payload
)
...
)
payload
.
Index
=
meta
.
Meta
[
genServicePair
(
currServiceID
,
payload
.
DstServiceID
)]
receipt
.
KV
=
append
(
receipt
.
KV
,
kvset
)
receipt
.
KV
=
append
(
receipt
.
KV
,
b
.
GetEventKVSet
(
payload
)
...
)
log
:=
&
brokertypes
.
ReceiptBrokerLog
{
Value
:
&
brokertypes
.
ReceiptBrokerLog_EmitInterchainEvent
{
payload
},
Ty
:
brokertypes
.
TyEmitInterchainEventAction
}
receiptlog
:=
&
types
.
ReceiptLog
{
Ty
:
brokertypes
.
TyEmitInterchainEventLog
,
Log
:
types
.
Encode
(
log
)}
...
...
@@ -165,24 +183,35 @@ func (b *BrokerDB) emitInterchainEvent(payload *brokertypes.InterchainEvent) (*t
}
return
receipt
,
nil
}
//获取当前链得ID
func
(
b
*
BrokerDB
)
getCurrServiceID
()
(
string
,
error
)
{
return
b
.
genFullServiceID
(
b
.
api
.
GetConfig
()
.
GetTitle
())
func
(
b
*
BrokerDB
)
getCurrServiceID
()
(
string
,
error
)
{
return
b
.
genFullServiceID
(
b
.
api
.
GetConfig
()
.
GetTitle
())
}
func
(
b
*
BrokerDB
)
genFullServiceID
(
serviceId
string
)
(
string
,
error
)
{
//TODO 需要init方法,用于初始化bixhID和appChainID
bxhId
,
err
:=
b
.
db
.
Get
([]
byte
(
KeyPrefixStateDB
+
bxhID
))
data
,
err
:=
b
.
db
.
Get
(
BxhIDKey
(
))
if
err
!=
nil
{
return
""
,
err
}
appchainId
,
err
:=
b
.
db
.
Get
([]
byte
(
KeyPrefixLocalDB
+
appchainID
))
var
info
brokertypes
.
BrokerInfo
types
.
Decode
(
data
,
&
info
)
return
fmt
.
Sprintf
(
"%s:%s:%s"
,
info
.
GetBxhId
(),
info
.
GetAppChainId
(),
serviceId
),
nil
}
//获取broker信息
func
getBrokerInfo
(
statedb
dbm
.
KV
)
(
*
brokertypes
.
BrokerInfo
,
error
)
{
//TODO 需要init方法,用于初始化bixhID和appChainID
data
,
err
:=
statedb
.
Get
(
BxhIDKey
())
if
err
!=
nil
{
return
""
,
err
return
nil
,
err
}
return
fmt
.
Sprintf
(
"%s:%s:%s"
,
bxhId
,
appchainId
,
serviceId
),
nil
var
info
brokertypes
.
BrokerInfo
types
.
Decode
(
data
,
&
info
)
return
&
info
,
nil
}
//去状态数据库中查询Event
func
getEvent
(
statedb
dbm
.
KV
,
key
[]
byte
)
(
*
brokertypes
.
InterchainEvent
,
error
)
{
data
,
err
:=
statedb
.
Get
(
key
)
...
...
@@ -230,46 +259,50 @@ func getMessage(statedb dbm.KV, key []byte) (*brokertypes.Response, error) {
}
return
&
resp
,
nil
}
//监听获取跨出事件列表
func
pollInterEvent
(
statedb
dbm
.
KV
,
meta
*
brokertypes
.
Meta
)(
*
brokertypes
.
InterChainEventList
,
error
)
{
outMeta
,
err
:=
getMeta
(
statedb
,
calOutterMetaKey
())
if
err
!=
nil
{
func
pollInterEvent
(
statedb
dbm
.
KV
,
meta
*
brokertypes
.
Meta
)
(
*
brokertypes
.
InterChainEventList
,
error
)
{
outMeta
,
err
:=
getMeta
(
statedb
,
calOutterMetaKey
())
if
err
!=
nil
{
elog
.
Error
(
"getMeta"
,
"not found"
,
"key:"
,
calOutterMetaKey
)
return
nil
,
err
}
var
eventList
brokertypes
.
InterChainEventList
var
eventList
brokertypes
.
InterChainEventList
for
method
,
idx
:=
range
outMeta
.
Meta
{
startPos
,
ok
:=
meta
.
Meta
[
method
]
if
!
ok
{
startPos
=
0
}
for
i
:=
startPos
+
1
;
i
<=
idx
;
i
++
{
event
,
err
:=
getEvent
(
statedb
,
calEventKey
(
method
,
i
))
event
,
err
:=
getEvent
(
statedb
,
calEventKey
(
method
,
i
))
if
err
!=
nil
{
elog
.
Error
(
"get out event by key %s fail"
,
calEventKey
(
method
,
i
))
elog
.
Error
(
"get out event by key %s fail"
,
calEventKey
(
method
,
i
))
continue
}
eventList
.
List
=
append
(
eventList
.
List
,
event
)
eventList
.
List
=
append
(
eventList
.
List
,
event
)
}
}
return
&
eventList
,
nil
return
&
eventList
,
nil
}
//获取outerMeta
func
getOutterMeta
(
statedb
dbm
.
KV
)
(
*
brokertypes
.
Meta
,
error
)
{
return
getMeta
(
statedb
,
calOutterMetaKey
())
func
getOutterMeta
(
statedb
dbm
.
KV
)
(
*
brokertypes
.
Meta
,
error
)
{
return
getMeta
(
statedb
,
calOutterMetaKey
())
}
//获取innerMeta
func
getInnerMeta
(
statedb
dbm
.
KV
)
(
*
brokertypes
.
Meta
,
error
)
{
return
getMeta
(
statedb
,
calInnerMetaKey
())
func
getInnerMeta
(
statedb
dbm
.
KV
)
(
*
brokertypes
.
Meta
,
error
)
{
return
getMeta
(
statedb
,
calInnerMetaKey
())
}
//获取message
func
getInMessage
(
statedb
dbm
.
KV
,
query
*
brokertypes
.
QueryInMessage
)(
*
brokertypes
.
Response
,
error
)
{
return
getMessage
(
statedb
,
inMsgKey
(
query
.
InServicePair
,
query
.
SequenceNum
))
func
getInMessage
(
statedb
dbm
.
KV
,
query
*
brokertypes
.
QueryInMessage
)
(
*
brokertypes
.
Response
,
error
)
{
return
getMessage
(
statedb
,
inMsgKey
(
query
.
InServicePair
,
query
.
SequenceNum
))
}
//获取message
func
getOutMessage
(
statedb
dbm
.
KV
,
query
*
brokertypes
.
QueryOutMessage
)(
*
brokertypes
.
Response
,
error
)
{
return
getMessage
(
statedb
,
outMsgKey
(
query
.
InServicePair
,
query
.
SequenceNum
))
func
getOutMessage
(
statedb
dbm
.
KV
,
query
*
brokertypes
.
QueryOutMessage
)
(
*
brokertypes
.
Response
,
error
)
{
return
getMessage
(
statedb
,
outMsgKey
(
query
.
InServicePair
,
query
.
SequenceNum
))
}
func
getConfValue
(
cfg
*
types
.
Chain33Config
,
db
dbm
.
KV
,
key
string
,
defaultValue
int64
)
int64
{
...
...
@@ -341,4 +374,4 @@ func getConfigKey(key string, db dbm.KV) ([]byte, error) {
return
nil
,
err
}
return
value
,
nil
}
\ No newline at end of file
}
plugin/dapp/broker/executor/exec.go
View file @
e78a46ce
...
...
@@ -10,9 +10,9 @@ import (
* 关键数据上链(statedb)并生成交易回执(log)
*/
func
(
b
*
broker
)
Exec_Init
()(
*
types
.
Receipt
,
error
){
return
nil
,
nil
func
(
b
*
broker
)
Exec_Init
(
payload
*
brokertypes
.
Init
,
tx
*
types
.
Transaction
,
index
int
)(
*
types
.
Receipt
,
error
){
db
:=
newBrokerDB
(
b
,
tx
,
index
)
return
db
.
initBroker
(
payload
)
}
func
(
b
*
broker
)
Exec_Register
(
payload
*
brokertypes
.
Register
,
tx
*
types
.
Transaction
,
index
int
)
(
*
types
.
Receipt
,
error
)
{
...
...
plugin/dapp/broker/executor/kv.go
View file @
e78a46ce
...
...
@@ -19,14 +19,18 @@ const (
callbackMeta
=
"callback-meta"
dstRollbackMeta
=
"dst-rollback-meta"
whiteList
=
"white-list"
adminList
=
"admin-list"
//
adminList = "admin-list"
passed
=
"1"
rejected
=
"2"
delimiter
=
"&"
bxhID
=
"bxh-id"
appchainID
=
"appchain-id"
//appchainID = "appchain-id"
brokerAdmin
=
"broker-admin"
)
//跨链协议版本信息
func
BxhIDKey
()[]
byte
{
return
[]
byte
(
KeyPrefixStateDB
+
bxhID
)
}
//状态数据库中存储innermeta信息
func
calInnerMetaKey
()
[]
byte
{
key
:=
fmt
.
Sprintf
(
"%s"
+
":%s"
,
KeyPrefixStateDB
,
innerMeta
)
...
...
plugin/dapp/broker/executor/query.go
View file @
e78a46ce
...
...
@@ -3,24 +3,33 @@ package executor
import
(
brokertypes
"github.com/33cn/plugin/plugin/dapp/broker/types"
)
//获取innterMeta
func
(
b
*
broker
)
Query_QueryInnerMeta
(
query
*
brokertypes
.
QueryInnerMeta
)(
*
brokertypes
.
Meta
,
error
)
{
func
(
b
*
broker
)
Query_QueryInnerMeta
(
query
*
brokertypes
.
QueryInnerMeta
)
(
*
brokertypes
.
Meta
,
error
)
{
return
getInnerMeta
(
b
.
GetStateDB
())
}
//获取outterMeta
func
(
b
*
broker
)
Query_QueryOutterMeta
(
query
*
brokertypes
.
QueryOutterMeta
)(
*
brokertypes
.
Meta
,
error
)
{
func
(
b
*
broker
)
Query_QueryOutterMeta
(
query
*
brokertypes
.
QueryOutterMeta
)
(
*
brokertypes
.
Meta
,
error
)
{
return
getOutterMeta
(
b
.
GetStateDB
())
}
//获取inMessage
func
(
b
*
broker
)
Query_QueryInMessage
(
query
*
brokertypes
.
QueryInMessage
)(
*
brokertypes
.
Response
,
error
)
{
return
getInMessage
(
b
.
GetStateDB
(),
query
)
func
(
b
*
broker
)
Query_QueryInMessage
(
query
*
brokertypes
.
QueryInMessage
)
(
*
brokertypes
.
Response
,
error
)
{
return
getInMessage
(
b
.
GetStateDB
(),
query
)
}
//获取outMessage
func
(
b
*
broker
)
Query_QueryOutMessage
(
query
*
brokertypes
.
QueryOutMessage
)(
*
brokertypes
.
Response
,
error
)
{
return
getOutMessage
(
b
.
GetStateDB
(),
query
)
func
(
b
*
broker
)
Query_QueryOutMessage
(
query
*
brokertypes
.
QueryOutMessage
)
(
*
brokertypes
.
Response
,
error
)
{
return
getOutMessage
(
b
.
GetStateDB
(),
query
)
}
//获取监听列表
func
(
b
*
broker
)
Query_PollingEvent
(
query
*
brokertypes
.
PollingEvent
)(
*
brokertypes
.
InterChainEventList
,
error
){
return
pollInterEvent
(
b
.
GetStateDB
(),
query
.
Meta
)
}
\ No newline at end of file
func
(
b
*
broker
)
Query_PollingEvent
(
query
*
brokertypes
.
PollingEvent
)
(
*
brokertypes
.
InterChainEventList
,
error
)
{
return
pollInterEvent
(
b
.
GetStateDB
(),
query
.
Meta
)
}
//get bitxhub and chainID
func
(
b
*
broker
)
Query_GetBrokerInfo
(
query
*
brokertypes
.
QueryNilParam
)
(
*
brokertypes
.
BrokerInfo
,
error
)
{
return
getBrokerInfo
(
b
.
GetStateDB
())
}
plugin/dapp/broker/proto/broker.proto
View file @
e78a46ce
...
...
@@ -3,13 +3,23 @@ package types;
option
go_package
=
"../types"
;
message
BrokerAction
{
oneof
value
{
Register
register
=
1
;
Audit
audit
=
2
;
InterchainEvent
emitInterchainEvent
=
3
;
UpdateIndex
updateIndex
=
4
;
Init
init
=
1
;
Register
register
=
2
;
Audit
audit
=
3
;
InterchainEvent
emitInterchainEvent
=
4
;
UpdateIndex
updateIndex
=
5
;
}
int32
ty
=
5
;
int32
ty
=
6
;
}
//broker初始化信息
message
Init
{
string
bxhId
=
1
;
string
appChainId
=
2
;
}
// 业务合约注册模型: 0表示正在审核,1表示审核通过,2表示审核失败
message
Register
{
//业务合约名称
...
...
@@ -101,6 +111,10 @@ message InterChainEventList{
// repeated InterchainEvent list = 1;
// string primaryKey = 2;
//}
message
QueryNilParam
{
}
message
QueryOutterMeta
{
}
...
...
@@ -119,6 +133,14 @@ message QueryOutMessage{
uint64
sequenceNum
=
2
;
}
message
BrokerInfo
{
//跨链协议版本ID
string
bxhId
=
1
;
//应用链ID
string
appChainId
=
2
;
}
message
Meta
{
map
<
string
,
uint64
>
meta
=
1
;
}
...
...
plugin/dapp/broker/types/broker.go
View file @
e78a46ce
...
...
@@ -14,11 +14,13 @@ import (
// action类型id和name,这些常量可以自定义修改
const
(
TyUnknowAction
=
iota
+
100
TyInitAction
TyRegisterAction
TyAuditAction
TyUpdateIndexAction
TyEmitInterchainEventAction
NameInitAction
=
"Init"
NameRegisterAction
=
"Register"
NameAuditAction
=
"Audit"
NameUpdateIndexAction
=
"UpdateIndex"
...
...
@@ -69,6 +71,7 @@ const (
// log类型id值
const
(
TyUnknownLog
=
iota
+
100
TyInitLog
TyRegisterLog
TyAuditLog
TyUpdateIndexLog
...
...
@@ -80,6 +83,7 @@ var (
BrokerX
=
"broker"
//定义actionMap
actionMap
=
map
[
string
]
int32
{
NameInitAction
:
TyInitAction
,
NameRegisterAction
:
TyRegisterAction
,
NameAuditAction
:
TyAuditAction
,
NameUpdateIndexAction
:
TyUpdateIndexAction
,
...
...
plugin/dapp/broker/types/broker.pb.go
View file @
e78a46ce
...
...
@@ -24,12 +24,13 @@ const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
type
BrokerAction
struct
{
// Types that are valid to be assigned to Value:
// *BrokerAction_Init
// *BrokerAction_Register
// *BrokerAction_Audit
// *BrokerAction_EmitInterchainEvent
// *BrokerAction_UpdateIndex
Value
isBrokerAction_Value
`protobuf_oneof:"value"`
Ty
int32
`protobuf:"varint,
5
,opt,name=ty,proto3" json:"ty,omitempty"`
Ty
int32
`protobuf:"varint,
6
,opt,name=ty,proto3" json:"ty,omitempty"`
XXX_NoUnkeyedLiteral
struct
{}
`json:"-"`
XXX_unrecognized
[]
byte
`json:"-"`
XXX_sizecache
int32
`json:"-"`
...
...
@@ -64,22 +65,28 @@ type isBrokerAction_Value interface {
isBrokerAction_Value
()
}
type
BrokerAction_Init
struct
{
Init
*
Init
`protobuf:"bytes,1,opt,name=init,proto3,oneof"`
}
type
BrokerAction_Register
struct
{
Register
*
Register
`protobuf:"bytes,
1
,opt,name=register,proto3,oneof"`
Register
*
Register
`protobuf:"bytes,
2
,opt,name=register,proto3,oneof"`
}
type
BrokerAction_Audit
struct
{
Audit
*
Audit
`protobuf:"bytes,
2
,opt,name=audit,proto3,oneof"`
Audit
*
Audit
`protobuf:"bytes,
3
,opt,name=audit,proto3,oneof"`
}
type
BrokerAction_EmitInterchainEvent
struct
{
EmitInterchainEvent
*
InterchainEvent
`protobuf:"bytes,
3
,opt,name=emitInterchainEvent,proto3,oneof"`
EmitInterchainEvent
*
InterchainEvent
`protobuf:"bytes,
4
,opt,name=emitInterchainEvent,proto3,oneof"`
}
type
BrokerAction_UpdateIndex
struct
{
UpdateIndex
*
UpdateIndex
`protobuf:"bytes,
4
,opt,name=updateIndex,proto3,oneof"`
UpdateIndex
*
UpdateIndex
`protobuf:"bytes,
5
,opt,name=updateIndex,proto3,oneof"`
}
func
(
*
BrokerAction_Init
)
isBrokerAction_Value
()
{}
func
(
*
BrokerAction_Register
)
isBrokerAction_Value
()
{}
func
(
*
BrokerAction_Audit
)
isBrokerAction_Value
()
{}
...
...
@@ -95,6 +102,13 @@ func (m *BrokerAction) GetValue() isBrokerAction_Value {
return
nil
}
func
(
m
*
BrokerAction
)
GetInit
()
*
Init
{
if
x
,
ok
:=
m
.
GetValue
()
.
(
*
BrokerAction_Init
);
ok
{
return
x
.
Init
}
return
nil
}
func
(
m
*
BrokerAction
)
GetRegister
()
*
Register
{
if
x
,
ok
:=
m
.
GetValue
()
.
(
*
BrokerAction_Register
);
ok
{
return
x
.
Register
...
...
@@ -133,6 +147,7 @@ func (m *BrokerAction) GetTy() int32 {
// XXX_OneofWrappers is for the internal use of the proto package.
func
(
*
BrokerAction
)
XXX_OneofWrappers
()
[]
interface
{}
{
return
[]
interface
{}{
(
*
BrokerAction_Init
)(
nil
),
(
*
BrokerAction_Register
)(
nil
),
(
*
BrokerAction_Audit
)(
nil
),
(
*
BrokerAction_EmitInterchainEvent
)(
nil
),
...
...
@@ -140,6 +155,54 @@ func (*BrokerAction) XXX_OneofWrappers() []interface{} {
}
}
//broker初始化信息
type
Init
struct
{
BxhId
string
`protobuf:"bytes,1,opt,name=bxhId,proto3" json:"bxhId,omitempty"`
AppChainId
string
`protobuf:"bytes,2,opt,name=appChainId,proto3" json:"appChainId,omitempty"`
XXX_NoUnkeyedLiteral
struct
{}
`json:"-"`
XXX_unrecognized
[]
byte
`json:"-"`
XXX_sizecache
int32
`json:"-"`
}
func
(
m
*
Init
)
Reset
()
{
*
m
=
Init
{}
}
func
(
m
*
Init
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
Init
)
ProtoMessage
()
{}
func
(
*
Init
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
1
}
}
func
(
m
*
Init
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
return
xxx_messageInfo_Init
.
Unmarshal
(
m
,
b
)
}
func
(
m
*
Init
)
XXX_Marshal
(
b
[]
byte
,
deterministic
bool
)
([]
byte
,
error
)
{
return
xxx_messageInfo_Init
.
Marshal
(
b
,
m
,
deterministic
)
}
func
(
m
*
Init
)
XXX_Merge
(
src
proto
.
Message
)
{
xxx_messageInfo_Init
.
Merge
(
m
,
src
)
}
func
(
m
*
Init
)
XXX_Size
()
int
{
return
xxx_messageInfo_Init
.
Size
(
m
)
}
func
(
m
*
Init
)
XXX_DiscardUnknown
()
{
xxx_messageInfo_Init
.
DiscardUnknown
(
m
)
}
var
xxx_messageInfo_Init
proto
.
InternalMessageInfo
func
(
m
*
Init
)
GetBxhId
()
string
{
if
m
!=
nil
{
return
m
.
BxhId
}
return
""
}
func
(
m
*
Init
)
GetAppChainId
()
string
{
if
m
!=
nil
{
return
m
.
AppChainId
}
return
""
}
// 业务合约注册模型: 0表示正在审核,1表示审核通过,2表示审核失败
type
Register
struct
{
//业务合约名称
...
...
@@ -153,7 +216,7 @@ func (m *Register) Reset() { *m = Register{} }
func
(
m
*
Register
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
Register
)
ProtoMessage
()
{}
func
(
*
Register
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
1
}
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
2
}
}
func
(
m
*
Register
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
...
@@ -196,7 +259,7 @@ func (m *Audit) Reset() { *m = Audit{} }
func
(
m
*
Audit
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
Audit
)
ProtoMessage
()
{}
func
(
*
Audit
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
2
}
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
3
}
}
func
(
m
*
Audit
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
...
@@ -243,7 +306,7 @@ func (m *PollingEvent) Reset() { *m = PollingEvent{} }
func
(
m
*
PollingEvent
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
PollingEvent
)
ProtoMessage
()
{}
func
(
*
PollingEvent
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
3
}
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
4
}
}
func
(
m
*
PollingEvent
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
...
@@ -292,7 +355,7 @@ func (m *UpdateIndex) Reset() { *m = UpdateIndex{} }
func
(
m
*
UpdateIndex
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
UpdateIndex
)
ProtoMessage
()
{}
func
(
*
UpdateIndex
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
4
}
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
5
}
}
func
(
m
*
UpdateIndex
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
...
@@ -373,7 +436,7 @@ func (m *InterchainEvent) Reset() { *m = InterchainEvent{} }
func
(
m
*
InterchainEvent
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
InterchainEvent
)
ProtoMessage
()
{}
func
(
*
InterchainEvent
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
5
}
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
6
}
}
func
(
m
*
InterchainEvent
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
...
@@ -461,7 +524,7 @@ func (m *ReceiptBrokerLog) Reset() { *m = ReceiptBrokerLog{} }
func
(
m
*
ReceiptBrokerLog
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
ReceiptBrokerLog
)
ProtoMessage
()
{}
func
(
*
ReceiptBrokerLog
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
6
}
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
7
}
}
func
(
m
*
ReceiptBrokerLog
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
...
@@ -578,7 +641,7 @@ func (m *QueryInterchainEvent) Reset() { *m = QueryInterchainEvent{} }
func
(
m
*
QueryInterchainEvent
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
QueryInterchainEvent
)
ProtoMessage
()
{}
func
(
*
QueryInterchainEvent
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
7
}
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
8
}
}
func
(
m
*
QueryInterchainEvent
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
...
@@ -632,7 +695,7 @@ func (m *InterChainEventList) Reset() { *m = InterChainEventList{} }
func
(
m
*
InterChainEventList
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
InterChainEventList
)
ProtoMessage
()
{}
func
(
*
InterChainEventList
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
8
}
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
9
}
}
func
(
m
*
InterChainEventList
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
...
@@ -660,22 +723,37 @@ func (m *InterChainEventList) GetList() []*InterchainEvent {
return
nil
}
////根据状态查看跨链事件
//message QueryInterchainEventList {
// //事件状态必填(默认是0,只查询待处理状态的事件)
// int32 status = 1;
// // 主键索引
// string primaryKey = 2;
// //单页返回多少条记录,默认返回10条,为了系统安全最多单次只能返回20条
// int32 count = 3;
// // 0降序,1升序,默认降序
// int32 direction = 4;
//}
////跨链事件列表
//message InterchainEventList {
// repeated InterchainEvent list = 1;
// string primaryKey = 2;
//}
type
QueryNilParam
struct
{
XXX_NoUnkeyedLiteral
struct
{}
`json:"-"`
XXX_unrecognized
[]
byte
`json:"-"`
XXX_sizecache
int32
`json:"-"`
}
func
(
m
*
QueryNilParam
)
Reset
()
{
*
m
=
QueryNilParam
{}
}
func
(
m
*
QueryNilParam
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
QueryNilParam
)
ProtoMessage
()
{}
func
(
*
QueryNilParam
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
10
}
}
func
(
m
*
QueryNilParam
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
return
xxx_messageInfo_QueryNilParam
.
Unmarshal
(
m
,
b
)
}
func
(
m
*
QueryNilParam
)
XXX_Marshal
(
b
[]
byte
,
deterministic
bool
)
([]
byte
,
error
)
{
return
xxx_messageInfo_QueryNilParam
.
Marshal
(
b
,
m
,
deterministic
)
}
func
(
m
*
QueryNilParam
)
XXX_Merge
(
src
proto
.
Message
)
{
xxx_messageInfo_QueryNilParam
.
Merge
(
m
,
src
)
}
func
(
m
*
QueryNilParam
)
XXX_Size
()
int
{
return
xxx_messageInfo_QueryNilParam
.
Size
(
m
)
}
func
(
m
*
QueryNilParam
)
XXX_DiscardUnknown
()
{
xxx_messageInfo_QueryNilParam
.
DiscardUnknown
(
m
)
}
var
xxx_messageInfo_QueryNilParam
proto
.
InternalMessageInfo
type
QueryOutterMeta
struct
{
XXX_NoUnkeyedLiteral
struct
{}
`json:"-"`
XXX_unrecognized
[]
byte
`json:"-"`
...
...
@@ -686,7 +764,7 @@ func (m *QueryOutterMeta) Reset() { *m = QueryOutterMeta{} }
func
(
m
*
QueryOutterMeta
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
QueryOutterMeta
)
ProtoMessage
()
{}
func
(
*
QueryOutterMeta
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
9
}
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
11
}
}
func
(
m
*
QueryOutterMeta
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
...
@@ -717,7 +795,7 @@ func (m *QueryInnerMeta) Reset() { *m = QueryInnerMeta{} }
func
(
m
*
QueryInnerMeta
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
QueryInnerMeta
)
ProtoMessage
()
{}
func
(
*
QueryInnerMeta
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
1
0
}
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
1
2
}
}
func
(
m
*
QueryInnerMeta
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
...
@@ -750,7 +828,7 @@ func (m *QueryInMessage) Reset() { *m = QueryInMessage{} }
func
(
m
*
QueryInMessage
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
QueryInMessage
)
ProtoMessage
()
{}
func
(
*
QueryInMessage
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
1
1
}
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
1
3
}
}
func
(
m
*
QueryInMessage
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
...
@@ -797,7 +875,7 @@ func (m *QueryOutMessage) Reset() { *m = QueryOutMessage{} }
func
(
m
*
QueryOutMessage
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
QueryOutMessage
)
ProtoMessage
()
{}
func
(
*
QueryOutMessage
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
1
2
}
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
1
4
}
}
func
(
m
*
QueryOutMessage
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
...
@@ -832,6 +910,55 @@ func (m *QueryOutMessage) GetSequenceNum() uint64 {
return
0
}
type
BrokerInfo
struct
{
//跨链协议版本ID
BxhId
string
`protobuf:"bytes,1,opt,name=bxhId,proto3" json:"bxhId,omitempty"`
//应用链ID
AppChainId
string
`protobuf:"bytes,2,opt,name=appChainId,proto3" json:"appChainId,omitempty"`
XXX_NoUnkeyedLiteral
struct
{}
`json:"-"`
XXX_unrecognized
[]
byte
`json:"-"`
XXX_sizecache
int32
`json:"-"`
}
func
(
m
*
BrokerInfo
)
Reset
()
{
*
m
=
BrokerInfo
{}
}
func
(
m
*
BrokerInfo
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
BrokerInfo
)
ProtoMessage
()
{}
func
(
*
BrokerInfo
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
15
}
}
func
(
m
*
BrokerInfo
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
return
xxx_messageInfo_BrokerInfo
.
Unmarshal
(
m
,
b
)
}
func
(
m
*
BrokerInfo
)
XXX_Marshal
(
b
[]
byte
,
deterministic
bool
)
([]
byte
,
error
)
{
return
xxx_messageInfo_BrokerInfo
.
Marshal
(
b
,
m
,
deterministic
)
}
func
(
m
*
BrokerInfo
)
XXX_Merge
(
src
proto
.
Message
)
{
xxx_messageInfo_BrokerInfo
.
Merge
(
m
,
src
)
}
func
(
m
*
BrokerInfo
)
XXX_Size
()
int
{
return
xxx_messageInfo_BrokerInfo
.
Size
(
m
)
}
func
(
m
*
BrokerInfo
)
XXX_DiscardUnknown
()
{
xxx_messageInfo_BrokerInfo
.
DiscardUnknown
(
m
)
}
var
xxx_messageInfo_BrokerInfo
proto
.
InternalMessageInfo
func
(
m
*
BrokerInfo
)
GetBxhId
()
string
{
if
m
!=
nil
{
return
m
.
BxhId
}
return
""
}
func
(
m
*
BrokerInfo
)
GetAppChainId
()
string
{
if
m
!=
nil
{
return
m
.
AppChainId
}
return
""
}
type
Meta
struct
{
Meta
map
[
string
]
uint64
`protobuf:"bytes,1,rep,name=meta,proto3" json:"meta,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
XXX_NoUnkeyedLiteral
struct
{}
`json:"-"`
...
...
@@ -843,7 +970,7 @@ func (m *Meta) Reset() { *m = Meta{} }
func
(
m
*
Meta
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
Meta
)
ProtoMessage
()
{}
func
(
*
Meta
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
1
3
}
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
1
6
}
}
func
(
m
*
Meta
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
...
@@ -887,7 +1014,7 @@ func (m *Response) Reset() { *m = Response{} }
func
(
m
*
Response
)
String
()
string
{
return
proto
.
CompactTextString
(
m
)
}
func
(
*
Response
)
ProtoMessage
()
{}
func
(
*
Response
)
Descriptor
()
([]
byte
,
[]
int
)
{
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
1
4
}
return
fileDescriptor_f209535e190f2bed
,
[]
int
{
1
7
}
}
func
(
m
*
Response
)
XXX_Unmarshal
(
b
[]
byte
)
error
{
...
...
@@ -931,6 +1058,7 @@ func (m *Response) GetPayload() []byte {
func
init
()
{
proto
.
RegisterType
((
*
BrokerAction
)(
nil
),
"types.BrokerAction"
)
proto
.
RegisterType
((
*
Init
)(
nil
),
"types.Init"
)
proto
.
RegisterType
((
*
Register
)(
nil
),
"types.Register"
)
proto
.
RegisterType
((
*
Audit
)(
nil
),
"types.Audit"
)
proto
.
RegisterType
((
*
PollingEvent
)(
nil
),
"types.PollingEvent"
)
...
...
@@ -939,10 +1067,12 @@ func init() {
proto
.
RegisterType
((
*
ReceiptBrokerLog
)(
nil
),
"types.ReceiptBrokerLog"
)
proto
.
RegisterType
((
*
QueryInterchainEvent
)(
nil
),
"types.QueryInterchainEvent"
)
proto
.
RegisterType
((
*
InterChainEventList
)(
nil
),
"types.InterChainEventList"
)
proto
.
RegisterType
((
*
QueryNilParam
)(
nil
),
"types.QueryNilParam"
)
proto
.
RegisterType
((
*
QueryOutterMeta
)(
nil
),
"types.QueryOutterMeta"
)
proto
.
RegisterType
((
*
QueryInnerMeta
)(
nil
),
"types.QueryInnerMeta"
)
proto
.
RegisterType
((
*
QueryInMessage
)(
nil
),
"types.QueryInMessage"
)
proto
.
RegisterType
((
*
QueryOutMessage
)(
nil
),
"types.QueryOutMessage"
)
proto
.
RegisterType
((
*
BrokerInfo
)(
nil
),
"types.BrokerInfo"
)
proto
.
RegisterType
((
*
Meta
)(
nil
),
"types.Meta"
)
proto
.
RegisterMapType
((
map
[
string
]
uint64
)(
nil
),
"types.Meta.MetaEntry"
)
proto
.
RegisterType
((
*
Response
)(
nil
),
"types.Response"
)
...
...
@@ -953,47 +1083,52 @@ func init() {
}
var
fileDescriptor_f209535e190f2bed
=
[]
byte
{
// 629 bytes of a gzipped FileDescriptorProto
0x1f
,
0x8b
,
0x08
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x02
,
0xff
,
0xe4
,
0x55
,
0x4d
,
0x6f
,
0xd3
,
0x4c
,
0x10
,
0x8e
,
0x13
,
0x3b
,
0x4d
,
0x26
,
0x79
,
0xdb
,
0xbe
,
0xdb
,
0x52
,
0x59
,
0x5c
,
0x88
,
0xac
,
0x1e
,
0xca
,
0x57
,
0x2a
,
0x15
,
0x09
,
0x10
,
0xb7
,
0x14
,
0x2a
,
0xa5
,
0xa8
,
0x2d
,
0x65
,
0xf9
,
0x10
,
0x70
,
0xdb
,
0x3a
,
0x43
,
0x58
,
0x9a
,
0xd8
,
0xee
,
0xee
,
0xba
,
0xaa
,
0x6f
,
0x1c
,
0xf8
,
0x5d
,
0x5c
,
0xf8
,
0x63
,
0x68
,
0xc7
,
0x9b
,
0xc4
,
0x2d
,
0x20
,
0x2e
,
0x15
,
0x17
,
0x2e
,
0xd6
,
0xce
,
0xb3
,
0xcf
,
0xee
,
0x7c
,
0xed
,
0x33
,
0x86
,
0xee
,
0x89
,
0x4a
,
0x4f
,
0x51
,
0xf5
,
0x33
,
0x95
,
0x9a
,
0x94
,
0x05
,
0xa6
,
0xc8
,
0x50
,
0x47
,
0x5f
,
0xea
,
0xd0
,
0xdd
,
0x25
,
0x7c
,
0x10
,
0x1b
,
0x99
,
0x26
,
0xec
,
0x3e
,
0xb4
,
0x14
,
0x8e
,
0xa5
,
0x36
,
0xa8
,
0x42
,
0xaf
,
0xe7
,
0x6d
,
0x75
,
0x76
,
0x56
,
0xfa
,
0x44
,
0xed
,
0x73
,
0x07
,
0x0f
,
0x6b
,
0x7c
,
0x4e
,
0x61
,
0x9b
,
0x10
,
0x88
,
0x7c
,
0x24
,
0x4d
,
0x58
,
0x27
,
0x6e
,
0xd7
,
0x71
,
0x07
,
0x16
,
0x1b
,
0xd6
,
0x78
,
0xb9
,
0xc9
,
0x9e
,
0xc3
,
0x1a
,
0x4e
,
0xa5
,
0xd9
,
0x4f
,
0x0c
,
0xaa
,
0xf8
,
0x93
,
0x90
,
0xc9
,
0xde
,
0x39
,
0x26
,
0x26
,
0x6c
,
0xd0
,
0x99
,
0x0d
,
0x77
,
0xe6
,
0xca
,
0xee
,
0xb0
,
0xc6
,
0x7f
,
0x75
,
0x88
,
0x3d
,
0x84
,
0x4e
,
0x9e
,
0x8d
,
0x84
,
0xc1
,
0xfd
,
0x64
,
0x84
,
0x17
,
0xa1
,
0x4f
,
0x77
,
0x30
,
0x77
,
0xc7
,
0x9b
,
0xc5
,
0xce
,
0xb0
,
0xc6
,
0xab
,
0x44
,
0xb6
,
0x0c
,
0x75
,
0x53
,
0x84
,
0x41
,
0xcf
,
0xdb
,
0x0a
,
0x78
,
0xdd
,
0x14
,
0xbb
,
0x4b
,
0x10
,
0x9c
,
0x8b
,
0x49
,
0x8e
,
0xd1
,
0x3d
,
0x68
,
0xcd
,
0x52
,
0x63
,
0x3d
,
0xe8
,
0xe0
,
0x05
,
0xc6
,
0x26
,
0x55
,
0x47
,
0x62
,
0x8a
,
0x54
,
0x80
,
0x36
,
0xaf
,
0x42
,
0xd1
,
0x00
,
0x02
,
0x4a
,
0xee
,
0xcf
,
0x54
,
0xb6
,
0x01
,
0x4d
,
0x6d
,
0x84
,
0xc9
,
0x35
,
0x15
,
0xa7
,
0xcd
,
0x9d
,
0x15
,
0x6d
,
0x43
,
0xf7
,
0x38
,
0x9d
,
0x4c
,
0x64
,
0x32
,
0x2e
,
0x33
,
0xba
,
0x05
,
0xfe
,
0x14
,
0x8d
,
0x70
,
0xe5
,
0xee
,
0xb8
,
0x54
,
0x0e
,
0xd1
,
0x08
,
0x4e
,
0x1b
,
0xd1
,
0x37
,
0x0f
,
0x3a
,
0x95
,
0xcc
,
0xac
,
0x6b
,
0x8d
,
0x67
,
0x39
,
0x26
,
0x31
,
0x1e
,
0xe5
,
0x53
,
0x3a
,
0xe7
,
0xf3
,
0x2a
,
0xc4
,
0x22
,
0xe8
,
0x8e
,
0xb4
,
0x79
,
0x85
,
0xea
,
0x5c
,
0xc6
,
0xb8
,
0xff
,
0xcc
,
0x05
,
0x70
,
0x09
,
0xb3
,
0x1c
,
0xad
,
0xe2
,
0x05
,
0xa7
,
0x51
,
0x72
,
0xaa
,
0x18
,
0x0b
,
0x61
,
0x49
,
0xe1
,
0xd9
,
0xeb
,
0x22
,
0x43
,
0x2a
,
0xb4
,
0xcf
,
0x67
,
0x26
,
0xbb
,
0x6b
,
0xdf
,
0x89
,
0xce
,
0xd2
,
0x44
,
0x23
,
0x15
,
0xb5
,
0xfa
,
0x4e
,
0x4a
,
0x98
,
0xcf
,
0x09
,
0xd1
,
0x77
,
0x0f
,
0x56
,
0xae
,
0xf6
,
0x71
,
0x1d
,
0x02
,
0x49
,
0x1d
,
0x2c
,
0xc3
,
0x2f
,
0x8d
,
0x6b
,
0x0b
,
0x9c
,
0x81
,
0x6f
,
0x16
,
0x51
,
0xd3
,
0xda
,
0x62
,
0x1f
,
0xf3
,
0x24
,
0xa6
,
0x70
,
0xdb
,
0x9c
,
0xd6
,
0x16
,
0x13
,
0x6a
,
0xac
,
0xc3
,
0x66
,
0xaf
,
0x61
,
0x31
,
0xbb
,
0xae
,
0xf4
,
0x6d
,
0x89
,
0x5e
,
0xcb
,
0xac
,
0x6f
,
0x5f
,
0xeb
,
0xb0
,
0xca
,
0x31
,
0x46
,
0x99
,
0x99
,
0x52
,
0x32
,
0x07
,
0xe9
,
0xf8
,
0x1f
,
0xd4
,
0x8b
,
0x81
,
0xf5
,
0x97
,
0x39
,
0xaa
,
0xe2
,
0xaf
,
0x36
,
0x34
,
0x1a
,
0xc0
,
0x1a
,
0x39
,
0x7c
,
0x3a
,
0x77
,
0x78
,
0x20
,
0xb5
,
0x61
,
0x77
,
0xc0
,
0x9f
,
0x48
,
0x6d
,
0x42
,
0xaf
,
0xd7
,
0xf8
,
0x7d
,
0x69
,
0x38
,
0x71
,
0xa2
,
0xff
,
0x61
,
0x85
,
0x02
,
0x7f
,
0x91
,
0x1b
,
0x83
,
0xca
,
0xea
,
0x2b
,
0x5a
,
0x85
,
0x65
,
0x97
,
0x4b
,
0xe2
,
0x90
,
0x77
,
0x73
,
0xe4
,
0x10
,
0xb5
,
0x16
,
0x63
,
0x64
,
0x9b
,
0xf0
,
0x9f
,
0x4c
,
0x5c
,
0x20
,
0xc7
,
0x42
,
0x2a
,
0x27
,
0xf5
,
0xcb
,
0xe0
,
0x55
,
0x4d
,
0xd6
,
0x7f
,
0xd2
,
0x64
,
0xf4
,
0x7e
,
0xe1
,
0xfe
,
0xba
,
0xaf
,
0xfe
,
0x0c
,
0xbe
,
0x0d
,
0x9e
,
0xdd
,
0x9e
,
0x4f
,
0x12
,
0x5b
,
0x8d
,
0x1b
,
0x95
,
0x49
,
0x42
,
0x9f
,
0xbd
,
0xc4
,
0xa8
,
0xa2
,
0x9c
,
0x29
,
0x37
,
0x1f
,
0x41
,
0x7b
,
0x0e
,
0xb1
,
0x55
,
0x68
,
0x9c
,
0x62
,
0xe1
,
0xbc
,
0xdb
,
0xa5
,
0x6d
,
0x26
,
0x75
,
0xdb
,
0x79
,
0x2b
,
0x8d
,
0x27
,
0xf5
,
0xc7
,
0x5e
,
0xf4
,
0xd6
,
0x8e
,
0xcb
,
0x52
,
0xd7
,
0x15
,
0xa5
,
0x78
,
0x55
,
0xa5
,
0xd8
,
0xb1
,
0x31
,
0x2d
,
0x53
,
0x74
,
0xfd
,
0x9e
,
0x99
,
0x76
,
0x27
,
0x13
,
0xc5
,
0x24
,
0x15
,
0x23
,
0xea
,
0x72
,
0x97
,
0xcf
,
0xcc
,
0x9d
,
0x16
,
0x34
,
0xcb
,
0x1f
,
0xd4
,
0x2e
,
0x7c
,
0x68
,
0xf5
,
0xfb
,
0xdb
,
0x14
,
0xfb
,
0x49
,
0x93
,
0xfe
,
0x56
,
0x0f
,
0x7e
,
0x04
,
0x00
,
0x00
,
0xff
,
0xff
,
0xc2
,
0xf6
,
0xd8
,
0x9f
,
0xbd
,
0x06
,
0x00
,
0x00
,
// 715 bytes of a gzipped FileDescriptorProto
0x1f
,
0x8b
,
0x08
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x02
,
0xff
,
0xbc
,
0x55
,
0xcd
,
0x6e
,
0xd3
,
0x40
,
0x10
,
0x8e
,
0x1d
,
0x3b
,
0x4d
,
0x26
,
0x69
,
0x53
,
0xb6
,
0xa5
,
0xb2
,
0x38
,
0x40
,
0xb0
,
0x7a
,
0x28
,
0x7f
,
0xa9
,
0x54
,
0x24
,
0x40
,
0x88
,
0x4b
,
0x52
,
0x2a
,
0x25
,
0xa8
,
0x2d
,
0x65
,
0xf9
,
0x11
,
0x70
,
0xdb
,
0x3a
,
0xd3
,
0x74
,
0x69
,
0x62
,
0xbb
,
0xeb
,
0x75
,
0x55
,
0xdf
,
0x79
,
0x13
,
0xde
,
0x83
,
0x0b
,
0x2f
,
0x86
,
0x76
,
0xbd
,
0x49
,
0x9c
,
0x16
,
0x84
,
0x5a
,
0x55
,
0x5c
,
0xa2
,
0x9d
,
0x6f
,
0xbe
,
0xdd
,
0x99
,
0xcc
,
0xcc
,
0x37
,
0x86
,
0xc6
,
0xa1
,
0x88
,
0x4e
,
0x50
,
0xb4
,
0x63
,
0x11
,
0xc9
,
0x88
,
0xb8
,
0x32
,
0x8b
,
0x31
,
0xf1
,
0x7f
,
0xd8
,
0xd0
,
0xe8
,
0x6a
,
0xbc
,
0x13
,
0x48
,
0x1e
,
0x85
,
0xe4
,
0x3e
,
0x38
,
0x3c
,
0xe4
,
0xd2
,
0xb3
,
0x5a
,
0xd6
,
0x46
,
0x7d
,
0xab
,
0xde
,
0xd6
,
0xb4
,
0x76
,
0x3f
,
0xe4
,
0xb2
,
0x57
,
0xa2
,
0xda
,
0x45
,
0x9e
,
0x40
,
0x55
,
0xe0
,
0x90
,
0x27
,
0x12
,
0x85
,
0x67
,
0x6b
,
0x5a
,
0xd3
,
0xd0
,
0xa8
,
0x81
,
0x7b
,
0x25
,
0x3a
,
0xa5
,
0x90
,
0x75
,
0x70
,
0x59
,
0x3a
,
0xe0
,
0xd2
,
0x2b
,
0x6b
,
0x6e
,
0xc3
,
0x70
,
0x3b
,
0x0a
,
0xeb
,
0x95
,
0x68
,
0xee
,
0x24
,
0x6f
,
0x60
,
0x05
,
0xc7
,
0x5c
,
0xf6
,
0x43
,
0x89
,
0x22
,
0x38
,
0x66
,
0x3c
,
0xdc
,
0x39
,
0xc3
,
0x50
,
0x7a
,
0x8e
,
0xbe
,
0xb3
,
0x36
,
0x4d
,
0x63
,
0xce
,
0xdb
,
0x2b
,
0xd1
,
0x3f
,
0x5d
,
0x22
,
0xcf
,
0xa0
,
0x9e
,
0xc6
,
0x03
,
0x26
,
0xb1
,
0x1f
,
0x0e
,
0xf0
,
0xdc
,
0x73
,
0xf5
,
0x1b
,
0xc4
,
0xbc
,
0xf1
,
0x71
,
0xe6
,
0xe9
,
0x95
,
0x68
,
0x91
,
0x48
,
0x96
,
0xc0
,
0x96
,
0x99
,
0x57
,
0x69
,
0x59
,
0x1b
,
0x2e
,
0xb5
,
0x65
,
0xd6
,
0x5d
,
0x00
,
0xf7
,
0x8c
,
0x8d
,
0x52
,
0xf4
,
0x5f
,
0x81
,
0xa3
,
0x2a
,
0x40
,
0x56
,
0xc1
,
0x3d
,
0x3c
,
0x3f
,
0xee
,
0x0f
,
0x74
,
0x75
,
0x6a
,
0x34
,
0x37
,
0xc8
,
0x5d
,
0x00
,
0x16
,
0xc7
,
0xdb
,
0x2a
,
0x7e
,
0x7f
,
0xa0
,
0x2b
,
0x52
,
0xa3
,
0x05
,
0xc4
,
0x7f
,
0x0c
,
0xd5
,
0x49
,
0x61
,
0x48
,
0x0b
,
0xea
,
0x78
,
0x8e
,
0x81
,
0x8c
,
0xc4
,
0x3e
,
0x1b
,
0xa3
,
0x79
,
0xa7
,
0x08
,
0xf9
,
0x1d
,
0x70
,
0x75
,
0x69
,
0xfe
,
0x4d
,
0x25
,
0x6b
,
0x50
,
0x49
,
0x24
,
0x93
,
0x69
,
0x62
,
0x82
,
0x1a
,
0xcb
,
0xdf
,
0x84
,
0xc6
,
0x41
,
0x34
,
0x1a
,
0xf1
,
0x70
,
0x98
,
0xd7
,
0xe3
,
0x1e
,
0x38
,
0x63
,
0x94
,
0xec
,
0x42
,
0x4f
,
0xf7
,
0x50
,
0x32
,
0xaa
,
0x1d
,
0xfe
,
0x4f
,
0x0b
,
0xea
,
0x85
,
0xba
,
0xa8
,
0xd0
,
0x09
,
0x9e
,
0xa6
,
0x18
,
0x06
,
0xb8
,
0x9f
,
0x8e
,
0xf5
,
0x3d
,
0x87
,
0x16
,
0x21
,
0xe2
,
0x43
,
0x63
,
0x90
,
0xc8
,
0xf7
,
0x28
,
0xce
,
0x78
,
0x80
,
0xfd
,
0xd7
,
0x26
,
0x81
,
0x39
,
0x4c
,
0x71
,
0x12
,
0x11
,
0xcc
,
0x38
,
0xe5
,
0x9c
,
0x53
,
0xc4
,
0x88
,
0x07
,
0x0b
,
0x02
,
0x4f
,
0x3f
,
0x64
,
0x31
,
0xea
,
0x56
,
0x3b
,
0x74
,
0x62
,
0x92
,
0x47
,
0x6a
,
0xca
,
0x92
,
0x38
,
0x0a
,
0x13
,
0x34
,
0x1d
,
0x9c
,
0x4d
,
0x59
,
0x0e
,
0xd3
,
0x29
,
0xc1
,
0xff
,
0x65
,
0x41
,
0xf3
,
0xe2
,
0x14
,
0xac
,
0x82
,
0xcb
,
0x75
,
0xff
,
0xf3
,
0xf4
,
0x73
,
0xe3
,
0xc6
,
0x12
,
0x27
,
0xe0
,
0xc8
,
0x59
,
0xd6
,
0xfa
,
0xac
,
0xb0
,
0xa3
,
0x34
,
0x0c
,
0x74
,
0xba
,
0x35
,
0xaa
,
0xcf
,
0x0a
,
0x63
,
0x62
,
0x98
,
0x78
,
0x95
,
0x56
,
0x59
,
0x61
,
0xea
,
0x5c
,
0xe8
,
0xdb
,
0x82
,
0x9e
,
0xb5
,
0x49
,
0xdf
,
0xbe
,
0xdb
,
0xb0
,
0x4c
,
0x31
,
0x40
,
0x1e
,
0xcb
,
0x5c
,
0x93
,
0xbb
,
0xd1
,
0x70
,
0x4e
,
0x6d
,
0xd6
,
0x15
,
0xd4
,
0x66
,
0x5f
,
0x43
,
0x6d
,
0xe5
,
0x1b
,
0x50
,
0x9b
,
0x73
,
0x35
,
0xb5
,
0xb9
,
0x97
,
0xd5
,
0x26
,
0x61
,
0xf5
,
0x5d
,
0x8a
,
0x22
,
0xfb
,
0xaf
,
0x0d
,
0xf5
,
0x3b
,
0xb0
,
0xa2
,
0x03
,
0x6e
,
0x4f
,
0x03
,
0xee
,
0xf2
,
0x44
,
0x92
,
0x87
,
0xe0
,
0x8c
,
0x78
,
0xa2
,
0xf6
,
0x61
,
0xf9
,
0xef
,
0xa5
,
0xa1
,
0x9a
,
0xe3
,
0x37
,
0x61
,
0x51
,
0x27
,
0xbe
,
0xcf
,
0x47
,
0x07
,
0x4c
,
0xb0
,
0xb1
,
0x7f
,
0x0b
,
0x9a
,
0x1a
,
0x78
,
0x9b
,
0x4a
,
0x89
,
0x42
,
0x09
,
0xce
,
0x5f
,
0x86
,
0x25
,
0xf3
,
0xe7
,
0x42
,
0x83
,
0x7c
,
0x9e
,
0x22
,
0x7b
,
0x98
,
0x24
,
0x6c
,
0x88
,
0x64
,
0x1d
,
0x16
,
0x79
,
0x68
,
0x32
,
0x3b
,
0x60
,
0x5c
,
0x18
,
0xed
,
0xcf
,
0x83
,
0x17
,
0x45
,
0x6a
,
0x5f
,
0x12
,
0xa9
,
0xff
,
0x65
,
0x16
,
0xfe
,
0xa6
,
0x9f
,
0xee
,
0x02
,
0xe4
,
0x23
,
0xda
,
0x0f
,
0x8f
,
0xa2
,
0x6b
,
0xee
,
0xc5
,
0x6f
,
0xe0
,
0xa8
,
0x02
,
0x90
,
0x07
,
0xd3
,
0xf5
,
0xa4
,
0x4a
,
0x7c
,
0xbb
,
0xb0
,
0x9e
,
0xf4
,
0xcf
,
0x4e
,
0x28
,
0x45
,
0x96
,
0x2f
,
0xaa
,
0x3b
,
0xcf
,
0xa1
,
0x36
,
0x85
,
0xc8
,
0x32
,
0x94
,
0x4f
,
0x30
,
0x33
,
0x31
,
0xd5
,
0x51
,
0xe5
,
0xa1
,
0x47
,
0xc8
,
0x64
,
0x9c
,
0x1b
,
0x2f
,
0xed
,
0x17
,
0x96
,
0xff
,
0x49
,
0xed
,
0xe0
,
0x7c
,
0x59
,
0x14
,
0xe4
,
0x67
,
0x15
,
0xe5
,
0xa7
,
0x76
,
0xd1
,
0x38
,
0x2f
,
0x93
,
0x49
,
0x76
,
0x62
,
0x2a
,
0x4f
,
0xcc
,
0xb2
,
0x51
,
0xc4
,
0x06
,
0x7a
,
0x74
,
0x1a
,
0x74
,
0x62
,
0x6e
,
0x55
,
0xa1
,
0x92
,
0x7f
,
0x56
,
0xbb
,
0xf0
,
0xb5
,
0xda
,
0x6e
,
0x6f
,
0xea
,
0xdc
,
0x0f
,
0x2b
,
0xfa
,
0x1b
,
0xfb
,
0xf4
,
0x77
,
0x00
,
0x00
,
0x00
,
0xff
,
0xff
,
0x7a
,
0x60
,
0xf5
,
0x80
,
0x73
,
0x07
,
0x00
,
0x00
,
}
// Reference imports to suppress errors if they are not otherwise used.
...
...
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