Skip to content
This repository has been archived by the owner on Apr 22, 2024. It is now read-only.

Commit

Permalink
Add relaying for to peerbook
Browse files Browse the repository at this point in the history
  • Loading branch information
macpie committed Sep 26, 2019
1 parent 29f0dc2 commit c9ec070
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 5 deletions.
14 changes: 11 additions & 3 deletions src/peerbook/libp2p_peer.erl
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
nat_type => nat_type(),
network_id => binary(),
associations => association_map(),
signed_metadata => #{binary() => binary()}
signed_metadata => #{binary() => binary()},
relaying_for => [binary()]
}.
-type peer() :: #libp2p_signed_peer_pb{}.
-type association() :: #libp2p_association_pb{}.
Expand All @@ -18,7 +19,7 @@
-export_type([peer/0, association/0, peer_map/0, nat_type/0]).

-export([from_map/2, encode/1, decode/1, decode_unsafe/1, encode_list/1, decode_list/1, verify/1,
pubkey_bin/1, listen_addrs/1, connected_peers/1, nat_type/1, timestamp/1,
pubkey_bin/1, listen_addrs/1, connected_peers/1, relaying_for_peers/1, nat_type/1, timestamp/1,
supersedes/2, is_stale/2, is_similar/2, network_id/1, network_id_allowable/2,
has_public_ip/1, is_dialable/1]).
%% associations
Expand Down Expand Up @@ -55,7 +56,8 @@ from_map(Map, SigFun) ->
network_id=maps:get(network_id, Map, <<>>),
timestamp=Timestamp,
associations=Assocs,
signed_metadata=encode_map(maps:get(signed_metadata, Map, #{}))
signed_metadata=encode_map(maps:get(signed_metadata, Map, #{})),
relaying_for = maps:get(relaying_for, Map)
},
sign_peer(Peer, SigFun).

Expand All @@ -76,6 +78,12 @@ listen_addrs(#libp2p_signed_peer_pb{peer=#libp2p_peer_pb{listen_addrs=Addrs}}) -
connected_peers(#libp2p_signed_peer_pb{peer=#libp2p_peer_pb{connected=Conns}}) ->
Conns.

%% @doc Gets the list of peer crypto addresses that the given peer was last
%% known to be relaying for.
-spec relaying_for_peers(peer()) -> [libp2p_crypto:pubkey_bin()].
relaying_for_peers(#libp2p_signed_peer_pb{peer=#libp2p_peer_pb{relaying_for=Conns}}) ->
Conns.

%% @doc Gets the NAT type of the given peer.
-spec nat_type(peer()) -> nat_type().
nat_type(#libp2p_signed_peer_pb{peer=#libp2p_peer_pb{nat_type=NatType}}) ->
Expand Down
1 change: 1 addition & 0 deletions src/peerbook/libp2p_peer.proto
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ message peer {
map<string, association_list> associations = 6;
bytes network_id = 7;
map<string, metadata_value> signed_metadata = 8;
repeated bytes relaying_for = 9;
}

message metadata_value {
Expand Down
2 changes: 1 addition & 1 deletion src/relay/libp2p_relay.erl
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ is_valid_peer(Swarm, PubKeyBin) ->
Error;
{ok, Peer} ->
StaleTime = libp2p_peerbook:stale_time(PeerBook),
ConnectedPeers = libp2p_peer:connected_peers(Peer),
ConnectedPeers = libp2p_peer:relaying_for_peers(Peer),
not libp2p_peer:is_stale(Peer, StaleTime) andalso
libp2p_peer:has_public_ip(Peer) andalso
lists:member(libp2p_swarm:pubkey_bin(Swarm), ConnectedPeers)
Expand Down
2 changes: 1 addition & 1 deletion src/relay/libp2p_transport_relay.erl
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ check_peerbook(TID, MAddr) ->
ServerAddress = libp2p_crypto:p2p_to_pubkey_bin(SAddress),
case libp2p_peerbook:get(Peerbook, RelayAddress) of
{ok, Peer} ->
lists:member(ServerAddress, libp2p_peer:connected_peers(Peer));
lists:member(ServerAddress, libp2p_peer:relaying_for_peers(Peer));
Error ->
Error
end.
Expand Down

0 comments on commit c9ec070

Please sign in to comment.