Beispiel #1
0
        public void CanSerializeAndDeserialize()
        {
            var factory = new PoAConsensusFactory();

            var headers = new List <PoABlockHeader>()
            {
                new PoABlockHeader()
                {
                    Version = 1
                },
                new PoABlockHeader()
                {
                    Version = 2
                },
                new PoABlockHeader()
                {
                    Version = 3
                }
            };

            var payload = new PoAHeadersPayload(headers);

            // Serialize.
            var memoryStream           = new MemoryStream();
            var bitcoinSerializeStream = new BitcoinStream(memoryStream, true)
            {
                ConsensusFactory = factory
            };

            payload.ReadWriteCore(bitcoinSerializeStream);

            // Deserialize.
            memoryStream.Seek(0, SeekOrigin.Begin);
            var bitcoinDeserializeStream = new BitcoinStream(memoryStream, false)
            {
                ConsensusFactory = factory
            };

            var deserializedPayload = new PoAHeadersPayload();

            deserializedPayload.ReadWriteCore(bitcoinDeserializeStream);

            Assert.Equal(payload.Headers.Count, deserializedPayload.Headers.Count);
        }
        /// <inheritdoc />
        /// <remarks>Creates <see cref="PoAHeadersPayload"/> instead of <see cref="HeadersPayload"/> like base implementation does.</remarks>
        protected override Payload ConstructHeadersPayload(GetHeadersPayload getHeadersPayload, out ChainedHeader lastHeader)
        {
            ChainedHeader fork = this.ChainIndexer.FindFork(getHeadersPayload.BlockLocator);

            lastHeader = null;

            if (fork == null)
            {
                this.logger.LogTrace("(-)[INVALID_LOCATOR]:null");
                return(null);
            }

            var headersPayload = new PoAHeadersPayload();

            foreach (ChainedHeader chainedHeader in this.ChainIndexer.EnumerateToTip(fork).Skip(1))
            {
                lastHeader = chainedHeader;

                if (chainedHeader.Header is PoABlockHeader header)
                {
                    headersPayload.Headers.Add(header);

                    if ((chainedHeader.HashBlock == getHeadersPayload.HashStop) || (headersPayload.Headers.Count == MaxItemsPerHeadersMessage))
                    {
                        break;
                    }
                }
                else
                {
                    throw new Exception("Not a PoA header!");
                }
            }

            this.logger.LogTrace("{0} headers were selected for sending, last one is '{1}'.", headersPayload.Headers.Count, headersPayload.Headers.LastOrDefault()?.GetHash());

            return(headersPayload);
        }