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); } } }
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); } } }
/// <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; }
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); }
/// <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; }
/// <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); } }
/// <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); }); }
public ChainExpr(Expr first, Expr next, ChainBehavior chainBehavior) : base(first.Location) { First = first; Next = next; _chainBehavior = chainBehavior; }