Example #1
0
        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");
        }
Example #2
0
        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();
            }
        }
Example #3
0
        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();
            }
        }
Example #4
0
        /// <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.
                    }
                }
            });
        }
Example #5
0
        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();
            }
        }
Example #6
0
        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();
            }
        }