PR changes
diff --git a/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/NodeDiscoveryService.kt b/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/NodeDiscoveryService.kt
index bc8920b..9a0fcc0 100644
--- a/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/NodeDiscoveryService.kt
+++ b/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/NodeDiscoveryService.kt
@@ -16,6 +16,21 @@
*/
package org.apache.tuweni.devp2p.v5
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.async
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
+import org.apache.tuweni.bytes.Bytes
+import org.apache.tuweni.crypto.SECP256K1
+import org.apache.tuweni.devp2p.EthereumNodeRecord
+import org.apache.tuweni.devp2p.v5.internal.DefaultUdpConnector
+import org.apache.tuweni.devp2p.v5.packet.RandomMessage
+import org.apache.tuweni.io.Base64URLSafe
+import java.net.InetSocketAddress
+import java.time.Instant
+import kotlin.coroutines.CoroutineContext
+
/**
* Service executes network discovery, according to discv5 specification
* (https://github.com/ethereum/devp2p/blob/master/discv5/discv5.md)
@@ -31,4 +46,54 @@
* Executes service shut down
*/
fun terminate(await: Boolean = false)
+
+}
+
+internal class DefaultNodeDiscoveryService(
+ private val keyPair: SECP256K1.KeyPair,
+ private val localPort: Int,
+ private val bindAddress: InetSocketAddress = InetSocketAddress(localPort),
+ private val bootstrapENRList: List<String> = emptyList(),
+ private val enrSeq: Long = Instant.now().toEpochMilli(),
+ private val selfENR: Bytes = EthereumNodeRecord.toRLP(
+ keyPair,
+ enrSeq,
+ emptyMap(),
+ bindAddress.address,
+ null,
+ bindAddress.port
+ ),
+ private val connector: UdpConnector = DefaultUdpConnector(bindAddress, keyPair, selfENR),
+ override val coroutineContext: CoroutineContext = Dispatchers.Default
+) : NodeDiscoveryService, CoroutineScope {
+
+ override fun start() {
+ connector.start()
+ launch { bootstrap() }
+ }
+
+ override fun terminate(await: Boolean) {
+ runBlocking {
+ val job = async { connector.terminate() }
+ if (await) {
+ job.await()
+ }
+ }
+ }
+
+ private fun bootstrap() {
+ bootstrapENRList.forEach {
+ if (it.startsWith("enr:")) {
+ val encodedEnr = it.substringAfter("enr:")
+ val rlpENR = Base64URLSafe.decode(encodedEnr)
+ val enr = EthereumNodeRecord.fromRLP(rlpENR)
+
+ val randomMessage = RandomMessage()
+ val address = InetSocketAddress(enr.ip(), enr.udp())
+
+ connector.addPendingNodeId(address, rlpENR)
+ connector.send(address, randomMessage, rlpENR)
+ }
+ }
+ }
}
diff --git a/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/encrypt/AES128GCM.kt b/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/encrypt/AES128GCM.kt
index 48c359d..bb3eaee 100644
--- a/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/encrypt/AES128GCM.kt
+++ b/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/encrypt/AES128GCM.kt
@@ -61,11 +61,11 @@
cipher.updateAAD(data)
- val encriptedText = Bytes.wrap(cipher.doFinal(message))
+ val encryptedText = Bytes.wrap(cipher.doFinal(message))
val wrappedNonce = Bytes.wrap(nonce)
val nonceSize = Bytes.ofUnsignedInt(nonce.size.toLong())
- return Bytes.wrap(nonceSize, wrappedNonce, encriptedText).toArray()
+ return Bytes.wrap(nonceSize, wrappedNonce, encryptedText).toArray()
}
/**
@@ -92,8 +92,8 @@
val nonceLength = buffer.int
val nonce = ByteArray(nonceLength)
buffer.get(nonce)
- val encriptedText = ByteArray(buffer.remaining())
- buffer.get(encriptedText)
+ val encryptedText = ByteArray(buffer.remaining())
+ buffer.get(encryptedText)
val keySpec = SecretKeySpec(key, ALGO_NAME)
@@ -103,6 +103,6 @@
cipher.updateAAD(data)
- return cipher.doFinal(encriptedText)
+ return cipher.doFinal(encryptedText)
}
}
diff --git a/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/internal/DefaultNodeDiscoveryService.kt b/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/internal/DefaultNodeDiscoveryService.kt
deleted file mode 100644
index 8575452..0000000
--- a/devp2p/src/main/kotlin/org/apache/tuweni/devp2p/v5/internal/DefaultNodeDiscoveryService.kt
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tuweni.devp2p.v5.internal
-
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.async
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.runBlocking
-import org.apache.tuweni.bytes.Bytes
-import org.apache.tuweni.crypto.SECP256K1
-import org.apache.tuweni.devp2p.EthereumNodeRecord
-import org.apache.tuweni.devp2p.v5.NodeDiscoveryService
-import org.apache.tuweni.devp2p.v5.UdpConnector
-import org.apache.tuweni.devp2p.v5.packet.RandomMessage
-import org.apache.tuweni.io.Base64URLSafe
-import java.net.InetSocketAddress
-import java.time.Instant
-import kotlin.coroutines.CoroutineContext
-
-class DefaultNodeDiscoveryService(
- private val keyPair: SECP256K1.KeyPair,
- private val localPort: Int,
- private val bindAddress: InetSocketAddress = InetSocketAddress(localPort),
- private val bootstrapENRList: List<String> = emptyList(),
- private val enrSeq: Long = Instant.now().toEpochMilli(),
- private val selfENR: Bytes = EthereumNodeRecord.toRLP(
- keyPair,
- enrSeq,
- emptyMap(),
- bindAddress.address,
- null,
- bindAddress.port
- ),
- private val connector: UdpConnector = DefaultUdpConnector(bindAddress, keyPair, selfENR),
- override val coroutineContext: CoroutineContext = Dispatchers.Default
-) : NodeDiscoveryService, CoroutineScope {
-
- override fun start() {
- connector.start()
- launch { bootstrap() }
- }
-
- override fun terminate(await: Boolean) {
- runBlocking {
- val job = async { connector.terminate() }
- if (await) {
- job.await()
- }
- }
- }
-
- private fun bootstrap() {
- bootstrapENRList.forEach {
- if (it.startsWith("enr:")) {
- val encodedEnr = it.substringAfter("enr:")
- val rlpENR = Base64URLSafe.decode(encodedEnr)
- val enr = EthereumNodeRecord.fromRLP(rlpENR)
-
- val randomMessage = RandomMessage()
- val address = InetSocketAddress(enr.ip(), enr.udp())
-
- connector.addPendingNodeId(address, rlpENR)
- connector.send(address, randomMessage, rlpENR)
- }
- }
- }
-}
diff --git a/devp2p/src/test/kotlin/org/apache/tuweni/devp2p/v5/internal/DefaultNodeDiscoveryServiceTest.kt b/devp2p/src/test/kotlin/org/apache/tuweni/devp2p/v5/DefaultNodeDiscoveryServiceTest.kt
similarity index 89%
rename from devp2p/src/test/kotlin/org/apache/tuweni/devp2p/v5/internal/DefaultNodeDiscoveryServiceTest.kt
rename to devp2p/src/test/kotlin/org/apache/tuweni/devp2p/v5/DefaultNodeDiscoveryServiceTest.kt
index 895db0b..a9f64e5 100644
--- a/devp2p/src/test/kotlin/org/apache/tuweni/devp2p/v5/internal/DefaultNodeDiscoveryServiceTest.kt
+++ b/devp2p/src/test/kotlin/org/apache/tuweni/devp2p/v5/DefaultNodeDiscoveryServiceTest.kt
@@ -14,14 +14,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package org.apache.tuweni.devp2p.v5.internal
+package org.apache.tuweni.devp2p.v5
import kotlinx.coroutines.runBlocking
import org.apache.tuweni.bytes.Bytes
import org.apache.tuweni.crypto.SECP256K1
import org.apache.tuweni.devp2p.EthereumNodeRecord
-import org.apache.tuweni.devp2p.v5.NodeDiscoveryService
-import org.apache.tuweni.devp2p.v5.UdpConnector
+import org.apache.tuweni.devp2p.v5.internal.DefaultUdpConnector
import org.apache.tuweni.devp2p.v5.packet.RandomMessage
import org.apache.tuweni.devp2p.v5.packet.UdpMessage
import org.apache.tuweni.io.Base64URLSafe
@@ -41,7 +40,6 @@
private val recipientEnr: Bytes =
EthereumNodeRecord.toRLP(recipientKeyPair, ip = InetAddress.getLocalHost(), udp = 9091)
private val encodedEnr: String = "enr:${Base64URLSafe.encode(recipientEnr)}"
-
private val keyPair: SECP256K1.KeyPair = SECP256K1.KeyPair.random()
private val localPort: Int = 9090
private val bindAddress: InetSocketAddress = InetSocketAddress(localPort)
@@ -55,10 +53,19 @@
null,
bindAddress.port
)
- private val connector: UdpConnector = DefaultUdpConnector(bindAddress, keyPair, selfENR)
+ private val connector: UdpConnector =
+ DefaultUdpConnector(bindAddress, keyPair, selfENR)
private val nodeDiscoveryService: NodeDiscoveryService =
- DefaultNodeDiscoveryService(keyPair, localPort, bindAddress, bootstrapENRList, enrSeq, selfENR, connector)
+ DefaultNodeDiscoveryService(
+ keyPair,
+ localPort,
+ bindAddress,
+ bootstrapENRList,
+ enrSeq,
+ selfENR,
+ connector
+ )
@Test
fun startInitializesConnectorAndBootstraps() {
diff --git a/devp2p/src/test/kotlin/org/apache/tuweni/devp2p/v5/HandshakeIntegrationTest.kt b/devp2p/src/test/kotlin/org/apache/tuweni/devp2p/v5/HandshakeIntegrationTest.kt
index ebbad34..46b0d47 100644
--- a/devp2p/src/test/kotlin/org/apache/tuweni/devp2p/v5/HandshakeIntegrationTest.kt
+++ b/devp2p/src/test/kotlin/org/apache/tuweni/devp2p/v5/HandshakeIntegrationTest.kt
@@ -22,7 +22,6 @@
import org.apache.tuweni.crypto.SECP256K1
import org.apache.tuweni.devp2p.EthereumNodeRecord
import org.apache.tuweni.devp2p.v5.internal.DefaultAuthenticationProvider
-import org.apache.tuweni.devp2p.v5.internal.DefaultNodeDiscoveryService
import org.apache.tuweni.devp2p.v5.internal.DefaultPacketCodec
import org.apache.tuweni.devp2p.v5.internal.DefaultUdpConnector
import org.apache.tuweni.devp2p.v5.packet.FindNodeMessage