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())
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)
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())
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
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()
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
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)
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)