Solidity - Factory pattern

김윤수·2023년 3월 9일

Solidity

목록 보기
1/3

Factory pattern

하나의 스마트 컨트랙트 내에서 다른 컨트랙트를 생성하고 배포할 수 있다.

이를 통해 얻는 이점은 다음과 같다.

  1. 동일한 형태의 컨트랙트를 인스턴스로 생성하고 주소 형식으로 기록하여 추적, 관리가 쉽다.
  2. 코드 볼륨을 줄일 수 있다. 이로 인해 배포시 가스도 절약된다.

장점만 있는 것은 아니다.
컨트랙트를 생성하고 배포할 시 사용되는 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

0개의 댓글