From 0bf056c5494ab083394d4bb513b2c5c95cbc166b Mon Sep 17 00:00:00 2001 From: StefanBratanov Date: Tue, 10 Jun 2025 10:56:11 +0200 Subject: [PATCH 01/26] Use netty core instead of incubator artifact --- examples/android-chatter/build.gradle | 6 ++--- libp2p/build.gradle.kts | 22 +++++++++---------- .../io/libp2p/transport/quic/QuicTransport.kt | 12 +++++----- versions.gradle | 4 ++-- 4 files changed, 23 insertions(+), 21 deletions(-) diff --git a/examples/android-chatter/build.gradle b/examples/android-chatter/build.gradle index f354ded48..c20962d26 100644 --- a/examples/android-chatter/build.gradle +++ b/examples/android-chatter/build.gradle @@ -26,9 +26,9 @@ android { exclude 'META-INF/INDEX.LIST' exclude 'META-INF/versions/9/OSGI-INF/MANIFEST.MF' exclude 'META-INF/license/LICENSE.aix-netbsd.txt' - exclude 'META-INF/native-image/io.netty.incubator/netty-incubator-codec-native-quic/jni-config.json' - exclude 'META-INF/native-image/io.netty.incubator/netty-incubator-codec-native-quic/reflect-config.json' - exclude 'META-INF/native-image/io.netty.incubator/netty-incubator-codec-native-quic/resource-config.json' + exclude 'META-INF/native-image/io.netty/netty-codec-native-quic/jni-config.json' + exclude 'META-INF/native-image/io.netty/netty-codec-native-quic/reflect-config.json' + exclude 'META-INF/native-image/io.netty/netty-codec-native-quic/resource-config.json' exclude 'META-INF/license/LICENSE.boringssl.txt' exclude 'META-INF/license/LICENSE.mvn-wrapper.txt' exclude 'META-INF/license/LICENSE.quiche.txt' diff --git a/libp2p/build.gradle.kts b/libp2p/build.gradle.kts index 44b9a74b2..66c6908b0 100644 --- a/libp2p/build.gradle.kts +++ b/libp2p/build.gradle.kts @@ -15,18 +15,18 @@ dependencies { implementation("io.netty:netty-handler") implementation("io.netty:netty-codec-http") implementation("io.netty:netty-transport-classes-epoll") - implementation("io.netty.incubator:netty-incubator-codec-native-quic") + implementation("io.netty:netty-codec-native-quic") // OS-specific bindings - implementation("io.netty.incubator:netty-incubator-codec-native-quic::linux-x86_64") - implementation("io.netty.incubator:netty-incubator-codec-native-quic::linux-aarch_64") - implementation("io.netty.incubator:netty-incubator-codec-native-quic::osx-x86_64") - implementation("io.netty.incubator:netty-incubator-codec-native-quic::osx-aarch_64") - implementation("io.netty.incubator:netty-incubator-codec-native-quic::windows-x86_64") - implementation("io.netty:netty-tcnative-boringssl-static:2.0.70.Final:linux-x86_64") - implementation("io.netty:netty-tcnative-boringssl-static:2.0.70.Final:linux-aarch_64") - implementation("io.netty:netty-tcnative-boringssl-static:2.0.70.Final:osx-x86_64") - implementation("io.netty:netty-tcnative-boringssl-static:2.0.70.Final:osx-aarch_64") - implementation("io.netty:netty-tcnative-boringssl-static:2.0.70.Final:windows-x86_64") + implementation("io.netty:netty-codec-native-quic::linux-x86_64") + implementation("io.netty:netty-codec-native-quic::linux-aarch_64") + implementation("io.netty:netty-codec-native-quic::osx-x86_64") + implementation("io.netty:netty-codec-native-quic::osx-aarch_64") + implementation("io.netty:netty-codec-native-quic::windows-x86_64") + implementation("io.netty:netty-tcnative-boringssl-static:2.0.72.Final:linux-x86_64") + implementation("io.netty:netty-tcnative-boringssl-static:2.0.72.Final:linux-aarch_64") + implementation("io.netty:netty-tcnative-boringssl-static:2.0.72.Final:osx-x86_64") + implementation("io.netty:netty-tcnative-boringssl-static:2.0.72.Final:osx-aarch_64") + implementation("io.netty:netty-tcnative-boringssl-static:2.0.72.Final:windows-x86_64") api("com.google.protobuf:protobuf-java") diff --git a/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt b/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt index 63d448de3..62dcff0dd 100644 --- a/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt +++ b/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt @@ -19,7 +19,10 @@ import io.libp2p.etc.STREAM import io.libp2p.etc.types.* import io.libp2p.etc.util.MultiaddrUtils import io.libp2p.etc.util.netty.nettyInitializer -import io.libp2p.security.tls.* +import io.libp2p.security.tls.Libp2pTrustManager +import io.libp2p.security.tls.buildCert +import io.libp2p.security.tls.getJavaKey +import io.libp2p.security.tls.getPublicKeyFromCert import io.libp2p.transport.implementation.ConnectionOverNetty import io.libp2p.transport.implementation.NettyTransport import io.libp2p.transport.implementation.StreamOverNetty @@ -31,10 +34,10 @@ import io.netty.channel.epoll.Epoll import io.netty.channel.epoll.EpollDatagramChannel import io.netty.channel.nio.NioEventLoopGroup import io.netty.channel.socket.nio.NioDatagramChannel +import io.netty.handler.codec.quic.* import io.netty.handler.ssl.ClientAuth -import io.netty.incubator.codec.quic.* -import org.slf4j.LoggerFactory -import java.net.* +import java.net.InetSocketAddress +import java.net.SocketAddress import java.time.Duration import java.util.* import java.util.concurrent.CompletableFuture @@ -208,7 +211,6 @@ class QuicTransport( .option(ChannelOption.AUTO_READ, true) .option(ChannelOption.ALLOCATOR, allocator) .remoteAddress(fromMultiaddr(addr)) -// .handler(connHandler) .streamHandler(object : ChannelInboundHandlerAdapter() { override fun handlerAdded(ctx: ChannelHandlerContext?) { val connection = ctx!!.channel().parent().attr(CONNECTION).get() as Connection diff --git a/versions.gradle b/versions.gradle index 8e89ed8b6..d12aebd3f 100644 --- a/versions.gradle +++ b/versions.gradle @@ -31,13 +31,14 @@ dependencyManagement { entry 'protobuf-java' entry 'protoc' } - dependencySet(group: "io.netty", version: "4.1.118.Final") { + dependencySet(group: "io.netty", version: "4.2.2.Final") { entry 'netty-common' entry 'netty-handler' entry 'netty-transport' entry 'netty-buffer' entry 'netty-codec-http' entry 'netty-transport-classes-epoll' + entry 'netty-codec-native-quic' } dependency "com.github.multiformats:java-multibase:v1.1.1" dependency "tech.pegasys:noise-java:22.1.0" @@ -46,6 +47,5 @@ dependencyManagement { entry 'bcpkix-jdk18on' entry 'bctls-jdk18on' } - dependency "io.netty.incubator:netty-incubator-codec-native-quic:0.0.71.Final" } } \ No newline at end of file From 936c42206f93c7c1441441dae05fa0a0f75bde9a Mon Sep 17 00:00:00 2001 From: StefanBratanov Date: Tue, 10 Jun 2025 11:19:29 +0200 Subject: [PATCH 02/26] add netty-codec-protobuf --- libp2p/build.gradle.kts | 1 + versions.gradle | 1 + 2 files changed, 2 insertions(+) diff --git a/libp2p/build.gradle.kts b/libp2p/build.gradle.kts index 66c6908b0..43c902af1 100644 --- a/libp2p/build.gradle.kts +++ b/libp2p/build.gradle.kts @@ -14,6 +14,7 @@ dependencies { api("io.netty:netty-transport") implementation("io.netty:netty-handler") implementation("io.netty:netty-codec-http") + implementation("io.netty:netty-codec-protobuf") implementation("io.netty:netty-transport-classes-epoll") implementation("io.netty:netty-codec-native-quic") // OS-specific bindings diff --git a/versions.gradle b/versions.gradle index d12aebd3f..4c23210db 100644 --- a/versions.gradle +++ b/versions.gradle @@ -37,6 +37,7 @@ dependencyManagement { entry 'netty-transport' entry 'netty-buffer' entry 'netty-codec-http' + entry 'netty-codec-protobuf' entry 'netty-transport-classes-epoll' entry 'netty-codec-native-quic' } From a310a0e86329bfaf1fa2f1fa42954e6518191b2c Mon Sep 17 00:00:00 2001 From: StefanBratanov Date: Tue, 10 Jun 2025 11:37:55 +0200 Subject: [PATCH 03/26] fix build --- .../implementation/PlainNettyTransport.kt | 11 ++++++++--- .../io/libp2p/transport/quic/QuicTransport.kt | 16 +++++++++++----- .../transport/ws/WebSocketClientInitializer.kt | 4 ++-- .../transport/ws/WebSocketServerInitializer.kt | 4 ++-- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/libp2p/src/main/kotlin/io/libp2p/transport/implementation/PlainNettyTransport.kt b/libp2p/src/main/kotlin/io/libp2p/transport/implementation/PlainNettyTransport.kt index 96931e4ec..8becc1c61 100644 --- a/libp2p/src/main/kotlin/io/libp2p/transport/implementation/PlainNettyTransport.kt +++ b/libp2p/src/main/kotlin/io/libp2p/transport/implementation/PlainNettyTransport.kt @@ -19,7 +19,8 @@ import io.netty.bootstrap.ServerBootstrap import io.netty.channel.Channel import io.netty.channel.ChannelHandler import io.netty.channel.ChannelOption -import io.netty.channel.nio.NioEventLoopGroup +import io.netty.channel.MultiThreadIoEventLoopGroup +import io.netty.channel.nio.NioIoHandler import io.netty.channel.socket.nio.NioServerSocketChannel import io.netty.channel.socket.nio.NioSocketChannel import java.net.InetSocketAddress @@ -39,8 +40,12 @@ abstract class PlainNettyTransport( private val listeners = mutableMapOf() private val channels = mutableListOf() - private var workerGroup by lazyVar { NioEventLoopGroup() } - private var bossGroup by lazyVar { NioEventLoopGroup(1) } + private var workerGroup by lazyVar { + MultiThreadIoEventLoopGroup(NioIoHandler.newFactory()) + } + private var bossGroup by lazyVar { + MultiThreadIoEventLoopGroup(1, NioIoHandler.newFactory()) + } private var client by lazyVar { Bootstrap().apply { diff --git a/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt b/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt index 62dcff0dd..d1dd3b2a2 100644 --- a/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt +++ b/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt @@ -32,10 +32,11 @@ import io.netty.buffer.PooledByteBufAllocator import io.netty.channel.* import io.netty.channel.epoll.Epoll import io.netty.channel.epoll.EpollDatagramChannel -import io.netty.channel.nio.NioEventLoopGroup +import io.netty.channel.nio.NioIoHandler import io.netty.channel.socket.nio.NioDatagramChannel import io.netty.handler.codec.quic.* import io.netty.handler.ssl.ClientAuth +import org.slf4j.LoggerFactory import java.net.InetSocketAddress import java.net.SocketAddress import java.time.Duration @@ -48,7 +49,8 @@ class QuicTransport( private val certAlgorithm: String, private val protocols: List> ) : NettyTransport { - private val log = LoggerFactory.getLogger(QuicTransport::class.java) + + private val logger = LoggerFactory.getLogger(QuicTransport::class.java) private var closed = false var connectTimeout = Duration.ofSeconds(15) @@ -56,8 +58,12 @@ class QuicTransport( private val listeners = mutableMapOf() private val channels = mutableListOf() - private var workerGroup by lazyVar { NioEventLoopGroup() } - private var bossGroup by lazyVar { NioEventLoopGroup(1) } + private var workerGroup by lazyVar { + MultiThreadIoEventLoopGroup(NioIoHandler.newFactory()) + } + private var bossGroup by lazyVar { + MultiThreadIoEventLoopGroup(1, NioIoHandler.newFactory()) + } private var allocator by lazyVar { PooledByteBufAllocator(true) } private var multistreamProtocol: MultistreamProtocol = MultistreamProtocolV1 private var incomingMultistreamProtocol: MultistreamProtocol by lazyVar { multistreamProtocol } @@ -167,7 +173,7 @@ class QuicTransport( listeners -= addr } } - log.info("Quic server listening on {}", addr) + logger.info("Quic server listening on $addr") res.complete(null) } } diff --git a/libp2p/src/main/kotlin/io/libp2p/transport/ws/WebSocketClientInitializer.kt b/libp2p/src/main/kotlin/io/libp2p/transport/ws/WebSocketClientInitializer.kt index 1fde9d5c4..d38db14ae 100644 --- a/libp2p/src/main/kotlin/io/libp2p/transport/ws/WebSocketClientInitializer.kt +++ b/libp2p/src/main/kotlin/io/libp2p/transport/ws/WebSocketClientInitializer.kt @@ -12,12 +12,12 @@ internal class WebSocketClientInitializer( private val url: String ) : ChannelInitializer() { - public override fun initChannel(ch: SocketChannel) { + override fun initChannel(ch: SocketChannel) { val pipeline = ch.pipeline() pipeline.addLast(HttpClientCodec()) pipeline.addLast(HttpObjectAggregator(65536)) - pipeline.addLast(WebSocketClientCompressionHandler.INSTANCE) + pipeline.addLast(WebSocketClientCompressionHandler(0)) pipeline.addLast( WebSocketClientHandshake( connectionBuilder, diff --git a/libp2p/src/main/kotlin/io/libp2p/transport/ws/WebSocketServerInitializer.kt b/libp2p/src/main/kotlin/io/libp2p/transport/ws/WebSocketServerInitializer.kt index f1a195ef4..0665aad98 100644 --- a/libp2p/src/main/kotlin/io/libp2p/transport/ws/WebSocketServerInitializer.kt +++ b/libp2p/src/main/kotlin/io/libp2p/transport/ws/WebSocketServerInitializer.kt @@ -12,12 +12,12 @@ internal class WebSocketServerInitializer( private val connectionBuilder: ChannelHandler ) : ChannelInitializer() { - public override fun initChannel(ch: SocketChannel) { + override fun initChannel(ch: SocketChannel) { val pipeline = ch.pipeline() pipeline.addLast(HttpServerCodec()) pipeline.addLast(HttpObjectAggregator(65536)) - pipeline.addLast(WebSocketServerCompressionHandler()) + pipeline.addLast(WebSocketServerCompressionHandler(0)) pipeline.addLast(WebSocketServerProtocolHandler("/", null, true)) pipeline.addLast(WebSocketServerHandshakeListener(connectionBuilder)) } // initChannel From b4a57556a75667cf2de23193c1f924bac9d64876 Mon Sep 17 00:00:00 2001 From: StefanBratanov Date: Tue, 10 Jun 2025 11:46:47 +0200 Subject: [PATCH 04/26] fix deprecation --- libp2p/src/testFixtures/kotlin/io/libp2p/tools/TCPProxy.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libp2p/src/testFixtures/kotlin/io/libp2p/tools/TCPProxy.kt b/libp2p/src/testFixtures/kotlin/io/libp2p/tools/TCPProxy.kt index eb77980d7..2304b2c35 100644 --- a/libp2p/src/testFixtures/kotlin/io/libp2p/tools/TCPProxy.kt +++ b/libp2p/src/testFixtures/kotlin/io/libp2p/tools/TCPProxy.kt @@ -7,7 +7,9 @@ import io.netty.channel.ChannelFuture import io.netty.channel.ChannelHandlerContext import io.netty.channel.ChannelInboundHandlerAdapter import io.netty.channel.ChannelOption +import io.netty.channel.MultiThreadIoEventLoopGroup import io.netty.channel.nio.NioEventLoopGroup +import io.netty.channel.nio.NioIoHandler import io.netty.channel.socket.nio.NioServerSocketChannel import io.netty.channel.socket.nio.NioSocketChannel import io.netty.handler.logging.LogLevel @@ -19,7 +21,7 @@ class TCPProxy { fun start(listenPort: Int, dialHost: String, dialPort: Int): ChannelFuture { val future = ServerBootstrap().apply { - group(NioEventLoopGroup()) + group(MultiThreadIoEventLoopGroup(NioIoHandler.newFactory())) channel(NioServerSocketChannel::class.java) childHandler( nettyInitializer { @@ -29,7 +31,7 @@ class TCPProxy { serverCtx.channel().pipeline().addFirst(LoggingHandler("server", LogLevel.INFO)) Bootstrap().apply { - group(NioEventLoopGroup()) + group(MultiThreadIoEventLoopGroup(NioIoHandler.newFactory())) channel(NioSocketChannel::class.java) option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5 * 1000) handler(object : ChannelInboundHandlerAdapter() { From a3b61856c30bea7994af881a87a441e0cb2952f7 Mon Sep 17 00:00:00 2001 From: StefanBratanov Date: Tue, 10 Jun 2025 12:12:43 +0200 Subject: [PATCH 05/26] fix deprecation --- libp2p/src/testFixtures/kotlin/io/libp2p/tools/TCPProxy.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/libp2p/src/testFixtures/kotlin/io/libp2p/tools/TCPProxy.kt b/libp2p/src/testFixtures/kotlin/io/libp2p/tools/TCPProxy.kt index 2304b2c35..6cb5c2d7b 100644 --- a/libp2p/src/testFixtures/kotlin/io/libp2p/tools/TCPProxy.kt +++ b/libp2p/src/testFixtures/kotlin/io/libp2p/tools/TCPProxy.kt @@ -8,7 +8,6 @@ import io.netty.channel.ChannelHandlerContext import io.netty.channel.ChannelInboundHandlerAdapter import io.netty.channel.ChannelOption import io.netty.channel.MultiThreadIoEventLoopGroup -import io.netty.channel.nio.NioEventLoopGroup import io.netty.channel.nio.NioIoHandler import io.netty.channel.socket.nio.NioServerSocketChannel import io.netty.channel.socket.nio.NioSocketChannel @@ -40,7 +39,6 @@ class TCPProxy { } override fun channelActive(ctx: ChannelHandlerContext) { -// serverCtx.channel().pipeline().addFirst(LoggingHandler("client", LogLevel.INFO)) client.complete(ctx) } From 421a7362797292af153471abc1aaac3011d4e1a2 Mon Sep 17 00:00:00 2001 From: StefanBratanov Date: Wed, 27 Aug 2025 09:55:49 +0100 Subject: [PATCH 06/26] changes --- .../io/libp2p/transport/quic/QuicTransport.kt | 13 +++++++------ versions.gradle | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt b/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt index d1dd3b2a2..3d49ebd3b 100644 --- a/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt +++ b/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt @@ -23,6 +23,7 @@ import io.libp2p.security.tls.Libp2pTrustManager import io.libp2p.security.tls.buildCert import io.libp2p.security.tls.getJavaKey import io.libp2p.security.tls.getPublicKeyFromCert +import io.libp2p.security.tls.verifyAndExtractPeerId import io.libp2p.transport.implementation.ConnectionOverNetty import io.libp2p.transport.implementation.NettyTransport import io.libp2p.transport.implementation.StreamOverNetty @@ -173,7 +174,7 @@ class QuicTransport( listeners -= addr } } - logger.info("Quic server listening on $addr") + logger.info("Quic server listening on {}", addr) res.complete(null) } } @@ -293,7 +294,7 @@ class QuicTransport( val javaPrivateKey = getJavaKey(connectionKeys.first) val isClient = expectedRemotePeerId != null val cert = buildCert(localKey, connectionKeys.first) - log.info("Building {} keys and cert for peerid {}", certAlgorithm, PeerId.fromPubKey(localKey.publicKey())) + logger.info("Building {} keys and cert for peer {}", certAlgorithm, PeerId.fromPubKey(localKey.publicKey())) return ( if (isClient) { QuicSslContextBuilder.forClient().keyManager(javaPrivateKey, null, cert) @@ -334,7 +335,7 @@ class QuicTransport( val remotePeerId = verifyAndExtractPeerId(arrayOf(remoteCert)) val remotePublicKey = getPublicKeyFromCert(arrayOf(remoteCert)) - log.info("Handshake completed with remote peer id: {}", remotePeerId) + logger.info("Handshake completed with remote peer id: {}", remotePeerId) connection.setSecureSession( SecureChannel.Session( @@ -362,7 +363,7 @@ class QuicTransport( @Deprecated("Deprecated in Java") override fun exceptionCaught(ctx: ChannelHandlerContext, cause: Throwable) { - log.error("An error during handshake", cause) + logger.error("An error during handshake", cause) ctx.close() } } @@ -382,8 +383,8 @@ class QuicTransport( val connection: ConnectionOverNetty ) : StreamMuxer.Session { override fun createStream(protocols: List>): StreamPromise { - var multistreamProtocol: MultistreamProtocol = MultistreamProtocolV1 - var streamMultistreamProtocol: MultistreamProtocol by lazyVar { multistreamProtocol } + val multistreamProtocol: MultistreamProtocol = MultistreamProtocolV1 + val streamMultistreamProtocol: MultistreamProtocol by lazyVar { multistreamProtocol } val multi = streamMultistreamProtocol.createMultistream(protocols) val controller = CompletableFuture() diff --git a/versions.gradle b/versions.gradle index 4c23210db..54cf910bb 100644 --- a/versions.gradle +++ b/versions.gradle @@ -31,7 +31,7 @@ dependencyManagement { entry 'protobuf-java' entry 'protoc' } - dependencySet(group: "io.netty", version: "4.2.2.Final") { + dependencySet(group: "io.netty", version: "4.2.4.Final") { entry 'netty-common' entry 'netty-handler' entry 'netty-transport' From 69fe2791409c19eb38c0b8b715b558737a8887b9 Mon Sep 17 00:00:00 2001 From: StefanBratanov Date: Wed, 27 Aug 2025 12:02:40 +0100 Subject: [PATCH 07/26] nits --- libp2p/build.gradle.kts | 10 +++++----- versions.gradle | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/libp2p/build.gradle.kts b/libp2p/build.gradle.kts index 43c902af1..26fa61f56 100644 --- a/libp2p/build.gradle.kts +++ b/libp2p/build.gradle.kts @@ -23,11 +23,11 @@ dependencies { implementation("io.netty:netty-codec-native-quic::osx-x86_64") implementation("io.netty:netty-codec-native-quic::osx-aarch_64") implementation("io.netty:netty-codec-native-quic::windows-x86_64") - implementation("io.netty:netty-tcnative-boringssl-static:2.0.72.Final:linux-x86_64") - implementation("io.netty:netty-tcnative-boringssl-static:2.0.72.Final:linux-aarch_64") - implementation("io.netty:netty-tcnative-boringssl-static:2.0.72.Final:osx-x86_64") - implementation("io.netty:netty-tcnative-boringssl-static:2.0.72.Final:osx-aarch_64") - implementation("io.netty:netty-tcnative-boringssl-static:2.0.72.Final:windows-x86_64") + implementation("io.netty:netty-tcnative-boringssl-static::linux-x86_64") + implementation("io.netty:netty-tcnative-boringssl-static::linux-aarch_64") + implementation("io.netty:netty-tcnative-boringssl-static::osx-x86_64") + implementation("io.netty:netty-tcnative-boringssl-static::osx-aarch_64") + implementation("io.netty:netty-tcnative-boringssl-static::windows-x86_64") api("com.google.protobuf:protobuf-java") diff --git a/versions.gradle b/versions.gradle index 54cf910bb..d6f80d536 100644 --- a/versions.gradle +++ b/versions.gradle @@ -38,9 +38,10 @@ dependencyManagement { entry 'netty-buffer' entry 'netty-codec-http' entry 'netty-codec-protobuf' - entry 'netty-transport-classes-epoll' entry 'netty-codec-native-quic' + entry 'netty-transport-classes-epoll' } + dependency "io.netty:netty-tcnative-boringssl-static:2.0.72.Final" dependency "com.github.multiformats:java-multibase:v1.1.1" dependency "tech.pegasys:noise-java:22.1.0" dependencySet(group: "org.bouncycastle", version: "1.78.1") { From a8f5bf5a1225143687b71b87e26040d9526c0938 Mon Sep 17 00:00:00 2001 From: StefanBratanov Date: Wed, 27 Aug 2025 16:35:23 +0100 Subject: [PATCH 08/26] fix build --- .../src/main/kotlin/io/libp2p/etc/types/NettyExt.kt | 13 +++++++++++++ .../transport/implementation/PlainNettyTransport.kt | 9 +++++---- .../io/libp2p/transport/quic/QuicTransport.kt | 9 +++++---- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/libp2p/src/main/kotlin/io/libp2p/etc/types/NettyExt.kt b/libp2p/src/main/kotlin/io/libp2p/etc/types/NettyExt.kt index e4c9c1d49..f2cf5fb61 100644 --- a/libp2p/src/main/kotlin/io/libp2p/etc/types/NettyExt.kt +++ b/libp2p/src/main/kotlin/io/libp2p/etc/types/NettyExt.kt @@ -4,6 +4,7 @@ import io.netty.channel.Channel import io.netty.channel.ChannelFuture import io.netty.channel.ChannelHandler import io.netty.channel.ChannelPipeline +import io.netty.util.concurrent.Future import java.util.concurrent.CompletableFuture fun ChannelFuture.toVoidCompletableFuture(): CompletableFuture = toCompletableFuture().thenApply { } @@ -20,6 +21,18 @@ fun ChannelFuture.toCompletableFuture(): CompletableFuture { return ret } +fun Future<*>.toVoidCompletableFuture(): CompletableFuture { + val ret = CompletableFuture() + this.addListener { f -> + if (f.isSuccess) { + ret.complete(Unit) + } else { + ret.completeExceptionally(f.cause()) + } + } + return ret +} + fun ChannelPipeline.replace(oldHandler: ChannelHandler, newHandlers: List>) { replace(oldHandler, newHandlers[0].first, newHandlers[0].second) for (i in 1 until newHandlers.size) { diff --git a/libp2p/src/main/kotlin/io/libp2p/transport/implementation/PlainNettyTransport.kt b/libp2p/src/main/kotlin/io/libp2p/transport/implementation/PlainNettyTransport.kt index 8becc1c61..8d135fa9e 100644 --- a/libp2p/src/main/kotlin/io/libp2p/transport/implementation/PlainNettyTransport.kt +++ b/libp2p/src/main/kotlin/io/libp2p/transport/implementation/PlainNettyTransport.kt @@ -90,10 +90,11 @@ abstract class PlainNettyTransport( val everythingThatNeedsToClose = unbindsCompleted.union(channelsClosed) val allClosed = CompletableFuture.allOf(*everythingThatNeedsToClose.toTypedArray()) - return allClosed.thenApply { - workerGroup.shutdownGracefully() - bossGroup.shutdownGracefully() - Unit + return allClosed.thenCompose { + CompletableFuture.allOf( + workerGroup.shutdownGracefully().toVoidCompletableFuture(), + bossGroup.shutdownGracefully().toVoidCompletableFuture() + ).thenApply { } } } // close diff --git a/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt b/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt index 3d49ebd3b..0b269ba1a 100644 --- a/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt +++ b/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt @@ -138,10 +138,11 @@ class QuicTransport( val everythingThatNeedsToClose = unbindsCompleted.union(channelsClosed) val allClosed = CompletableFuture.allOf(*everythingThatNeedsToClose.toTypedArray()) - return allClosed.thenApply { - workerGroup.shutdownGracefully() - bossGroup.shutdownGracefully() - Unit + return allClosed.thenCompose { + CompletableFuture.allOf( + workerGroup.shutdownGracefully().toVoidCompletableFuture(), + bossGroup.shutdownGracefully().toVoidCompletableFuture() + ).thenApply { } } } From 232c0617bd2aeb17dc7526e1f5f76b5c0108941b Mon Sep 17 00:00:00 2001 From: StefanBratanov Date: Wed, 27 Aug 2025 16:56:26 +0100 Subject: [PATCH 09/26] fix Android --- examples/android-chatter/build.gradle | 1 + .../src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/android-chatter/build.gradle b/examples/android-chatter/build.gradle index c20962d26..7d022384c 100644 --- a/examples/android-chatter/build.gradle +++ b/examples/android-chatter/build.gradle @@ -33,6 +33,7 @@ android { exclude 'META-INF/license/LICENSE.mvn-wrapper.txt' exclude 'META-INF/license/LICENSE.quiche.txt' exclude 'META-INF/license/LICENSE.tomcat-native.txt' + exclude 'META-INF/license/LICENSE.jbzip2.txt' } kotlinOptions { jvmTarget = "11" diff --git a/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt b/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt index 0b269ba1a..27ff9e135 100644 --- a/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt +++ b/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt @@ -295,7 +295,7 @@ class QuicTransport( val javaPrivateKey = getJavaKey(connectionKeys.first) val isClient = expectedRemotePeerId != null val cert = buildCert(localKey, connectionKeys.first) - logger.info("Building {} keys and cert for peer {}", certAlgorithm, PeerId.fromPubKey(localKey.publicKey())) + logger.info("Building {} keys and cert for peer id {}", certAlgorithm, PeerId.fromPubKey(localKey.publicKey())) return ( if (isClient) { QuicSslContextBuilder.forClient().keyManager(javaPrivateKey, null, cert) From 9d5990581fefc928c6c9396c92fd2b96bf114131 Mon Sep 17 00:00:00 2001 From: StefanBratanov Date: Wed, 27 Aug 2025 17:00:49 +0100 Subject: [PATCH 10/26] simpler --- libp2p/src/main/kotlin/io/libp2p/etc/types/NettyExt.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libp2p/src/main/kotlin/io/libp2p/etc/types/NettyExt.kt b/libp2p/src/main/kotlin/io/libp2p/etc/types/NettyExt.kt index f2cf5fb61..bf46b2157 100644 --- a/libp2p/src/main/kotlin/io/libp2p/etc/types/NettyExt.kt +++ b/libp2p/src/main/kotlin/io/libp2p/etc/types/NettyExt.kt @@ -23,11 +23,11 @@ fun ChannelFuture.toCompletableFuture(): CompletableFuture { fun Future<*>.toVoidCompletableFuture(): CompletableFuture { val ret = CompletableFuture() - this.addListener { f -> - if (f.isSuccess) { + this.addListener { + if (it.isSuccess) { ret.complete(Unit) } else { - ret.completeExceptionally(f.cause()) + ret.completeExceptionally(it.cause()) } } return ret From 4919aabffe688791b19bc61177af2c32a6111f9f Mon Sep 17 00:00:00 2001 From: StefanBratanov Date: Wed, 27 Aug 2025 17:18:11 +0100 Subject: [PATCH 11/26] one more --- examples/android-chatter/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/android-chatter/build.gradle b/examples/android-chatter/build.gradle index 7d022384c..b5c7d1e77 100644 --- a/examples/android-chatter/build.gradle +++ b/examples/android-chatter/build.gradle @@ -34,6 +34,7 @@ android { exclude 'META-INF/license/LICENSE.quiche.txt' exclude 'META-INF/license/LICENSE.tomcat-native.txt' exclude 'META-INF/license/LICENSE.jbzip2.txt' + exclude 'META-INF/license/LICENSE.webbit.txt' } kotlinOptions { jvmTarget = "11" From 29b03e22c0ca5d187b7da3ab24877e0556ea7dff Mon Sep 17 00:00:00 2001 From: StefanBratanov Date: Wed, 27 Aug 2025 17:36:07 +0100 Subject: [PATCH 12/26] another exclude --- examples/android-chatter/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/android-chatter/build.gradle b/examples/android-chatter/build.gradle index b5c7d1e77..c963f8854 100644 --- a/examples/android-chatter/build.gradle +++ b/examples/android-chatter/build.gradle @@ -35,6 +35,7 @@ android { exclude 'META-INF/license/LICENSE.tomcat-native.txt' exclude 'META-INF/license/LICENSE.jbzip2.txt' exclude 'META-INF/license/LICENSE.webbit.txt' + exclude 'META-INF/license/LICENSE.snappy.txt' } kotlinOptions { jvmTarget = "11" From 007b1ba554284688c0d08153d7f7bb0b5a6fda89 Mon Sep 17 00:00:00 2001 From: Stefan Bratanov Date: Wed, 27 Aug 2025 18:17:49 +0100 Subject: [PATCH 13/26] Another exclude --- examples/android-chatter/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/android-chatter/build.gradle b/examples/android-chatter/build.gradle index c963f8854..99b01a20a 100644 --- a/examples/android-chatter/build.gradle +++ b/examples/android-chatter/build.gradle @@ -36,6 +36,7 @@ android { exclude 'META-INF/license/LICENSE.jbzip2.txt' exclude 'META-INF/license/LICENSE.webbit.txt' exclude 'META-INF/license/LICENSE.snappy.txt' + exclude 'META-INF/license/LICENSE.protobuf.txt' } kotlinOptions { jvmTarget = "11" From 62de902a021caa04312b8cbc7cd86218b54771d1 Mon Sep 17 00:00:00 2001 From: Stefan Bratanov Date: Thu, 28 Aug 2025 07:30:15 +0100 Subject: [PATCH 14/26] One more exclude --- examples/android-chatter/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/android-chatter/build.gradle b/examples/android-chatter/build.gradle index 99b01a20a..69dce8647 100644 --- a/examples/android-chatter/build.gradle +++ b/examples/android-chatter/build.gradle @@ -37,6 +37,7 @@ android { exclude 'META-INF/license/LICENSE.webbit.txt' exclude 'META-INF/license/LICENSE.snappy.txt' exclude 'META-INF/license/LICENSE.protobuf.txt' + exclude 'META-INF/license/LICENSE.nghttp2-hpack.txt' } kotlinOptions { jvmTarget = "11" From 8b5266fcfbe4e0afa303b8dce6f33bffa04fd882 Mon Sep 17 00:00:00 2001 From: Stefan Bratanov Date: Thu, 28 Aug 2025 07:50:17 +0100 Subject: [PATCH 15/26] Exclude --- examples/android-chatter/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/android-chatter/build.gradle b/examples/android-chatter/build.gradle index 69dce8647..56dc551a5 100644 --- a/examples/android-chatter/build.gradle +++ b/examples/android-chatter/build.gradle @@ -38,6 +38,7 @@ android { exclude 'META-INF/license/LICENSE.snappy.txt' exclude 'META-INF/license/LICENSE.protobuf.txt' exclude 'META-INF/license/LICENSE.nghttp2-hpack.txt' + exclude 'META-INF/license/LICENSE.base64.txt' } kotlinOptions { jvmTarget = "11" From c061f9b76f3d17df62bd0376dbc9161ff9eb5ca2 Mon Sep 17 00:00:00 2001 From: Stefan Bratanov Date: Thu, 28 Aug 2025 08:30:47 +0100 Subject: [PATCH 16/26] exclude --- examples/android-chatter/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/android-chatter/build.gradle b/examples/android-chatter/build.gradle index 56dc551a5..db90359a9 100644 --- a/examples/android-chatter/build.gradle +++ b/examples/android-chatter/build.gradle @@ -39,6 +39,7 @@ android { exclude 'META-INF/license/LICENSE.protobuf.txt' exclude 'META-INF/license/LICENSE.nghttp2-hpack.txt' exclude 'META-INF/license/LICENSE.base64.txt' + exclude 'META-INF/license/LICENSE.commons-lang.txt' } kotlinOptions { jvmTarget = "11" From 3a27d502a2419e4c9e41b1626426dbd836ecd31d Mon Sep 17 00:00:00 2001 From: Stefan Bratanov Date: Thu, 28 Aug 2025 08:46:15 +0100 Subject: [PATCH 17/26] exclude --- examples/android-chatter/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/android-chatter/build.gradle b/examples/android-chatter/build.gradle index db90359a9..c2d8e45b6 100644 --- a/examples/android-chatter/build.gradle +++ b/examples/android-chatter/build.gradle @@ -40,6 +40,7 @@ android { exclude 'META-INF/license/LICENSE.nghttp2-hpack.txt' exclude 'META-INF/license/LICENSE.base64.txt' exclude 'META-INF/license/LICENSE.commons-lang.txt' + exclude 'META-INF/license/LICENSE.jzlib.txt } kotlinOptions { jvmTarget = "11" From ea31d74050c8f554fad6a8dc2287ec19b962cf0c Mon Sep 17 00:00:00 2001 From: Stefan Bratanov Date: Thu, 28 Aug 2025 08:57:59 +0100 Subject: [PATCH 18/26] fix build --- examples/android-chatter/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/android-chatter/build.gradle b/examples/android-chatter/build.gradle index c2d8e45b6..8c54e1a32 100644 --- a/examples/android-chatter/build.gradle +++ b/examples/android-chatter/build.gradle @@ -40,7 +40,7 @@ android { exclude 'META-INF/license/LICENSE.nghttp2-hpack.txt' exclude 'META-INF/license/LICENSE.base64.txt' exclude 'META-INF/license/LICENSE.commons-lang.txt' - exclude 'META-INF/license/LICENSE.jzlib.txt + exclude 'META-INF/license/LICENSE.jzlib.txt' } kotlinOptions { jvmTarget = "11" From edbf2a721bab3e1900c3a929d45706a4c352850d Mon Sep 17 00:00:00 2001 From: Stefan Bratanov Date: Thu, 28 Aug 2025 09:14:40 +0100 Subject: [PATCH 19/26] exclude --- examples/android-chatter/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/android-chatter/build.gradle b/examples/android-chatter/build.gradle index 8c54e1a32..11cebba5d 100644 --- a/examples/android-chatter/build.gradle +++ b/examples/android-chatter/build.gradle @@ -41,6 +41,7 @@ android { exclude 'META-INF/license/LICENSE.base64.txt' exclude 'META-INF/license/LICENSE.commons-lang.txt' exclude 'META-INF/license/LICENSE.jzlib.txt' + exclude 'META-INF/license/LICENSE.jctools.txt' } kotlinOptions { jvmTarget = "11" From 40ff205cddfc91a65b46e5f5810616745330567d Mon Sep 17 00:00:00 2001 From: Stefan Bratanov Date: Thu, 28 Aug 2025 09:31:19 +0100 Subject: [PATCH 20/26] exclude --- examples/android-chatter/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/android-chatter/build.gradle b/examples/android-chatter/build.gradle index 11cebba5d..5da29bb1b 100644 --- a/examples/android-chatter/build.gradle +++ b/examples/android-chatter/build.gradle @@ -42,6 +42,7 @@ android { exclude 'META-INF/license/LICENSE.commons-lang.txt' exclude 'META-INF/license/LICENSE.jzlib.txt' exclude 'META-INF/license/LICENSE.jctools.txt' + exclude 'META-INF/license/LICENSE.log4j.txt' } kotlinOptions { jvmTarget = "11" From 4b0fd88e398c892c245a33d5e95e45adcb85f137 Mon Sep 17 00:00:00 2001 From: StefanBratanov Date: Thu, 28 Aug 2025 10:37:28 +0100 Subject: [PATCH 21/26] try a different approach + remove bossGroup --- examples/android-chatter/build.gradle | 33 +++++++------------ .../io/libp2p/transport/quic/QuicTransport.kt | 26 ++++++--------- 2 files changed, 22 insertions(+), 37 deletions(-) diff --git a/examples/android-chatter/build.gradle b/examples/android-chatter/build.gradle index 5da29bb1b..5385a91f4 100644 --- a/examples/android-chatter/build.gradle +++ b/examples/android-chatter/build.gradle @@ -22,27 +22,18 @@ android { } } packagingOptions { - exclude 'META-INF/io.netty.versions.properties' - exclude 'META-INF/INDEX.LIST' - exclude 'META-INF/versions/9/OSGI-INF/MANIFEST.MF' - exclude 'META-INF/license/LICENSE.aix-netbsd.txt' - exclude 'META-INF/native-image/io.netty/netty-codec-native-quic/jni-config.json' - exclude 'META-INF/native-image/io.netty/netty-codec-native-quic/reflect-config.json' - exclude 'META-INF/native-image/io.netty/netty-codec-native-quic/resource-config.json' - exclude 'META-INF/license/LICENSE.boringssl.txt' - exclude 'META-INF/license/LICENSE.mvn-wrapper.txt' - exclude 'META-INF/license/LICENSE.quiche.txt' - exclude 'META-INF/license/LICENSE.tomcat-native.txt' - exclude 'META-INF/license/LICENSE.jbzip2.txt' - exclude 'META-INF/license/LICENSE.webbit.txt' - exclude 'META-INF/license/LICENSE.snappy.txt' - exclude 'META-INF/license/LICENSE.protobuf.txt' - exclude 'META-INF/license/LICENSE.nghttp2-hpack.txt' - exclude 'META-INF/license/LICENSE.base64.txt' - exclude 'META-INF/license/LICENSE.commons-lang.txt' - exclude 'META-INF/license/LICENSE.jzlib.txt' - exclude 'META-INF/license/LICENSE.jctools.txt' - exclude 'META-INF/license/LICENSE.log4j.txt' + resources { + pickFirsts += setOf("META-INF/license/LICENSE") + excludes += setOf( + "META-INF/io.netty.versions.properties", + "META-INF/INDEX.LIST", + "META-INF/versions/9/OSGI-INF/MANIFEST.MF", + "META-INF/native-image/io.netty/netty-codec-native-quic/jni-config.json", + "META-INF/native-image/io.netty/netty-codec-native-quic/reflect-config.json", + "META-INF/native-image/io.netty/netty-codec-native-quic/resource-config.json" + ) + } + } kotlinOptions { jvmTarget = "11" diff --git a/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt b/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt index 27ff9e135..6860775ac 100644 --- a/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt +++ b/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt @@ -62,9 +62,6 @@ class QuicTransport( private var workerGroup by lazyVar { MultiThreadIoEventLoopGroup(NioIoHandler.newFactory()) } - private var bossGroup by lazyVar { - MultiThreadIoEventLoopGroup(1, NioIoHandler.newFactory()) - } private var allocator by lazyVar { PooledByteBufAllocator(true) } private var multistreamProtocol: MultistreamProtocol = MultistreamProtocolV1 private var incomingMultistreamProtocol: MultistreamProtocol by lazyVar { multistreamProtocol } @@ -139,10 +136,7 @@ class QuicTransport( val allClosed = CompletableFuture.allOf(*everythingThatNeedsToClose.toTypedArray()) return allClosed.thenCompose { - CompletableFuture.allOf( - workerGroup.shutdownGracefully().toVoidCompletableFuture(), - bossGroup.shutdownGracefully().toVoidCompletableFuture() - ).thenApply { } + workerGroup.shutdownGracefully().toVoidCompletableFuture() } } @@ -286,9 +280,9 @@ class QuicTransport( override fun handles(addr: Multiaddr) = handlesHost(addr) && - addr.has(UDP) && - addr.has(QUICV1) && - !addr.has(WS) + addr.has(UDP) && + addr.has(QUICV1) && + !addr.has(WS) fun quicSslContext(expectedRemotePeerId: PeerId?, trustManager: Libp2pTrustManager): QuicSslContext { val connectionKeys = if (certAlgorithm.equals("ECDSA")) generateEcdsaKeyPair() else generateEd25519KeyPair() @@ -297,12 +291,12 @@ class QuicTransport( val cert = buildCert(localKey, connectionKeys.first) logger.info("Building {} keys and cert for peer id {}", certAlgorithm, PeerId.fromPubKey(localKey.publicKey())) return ( - if (isClient) { - QuicSslContextBuilder.forClient().keyManager(javaPrivateKey, null, cert) - } else { - QuicSslContextBuilder.forServer(javaPrivateKey, null, cert).clientAuth(ClientAuth.REQUIRE) - } - ) + if (isClient) { + QuicSslContextBuilder.forClient().keyManager(javaPrivateKey, null, cert) + } else { + QuicSslContextBuilder.forServer(javaPrivateKey, null, cert).clientAuth(ClientAuth.REQUIRE) + } + ) .trustManager(trustManager) .applicationProtocols("libp2p") .build() From 87d9dd67c8602a68da2139c4b0cafec2bd21be8a Mon Sep 17 00:00:00 2001 From: StefanBratanov Date: Thu, 28 Aug 2025 10:43:29 +0100 Subject: [PATCH 22/26] fix --- examples/android-chatter/build.gradle | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/examples/android-chatter/build.gradle b/examples/android-chatter/build.gradle index 5385a91f4..1200a2aec 100644 --- a/examples/android-chatter/build.gradle +++ b/examples/android-chatter/build.gradle @@ -23,15 +23,13 @@ android { } packagingOptions { resources { - pickFirsts += setOf("META-INF/license/LICENSE") - excludes += setOf( - "META-INF/io.netty.versions.properties", - "META-INF/INDEX.LIST", - "META-INF/versions/9/OSGI-INF/MANIFEST.MF", - "META-INF/native-image/io.netty/netty-codec-native-quic/jni-config.json", - "META-INF/native-image/io.netty/netty-codec-native-quic/reflect-config.json", - "META-INF/native-image/io.netty/netty-codec-native-quic/resource-config.json" - ) + pickFirsts.add("META-INF/license/LICENSE") + excludes.add("META-INF/io.netty.versions.properties") + excludes.add("META-INF/INDEX.LIST") + excludes.add("META-INF/versions/9/OSGI-INF/MANIFEST.MF") + excludes.add("META-INF/native-image/io.netty/netty-codec-native-quic/jni-config.json") + excludes.add("META-INF/native-image/io.netty/netty-codec-native-quic/reflect-config.json") + excludes.add("META-INF/native-image/io.netty/netty-codec-native-quic/resource-config.json") } } From 5cb03cb56f77c826dbdc037053bf299054b282b3 Mon Sep 17 00:00:00 2001 From: StefanBratanov Date: Thu, 28 Aug 2025 11:22:02 +0100 Subject: [PATCH 23/26] spotless --- .../io/libp2p/transport/quic/QuicTransport.kt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt b/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt index 6860775ac..1b9c24a2e 100644 --- a/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt +++ b/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt @@ -280,9 +280,9 @@ class QuicTransport( override fun handles(addr: Multiaddr) = handlesHost(addr) && - addr.has(UDP) && - addr.has(QUICV1) && - !addr.has(WS) + addr.has(UDP) && + addr.has(QUICV1) && + !addr.has(WS) fun quicSslContext(expectedRemotePeerId: PeerId?, trustManager: Libp2pTrustManager): QuicSslContext { val connectionKeys = if (certAlgorithm.equals("ECDSA")) generateEcdsaKeyPair() else generateEd25519KeyPair() @@ -291,12 +291,12 @@ class QuicTransport( val cert = buildCert(localKey, connectionKeys.first) logger.info("Building {} keys and cert for peer id {}", certAlgorithm, PeerId.fromPubKey(localKey.publicKey())) return ( - if (isClient) { - QuicSslContextBuilder.forClient().keyManager(javaPrivateKey, null, cert) - } else { - QuicSslContextBuilder.forServer(javaPrivateKey, null, cert).clientAuth(ClientAuth.REQUIRE) - } - ) + if (isClient) { + QuicSslContextBuilder.forClient().keyManager(javaPrivateKey, null, cert) + } else { + QuicSslContextBuilder.forServer(javaPrivateKey, null, cert).clientAuth(ClientAuth.REQUIRE) + } + ) .trustManager(trustManager) .applicationProtocols("libp2p") .build() From ea36b3b66bc8a04928f086d428c7a9d349860d94 Mon Sep 17 00:00:00 2001 From: StefanBratanov Date: Thu, 28 Aug 2025 11:46:31 +0100 Subject: [PATCH 24/26] fix Android build hopefully --- examples/android-chatter/build.gradle | 2 +- .../java/io/libp2p/interop/InteropTestAgent.kt | 3 ++- .../io/libp2p/transport/quic/QuicTransport.kt | 2 +- .../libp2p/transport/quic/QuicKuboTestJava.java | 2 +- .../transport/quic/QuicServerTestJava.java | 16 ++++++++-------- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/examples/android-chatter/build.gradle b/examples/android-chatter/build.gradle index 1200a2aec..93e796a69 100644 --- a/examples/android-chatter/build.gradle +++ b/examples/android-chatter/build.gradle @@ -23,13 +23,13 @@ android { } packagingOptions { resources { - pickFirsts.add("META-INF/license/LICENSE") excludes.add("META-INF/io.netty.versions.properties") excludes.add("META-INF/INDEX.LIST") excludes.add("META-INF/versions/9/OSGI-INF/MANIFEST.MF") excludes.add("META-INF/native-image/io.netty/netty-codec-native-quic/jni-config.json") excludes.add("META-INF/native-image/io.netty/netty-codec-native-quic/reflect-config.json") excludes.add("META-INF/native-image/io.netty/netty-codec-native-quic/resource-config.json") + excludes.add("META-INF/license/LICENSE*") } } diff --git a/interop-test-client/src/main/java/io/libp2p/interop/InteropTestAgent.kt b/interop-test-client/src/main/java/io/libp2p/interop/InteropTestAgent.kt index 45ec9a9d5..831e3b94c 100644 --- a/interop-test-client/src/main/java/io/libp2p/interop/InteropTestAgent.kt +++ b/interop-test-client/src/main/java/io/libp2p/interop/InteropTestAgent.kt @@ -19,6 +19,7 @@ import io.libp2p.protocol.Identify import io.libp2p.protocol.Ping import io.libp2p.security.noise.NoiseXXSecureChannel import io.libp2p.security.tls.TlsSecureChannel.Companion.ECDSA +import io.libp2p.transport.quic.QuicTransport import io.libp2p.transport.tcp.TcpTransport import redis.clients.jedis.Jedis import java.util.concurrent.CompletableFuture @@ -72,7 +73,7 @@ class InteropTestAgent(val params: InteropTestParams) { ): Host = hostJ(Builder.Defaults.None, fn = { it.identity.factory = { privateKey } if (params.transport == "quic-v1") { - // TODO add quic support + it.secureTransports.add(QuicTransport::ECDSA) } else { it.transports.add(::TcpTransport) } diff --git a/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt b/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt index 1b9c24a2e..c4f1a39d0 100644 --- a/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt +++ b/libp2p/src/main/kotlin/io/libp2p/transport/quic/QuicTransport.kt @@ -85,7 +85,7 @@ class QuicTransport( } @JvmStatic - fun Ecdsa(k: PrivKey, p: List>): QuicTransport { + fun ECDSA(k: PrivKey, p: List>): QuicTransport { return QuicTransport(k, "ECDSA", p) } diff --git a/libp2p/src/test/java/io/libp2p/transport/quic/QuicKuboTestJava.java b/libp2p/src/test/java/io/libp2p/transport/quic/QuicKuboTestJava.java index bb408db73..c597eb8ba 100644 --- a/libp2p/src/test/java/io/libp2p/transport/quic/QuicKuboTestJava.java +++ b/libp2p/src/test/java/io/libp2p/transport/quic/QuicKuboTestJava.java @@ -21,7 +21,7 @@ void pingKubo() throws Exception { PeerId peerId = PeerId.fromBase58(getKuboPeerId()); Host clientHost = - new HostBuilder().keyType(KeyType.ED25519).secureTransport(QuicTransport::Ecdsa).build(); + new HostBuilder().keyType(KeyType.ED25519).secureTransport(QuicTransport::ECDSA).build(); CompletableFuture clientStarted = clientHost.start(); clientStarted.get(5, TimeUnit.SECONDS); diff --git a/libp2p/src/test/java/io/libp2p/transport/quic/QuicServerTestJava.java b/libp2p/src/test/java/io/libp2p/transport/quic/QuicServerTestJava.java index 0fb95b198..37f72be99 100644 --- a/libp2p/src/test/java/io/libp2p/transport/quic/QuicServerTestJava.java +++ b/libp2p/src/test/java/io/libp2p/transport/quic/QuicServerTestJava.java @@ -32,7 +32,7 @@ void pingJava() throws Exception { Host clientHost = new HostBuilder() .keyType(KeyType.ED25519) - .secureTransport(QuicTransport::Ecdsa) + .secureTransport(QuicTransport::ECDSA) .transport(TcpTransport::new) .secureChannel(TlsSecureChannel::ECDSA) .muxer(StreamMuxerProtocol::getYamux) @@ -41,7 +41,7 @@ void pingJava() throws Exception { Host serverHost = new HostBuilder() .keyType(KeyType.ED25519) - .secureTransport(QuicTransport::Ecdsa) + .secureTransport(QuicTransport::ECDSA) .transport(TcpTransport::new) .secureChannel(TlsSecureChannel::ECDSA) .muxer(StreamMuxerProtocol::getYamux) @@ -105,7 +105,7 @@ void tlsAndQuicInSameHostPing() throws Exception { Host clientHost = new HostBuilder() .keyType(KeyType.ED25519) - .secureTransport(QuicTransport::Ecdsa) + .secureTransport(QuicTransport::ECDSA) .transport(TcpTransport::new) .secureChannel(TlsSecureChannel::ECDSA) .secureChannel(NoiseXXSecureChannel::new) @@ -115,7 +115,7 @@ void tlsAndQuicInSameHostPing() throws Exception { Host serverHost = new HostBuilder() .keyType(KeyType.ED25519) - .secureTransport(QuicTransport::Ecdsa) + .secureTransport(QuicTransport::ECDSA) .transport(TcpTransport::new) .secureChannel(TlsSecureChannel::ECDSA) .secureChannel(NoiseXXSecureChannel::new) @@ -201,7 +201,7 @@ void largeBlob() throws Exception { Host clientHost = new HostBuilder() .keyType(KeyType.ED25519) - .secureTransport(QuicTransport::Ecdsa) + .secureTransport(QuicTransport::ECDSA) .builderModifier( b -> b.getDebug().getMuxFramesHandler().addCompactLogger(LogLevel.ERROR, "client")) .build(); @@ -209,7 +209,7 @@ void largeBlob() throws Exception { Host serverHost = new HostBuilder() .keyType(KeyType.ED25519) - .secureTransport(QuicTransport::Ecdsa) + .secureTransport(QuicTransport::ECDSA) .protocol(new Blob(blobSize)) .listen(localListenAddress) .builderModifier( @@ -262,12 +262,12 @@ void startHostAddPing() throws Exception { String localListenAddress = "/ip4/127.0.0.1/udp/" + getPort() + "/quic-v1"; Host clientHost = - new HostBuilder().keyType(KeyType.ED25519).secureTransport(QuicTransport::Ecdsa).build(); + new HostBuilder().keyType(KeyType.ED25519).secureTransport(QuicTransport::ECDSA).build(); Host serverHost = new HostBuilder() .keyType(KeyType.ED25519) - .secureTransport(QuicTransport::Ecdsa) + .secureTransport(QuicTransport::ECDSA) .listen(localListenAddress) .build(); From d57536b37c95bccb9ca8788656514644ec8f64a4 Mon Sep 17 00:00:00 2001 From: StefanBratanov Date: Thu, 28 Aug 2025 12:09:11 +0100 Subject: [PATCH 25/26] more exclusion --- examples/android-chatter/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/android-chatter/build.gradle b/examples/android-chatter/build.gradle index 93e796a69..c82e207f3 100644 --- a/examples/android-chatter/build.gradle +++ b/examples/android-chatter/build.gradle @@ -29,7 +29,7 @@ android { excludes.add("META-INF/native-image/io.netty/netty-codec-native-quic/jni-config.json") excludes.add("META-INF/native-image/io.netty/netty-codec-native-quic/reflect-config.json") excludes.add("META-INF/native-image/io.netty/netty-codec-native-quic/resource-config.json") - excludes.add("META-INF/license/LICENSE*") + excludes.add("META-INF/license/*") } } From f2a823b0c1f85000d81e8841088342f8240b8967 Mon Sep 17 00:00:00 2001 From: StefanBratanov Date: Thu, 28 Aug 2025 12:29:11 +0100 Subject: [PATCH 26/26] another try --- examples/android-chatter/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/android-chatter/build.gradle b/examples/android-chatter/build.gradle index c82e207f3..fa37a35bd 100644 --- a/examples/android-chatter/build.gradle +++ b/examples/android-chatter/build.gradle @@ -29,6 +29,7 @@ android { excludes.add("META-INF/native-image/io.netty/netty-codec-native-quic/jni-config.json") excludes.add("META-INF/native-image/io.netty/netty-codec-native-quic/reflect-config.json") excludes.add("META-INF/native-image/io.netty/netty-codec-native-quic/resource-config.json") + excludes.add("META-INF/native-image/io.netty/netty-codec-native-quic/native-image.properties") excludes.add("META-INF/license/*") }