private void PrepareReceiptsResponse(ReceiptsSyncBatch receiptSyncBatch, LatencySyncPeerMock syncPeer, IBlockTree tree)
 {
     receiptSyncBatch.Response = new TxReceipt[receiptSyncBatch.Request.Length][];
     for (int i = 0; i < receiptSyncBatch.Request.Length; i++)
     {
         Block block = tree.FindBlock(receiptSyncBatch.Request[i], false);
         receiptSyncBatch.Response[i] = new TxReceipt[block.Transactions.Length];
         for (int j = 0; j < block.Transactions.Length; j++)
         {
             receiptSyncBatch.Response[i][j] = _remoteReceiptStorage.Find(block.Transactions[j].Hash);
         }
     }
 }
示例#2
0
        private void PrepareReceiptsResponse(ReceiptsSyncBatch receiptSyncBatch, LatencySyncPeerMock syncPeer, IBlockTree tree)
        {
            receiptSyncBatch.Response = new TxReceipt[receiptSyncBatch.Request.Length][];
            for (int i = 0; i < receiptSyncBatch.Request.Length; i++)
            {
                Block block = tree.FindBlock(receiptSyncBatch.Request[i], BlockTreeLookupOptions.None);
                receiptSyncBatch.Response[i] = new TxReceipt[block.Transactions.Length];
                for (int j = 0; j < block.Transactions.Length; j++)
                {
                    receiptSyncBatch.Response[i][j] = _remoteReceiptStorage.Find(block.Transactions[j].Hash);

                    if (i < 10 && j == 0 && _maliciousByInvalidReceipts.Contains(syncPeer))
                    {
                        receiptSyncBatch.Response[i][j]                      = new TxReceipt();
                        receiptSyncBatch.Response[i][j].StatusCode           = (byte)(1 - receiptSyncBatch.Response[i][j].StatusCode);
                        receiptSyncBatch.Response[i][j].PostTransactionState = Keccak.Compute(receiptSyncBatch.Response[i][j].PostTransactionState?.Bytes ?? new byte[] { 1 });
                    }
                }
            }
        }
        private void AssertTreeSynced(IBlockTree tree, bool bodiesSync = false, bool receiptSync = false)
        {
            Keccak nextHash = tree.Head.Hash;

            for (int i = 0; i < tree.Head.Number; i++)
            {
                BlockHeader header = _localBlockTree.FindHeader(nextHash, BlockTreeLookupOptions.None);
                Assert.NotNull(header, $"header {tree.Head.Number - i}");
                if (bodiesSync)
                {
                    Block expectedBlock = _localBlockTree.FindBlock(nextHash, BlockTreeLookupOptions.None);
                    Assert.AreEqual(nextHash, expectedBlock?.Hash, $"hash difference {tree.Head.Number - i}");
                    if (expectedBlock != null)
                    {
                        Block actualBlock = tree.FindBlock(expectedBlock.Hash, BlockTreeLookupOptions.None);
                        Rlp   saved       = Rlp.Encode(actualBlock);
                        Rlp   expected    = Rlp.Encode(expectedBlock);
                        Assert.AreEqual(expected, saved, $"body {tree.Head.Number - i}");

                        if (receiptSync)
                        {
                            int txIndex = 0;
                            foreach (Transaction transaction in expectedBlock.Transactions)
                            {
                                Assert.NotNull(_localReceiptStorage.Find(transaction.Hash), $"receipt {expectedBlock.Number}.{txIndex}");
                                txIndex++;
                            }
                        }
                    }
                }

                nextHash = header.ParentHash;
            }

            Assert.True(_feed.IsFinished);
        }