Commit 5b97a062 authored by suyanlong's avatar suyanlong

Add nonce in order to filter ErrDupTx

parent 0d49463e
...@@ -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{
......
...@@ -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)))
}
}
...@@ -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 {
......
...@@ -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 {
......
...@@ -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, 0x94, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xaa,
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 (
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment