コード例 #1
0
    def test_put_deploy_info(self):
        context = Mock(spec=IconScoreContext)
        score_address = create_address(1)
        deploy_info = IconScoreDeployInfo(score_address, DeployState.INACTIVE,
                                          create_address(), ZERO_TX_HASH,
                                          create_tx_hash())
        self.storage._create_db_key = Mock(
            return_value=score_address.to_bytes())
        self.storage._db.put = Mock()

        self.storage.put_deploy_info(context, deploy_info)
        self.storage._db.put.assert_called_once_with(context,
                                                     score_address.to_bytes(),
                                                     deploy_info.to_bytes())
コード例 #2
0
    def test_deploy_info_from_bytes_to_bytes_none_check(self):
        score_address = create_address(1)
        owner_address = create_address()
        tx_hash1 = create_tx_hash()
        tx_hash2 = ZERO_TX_HASH
        deploy_state = DeployState.INACTIVE

        info1 = IconScoreDeployInfo(score_address, deploy_state, owner_address,
                                    tx_hash1, tx_hash2)

        data = IconScoreDeployInfo.to_bytes(info1)
        self.assertTrue(isinstance(data, bytes))

        info2 = IconScoreDeployInfo.from_bytes(data)
        self.assertEqual(info2.score_address, score_address)
        self.assertEqual(info2.deploy_state, deploy_state)
        self.assertEqual(info2.owner, owner_address)
        self.assertEqual(info2.current_tx_hash, tx_hash1)
        self.assertEqual(info2.next_tx_hash, tx_hash2)
コード例 #3
0
    def test_get_deploy_info(self):
        context = Mock(spec=IconScoreContext)

        score_address = create_address(1)
        self.storage._create_db_key = Mock(
            return_value=score_address.to_bytes())
        self.storage._db.get = Mock(return_value=None)
        self.assertEqual(None,
                         self.storage.get_deploy_info(context, score_address))

        score_address = create_address(1)
        deploy_info = IconScoreDeployInfo(score_address, DeployState.INACTIVE,
                                          create_address(), ZERO_TX_HASH,
                                          create_tx_hash())
        self.storage._create_db_key = Mock(
            return_value=score_address.to_bytes())
        self.storage._db.get = Mock(return_value=deploy_info.to_bytes())
        self.assertEqual(
            deploy_info.to_bytes(),
            self.storage.get_deploy_info(context, score_address).to_bytes())
コード例 #4
0
    def _deploy_score(context: 'IconScoreContext', score_name: str,
                      score_address: 'Address',
                      builtin_score_owner: 'Address'):

        score_source_path_in_iconservice: str = os.path.join(
            IconBuiltinScoreLoader._pre_builtin_score_root_path(), score_name)

        # Save deploy_info for a builtin score to storage.
        deploy_info = IconScoreDeployInfo(score_address=score_address,
                                          deploy_state=DeployState.ACTIVE,
                                          owner=builtin_score_owner,
                                          current_tx_hash=ZERO_TX_HASH,
                                          next_tx_hash=ZERO_TX_HASH)
        context.storage.deploy.put_deploy_info(context, deploy_info)

        tx_hash: bytes = deploy_info.current_tx_hash

        # score_path is score_root_path/score_address/ directory.
        score_path: str = os.path.join(context.score_root_path,
                                       score_address.to_bytes().hex())

        # Make a directory for a builtin score with a given score_address.
        os.makedirs(score_path, exist_ok=True)

        try:
            score_deploy_path: str = os.path.join(score_path,
                                                  f'0x{tx_hash.hex()}')

            # remove_path() supports directory as well as file.
            remove_path(score_deploy_path)
            # Copy builtin score source files from iconservice package to score_deploy_path.
            copytree(score_source_path_in_iconservice, score_deploy_path)
        except FileExistsError:
            pass

        try:
            # Import score class from deployed builtin score sources
            score_info: 'IconScoreInfo' =\
                IconScoreContextUtil.create_score_info(context, score_address, tx_hash)

            # Create a score instance from the imported score class.
            score = score_info.create_score()

            # Call on_install() to initialize the score database of the builtin score.
            score.on_install()
        except BaseException as e:
            Logger.exception(
                f'Failed to deploy a builtin score: {score_address}\n{str(e)}',
                ICON_DEPLOY_LOG_TAG)
            raise e
コード例 #5
0
    def setUp(self):
        context = IconScoreContext(IconScoreContextType.DIRECT)
        block = Mock(spec=Block)
        block.attach_mock(Mock(return_value=0), 'height')
        context.block = block

        self._sender = Address.from_data(AddressPrefix.EOA, os.urandom(20))
        self._score_address = Address.from_data(AddressPrefix.CONTRACT, os.urandom(20))

        context_db = create_context_db()

        self.deploy_storage = DeployStorage(context_db)
        deploy_info = IconScoreDeployInfo(self._score_address,
                                          DeployState.ACTIVE,
                                          self._sender,
                                          os.urandom(32),
                                          os.urandom(32))
        self.icx_storage = IcxStorage(context_db)
        self._icx_engine = IcxEngine()

        self.fee_storage = FeeStorage(context_db)
        patch_fee_storage(self.fee_storage)

        self.deploy_storage.put_deploy_info(context, deploy_info)
        context.storage = ContextStorage(deploy=self.deploy_storage, fee=self.fee_storage, icx=self.icx_storage,
                                         iiss=None, prep=None, issue=None, rc=None, meta=None)
        context.engine = ContextEngine(deploy=None, fee=None, icx=self._icx_engine, iiss=None, prep=None, issue=None)
        self._icx_engine.open(self.icx_storage)

        self.icx_storage._put_genesis_data_account(context,
                                                   CoinPartType.GENERAL,
                                                   self._sender,
                                                   100000000 * 10 ** 18)
        self.icx_storage._put_genesis_data_account(context, CoinPartType.TREASURY,
                                                   Address.from_data(AddressPrefix.EOA, os.urandom(20)), 0)

        self._engine = FeeEngine()
コード例 #6
0
ファイル: converter.py プロジェクト: iconbetdev1/icon-service
 def _convert_deploy_info(cls, key: bytes, value: bytes) -> Tuple[str, str]:
     bytes_address: bytes = key[len(DeployStorage.
                                    _DEPLOY_STORAGE_DEPLOY_INFO_PREFIX):]
     converted_key: str = f"Deploy SCORE: {Address.from_bytes(bytes_address)}"
     converted_value: str = str(IconScoreDeployInfo.from_bytes(value))
     return converted_key, converted_value
コード例 #7
0
    def test_update_score_info(self):
        context = Mock(spec=IconScoreContext)
        score_address = create_address(1)
        tx_hash = create_tx_hash()

        self.storage.get_deploy_info = Mock(return_value=None)
        with self.assertRaises(InvalidParamsException) as e:
            self.storage.update_score_info(context, score_address, tx_hash)
        self.assertEqual(e.exception.code, ExceptionCode.INVALID_PARAMETER)
        self.assertEqual(e.exception.message,
                         f'deploy_info is None: {score_address}')
        self.storage.get_deploy_info.assert_called_once_with(
            context, score_address)

        current_tx_hash = create_tx_hash()
        next_tx_hash = create_tx_hash()
        deploy_info = IconScoreDeployInfo(score_address, DeployState.INACTIVE,
                                          create_address(), current_tx_hash,
                                          next_tx_hash)
        self.storage.get_deploy_info = Mock(return_value=deepcopy(deploy_info))
        with self.assertRaises(InvalidParamsException) as e:
            self.storage.update_score_info(context, score_address, tx_hash)
        self.assertEqual(e.exception.code, ExceptionCode.INVALID_PARAMETER)
        self.assertEqual(
            e.exception.message, f'Invalid update: '
            f'tx_hash({tx_hash}) != next_tx_hash({next_tx_hash})')
        self.storage.get_deploy_info.assert_called_once_with(
            context, score_address)

        owner = create_address()
        current_tx_hash = create_tx_hash()
        deploy_info = IconScoreDeployInfo(score_address, DeployState.INACTIVE,
                                          owner, current_tx_hash, tx_hash)
        self.storage.get_deploy_info = Mock(return_value=deepcopy(deploy_info))
        self.storage.put_deploy_info = Mock()
        self.storage.get_deploy_tx_params = Mock(return_value=None)
        with self.assertRaises(InvalidParamsException) as e:
            self.storage.update_score_info(context, score_address, tx_hash)
        self.assertEqual(e.exception.code, ExceptionCode.INVALID_PARAMETER)
        self.assertEqual(e.exception.message, f'tx_params is None: {tx_hash}')
        self.storage.get_deploy_info.assert_called_once_with(
            context, score_address)
        self.storage.put_deploy_info.assert_called_once()
        ret_context, ret_deploy_info = self.storage.put_deploy_info.call_args[
            0]
        self.assertEqual(ret_context, context)
        expected = IconScoreDeployInfo(score_address, DeployState.ACTIVE,
                                       owner, tx_hash, ZERO_TX_HASH)
        self.assertEqual(ret_deploy_info.to_bytes(), expected.to_bytes())

        self.storage.get_deploy_info = Mock(return_value=deepcopy(deploy_info))
        self.storage.put_deploy_info = Mock()
        self.storage.get_deploy_tx_params = Mock(return_value=Mock(
            spec=IconScoreDeployTXParams))
        self.storage.update_score_info(context, score_address, tx_hash)
        self.storage.get_deploy_info.assert_called_once_with(
            context, score_address)
        self.storage.put_deploy_info.assert_called_once()
        ret_context, ret_deploy_info = self.storage.put_deploy_info.call_args[
            0]
        self.assertEqual(ret_context, context)
        expected = IconScoreDeployInfo(score_address, DeployState.ACTIVE,
                                       owner, tx_hash, ZERO_TX_HASH)
        self.assertEqual(ret_deploy_info.to_bytes(), expected.to_bytes())
        self.storage.get_deploy_tx_params.assert_called_once_with(
            context, tx_hash)
コード例 #8
0
    def test_put_deploy_info_and_tx_params(self):
        self.storage.put_deploy_tx_params = Mock()
        self.storage.get_deploy_tx_params = Mock(return_value=bytes())
        context = Mock(spec=IconScoreContext)
        score_address = create_address(1)
        deploy_type = DeployType.INSTALL
        owner = create_address()
        tx_hash = create_tx_hash()
        deploy_data = {}
        with self.assertRaises(InvalidParamsException) as e:
            self.storage.put_deploy_info_and_tx_params(context, score_address,
                                                       deploy_type, owner,
                                                       tx_hash, deploy_data)
        self.assertEqual(e.exception.code, ExceptionCode.INVALID_PARAMETER)
        self.assertEqual(e.exception.message,
                         f'deploy_params already exists: {tx_hash}')
        self.storage.put_deploy_tx_params.assert_not_called()

        with patch('iconservice.deploy.storage.IconScoreDeployTXParams'
                   ) as MockTxParams:
            with patch('iconservice.deploy.storage.IconScoreDeployInfo'
                       ) as MockDeployInfos:
                self.storage.put_deploy_tx_params.reset_mock()
                self.storage.get_deploy_tx_params.reset_mock()
                self.storage.get_deploy_tx_params.return_value = None
                self.storage.get_deploy_info = Mock(return_value=None)
                self.storage.put_deploy_info = Mock()
                context = Mock(spec=IconScoreContext)
                score_address = create_address(1)
                deploy_type = DeployType.INSTALL
                owner = create_address()
                tx_hash = create_tx_hash()
                deploy_data = {}
                tx_params = IconScoreDeployTXParams(tx_hash, deploy_type,
                                                    score_address, deploy_data)
                MockTxParams.return_value = tx_params
                deploy_info = IconScoreDeployInfo(score_address,
                                                  DeployState.INACTIVE, owner,
                                                  ZERO_TX_HASH, tx_hash)
                MockDeployInfos.return_value = deploy_info

                self.storage.put_deploy_info_and_tx_params(
                    context, score_address, deploy_type, owner, tx_hash,
                    deploy_data)
                self.storage.get_deploy_tx_params.assert_called_once_with(
                    context, tx_hash)
                self.storage.put_deploy_tx_params.assert_called_once_with(
                    context, tx_params)
                self.storage.get_deploy_info.assert_called_once_with(
                    context, score_address)
                self.storage.put_deploy_info.assert_called_once_with(
                    context, deploy_info)

        with patch('iconservice.deploy.storage.IconScoreDeployTXParams'
                   ) as MockTxParams:
            self.storage.put_deploy_tx_params.reset_mock()
            self.storage.get_deploy_tx_params.reset_mock()
            self.storage.get_deploy_tx_params.return_value = None
            self.storage.put_deploy_info = Mock()
            context = Mock(spec=IconScoreContext)
            score_address = create_address(1)
            deploy_type = DeployType.INSTALL
            owner = create_address()
            tx_hash = create_tx_hash()
            deploy_data = {}
            deploy_info = IconScoreDeployInfo(score_address,
                                              DeployState.INACTIVE, owner,
                                              ZERO_TX_HASH, tx_hash)
            tx_params = IconScoreDeployTXParams(tx_hash, deploy_type,
                                                score_address, deploy_data)
            self.storage.get_deploy_info = Mock(return_value=deploy_info)
            MockTxParams.return_value = tx_params

            other_owner = create_address()

            with self.assertRaises(AccessDeniedException) as e:
                self.storage.put_deploy_info_and_tx_params(
                    context, score_address, deploy_type, other_owner, tx_hash,
                    deploy_data)
            self.assertEqual(e.exception.code, ExceptionCode.ACCESS_DENIED)
            self.assertEqual(
                e.exception.message,
                f'Invalid owner: {deploy_info.owner} != {other_owner}')

            self.storage.get_deploy_tx_params.assert_called_once_with(
                context, tx_hash)
            self.storage.put_deploy_tx_params.assert_called_once_with(
                context, tx_params)
            self.storage.get_deploy_info.assert_called_once_with(
                context, score_address)

        with patch('iconservice.deploy.storage.IconScoreDeployTXParams'
                   ) as MockTxParams:
            self.storage.put_deploy_tx_params.reset_mock()
            self.storage.get_deploy_tx_params.reset_mock()
            self.storage.get_deploy_tx_params.return_value = None
            self.storage.put_deploy_info = Mock()
            self.storage._db.delete = Mock()
            context = Mock(spec=IconScoreContext)
            context.revision = 0
            score_address = create_address(1)
            deploy_type = DeployType.INSTALL
            owner = create_address()
            tx_hash = create_tx_hash()
            deploy_data = {}
            already_tx_hash = create_tx_hash()
            deploy_info = IconScoreDeployInfo(score_address,
                                              DeployState.INACTIVE, owner,
                                              ZERO_TX_HASH, already_tx_hash)
            tx_params = IconScoreDeployTXParams(tx_hash, deploy_type,
                                                score_address, deploy_data)
            self.storage.get_deploy_info = Mock(
                return_value=deepcopy(deploy_info))
            self.storage._create_db_key = Mock(
                return_value=deploy_info.next_tx_hash)
            MockTxParams.return_value = tx_params

            self.storage.put_deploy_info_and_tx_params(context, score_address,
                                                       deploy_type, owner,
                                                       tx_hash, deploy_data)
            self.storage.get_deploy_tx_params.assert_called_once_with(
                context, tx_hash)
            self.storage.put_deploy_tx_params.assert_called_once_with(
                context, tx_params)
            self.storage.get_deploy_info.assert_called_once_with(
                context, score_address)
            self.storage._db.delete.assert_called_once_with(
                context, deploy_info.next_tx_hash)

            self.storage.put_deploy_info.assert_called_once()
            ret_context, ret_deployinfo = self.storage.put_deploy_info.call_args[
                0]
            self.assertEqual(ret_context, context)
            self.assertEqual(ret_deployinfo.next_tx_hash, tx_hash)