Skip to content

Commit b24cf74

Browse files
committed
Refactoring, discovery updated to 24.9.1
1 parent 507ff36 commit b24cf74

File tree

12 files changed

+63
-42
lines changed

12 files changed

+63
-42
lines changed

data/beaconrestapi/src/main/java/tech/pegasys/teku/beaconrestapi/handlers/v1/node/GetPeerById.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public GetPeerById(final DataProvider provider) {
6464
@Override
6565
public void handleRequest(final RestApiRequest request) throws JsonProcessingException {
6666
request.header(Header.CACHE_CONTROL, CACHE_NONE);
67-
Optional<Eth2PeerWithEnr> peer =
67+
final Optional<Eth2PeerWithEnr> peer =
6868
network.getEth2PeerById(request.getPathParameter(PEER_ID_PARAMETER));
6969
if (peer.isEmpty()) {
7070
request.respondError(SC_NOT_FOUND, "Peer not found");

data/provider/src/main/java/tech/pegasys/teku/api/NetworkDataProvider.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,21 @@
3232
import tech.pegasys.teku.spec.datastructures.networking.libp2p.rpc.metadata.MetadataMessage;
3333

3434
public class NetworkDataProvider {
35-
final Function<UInt256, Optional<String>> enrLookupFunction;
35+
final Function<Optional<UInt256>, Optional<String>> enrLookupFunction;
3636

3737
private final Eth2P2PNetwork network;
3838

3939
public NetworkDataProvider(final Eth2P2PNetwork network) {
4040
this.network = network;
4141
this.enrLookupFunction =
42-
nodeId -> {
42+
maybeNodeId -> {
43+
if (maybeNodeId.isEmpty()) {
44+
return Optional.empty();
45+
}
4346
final Optional<DiscoveryService> maybeDiscoveryService =
4447
network.getDiscoveryNetwork().map(DiscoveryNetwork::getDiscoveryService);
4548
return maybeDiscoveryService.flatMap(
46-
discoveryService -> discoveryService.lookupEnr(nodeId));
49+
discoveryService -> discoveryService.lookupEnr(maybeNodeId.get()));
4750
};
4851
}
4952

gradle/versions.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ dependencyManagement {
159159

160160
// discovery includes tuweni libraries under a different name so version resolution doesn't work
161161
// exclude them here and leave them to be included on the classpath by the version we use
162-
dependency('tech.pegasys.discovery:discovery:24.9.0') {
162+
dependency('tech.pegasys.discovery:discovery:24.9.1') {
163163
exclude 'org.apache.tuweni:bytes'
164164
exclude 'org.apache.tuweni:crypto'
165165
exclude 'org.apache.tuweni:units'

networking/eth2/src/main/java/tech/pegasys/teku/networking/eth2/Eth2P2PNetworkBuilder.java

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,13 @@
1717
import static com.google.common.base.Preconditions.checkNotNull;
1818
import static com.google.common.base.Preconditions.checkState;
1919

20-
import io.libp2p.core.crypto.PubKey;
2120
import java.time.Duration;
2221
import java.util.ArrayList;
2322
import java.util.Collection;
2423
import java.util.Collections;
2524
import java.util.List;
2625
import java.util.Optional;
2726
import org.apache.tuweni.bytes.Bytes;
28-
import org.apache.tuweni.units.bigints.UInt256;
2927
import org.hyperledger.besu.plugin.services.MetricsSystem;
3028
import tech.pegasys.teku.infrastructure.async.AsyncRunner;
3129
import tech.pegasys.teku.infrastructure.events.EventChannels;
@@ -51,17 +49,16 @@
5149
import tech.pegasys.teku.networking.eth2.peers.DiscoveryNodeIdExtractor;
5250
import tech.pegasys.teku.networking.eth2.peers.Eth2PeerManager;
5351
import tech.pegasys.teku.networking.eth2.peers.Eth2PeerSelectionStrategy;
52+
import tech.pegasys.teku.networking.eth2.peers.LibP2PDiscoveryNodeIdExtractor;
5453
import tech.pegasys.teku.networking.eth2.rpc.beaconchain.methods.StatusMessageFactory;
5554
import tech.pegasys.teku.networking.eth2.rpc.core.encodings.RpcEncoding;
5655
import tech.pegasys.teku.networking.p2p.connection.PeerPools;
5756
import tech.pegasys.teku.networking.p2p.connection.TargetPeerRange;
5857
import tech.pegasys.teku.networking.p2p.discovery.DiscoveryConfig;
5958
import tech.pegasys.teku.networking.p2p.discovery.DiscoveryNetwork;
6059
import tech.pegasys.teku.networking.p2p.discovery.DiscoveryNetworkBuilder;
61-
import tech.pegasys.teku.networking.p2p.discovery.discv5.DiscV5Service;
6260
import tech.pegasys.teku.networking.p2p.gossip.PreparedGossipMessageFactory;
6361
import tech.pegasys.teku.networking.p2p.libp2p.LibP2PNetworkBuilder;
64-
import tech.pegasys.teku.networking.p2p.libp2p.LibP2PPeer;
6562
import tech.pegasys.teku.networking.p2p.libp2p.LibP2PPrivateKeyLoader;
6663
import tech.pegasys.teku.networking.p2p.libp2p.gossip.GossipTopicFilter;
6764
import tech.pegasys.teku.networking.p2p.network.P2PNetwork;
@@ -145,17 +142,7 @@ public Eth2P2PNetwork build() {
145142
final SubnetSubscriptionService attestationSubnetService = new SubnetSubscriptionService();
146143
final SubnetSubscriptionService syncCommitteeSubnetService = new SubnetSubscriptionService();
147144

148-
// TODO a bit hacky solution, subject to be refactored
149-
DiscoveryNodeIdExtractor discoveryNodeIdExtractor =
150-
peer -> {
151-
LibP2PPeer libP2PPeer = (LibP2PPeer) peer;
152-
PubKey libP2PPubKey = libP2PPeer.getPubKey();
153-
Bytes discoveryNodeIdBytes =
154-
DiscV5Service.DEFAULT_NODE_RECORD_CONVERTER.convertPublicKeyToNodeId(
155-
Bytes.wrap(libP2PPubKey.raw()));
156-
return UInt256.fromBytes(discoveryNodeIdBytes);
157-
};
158-
145+
final DiscoveryNodeIdExtractor discoveryNodeIdExtractor = new LibP2PDiscoveryNodeIdExtractor();
159146
final RpcEncoding rpcEncoding =
160147
RpcEncoding.createSszSnappyEncoding(spec.getNetworkingConfig().getMaxChunkSize());
161148
if (statusMessageFactory == null) {

networking/eth2/src/main/java/tech/pegasys/teku/networking/eth2/peers/DefaultEth2Peer.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class DefaultEth2Peer extends DelegatingPeer implements Eth2Peer {
7373
private static final Logger LOG = LogManager.getLogger();
7474

7575
private final Spec spec;
76-
private final UInt256 discoveryNodeId;
76+
private final Optional<UInt256> discoveryNodeId;
7777
private final BeaconChainMethods rpcMethods;
7878
private final StatusMessageFactory statusMessageFactory;
7979
private final MetadataMessagesFactory metadataMessagesFactory;
@@ -97,7 +97,7 @@ class DefaultEth2Peer extends DelegatingPeer implements Eth2Peer {
9797
DefaultEth2Peer(
9898
final Spec spec,
9999
final Peer peer,
100-
final UInt256 discoveryNodeId,
100+
final Optional<UInt256> discoveryNodeId,
101101
final BeaconChainMethods rpcMethods,
102102
final StatusMessageFactory statusMessageFactory,
103103
final MetadataMessagesFactory metadataMessagesFactory,
@@ -133,7 +133,7 @@ class DefaultEth2Peer extends DelegatingPeer implements Eth2Peer {
133133
}
134134

135135
@Override
136-
public UInt256 getDiscoveryNodeId() {
136+
public Optional<UInt256> getDiscoveryNodeId() {
137137
return discoveryNodeId;
138138
}
139139

networking/eth2/src/main/java/tech/pegasys/teku/networking/eth2/peers/DiscoveryNodeIdExtractor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@
1313

1414
package tech.pegasys.teku.networking.eth2.peers;
1515

16+
import java.util.Optional;
1617
import org.apache.tuweni.units.bigints.UInt256;
1718
import tech.pegasys.teku.networking.p2p.peer.Peer;
1819

1920
public interface DiscoveryNodeIdExtractor {
20-
UInt256 calculateDiscoveryNodeId(Peer peer);
21+
Optional<UInt256> calculateDiscoveryNodeId(Peer peer);
2122
}

networking/eth2/src/main/java/tech/pegasys/teku/networking/eth2/peers/Eth2Peer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public interface Eth2Peer extends Peer, SyncSource {
4242
static Eth2Peer create(
4343
final Spec spec,
4444
final Peer peer,
45-
final UInt256 discoveryNodeId,
45+
final Optional<UInt256> discoveryNodeId,
4646
final BeaconChainMethods rpcMethods,
4747
final StatusMessageFactory statusMessageFactory,
4848
final MetadataMessagesFactory metadataMessagesFactory,
@@ -124,7 +124,7 @@ void adjustBlobSidecarsRequest(
124124

125125
int getUnansweredPingCount();
126126

127-
UInt256 getDiscoveryNodeId();
127+
Optional<UInt256> getDiscoveryNodeId();
128128

129129
interface PeerStatusSubscriber {
130130
void onPeerStatus(final PeerStatus initialStatus);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Copyright Consensys Software Inc., 2024
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
5+
* the License. You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
10+
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
11+
* specific language governing permissions and limitations under the License.
12+
*/
13+
14+
package tech.pegasys.teku.networking.eth2.peers;
15+
16+
import java.util.Optional;
17+
import org.apache.tuweni.bytes.Bytes;
18+
import org.apache.tuweni.units.bigints.UInt256;
19+
import tech.pegasys.teku.networking.p2p.discovery.discv5.DiscV5Service;
20+
import tech.pegasys.teku.networking.p2p.libp2p.LibP2PPeer;
21+
import tech.pegasys.teku.networking.p2p.peer.Peer;
22+
23+
public class LibP2PDiscoveryNodeIdExtractor implements DiscoveryNodeIdExtractor {
24+
@Override
25+
public Optional<UInt256> calculateDiscoveryNodeId(final Peer peer) {
26+
if (peer instanceof LibP2PPeer libP2PPeer) {
27+
try {
28+
final Bytes libP2PPeerPublicKey = Bytes.wrap(libP2PPeer.getPubKey().raw());
29+
final Bytes discoveryNodeIdBytes =
30+
DiscV5Service.DEFAULT_NODE_RECORD_CONVERTER.convertPublicKeyToNodeId(
31+
libP2PPeerPublicKey);
32+
return Optional.of(UInt256.fromBytes(discoveryNodeIdBytes));
33+
} catch (final Exception ignored) {
34+
return Optional.empty();
35+
}
36+
}
37+
38+
return Optional.empty();
39+
}
40+
}

networking/eth2/src/test/java/tech/pegasys/teku/networking/eth2/peers/Eth2PeerTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import java.util.List;
2626
import java.util.Optional;
2727
import java.util.stream.IntStream;
28-
import org.apache.tuweni.units.bigints.UInt256;
2928
import org.junit.jupiter.api.Test;
3029
import org.mockito.ArgumentCaptor;
3130
import tech.pegasys.teku.infrastructure.async.SafeFuture;
@@ -72,7 +71,7 @@ class Eth2PeerTest {
7271
Eth2Peer.create(
7372
spec,
7473
delegate,
75-
UInt256.ZERO,
74+
Optional.empty(),
7675
rpcMethods,
7776
statusMessageFactory,
7877
metadataMessagesFactory,

networking/eth2/src/testFixtures/java/tech/pegasys/teku/networking/eth2/Eth2P2PNetworkFactory.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import org.apache.logging.log4j.LogManager;
3434
import org.apache.logging.log4j.Logger;
3535
import org.apache.tuweni.bytes.Bytes;
36-
import org.apache.tuweni.units.bigints.UInt256;
3736
import org.hyperledger.besu.metrics.noop.NoOpMetricsSystem;
3837
import tech.pegasys.teku.infrastructure.async.AsyncRunner;
3938
import tech.pegasys.teku.infrastructure.async.DelayedExecutorAsyncRunner;
@@ -230,7 +229,7 @@ protected Eth2P2PNetwork buildNetwork(final P2PConfig config) {
230229
50,
231230
spec,
232231
KZG.NOOP,
233-
(pk) -> UInt256.ZERO);
232+
(__) -> Optional.empty());
234233

235234
List<RpcMethod<?, ?, ?>> rpcMethods =
236235
eth2PeerManager.getBeaconChainMethods().all().stream()

networking/eth2/src/testFixtures/java/tech/pegasys/teku/networking/eth2/peers/RespondingEth2Peer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -357,8 +357,8 @@ public int getUnansweredPingCount() {
357357
}
358358

359359
@Override
360-
public UInt256 getDiscoveryNodeId() {
361-
return UInt256.ZERO;
360+
public Optional<UInt256> getDiscoveryNodeId() {
361+
return Optional.empty();
362362
}
363363

364364
@Override

networking/p2p/src/main/java/tech/pegasys/teku/networking/p2p/discovery/discv5/NodeRecordConverter.java

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,9 @@
2323
import org.apache.logging.log4j.LogManager;
2424
import org.apache.logging.log4j.Logger;
2525
import org.apache.tuweni.bytes.Bytes;
26-
import org.apache.tuweni.units.bigints.UInt64;
2726
import org.ethereum.beacon.discovery.schema.EnrField;
28-
import org.ethereum.beacon.discovery.schema.IdentitySchema;
27+
import org.ethereum.beacon.discovery.schema.IdentitySchemaInterpreter;
2928
import org.ethereum.beacon.discovery.schema.NodeRecord;
30-
import org.ethereum.beacon.discovery.schema.NodeRecordFactory;
3129
import tech.pegasys.teku.infrastructure.ssz.collections.SszBitvector;
3230
import tech.pegasys.teku.infrastructure.ssz.schema.collections.SszBitvectorSchema;
3331
import tech.pegasys.teku.networking.p2p.discovery.DiscoveryPeer;
@@ -38,13 +36,7 @@ public class NodeRecordConverter {
3836
private static final Logger LOG = LogManager.getLogger();
3937

4038
public Bytes convertPublicKeyToNodeId(final Bytes publicKey) {
41-
// TODO need to open an additional API in discovery instead of this hack
42-
NodeRecord tempNodeRecord =
43-
NodeRecordFactory.DEFAULT.createFromValues(
44-
UInt64.ZERO,
45-
new EnrField(EnrField.PKEY_SECP256K1, publicKey),
46-
new EnrField(EnrField.ID, IdentitySchema.V4));
47-
return tempNodeRecord.getNodeId();
39+
return IdentitySchemaInterpreter.V4.calculateNodeId(publicKey);
4840
}
4941

5042
public Optional<DiscoveryPeer> convertToDiscoveryPeer(

0 commit comments

Comments
 (0)