Skip to content

Commit 52e5360

Browse files
authored
Merge pull request #8 from zen-eth/gnet
feat: make gnet configurable
2 parents 1578840 + f9f6bfb commit 52e5360

File tree

8 files changed

+287
-29
lines changed

8 files changed

+287
-29
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ curl -X POST http://127.0.0.1:8545 \
7575
* `--private.key` private key of p2p node, hex format without `0x` prifix
7676
* `--bootnodes` bootnode of p2p network with ENR format, use `none` to config empty bootnodes
7777
* `--networks` portal sub networks: history, beacon, state
78+
* `--discv5.gnet` enable gnet(windows does not support) as udp connection in discv5, default is false
7879

7980
all the options above can be set with envs.
8081

cmd/shisui/main.go

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ var (
7676
utils.PortalBootNodesFlag,
7777
utils.PortalPrivateKeyFlag,
7878
utils.PortalNetworksFlag,
79+
utils.PortalDiscv5GnetFlag,
7980
}
8081
historyRpcFlags = []cli.Flag{
8182
utils.PortalRPCListenAddrFlag,
@@ -147,6 +148,12 @@ func shisui(ctx *cli.Context) error {
147148
return nil
148149
}
149150

151+
conn, err := newConn(ctx, config.Protocol.ListenAddr)
152+
153+
if err != nil {
154+
return err
155+
}
156+
150157
// Start metrics export if enabled
151158
utils.SetupMetrics(config.Metrics)
152159

@@ -159,17 +166,22 @@ func shisui(ctx *cli.Context) error {
159166

160167
clientChan := make(chan *Client, 1)
161168
go handlerInterrupt(clientChan)
169+
return startPortalRpcServer(*config, conn, config.RpcAddr, clientChan)
170+
}
162171

163-
addr, err := net.ResolveUDPAddr("udp", config.Protocol.ListenAddr)
164-
if err != nil {
165-
return err
166-
}
167-
conn, err := net.ListenUDP("udp", addr)
168-
if err != nil {
169-
return err
172+
func newConn(ctx *cli.Context, addrStr string) (discover.UDPConn, error) {
173+
if useGnet := ctx.Bool(utils.PortalDiscv5GnetFlag.Name); useGnet {
174+
conn := portalwire.NewGnetConn(log.New("discv5", "gnet"))
175+
err := conn.ListenUDP(context.Background(), addrStr)
176+
return conn, err
177+
} else {
178+
addr, err := net.ResolveUDPAddr("udp", addrStr)
179+
if err != nil {
180+
return nil, err
181+
}
182+
conn, err := net.ListenUDP("udp", addr)
183+
return conn, err
170184
}
171-
172-
return startPortalRpcServer(*config, conn, config.RpcAddr, clientChan)
173185
}
174186

175187
func setDefaultLogger(logLevel int, logFormat string) error {

cmd/shisui/utils/flags.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,12 @@ Please note that --` + MetricsHTTPFlag.Name + ` must be set to start the server.
180180
Category: flags.PortalNetworkCategory,
181181
Value: cli.NewStringSlice(portalwire.History.Name()),
182182
}
183+
PortalDiscv5GnetFlag = &cli.BoolFlag{
184+
Name: "discv5.gnet",
185+
Usage: "Enable gnet on discv5, default is go udp connection",
186+
Category: flags.PortalNetworkCategory,
187+
Value: false,
188+
}
183189
)
184190

185191
func SetupMetrics(cfg *metrics.Config) {

go.mod

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ require (
1616
github.com/mattn/go-isatty v0.0.20
1717
github.com/mattn/go-sqlite3 v1.14.24
1818
github.com/optimism-java/utp-go v0.0.0-20241223124724-19352018cc52
19+
github.com/panjf2000/gnet/v2 v2.6.3
1920
github.com/protolambda/bls12-381-util v0.1.0
2021
github.com/protolambda/zrnt v0.32.3
2122
github.com/protolambda/ztyp v0.2.2
@@ -79,10 +80,11 @@ require (
7980
github.com/mmcloughlin/addchain v0.4.0 // indirect
8081
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
8182
github.com/olekukonko/tablewriter v0.0.5 // indirect
82-
github.com/pion/dtls/v2 v2.2.7 // indirect
83+
github.com/panjf2000/ants/v2 v2.10.0 // indirect
84+
github.com/pion/dtls/v2 v2.2.12 // indirect
8385
github.com/pion/logging v0.2.2 // indirect
8486
github.com/pion/stun v0.6.1 // indirect
85-
github.com/pion/transport/v2 v2.2.1 // indirect
87+
github.com/pion/transport/v2 v2.2.4 // indirect
8688
github.com/pkg/errors v0.9.1 // indirect
8789
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
8890
github.com/prometheus/client_golang v1.20.5 // indirect
@@ -95,8 +97,9 @@ require (
9597
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect
9698
github.com/supranational/blst v0.3.13 // indirect
9799
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect
98-
github.com/tklauser/go-sysconf v0.3.12 // indirect
99-
github.com/tklauser/numcpus v0.6.1 // indirect
100+
github.com/tklauser/go-sysconf v0.3.14 // indirect
101+
github.com/tklauser/numcpus v0.9.0 // indirect
102+
github.com/valyala/bytebufferpool v1.0.0 // indirect
100103
github.com/valyala/fastrand v1.1.0 // indirect
101104
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
102105
go.uber.org/multierr v1.11.0 // indirect

go.sum

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -190,16 +190,22 @@ github.com/optimism-java/utp-go v0.0.0-20241223124724-19352018cc52 h1:5wq4o4t/um
190190
github.com/optimism-java/utp-go v0.0.0-20241223124724-19352018cc52/go.mod h1:dJZNMUlyNpjM2VkUEHhmFprLei6gCg3r7U9qj9MmJNQ=
191191
github.com/optimism-java/zrnt v0.32.4-0.20240415084906-d9dbf06b32f7 h1:ZTQWXQ8xblCRUXhZs3h5qrBMSAHe8iNH7BG7a7IVFlI=
192192
github.com/optimism-java/zrnt v0.32.4-0.20240415084906-d9dbf06b32f7/go.mod h1:A0fezkp9Tt3GBLATSPIbuY4ywYESyAuc/FFmPKg8Lqs=
193+
github.com/panjf2000/ants/v2 v2.10.0 h1:zhRg1pQUtkyRiOFo2Sbqwjp0GfBNo9cUY2/Grpx1p+8=
194+
github.com/panjf2000/ants/v2 v2.10.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I=
195+
github.com/panjf2000/gnet/v2 v2.6.3 h1:+Lw6FUAvgtc51bcs3w5bNQOsx8iVv5nEWVJUL4lhjsA=
196+
github.com/panjf2000/gnet/v2 v2.6.3/go.mod h1:HpNv+iQrIOeil1eyhdnKDlui7jivyMf0K3xwaeHKnh8=
193197
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
194198
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
195-
github.com/pion/dtls/v2 v2.2.7 h1:cSUBsETxepsCSFSxC3mc/aDo14qQLMSL+O6IjG28yV8=
196199
github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s=
200+
github.com/pion/dtls/v2 v2.2.12 h1:KP7H5/c1EiVAAKUmXyCzPiQe5+bCJrpOeKg/L05dunk=
201+
github.com/pion/dtls/v2 v2.2.12/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE=
197202
github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY=
198203
github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms=
199204
github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4=
200205
github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8=
201-
github.com/pion/transport/v2 v2.2.1 h1:7qYnCBlpgSJNYMbLCKuSY9KbQdBFoETvPNETv0y4N7c=
202206
github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g=
207+
github.com/pion/transport/v2 v2.2.4 h1:41JJK6DZQYSeVLxILA2+F4ZkKb4Xd/tFJZRFZQ9QAlo=
208+
github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0=
203209
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
204210
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
205211
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -242,6 +248,7 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P
242248
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
243249
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
244250
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
251+
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
245252
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
246253
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
247254
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
@@ -252,12 +259,13 @@ github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70
252259
github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc=
253260
github.com/tetratelabs/wabin v0.0.0-20230304001439-f6f874872834 h1:ZF+QBjOI+tILZjBaFj3HgFonKXUcwgJ4djLb6i42S3Q=
254261
github.com/tetratelabs/wabin v0.0.0-20230304001439-f6f874872834/go.mod h1:m9ymHTgNSEjuxvw8E7WWe4Pl4hZQHXONY8wE6dMLaRk=
255-
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
256-
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
257-
github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
258-
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
262+
github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU=
263+
github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY=
264+
github.com/tklauser/numcpus v0.9.0 h1:lmyCHtANi8aRUgkckBgoDk1nHCux3n2cgkJLXdQGPDo=
265+
github.com/tklauser/numcpus v0.9.0/go.mod h1:SN6Nq1O3VychhC1npsWostA+oW+VOQTxZrS604NSRyI=
259266
github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w=
260267
github.com/urfave/cli/v2 v2.27.5/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ=
268+
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
261269
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
262270
github.com/valyala/fastrand v1.1.0 h1:f+5HkLW4rsgzdNoleUOB69hyT9IlD2ZQh9GyDMfb5G8=
263271
github.com/valyala/fastrand v1.1.0/go.mod h1:HWqCzkrkg6QXT8V2EXWvXCoow7vLwOFN002oeRzjapQ=
@@ -283,6 +291,8 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh
283291
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
284292
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
285293
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
294+
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
295+
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
286296
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
287297
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
288298
golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f h1:XdNn9LlyWAhLVp6P/i8QYBW+hlyhrhei9uErw2B5GJo=
@@ -304,6 +314,9 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
304314
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
305315
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
306316
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
317+
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
318+
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
319+
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
307320
golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
308321
golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
309322
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -313,6 +326,7 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ
313326
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
314327
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
315328
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
329+
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
316330
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
317331
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
318332
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -346,20 +360,26 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
346360
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
347361
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
348362
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
363+
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
349364
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
350365
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
351366
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
352367
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
353368
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
354369
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
355370
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
371+
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
372+
golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
373+
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
356374
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
357375
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
358376
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
359377
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
360378
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
361379
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
362380
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
381+
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
382+
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
363383
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
364384
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
365385
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=

portalwire/gnet.go

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
package portalwire
2+
3+
import (
4+
"context"
5+
"net"
6+
"net/netip"
7+
"os"
8+
9+
"github.com/ethereum/go-ethereum/log"
10+
"github.com/ethereum/go-ethereum/p2p/discover"
11+
"github.com/panjf2000/gnet/v2"
12+
)
13+
14+
var _ discover.UDPConn = &gnetConn{}
15+
16+
type packet struct {
17+
n int
18+
addr netip.AddrPort
19+
data []byte
20+
err error
21+
}
22+
23+
type gnetConn struct {
24+
gnet.BuiltinEventEngine
25+
conn *net.UDPConn
26+
log log.Logger
27+
localAddr net.Addr
28+
eng gnet.Engine
29+
packetChan chan packet
30+
startChan chan struct{}
31+
}
32+
33+
func NewGnetConn(log log.Logger) *gnetConn {
34+
return &gnetConn{
35+
log: log,
36+
packetChan: make(chan packet, 1024),
37+
startChan: make(chan struct{}),
38+
}
39+
}
40+
41+
func (gc *gnetConn) ListenUDP(ctx context.Context, addr string) error {
42+
udpAddr, err := net.ResolveUDPAddr("udp", addr)
43+
if err != nil {
44+
return err
45+
}
46+
if udpAddr.IP == nil {
47+
udpAddr.IP = net.IPv4zero // Use IPv4 0.0.0.0 explicitly
48+
}
49+
gc.localAddr = udpAddr
50+
51+
go func() {
52+
err := gnet.Run(gc, "udp://"+addr)
53+
gc.log.Error("gnet run failed", "err", err)
54+
}()
55+
<-gc.startChan
56+
return nil
57+
}
58+
59+
func (gc *gnetConn) OnTraffic(c gnet.Conn) gnet.Action {
60+
packet := packet{}
61+
data, err := c.Next(-1)
62+
63+
if err != nil {
64+
gc.log.Error("read next failed", "err", err)
65+
packet.err = err
66+
gc.packetChan <- packet
67+
return gnet.None
68+
}
69+
// discv5 packet length is 1280 bytes and bigger than 63 bytes
70+
if len(data) > 1280 || len(data) < 63 {
71+
gc.log.Error("drop packet with invalid length", "len", len(data), "addr", c.RemoteAddr())
72+
return gnet.None
73+
}
74+
gc.log.Debug("<< reveice data", "remote", c.RemoteAddr())
75+
dst := make([]byte, len(data))
76+
copy(dst, data)
77+
packet.n = len(dst)
78+
packet.data = dst
79+
remote := c.RemoteAddr().(*net.UDPAddr)
80+
packet.addr = netip.AddrPortFrom(
81+
netip.AddrFrom4([4]byte(remote.IP.To4())),
82+
uint16(remote.Port),
83+
)
84+
gc.packetChan <- packet
85+
86+
return gnet.None
87+
}
88+
89+
func (gc *gnetConn) OnBoot(eng gnet.Engine) gnet.Action {
90+
fd, err := eng.Dup()
91+
if err != nil {
92+
gc.log.Error("on boot dup failed", "err", err)
93+
return gnet.Shutdown
94+
}
95+
file := os.NewFile(uintptr(fd), "udp")
96+
97+
conn, err := net.FileConn(file)
98+
if err != nil {
99+
gc.log.Error("on boot file conn failed", "err", err)
100+
return gnet.Shutdown
101+
}
102+
103+
udpConn := conn.(*net.UDPConn)
104+
gc.conn = udpConn
105+
gc.eng = eng
106+
gc.startChan <- struct{}{}
107+
return gnet.None
108+
}
109+
110+
func (gc *gnetConn) OnShutdown(eng gnet.Engine) {
111+
close(gc.packetChan)
112+
if err := gc.conn.Close(); err != nil {
113+
gc.log.Error("on shutdown close failed", "err", err)
114+
}
115+
}
116+
117+
func (gc *gnetConn) ReadFromUDPAddrPort(b []byte) (n int, addr netip.AddrPort, err error) {
118+
packet := <-gc.packetChan
119+
copy(b, packet.data)
120+
return packet.n, packet.addr, packet.err
121+
}
122+
123+
func (gc *gnetConn) WriteToUDPAddrPort(b []byte, addr netip.AddrPort) (n int, err error) {
124+
gc.log.Debug(">> send data to", "remote", addr)
125+
return gc.conn.WriteToUDPAddrPort(b, addr)
126+
}
127+
128+
func (gc *gnetConn) Close() error {
129+
return gc.eng.Stop(context.Background())
130+
}
131+
132+
func (gc *gnetConn) LocalAddr() net.Addr {
133+
return gc.localAddr
134+
}

0 commit comments

Comments
 (0)