챕터 1: 컨트랙트의 불변성
다른 프로그램과 달리 contract는 배포되면 수정할 수 없다! 그래서 애초에 프로그램을 짤 때 수정할 수 있는 상황을 고려해서 프로그래밍 해야한다. (말이야 편하지… 누가 그런걸 알 수 있단 말인가!) 크립토좀비에서는 크립토키티에서 치명적인 문제가 발생할 경우를 가정한다. 크립토키티에서 치명적인 문제가 발생할 경우 크립토키티의 함수를 불러오는 부분 자체를 사용하지 못하게 되니까! 그래서 크립토키티의 컨트랙트 주소를 직접 써넣는 방법대신 변수로 할당하여 상황에 따라 다른 컨트랙트 주소를 적을수 있게끔 코드를 다시 써야한다.
contract ZombieFeeding is ZombieFactory {
address ckAddress = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d;
KittyInterface kittyContract = KittyInterface(ckAddress);
이런 contract를..
contract ZombieFeeding is ZombieFactory {
KittyInterface kittyContract;
function setKittyContractAddress(address _address) external {
kittyContract = KittyInterface(_address);
}
이렇게 고쳐야한다.
chAddress의 크립토키티 주소를 지우고, 해당 주소를 할당 받는 함수를 만들어 인터페이스에 집어넣는 식으로 컨트랙트를 고쳤다. 그런데 여기서 문제가 발생한다. 외부에서 이 함수를 사용할 수 있게 하려고 external을 선언했는데.. 그 결과 아무나 이 함수를 소환해서 우리가 참조하려는 컨트랙트의 주소를 마음대로 바꿀 수 있게 되었다. 이건 막아야 하지 않을까..
챕터 2: 소유 가능한 컨트랙트
그래서 크립토좀비에서 선택한 방법은 해당 컨트랙트를 소유가능하게 만들어서 나만의 것으로 만들어 버리는 것이다. external 선언으로 외부에서 접근할 수 있지만 나만이 쓸 수 있게끔 만들어 두는 것이다. 다행히도 이런 부분의 필요성을 느낀 누군가가 미리 만들어 두었다. OpenZeppelin라이브러리에서 Ownable 컨트랙트를 상속해서 내 컨트랙트로 만드는 것이다. (시간이 되면 Ownable 컨트랙트 내용을 읽어보는 것도 재밌다. 아직 배우지 않은 내용들이 나오지만 아는 부분만 읽어도 읽히는 재미가 있다)
함수를 상속하는 법은 예전에 다루었던 내용과 별반 다를 것 없다. import해오고 contract 선언부에 is로 상속!
pragma solidity ^0.4.19;
import "./ownable.sol";
// 2. 상속을 추가하게:
contract ZombieFactory is Ownable {
가뿐하다!
챕터 3: modifier
함수제어자.. 한글이 더 어렵다. 그냥 modifier라고 하지.. 우리가 원하는 함수자체에 require문을 추가해서 특정 조건이 만족할 때 만 실행되게 만드는 방법이 있지만, modifier를 통해 require문을 적용할 수 있다.
modifier의 선언은 함수 선언하듯 해주면 된다.
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
이렇게 선언을 해주면 함수 작동하듯이 require문이 작동하게 된다. _; 이건 뭐지 싶다. _; 이 부분은 우리가 원래 동작시키려는 함수가 여기에 들어가면 된다고 알려주는 부분이다.
문제에서 요구하는 대로 함수제어자를 추가하자.
function setKittyContractAddress(address _address) external onlyOwner {
kittyContract = KittyInterface(_address);
}
이렇게 선언을 해주게 되면 setKittyContractAddress 함수가 실행될 때 onlyOwner라는 modifier를 먼저 실행한다. 그리고 _;를 만나면 다시 setKittyContractAddress를 실행한다. 이름이 특이해서 그렇지 전혀 어려운 개념이 아니다. 함수 실행 전에 modifier부터 실행하고, 돌아와서 함수를 마무리하게 하는 명령어다.
참고문헌
https://d2fault.github.io/2018/03/19/20180319-about-solidity-1/
코어 이더리움 프로그래밍 – 박재현, 오재훈, 박혜영