Пример #1
0
    async def test_eth_transaction_receipts_feed_default_subscribe(self):
        self.gateway_node.opts.eth_ws_uri = f"ws://{constants.LOCALHOST}:8005"
        self.gateway_node.feed_manager.register_feed(
            EthTransactionReceiptsFeed(self.gateway_node, 0))
        self.gateway_node.eth_ws_proxy_publisher = MockEthWsProxyPublisher(
            "", None, None, self.gateway_node)
        receipt_result = {
            "blockHash":
            "0xe6f67c6948158c45dct10b169ad6bf3a96c6402489733a03051feaf7d09e7b54",
            "blockNumber": "0xaf25e5",
            "cumulativeGasUsed": "0xbdb9ae",
            "from": "0x82170dd1cec50107963bf1ba1e80955ea302c5ce",
            "gasUsed": "0x5208",
            "logs": [],
            "logsBloom":
            "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
            "status": "0x1",
            "to": "0xa09f63d9a0b0fbe89e41e51282ad660e7c876165",
            "transactionHash":
            "0xbcdc5b22bf463f9b8766dd61cc133caf13472b6ae8474061134d9dc2983625f6",
            "transactionIndex": "0x90"
        }
        self.gateway_node.eth_ws_proxy_publisher.call_rpc = AsyncMock(
            return_value=JsonRpcResponse(request_id=1, result=receipt_result))
        block = mock_eth_messages.get_dummy_block(5)
        internal_block_info = InternalEthBlockInfo.from_new_block_msg(
            NewBlockEthProtocolMessage(None, block, 1))
        eth_raw_block_1 = EthRawBlock(1, internal_block_info.block_hash(),
                                      FeedSource.BLOCKCHAIN_RPC,
                                      get_block_message_lazy(None))
        eth_raw_block_2 = EthRawBlock(
            1, internal_block_info.block_hash(), FeedSource.BLOCKCHAIN_SOCKET,
            get_block_message_lazy(internal_block_info))

        async with WsProvider(self.ws_uri) as ws:
            subscription_id = await ws.subscribe(
                rpc_constants.ETH_TRANSACTION_RECEIPTS_FEED_NAME)

            self.gateway_node.feed_manager.publish_to_feed(
                FeedKey(rpc_constants.ETH_TRANSACTION_RECEIPTS_FEED_NAME),
                eth_raw_block_1)
            self.gateway_node.feed_manager.publish_to_feed(
                FeedKey(rpc_constants.ETH_TRANSACTION_RECEIPTS_FEED_NAME),
                eth_raw_block_2)

            for i in range(len(block.transactions)):
                subscription_message = await ws.get_next_subscription_notification_by_id(
                    subscription_id)
                self.assertEqual(subscription_id,
                                 subscription_message.subscription_id)
                self.assertEqual(subscription_message.notification,
                                 {"receipt": receipt_result})
Пример #2
0
 def generate_raw_block_msg(self,
                            block_number=10,
                            source=FeedSource.BLOCKCHAIN_SOCKET):
     block_msg = self.generate_new_eth_block(block_number)
     return EthRawBlock(block_msg.block_number(), block_msg.block_hash(),
                        source,
                        self.node._get_block_message_lazy(block_msg, None))
Пример #3
0
    async def test_publish_block_no_subscribers(self):
        self.sut.serialize = MagicMock(wraps=self.sut.serialize)
        block_message = self.generate_new_eth_block()
        internal_block_message = InternalEthBlockInfo.from_new_block_msg(
            block_message)
        self.sut.publish(
            EthRawBlock(block_message.number(), block_message.block_hash(),
                        FeedSource.BLOCKCHAIN_SOCKET,
                        iter([internal_block_message])))

        self.sut.serialize.assert_not_called()
Пример #4
0
    async def test_publish_from_internal_block(self):
        subscriber = self.sut.subscribe({})

        block_message = self.generate_new_eth_block()
        internal_block_message = InternalEthBlockInfo.from_new_block_msg(
            block_message)
        block_hash_str = f"0x{str(internal_block_message.block_hash())}"
        self.sut.publish(
            EthRawBlock(block_message.number(), block_message.block_hash(),
                        FeedSource.BLOCKCHAIN_SOCKET,
                        iter([internal_block_message])))
        received_block = await subscriber.receive()
        self._verify_block(block_hash_str, received_block)
Пример #5
0
 def publish_blocks_from_queue(self, start_block_height,
                               end_block_height) -> Set[int]:
     missing_blocks = set()
     for block_number in range(start_block_height, end_block_height):
         block_hash = self.node.block_queuing_service.accepted_block_hash_at_height.contents.get(
             block_number)
         if block_hash:
             self.publish(
                 EthRawBlock(
                     block_number, block_hash, FeedSource.BDN_INTERNAL,
                     self.node._get_block_message_lazy(None, block_hash)))
         else:
             missing_blocks.add(block_number)
     return missing_blocks
Пример #6
0
 def publish_block(self, block_number: Optional[int],
                   block_hash: Sha256Hash,
                   block_message: Optional[InternalEthBlockInfo],
                   source: FeedSource) -> None:
     if block_number is None and block_message is not None:
         block_number = block_message.block_number()
     logger.debug(
         "Handle block notification for feed. Number: {}, Hash: {} Msg: {} From: {}",
         block_number, block_hash, block_message, source)
     if block_number and self.opts.ws:
         raw_block = EthRawBlock(
             block_number, block_hash, source,
             self._get_block_message_lazy(block_message, block_hash))
         self._publish_block_to_on_block_feed(raw_block)
         self._publish_block_to_new_block_feed(raw_block)