Пример #1
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);
     }
 }
Пример #2
0
        /// <summary>
        /// Connect the wallet with the given connection parameters
        /// </summary>
        /// <param name="parameters"></param>
        public void Connect(NodeConnectionParameters parameters)
        {
            if (State != WalletState.Created)
            {
                throw new InvalidOperationException("The wallet is already connecting or connected");
            }
            var group = NodesGroup.GetNodeGroup(parameters);

            if (group == null)
            {
                group = new NodesGroup(_Parameters.Network, parameters);
            }
            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);
            }

            _Chain           = chain.Chain;
            _AddressManager  = addrman.AddressManager;
            _Tracker         = tracker.Tracker;
            _TrackerBehavior = tracker;
            _Group           = group;
            if (AddKnownScriptToTracker())
            {
                _Group.Purge("Bloom filter renew");
            }
            _State = WalletState.Disconnected;
            _Group.Connect();
            _Group.ConnectedNodes.Added   += ConnectedNodes_Added;
            _Group.ConnectedNodes.Removed += ConnectedNodes_Added;
            foreach (var node in _Group.ConnectedNodes)
            {
                node.Behaviors.Find <TrackerBehavior>().Scan(_ScanLocation, Created);
            }
        }