private async Task SendWantListAsync(Peer peer, IEnumerable <WantedBlock> wants, bool full) { _log.Debug($"sending want list to {peer}"); // Send the want list to the peer on any bitswap protocol // that it supports. foreach (var protocol in Protocols) { try { await using (var stream = await SwarmService.DialAsync(peer, protocol.ToString()).ConfigureAwait(false)) { await protocol.SendWantsAsync(stream, wants, full : full).ConfigureAwait(false); } return; } catch (Exception) { _log.Debug($"{peer} refused {protocol}"); } } _log.Warn($"{peer} does not support any bitswap protocol"); }
public async Task Dial_Peer_UnknownProtocol() { var peerB = new Peer { AgentVersion = "peerB", Id = "QmdpwjdB94eNm2Lcvp9JqoCxswo3AKQqjLuNZyLixmCM1h", PublicKey = "CAASXjBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDlTSgVLprWaXfmxDr92DJE1FP0wOexhulPqXSTsNh5ot6j+UiuMgwb0shSPKzLx9AuTolCGhnwpTBYHVhFoBErAgMBAAE=" }; var swarmB = new SwarmService { LocalPeer = peerB }; var _ = await swarmB.StartListeningAsync("/ip4/127.0.0.1/tcp/0"); var swarm = new SwarmService { LocalPeer = _self }; await swarm.StartAsync(); try { ExceptionAssert.Throws <Exception>(() => { swarm.DialAsync(peerB, "/foo/0.42.0").Wait(); }); } finally { await swarm.StopAsync(); await swarmB.StopAsync(); } }
public async Task Dial_Peer_Not_Listening() { var peer = new Peer { Id = _mars.PeerId, Addresses = new List <MultiAddress> { new MultiAddress($"/ip4/127.0.0.1/tcp/4242/ipfs/{_mars.PeerId}"), new MultiAddress($"/ip4/127.0.0.2/tcp/4242/ipfs/{_mars.PeerId}") } }; var swarm = new SwarmService { LocalPeer = _self }; await swarm.StartAsync(); try { ExceptionAssert.Throws <Exception>(() => { swarm.DialAsync(peer, "/foo/0.42.0").Wait(); }); } finally { await swarm.StopAsync(); } }
/// <summary> /// Advertise that we can provide the CID to the X closest peers /// of the CID. /// </summary> /// <param name="cid"> /// The CID to advertise.ipfs /// </param> /// <remarks> /// This starts a background process to send the AddProvider message /// to the 4 closest peers to the <paramref name="cid"/>. /// </remarks> public void Advertise(Cid cid) { _ = Task.Run(async() => { var advertsNeeded = 4; var message = new DhtMessage { Type = MessageType.AddProvider, Key = cid.Hash.ToArray(), ProviderPeers = new[] { new DhtPeerMessage { Id = SwarmService.LocalPeer.Id.ToArray(), Addresses = SwarmService.LocalPeer.Addresses .Select(a => a.WithoutPeerId().ToArray()) .ToArray() } } }; var peers = RoutingTable .NearestPeers(cid.Hash) .Where(p => p != SwarmService.LocalPeer); foreach (var peer in peers) { try { await using (var stream = await SwarmService.DialAsync(peer, ToString())) { Serializer.SerializeWithLengthPrefix(stream, message, PrefixStyle.Base128); await stream.FlushAsync(); } if (--advertsNeeded == 0) { break; } } catch (Exception) { // eat it. This is fire and forget. } } }); }
public async Task Dial_Peer_No_Address() { var peer = new Peer { Id = _mars.PeerId }; var swarm = new SwarmService { LocalPeer = _self }; await swarm.StartAsync(); try { ExceptionAssert.Throws <Exception>(() => { swarm.DialAsync(peer, "/foo/0.42.0").Wait(); }); } finally { await swarm.StopAsync(); } }
public async Task Dial_Peer() { var peerB = new Peer { AgentVersion = "peerB", Id = "QmdpwjdB94eNm2Lcvp9JqoCxswo3AKQqjLuNZyLixmCM1h", PublicKey = "CAASXjBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDlTSgVLprWaXfmxDr92DJE1FP0wOexhulPqXSTsNh5ot6j+UiuMgwb0shSPKzLx9AuTolCGhnwpTBYHVhFoBErAgMBAAE=" }; var swarmB = new SwarmService { LocalPeer = peerB }; await swarmB.StartAsync(); var _ = await swarmB.StartListeningAsync("/ip4/127.0.0.1/tcp/0"); var swarm = new SwarmService { LocalPeer = _self }; await swarm.StartAsync(); try { await using (var stream = await swarm.DialAsync(peerB, "/ipfs/id/1.0.0")) { Assert.IsNotNull(stream); Assert.IsTrue(stream.CanRead); Assert.IsTrue(stream.CanWrite); } } finally { await swarm.StopAsync(); await swarmB.StopAsync(); } }