private void OnGetHeadersMessageReceived(GetBlocksPayload payload) { if (!localNode.ServiceEnabled) { return; } if (Blockchain.Default == null) { return; } UInt256 hash = payload.HashStart.Select(p => Blockchain.Default.GetHeader(p)).Where(p => p != null).OrderBy(p => p.Index).Select(p => p.Hash).FirstOrDefault(); if (hash == null || hash == payload.HashStop) { return; } List <Header> headers = new List <Header>(); do { hash = Blockchain.Default.GetNextBlockHash(hash); if (hash == null) { break; } headers.Add(Blockchain.Default.GetHeader(hash)); } while (hash != payload.HashStop && headers.Count < 2000); EnqueueMessage("headers", HeadersPayload.Create(headers)); }
private void OnGetHeadersMessageReceived(GetBlocksPayload payload) { UInt256 hash = payload.HashStart; int count = payload.Count < 0 ? HeadersPayload.MaxHeadersCount : payload.Count; DataCache <UInt256, TrimmedBlock> cache = Blockchain.Singleton.Store.GetBlocks(); TrimmedBlock state = cache.TryGet(hash); if (state == null) { return; } List <Header> headers = new List <Header>(); for (uint i = 1; i <= count; i++) { uint index = state.Index + i; hash = Blockchain.Singleton.GetBlockHash(index); if (hash == null) { break; } Header header = cache.TryGet(hash)?.Header; if (header == null) { break; } headers.Add(header); } if (headers.Count == 0) { return; } Context.Parent.Tell(Message.Create(MessageCommand.Headers, HeadersPayload.Create(headers))); }
public void DeserializeAndSerialize() { var header = new Header(); TestUtils.SetupHeaderWithValues(header, UInt256.Zero, out _, out _, out _, out _, out _, out _); var test = HeadersPayload.Create(header); var clone = test.ToArray().AsSerializable <HeadersPayload>(); Assert.AreEqual(test.Headers.Length, clone.Headers.Length); Assert.AreEqual(test.Headers[0], clone.Headers[0]); }
public void DeserializeAndSerialize() { var header = new Header(); TestUtils.SetupHeaderWithValues(header, UInt256.Zero, out UInt256 merkRoot, out UInt160 val160, out ulong timestampVal, out uint indexVal, out Witness scriptVal); var test = HeadersPayload.Create(header); var clone = test.ToArray().AsSerializable <HeadersPayload>(); Assert.AreEqual(test.Headers.Length, clone.Headers.Length); Assert.AreEqual(test.Headers[0], clone.Headers[0]); }
public void Size_Get() { var header = new Header(); TestUtils.SetupHeaderWithValues(header, UInt256.Zero, out _, out _, out _, out _, out _, out _); var test = HeadersPayload.Create(); test.Size.Should().Be(1); test = HeadersPayload.Create(header); test.Size.Should().Be(1 + header.Size); }
public void Size_Get() { var header = new Header(); TestUtils.SetupHeaderWithValues(header, UInt256.Zero, out UInt256 merkRoot, out UInt160 val160, out ulong timestampVal, out uint indexVal, out Witness scriptVal); var test = HeadersPayload.Create(); test.Size.Should().Be(1); test = HeadersPayload.Create(header); test.Size.Should().Be(1 + header.Size); }
private void OnGetHeadersMessageReceived(Message msg) { GetBlocksPayload payload = msg.GetPayload <GetBlocksPayload>(); UInt256 hash = payload.HashStart[0]; if (hash == payload.HashStop) { return; } DataCache <UInt256, BlockState> cache = blockchain.Store.GetBlocks(); BlockState state = cache.TryGet(hash); if (state == null) { return; } List <Header> headers = new List <Header>(); for (uint i = 1; i <= HeadersPayload.MaxHeadersCount; i++) { uint index = state.TrimmedBlock.Index + i; hash = blockchain.GetBlockHash(index); if (hash == null) { break; } if (hash == payload.HashStop) { break; } Header header = cache.TryGet(hash)?.TrimmedBlock.Header; if (header == null) { break; } headers.Add(header); } blockchain.Log($"OnGetHeaders, blockIndex:{state.TrimmedBlock.Index}, count:{headers.Count}, [{remoteNode.Remote.Address}]"); if (headers.Count == 0) { return; } Context.Parent.Tell(Message.Create(MessageType.Headers, HeadersPayload.Create(headers))); }
private void OnGetHeadersMessageReceived(GetBlocksPayload payload) { UInt256 hash = payload.HashStart[0]; if (hash == payload.HashStop) { return; } DataCache <UInt256, BlockState> cache = blockchain.Store.GetBlocks(); BlockState state = cache.TryGet(hash); if (state == null) { return; } List <Header> headers = new List <Header>(); for (uint i = 1; i <= HeadersPayload.MaxHeadersCount; i++) { uint index = state.TrimmedBlock.Index + i; hash = blockchain.GetBlockHash(index); if (hash == null) { break; } Header header = cache.TryGet(hash)?.TrimmedBlock.Header; if (header == null) { break; } headers.Add(header); } if (headers.Count == 0) { return; } Context.Parent.Tell(Message.Create("headers", HeadersPayload.Create(headers))); }