Example #1
0
    def _init_step_cost() -> dict:
        raw_step_costs = {
            governance.STEP_TYPE_DEFAULT: 4000,
            governance.STEP_TYPE_CONTRACT_CALL: 1500,
            governance.STEP_TYPE_CONTRACT_CREATE: 20000,
            governance.STEP_TYPE_CONTRACT_UPDATE: 8000,
            governance.STEP_TYPE_CONTRACT_DESTRUCT: -7000,
            governance.STEP_TYPE_CONTRACT_SET: 1000,
            governance.STEP_TYPE_GET: 5,
            governance.STEP_TYPE_SET: 20,
            governance.STEP_TYPE_REPLACE: 5,
            governance.STEP_TYPE_DELETE: -15,
            governance.STEP_TYPE_INPUT: 20,
            governance.STEP_TYPE_EVENT_LOG: 10,
            governance.STEP_TYPE_API_CALL: 10000
        }
        step_costs = {}

        for key, value in raw_step_costs.items():
            try:
                step_costs[StepType(key)] = value
            except ValueError:
                # Pass the unknown step type
                pass

        # return IconScoreStepCounter(step_costs, 5000000, 0)
        return step_costs
    def test_out_of_step(self):
        tx_hash = bytes.hex(create_tx_hash())
        from_ = create_address(AddressPrefix.EOA)
        to_ = create_address(AddressPrefix.CONTRACT)

        request = create_request([ReqData(tx_hash, from_, to_, 'call', {})])

        # noinspection PyUnusedLocal
        def intercept_invoke(*args, **kwargs):
            ContextContainer._push_context(args[0])
            context_db = self._inner_task._icon_service_engine._icx_context_db
            score = SampleScore(IconScoreDatabase(to_, context_db))
            score.hash_writable()

        score_engine_invoke = Mock(side_effect=intercept_invoke)
        self._inner_task._icon_service_engine._validate_score_blacklist = Mock(
        )
        self._inner_task._icon_service_engine. \
            _icon_score_engine.invoke = score_engine_invoke

        raw_step_costs = {
            governance.STEP_TYPE_DEFAULT: 4000,
            governance.STEP_TYPE_CONTRACT_CALL: 1500,
            governance.STEP_TYPE_CONTRACT_CREATE: 20000,
            governance.STEP_TYPE_CONTRACT_UPDATE: 8000,
            governance.STEP_TYPE_CONTRACT_DESTRUCT: -7000,
            governance.STEP_TYPE_CONTRACT_SET: 1000,
            governance.STEP_TYPE_GET: 5,
            governance.STEP_TYPE_SET: 20,
            governance.STEP_TYPE_REPLACE: 5,
            governance.STEP_TYPE_DELETE: -15,
            governance.STEP_TYPE_INPUT: 20,
            governance.STEP_TYPE_EVENT_LOG: 10,
            governance.STEP_TYPE_API_CALL: 0
        }
        step_costs = {}

        factory = self._inner_task._icon_service_engine._step_counter_factory

        for key, value in raw_step_costs.items():
            try:
                step_costs[StepType(key)] = value
            except ValueError:
                # Pass the unknown step type
                pass

        self.step_counter = IconScoreStepCounter(step_costs, 100, 0)
        factory.create = Mock(return_value=self.step_counter)

        self._inner_task._icon_service_engine._icon_score_mapper.get_icon_score = Mock(
            return_value=None)
        result = self._inner_task._invoke(request)
        self.assertTrue(result['txResults'][tx_hash]['failure']
                        ['message'].startswith("Out of step"))
Example #3
0
    def test_set_step_costs(self):
        governance_score = Mock()
        governance_score.getStepCosts = Mock(
            return_value={
                governance.STEP_TYPE_DEFAULT: 4000,
                governance.STEP_TYPE_CONTRACT_CALL: 1500,
                governance.STEP_TYPE_CONTRACT_CREATE: 20000,
                governance.STEP_TYPE_CONTRACT_UPDATE: 8000,
                governance.STEP_TYPE_CONTRACT_DESTRUCT: -7000,
                governance.STEP_TYPE_CONTRACT_SET: 1000,
                governance.STEP_TYPE_GET: 5,
                governance.STEP_TYPE_SET: 20,
                governance.STEP_TYPE_REPLACE: 5,
                governance.STEP_TYPE_DELETE: -15,
                governance.STEP_TYPE_INPUT: 20,
                governance.STEP_TYPE_EVENT_LOG: 10
            })

        step_counter_factory = IconScoreStepCounterFactory()
        step_costs = governance_score.getStepCosts()

        for key, value in step_costs.items():
            try:
                step_counter_factory.set_step_cost(StepType(key), value)
            except ValueError:
                pass

        self.assertEqual(4000,
                         step_counter_factory.get_step_cost(StepType.DEFAULT))
        self.assertEqual(
            1500, step_counter_factory.get_step_cost(StepType.CONTRACT_CALL))
        self.assertEqual(
            20000,
            step_counter_factory.get_step_cost(StepType.CONTRACT_CREATE))
        self.assertEqual(
            8000, step_counter_factory.get_step_cost(StepType.CONTRACT_UPDATE))
        self.assertEqual(
            -7000,
            step_counter_factory.get_step_cost(StepType.CONTRACT_DESTRUCT))
        self.assertEqual(
            1000, step_counter_factory.get_step_cost(StepType.CONTRACT_SET))
        self.assertEqual(5, step_counter_factory.get_step_cost(StepType.GET))
        self.assertEqual(20, step_counter_factory.get_step_cost(StepType.SET))
        self.assertEqual(5,
                         step_counter_factory.get_step_cost(StepType.REPLACE))
        self.assertEqual(-15,
                         step_counter_factory.get_step_cost(StepType.DELETE))
        self.assertEqual(20,
                         step_counter_factory.get_step_cost(StepType.INPUT))
        self.assertEqual(
            10, step_counter_factory.get_step_cost(StepType.EVENT_LOG))
Example #4
0
def settable_inv_container():
    default_service_config: int = 0
    default_step_costs = {
        'default': 1_000_000,
        'contractCall': 15_000,
        'contractCreate': 200_000,
        'contractUpdate': 80_000,
        'contractDestruct': -70_000,
        'contractSet': 30_000,
        'get': 0,
        'set': 200,
        'replace': 50,
        'delete': -150,
        'input': 200,
        'eventLog': 100,
        'apiCall': 0
    }
    default_step_costs = {
        StepType(key): val
        for key, val in default_step_costs.items()
    }

    default_max_step_limits: dict = {
        IconScoreContextType.INVOKE: 2_500_000_000,
        IconScoreContextType.QUERY: 50_000_000
    }
    default_step_price: int = 0
    default_score_black_list: list = []
    default_import_white_list = {"iconservice": ['*']}
    inv_container = INVContainer(is_migrated=False)
    inv_container._icon_network_values = {
        IconNetworkValueType.REVISION_CODE:
        RevisionCode(0),
        IconNetworkValueType.SCORE_BLACK_LIST:
        ScoreBlackList(default_score_black_list),
        IconNetworkValueType.STEP_PRICE:
        StepPrice(default_step_price),
        IconNetworkValueType.STEP_COSTS:
        StepCosts(default_step_costs),
        IconNetworkValueType.MAX_STEP_LIMITS:
        MaxStepLimits(default_max_step_limits),
        IconNetworkValueType.SERVICE_CONFIG:
        ServiceConfig(default_service_config),
        IconNetworkValueType.IMPORT_WHITE_LIST:
        ImportWhiteList(default_import_white_list)
    }
    return inv_container
    def check_inv(self, is_migrated):
        # Actual test code
        """Service Config"""
        # TEST: service config should be same between icon-service and governance
        gs_service_config: dict = self._get_service_config()
        is_service_flag: int = self._get_inv_from_is(
            IconNetworkValueType.SERVICE_CONFIG)
        is_service_config: dict = self._convert_service_config_from_int_to_dict(
            is_service_flag)
        assert gs_service_config == is_service_config
        """Step Price"""
        # TEST: Step price should be same between icon-service and governance
        gs_step_price: int = self._get_step_price()
        is_step_price = self._get_inv_from_is(IconNetworkValueType.STEP_PRICE)

        assert is_step_price == gs_step_price

        # TEST: When update the step price, icon service should update accordingly
        expected_step_price: int = randint(10, 20)

        self._set_step_price(expected_step_price, is_migrated)
        gs_step_price: int = self._get_step_price()
        is_step_price = self._get_inv_from_is(IconNetworkValueType.STEP_PRICE)

        assert is_step_price == gs_step_price == expected_step_price
        """Step Costs"""
        # TEST: Step costs should be same between icon-service and governance
        gs_step_costs = self._get_step_costs()
        is_step_costs = ValueConverter.convert_for_governance(
            IconNetworkValueType.STEP_COSTS,
            self._get_inv_from_is(IconNetworkValueType.STEP_COSTS))

        assert is_step_costs == gs_step_costs

        # TEST: When update the step costs, icon service should update accordingly
        for step_type in StepType:
            type_: str = step_type.value
            expected_costs = randint(10, 100)

            self._set_step_costs(type_,
                                 expected_costs,
                                 is_migrated=is_migrated)

            gs_step_costs = self._get_step_costs()
            is_step_costs = self._get_inv_from_is(
                IconNetworkValueType.STEP_COSTS)

            assert gs_step_costs[type_] == is_step_costs[StepType(
                type_)] == expected_costs
        """Max Step Limits"""
        # TEST: Max step limits should be same between icon-service and governance
        gs_invoke_max_step_limit = self._get_max_step_limit("invoke")
        gs_query_max_step_limit = self._get_max_step_limit("query")
        is_max_step_limit = self._get_inv_from_is(
            IconNetworkValueType.MAX_STEP_LIMITS)

        assert is_max_step_limit[
            IconScoreContextType.INVOKE] == gs_invoke_max_step_limit
        assert is_max_step_limit[
            IconScoreContextType.QUERY] == gs_query_max_step_limit

        # TEST: When update the max step limits, icon service should update accordingly
        invoke_type: str = "invoke"
        query_type: str = "query"
        expected_invoke_value = randint(2_600_000_000, 2_700_000_000)
        expected_query_value = randint(60_000_000, 70_000_000)

        self._set_max_step_limit(invoke_type, expected_invoke_value,
                                 is_migrated)
        self._set_max_step_limit(query_type, expected_query_value, is_migrated)

        gs_invoke_max_step_limit = self._get_max_step_limit("invoke")
        gs_query_max_step_limit = self._get_max_step_limit("query")
        is_max_step_limit = self._get_inv_from_is(
            IconNetworkValueType.MAX_STEP_LIMITS)

        assert is_max_step_limit[
            IconScoreContextType.
            INVOKE] == gs_invoke_max_step_limit == expected_invoke_value
        assert is_max_step_limit[
            IconScoreContextType.
            QUERY] == gs_query_max_step_limit == expected_query_value
        """Revision"""
        # TEST: Revision should be same between icon-service and governance
        gs_revision = self._get_revision()
        is_revision_code = self._get_inv_from_is(
            IconNetworkValueType.REVISION_CODE)
        is_revision_name = self._get_inv_from_is(
            IconNetworkValueType.REVISION_NAME)

        assert is_revision_code == gs_revision['code']
        assert is_revision_name == gs_revision['name']

        # TEST: When update the revision, icon service should update accordingly
        expected_revision_value = Revision.IISS.value
        expected_revision_name = f"1.1.{Revision.IISS.value}"

        self._set_revision(expected_revision_value, is_migrated)

        gs_revision = self._get_revision()
        is_revision_code = self._get_inv_from_is(
            IconNetworkValueType.REVISION_CODE)
        is_revision_name = self._get_inv_from_is(
            IconNetworkValueType.REVISION_NAME)

        assert is_revision_code == gs_revision[
            'code'] == expected_revision_value
        assert is_revision_name == gs_revision['name'] == expected_revision_name
        """Score Black List"""
        # TEST: Score black list should be same between icon-service and governance
        expected_is_in_black_list: bool = False
        score_address: 'Address' = create_address(AddressPrefix.CONTRACT)

        gs_is_in_black_list = self._is_in_score_black_list(score_address)
        is_is_in_black_list = score_address in self._get_inv_from_is(
            IconNetworkValueType.SCORE_BLACK_LIST)

        assert is_is_in_black_list == gs_is_in_black_list == expected_is_in_black_list

        # TEST: When update the Score black list, icon service should update accordingly
        expected_is_in_black_list: bool = True

        self._add_to_score_black_list(score_address, is_migrated)
        gs_is_in_black_list = self._is_in_score_black_list(score_address)
        is_is_in_black_list = score_address in self._get_inv_from_is(
            IconNetworkValueType.SCORE_BLACK_LIST)

        assert is_is_in_black_list == gs_is_in_black_list == expected_is_in_black_list
        """Import White List"""
        # TEST: Import white list should be same between icon-service and governance
        expected_is_in_import_list: bool = False
        import_stmt = "{'os': ['path']}"
        is_import_list = self._get_inv_from_is(
            IconNetworkValueType.IMPORT_WHITE_LIST)

        gs_is_in_import_list = self._is_in_import_white_list(import_stmt)
        is_is_in_import_list = is_import_list.get('os', None) is not None

        assert is_is_in_import_list == gs_is_in_import_list == expected_is_in_import_list

        # TEST: When add import white list, icon service should update accordingly
        # After governance 0.0.6, adding import white list is removed. So do not test after migration
        if not is_migrated:
            expected_is_in_import_list: bool = True

            self._add_import_white_list(import_stmt, is_migrated)
            gs_is_in_import_list = self._is_in_import_white_list(import_stmt)
            is_is_in_import_list = \
                self._get_inv_from_is(IconNetworkValueType.IMPORT_WHITE_LIST).get('os', None) is not None

            assert is_is_in_import_list == gs_is_in_import_list == expected_is_in_import_list

            # Remove added import white list (kind of tear down)
            self._remove_import_white_list(import_stmt)