mirror of
https://github.com/ayflying/p2p.git
synced 2026-03-04 17:29:22 +00:00
完成dht的分布式储存
This commit is contained in:
@@ -13,4 +13,5 @@ import (
|
|||||||
type IP2PV1 interface {
|
type IP2PV1 interface {
|
||||||
Connect(ctx context.Context, req *v1.ConnectReq) (res *v1.ConnectRes, err error)
|
Connect(ctx context.Context, req *v1.ConnectReq) (res *v1.ConnectRes, err error)
|
||||||
Send(ctx context.Context, req *v1.SendReq) (res *v1.SendRes, err error)
|
Send(ctx context.Context, req *v1.SendReq) (res *v1.SendRes, err error)
|
||||||
|
Ip(ctx context.Context, req *v1.IpReq) (res *v1.IpRes, err error)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,3 +18,10 @@ type SendReq struct {
|
|||||||
type SendRes struct {
|
type SendRes struct {
|
||||||
g.Meta `mime:"text/html" example:"string"`
|
g.Meta `mime:"text/html" example:"string"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type IpReq struct {
|
||||||
|
g.Meta `path:"/p2p/ip" tags:"p2p" method:"get" sm:"获取当前主机的IP地址"`
|
||||||
|
}
|
||||||
|
type IpRes struct {
|
||||||
|
g.Meta `mime:"text/html" example:"string"`
|
||||||
|
}
|
||||||
|
|||||||
6
go.mod
6
go.mod
@@ -8,9 +8,11 @@ require (
|
|||||||
github.com/gogf/gf/v2 v2.9.3
|
github.com/gogf/gf/v2 v2.9.3
|
||||||
github.com/google/uuid v1.6.0
|
github.com/google/uuid v1.6.0
|
||||||
github.com/gorilla/websocket v1.5.3
|
github.com/gorilla/websocket v1.5.3
|
||||||
|
github.com/ipfs/go-ipns v0.3.1
|
||||||
github.com/libp2p/go-libp2p v0.43.0
|
github.com/libp2p/go-libp2p v0.43.0
|
||||||
github.com/libp2p/go-libp2p-kad-dht v0.35.1
|
github.com/libp2p/go-libp2p-kad-dht v0.35.1
|
||||||
github.com/multiformats/go-multiaddr v0.16.1
|
github.com/multiformats/go-multiaddr v0.16.1
|
||||||
|
github.com/multiformats/go-multihash v0.2.3
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
@@ -32,6 +34,7 @@ require (
|
|||||||
github.com/go-logr/logr v1.4.3 // indirect
|
github.com/go-logr/logr v1.4.3 // indirect
|
||||||
github.com/go-logr/stdr v1.2.2 // indirect
|
github.com/go-logr/stdr v1.2.2 // indirect
|
||||||
github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect
|
github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect
|
||||||
|
github.com/gogo/protobuf v1.3.2 // indirect
|
||||||
github.com/google/gopacket v1.1.19 // indirect
|
github.com/google/gopacket v1.1.19 // indirect
|
||||||
github.com/google/pprof v0.0.0-20230405160723-4a4c7d95572b // indirect
|
github.com/google/pprof v0.0.0-20230405160723-4a4c7d95572b // indirect
|
||||||
github.com/grokify/html-strip-tags-go v0.1.0 // indirect
|
github.com/grokify/html-strip-tags-go v0.1.0 // indirect
|
||||||
@@ -40,6 +43,7 @@ require (
|
|||||||
github.com/ipfs/boxo v0.35.0 // indirect
|
github.com/ipfs/boxo v0.35.0 // indirect
|
||||||
github.com/ipfs/go-cid v0.5.0 // indirect
|
github.com/ipfs/go-cid v0.5.0 // indirect
|
||||||
github.com/ipfs/go-datastore v0.9.0 // indirect
|
github.com/ipfs/go-datastore v0.9.0 // indirect
|
||||||
|
github.com/ipfs/go-ipfs-util v0.0.3 // indirect
|
||||||
github.com/ipfs/go-log/v2 v2.8.1 // indirect
|
github.com/ipfs/go-log/v2 v2.8.1 // indirect
|
||||||
github.com/ipld/go-ipld-prime v0.21.0 // indirect
|
github.com/ipld/go-ipld-prime v0.21.0 // indirect
|
||||||
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
|
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
|
||||||
@@ -74,7 +78,6 @@ require (
|
|||||||
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
|
github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect
|
||||||
github.com/multiformats/go-multibase v0.2.0 // indirect
|
github.com/multiformats/go-multibase v0.2.0 // indirect
|
||||||
github.com/multiformats/go-multicodec v0.9.2 // indirect
|
github.com/multiformats/go-multicodec v0.9.2 // indirect
|
||||||
github.com/multiformats/go-multihash v0.2.3 // indirect
|
|
||||||
github.com/multiformats/go-multistream v0.6.1 // indirect
|
github.com/multiformats/go-multistream v0.6.1 // indirect
|
||||||
github.com/multiformats/go-varint v0.1.0 // indirect
|
github.com/multiformats/go-varint v0.1.0 // indirect
|
||||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||||
@@ -101,6 +104,7 @@ require (
|
|||||||
github.com/pion/transport/v3 v3.0.7 // indirect
|
github.com/pion/transport/v3 v3.0.7 // indirect
|
||||||
github.com/pion/turn/v4 v4.0.2 // indirect
|
github.com/pion/turn/v4 v4.0.2 // indirect
|
||||||
github.com/pion/webrtc/v4 v4.1.2 // indirect
|
github.com/pion/webrtc/v4 v4.1.2 // indirect
|
||||||
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
github.com/polydawn/refmt v0.89.0 // indirect
|
github.com/polydawn/refmt v0.89.0 // indirect
|
||||||
github.com/prometheus/client_golang v1.23.2 // indirect
|
github.com/prometheus/client_golang v1.23.2 // indirect
|
||||||
github.com/prometheus/client_model v0.6.2 // indirect
|
github.com/prometheus/client_model v0.6.2 // indirect
|
||||||
|
|||||||
23
go.sum
23
go.sum
@@ -79,6 +79,8 @@ github.com/gogf/gf/contrib/nosql/redis/v2 v2.9.3/go.mod h1:gcidgAYn4IWbx08QUThg7
|
|||||||
github.com/gogf/gf/v2 v2.9.3 h1:qjN4s55FfUzxZ1AE8vUHNDX3V0eIOUGXhF2DjRTVZQ4=
|
github.com/gogf/gf/v2 v2.9.3 h1:qjN4s55FfUzxZ1AE8vUHNDX3V0eIOUGXhF2DjRTVZQ4=
|
||||||
github.com/gogf/gf/v2 v2.9.3/go.mod h1:w6rcfD13SmO7FKI80k9LSLiSMGqpMYp50Nfkrrc2sEE=
|
github.com/gogf/gf/v2 v2.9.3/go.mod h1:w6rcfD13SmO7FKI80k9LSLiSMGqpMYp50Nfkrrc2sEE=
|
||||||
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
|
||||||
|
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||||
|
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
|
github.com/golang/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E=
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
@@ -124,6 +126,10 @@ github.com/ipfs/go-datastore v0.9.0 h1:WocriPOayqalEsueHv6SdD4nPVl4rYMfYGLD4bqCZ
|
|||||||
github.com/ipfs/go-datastore v0.9.0/go.mod h1:uT77w/XEGrvJWwHgdrMr8bqCN6ZTW9gzmi+3uK+ouHg=
|
github.com/ipfs/go-datastore v0.9.0/go.mod h1:uT77w/XEGrvJWwHgdrMr8bqCN6ZTW9gzmi+3uK+ouHg=
|
||||||
github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=
|
github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk=
|
||||||
github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps=
|
github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps=
|
||||||
|
github.com/ipfs/go-ipfs-util v0.0.3 h1:2RFdGez6bu2ZlZdI+rWfIdbQb1KudQp3VGwPtdNCmE0=
|
||||||
|
github.com/ipfs/go-ipfs-util v0.0.3/go.mod h1:LHzG1a0Ig4G+iZ26UUOMjHd+lfM84LZCrn17xAKWBvs=
|
||||||
|
github.com/ipfs/go-ipns v0.3.1 h1:BZUCV4tzI/q/pFido7I81BPVCvWg+66/qPCuglxETew=
|
||||||
|
github.com/ipfs/go-ipns v0.3.1/go.mod h1:85Qm9tAQVUn7ELuHjl2qVF6OnMNJjrC6gmnh0+UGk/A=
|
||||||
github.com/ipfs/go-log/v2 v2.8.1 h1:Y/X36z7ASoLJaYIJAL4xITXgwf7RVeqb1+/25aq/Xk0=
|
github.com/ipfs/go-log/v2 v2.8.1 h1:Y/X36z7ASoLJaYIJAL4xITXgwf7RVeqb1+/25aq/Xk0=
|
||||||
github.com/ipfs/go-log/v2 v2.8.1/go.mod h1:NyhTBcZmh2Y55eWVjOeKf8M7e4pnJYM3yDZNxQBWEEY=
|
github.com/ipfs/go-log/v2 v2.8.1/go.mod h1:NyhTBcZmh2Y55eWVjOeKf8M7e4pnJYM3yDZNxQBWEEY=
|
||||||
github.com/ipfs/go-test v0.2.3 h1:Z/jXNAReQFtCYyn7bsv/ZqUwS6E7iIcSpJ2CuzCvnrc=
|
github.com/ipfs/go-test v0.2.3 h1:Z/jXNAReQFtCYyn7bsv/ZqUwS6E7iIcSpJ2CuzCvnrc=
|
||||||
@@ -139,6 +145,7 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV
|
|||||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||||
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
|
||||||
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
|
||||||
|
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
|
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
|
||||||
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
|
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
|
||||||
@@ -292,6 +299,8 @@ github.com/pion/turn/v4 v4.0.2/go.mod h1:pMMKP/ieNAG/fN5cZiN4SDuyKsXtNTr0ccN7ITo
|
|||||||
github.com/pion/webrtc/v4 v4.1.2 h1:mpuUo/EJ1zMNKGE79fAdYNFZBX790KE7kQQpLMjjR54=
|
github.com/pion/webrtc/v4 v4.1.2 h1:mpuUo/EJ1zMNKGE79fAdYNFZBX790KE7kQQpLMjjR54=
|
||||||
github.com/pion/webrtc/v4 v4.1.2/go.mod h1:xsCXiNAmMEjIdFxAYU0MbB3RwRieJsegSB2JZsGN+8U=
|
github.com/pion/webrtc/v4 v4.1.2/go.mod h1:xsCXiNAmMEjIdFxAYU0MbB3RwRieJsegSB2JZsGN+8U=
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4=
|
github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4=
|
||||||
@@ -377,6 +386,8 @@ github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h
|
|||||||
github.com/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA=
|
github.com/wlynxg/anet v0.0.3/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA=
|
||||||
github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU=
|
github.com/wlynxg/anet v0.0.5 h1:J3VJGi1gvo0JwZ/P1/Yc/8p63SoW98B5dHkYDmpgvvU=
|
||||||
github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA=
|
github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguHxoA=
|
||||||
|
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
|
go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA=
|
||||||
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
|
go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
|
||||||
@@ -413,6 +424,7 @@ golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACk
|
|||||||
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
|
||||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
|
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
|
||||||
@@ -428,6 +440,8 @@ golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTk
|
|||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||||
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U=
|
golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U=
|
||||||
@@ -443,6 +457,8 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn
|
|||||||
golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
@@ -463,6 +479,8 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ
|
|||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
@@ -475,6 +493,7 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h
|
|||||||
golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
@@ -518,12 +537,16 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3
|
|||||||
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||||
golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE=
|
golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE=
|
||||||
golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w=
|
golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
|
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
|
||||||
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
|
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
|
||||||
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
|
||||||
|
|||||||
@@ -67,7 +67,6 @@ var (
|
|||||||
group.Middleware(ghttp.MiddlewareHandlerResponse)
|
group.Middleware(ghttp.MiddlewareHandlerResponse)
|
||||||
service.P2P().GatewayStart(ctx, group)
|
service.P2P().GatewayStart(ctx, group)
|
||||||
})
|
})
|
||||||
s.Run()
|
|
||||||
case "client":
|
case "client":
|
||||||
// 获取客户端模式所需的参数
|
// 获取客户端模式所需的参数
|
||||||
g.Log().Debug(ctx, "开始执行client")
|
g.Log().Debug(ctx, "开始执行client")
|
||||||
@@ -78,7 +77,24 @@ var (
|
|||||||
err = service.P2P().Start(ctx, wsStr)
|
err = service.P2P().Start(ctx, wsStr)
|
||||||
case "dht":
|
case "dht":
|
||||||
h, _ := service.P2P().CreateLibp2pHost(ctx, 0)
|
h, _ := service.P2P().CreateLibp2pHost(ctx, 0)
|
||||||
service.P2P().DHTStart(ctx, h)
|
err := service.P2P().DHTStart(ctx, h)
|
||||||
|
if err != nil {
|
||||||
|
g.Log().Error(ctx, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
publicIp, err := service.P2P().GetIPv4PublicIP()
|
||||||
|
err = service.P2P().StoreAddrToDHT(ctx, "ip", publicIp)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
case "dht2":
|
||||||
|
h, _ := service.P2P().CreateLibp2pHost(ctx, 0)
|
||||||
|
err := service.P2P().DHTStart(ctx, h)
|
||||||
|
if err != nil {
|
||||||
|
g.Log().Error(ctx, err)
|
||||||
|
}
|
||||||
|
get, _ := service.P2P().FindAddrFromDHT(ctx, "ip")
|
||||||
|
g.Dump(get)
|
||||||
|
|
||||||
default:
|
default:
|
||||||
// 显示帮助信息
|
// 显示帮助信息
|
||||||
@@ -88,6 +104,8 @@ var (
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s.Run()
|
||||||
return
|
return
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
14
internal/controller/p2p/p2p_v1_ip.go
Normal file
14
internal/controller/p2p/p2p_v1_ip.go
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package p2p
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/ayflying/p2p/api/p2p/v1"
|
||||||
|
"github.com/gogf/gf/v2/frame/g"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (c *ControllerV1) Ip(ctx context.Context, req *v1.IpReq) (res *v1.IpRes, err error) {
|
||||||
|
ip := g.RequestFromCtx(ctx).GetRemoteIp()
|
||||||
|
g.RequestFromCtx(ctx).Response.Write(ip)
|
||||||
|
return
|
||||||
|
}
|
||||||
@@ -12,13 +12,16 @@ import (
|
|||||||
"github.com/gogf/gf/v2/os/gctx"
|
"github.com/gogf/gf/v2/os/gctx"
|
||||||
"github.com/gogf/gf/v2/os/glog"
|
"github.com/gogf/gf/v2/os/glog"
|
||||||
"github.com/gogf/gf/v2/os/gtimer"
|
"github.com/gogf/gf/v2/os/gtimer"
|
||||||
|
"github.com/gogf/gf/v2/util/grand"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/gorilla/websocket"
|
"github.com/gorilla/websocket"
|
||||||
"github.com/libp2p/go-libp2p"
|
"github.com/libp2p/go-libp2p"
|
||||||
|
"github.com/libp2p/go-libp2p/core/crypto"
|
||||||
"github.com/libp2p/go-libp2p/core/host"
|
"github.com/libp2p/go-libp2p/core/host"
|
||||||
"github.com/libp2p/go-libp2p/core/network"
|
"github.com/libp2p/go-libp2p/core/network"
|
||||||
"github.com/libp2p/go-libp2p/core/peer"
|
"github.com/libp2p/go-libp2p/core/peer"
|
||||||
"github.com/libp2p/go-libp2p/core/peerstore"
|
"github.com/libp2p/go-libp2p/core/peerstore"
|
||||||
|
"github.com/libp2p/go-libp2p/core/protocol"
|
||||||
"github.com/multiformats/go-multiaddr"
|
"github.com/multiformats/go-multiaddr"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -50,7 +53,7 @@ func (s *sP2P) Start(ctx context.Context, wsStr string) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 设置流处理函数(处理P2P消息)
|
// 设置流处理函数(处理P2P消息)
|
||||||
hostObj.SetStreamHandler(ProtocolID, s.handleStream)
|
hostObj.SetStreamHandler(protocol.ID(ProtocolID), s.handleStream)
|
||||||
|
|
||||||
// 连接网关(WebSocket)
|
// 连接网关(WebSocket)
|
||||||
if err = s.connectGateway(); err != nil {
|
if err = s.connectGateway(); err != nil {
|
||||||
@@ -72,18 +75,23 @@ func (s *sP2P) Start(ctx context.Context, wsStr string) (err error) {
|
|||||||
// 创建libp2p主机
|
// 创建libp2p主机
|
||||||
func (s *sP2P) CreateLibp2pHost(ctx context.Context, port int) (host.Host, error) {
|
func (s *sP2P) CreateLibp2pHost(ctx context.Context, port int) (host.Host, error) {
|
||||||
if port == 0 {
|
if port == 0 {
|
||||||
//port = grand.N(50000, 55000)
|
port = grand.N(50000, 55000)
|
||||||
port = 53533
|
//port = 53533
|
||||||
}
|
}
|
||||||
// 配置监听地址
|
// 配置监听地址
|
||||||
//listenAddr := fmt.Sprintf("/ip4/0.0.0.0/tcp/%d", port)
|
//listenAddr := fmt.Sprintf("/ip4/0.0.0.0/tcp/%d", port)
|
||||||
var listenAddrs = []string{
|
var listenAddrs = []string{
|
||||||
fmt.Sprintf("/ip4/0.0.0.0/tcp/%d", port),
|
fmt.Sprintf("/ip4/0.0.0.0/tcp/%d", port), // 随机 TCP 端口
|
||||||
fmt.Sprintf("/ip4/0.0.0.0/udp/%d/quic-v1", port),
|
fmt.Sprintf("/ip4/0.0.0.0/udp/%d/quic-v1", port), // 随机 UDP 端口(QUIC 协议,提升打洞成功率)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 1. 生成密钥对并初始化节点(确保身份有效)
|
||||||
|
s.privKey, _, _ = crypto.GenerateKeyPair(crypto.Ed25519, 0) // 推荐使用Ed25519
|
||||||
|
|
||||||
// 创建主机
|
// 创建主机
|
||||||
h, err := libp2p.New(
|
h, err := libp2p.New(
|
||||||
libp2p.ListenAddrStrings(listenAddrs...),
|
libp2p.ListenAddrStrings(listenAddrs...),
|
||||||
|
libp2p.Identity(s.privKey),
|
||||||
libp2p.DefaultTransports,
|
libp2p.DefaultTransports,
|
||||||
libp2p.DefaultMuxers,
|
libp2p.DefaultMuxers,
|
||||||
libp2p.DefaultSecurity,
|
libp2p.DefaultSecurity,
|
||||||
@@ -91,7 +99,11 @@ func (s *sP2P) CreateLibp2pHost(ctx context.Context, port int) (host.Host, error
|
|||||||
//libp2p.NATPortMapTimeout(30*time.Second),
|
//libp2p.NATPortMapTimeout(30*time.Second),
|
||||||
// 禁用Relay(如果需要中继,可保留)
|
// 禁用Relay(如果需要中继,可保留)
|
||||||
libp2p.DisableRelay(),
|
libp2p.DisableRelay(),
|
||||||
|
libp2p.NATPortMap(), // 自动尝试路由器端口映射(跨网络必备)
|
||||||
)
|
)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
g.Log().Debugf(ctx, "当前p2p的分享地址:%v", h.Addrs())
|
g.Log().Debugf(ctx, "当前p2p的分享地址:%v", h.Addrs())
|
||||||
|
|
||||||
return h, err
|
return h, err
|
||||||
@@ -186,7 +198,7 @@ func (s *sP2P) SendData(targetID string, data []byte) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 创建流
|
// 创建流
|
||||||
stream, err := s.client.host.NewStream(gctx.New(), peerID, ProtocolID)
|
stream, err := s.client.host.NewStream(gctx.New(), peerID, protocol.ID(ProtocolID))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,23 +4,109 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
//"github.com/ipfs/boxo/ipns"
|
||||||
dht "github.com/libp2p/go-libp2p-kad-dht"
|
dht "github.com/libp2p/go-libp2p-kad-dht"
|
||||||
"github.com/libp2p/go-libp2p/core/host"
|
"github.com/libp2p/go-libp2p/core/host"
|
||||||
|
"github.com/libp2p/go-libp2p/core/peer"
|
||||||
|
"github.com/libp2p/go-libp2p/core/peerstore"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 初始化无服务器DHT(作为节点加入DHT网络)
|
type DHTType struct {
|
||||||
func (s *sP2P) DHTStart(ctx context.Context, h host.Host) (*dht.IpfsDHT, error) {
|
KadDHT *dht.IpfsDHT
|
||||||
// 创建DHT实例,设置为“客户端+服务端模式”(既可以查找数据,也可以存储数据)
|
}
|
||||||
kdht, err := dht.New(ctx, h, dht.Mode(dht.ModeServer))
|
|
||||||
if err != nil {
|
// 初始化无服务器DHT(作为节点加入DHT网络)
|
||||||
return nil, fmt.Errorf("初始化DHT失败: %v", err)
|
func (s *sP2P) DHTStart(ctx context.Context, h host.Host) (err error) {
|
||||||
}
|
// 创建自定义 DHT 选项,配置验证器
|
||||||
|
dhtOpts := []dht.Option{
|
||||||
// 启动DHT并加入网络(会自动发现网络中的其他DHT节点)
|
//设置为“客户端+服务端模式”(既可以查找数据,也可以存储数据)
|
||||||
if err := kdht.Bootstrap(ctx); err != nil {
|
dht.Mode(dht.ModeServer),
|
||||||
return nil, fmt.Errorf("DHT加入网络失败: %v", err)
|
}
|
||||||
}
|
|
||||||
|
// 创建DHT实例,
|
||||||
fmt.Println("DHT初始化成功,节点ID:", h.ID().ShortString())
|
s.dht.KadDHT, err = dht.New(
|
||||||
return kdht, nil
|
ctx,
|
||||||
|
h,
|
||||||
|
dhtOpts...,
|
||||||
|
//dht.Mode(dht.ModeServer),
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
err = fmt.Errorf("初始化DHT失败: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 关键:直接替换 DHT 实例的验证器
|
||||||
|
// v0.35.1 版本中,IpfsDHT 结构体的 Validator 字段是公开可修改的
|
||||||
|
s.dht.KadDHT.Validator = &NoOpValidator{}
|
||||||
|
|
||||||
|
// 连接到DHT bootstrap节点(种子节点,帮助加入网络)
|
||||||
|
// 这里使用libp2p官方的公共bootstrap节点,生产环境可替换为自己的节点
|
||||||
|
bootstrapPeers := dht.DefaultBootstrapPeers
|
||||||
|
for _, addr := range bootstrapPeers {
|
||||||
|
peerInfo, _ := peer.AddrInfoFromP2pAddr(addr)
|
||||||
|
h.Peerstore().AddAddrs(peerInfo.ID, peerInfo.Addrs, peerstore.PermanentAddrTTL)
|
||||||
|
if err = h.Connect(ctx, *peerInfo); err != nil {
|
||||||
|
fmt.Printf("连接bootstrap节点 %s 失败: %v\n", peerInfo.ID, err)
|
||||||
|
} else {
|
||||||
|
fmt.Printf("已连接bootstrap节点: %s\n", peerInfo.ID)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 启动DHT
|
||||||
|
if err = s.dht.KadDHT.Bootstrap(ctx); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 存储数据到DHT(比如存储“目标节点ID-公网地址”的映射)
|
||||||
|
func (s *sP2P) StoreAddrToDHT(ctx context.Context, key string, addr string) (err error) {
|
||||||
|
// Key:目标节点ID(作为哈希键),Value:公网地址(需转成二进制)
|
||||||
|
//key = "/ipns/" + key
|
||||||
|
//key = s.generateStringDHTKey(key)
|
||||||
|
key = fmt.Sprintf("%s/%s", ProtocolID, key)
|
||||||
|
value := []byte(addr)
|
||||||
|
|
||||||
|
// 存储数据(DHT会自动找到负责存储该Key的节点,并同步数据)
|
||||||
|
if err = s.dht.KadDHT.PutValue(ctx, key, value); err != nil {
|
||||||
|
return fmt.Errorf("key=%s,存储地址到DHT失败: %v", key, err)
|
||||||
|
}
|
||||||
|
fmt.Printf("成功存储地址到DHT,Key=%s, Value=%s\n", key, addr)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从DHT查找数据(比如根据节点ID查找其公网地址)
|
||||||
|
func (s *sP2P) FindAddrFromDHT(ctx context.Context, key string) (string, error) {
|
||||||
|
// 查找数据(DHT会通过路由表层层跳转,找到负责存储该Key的节点并获取数据)
|
||||||
|
//key = s.generateStringDHTKey(key)
|
||||||
|
//key = "/ipns/" + key
|
||||||
|
key = fmt.Sprintf("%s/%s", ProtocolID, key)
|
||||||
|
value, err := s.dht.KadDHT.GetValue(ctx, key)
|
||||||
|
if err != nil {
|
||||||
|
return "", fmt.Errorf("从DHT查找地址失败: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
addr := string(value)
|
||||||
|
fmt.Printf("从DHT找到地址,Key=%s, Value=%s\n", key, addr)
|
||||||
|
return addr, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成符合DHT规范的字符串Key
|
||||||
|
func (s *sP2P) generateStringDHTKey(str string) string {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// 自定义验证器:不做任何校验,接受所有数据
|
||||||
|
type NoOpValidator struct{}
|
||||||
|
|
||||||
|
// Validate 总是返回成功,允许任何数据
|
||||||
|
func (v *NoOpValidator) Validate(key string, value []byte) error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Select 简单返回第一个数据(不做版本选择)
|
||||||
|
func (v *NoOpValidator) Select(key string, values [][]byte) (int, error) {
|
||||||
|
return 0, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,9 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/ayflying/p2p/internal/service"
|
"github.com/ayflying/p2p/internal/service"
|
||||||
|
"github.com/gogf/gf/v2/frame/g"
|
||||||
"github.com/gogf/gf/v2/os/gctx"
|
"github.com/gogf/gf/v2/os/gctx"
|
||||||
"github.com/libp2p/go-libp2p/core/protocol"
|
"github.com/libp2p/go-libp2p/core/crypto"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -19,8 +20,15 @@ var (
|
|||||||
|
|
||||||
// 常量定义
|
// 常量定义
|
||||||
const (
|
const (
|
||||||
ProtocolID protocol.ID = "/ay/1.0.0"
|
ProtocolID string = "/ay/1.0.0"
|
||||||
DefaultPort = 51888
|
DefaultPort = 51888
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ipAPIs = []string{
|
||||||
|
//"http://ay.cname.com:51888/p2p/ip",
|
||||||
|
"http://54.67.8.27:51888/p2p/ip",
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
type MsgType string
|
type MsgType string
|
||||||
@@ -44,8 +52,9 @@ type RegisterData struct {
|
|||||||
type sP2P struct {
|
type sP2P struct {
|
||||||
Clients map[string]*ClientConn // 客户端ID -> 连接
|
Clients map[string]*ClientConn // 客户端ID -> 连接
|
||||||
lock sync.RWMutex
|
lock sync.RWMutex
|
||||||
|
dht *DHTType
|
||||||
client *Client
|
privKey crypto.PrivKey
|
||||||
|
client *Client
|
||||||
}
|
}
|
||||||
|
|
||||||
// New 创建一个新的 P2P 服务实例
|
// New 创建一个新的 P2P 服务实例
|
||||||
@@ -53,6 +62,7 @@ func New() *sP2P {
|
|||||||
return &sP2P{
|
return &sP2P{
|
||||||
Clients: make(map[string]*ClientConn),
|
Clients: make(map[string]*ClientConn),
|
||||||
client: &Client{},
|
client: &Client{},
|
||||||
|
dht: &DHTType{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,14 +73,9 @@ func init() {
|
|||||||
// 获取公网IP并判断类型(ipv4/ipv6)
|
// 获取公网IP并判断类型(ipv4/ipv6)
|
||||||
func (s *sP2P) getPublicIPAndType() (ip string, ipType string, err error) {
|
func (s *sP2P) getPublicIPAndType() (ip string, ipType string, err error) {
|
||||||
// 公网IP查询接口(多个备用)
|
// 公网IP查询接口(多个备用)
|
||||||
apis := []string{
|
|
||||||
"https://api.ip.sb/ip",
|
|
||||||
"https://ip.3322.net",
|
|
||||||
"https://ifconfig.cn",
|
|
||||||
}
|
|
||||||
|
|
||||||
client := http.Client{Timeout: 5 * time.Second}
|
client := http.Client{Timeout: 5 * time.Second}
|
||||||
for _, api := range apis {
|
for _, api := range ipAPIs {
|
||||||
resp, err := client.Get(api)
|
resp, err := client.Get(api)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
@@ -106,30 +111,28 @@ func (s *sP2P) getPublicIPAndType() (ip string, ipType string, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 只获取IPv4公网IP(过滤IPv6结果)
|
// 只获取IPv4公网IP(过滤IPv6结果)
|
||||||
func (s *sP2P) getIPv4PublicIP() (string, error) {
|
func (s *sP2P) GetIPv4PublicIP() (string, error) {
|
||||||
// 优先使用只返回IPv4的API,避免IPv6干扰
|
// 优先使用只返回IPv4的API,避免IPv6干扰
|
||||||
ipv4OnlyAPIs := []string{
|
|
||||||
//"https://api.ip.sb/ip",
|
|
||||||
"https://ip.3322.net",
|
|
||||||
//"https://ifconfig.cn",
|
|
||||||
}
|
|
||||||
|
|
||||||
client := http.Client{Timeout: 5 * time.Second}
|
//client := http.Client{Timeout: 5 * time.Second}
|
||||||
for _, api := range ipv4OnlyAPIs {
|
for _, api := range ipAPIs {
|
||||||
resp, err := client.Get(api)
|
//resp, err := client.Get(api)
|
||||||
|
resp, err := g.Client().Timeout(5*time.Second).Get(ctx, api)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Close()
|
||||||
|
//defer resp.Body.Close()
|
||||||
|
|
||||||
// 读取响应
|
// 读取响应
|
||||||
buf := make([]byte, 128)
|
//buf := make([]byte, 128)
|
||||||
n, err := resp.Body.Read(buf)
|
//n, err := resp.Body.Read(buf)
|
||||||
if err != nil {
|
//if err != nil {
|
||||||
continue
|
// continue
|
||||||
}
|
//}
|
||||||
|
|
||||||
ip := strings.TrimSpace(string(buf[:n]))
|
//ip := strings.TrimSpace(string(buf[:n]))
|
||||||
|
ip := strings.TrimSpace(resp.ReadAllString())
|
||||||
if ip == "" {
|
if ip == "" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/gogf/gf/v2/net/ghttp"
|
"github.com/gogf/gf/v2/net/ghttp"
|
||||||
dht "github.com/libp2p/go-libp2p-kad-dht"
|
|
||||||
"github.com/libp2p/go-libp2p/core/host"
|
"github.com/libp2p/go-libp2p/core/host"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -23,8 +22,14 @@ type (
|
|||||||
// 发送数据到目标节点
|
// 发送数据到目标节点
|
||||||
SendData(targetID string, data []byte) error
|
SendData(targetID string, data []byte) error
|
||||||
// 初始化无服务器DHT(作为节点加入DHT网络)
|
// 初始化无服务器DHT(作为节点加入DHT网络)
|
||||||
DHTStart(ctx context.Context, h host.Host) (*dht.IpfsDHT, error)
|
DHTStart(ctx context.Context, h host.Host) (err error)
|
||||||
|
// 存储数据到DHT(比如存储“目标节点ID-公网地址”的映射)
|
||||||
|
StoreAddrToDHT(ctx context.Context, key string, addr string) (err error)
|
||||||
|
// 从DHT查找数据(比如根据节点ID查找其公网地址)
|
||||||
|
FindAddrFromDHT(ctx context.Context, key string) (string, error)
|
||||||
GatewayStart(ctx context.Context, group *ghttp.RouterGroup) (err error)
|
GatewayStart(ctx context.Context, group *ghttp.RouterGroup) (err error)
|
||||||
|
// 只获取IPv4公网IP(过滤IPv6结果)
|
||||||
|
GetIPv4PublicIP() (string, error)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user