Beispiel #1
0
            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));
            }
Beispiel #2
0
        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");
        }
Beispiel #3
0
        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");
        }