Пример #1
0
 public void CanMaintainChainWithChainBehavior()
 {
     using (var builder = NodeBuilder.Create())
     {
         var node = builder.CreateNode(true).CreateNodeClient();
         builder.Nodes[0].Generate(600);
         var rpc   = builder.Nodes[0].CreateRPCClient();
         var chain = node.GetChain(rpc.GetBlockHash(500));
         Assert.True(chain.Height == 500);
         using (var tester = new NodeServerTester(Network.RegTest))
         {
             var n1 = tester.Node1;
             n1.Behaviors.Add(new ChainBehavior(chain));
             n1.VersionHandshake();
             Assert.True(n1.MyVersion.StartHeight == 500);
             var n2 = tester.Node2;
             Assert.True(n2.MyVersion.StartHeight == 0);
             Assert.True(n2.PeerVersion.StartHeight == 500);
             Assert.True(n1.State == NodeState.HandShaked);
             Assert.True(n2.State == NodeState.HandShaked);
             var behavior = new ChainBehavior(new ConcurrentChain(Network.RegTest));
             n2.Behaviors.Add(behavior);
             TestUtils.Eventually(() => behavior.Chain.Height == 500);
             var chain2 = n2.GetChain(rpc.GetBlockHash(500));
             Assert.True(chain2.Height == 500);
             var chain1 = n1.GetChain(rpc.GetBlockHash(500));
             Assert.True(chain1.Height == 500);
             chain1 = n1.GetChain(rpc.GetBlockHash(499));
             Assert.True(chain1.Height == 499);
             Thread.Sleep(5000);
         }
     }
 }
Пример #2
0
 public void CanMaintainChainWithChainBehavior()
 {
     using (var node = Node.ConnectToLocal(Network.TestNet))
     {
         var chain = node.GetChain(uint256.Parse("00000000a2424460c992803ed44cfe0c0333e91af04fde9a6a97b468bf1b5f70"));
         Assert.True(chain.Height == 500);
         using (var tester = new NodeServerTester(Network.TestNet))
         {
             var n1 = tester.Node1;
             n1.Behaviors.Add(new ChainBehavior(chain));
             n1.VersionHandshake();
             Assert.True(n1.MyVersion.StartHeight == 500);
             var n2 = tester.Node2;
             Assert.True(n2.MyVersion.StartHeight == 0);
             Assert.True(n2.PeerVersion.StartHeight == 500);
             Assert.True(n1.State == NodeState.HandShaked);
             Assert.True(n2.State == NodeState.HandShaked);
             var behavior = new ChainBehavior(new ConcurrentChain(Network.TestNet));
             n2.Behaviors.Add(behavior);
             TestUtils.Eventually(() => behavior.Chain.Height == 500);
             var chain2 = n2.GetChain(uint256.Parse("00000000a2424460c992803ed44cfe0c0333e91af04fde9a6a97b468bf1b5f70"));
             Assert.True(chain2.Height == 500);
             var chain1 = n1.GetChain(uint256.Parse("00000000a2424460c992803ed44cfe0c0333e91af04fde9a6a97b468bf1b5f70"));
             Assert.True(chain1.Height == 500);
             chain1 = n1.GetChain(uint256.Parse("000000008cd4b1bdaa1278e3f1708258f862da16858324e939dc650627cd2e27"));
             Assert.True(chain1.Height == 499);
             Thread.Sleep(5000);
         }
     }
 }
Пример #3
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;
        }
Пример #4
0
        public override void Execute()
        {
            // register a behaviour, the ChainBehavior maintains
            // the chain of headers in sync with the network
            // before we loaded the headers don't sync the chain
            var chainBehavior = new ChainBehavior(this.Context.ChainIndex)
            {
                CanSync = false, CanRespondToGetHeaders = true
            };

            this.Context.ConnectionParameters.TemplateBehaviors.Add(chainBehavior);

            var blockSyncBehaviour = new BlockSyncBehaviour(this.blockReceiver.BlockSyncHub)
            {
                CanRespondToBlockPayload     = false,
                CanRespondToGetBlocksPayload = false,
                CanRespondToInvPayload       = false,
                CanRespondToHeadersPayload   = false
            };

            this.Context.ConnectionParameters.TemplateBehaviors.Add(blockSyncBehaviour);
        }
Пример #5
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(nameof(group));
            }

            var parameters = group.NodeConnectionParameters;

            group.Requirements.SupportSPV = true;

            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);
            }

#pragma warning disable CS0612 // Type or member is obsolete
            var tracker = parameters.TemplateBehaviors.Find <TrackerBehavior>();
#pragma warning restore CS0612 // Type or member is obsolete
            if (tracker == null)
            {
#pragma warning disable CS0612 // Type or member is obsolete
#pragma warning disable CS0612 // Type or member is obsolete
                tracker = new TrackerBehavior(new Tracker(), chain.Chain);
#pragma warning restore CS0612 // Type or member is obsolete
#pragma warning restore CS0612 // Type or member is obsolete
                parameters.TemplateBehaviors.Add(tracker);
            }
            var wallet = FindWalletBehavior(parameters.TemplateBehaviors);
            if (wallet == null)
            {
                wallet = new WalletBehavior(this);
                parameters.TemplateBehaviors.Add(wallet);
            }
            var broadcast = parameters.TemplateBehaviors.Find <BroadcastHubBehavior>();
            if (broadcast == null)
            {
                broadcast = new BroadcastHubBehavior();
                parameters.TemplateBehaviors.Add(broadcast);
            }

            _Group = group;
            if (_ListenedTracker != null)
            {
                _ListenedTracker.NewOperation -= _ListenerTracked_NewOperation;
            }
            _ListenedTracker = tracker.Tracker;
            _ListenedTracker.NewOperation += _ListenerTracked_NewOperation;
        }
Пример #6
0
        /// <summary>
        /// Connect the wallet with the given connection parameters
        /// </summary>
        /// <param name="group">The group to use</param>
        public void Connect(NodesGroup group)
        {
            if (group == null)
            {
                throw new ArgumentNullException("group");
            }
            if (State != WalletState.Created)
            {
                throw new InvalidOperationException("The wallet is already connecting or connected");
            }
            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);
            }

            _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);
            }
        }
Пример #7
0
        /// <summary>
        /// Builds main character with its base spritesheet and animations.
        /// </summary>
        public SlimeWorm()
            : base(spriteSheetPath, new Point(40, 34))
        {
            Category = "Enemy";

            TimeSpan stoppedFrameDuration = TimeSpan.FromMilliseconds(300);

            SpriteSheet.AddAnimation("stopped", "left", line: 3, frameDuration: stoppedFrameDuration);
            SpriteSheet.AddAnimation("stopped", "down", line: 2, frameDuration: stoppedFrameDuration);
            SpriteSheet.AddAnimation("stopped", "right", line: 1, frameDuration: stoppedFrameDuration);
            SpriteSheet.AddAnimation("stopped", "up", line: 0, frameDuration: stoppedFrameDuration);

            TimeSpan walkFrameDuration = TimeSpan.FromMilliseconds(100);

            SpriteSheet.AddAnimation("walking", "left", line: 3, frameDuration: walkFrameDuration);
            SpriteSheet.AddAnimation("walking", "down", line: 2, frameDuration: walkFrameDuration);
            SpriteSheet.AddAnimation("walking", "right", line: 1, frameDuration: walkFrameDuration);
            SpriteSheet.AddAnimation("walking", "up", line: 0, frameDuration: walkFrameDuration);

            SpriteSheet.AddAnimation("stopped-front", "left", line: 7, frameDuration: stoppedFrameDuration);
            SpriteSheet.AddAnimation("stopped-front", "down", line: 6, frameDuration: stoppedFrameDuration);
            SpriteSheet.AddAnimation("stopped-front", "right", line: 5, frameDuration: stoppedFrameDuration);
            SpriteSheet.AddAnimation("stopped-front", "up", line: 4, frameDuration: stoppedFrameDuration);

            SpriteSheet.AddAnimation("walking-front", "left", line: 7, frameDuration: walkFrameDuration);
            SpriteSheet.AddAnimation("walking-front", "down", line: 6, frameDuration: walkFrameDuration);
            SpriteSheet.AddAnimation("walking-front", "right", line: 5, frameDuration: walkFrameDuration);
            SpriteSheet.AddAnimation("walking-front", "up", line: 4, frameDuration: walkFrameDuration);

            //Padding = new Rectangle(6, 11, 6, 6);

            Speed = 32 * 6;

            _frontHealth  = new Container(8);
            _normalHealth = new Container(2);

            Health = _normalHealth;
            Look(new Vector2(0, 1), true);

            var chainBehavior = new ChainBehavior <SlimeWorm> {
                MaxDistance = 32 * 7
            };

            AddBehavior(
                new HitOnTouchBehavior(e => e.Category == "Player"),
                chainBehavior,
                new AvoidBehavior(e =>
            {
                if (e == this || chainBehavior.Following != e)
                {
                    return(false);
                }
                var beh = e.GetBehavior <ChainBehavior <SlimeWorm> >();
                return(beh != null && beh.Following == null);
            }),
                new SpiralAttackBehavior("Player", 32 * 8)
            {
                MaxDistance = 32 * 12
            },
                new WalkAroundBehavior {
                MaxStoppedTime = TimeSpan.Zero, MaxWalkingTime = TimeSpan.MaxValue, SpeedMultiplier = 1
            }
                );

            GetBehavior <DropItemsBehavior>().DropOnDeath((gameTime, level) =>
            {
                if (!level.GetEntities <SlimeWorm>().Any(e => e != this))
                {
                    return(new HealthContainer("SlimeWorm"));
                }
                return(null);
            });
        }
Пример #8
0
 public ChainExpr(Expr first, Expr next, ChainBehavior chainBehavior) : base(first.Location)
 {
     First          = first;
     Next           = next;
     _chainBehavior = chainBehavior;
 }