public async Task <BlockBody[]> BuildBlocksResponse(Keccak[] blockHashes, Response flags) { bool consistent = flags.HasFlag(Response.Consistent); bool validSeals = flags.HasFlag(Response.ValidSeals); bool noEmptySpaces = flags.HasFlag(Response.NoEmptySpace); bool justFirst = flags.HasFlag(Response.JustFirstHeader); bool allKnown = flags.HasFlag(Response.AllKnown); bool timeoutOnFullBatch = flags.HasFlag(Response.TimeoutOnFullBatch); if (timeoutOnFullBatch && blockHashes.Length == SyncBatchSize.Max) { throw new TimeoutException(); } BlockHeader startHeader = _blockTree.FindHeader(blockHashes[0], false); if (startHeader == null) { startHeader = Build.A.BlockHeader.WithHash(blockHashes[0]).TestObject; } BlockHeader[] blockHeaders = new BlockHeader[blockHashes.Length]; BlockBody[] blockBodies = new BlockBody[blockHashes.Length]; blockBodies[0] = new BlockBody(new Transaction[0], new BlockHeader[0]); blockHeaders[0] = startHeader; if (!justFirst) { for (int i = 1; i < blockHashes.Length; i++) { blockHeaders[i] = consistent ? Build.A.BlockHeader.WithParent(blockHeaders[i - 1]).TestObject : Build.A.BlockHeader.WithNumber(blockHeaders[i - 1].Number + 1).TestObject; _testHeaderMapping[startHeader.Number + i] = blockHeaders[i].Hash; Block block = consistent ? Build.A.Block.WithHeader(blockHeaders[i]).TestObject : Build.A.Block.WithHeader(blockHeaders[i - 1]).TestObject; blockBodies[i] = new BlockBody(block.Transactions, block.Ommers); if (allKnown) { _blockTree.SuggestBlock(block); } } } BlockBodiesMessage message = new BlockBodiesMessage(blockBodies); byte[] messageSerialized = _bodiesSerializer.Serialize(message); return(await Task.FromResult(_bodiesSerializer.Deserialize(messageSerialized).Bodies)); }
public void Roundtrip_with_nulls() { BlockBodiesMessage message = new BlockBodiesMessage { Bodies = new BlockBody[1] { null } }; BlockBodiesMessageSerializer serializer = new BlockBodiesMessageSerializer(); byte[] bytes = serializer.Serialize(message); BlockBodiesMessage deserialized = serializer.Deserialize(bytes); Assert.AreEqual(message.Bodies.Length, deserialized.Bodies.Length, "length"); }
public void Roundtrip() { BlockHeader header = Build.A.BlockHeader.TestObject; Transaction tx = Build.A.Transaction.SignedAndResolved(new EthereumSigner(RopstenSpecProvider.Instance, NullLogManager.Instance), TestObject.PrivateKeyA, 1).TestObject; BlockBodiesMessage message = new BlockBodiesMessage(); message.Bodies = new [] { new BlockBody(new [] { tx }, new [] { header }) }; BlockBodiesMessageSerializer serializer = new BlockBodiesMessageSerializer(); byte[] bytes = serializer.Serialize(message); byte[] expectedBytes = Bytes.FromHexString("f90265f90262f861f85f800182520894000000000000000000000000000000000000000101801ba0e82c81829818f96f1c53d0f283084f654d6207ccea2296122a365502c4782913a069f761f38649818a629edacc5fc0a269b4824a61356028ac4072acc9456d4f26f901fcf901f9a0ff483e972a04a9a62bb4b7d04ae403c615604e4090521ecc5bb7af67f71be09ca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000830f424080833d090080830f424083010203a02ba5557a4c62a513c7e56d1bf13373e0da6bec016755483e91589fe1c6d212e28800000000000003e8"); Assert.True(Bytes.AreEqual(bytes, expectedBytes), "bytes"); BlockBodiesMessage deserialized = serializer.Deserialize(bytes); Assert.AreEqual(message.Bodies.Length, deserialized.Bodies.Length, "length"); }