feat: add webtransport as an optin transport
Jorropo committed
Sep 21, 2022 at 23:52 UTC
8baec10146c2029a7fdd29583e2164e42a330551
8 files changed
+85
-19
config/swarm.go
+2
@@ -104,6 +104,8 @@ type Transports struct {
104
TCP Flag `json:",omitempty"`
105
Websocket Flag `json:",omitempty"`
106
Relay Flag `json:",omitempty"`
107
+ // except WebTransport which is experimental and optin.
108
+ WebTransport Flag `json:",omitempty"`
109
}
110
111
// Security specifies the transports used to encrypt insecure network
core/node/libp2p/transport.go
+14
-4
@@ -6,9 +6,10 @@ import (
6
"github.com/ipfs/kubo/config"
7
"github.com/libp2p/go-libp2p"
8
"github.com/libp2p/go-libp2p/core/metrics"
9
- libp2pquic "github.com/libp2p/go-libp2p/p2p/transport/quic"
9
+ quic "github.com/libp2p/go-libp2p/p2p/transport/quic"
10
"github.com/libp2p/go-libp2p/p2p/transport/tcp"
11
"github.com/libp2p/go-libp2p/p2p/transport/websocket"
12
+ webtransport "github.com/libp2p/go-libp2p/p2p/transport/webtransport"
13
14
"go.uber.org/fx"
15
)
@@ -31,15 +32,24 @@ func Transports(tptConfig config.Transports) interface{} {
32
33
if tptConfig.Network.QUIC.WithDefault(!privateNetworkEnabled) {
34
if privateNetworkEnabled {
34
- // QUIC was force enabled while the private network was turned on.
35
- // Fail and tell the user.
35
return opts, fmt.Errorf(
36
"The QUIC transport does not support private networks. " +
37
"Please disable Swarm.Transports.Network.QUIC.",
38
)
39
}
40
// TODO(9290): Make WithMetrics configurable
42
- opts.Opts = append(opts.Opts, libp2p.Transport(libp2pquic.NewTransport, libp2pquic.WithMetrics()))
41
+ opts.Opts = append(opts.Opts, libp2p.Transport(quic.NewTransport, quic.WithMetrics()))
42
+ }
43
+
44
+ // TODO(9292): Remove the false && to allows it enabled by default
45
+ if tptConfig.Network.WebTransport.WithDefault(false && !privateNetworkEnabled) {
46
+ if privateNetworkEnabled {
47
+ return opts, fmt.Errorf(
48
+ "The WebTransport transport does not support private networks. " +
49
+ "Please disable Swarm.Transports.Network.WebTransport.",
50
+ )
51
+ }
52
+ opts.Opts = append(opts.Opts, libp2p.Transport(webtransport.New))
53
}
54
55
return opts, nil
docs/examples/kubo-as-a-library/go.mod
+4
-2
@@ -10,7 +10,7 @@ require (
10
github.com/ipfs/go-ipfs-files v0.1.1
11
github.com/ipfs/interface-go-ipfs-core v0.7.0
12
github.com/ipfs/kubo v0.14.0-rc1
13
- github.com/libp2p/go-libp2p v0.23.1
13
+ github.com/libp2p/go-libp2p v0.23.2
14
github.com/multiformats/go-multiaddr v0.7.0
15
)
16
@@ -137,10 +137,12 @@ require (
137
github.com/libp2p/go-reuseport v0.2.0 // indirect
138
github.com/libp2p/go-yamux/v4 v4.0.0 // indirect
139
github.com/libp2p/zeroconf/v2 v2.2.0 // indirect
140
- github.com/lucas-clemente/quic-go v0.29.0 // indirect
140
+ github.com/lucas-clemente/quic-go v0.29.1 // indirect
141
+ github.com/marten-seemann/qpack v0.2.1 // indirect
142
github.com/marten-seemann/qtls-go1-18 v0.1.2 // indirect
143
github.com/marten-seemann/qtls-go1-19 v0.1.0 // indirect
144
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
145
+ github.com/marten-seemann/webtransport-go v0.1.1 // indirect
146
github.com/mattn/go-isatty v0.0.16 // indirect
147
github.com/mattn/go-pointer v0.0.1 // indirect
148
github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
docs/examples/kubo-as-a-library/go.sum
+6
-6
@@ -790,8 +790,8 @@ github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76f
790
github.com/libp2p/go-libp2p v0.18.0/go.mod h1:+veaZ9z1SZQhmc5PW78jvnnxZ89Mgvmh4cggO11ETmw=
791
github.com/libp2p/go-libp2p v0.20.0/go.mod h1:g0C5Fu+aXXbCXkusCzLycuBowEih3ElmDqtbo61Em7k=
792
github.com/libp2p/go-libp2p v0.22.0/go.mod h1:UDolmweypBSjQb2f7xutPnwZ/fxioLbMBxSjRksxxU4=
793
-github.com/libp2p/go-libp2p v0.23.1 h1:hJCmemCCwDaENZfMW12nUYTxoF0W5dIyg+T5jizh2Bs=
794
-github.com/libp2p/go-libp2p v0.23.1/go.mod h1:7/xgogSbnOaGRlRbu4L0P1mVxC7xtLgk4suFhpag6cM=
793
+github.com/libp2p/go-libp2p v0.23.2 h1:yqyTeKQJyofWXxEv/eEVUvOrGdt/9x+0PIQ4N1kaxmE=
794
+github.com/libp2p/go-libp2p v0.23.2/go.mod h1:s9DEa5NLR4g+LZS+md5uGU4emjMWFiqkZr6hBTY8UxI=
795
github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo=
796
github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I=
797
github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw=
@@ -1131,8 +1131,8 @@ github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2
1131
github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T2U9ZlW1AaHOsMOg=
1132
github.com/lucas-clemente/quic-go v0.27.1/go.mod h1:AzgQoPda7N+3IqMMMkywBKggIFo2KT6pfnlrQ2QieeI=
1133
github.com/lucas-clemente/quic-go v0.28.1/go.mod h1:oGz5DKK41cJt5+773+BSO9BXDsREY4HLf7+0odGAPO0=
1134
-github.com/lucas-clemente/quic-go v0.29.0 h1:Vw0mGTfmWqGzh4jx/kMymsIkFK6rErFVmg+t9RLrnZE=
1135
-github.com/lucas-clemente/quic-go v0.29.0/go.mod h1:CTcNfLYJS2UuRNB+zcNlgvkjBhxX6Hm3WUxxAQx2mgE=
1134
+github.com/lucas-clemente/quic-go v0.29.1 h1:Z+WMJ++qMLhvpFkRZA+jl3BTxUjm415YBmWanXB8zP0=
1135
+github.com/lucas-clemente/quic-go v0.29.1/go.mod h1:CTcNfLYJS2UuRNB+zcNlgvkjBhxX6Hm3WUxxAQx2mgE=
1136
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
1137
github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
1138
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
@@ -1159,8 +1159,8 @@ github.com/marten-seemann/qtls-go1-19 v0.1.0 h1:rLFKD/9mp/uq1SYGYuVZhm83wkmU95pK
1159
github.com/marten-seemann/qtls-go1-19 v0.1.0/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI=
1160
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk=
1161
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU=
1162
-github.com/marten-seemann/webtransport-go v0.1.0 h1:tKknMOI+9fmMTPRJv3Fz7XpDq67Tg8Va8B1QEE+qaZw=
1163
-github.com/marten-seemann/webtransport-go v0.1.0/go.mod h1:CACJOFSohYRmnqHWHWZ2rpTr9MfA0pNqOSkpqb6J/+w=
1162
+github.com/marten-seemann/webtransport-go v0.1.1 h1:TnyKp3pEXcDooTaNn4s9dYpMJ7kMnTp7k5h+SgYP/mc=
1163
+github.com/marten-seemann/webtransport-go v0.1.1/go.mod h1:kBEh5+RSvOA4troP1vyOVBWK4MIMzDICXVrvCPrYcrM=
1164
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
1165
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
1166
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
go.mod
+4
-2
@@ -68,7 +68,7 @@ require (
68
github.com/jbenet/go-temp-err-catcher v0.1.0
69
github.com/jbenet/goprocess v0.1.4
70
github.com/libp2p/go-doh-resolver v0.4.0
71
- github.com/libp2p/go-libp2p v0.23.1
71
+ github.com/libp2p/go-libp2p v0.23.2
72
github.com/libp2p/go-libp2p-core v0.20.1 // indirect
73
github.com/libp2p/go-libp2p-http v0.2.1
74
github.com/libp2p/go-libp2p-kad-dht v0.18.0
@@ -188,10 +188,12 @@ require (
188
github.com/libp2p/go-reuseport v0.2.0 // indirect
189
github.com/libp2p/go-yamux/v4 v4.0.0 // indirect
190
github.com/libp2p/zeroconf/v2 v2.2.0 // indirect
191
- github.com/lucas-clemente/quic-go v0.29.0 // indirect
191
+ github.com/lucas-clemente/quic-go v0.29.1 // indirect
192
+ github.com/marten-seemann/qpack v0.2.1 // indirect
193
github.com/marten-seemann/qtls-go1-18 v0.1.2 // indirect
194
github.com/marten-seemann/qtls-go1-19 v0.1.0 // indirect
195
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
196
+ github.com/marten-seemann/webtransport-go v0.1.1 // indirect
197
github.com/mattn/go-colorable v0.1.4 // indirect
198
github.com/mattn/go-isatty v0.0.16 // indirect
199
github.com/mattn/go-pointer v0.0.1 // indirect
go.sum
+6
-5
@@ -783,8 +783,8 @@ github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2
783
github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM=
784
github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4=
785
github.com/libp2p/go-libp2p v0.18.0/go.mod h1:+veaZ9z1SZQhmc5PW78jvnnxZ89Mgvmh4cggO11ETmw=
786
-github.com/libp2p/go-libp2p v0.23.1 h1:hJCmemCCwDaENZfMW12nUYTxoF0W5dIyg+T5jizh2Bs=
787
-github.com/libp2p/go-libp2p v0.23.1/go.mod h1:7/xgogSbnOaGRlRbu4L0P1mVxC7xtLgk4suFhpag6cM=
786
+github.com/libp2p/go-libp2p v0.23.2 h1:yqyTeKQJyofWXxEv/eEVUvOrGdt/9x+0PIQ4N1kaxmE=
787
+github.com/libp2p/go-libp2p v0.23.2/go.mod h1:s9DEa5NLR4g+LZS+md5uGU4emjMWFiqkZr6hBTY8UxI=
788
github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo=
789
github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I=
790
github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw=
@@ -1116,8 +1116,8 @@ github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0
1116
github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0=
1117
github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0=
1118
github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T2U9ZlW1AaHOsMOg=
1119
-github.com/lucas-clemente/quic-go v0.29.0 h1:Vw0mGTfmWqGzh4jx/kMymsIkFK6rErFVmg+t9RLrnZE=
1120
-github.com/lucas-clemente/quic-go v0.29.0/go.mod h1:CTcNfLYJS2UuRNB+zcNlgvkjBhxX6Hm3WUxxAQx2mgE=
1119
+github.com/lucas-clemente/quic-go v0.29.1 h1:Z+WMJ++qMLhvpFkRZA+jl3BTxUjm415YBmWanXB8zP0=
1120
+github.com/lucas-clemente/quic-go v0.29.1/go.mod h1:CTcNfLYJS2UuRNB+zcNlgvkjBhxX6Hm3WUxxAQx2mgE=
1121
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
1122
github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
1123
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
@@ -1139,7 +1139,8 @@ github.com/marten-seemann/qtls-go1-19 v0.1.0 h1:rLFKD/9mp/uq1SYGYuVZhm83wkmU95pK
1139
github.com/marten-seemann/qtls-go1-19 v0.1.0/go.mod h1:5HTDWtVudo/WFsHKRNuOhWlbdjrfs5JHrYb0wIJqGpI=
1140
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk=
1141
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU=
1142
-github.com/marten-seemann/webtransport-go v0.1.0 h1:tKknMOI+9fmMTPRJv3Fz7XpDq67Tg8Va8B1QEE+qaZw=
1142
+github.com/marten-seemann/webtransport-go v0.1.1 h1:TnyKp3pEXcDooTaNn4s9dYpMJ7kMnTp7k5h+SgYP/mc=
1143
+github.com/marten-seemann/webtransport-go v0.1.1/go.mod h1:kBEh5+RSvOA4troP1vyOVBWK4MIMzDICXVrvCPrYcrM=
1144
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
1145
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
1146
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
test/sharness/t0191-webtransport-ping.sh
new
+49
@@ -0,0 +1,49 @@
1
+#!/usr/bin/env bash
2
+
3
+test_description="Test ping over WebTransport command"
4
+
5
+. lib/test-lib.sh
6
+
7
+test_init_ipfs
8
+
9
+# start iptb + wait for peering
10
+test_expect_success 'init iptb' '
11
+ iptb testbed create -type localipfs -count 2 -init
12
+'
13
+
14
+addr1='"[\"/ip4/127.0.0.1/udp/0/quic/webtransport\"]"'
15
+addr2='"[\"/ip4/127.0.0.1/udp/0/quic/webtransport\"]"'
16
+test_expect_success "add WebTransport swarm addresses" '
17
+ ipfsi 0 config --json Addresses.Swarm '$addr1' &&
18
+ ipfsi 0 config --json Swarm.Transports.Network.WebTransport true &&
19
+ ipfsi 1 config --json Addresses.Swarm '$addr2' &&
20
+ ipfsi 1 config --json Swarm.Transports.Network.WebTransport true
21
+'
22
+
23
+startup_cluster 2
24
+
25
+test_expect_success 'peer ids' '
26
+ PEERID_0=$(iptb attr get 0 id) &&
27
+ PEERID_1=$(iptb attr get 1 id)
28
+'
29
+
30
+test_expect_success "test ping other" '
31
+ ipfsi 0 ping -n2 -- "$PEERID_1" &&
32
+ ipfsi 1 ping -n2 -- "$PEERID_0"
33
+'
34
+
35
+test_expect_success "test ping self" '
36
+ test_must_fail ipfsi 0 ping -n2 -- "$PEERID_0" &&
37
+ test_must_fail ipfsi 1 ping -n2 -- "$PEERID_1"
38
+'
39
+
40
+test_expect_success "test ping 0" '
41
+ test_must_fail ipfsi 0 ping -n0 -- "$PEERID_1" &&
42
+ test_must_fail ipfsi 1 ping -n0 -- "$PEERID_0"
43
+'
44
+
45
+test_expect_success 'stop iptb' '
46
+ iptb stop
47
+'
48
+
49
+test_done