Skip to content

Commit 5297073

Browse files
committed
feat(p2p): new p2p node representation
1 parent 7ab226b commit 5297073

71 files changed

Lines changed: 6915 additions & 4537 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

cmd/bootnode/main.go

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"github.com/XinFinOrg/XDPoSChain/log"
3030
"github.com/XinFinOrg/XDPoSChain/p2p/discover"
3131
"github.com/XinFinOrg/XDPoSChain/p2p/discv5"
32+
"github.com/XinFinOrg/XDPoSChain/p2p/enode"
3233
"github.com/XinFinOrg/XDPoSChain/p2p/nat"
3334
"github.com/XinFinOrg/XDPoSChain/p2p/netutil"
3435
)
@@ -37,7 +38,7 @@ func main() {
3738
var (
3839
listenAddr = flag.String("addr", ":30301", "listen address")
3940
genKey = flag.String("genkey", "", "generate a node key")
40-
writeAddr = flag.Bool("writeaddress", false, "write out the node's pubkey hash and quit")
41+
writeAddr = flag.Bool("writeaddress", false, "write out the node's public key and quit")
4142
nodeKeyFile = flag.String("nodekey", "", "private key filename")
4243
nodeKeyHex = flag.String("nodekeyhex", "", "private key as hex (for testing)")
4344
natdesc = flag.String("nat", "none", "port mapping mechanism (any|none|upnp|pmp|extip:<IP>)")
@@ -85,7 +86,7 @@ func main() {
8586
}
8687

8788
if *writeAddr {
88-
fmt.Printf("%v\n", discover.PubkeyID(&nodeKey.PublicKey))
89+
fmt.Printf("%x\n", crypto.FromECDSAPub(&nodeKey.PublicKey)[1:])
8990
os.Exit(0)
9091
}
9192

@@ -111,26 +112,38 @@ func main() {
111112
if !realaddr.IP.IsLoopback() {
112113
go nat.Map(natm, nil, "udp", realaddr.Port, realaddr.Port, "ethereum discovery")
113114
}
114-
// TODO: react to external IP changes over time.
115115
if ext, err := natm.ExternalIP(); err == nil {
116116
realaddr = &net.UDPAddr{IP: ext, Port: realaddr.Port}
117117
}
118118
}
119119

120+
printNotice(&nodeKey.PublicKey, *realaddr)
121+
120122
if *runv5 {
121-
if _, err := discv5.ListenUDP(nodeKey, conn, realaddr, "", restrictList); err != nil {
123+
if _, err := discv5.ListenUDP(nodeKey, conn, "", restrictList); err != nil {
122124
utils.Fatalf("%v", err)
123125
}
124126
} else {
127+
db, _ := enode.OpenDB("")
128+
ln := enode.NewLocalNode(db, nodeKey)
125129
cfg := discover.Config{
126-
PrivateKey: nodeKey,
127-
AnnounceAddr: realaddr,
128-
NetRestrict: restrictList,
130+
PrivateKey: nodeKey,
131+
NetRestrict: restrictList,
129132
}
130-
if _, err := discover.ListenUDP(conn, cfg); err != nil {
133+
if _, err := discover.ListenUDP(conn, ln, cfg); err != nil {
131134
utils.Fatalf("%v", err)
132135
}
133136
}
134137

135138
select {}
136139
}
140+
141+
func printNotice(nodeKey *ecdsa.PublicKey, addr net.UDPAddr) {
142+
if addr.IP.IsUnspecified() {
143+
addr.IP = net.IP{127, 0, 0, 1}
144+
}
145+
n := enode.NewV4(nodeKey, addr.IP, 0, addr.Port)
146+
fmt.Println(n.String())
147+
fmt.Println("Note: you're using cmd/bootnode, a developer tool.")
148+
fmt.Println("We recommend using a regular node as bootstrap node for production deployments.")
149+
}

cmd/p2psim/main.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ import (
4747
"github.com/XinFinOrg/XDPoSChain/crypto"
4848
"github.com/XinFinOrg/XDPoSChain/internal/flags"
4949
"github.com/XinFinOrg/XDPoSChain/p2p"
50-
"github.com/XinFinOrg/XDPoSChain/p2p/discover"
50+
"github.com/XinFinOrg/XDPoSChain/p2p/enode"
5151
"github.com/XinFinOrg/XDPoSChain/p2p/simulations"
5252
"github.com/XinFinOrg/XDPoSChain/p2p/simulations/adapters"
5353
"github.com/XinFinOrg/XDPoSChain/rpc"
@@ -300,7 +300,7 @@ func createNode(ctx *cli.Context) error {
300300
if err != nil {
301301
return err
302302
}
303-
config.ID = discover.PubkeyID(&privKey.PublicKey)
303+
config.ID = enode.PubkeyToIDV4(&privKey.PublicKey)
304304
config.PrivateKey = privKey
305305
}
306306
if services := ctx.String("services"); services != "" {

cmd/utils/flags.go

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ import (
6060
"github.com/XinFinOrg/XDPoSChain/miner"
6161
"github.com/XinFinOrg/XDPoSChain/node"
6262
"github.com/XinFinOrg/XDPoSChain/p2p"
63-
"github.com/XinFinOrg/XDPoSChain/p2p/discover"
6463
"github.com/XinFinOrg/XDPoSChain/p2p/discv5"
64+
"github.com/XinFinOrg/XDPoSChain/p2p/enode"
6565
"github.com/XinFinOrg/XDPoSChain/p2p/nat"
6666
"github.com/XinFinOrg/XDPoSChain/p2p/netutil"
6767
"github.com/XinFinOrg/XDPoSChain/params"
@@ -932,19 +932,20 @@ func setAllowlistAndDenylistForPeers(ctx *cli.Context, cfg *p2p.Config) {
932932
// setup allowlist for peers
933933
if ctx.IsSet(PeersAllowlistFlag.Name) {
934934
urls := SplitAndTrim(ctx.String(PeersAllowlistFlag.Name))
935-
cfg.AllowPeers = make(map[discover.NodeID]struct{}, len(urls))
935+
cfg.AllowPeers = make(map[enode.ID]struct{}, len(urls))
936936
for _, url := range urls {
937937
if url != "" {
938-
node1, err1 := discover.HexID(url)
938+
var node1 enode.ID
939+
err1 := node1.UnmarshalText([]byte(url))
939940
if err1 == nil {
940941
cfg.AllowPeers[node1] = struct{}{}
941942
log.Info("Add peer to allowlist", "id", node1)
942943
continue
943944
}
944-
node2, err2 := discover.ParseNode(url)
945+
node2, err2 := enode.ParseV4(url)
945946
if err2 == nil {
946-
cfg.AllowPeers[node2.ID] = struct{}{}
947-
log.Info("Add peer to allowlist", "enode", url, "id", node2.ID)
947+
cfg.AllowPeers[node2.ID()] = struct{}{}
948+
log.Info("Add peer to allowlist", "enode", url, "id", node2.ID())
948949
continue
949950
}
950951
log.Crit("Invalid peer id for allowlist", "url", url, "err1", err1, "err2", err2)
@@ -955,19 +956,20 @@ func setAllowlistAndDenylistForPeers(ctx *cli.Context, cfg *p2p.Config) {
955956
// setup denylist for peers
956957
if ctx.IsSet(PeersDenylistFlag.Name) {
957958
urls := SplitAndTrim(ctx.String(PeersDenylistFlag.Name))
958-
cfg.DenyPeers = make(map[discover.NodeID]struct{}, len(urls))
959+
cfg.DenyPeers = make(map[enode.ID]struct{}, len(urls))
959960
for _, url := range urls {
960961
if url != "" {
961-
node1, err1 := discover.HexID(url)
962+
var node1 enode.ID
963+
err1 := node1.UnmarshalText([]byte(url))
962964
if err1 == nil {
963965
cfg.DenyPeers[node1] = struct{}{}
964966
log.Info("Add peer to denylist", "id", node1)
965967
continue
966968
}
967-
node2, err2 := discover.ParseNode(url)
969+
node2, err2 := enode.ParseV4(url)
968970
if err2 == nil {
969-
cfg.DenyPeers[node2.ID] = struct{}{}
970-
log.Info("Add peer to denylist", "enode", url, "id", node2.ID)
971+
cfg.DenyPeers[node2.ID()] = struct{}{}
972+
log.Info("Add peer to denylist", "enode", url, "id", node2.ID())
971973
continue
972974
}
973975
log.Crit("Invalid peer id for denylist", "url", url, "err1", err1, "err2", err2)
@@ -982,10 +984,10 @@ func removeDenylistedPeers(cfg *p2p.Config) {
982984
return
983985
}
984986

985-
filteredNodes := make([]*discover.Node, 0, len(cfg.BootstrapNodes))
987+
filteredNodes := make([]*enode.Node, 0, len(cfg.BootstrapNodes))
986988
for _, node := range cfg.BootstrapNodes {
987-
if _, ok := cfg.DenyPeers[node.ID]; ok {
988-
log.Info("Remove denylisted peer", "enode", node, "id", node.ID)
989+
if _, ok := cfg.DenyPeers[node.ID()]; ok {
990+
log.Info("Remove denylisted peer", "enode", node, "id", node.ID())
989991
continue
990992
}
991993
filteredNodes = append(filteredNodes, node)
@@ -1021,11 +1023,11 @@ func setBootstrapNodes(ctx *cli.Context, cfg *p2p.Config) {
10211023
cfg.BootstrapNodes = mustParseBootnodes(urls)
10221024
}
10231025

1024-
func mustParseBootnodes(urls []string) []*discover.Node {
1025-
nodes := make([]*discover.Node, 0, len(urls))
1026+
func mustParseBootnodes(urls []string) []*enode.Node {
1027+
nodes := make([]*enode.Node, 0, len(urls))
10261028
for _, url := range urls {
10271029
if url != "" {
1028-
node, err := discover.ParseNode(url)
1030+
node, err := enode.ParseV4(url)
10291031
if err != nil {
10301032
log.Crit("Bootstrap URL invalid", "enode", url, "err", err)
10311033
return nil

eth/handler.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import (
3939
"github.com/XinFinOrg/XDPoSChain/event"
4040
"github.com/XinFinOrg/XDPoSChain/log"
4141
"github.com/XinFinOrg/XDPoSChain/p2p"
42-
"github.com/XinFinOrg/XDPoSChain/p2p/discover"
42+
"github.com/XinFinOrg/XDPoSChain/p2p/enode"
4343
"github.com/XinFinOrg/XDPoSChain/params"
4444
"github.com/XinFinOrg/XDPoSChain/rlp"
4545
)
@@ -184,7 +184,7 @@ func NewProtocolManager(config *params.ChainConfig, mode downloader.SyncMode, ne
184184
NodeInfo: func() interface{} {
185185
return manager.NodeInfo()
186186
},
187-
PeerInfo: func(id discover.NodeID) interface{} {
187+
PeerInfo: func(id enode.ID) interface{} {
188188
if p := manager.peers.Peer(fmt.Sprintf("%x", id[:8])); p != nil {
189189
return p.Info()
190190
}

eth/helper_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import (
4040
"github.com/XinFinOrg/XDPoSChain/ethdb"
4141
"github.com/XinFinOrg/XDPoSChain/event"
4242
"github.com/XinFinOrg/XDPoSChain/p2p"
43-
"github.com/XinFinOrg/XDPoSChain/p2p/discover"
43+
"github.com/XinFinOrg/XDPoSChain/p2p/enode"
4444
"github.com/XinFinOrg/XDPoSChain/params"
4545
"github.com/holiman/uint256"
4646
)
@@ -206,7 +206,7 @@ func newTestPeer(name string, version int, pm *ProtocolManager, shake bool) (*te
206206
app, net := p2p.MsgPipe()
207207

208208
// Generate a random id and create the peer
209-
var id discover.NodeID
209+
var id enode.ID
210210
rand.Read(id[:])
211211

212212
peer := pm.newPeer(version, p2p.NewPeer(id, name, nil), net)

eth/sync.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626
"github.com/XinFinOrg/XDPoSChain/core/types"
2727
"github.com/XinFinOrg/XDPoSChain/eth/downloader"
2828
"github.com/XinFinOrg/XDPoSChain/log"
29-
"github.com/XinFinOrg/XDPoSChain/p2p/discover"
29+
"github.com/XinFinOrg/XDPoSChain/p2p/enode"
3030
)
3131

3232
const (
@@ -69,7 +69,7 @@ func (pm *ProtocolManager) syncTransactions(p *peer) {
6969
// the transactions in small packs to one peer at a time.
7070
func (pm *ProtocolManager) txsyncLoop() {
7171
var (
72-
pending = make(map[discover.NodeID]*txsync)
72+
pending = make(map[enode.ID]*txsync)
7373
sending = false // whether a send is active
7474
pack = new(txsync) // the pack that is being sent
7575
done = make(chan error, 1) // result of the send

eth/sync_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323

2424
"github.com/XinFinOrg/XDPoSChain/eth/downloader"
2525
"github.com/XinFinOrg/XDPoSChain/p2p"
26-
"github.com/XinFinOrg/XDPoSChain/p2p/discover"
26+
"github.com/XinFinOrg/XDPoSChain/p2p/enode"
2727
)
2828

2929
// Tests that fast sync gets disabled as soon as a real block is successfully
@@ -42,8 +42,8 @@ func TestFastSyncDisabling(t *testing.T) {
4242
// Sync up the two peers
4343
io1, io2 := p2p.MsgPipe()
4444

45-
go pmFull.handle(pmFull.newPeer(63, p2p.NewPeer(discover.NodeID{}, "empty", nil), io2))
46-
go pmEmpty.handle(pmEmpty.newPeer(63, p2p.NewPeer(discover.NodeID{}, "full", nil), io1))
45+
go pmFull.handle(pmFull.newPeer(63, p2p.NewPeer(enode.ID{}, "empty", nil), io2))
46+
go pmEmpty.handle(pmEmpty.newPeer(63, p2p.NewPeer(enode.ID{}, "full", nil), io1))
4747

4848
time.Sleep(250 * time.Millisecond)
4949
pmEmpty.synchronise(pmEmpty.peers.BestPeer())

node/api.go

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626
"github.com/XinFinOrg/XDPoSChain/internal/debug"
2727
"github.com/XinFinOrg/XDPoSChain/log"
2828
"github.com/XinFinOrg/XDPoSChain/p2p"
29-
"github.com/XinFinOrg/XDPoSChain/p2p/discover"
29+
"github.com/XinFinOrg/XDPoSChain/p2p/enode"
3030
"github.com/XinFinOrg/XDPoSChain/rpc"
3131
)
3232

@@ -61,19 +61,19 @@ func (api *adminAPI) AddPeer(url string) (bool, error) {
6161
return false, ErrNodeStopped
6262
}
6363
// Try to add the url as a static peer and return
64-
node, err := discover.ParseNode(url)
64+
node, err := enode.ParseV4(url)
6565
if err != nil {
6666
return false, fmt.Errorf("invalid enode: %v", err)
6767
}
6868
// only accept the node which is in peer allowlist if the list is not empty
6969
if len(server.AllowPeers) > 0 {
70-
if _, ok := server.AllowPeers[node.ID]; !ok {
71-
return false, fmt.Errorf("peer is not in allowlist: %v, ID: %s", url, node.ID)
70+
if _, ok := server.AllowPeers[node.ID()]; !ok {
71+
return false, fmt.Errorf("peer is not in allowlist: %v, ID: %s", url, node.ID())
7272
}
7373
}
7474
// reject the node which is in peer blacklist
75-
if _, ok := server.DenyPeers[node.ID]; ok {
76-
return false, fmt.Errorf("peer is in blacklist: %v, ID: %s", url, node.ID)
75+
if _, ok := server.DenyPeers[node.ID()]; ok {
76+
return false, fmt.Errorf("peer is in blacklist: %v, ID: %s", url, node.ID())
7777
}
7878
server.AddPeer(node)
7979
return true, nil
@@ -87,7 +87,7 @@ func (api *adminAPI) RemovePeer(url string) (bool, error) {
8787
return false, ErrNodeStopped
8888
}
8989
// Try to remove the url as a static peer and return
90-
node, err := discover.ParseNode(url)
90+
node, err := enode.ParseV4(url)
9191
if err != nil {
9292
return false, fmt.Errorf("invalid enode: %v", err)
9393
}
@@ -102,19 +102,19 @@ func (api *adminAPI) AddTrustedPeer(url string) (bool, error) {
102102
if server == nil {
103103
return false, ErrNodeStopped
104104
}
105-
node, err := discover.ParseNode(url)
105+
node, err := enode.ParseV4(url)
106106
if err != nil {
107107
return false, fmt.Errorf("invalid enode: %v", err)
108108
}
109109
// only accept the node which is in peer allowlist if the list is not empty
110110
if len(server.AllowPeers) > 0 {
111-
if _, ok := server.AllowPeers[node.ID]; !ok {
112-
return false, fmt.Errorf("trusted peer is not in allowlist: %v, ID: %s", url, node.ID)
111+
if _, ok := server.AllowPeers[node.ID()]; !ok {
112+
return false, fmt.Errorf("trusted peer is not in allowlist: %v, ID: %s", url, node.ID())
113113
}
114114
}
115115
// reject the node which is in peer blacklist
116-
if _, ok := server.DenyPeers[node.ID]; ok {
117-
return false, fmt.Errorf("trusted peer is in blacklist: %v, ID: %s", url, node.ID)
116+
if _, ok := server.DenyPeers[node.ID()]; ok {
117+
return false, fmt.Errorf("trusted peer is in blacklist: %v, ID: %s", url, node.ID())
118118
}
119119
server.AddTrustedPeer(node)
120120
return true, nil
@@ -128,7 +128,7 @@ func (api *adminAPI) RemoveTrustedPeer(url string) (bool, error) {
128128
if server == nil {
129129
return false, ErrNodeStopped
130130
}
131-
node, err := discover.ParseNode(url)
131+
node, err := enode.ParseV4(url)
132132
if err != nil {
133133
return false, fmt.Errorf("invalid enode: %v", err)
134134
}

0 commit comments

Comments
 (0)