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