external 함수는 누구든지 사용할 수 있는 함수다.
이것을 소유자만 사용할 수 있도록 만들 수 있다.
이를 위해 만들어져있는 OpenZeppelin라는 솔리디티 라이브러리에 있는 Ownable 컨트랙트를 가져와서 살펴보자
- Ownable.sol
// Ownerable 계약에는 소유자 주소가 있으며 기본 권한 제어 기능을 제공하므로
// "사용자 권한"의 구현이 간소화됩니다.
contract Ownable {
address public owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
// Ownerable 생성자(constructor)는 계약의 원래 '소유자'를 발신자 계정으로 설정합니다.
function Ownable() public {
owner = msg.sender;
}
// 소유자가 아닌 다른 계정에서 호출하면 안됨.
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
// 현재 소유자가 권한을 newOwner에게 이전한다
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0));
OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
- 함수제어자(modifier)
위 Ownable.sol에 보면 함수형태로 modifier라고 정의된 것이 있따.
이 함수 제어자를 이용하면 특정 함수가 실행될 때 함수 제어자를 거쳐서 함수가 실행되는듯 하다.
함수제어자의 내부를 보면 _; 라는 문구를 마지막에 넣는데
이건 해당 함수가 실행되기 전에 함수제어자가 먼저 실행되고, _; 를 만나면 해당함수로 다시 되돌아간다는 뜻이라한다.
챕터2 답 수정전
// 1.
// 2.
contract ZombieFactory {
수정 후
// 1. import
import "./ownable.sol";
// 2. 상속
contract ZombieFactory is Ownable {
챕터3 답 전
function setKittyContractAddress(address _address) external {
kittyContract = KittyInterface(_address);
}
후
// Ownable 컨트랙트의 onlyOwner 함수제어자를 추가했다
function setKittyContractAddress(address _address) external onlyOwner {
kittyContract = KittyInterface(_address);
}
'솔리디티 > 크립토좀비' 카테고리의 다른 글
레슨3 챕터7, 8, 9 - 함수 보안, 인수를 받는 함수제어자(modifier) (0) | 2022.02.17 |
---|---|
레슨3 챕터4, 5, 6 - 가스(gas) / 시간 단위(Time units) (0) | 2022.02.17 |
레슨3 챕터1 - 컨트랙트 불변성(Immutable) (0) | 2022.02.17 |
레슨2 챕터 10, 11, 12, 13 - 인터페이스 (0) | 2022.02.12 |
레슨2 챕터9 - 함수 접근 제어자 (0) | 2022.02.12 |
댓글