private async Task <TransactionProcessor> CreateTransactionProcessorAsync([CallerMemberName] string callerName = "")
        {
            var datadir = EnvironmentHelpers.GetDataDir(Path.Combine("WalletWasabi", "Bench"));
            var dir     = Path.Combine(datadir, callerName, "TransactionStore");

            Console.WriteLine(dir);
            await IoHelpers.DeleteRecursivelyWithMagicDustAsync(dir);

            // Create the services.
            // 1. Create connection service.
            var nodes                = new NodesGroup(Network.Main);
            var bitcoinStore         = new BitcoinStore();
            var serviceConfiguration = new ServiceConfiguration(2, 2, 21, 50, new IPEndPoint(IPAddress.Parse("127.0.0.1"), 45678), Money.Coins(0.0001m));

            // 2. Create wasabi synchronizer service.
            var synchronizer = new WasabiSynchronizer(Network.Main, bitcoinStore, () => new Uri("http://localhost:35474"), null);

            synchronizer.Start(requestInterval: TimeSpan.FromDays(1), TimeSpan.FromDays(1), 1000);

            // 3. Create key manager service.
            var keyManager = KeyManager.CreateNew(out _, "password");

            // 4. Create chaumian coinjoin client.
            var chaumianClient = new CoinJoinClient(synchronizer, Network.Main, keyManager);

            // 5. Create wallet service.
            await bitcoinStore.InitializeAsync(dir, Network.Main);

            var workDir      = Path.Combine(datadir, EnvironmentHelpers.GetMethodName());
            var feeProviders = new FeeProviders(new[] { synchronizer });

            var wallet = new WalletService(bitcoinStore, keyManager, synchronizer, nodes, workDir, serviceConfiguration, feeProviders);

            return(wallet.TransactionProcessor);
        }
Пример #2
0
        public void RegisterServices(
            BitcoinStore bitcoinStore,
            WasabiSynchronizer syncer,
            NodesGroup nodes,
            ServiceConfiguration serviceConfiguration,
            IFeeProvider feeProvider,
            CoreNode coreNode = null)
        {
            if (State != WalletState.Uninitialized)
            {
                throw new InvalidOperationException($"{nameof(State)} must be {WalletState.Uninitialized}. Current state: {State}.");
            }

            BitcoinStore         = Guard.NotNull(nameof(bitcoinStore), bitcoinStore);
            Nodes                = Guard.NotNull(nameof(nodes), nodes);
            Synchronizer         = Guard.NotNull(nameof(syncer), syncer);
            ServiceConfiguration = Guard.NotNull(nameof(serviceConfiguration), serviceConfiguration);
            FeeProvider          = Guard.NotNull(nameof(feeProvider), feeProvider);
            CoreNode             = coreNode;

            ChaumianClient = new CoinJoinClient(Synchronizer, Network, KeyManager);

            TransactionProcessor = new TransactionProcessor(BitcoinStore.TransactionStore, KeyManager, ServiceConfiguration.DustThreshold, ServiceConfiguration.PrivacyLevelStrong);
            Coins = TransactionProcessor.Coins;

            TransactionProcessor.WalletRelevantTransactionProcessed += TransactionProcessor_WalletRelevantTransactionProcessedAsync;
            ChaumianClient.OnDequeue += ChaumianClient_OnDequeue;

            BitcoinStore.IndexStore.NewFilter += IndexDownloader_NewFilterAsync;
            BitcoinStore.IndexStore.Reorged   += IndexDownloader_ReorgedAsync;
            BitcoinStore.MempoolService.TransactionReceived += Mempool_TransactionReceived;

            State = WalletState.Initialized;
        }
Пример #3
0
        private async Task <bool> StartConnecting()
        {
            return(await Task <bool> .Factory.StartNew(() =>
            {
                try
                {
                    NodeConnectionParameters parameters = new NodeConnectionParameters();
                    //So we find nodes faster
                    parameters.TemplateBehaviors.Add(new AddressManagerBehavior(GetAddressManager()));
                    //So we don't have to load the chain each time we start
                    parameters.TemplateBehaviors.Add(new ChainBehavior(GetChain()));
                    //Tracker knows which scriptPubKey and outpoints to track
                    parameters.TemplateBehaviors.Add(new TrackerBehavior(GetTracker()));

                    var nodeReq = new NodeRequirement()
                    {
                        RequiredServices = NodeServices.Network
                    };
                    _group = new NodesGroup(_wallet.NetworkChoice, parameters, nodeReq);
                    _group.MaximumNodeConnection = MAX_NUM_CONNECTIONS;
                    _group.Connect();
                    _connectionparameters = parameters;
                    return true;
                }
                catch (Exception e)
                {
                    throw e;
                }
            }));
        }
Пример #4
0
        public async Task Connect()
        {
            await Task.Factory.StartNew(async() =>
            {
                EndpointInstance = await BusManager.StartServiceBus(Network.Name);
                _nodeGroup       = new NodesGroup(Network, GetNodeConnectionParameters())
                {
                    AllowSameGroup = true,
                };
                _nodeGroup.Requirements.SupportSPV = true;

                foreach (NetworkAddress networkAddress in BootstrapNodes)
                {
                    AddressManager.Add(networkAddress);
                }

                _nodeGroup.Connect();
                _nodeGroup.ConnectedNodes.Added += (s, e) =>
                {
                    var node              = e.Node;
                    node.MessageReceived += RebroadcastEvent;

                    node.MessageReceived += (node1, message) =>
                    {
                        Console.WriteLine("Message Received");
                        SaveChainData();
                    };

                    node.Disconnected += n =>
                    {
                        Console.WriteLine("Disconnected!");
                    };
                };
            });
        }
Пример #5
0
        public void CanMaintainConnectionToNodes()
        {
            using (var builder = NodeBuilder.Create())
            {
                NodesGroup connected = CreateGroup(builder, 2);
                connected.Connect();
                TestUtils.Eventually(() => connected.ConnectedNodes.Count == 2);

                //Server crash abruptly
                builder.Nodes[0].Kill(false);
                TestUtils.Eventually(() => connected.ConnectedNodes.Count < 2);
                builder.Nodes[0].Start();
                //Reconnect ?
                TestUtils.Eventually(() => connected.ConnectedNodes.Count == 2);

                //Client crash abruptly
                connected.ConnectedNodes.First().Disconnect();
                TestUtils.Eventually(() => connected.ConnectedNodes.Count == 1);

                //Reconnect ?
                TestUtils.Eventually(() => connected.ConnectedNodes.Count == 2);
                connected.Disconnect();
                TestUtils.Eventually(() => connected.ConnectedNodes.Count == 0);
            }
        }
Пример #6
0
        public void CanMaintainConnectionToNodes()
        {
            using (NodeServerTester servers = new NodeServerTester(Network.TestNet))
            {
                NodesGroup connected = CreateGroup(servers, 2);
                connected.Connect();
                TestUtils.Eventually(() => connected.ConnectedNodes.Count == 2);

                //Server crash abruptly
                servers.ConnectedNodes.First().Disconnect();
                TestUtils.Eventually(() => connected.ConnectedNodes.Count == 1);

                //Reconnect ?
                TestUtils.Eventually(() => connected.ConnectedNodes.Count == 2);

                //Client crash abruptly
                connected.ConnectedNodes.First().Disconnect();
                TestUtils.Eventually(() => connected.ConnectedNodes.Count == 1);

                //Reconnect ?
                TestUtils.Eventually(() => connected.ConnectedNodes.Count == 2);
                connected.Disconnect();
                TestUtils.Eventually(() => connected.ConnectedNodes.Count == 0);
            }
        }
Пример #7
0
        NodesGroup CreateNodeGroup(ConcurrentChain chain, int startHeight)
        {
            AddressManager manager = new AddressManager();

            manager.Add(new NetworkAddress(NodeEndpoint), IPAddress.Loopback);
            NodesGroup group = new NodesGroup(Network, new NodeConnectionParameters()
            {
                Services          = NodeServices.Nothing,
                IsRelay           = true,
                TemplateBehaviors =
                {
                    new AddressManagerBehavior(manager)
                    {
                        PeersToDiscover = 1,
                        Mode            = AddressManagerBehaviorMode.None
                    },
                    new ExplorerBehavior(this, chain)
                    {
                        StartHeight = startHeight
                    },
                    new ChainBehavior(chain)
                    {
                        CanRespondToGetHeaders = false
                    }
                }
            });

            group.AllowSameGroup        = true;
            group.MaximumNodeConnection = 1;
            group.Connect();
            return(group);
        }
Пример #8
0
        private async void StartConnecting()
        {
            await Task.Factory.StartNew(() =>
            {
                NodeConnectionParameters parameters = new NodeConnectionParameters();
                //So we find nodes faster
                parameters.TemplateBehaviors.Add(new AddressManagerBehavior(this.GetAddressManager()));
                //So we don't have to load the chain each time we start
                parameters.TemplateBehaviors.Add(new ChainBehavior(this.GetChain()));
                //Tracker knows which scriptPubKey and outpoints to track
                parameters.TemplateBehaviors.Add(new TrackerBehavior(this.GetTracker()));
                var nodeReq = new NodeRequirement()
                {
                    RequiredServices = NodeServices.Network
                };
                _group = new NodesGroup(_wallet.NetworkChoice, parameters, nodeReq);
                _group.MaximumNodeConnection = MAX_NUM_CONNECTIONS;
                _group.Connect();
                _connectionparameters = parameters;
            });

            _wallet.Configure(_group);
            _wallet.Connect();
            _wallet.Connected = true;

            PeriodicKick();
            PeriodicSave();
        }
Пример #9
0
        public void CanMaintainConnectionToNodes()
        {
            using (NodeServerTester servers = new NodeServerTester(Network.TestNet))
            {
                servers.Server1.InboundNodeConnectionParameters.Services = NodeServices.Network;
                AddressManagerBehavior behavior = new AddressManagerBehavior(new AddressManager());
                behavior.AddressManager.Add(new NetworkAddress(servers.Server1.ExternalEndpoint), IPAddress.Parse("127.0.0.1"));
                NodeConnectionParameters parameters = new NodeConnectionParameters();
                parameters.TemplateBehaviors.Add(behavior);
                NodesGroup connected = new NodesGroup(Network.TestNet, parameters, new NodeRequirement()
                {
                    RequiredServices = NodeServices.Network
                });
                connected.AllowSameGroup        = true;
                connected.MaximumNodeConnection = 2;
                connected.Connect();

                TestUtils.Eventually(() => connected.ConnectedNodes.Count == 2);

                //Server crash abruptly
                servers.Server1.ConnectedNodes.First().Disconnect();
                TestUtils.Eventually(() => connected.ConnectedNodes.Count == 1);

                //Reconnect ?
                TestUtils.Eventually(() => connected.ConnectedNodes.Count == 2);

                //Client crash abruptly
                connected.ConnectedNodes.First().Disconnect();
                TestUtils.Eventually(() => connected.ConnectedNodes.Count == 1);

                //Reconnect ?
                TestUtils.Eventually(() => connected.ConnectedNodes.Count == 2);
            }
        }
Пример #10
0
        private async void StartConnecting()
        {
            await Task.Factory.StartNew(() =>
            {
                var parameters = new NodeConnectionParameters();
                parameters.TemplateBehaviors.Add(new AddressManagerBehavior(GetAddressManager())); //So we find nodes faster
                parameters.TemplateBehaviors.Add(new ChainBehavior(GetChain()));                   //So we don't have to load the chain each time we start
                parameters.TemplateBehaviors.Add(new TrackerBehavior(GetTracker()));               //Tracker knows which scriptPubKey and outpoints to track, it monitors all your wallets at the same
                if (!_Disposed)
                {
                    _Group = new NodesGroup(App.Network, parameters, new NodeRequirement()
                    {
                        RequiredServices = NodeServices.Network //Needed for SPV
                    });
                    _Group.MaximumNodeConnection = 4;
                    _Group.Connect();
                    _ConnectionParameters = parameters;
                }
            });

            PeriodicSave();
            PeriodicUiUpdate();
            PeriodicKick();

            foreach (var wallet in Wallets)
            {
                wallet.Wallet.Configure(_Group);
                wallet.Wallet.Connect();
            }
        }
Пример #11
0
        public WalletService(
            BitcoinStore bitcoinStore,
            KeyManager keyManager,
            WasabiSynchronizer syncer,
            CoinJoinClient chaumianClient,
            NodesGroup nodes,
            string workFolderDir,
            ServiceConfiguration serviceConfiguration,
            IFeeProvider feeProvider,
            CoreNode coreNode = null)
        {
            BitcoinStore         = Guard.NotNull(nameof(bitcoinStore), bitcoinStore);
            KeyManager           = Guard.NotNull(nameof(keyManager), keyManager);
            Nodes                = Guard.NotNull(nameof(nodes), nodes);
            Synchronizer         = Guard.NotNull(nameof(syncer), syncer);
            ChaumianClient       = Guard.NotNull(nameof(chaumianClient), chaumianClient);
            ServiceConfiguration = Guard.NotNull(nameof(serviceConfiguration), serviceConfiguration);
            FeeProvider          = Guard.NotNull(nameof(feeProvider), feeProvider);
            CoreNode             = coreNode;

            HandleFiltersLock = new AsyncLock();

            BlocksFolderPath = Path.Combine(workFolderDir, "Blocks", Network.ToString());
            RuntimeParams.SetDataDir(workFolderDir);

            BlockFolderLock = new AsyncLock();

            KeyManager.AssertCleanKeysIndexed();
            KeyManager.AssertLockedInternalKeysIndexed(14);

            TransactionProcessor = new TransactionProcessor(BitcoinStore.TransactionStore, KeyManager, ServiceConfiguration.DustThreshold, ServiceConfiguration.PrivacyLevelStrong);
            Coins = TransactionProcessor.Coins;

            TransactionProcessor.WalletRelevantTransactionProcessed += TransactionProcessor_WalletRelevantTransactionProcessedAsync;

            if (Directory.Exists(BlocksFolderPath))
            {
                if (Synchronizer.Network == Network.RegTest)
                {
                    Directory.Delete(BlocksFolderPath, true);
                    Directory.CreateDirectory(BlocksFolderPath);
                }
            }
            else
            {
                Directory.CreateDirectory(BlocksFolderPath);
            }

            var walletName = "UnnamedWallet";

            if (!string.IsNullOrWhiteSpace(KeyManager.FilePath))
            {
                walletName = Path.GetFileNameWithoutExtension(KeyManager.FilePath);
            }

            BitcoinStore.IndexStore.NewFilter += IndexDownloader_NewFilterAsync;
            BitcoinStore.IndexStore.Reorged   += IndexDownloader_ReorgedAsync;
            BitcoinStore.MempoolService.TransactionReceived += Mempool_TransactionReceived;
        }
Пример #12
0
 private void StopNodeGroup()
 {
     if (_group != null)
     {
         _group.Dispose();
     }
     _group = null;
 }
Пример #13
0
 public void StartNodeListener(int startHeight)
 {
     _Nodes = CreateNodeGroup(Chain, startHeight);
     while (_Nodes.ConnectedNodes.Count == 0)
     {
         Thread.Sleep(10);
     }
 }
Пример #14
0
 public P2pBlockProvider(NodesGroup nodes, CoreNode?coreNode, HttpClientFactory httpClientFactory, ServiceConfiguration serviceConfiguration, Network network)
 {
     Nodes                = nodes;
     CoreNode             = coreNode;
     HttpClientFactory    = httpClientFactory;
     ServiceConfiguration = serviceConfiguration;
     Network              = network;
 }
 public P2pBlockProvider(NodesGroup nodes, CoreNode coreNode, WasabiSynchronizer syncer, ServiceConfiguration serviceConfiguration, Network network)
 {
     Nodes                = nodes;
     CoreNode             = coreNode;
     Synchronizer         = syncer;
     ServiceConfiguration = serviceConfiguration;
     Network              = network;
 }
Пример #16
0
        public Wallet(
            Network network,
            BitcoinStore bitcoinStore,
            KeyManager keyManager,
            WasabiSynchronizer syncer,
            NodesGroup nodes,
            string workFolderDir,
            ServiceConfiguration serviceConfiguration,
            IFeeProvider feeProvider,
            CoreNode coreNode = null)
        {
            Network              = Guard.NotNull(nameof(network), network);
            BitcoinStore         = Guard.NotNull(nameof(bitcoinStore), bitcoinStore);
            KeyManager           = Guard.NotNull(nameof(keyManager), keyManager);
            Nodes                = Guard.NotNull(nameof(nodes), nodes);
            Synchronizer         = Guard.NotNull(nameof(syncer), syncer);
            ServiceConfiguration = Guard.NotNull(nameof(serviceConfiguration), serviceConfiguration);
            FeeProvider          = Guard.NotNull(nameof(feeProvider), feeProvider);
            CoreNode             = coreNode;

            ChaumianClient    = new CoinJoinClient(Synchronizer, Network, keyManager);
            HandleFiltersLock = new AsyncLock();

            BlocksFolderPath = Path.Combine(workFolderDir, "Blocks", Network.ToString());
            RuntimeParams.SetDataDir(workFolderDir);

            BlockFolderLock = new AsyncLock();

            KeyManager.AssertCleanKeysIndexed();
            KeyManager.AssertLockedInternalKeysIndexed(14);

            TransactionProcessor = new TransactionProcessor(BitcoinStore.TransactionStore, KeyManager, ServiceConfiguration.DustThreshold, ServiceConfiguration.PrivacyLevelStrong);
            Coins = TransactionProcessor.Coins;

            TransactionProcessor.WalletRelevantTransactionProcessed += TransactionProcessor_WalletRelevantTransactionProcessedAsync;
            ChaumianClient.OnDequeue += ChaumianClient_OnDequeue;

            if (Directory.Exists(BlocksFolderPath))
            {
                if (Network == Network.RegTest)
                {
                    Directory.Delete(BlocksFolderPath, true);
                    Directory.CreateDirectory(BlocksFolderPath);
                }
            }
            else
            {
                Directory.CreateDirectory(BlocksFolderPath);
            }

            BitcoinStore.IndexStore.NewFilter += IndexDownloader_NewFilterAsync;
            BitcoinStore.IndexStore.Reorged   += IndexDownloader_ReorgedAsync;
            BitcoinStore.MempoolService.TransactionReceived += Mempool_TransactionReceived;

            State = WalletState.Initialized;
        }
Пример #17
0
 public void Dispose()
 {
     _Disposed = true;
     _Starting.Wait();
     if (_Group != null)
     {
         _Group.Disconnect();
         _Group = null;
     }
 }
Пример #18
0
        /// <summary>
        /// Configure the components of the wallet
        /// </summary>
        /// <param name="group">The group to use</param>
        public void Configure(NodesGroup group)
        {
            if (group == null)
            {
                throw new ArgumentNullException("group");
            }

            var parameters = group.NodeConnectionParameters;

            group.Requirements.MinVersion        = ProtocolVersion.PROTOCOL_VERSION;
            group.Requirements.RequiredServices |= NodeServices.Network;

            var chain = parameters.TemplateBehaviors.Find <ChainBehavior>();

            if (chain == null)
            {
                chain = new ChainBehavior(new ConcurrentChain(_Parameters.Network));
                parameters.TemplateBehaviors.Add(chain);
            }
            if (chain.Chain.Genesis.HashBlock != _Parameters.Network.GetGenesis().GetHash())
            {
                throw new InvalidOperationException("ChainBehavior with invalid network chain detected");
            }

            var addrman = parameters.TemplateBehaviors.Find <AddressManagerBehavior>();

            if (addrman == null)
            {
                addrman = new AddressManagerBehavior(new AddressManager());
                parameters.TemplateBehaviors.Add(addrman);
            }

            var tracker = parameters.TemplateBehaviors.Find <TrackerBehavior>();

            if (tracker == null)
            {
                tracker = new TrackerBehavior(new Tracker(), chain.Chain);
                parameters.TemplateBehaviors.Add(tracker);
            }
            var wallet = FindWalletBehavior(parameters.TemplateBehaviors);

            if (wallet == null)
            {
                wallet = new WalletBehavior(this);
                parameters.TemplateBehaviors.Add(wallet);
            }

            _Group = group;
            if (_ListenedTracker != null)
            {
                _ListenedTracker.NewOperation -= _ListenerTracked_NewOperation;
            }
            _ListenedTracker = tracker.Tracker;
            _ListenedTracker.NewOperation += _ListenerTracked_NewOperation;
        }
Пример #19
0
 void AttachedNode_StateChanged(Node node, NodeState oldState)
 {
     ListenerTrace.Info("State change " + node.State);
     if (node.State == NodeState.HandShaked)
     {
         ListenerTrace.Info("Node handshaked");
         AttachedNode.MessageReceived += _Listener.node_MessageReceived;
         AttachedNode.Disconnected    += AttachedNode_Disconnected;
         ListenerTrace.Info("Connection count : " + NodesGroup.GetNodeGroup(node).ConnectedNodes.Count);
     }
 }
Пример #20
0
        public NodeConnectionService(Context context, ILoggerFactory loggerFactory) : base(context)
        {
            this.NodesGroup = new NodesGroup(this.Context.Network);
            this.logger     = loggerFactory.CreateLogger <NodeConnectionService>();

            // some config settings
            this.NodesGroup.MaximumNodeConnection = this.Context.Config.MaximumNodeConnection;

            // set the connection parameters
            this.NodesGroup.NodeConnectionParameters = this.Context.ConnectionParameters;
        }
Пример #21
0
        private async Task LoadGroup()
        {
            AddressManager manager = new AddressManager();

            manager.Add(new NetworkAddress(_ChainConfiguration.NodeEndpoint), IPAddress.Loopback);
            NodesGroup group = new NodesGroup(_Network.NBitcoinNetwork, new NodeConnectionParameters()
            {
                Services          = NodeServices.Nothing,
                IsRelay           = true,
                TemplateBehaviors =
                {
                    new AddressManagerBehavior(manager)
                    {
                        PeersToDiscover = 1,
                        Mode            = AddressManagerBehaviorMode.None
                    },
                    new ExplorerBehavior(_Repository, _Chain, _AddressPoolService, _EventAggregator)
                    {
                        StartHeight = _ChainConfiguration.StartHeight
                    },
                    new SlimChainBehavior(_Chain),
                    new PingPongBehavior()
                }
            });

            group.AllowSameGroup        = true;
            group.MaximumNodeConnection = 1;

            var task = WaitConnected(group);

            group.Connect();

            try
            {
                await task;
            }
            catch (Exception ex)
            {
                Logs.Configuration.LogError(ex, $"{_Network.CryptoCode}: Failure to connect to the bitcoin node (P2P)");
                throw;
            }
            _Group = group;

            group.ConnectedNodes.Added   += ConnectedNodes_Changed;
            group.ConnectedNodes.Removed += ConnectedNodes_Changed;

            // !Hack. ExplorerBehavior.AttachCore is async and calling the repository.
            // Because the repository is single thread, calling a ping make sure that AttachCore
            // has fully ran.
            // Without this hack, NBXplorer takes sometimes 1 min to go from Synching to Ready state
            await _Repository.Ping();
        }
Пример #22
0
        private NodesGroup CreateNodeGroup(NodeConnectionParameters cloneParameters, NodeServices requiredServices)
        {
            this.logger.LogTrace("({0}:{1})", nameof(requiredServices), requiredServices);

            var res = new NodesGroup(this.Network, cloneParameters, new NodeRequirement
            {
                MinVersion       = this.NodeSettings.ProtocolVersion,
                RequiredServices = requiredServices,
            });

            this.logger.LogTrace("(-)");
            return(res);
        }
Пример #23
0
        private async Task LoadGroup()
        {
            AddressManager manager = new AddressManager();

            manager.Add(new NetworkAddress(GetEndpoint()), IPAddress.Loopback);
            NodesGroup group = new NodesGroup(_Network.NBitcoinNetwork, new NodeConnectionParameters()
            {
                Services          = NodeServices.Nothing,
                IsRelay           = true,
                TemplateBehaviors =
                {
                    new AddressManagerBehavior(manager)
                    {
                        PeersToDiscover = 1,
                        Mode            = AddressManagerBehaviorMode.None
                    },
                    new ExplorerBehavior(_Repository, _Chain, _EventAggregator)
                    {
                        StartHeight = _Configuration.ChainConfigurations.First(c => c.CryptoCode == _Network.CryptoCode).StartHeight
                    },
                    new ChainBehavior(_Chain)
                    {
                        CanRespondToGetHeaders = false,
                        SkipPoWCheck           = true,
                        StripHeader            = true
                    },
                    new PingPongBehavior()
                }
            });

            group.AllowSameGroup        = true;
            group.MaximumNodeConnection = 1;

            var task = WaitConnected(group);

            group.Connect();

            try
            {
                await task;
            }
            catch (Exception ex)
            {
                Logs.Configuration.LogError(ex, $"{_Network.CryptoCode}: Failure to connect to the bitcoin node (P2P)");
                throw;
            }
            _Group = group;

            group.ConnectedNodes.Added   += ConnectedNodes_Changed;
            group.ConnectedNodes.Removed += ConnectedNodes_Changed;
        }
Пример #24
0
 public void Dispose()
 {
     lock (l)
     {
         if (_Nodes != null)
         {
             _Nodes.Disconnect();
             _Nodes = null;
         }
         if (Repository != null)
         {
             Repository.Dispose();
             Repository = null;
         }
     }
 }
Пример #25
0
        private async Task StartConnecting()
        {
            await Task.Factory.StartNew(() =>
            {
                var parameters = new NodeConnectionParameters();
                parameters.TemplateBehaviors.Add(new AddressManagerBehavior(GetAddressManager()));
                parameters.TemplateBehaviors.Add(new ChainBehavior(GetChain()));
                parameters.TemplateBehaviors.Add(new TrackerBehavior(GetTracker()));
                if (!_disposed)
                {
                    _group = new NodesGroup(_settings.Network, parameters, new NodeRequirement()
                    {
                        RequiredServices = NodeServices.Network
                    });
                    _group.MaximumNodeConnection = 4;
                    _group.Connect();
                    _connectionParameters = parameters;
                }
            });

            //   PeriodicSave();


            _logger.Information("Configuring groups");
            _wallet.Configure(_group);
            if (_isNewWallet)
            {
                _logger.Information("New wallet, generating key pool ");
                //_wallet.GetNextScriptPubKey();
                GenerateNewAddress();
                SaveWallet();
            }
            _logger.Information("Connecting Wallet");
            PeriodicKick();
            _wallet.NewWalletTransaction += _wallet_NewWalletTransaction;

            _wallet.Connect();
            _logger.Information("Wallet connected");
            _lastHeight = CurrentHeight;
            //while (!_disposed)
            //{
            //    await Task.Delay(10000);
            //    _logger.Information($"Current Height {CurrentHeight}");
            //    _logger.Information($"Connected Nodes {ConnectedNodes.Count}");
            //    SaveAsync();
            //}
        }
Пример #26
0
 public Task StopAsync(CancellationToken cancellationToken)
 {
     _Disposed = true;
     _Cts.Cancel();
     _Subscription.Dispose();
     if (_Group != null)
     {
         _Group.ConnectedNodes.Added   -= ConnectedNodes_Changed;
         _Group.ConnectedNodes.Removed -= ConnectedNodes_Changed;
         _Group.Disconnect();
         _Group = null;
     }
     State  = BitcoinDWaiterState.NotStarted;
     _Chain = null;
     _Tick.Set();
     return(_Loop);
 }
Пример #27
0
        private static async Task WaitConnected(NodesGroup group)
        {
            TaskCompletionSource <bool>  tcs = new TaskCompletionSource <bool>();
            EventHandler <NodeEventArgs> waitingConnected = null;

            waitingConnected = (a, b) =>
            {
                tcs.TrySetResult(true);
                group.ConnectedNodes.Added -= waitingConnected;
            };
            group.ConnectedNodes.Added += waitingConnected;
            CancellationTokenSource cts = new CancellationTokenSource(5000);

            using (cts.Token.Register(() => tcs.TrySetCanceled()))
            {
                await tcs.Task;
            }
        }
        public void AddDiscoveredNodesRequirement(NodeServices services)
        {
            this.discoveredNodeRequiredService |= services;
            NodesGroup group = this.DiscoveredNodeGroup;

            if (group != null &&
                !group.Requirements.RequiredServices.HasFlag(services))
            {
                group.Requirements.RequiredServices |= NodeServices.NODE_WITNESS;
                foreach (Node node in group.ConnectedNodes)
                {
                    if (!node.PeerVersion.Services.HasFlag(services))
                    {
                        node.DisconnectAsync("The peer does not support the required services requirement");
                    }
                }
            }
        }
Пример #29
0
        private void SaveGroupInfo(UniGraph graphData)
        {
            graphData.nodeGroups.Clear();

            foreach (var groupView in groupViews)
            {
                var groupData = groupView.group;
                var groupInfo = new NodesGroup()
                {
                    color    = groupData.color,
                    position = groupData.position,
                    size     = groupData.size,
                    title    = groupData.title,
                    nodeIds  = GetNodesIdsByGuid(groupData.innerNodeGUIDs),
                };
                graphData.nodeGroups.Add(groupInfo);
            }
        }
Пример #30
0
        private static NodesGroup CreateGroup(IEnumerable <CoreNode> nodes, int connections)
        {
            AddressManagerBehavior behavior = new AddressManagerBehavior(new AddressManager());

            foreach (var node in nodes)
            {
                behavior.AddressManager.Add(new NetworkAddress(node.Endpoint), IPAddress.Parse("127.0.0.1"));
            }
            NodeConnectionParameters parameters = new NodeConnectionParameters();

            parameters.TemplateBehaviors.Add(behavior);
            Wallet.ConfigureDefaultNodeConnectionParameters(parameters);
            parameters.IsTrusted = true;
            NodesGroup connected = new NodesGroup(Network.RegTest, parameters);

            connected.AllowSameGroup        = true;
            connected.MaximumNodeConnection = connections;
            return(connected);
        }
Пример #31
0
		public NodesGroupBehavior(NodesGroup parent)
		{
			_Parent = parent;
		}