Smart Contract Factory Pattern

사용 이유

solidity의 factory 유형

팩토리 패턴 예제

1. 일반적인 팩토리 패턴 예제

// SPDX-License-Identifier: MIT
pragma solidity >0.4.23 <0.9.0;

contract Foundation {
    string public name;
    address public owner;

    constructor(
        string memory _name,
        address _owner
    ) public {
        name = _name;
        owner = _owner;
    }

}

2. 클론 팩토리 패턴

→ 이에 대한 해결책은 Foundation 계약의 한 인스턴스만 배포하고 Foundation 계약의 다른 모든 인스턴스가 프록시 역할을 하도록 하여 Foundation 계약의 첫 번째 인스턴스에 호출을 위임하고 프록시 계약의 맥락에서 함수를 실행할 수 있도록 하는 메커니즘입니다.

이로써 재단계약의 각 인스턴스는 자체적인 상태를 갖게 되며, 단순히 우리가 수립한 재단계약의 인스턴스를 라이브러리로 사용하게 된다.

// SPDX-License-Identifier: MIT
pragma solidity >0.4.23 <0.9.0;
import "./Foundation.sol";
import "@optionality.io/clone-factory/contracts/CloneFactory.sol";
import "zeppelin-solidity/contracts/ownership/Ownable.sol";

contract FoundationFactory is Ownable, CloneFactory {

  address public libraryAddress;

  event FoundationCreated(address newFoundation);

  function FoundationFactory(address _libraryAddress) public {
    libraryAddress = _libraryAddress;
  }

  function setLibraryAddress(address _libraryAddress) public onlyOwner {
    libraryAddress = _libraryAddress;
  }

  function createFoundation(string _name) public onlyOwner {
    address clone = createClone(libraryAddress);
    Foundation(clone).init(_name);
    FoundationCreated(clone);
  }
}

주의 사항