Truffle을 이용한 ERC-721 개발 🧑🏻‍💻

김기대·2021년 12월 10일
2

블록체인 개발

목록 보기
2/12
post-thumbnail

ERC-721개발에 앞서!!

Remix 란? 🤔

웹 기반의 솔리디티 개발을 위한 IDE

					[그림: remix.ethereum.org]

스마트 컨트랙트를 개발하려면 솔리디티 언어를 사용해야 하는데 흔히 사용하는 IDE 에서는 자체적으로 솔리디티 코드를 디버깅, 컴파일 등을 하는 기능이 없다.

그래서 우리는 솔리디티 코드를 컴파일, 배포, 디버깅 등을 해주는 Truffle과 로컬 환경에서 테스트넷을 사용할 수 있게 해주는 Ganache를 함께 사용해야함.

Truffle 이란? 🤔

스마트 컨트랙트 개발시 개발, 배포, 테스트 환경을 제공해주는 프레임워크

특징) 테스트 자동 실행, node.js 에서 동작, npm으로 설치 가능
이더리움 가상머신(EVM)을 사용하여 디앱 개발하기위해 만들어짐.

npm install -g truffle
truffle init

을 실행하면 트러플 프로젝트 초기화됨.

프로젝트 안에는

  • contracts : solidity 로 개발된 스마트 컨트랙트 소스 파일을 담아두는 폴더
  • contracts/Migrations.sol : 배포를 도와주는 솔리디티 파일. 삭제를 하면 안된다고 했음!
  • migrations : 배포를 위한 스크립트 파일
  • migrations/1_initital_migration.js : Migrations.sol을 배포하는 스크립트
  • test : 개발된 컨트랙트를 테스트 하기 위한 폴더
  • truffle-config.js : truffle 설정 파일

이렇게 초기화 되어 있음.

ERC-721 이란? 🤔

EIP-721 이라고해서 이더리움 개선 제안의 721번째 토론에서 채택된 각각 구분 가능한 토큰.

EIP 링크 : EIP docs
토론이 이뤄지는데 EIP에서 721 번째에 나온 하나의 토큰으로 식별 가능한 토큰(NFT)

Ganache 란? 🤔

개발한 스마트 컨트랙트를 로컬에서 테스트 할 수 있게 해주는 것.

OpenZeppelin 이란? 🤔

솔리디티 기반의 스마트 컨트랙트를 개발하는데 도움을 주는 프레임워크

ERC-20과 ERC-721의 차이점? 🤔

가장 큰 차이점은 대체 가능, 대체 불가능이라고 생각함.

코인과 토큰의 종류? (간략하게) 🤔

FT - 대체가능한 토큰
NFT - 재발행이 불가능한 토큰

ERC-20 - FT를 발행할 수 있다.
ERC-721 - NFT를 발행할 수 있다.

SFT와 ERC-1155는 추후에..

실습. Truffle 을 이용한 ERC-721 개발 🧐

이번 실습에서는 리믹스(Remix) 대신 트러플(Truffle)을 이용해 ERC-721을 개발할 것.
오픈제플린 프레임워크(@openzeppelin/contracts)를 이용.
가상에서 테스트를 위해 가나슈(Ganache-cli) 사용.
소스코드는 깃허브 참고.

  1. 환경 설정부터 하겠다. 에디터는 vsCode를 사용했다.
npm init
// package.json 초기화

npm install -g truffle
// 트러플 설치

npm install -g ganache-cli
// 가나슈 설치 (추후 gui 설치도 블로깅 할 것!)

npm install @openzeppelin/contracts
// 우린 오픈제플린을 이용할 것.
  1. 그럼 package.json 파일 안에 "@openzeppelin/contracts": "^4.4.0" 이 생기고, 우린 트러플을 이용하기 때문에 truffle-config.js 파일을 수정해줘야 함.
networks: {
	ganache: {
		host: '127.0.0.1',  // 로컬
		port: 8545,  
		network_id: '*',
		},
},

다른 네트워크에 배포할 때에는 여기다 네트워크 정보를 추가하고, Truffle 명령어 중 옵션 --network 와 함께 네트워크의 정보를 담고있는 키를 입력하면 된다고 함.

아마 가나슈 gui 환경에서는 port가 7545 였었던거 같다.
그리고

compilers: {
		solc: {
			version: '0.8.7', 
			evmVersion: 'london',
		},
	},

컴파일 버전을 작성할 솔리디티 코드와 맞춰줌.

  1. contracts 폴더 안에 MyNFTs.sol 코드 작성.
    오픈제플린 프레임워크 안에 있는 Ownable, ERC721URIStorage 컨트랙트 사용.
contract MyNFTs is ERC721URIStorage, Ownable {}

함수 mintNFT() 선언

  1. migrations 폴더 안에 있는 1_initial_migration.js 파일 수정.
    앞에서 작성한 MyNFTs.sol 코드를 배포할 것.

  2. 이제 다른 터미널 창(가나슈)을 하나 더 열어서 가나슈와 트러플을 사용할 것.

먼저, 새로연 터미널 창에서

ganache-cli

명령어로 가나슈를 열고

truffle migrate --compile-all --network ganache

명령어를 입력하여 가나슈(키) 네트워크(로컬)에 연결하고, 모든 컨트랙트 배포.

배포하고 나서 트러플 콘솔을 열어 컨트랙트를 조작할 수 있음.

truffle console --network ganache

그럼 터미널창이 truffle(ganache)> 로 바뀜.

truffle console에서 배포한 컨트랙트의 인스턴스를 받아옴.
배포한 컨트랙트 확인.

컨트랙트 확인 후, 작성한 함수가 잘 동작하는지 확인.
함수의 마지막 파라미터로 실행할 지갑 주소를 함께 전달해야함.
로컬의 ganache-cli의 첫번째 지갑주소 사용.

가나슈를 이용해서 컨트랙트를 배포할 때는 첫번째 지갑의 주소에서 컨트랙트를 배포.

발행된 NFT로부터 tokenURI를 확인.

tokenURI에는 예시로 'google.com'을 넣었다.
NFT를 생성할 때 파라미터로 tokenURI를 전달하는데, NFT에 적용할 정보를 담고있는 json객체의 엔드포인트임.

예시로 OpenSea에서 메타데이터 JSON 볼 수 있음.

tokenURI에는 IPFS나 https 등 토큰으로 발행할 데이터 링크를 넣음.

이렇게 해서, Truffle, ganache-cli로 ERC-721 컨트랙트를 배포해봤다. 🧐

깃허브 주소 : 트러플을 이용한 ERC-721 개발 링크

개발 회고

목적

ERC-721이 왜 NFT인지, Truffle과 ganache의 자유로운 활용, Remix로 연습하던 배포를 로컬에서 해보기

Keep(장점, 유지할 점)

메인넷에 배포하기전 테스트를 해보는 연습을 하며 한 번 배포한 컨트랙트는 수정이 불가능하다는 점을 더욱 상기시킴.
오픈제플린 프레임워크를 사용해보며 ERC-721 솔리디티 코드를 분석하며 유니크한 값으로 카운트하기에 NFT.

Problem(단점, 변경 또는 버릴 점)

아직 다양한 함수들을 많이 다뤄보진 못함
명확하지 않은 명령어들과 함수들 : 생소함 -> 적응으로 바꿔야한다.

Try(시도할 점, 앞으로의 행동)

erc-20, erc-721 구현 및 활용한 개발 프로젝트를 하겠다.
docs를 많이 읽어보고 ERC20, ERC721 안의 많은 함수들을 사용해봐야겠다.
많은 연습이 필요하다.

profile
블록체인 백엔드 개발자

0개의 댓글