블록체인 뿅뿅

오픈제플린 + 온라인 RemixIDE 로 간단 컨트랙트 구현하기

bimppap 2023. 4. 9. 20:57

 

 

 

지난 번에는 하드햇 튜토리얼로 프레임워크를 이용한 컨트랙트의 작성부터 배포를 다뤘다. 이번에는 표준 사양의 컨트랙트를 오픈제플린을 사용해 온라인으로 쉽게 작성하는 방법에 대해 적어보려고 한다. 솔리디티 문법에 대한 기초적인 이해만 있으면 따로 준비할 건 없기에 블록체인 개발을 맛보기로 해보고 싶은 사람한테 추천한다! 👍

 

순서는 다음과 같다.

- 왜 오픈제플린을 사용하는가?
- 오픈제플린이란?

- 오픈제플린 위자드를 활용한 간단 컨트랙트 구현
- 참고 자료

 


 

왜 오픈제플린을 사용하는가?

블록체인 네트워크에서는 유통할 수 있는 토큰의 호환성을 위해 ERC20, ERC721, ERC1155 등의 표준 사양을 제공하고 있다.

예시로 ERC20은 아래와 같은 사양을 가지고 있다. 

 

// METHOD
function name() public view returns (string)
function symbol() public view returns (string)
function decimals() public view returns (uint8)
function totalSupply() public view returns (uint256)
function balanceOf(address _owner) public view returns (uint256 balance)
function transfer(address _to, uint256 _value) public returns (bool success)
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success)
function approve(address _spender, uint256 _value) public returns (bool success)
function allowance(address _owner, address _spender) public view returns (uint256 remaining)

// EVENTS
event Transfer(address indexed _from, address indexed _to, uint256 _value)
event Approval(address indexed _owner, address indexed _spender, uint256 _value)

 

(+) ERC vs EIP(접은 글 확인!)

더보기

간혹 ERC와 EIP를 혼동하는 케이스가 있는데 엄연히 따지면 ERC는 EIP의 한 카테고리라고 보면 된다.

(개인적으로 EIP는 인터페이스, ERC는 EIP를 implement 한 추상 클래스의 역할을 하고 있다, 로 이해하고 있다.)

EIP에 관한 자료는 여기서 더 자세히 볼 수 있다.

출처 : ImmuneBytes [ ERC-4337: A COMPLETE GUIDE TO ACCOUNT ABSTRACTION ]

 

그런데 컨트랙트를 작성할 때마다 위 메서드와 이벤트를 구현하게 되면, 이건 너무 비용 낭비라는 생각이 들 것이다. 표준 사양이라 안 짤 수도 없고... 이 때, 표준 사양을 구현하지 않아도 사용할 수 있도록 등장한 것이 오픈제플린이다.

 

오픈제플린이란?

오픈제플린 공식 문서는 이렇게 소개를 하고 있다.


오픈제플린은 안전한 스마트 컨트랙트 개발을 위한 솔리디티 기반 표준 라이브러리입니다.
커뮤니티에서 검증된 코드 기반으로 컨트랙트를 구축해보세요.
  • ERC20, ERC721과 같은 표준 사양 구현.
  • 유연한 역할 기반 권한 체계.
  • 커스텀 컨트랙트와 복잡한 탈중앙화 시스템을 구현하기 위한 재사용성 있는 Solidity 컴포넌트들.

오픈제플린은 회사 이름이기도 하다. 2015년 데미안 브리너와 마누엘 아라오스가 공동 설립한 블록체인 개발 회사로, 앞서 말한 오픈제플린 라이브러리(어떤 곳에선 프레임워크라 부르기도 한다.)와 스마튼 컨트랙트를 관리 및 운영하는 플랫폼 제플린OS를 제공하고 있다.

 

오픈제플린에서 제공하는 라이브러리를 이용하면 위에서 말한 메서드와 이벤트를 구현할 필요 없이, 아래처럼 쓰면 된다. 참 쉽죠?

 

// contracts/MyNFT.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";

contract MyNFT is ERC721 {
    constructor() ERC721("MyNFT", "MNFT") {
    }
}

 

오픈제플린에서 제공하는 컨트랙트들은 전부 virtual 메소드여서, 만일 표준을 따르되 일부 기능을 입맛에 맞게 커스텀하고 싶으면 오버라이딩을 하면 된다. 오버라이딩 예시는 다음과 같다.

 

function _baseURI() internal view override returns (string memory) {
        return "https://my-domain/metadata/";
    }

 

오픈제플린으로 활용한 간단 컨트랙트 구현 및 사용해보기

 

1) 오픈제플린 위자드로 컨트랙트 만들기

그럼 본격적으로 오픈제플린을 이용한 컨트랙트를 만들어보자. 오픈제플린에서는 위자드라는 인터렉티브 컨트랙트 생성 도구를 제공하고 있다. 위자드로 들어가면 아래와 같은 화면을 볼 수 있다.

 

왼쪽의 체크박스 리스트에서 원하는 기능을 클릭하면 오른쪽에서 코드가 자동으로 만들어진다. 우리는 별도의 커스텀 없이 민팅이 가능하고, 오너가 존재하는 ERC721을 만들어볼 것인다.

 

이러면 컨트랙트 구현이 끝났다. 참 쉽죠?

 

2) remix 온라인 ide에서 배포 및 사용해보기

 

구현이 끝나면 위자드 우측 상단에 [Open in Remix] 버튼이 있다. 버튼을 클릭하면 컨트랙트 개발 전용 Remix (온라인) IDE가 뜬다. 파일 명은 랜덤으로 정해진다.

왼쪽의 Compile contract~ 이라 적힌 푸른색 버튼을 클릭한다. 아래와 같이 뜨면 컴파일에 성공한 것이다.

무엇이 달라졌나 물으면, 컴파일이 되면서 artifacts 라는 컴파일 파일들이 자동으로 생성된다.

Before After

이후 왼쪽 카테고리에서 이더리움 모양의 아이콘 (Deploy & run transactions) 를 클릭하면 배포 환경과 배포할 주소와 gas limit 등을 설정하고 배포를 할 수 있는 창이 뜬다. 리믹스 가상 네트워크에서 배포하는 것이므로 돈은 들지 않으니 걱정하지 않아도 된다.

주황색 Deploy 버튼을 클릭하면 배포가 되면서 터미널에서 트랜잭션 정보를 보여주고, 왼쪽 하단에서 배포된 컨트랙트를 확인할 수 있다. 

배포된 컨트랙트의 토글 버튼을 클릭하면 하단에 사용할 수 있는 메서드 목록이 뜬다. 왼쪽의 주황색 또는 푸른색 버튼을 사용하면 메서드가 실행된다.

이 메서드들은 ERC721 표준 메서드들이다. 파라미터가 필요한 메서드들의 경우 파라미터를 기입하고, 없을 경우 바로 사용해도 가능하다. 적절하지 못한 파라미터를 넣어 메서드를 실행하면 터미널에서 오류를 뱉는다. 파라미터가 없는 name, owner 를 클릭하면 메서드 바로 아래에 리턴값을 (있다면) 보여준다. 터미널에선 실행된 메서드의 트랜잭션 정보를 보여준다.

 

이렇게 오픈제플린을 활용한 컨트랙트 구현과 배포, 그리고 실행까지 해보았다! 블록체인에 대해 잘 몰라도 시도해볼 수 있을 정도로 쉽고 간편하다! 위자드를 이용해 기본적인 기능을 가진 컨트랙트 코드를 만들고 입맛대로 커스텀하여 사용할 수도 있다. 이 글을 통해 사람들이 쉽게 블록체인 개발을 시도해봤으면 좋겠다. 😎

 

 

참고 자료

ETHEREUM - [ERC20 TOKEN STANDARD]

해시넷 - [오픈제플린]