> For the complete documentation index, see [llms.txt](https://whs3-doge5k.gitbook.io/smartcontract-security-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://whs3-doge5k.gitbook.io/smartcontract-security-docs/basics/2./undefined-3/ownable.md).

# 소유권 이전 및 Ownable 컨트랙트

스마트 컨트랙트에서 특정 기능을 소유자(owner)만 사용할 수 있도록 제한하고, 필요할 경우 다른 주소로 소유권을 이전하는 방법

OpenZeppelin의 `Ownable` 컨트랙트를 이용해 **안전하고 간단하게 권한을 관리**하는 법을 익힌다.

**왜 소유권이 필요할까?** 스마트 컨트랙트에는 다음과 같은 **특정 역할만 가능한 기능**이 있는 경우가 많다.

* 토큰을 발행하거나 중단하는 기능
* 민감한 설정 값을 변경하는 기능
* 관리자만 사용 가능한 외부 인터페이스 호출

이럴 때 누가 그 기능을 실행할 수 있을지를 **제한**하기 위해, 보통 `owner`라는 개념을 도입하고, `onlyOwner`로 보호한다.

**Ownable 패턴이란?**

OpenZeppelin의 `Ownable` 컨트랙트는 이런 소유자 권한을 쉽게 구현할 수 있도록 도와주는 표준 템플릿이다.\
이 컨트랙트를 상속하면 다음 기능이 자동으로 제공된다:

| 기능                           | 설명                   |
| ---------------------------- | -------------------- |
| `owner()`                    | 현재 소유자 주소 반환         |
| `onlyOwner`                  | 소유자만 실행 가능한 함수 제한자   |
| `transferOwnership(address)` | 소유권 이전               |
| `renounceOwnership()`        | 소유권 포기 (완전한 탈중앙화 가능) |

예제코드는 아래의 내용 참고.

```
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

contract OwnableNFT is ERC721, Ownable {
    uint256 public tokenId;

    constructor() ERC721("OwnableNFT", "ONFT") {}

    function mint(address to) external onlyOwner {
        _safeMint(to, tokenId);
        tokenId++;
    }

    function burn(uint256 _tokenId) external onlyOwner {
        _burn(_tokenId);
    }
}

```

* `Ownable`을 상속하면 `owner()`와 `onlyOwner`가 자동 생성된다.
* `mint()` 함수는 `onlyOwner` 제한이 걸려 있어서 **배포자만 NFT 발행 가능**하다.
* `transferOwnership(newOwner)`를 호출하면 다른 주소로 권한을 넘길 수 있다.

정리하자면 아래와 같다.&#x20;

| 항목                  | 설명                            |
| ------------------- | ----------------------------- |
| `Ownable`           | OpenZeppelin 제공 소유권 관리 템플릿    |
| `onlyOwner`         | 소유자만 실행할 수 있도록 제한             |
| `transferOwnership` | 소유권을 다른 주소로 변경                |
| `renounceOwnership` | 소유권 포기 → 완전한 탈중앙화 가능          |
| 활용 사례               | NFT 발행, 민감 기능 보호, 관리자 권한 관리 등 |

출처 : <https://docs.openzeppelin.com/contracts/4.x/api/access#Ownable>
