하나의 스마트 컨트랙트 내에서 다른 컨트랙트를 생성하고 배포할 수 있다.
이를 통해 얻는 이점은 다음과 같다.
주소 형식으로 기록하여 추적, 관리가 쉽다.장점만 있는 것은 아니다.
컨트랙트를 생성하고 배포할 시 사용되는 CREATE 코드의 가스비가 32000으로 적지 않다.
크립토 좀비의 코드를 예시로 활용하겠다.
pragma solidity >=0.5.0 <0.6.0;
contract ZombieFactory {
...
struct Zombie {
string name;
uint dna;
}
Zombie[] public zombies;
function _createZombie(string memory _name, uint _dna) private {
zombies.push(Zombie(_name, _dna));
}
...
}
zombies의 배열 안에 구조체인 Zombie들을 기록한다.
pragma solidity >=0.5.0 <0.6.0;
contract Zombie {
string public name;
uint public dna;
constructor(string memory _name, uint _dna) {
name = _name;
dna = _dna;
}
}
contract ZombieFactory {
...
Zombie[] public zombies;
function _createZombie(string memory _name, uint _dna) private {
Zombie zombie = new Zombie(_name, _dna);
zombies.push(zombie);
}
...
}
ZombieFactory 컨트랙트에서 Zombie 컨트랙트의 인스턴스를 생성한다.
여기서 new는 opcode의 CREATE를 불러 컨트랙트를 생성한다.
zombies의 배열 안에 주소형식으로 Zombie들을 기록하므로 팩토리 컨트랙트에서 사용하는 변수가 적어진다.
(참고로 변수에 public을 설정하면 동일한 이름으로 getter 메서드가 자동으로 생성된다.)
https://cryptozombies.io/en/course
https://consensys.net/diligence/blog/2019/09/factories-improve-smart-contract-security/
https://betterprogramming.pub/learn-solidity-the-factory-pattern-75d11c3e7d29