コード例 #1
0
ファイル: RemoteNode.cs プロジェクト: xqan/neo
        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));
        }
コード例 #2
0
        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)));
        }
コード例 #3
0
        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]);
        }
コード例 #4
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]);
        }
コード例 #5
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);
        }
コード例 #6
0
        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);
        }
コード例 #7
0
ファイル: ProtocolHandler.cs プロジェクト: ZoroChain/Zoro
        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)));
        }
コード例 #8
0
        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)));
        }