Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
sidecar-client-chain33
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
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
link33
sidecar-client-chain33
Commits
5b97a062
Commit
5b97a062
authored
Apr 07, 2022
by
suyanlong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add nonce in order to filter ErrDupTx
parent
0d49463e
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
63 additions
and
26 deletions
+63
-26
evmxgo.go
evmxgo/evmxgo.go
+4
-2
evmxgo_test.go
evmxgo/evmxgo_test.go
+21
-0
paracross.go
paracross/paracross.go
+6
-2
proto.proto
proto/proto.proto
+1
-0
proto.pb.go
types/proto.pb.go
+31
-22
No files found.
evmxgo/evmxgo.go
View file @
5b97a062
...
@@ -168,7 +168,6 @@ func (e *Evmxgo) pollAppChain() chan *types.Event {
...
@@ -168,7 +168,6 @@ func (e *Evmxgo) pollAppChain() chan *types.Event {
// 限制:1、同一个用户,不允许连续提2笔交易。2、锁定操作只能在公链一侧发起。
// 限制:1、同一个用户,不允许连续提2笔交易。2、锁定操作只能在公链一侧发起。
// 侧链用户,只要有代币,就可以销毁,同时在公链一侧做解锁操作,不管是否有解锁。(同一账户【地址】体系,或者附带用户的公链地址)
// 侧链用户,只要有代币,就可以销毁,同时在公链一侧做解锁操作,不管是否有解锁。(同一账户【地址】体系,或者附带用户的公链地址)
ch
:=
make
(
chan
*
types
.
Event
,
1
)
ch
:=
make
(
chan
*
types
.
Event
,
1
)
// FIXME 这里实现是以联盟链方式,联盟链没有回滚,所以这里暂时按高度拉去处理
go
func
()
{
go
func
()
{
for
{
for
{
select
{
select
{
...
@@ -228,6 +227,7 @@ func (e *Evmxgo) pollAppChain() chan *types.Event {
...
@@ -228,6 +227,7 @@ func (e *Evmxgo) pollAppChain() chan *types.Event {
Symbol
:
types
.
Symbol
(
mintEvent
.
Symbol
),
Symbol
:
types
.
Symbol
(
mintEvent
.
Symbol
),
Extra
:
mintEvent
.
Extra
,
Extra
:
mintEvent
.
Extra
,
Height
:
height1
,
Height
:
height1
,
Nonce
:
tx
.
Nonce
,
},
},
}
}
...
@@ -281,6 +281,7 @@ func (e *Evmxgo) pollAppChain() chan *types.Event {
...
@@ -281,6 +281,7 @@ func (e *Evmxgo) pollAppChain() chan *types.Event {
Symbol
:
types
.
Symbol
(
burnEvent
.
Symbol
),
Symbol
:
types
.
Symbol
(
burnEvent
.
Symbol
),
Extra
:
burnEvent
.
Extra
,
// TODO
Extra
:
burnEvent
.
Extra
,
// TODO
Height
:
height1
,
Height
:
height1
,
Nonce
:
tx
.
Nonce
,
},
},
}
}
e
.
saveBurn
(
event
)
e
.
saveBurn
(
event
)
...
@@ -425,7 +426,7 @@ func (e *Evmxgo) loop() {
...
@@ -425,7 +426,7 @@ func (e *Evmxgo) loop() {
ibtp
:=
&
pb
.
IBTP
{
ibtp
:=
&
pb
.
IBTP
{
From
:
e
.
appChainID
,
From
:
e
.
appChainID
,
To
:
e
.
toChainID
,
To
:
e
.
toChainID
,
Nonce
:
uint64
(
tmp
),
// TODO 唯一标识。随机nonce
Nonce
:
uint64
(
event
.
Payload
.
Nonce
),
// TODO 唯一标识。随机nonce
Type
:
pb
.
IBTP_INTERCHAIN
,
Type
:
pb
.
IBTP_INTERCHAIN
,
Timestamp
:
tmp
,
Timestamp
:
tmp
,
Payload
:
data
,
Payload
:
data
,
...
@@ -474,6 +475,7 @@ func (e *Evmxgo) SubmitIBTP(ibtp *pb.IBTP) (*pb.SubmitIBTPResponse, error) {
...
@@ -474,6 +475,7 @@ func (e *Evmxgo) SubmitIBTP(ibtp *pb.IBTP) (*pb.SubmitIBTPResponse, error) {
if
event
.
Payload
.
EventType
==
types
.
EventType_Lock
{
if
event
.
Payload
.
EventType
==
types
.
EventType_Lock
{
d
,
_
:=
types33
.
PBToJSON
(
event
)
d
,
_
:=
types33
.
PBToJSON
(
event
)
logger
.
Debug
(
"SubmitIBTP recv event"
,
"event"
,
util
.
FormatJSON
(
string
(
d
)))
logger
.
Debug
(
"SubmitIBTP recv event"
,
"event"
,
util
.
FormatJSON
(
string
(
d
)))
// TODO 校验是否已经存在!
e
.
saveLock
(
event
)
e
.
saveLock
(
event
)
// 构造交易,请求
// 构造交易,请求
//mint := &evmxgotypes.EvmxgoAction{
//mint := &evmxgotypes.EvmxgoAction{
...
...
evmxgo/evmxgo_test.go
View file @
5b97a062
...
@@ -4,7 +4,10 @@ import (
...
@@ -4,7 +4,10 @@ import (
"fmt"
"fmt"
"testing"
"testing"
types33
"github.com/33cn/chain33/types"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/assert"
"gitlab.33.cn/link33/sidecar-client-chain33/types"
"gitlab.33.cn/link33/sidecar-client-chain33/util"
)
)
func
TestMock
(
t
*
testing
.
T
)
{
func
TestMock
(
t
*
testing
.
T
)
{
...
@@ -19,3 +22,21 @@ func TestMock(t *testing.T) {
...
@@ -19,3 +22,21 @@ func TestMock(t *testing.T) {
fmt
.
Println
(
ibtp
)
fmt
.
Println
(
ibtp
)
}
}
}
}
func
TestExtra
(
t
*
testing
.
T
)
{
extra
:=
[]
string
{
"0x0a4063386238626363666662643133353161623739653736333266626462636561346537313664306237346130386162393239376538643033363764336662393139101e1a410a013312097061726163726f73731a223148506b506f7056653345526676614167656444744a5137393274615a4645484365220d41737365745472616e7366657222352221314458586e47583977315147395332694e54476e6531436a5066616969656948482880c2d72f62034254596a0474657374701e"
,
"0x0a4066663333323739383333303436363530393136616333663631323439356534356235333264323666316566666462623561383036326363366566633664643966101a1a410a013312097061726163726f73731a223148506b506f7056653345526676614167656444744a5137393274615a4645484365220d41737365745472616e7366657222352221314458586e47583977315147395332694e54476e6531436a5066616969656948482880c2d72f62034254596a0474657374701a"
,
"0x0a4037333131356332323334626535633832306461343261613136656466643963663764383536336566656135383634303834646239383139383137393761393863101b1a410a013312097061726163726f73731a223148506b506f7056653345526676614167656444744a5137393274615a4645484365220d41737365745472616e7366657222352221314458586e47583977315147395332694e54476e6531436a5066616969656948482880c2d72f62034254596a0474657374701b"
,
}
for
_
,
val
:=
range
extra
{
data
,
err
:=
util
.
FromHex
(
val
)
assert
.
Nil
(
t
,
err
)
event
:=
&
types
.
Event
{}
err
=
types33
.
Decode
(
data
,
event
)
assert
.
Nil
(
t
,
err
)
e
,
err
:=
types33
.
PBToJSON
(
event
)
assert
.
Nil
(
t
,
err
)
t
.
Log
(
util
.
FormatJSON
(
string
(
e
)))
}
}
paracross/paracross.go
View file @
5b97a062
...
@@ -231,7 +231,7 @@ func (p *Paracross) pollAppchain() chan *types.Event {
...
@@ -231,7 +231,7 @@ func (p *Paracross) pollAppchain() chan *types.Event {
for
_
,
txDetail
:=
range
paraTxDetail
.
TxDetails
{
for
_
,
txDetail
:=
range
paraTxDetail
.
TxDetails
{
if
bytes
.
Equal
(
txDetail
.
Tx
.
Hash
(),
tx
.
Hash
())
{
if
bytes
.
Equal
(
txDetail
.
Tx
.
Hash
(),
tx
.
Hash
())
{
t
,
_
:=
types33
.
PBToJSON
(
tx
)
t
,
_
:=
types33
.
PBToJSON
(
tx
)
logger
.
Info
(
"printf tx"
,
"tx"
,
util
.
FormatJSON
(
t
))
logger
.
Info
(
"printf tx"
,
"tx"
,
util
.
FormatJSON
(
string
(
t
)
))
var
action
paracorssTypes
.
ParacrossAction
var
action
paracorssTypes
.
ParacrossAction
err
:=
types33
.
Decode
(
tx
.
Payload
,
&
action
)
err
:=
types33
.
Decode
(
tx
.
Payload
,
&
action
)
...
@@ -267,6 +267,7 @@ func (p *Paracross) pollAppchain() chan *types.Event {
...
@@ -267,6 +267,7 @@ func (p *Paracross) pollAppchain() chan *types.Event {
Symbol
:
types
.
Symbol
(
unlock
.
Cointoken
),
Symbol
:
types
.
Symbol
(
unlock
.
Cointoken
),
Extra
:
unlock
.
Note
,
Extra
:
unlock
.
Note
,
Height
:
height1
,
Height
:
height1
,
Nonce
:
tx
.
Nonce
,
},
},
}
}
p
.
updateBurnUnlock
(
srcEvent
,
event
)
p
.
updateBurnUnlock
(
srcEvent
,
event
)
...
@@ -290,6 +291,7 @@ func (p *Paracross) pollAppchain() chan *types.Event {
...
@@ -290,6 +291,7 @@ func (p *Paracross) pollAppchain() chan *types.Event {
Symbol
:
types
.
Symbol
(
lock
.
Cointoken
),
Symbol
:
types
.
Symbol
(
lock
.
Cointoken
),
Extra
:
lock
.
Note
,
Extra
:
lock
.
Note
,
Height
:
height1
,
Height
:
height1
,
Nonce
:
tx
.
Nonce
,
},
},
}
}
// TODO ? 平行链,执行完这种交易以后会再次其它的执行吗
// TODO ? 平行链,执行完这种交易以后会再次其它的执行吗
...
@@ -323,6 +325,7 @@ func (p *Paracross) pollAppchain() chan *types.Event {
...
@@ -323,6 +325,7 @@ func (p *Paracross) pollAppchain() chan *types.Event {
Symbol
:
types
.
Symbol
(
unlock
.
Cointoken
),
Symbol
:
types
.
Symbol
(
unlock
.
Cointoken
),
Extra
:
unlock
.
Note
,
Extra
:
unlock
.
Note
,
Height
:
height1
,
Height
:
height1
,
Nonce
:
tx
.
Nonce
,
},
},
}
}
p
.
saveUnLock
(
event
)
p
.
saveUnLock
(
event
)
...
@@ -511,7 +514,7 @@ func (p *Paracross) loop() {
...
@@ -511,7 +514,7 @@ func (p *Paracross) loop() {
ibtp
:=
&
pb
.
IBTP
{
ibtp
:=
&
pb
.
IBTP
{
From
:
p
.
appChainID
,
From
:
p
.
appChainID
,
To
:
p
.
toChainID
,
To
:
p
.
toChainID
,
Nonce
:
uint64
(
tmp
),
// TODO 唯一标识。随机nonce
Nonce
:
uint64
(
event
.
Payload
.
Nonce
),
// TODO 唯一标识。随机nonce
Type
:
pb
.
IBTP_INTERCHAIN
,
Type
:
pb
.
IBTP_INTERCHAIN
,
Timestamp
:
tmp
,
Timestamp
:
tmp
,
Payload
:
data
,
Payload
:
data
,
...
@@ -571,6 +574,7 @@ func (p *Paracross) SubmitIBTP(ibtp *pb.IBTP) (*pb.SubmitIBTPResponse, error) {
...
@@ -571,6 +574,7 @@ func (p *Paracross) SubmitIBTP(ibtp *pb.IBTP) (*pb.SubmitIBTPResponse, error) {
logger
.
Error
(
"CreateRawAssetTransferTxExt error"
,
"error"
,
err
)
logger
.
Error
(
"CreateRawAssetTransferTxExt error"
,
"error"
,
err
)
return
nil
,
err
return
nil
,
err
}
}
tx
.
Nonce
=
int64
(
ibtp
.
Nonce
)
tx
.
Sign
(
types33
.
SECP256K1
,
p
.
privateKey
)
tx
.
Sign
(
types33
.
SECP256K1
,
p
.
privateKey
)
ret
,
err
:=
p
.
grpcClient
.
SendTransaction
(
p
.
ctx
,
tx
)
ret
,
err
:=
p
.
grpcClient
.
SendTransaction
(
p
.
ctx
,
tx
)
if
err
!=
nil
{
if
err
!=
nil
{
...
...
proto/proto.proto
View file @
5b97a062
...
@@ -57,6 +57,7 @@ message MapAssetInfo {
...
@@ -57,6 +57,7 @@ message MapAssetInfo {
string
symbol
=
12
;
string
symbol
=
12
;
bytes
extra
=
13
;
bytes
extra
=
13
;
int64
height
=
14
;
int64
height
=
14
;
int64
nonce
=
15
;
}
}
message
Contract
{
message
Contract
{
...
...
types/proto.pb.go
View file @
5b97a062
...
@@ -438,6 +438,7 @@ type MapAssetInfo struct {
...
@@ -438,6 +438,7 @@ type MapAssetInfo struct {
Symbol
string
`protobuf:"bytes,12,opt,name=symbol,proto3" json:"symbol,omitempty"`
Symbol
string
`protobuf:"bytes,12,opt,name=symbol,proto3" json:"symbol,omitempty"`
Extra
[]
byte
`protobuf:"bytes,13,opt,name=extra,proto3" json:"extra,omitempty"`
Extra
[]
byte
`protobuf:"bytes,13,opt,name=extra,proto3" json:"extra,omitempty"`
Height
int64
`protobuf:"varint,14,opt,name=height,proto3" json:"height,omitempty"`
Height
int64
`protobuf:"varint,14,opt,name=height,proto3" json:"height,omitempty"`
Nonce
int64
`protobuf:"varint,15,opt,name=nonce,proto3" json:"nonce,omitempty"`
}
}
func
(
x
*
MapAssetInfo
)
Reset
()
{
func
(
x
*
MapAssetInfo
)
Reset
()
{
...
@@ -556,6 +557,13 @@ func (x *MapAssetInfo) GetHeight() int64 {
...
@@ -556,6 +557,13 @@ func (x *MapAssetInfo) GetHeight() int64 {
return
0
return
0
}
}
func
(
x
*
MapAssetInfo
)
GetNonce
()
int64
{
if
x
!=
nil
{
return
x
.
Nonce
}
return
0
}
type
Contract
struct
{
type
Contract
struct
{
state
protoimpl
.
MessageState
state
protoimpl
.
MessageState
sizeCache
protoimpl
.
SizeCache
sizeCache
protoimpl
.
SizeCache
...
@@ -715,7 +723,7 @@ var file_proto_proto_rawDesc = []byte{
...
@@ -715,7 +723,7 @@ var file_proto_proto_rawDesc = []byte{
0x74
,
0x72
,
0x61
,
0x63
,
0x74
,
0x52
,
0x08
,
0x63
,
0x6f
,
0x6e
,
0x74
,
0x72
,
0x61
,
0x63
,
0x74
,
0x12
,
0x74
,
0x72
,
0x61
,
0x63
,
0x74
,
0x52
,
0x08
,
0x63
,
0x6f
,
0x6e
,
0x74
,
0x72
,
0x61
,
0x63
,
0x74
,
0x12
,
0x2d
,
0x0a
,
0x07
,
0x70
,
0x61
,
0x79
,
0x6c
,
0x6f
,
0x61
,
0x64
,
0x18
,
0x04
,
0x20
,
0x01
,
0x28
,
0x0b
,
0x2d
,
0x0a
,
0x07
,
0x70
,
0x61
,
0x79
,
0x6c
,
0x6f
,
0x61
,
0x64
,
0x18
,
0x04
,
0x20
,
0x01
,
0x28
,
0x0b
,
0x32
,
0x13
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x4d
,
0x61
,
0x70
,
0x41
,
0x73
,
0x73
,
0x65
,
0x32
,
0x13
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x4d
,
0x61
,
0x70
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x49
,
0x6e
,
0x66
,
0x6f
,
0x52
,
0x07
,
0x70
,
0x61
,
0x79
,
0x6c
,
0x6f
,
0x61
,
0x64
,
0x22
,
0x
94
,
0x74
,
0x49
,
0x6e
,
0x66
,
0x6f
,
0x52
,
0x07
,
0x70
,
0x61
,
0x79
,
0x6c
,
0x6f
,
0x61
,
0x64
,
0x22
,
0x
aa
,
0x03
,
0x0a
,
0x0c
,
0x4d
,
0x61
,
0x70
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x49
,
0x6e
,
0x66
,
0x6f
,
0x12
,
0x03
,
0x0a
,
0x0c
,
0x4d
,
0x61
,
0x70
,
0x41
,
0x73
,
0x73
,
0x65
,
0x74
,
0x49
,
0x6e
,
0x66
,
0x6f
,
0x12
,
0x2e
,
0x0a
,
0x09
,
0x65
,
0x76
,
0x65
,
0x6e
,
0x74
,
0x54
,
0x79
,
0x70
,
0x65
,
0x18
,
0x01
,
0x20
,
0x01
,
0x2e
,
0x0a
,
0x09
,
0x65
,
0x76
,
0x65
,
0x6e
,
0x74
,
0x54
,
0x79
,
0x70
,
0x65
,
0x18
,
0x01
,
0x20
,
0x01
,
0x28
,
0x0e
,
0x32
,
0x10
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x45
,
0x76
,
0x65
,
0x6e
,
0x74
,
0x28
,
0x0e
,
0x32
,
0x10
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x45
,
0x76
,
0x65
,
0x6e
,
0x74
,
...
@@ -741,28 +749,29 @@ var file_proto_proto_rawDesc = []byte{
...
@@ -741,28 +749,29 @@ var file_proto_proto_rawDesc = []byte{
0x06
,
0x73
,
0x79
,
0x6d
,
0x62
,
0x6f
,
0x6c
,
0x12
,
0x14
,
0x0a
,
0x05
,
0x65
,
0x78
,
0x74
,
0x72
,
0x61
,
0x06
,
0x73
,
0x79
,
0x6d
,
0x62
,
0x6f
,
0x6c
,
0x12
,
0x14
,
0x0a
,
0x05
,
0x65
,
0x78
,
0x74
,
0x72
,
0x61
,
0x18
,
0x0d
,
0x20
,
0x01
,
0x28
,
0x0c
,
0x52
,
0x05
,
0x65
,
0x78
,
0x74
,
0x72
,
0x61
,
0x12
,
0x16
,
0x0a
,
0x18
,
0x0d
,
0x20
,
0x01
,
0x28
,
0x0c
,
0x52
,
0x05
,
0x65
,
0x78
,
0x74
,
0x72
,
0x61
,
0x12
,
0x16
,
0x0a
,
0x06
,
0x68
,
0x65
,
0x69
,
0x67
,
0x68
,
0x74
,
0x18
,
0x0e
,
0x20
,
0x01
,
0x28
,
0x03
,
0x52
,
0x06
,
0x68
,
0x06
,
0x68
,
0x65
,
0x69
,
0x67
,
0x68
,
0x74
,
0x18
,
0x0e
,
0x20
,
0x01
,
0x28
,
0x03
,
0x52
,
0x06
,
0x68
,
0x65
,
0x69
,
0x67
,
0x68
,
0x74
,
0x22
,
0x7a
,
0x0a
,
0x08
,
0x43
,
0x6f
,
0x6e
,
0x74
,
0x72
,
0x61
,
0x63
,
0x65
,
0x69
,
0x67
,
0x68
,
0x74
,
0x12
,
0x14
,
0x0a
,
0x05
,
0x6e
,
0x6f
,
0x6e
,
0x63
,
0x65
,
0x18
,
0x0f
,
0x74
,
0x12
,
0x18
,
0x0a
,
0x07
,
0x63
,
0x68
,
0x61
,
0x69
,
0x6e
,
0x49
,
0x44
,
0x18
,
0x01
,
0x20
,
0x01
,
0x20
,
0x01
,
0x28
,
0x03
,
0x52
,
0x05
,
0x6e
,
0x6f
,
0x6e
,
0x63
,
0x65
,
0x22
,
0x7a
,
0x0a
,
0x08
,
0x43
,
0x28
,
0x09
,
0x52
,
0x07
,
0x63
,
0x68
,
0x61
,
0x69
,
0x6e
,
0x49
,
0x44
,
0x12
,
0x1a
,
0x0a
,
0x08
,
0x65
,
0x6f
,
0x6e
,
0x74
,
0x72
,
0x61
,
0x63
,
0x74
,
0x12
,
0x18
,
0x0a
,
0x07
,
0x63
,
0x68
,
0x61
,
0x69
,
0x6e
,
0x78
,
0x65
,
0x63
,
0x4e
,
0x61
,
0x6d
,
0x65
,
0x18
,
0x02
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x08
,
0x65
,
0x49
,
0x44
,
0x18
,
0x01
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x07
,
0x63
,
0x68
,
0x61
,
0x69
,
0x6e
,
0x49
,
0x78
,
0x65
,
0x63
,
0x4e
,
0x61
,
0x6d
,
0x65
,
0x12
,
0x18
,
0x0a
,
0x07
,
0x61
,
0x64
,
0x64
,
0x72
,
0x65
,
0x44
,
0x12
,
0x1a
,
0x0a
,
0x08
,
0x65
,
0x78
,
0x65
,
0x63
,
0x4e
,
0x61
,
0x6d
,
0x65
,
0x18
,
0x02
,
0x20
,
0x73
,
0x73
,
0x18
,
0x03
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x07
,
0x61
,
0x64
,
0x64
,
0x72
,
0x65
,
0x73
,
0x01
,
0x28
,
0x09
,
0x52
,
0x08
,
0x65
,
0x78
,
0x65
,
0x63
,
0x4e
,
0x61
,
0x6d
,
0x65
,
0x12
,
0x18
,
0x0a
,
0x73
,
0x12
,
0x1e
,
0x0a
,
0x0a
,
0x63
,
0x61
,
0x6c
,
0x6c
,
0x4d
,
0x65
,
0x74
,
0x68
,
0x6f
,
0x64
,
0x18
,
0x07
,
0x61
,
0x64
,
0x64
,
0x72
,
0x65
,
0x73
,
0x73
,
0x18
,
0x03
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x07
,
0x04
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x0a
,
0x63
,
0x61
,
0x6c
,
0x6c
,
0x4d
,
0x65
,
0x74
,
0x68
,
0x6f
,
0x61
,
0x64
,
0x64
,
0x72
,
0x65
,
0x73
,
0x73
,
0x12
,
0x1e
,
0x0a
,
0x0a
,
0x63
,
0x61
,
0x6c
,
0x6c
,
0x4d
,
0x64
,
0x22
,
0x5f
,
0x0a
,
0x09
,
0x45
,
0x76
,
0x65
,
0x6e
,
0x74
,
0x50
,
0x61
,
0x69
,
0x72
,
0x12
,
0x2a
,
0x65
,
0x74
,
0x68
,
0x6f
,
0x64
,
0x18
,
0x04
,
0x20
,
0x01
,
0x28
,
0x09
,
0x52
,
0x0a
,
0x63
,
0x61
,
0x6c
,
0x0a
,
0x09
,
0x66
,
0x72
,
0x6f
,
0x6d
,
0x45
,
0x76
,
0x65
,
0x6e
,
0x74
,
0x18
,
0x01
,
0x20
,
0x01
,
0x28
,
0x6c
,
0x4d
,
0x65
,
0x74
,
0x68
,
0x6f
,
0x64
,
0x22
,
0x5f
,
0x0a
,
0x09
,
0x45
,
0x76
,
0x65
,
0x6e
,
0x74
,
0x50
,
0x61
,
0x69
,
0x72
,
0x12
,
0x2a
,
0x0a
,
0x09
,
0x66
,
0x72
,
0x6f
,
0x6d
,
0x45
,
0x76
,
0x65
,
0x6e
,
0x74
,
0x18
,
0x01
,
0x20
,
0x01
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x45
,
0x76
,
0x65
,
0x6e
,
0x74
,
0x52
,
0x09
,
0x66
,
0x72
,
0x6f
,
0x6d
,
0x45
,
0x76
,
0x65
,
0x6e
,
0x74
,
0x12
,
0x26
,
0x0a
,
0x07
,
0x74
,
0x6f
,
0x45
,
0x76
,
0x65
,
0x6e
,
0x74
,
0x18
,
0x02
,
0x20
,
0x01
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x45
,
0x76
,
0x65
,
0x6e
,
0x74
,
0x52
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x45
,
0x76
,
0x65
,
0x6e
,
0x74
,
0x52
,
0x09
,
0x66
,
0x72
,
0x6f
,
0x6d
,
0x45
,
0x76
,
0x65
,
0x6e
,
0x74
,
0x12
,
0x26
,
0x0a
,
0x07
,
0x74
,
0x6f
,
0x07
,
0x74
,
0x6f
,
0x45
,
0x76
,
0x65
,
0x6e
,
0x74
,
0x2a
,
0x2a
,
0x0a
,
0x06
,
0x53
,
0x74
,
0x61
,
0x74
,
0x45
,
0x76
,
0x65
,
0x6e
,
0x74
,
0x18
,
0x02
,
0x20
,
0x01
,
0x28
,
0x0b
,
0x32
,
0x0c
,
0x2e
,
0x74
,
0x79
,
0x75
,
0x73
,
0x12
,
0x08
,
0x0a
,
0x04
,
0x54
,
0x72
,
0x75
,
0x65
,
0x10
,
0x00
,
0x12
,
0x09
,
0x0a
,
0x05
,
0x70
,
0x65
,
0x73
,
0x2e
,
0x45
,
0x76
,
0x65
,
0x6e
,
0x74
,
0x52
,
0x07
,
0x74
,
0x6f
,
0x45
,
0x76
,
0x65
,
0x46
,
0x61
,
0x6c
,
0x73
,
0x65
,
0x10
,
0x01
,
0x12
,
0x0b
,
0x0a
,
0x07
,
0x54
,
0x69
,
0x6d
,
0x65
,
0x4f
,
0x6e
,
0x74
,
0x2a
,
0x2a
,
0x0a
,
0x06
,
0x53
,
0x74
,
0x61
,
0x74
,
0x75
,
0x73
,
0x12
,
0x08
,
0x0a
,
0x04
,
0x75
,
0x74
,
0x10
,
0x02
,
0x2a
,
0x35
,
0x0a
,
0x09
,
0x45
,
0x76
,
0x65
,
0x6e
,
0x74
,
0x54
,
0x79
,
0x70
,
0x54
,
0x72
,
0x75
,
0x65
,
0x10
,
0x00
,
0x12
,
0x09
,
0x0a
,
0x05
,
0x46
,
0x61
,
0x6c
,
0x73
,
0x65
,
0x10
,
0x65
,
0x12
,
0x08
,
0x0a
,
0x04
,
0x4c
,
0x6f
,
0x63
,
0x6b
,
0x10
,
0x00
,
0x12
,
0x08
,
0x0a
,
0x04
,
0x4d
,
0x01
,
0x12
,
0x0b
,
0x0a
,
0x07
,
0x54
,
0x69
,
0x6d
,
0x65
,
0x4f
,
0x75
,
0x74
,
0x10
,
0x02
,
0x2a
,
0x35
,
0x69
,
0x6e
,
0x74
,
0x10
,
0x01
,
0x12
,
0x0a
,
0x0a
,
0x06
,
0x55
,
0x6e
,
0x4c
,
0x6f
,
0x63
,
0x6b
,
0x10
,
0x0a
,
0x09
,
0x45
,
0x76
,
0x65
,
0x6e
,
0x74
,
0x54
,
0x79
,
0x70
,
0x65
,
0x12
,
0x08
,
0x0a
,
0x04
,
0x4c
,
0x02
,
0x12
,
0x08
,
0x0a
,
0x04
,
0x42
,
0x75
,
0x72
,
0x6e
,
0x10
,
0x03
,
0x42
,
0x0a
,
0x5a
,
0x08
,
0x2e
,
0x6f
,
0x63
,
0x6b
,
0x10
,
0x00
,
0x12
,
0x08
,
0x0a
,
0x04
,
0x4d
,
0x69
,
0x6e
,
0x74
,
0x10
,
0x01
,
0x12
,
0x2e
,
0x2f
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x62
,
0x06
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x33
,
0x0a
,
0x0a
,
0x06
,
0x55
,
0x6e
,
0x4c
,
0x6f
,
0x63
,
0x6b
,
0x10
,
0x02
,
0x12
,
0x08
,
0x0a
,
0x04
,
0x42
,
0x75
,
0x72
,
0x6e
,
0x10
,
0x03
,
0x42
,
0x0a
,
0x5a
,
0x08
,
0x2e
,
0x2e
,
0x2f
,
0x74
,
0x79
,
0x70
,
0x65
,
0x73
,
0x62
,
0x06
,
0x70
,
0x72
,
0x6f
,
0x74
,
0x6f
,
0x33
,
}
}
var
(
var
(
...
...
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