-
Notifications
You must be signed in to change notification settings - Fork 672
/
claimed_ip_port.go
68 lines (60 loc) · 1.91 KB
/
claimed_ip_port.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
// Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package ips
import (
"net"
"net/netip"
"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/avalanchego/staking"
"github.com/ava-labs/avalanchego/utils/hashing"
"github.com/ava-labs/avalanchego/utils/wrappers"
)
const (
// Certificate length, signature length, IP, timestamp, tx ID
baseIPCertDescLen = 2*wrappers.IntLen + net.IPv6len + wrappers.ShortLen + wrappers.LongLen + ids.IDLen
preimageLen = ids.IDLen + wrappers.LongLen
)
// A self contained proof that a peer is claiming ownership of an IPPort at a
// given time.
type ClaimedIPPort struct {
// The peer's certificate.
Cert *staking.Certificate
// The peer's claimed IP and port.
AddrPort netip.AddrPort
// The time the peer claimed to own this IP and port.
Timestamp uint64
// [Cert]'s signature over the IPPort and timestamp.
// This is used in the networking library to ensure that this IPPort was
// actually claimed by the peer in question, and not by a malicious peer
// trying to get us to dial bogus IPPorts.
Signature []byte
// NodeID derived from the peer certificate.
NodeID ids.NodeID
// GossipID derived from the nodeID and timestamp.
GossipID ids.ID
}
func NewClaimedIPPort(
cert *staking.Certificate,
ipPort netip.AddrPort,
timestamp uint64,
signature []byte,
) *ClaimedIPPort {
ip := &ClaimedIPPort{
Cert: cert,
AddrPort: ipPort,
Timestamp: timestamp,
Signature: signature,
NodeID: ids.NodeIDFromCert(cert),
}
packer := wrappers.Packer{
Bytes: make([]byte, preimageLen),
}
packer.PackFixedBytes(ip.NodeID[:])
packer.PackLong(timestamp)
ip.GossipID = hashing.ComputeHash256Array(packer.Bytes)
return ip
}
// Returns the approximate size of the binary representation of this ClaimedIPPort.
func (i *ClaimedIPPort) Size() int {
return baseIPCertDescLen + len(i.Cert.Raw) + len(i.Signature)
}