-
Notifications
You must be signed in to change notification settings - Fork 14
/
address.go
79 lines (67 loc) · 2.1 KB
/
address.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
* Copyright (C) 2019 The TesraSupernet Authors
* This file is part of The TesraSupernet library.
*
* The TesraSupernet is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The TesraSupernet is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with The TesraSupernet. If not, see <http://www.gnu.org/licenses/>.
*/
package types
import (
"io"
"github.com/TesraSupernet/Tesra/common"
comm "github.com/TesraSupernet/Tesra/p2pserver/common"
)
type Addr struct {
NodeAddrs []comm.PeerAddr
}
//Serialize message payload
func (this Addr) Serialization(sink *common.ZeroCopySink) {
num := uint64(len(this.NodeAddrs))
sink.WriteUint64(num)
for _, addr := range this.NodeAddrs {
sink.WriteInt64(addr.Time)
sink.WriteUint64(addr.Services)
sink.WriteBytes(addr.IpAddr[:])
sink.WriteUint16(addr.Port)
sink.WriteUint16(addr.ConsensusPort)
sink.WriteUint64(addr.ID)
}
}
func (this *Addr) CmdType() string {
return comm.ADDR_TYPE
}
func (this *Addr) Deserialization(source *common.ZeroCopySource) error {
count, eof := source.NextUint64()
if eof {
return io.ErrUnexpectedEOF
}
for i := 0; i < int(count); i++ {
var addr comm.PeerAddr
addr.Time, eof = source.NextInt64()
addr.Services, eof = source.NextUint64()
buf, _ := source.NextBytes(uint64(len(addr.IpAddr[:])))
copy(addr.IpAddr[:], buf)
addr.Port, eof = source.NextUint16()
addr.ConsensusPort, eof = source.NextUint16()
addr.ID, eof = source.NextUint64()
if eof {
return io.ErrUnexpectedEOF
}
this.NodeAddrs = append(this.NodeAddrs, addr)
}
if count > comm.MAX_ADDR_NODE_CNT {
count = comm.MAX_ADDR_NODE_CNT
}
this.NodeAddrs = this.NodeAddrs[:count]
return nil
}