Ejemplo n.º 1
0
def test_restart_with_reorg(w3, eth_tester, block_fetcher, report_callback):
    coinbase1, coinbase2 = eth_tester.get_accounts()[:2]

    # mine some common blocks
    eth_tester.mine_blocks(2, coinbase=coinbase1)

    # point of fork
    fork_snapshot_id = eth_tester.take_snapshot()

    # mine some blocks on fork A
    early_fork_a_hashes = eth_tester.mine_blocks(2, coinbase=coinbase1)
    fork_a_tip_snapshot_id = eth_tester.take_snapshot()

    # mine on fork B
    eth_tester.revert_to_snapshot(fork_snapshot_id)
    eth_tester.mine_blocks(2, coinbase=coinbase2)

    # fetch common and fork B
    block_fetcher.fetch_and_insert_new_blocks()
    report_callback.reset_mock()

    # mine on fork A again
    eth_tester.revert_to_snapshot(fork_a_tip_snapshot_id)
    late_fork_a_hashes = eth_tester.mine_blocks(2, coinbase=coinbase1)

    # restart block fetcher
    restarted_block_fetcher = BlockFetcher(state=block_fetcher.state,
                                           w3=w3,
                                           db=block_fetcher.db)
    restarted_block_fetcher.register_report_callback(report_callback)
    restarted_block_fetcher.fetch_and_insert_new_blocks()
    assert report_callback.call_args_list == [
        call(w3.eth.getBlock(h))
        for h in early_fork_a_hashes + late_fork_a_hashes
    ]
Ejemplo n.º 2
0
def test_restart_with_fetch(w3, eth_tester, block_fetcher, report_callback):
    new_block_hashes = [0]  # genesis
    new_block_hashes.extend(eth_tester.mine_blocks(6))
    reports = [call(w3.eth.getBlock(h)) for h in new_block_hashes]
    block_fetcher.fetch_and_insert_new_blocks(max_number_of_blocks=4)

    restarted_block_fetcher = BlockFetcher(block_fetcher.state, w3,
                                           block_fetcher.db)
    restarted_block_fetcher.register_report_callback(report_callback)
    restarted_block_fetcher.fetch_and_insert_new_blocks(max_number_of_blocks=3)

    assert report_callback.call_args_list == reports
Ejemplo n.º 3
0
def test_restart(w3, eth_tester, block_fetcher, report_callback):
    eth_tester.mine_blocks(3)
    block_fetcher.fetch_and_insert_new_blocks()
    report_callback.reset_mock()

    new_block_hashes = eth_tester.mine_blocks(3)
    reports = [call(w3.eth.getBlock(h)) for h in new_block_hashes]
    restarted_block_fetcher = BlockFetcher(block_fetcher.state, w3,
                                           block_fetcher.db)
    restarted_block_fetcher.register_report_callback(report_callback)
    restarted_block_fetcher.fetch_and_insert_new_blocks()

    assert report_callback.call_args_list == reports
Ejemplo n.º 4
0
    def _initialize_reporters(self, app_state, skip_rate, offline_window_size):
        if not isinstance(app_state, AppStateV2):
            raise InvalidAppStateException()

        self.block_fetcher = BlockFetcher(
            state=app_state.block_fetcher_state,
            w3=self.w3,
            db=self.db,
            max_reorg_depth=MAX_REORG_DEPTH,
            initial_block_resolver=self.initial_block_resolver,
        )
        self.skip_reporter = SkipReporter(
            state=app_state.skip_reporter_state,
            primary_oracle=self.primary_oracle,
            grace_period=GRACE_PERIOD,
        )
        self.offline_reporter = OfflineReporter(
            state=app_state.offline_reporter_state,
            primary_oracle=self.primary_oracle,
            offline_window_size=offline_window_size,
            allowed_skip_rate=skip_rate,
        )
        self.equivocation_reporter = EquivocationReporter(db=self.db)