일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 블록 만들기
- Uncaught Error: could not find react-redux context value; please ensure the component is wrapped in a <Provider>
- 비동기파일업로드
- 아이디 중복체크기능
- 라우트 매개변수
- express session
- OAuth 카카오
- 라우터 분리
- express router
- buffer.from
- express실행
- JWT 만들어보기
- FormData()
- useContext
- JWT 하드코딩
- JWT 로그인 기능 구현
- 시퀄라이즈 기본설정
- javascript기초
- next 매개변수
- css기초
- cookie-parser 만들어보기
- ws 라이브러리
- mysql wsl
- useEffect clean up
- node.js path
- 세션으로 로그인 구현
- nodejs파일업로드
- 라우터와 미들웨어
- express.static
- 라우터미들웨어 분리
- Today
- Total
즐코
ERC-721 / NFT / Remix로 컨트랙트 배포 및 실행 테스트 본문
1/ ERC-721
현재까지 공부한 ERC-20 토큰의 경우 토큰 100개가 발행되었다면 토큰 하나하나의 의미가 같다. 풀어서 말하자면 내 계정이 보유한 토큰 1개와 다른 계정의 토큰 1개는 의미가 같다. 하지만, ERC-721은 다르다. 토큰 100개가 있다면 각각의 100개는 의미가 다르다. 마치 영화 티켓처럼 같은 영화관에서 같은 영화를 상영할지라도 좌석넘버가 다른 것처럼 하나하나 다른 토큰으로 본다. 이걸 코드로 표현하자면 토큰 하나하나에 고유키값을 부여해주는 것이다. 따라서 ERC-721을 Non-Fungible Token, NFT 라고 한다.
따라서, ERC-721 토큰 상에는 ERC-20에는 없는 특이한 상태변수가 owned가 존재한다.
토큰의 고유 키값 (uint)으로 해당 토큰의 소유자를 알 수 있는 mapping이다.
mapping (uint => address) public owned;
- NFT에 들어가는 사진, 그림과 같은 이미지파일은 어떻게 넣는것일까?
스마트 컨트랙트 데이터 상에 이미지를 어떻게 넣을지를 생각해볼 필요가 있다.
이미지도 따지고 보면 텍스트이기 때문에 이미지를 인코딩해서 바이트코드로 넣는게 된다하더라도 용량 문제로 gas가 매우 많이 들것이며 결국 gasLimit에 걸려서 발행되지않고 멈추는 문제가 분명 생길것이다.
그렇기 때문에 NFT 안에 이미지 파일을 저장하는 방식은 아래와 같다.
1/ 토큰의 고유 키값에 따라 그 키에 매칭되는 URL 를 가지게 된다.
2/ 각 URL에는 json 형태의 데이터가 담겨 있어, 그 URL 을 통해 각 토큰들의 json 데이터에 접근할 수 있다.
3/ 그 json 데이터에는 image 속성이 있는데, 그게 바로 이미지 경로이다.
즉, NFT 상에 이미지나 영상, 음원 등을 저장하는 건 json 데이터 내부의 해당 컨텐츠들의 경로를 읽어와 화면에 뿌려주는 것일뿐이다.
const response = axios.post("http://localhost:3000/metadata/1.json")
const { image } = response.data => 이런식으로 image 속성을 가져와 화면에 뿌려주는 것
2/ 오픈제플린이 제공하는 ERC721 규격 상속받아 컨트랙트 작성해보기
ERC-20 처럼 역시나 ERC-721도 오픈제플린에서 제공해주는 규격이 존재한다.
따라서, 오픈제플린의 ERC721Enumerable 컨트랙트를 상속받아 아래처럼 간단한 Minting 컨트랙트를 작성했다.
_minting()
ERC-20과 크게 다른점은 _mint 함수이다. ERC-20에선 민팅 (토큰 발행) 시 토큰의 양을 부여했다.
ERC-721은 민팅 시 토큰의 양이 아닌 tokenId 값을 인자로 받는다는 것이다. 이 코드로 인해 호출할때마다 발행되는 토큰 하나하나는 각각의 다른 tokenId를 부여받게 된다.
tokenURI()
해당 함수를 통해 각 토큰 고유값이 가리키는 json파일에 대한 uri 값을 가져올 수 있다. 현재 코드상에선 토큰 생성할때마다 같은 이미지 json을 가지게 된다. 하지만 실제론, json파일을 유동적으로 바꿔서 매 토큰아이디마다 살짝씩 다른 이미지를 보여주기도 한다고 한다..
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;
import "../node_modules/openzeppelin-solidity/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
contract Minting is ERC721{
constructor(string memory _name, string memory _symbol) ERC721(_name, _symbol) {}
function _minting(uint _tokenId) public {
_mint(msg.sender, _tokenId);
}
function tokenURI(uint _tokenId) public override pure returns (string memory){
return "https://gateway.pinata.cloud/ipfs/QmPwjnvWYN4etA5eW4yAbWCTy2ukEC1Jj5417VLGyH5XpU/1/1.json";
}
}
3/ Remix로 컨트랙트 배포 및 실행
Remix
: 브라우저 상에서 솔리디티 언어로 스마트 계약 개발과 구축이 가능하게끔 이를 지원해주는 통합개발환경(IDE)
프라이빗이나 테스트넷의 이더리움 블록체인에 연결해서 스마트 컨트랙트 배포 및 실행 테스트를 해볼수있다!
컨트랙트 배포 및 실행 테스트를 위해 자주 쓸것이므로 전역으로 설치해준다!
$ npm i -g @remix-project/remixd
truffle/contracts 로 디렉토리 이동 후 아래 명령어 통해 리믹스와 연동한다.
$ remixd -s . --remix-ide https://remix.ethereum.org
터미널 창에 아래와 같이 remixd is listening이 찍히면 리믹스 페이지로 고고 (https://remix.ethereum.org)
좌측 상단에 workspace 에서 localhost 연결 클릭
아래스크린샷처럼 자동으로 내 로컬 코드가 브라우저 상에 업데이트가 되었다!
컴파일러 버전 선택해주고, 코드 변경 시 자동 컴파일을 위해 Auto compile 체크
이때, 컴파일할때 작은 오류 하나가 발생할거다.
ERC721 import 코드의 경로 작성 시 로컬에선 node_modules 디렉토리 상에 들어가야 했는데 리믹스에선 그럴 필요없이 ../node_modules를 지워주고 openzeppelin-solidity 부터 시작하면 된다.
컴파일 완료되면 컨트랙트 배포를 위해 연결된 네트워크 및 계정, 배포할 컨트랙트 선택 후 Deploy 클릭!
deploy 버튼 옆의 빈칸 클릭 시 생성자 함수의 인자를 넣을 수 있는 칸이 나오니 거기에 _name, _symbol을 넣고 발행해준다.
리믹스 IDE 콘솔창에 아래와 같이 배포(트랜잭션)가 되자마자 블럭이 채굴되었음을 보여준다.
위와 같이 배포가 완료되면 Deployed Contracts 라는 메뉴에서 배포된 컨트랙트 내 getter, setter 함수들을 확인해볼 수 있다.
해당 함수들을 클릭하거나 함수 호출 시 인자가 필요하다면 인자를 넣고 클릭하면 함수가 실행된다.
- call() 메소드 : 상태 변수 조회 / 파란색 버튼으로 표시 (가스비 x)
- send() 메소드 : 트랜잭션 발생 / 주황색 버튼으로 표시 (가스비 o)
- payable : 이더 지불 관련 / 빨간색 버튼으로 표시
가나쉬 대신 메타마스크로 연결해보자 !
우선, ERC-721 즉, NFT 발행과 테스트를 위한 테스트넷인 Rinkeby를 이용할거다.
1/ 우선 컨트랙트 배포 및 실행 테스트를 하려면 계정 상에 이더가 있어야 하므로 Rinkeby 테스트넷의 계정 상에 이더를 미리 받아놔야한다.
메타마스크의 Rinkeby 네트워크에 들어가 주어진 계정을 복사한 후 아래 두 링크에서 테스트용 이더를 받아오자.
2/ 네트워크를 Injected Provider-Metamask로 변경하고, 메타마스크에서 계정 연결 팝업창을 띄울 것이다. 린케비에서 테스트 이더를 받아온 계정을 선택해준다.
3/ 리믹스 deploy 창에서 배포 진행할 계정, 배포할 컨트랙트를 다시 선택해주고, constructor 생성자 함수의 인자값도 넣어서 deploy 버튼을 다시 눌러주면 메타마스크 상에서 가스요금과 함께 계약 상호 작용 요청이 온다.
4/ 허용해주면 배포가 완료되며, 이후에 배포된 코드 상의 _minting 함수에 인자로 tokenId 를 임의로 0을 넣으면 또 메타마스크를 통해 컨트랙트 실행이 가능해진다.
오픈씨(openSea)에 NFT 올리기
오픈씨란 nft 마켓 중 하나이다.
다만, 우리는 실제 nft마켓에 발행하는 것이 아니라 opensea에서 제공해주는 테스트넷에서 우리가 작성한 컨트랙트로 nft 발행을 해보는거다. 따라서, opensea.io 가 아닌 https://testnets.opensea.io/ 로 접속한다.
1/ 오픈씨 사이트 상에서 지갑으로 계정 연결이 가능하다. 메타마스크를 사용하여 Minting 컨트랙트를 배포한 계정을 연결해준다.
2/ 리믹스 상에서 _minting() 함수 실행 시 오픈씨에 자동으로 연결된 계정 상에 nft가 등록된다.
3/ 각 발행된 토큰 아이디마다 가리키는 json 데이터가 오픈씨 웹의 프론트단에 뿌려지는 것이다. (아래 스크린샷 참고)
'BlockChain' 카테고리의 다른 글
ERC721 / nft 민팅, 거래 기능 컨트랙트 (0) | 2022.08.02 |
---|---|
ERC-721 살펴보기 (0) | 2022.07.28 |
ether-token 스왑 / 토큰발행 컨트랙트+스왑전용 컨트랙트 (0) | 2022.07.25 |
ERC-20 나만의 토큰 작성 / fallback, receive? / 이더로 토큰 사기 (0) | 2022.07.22 |
ERC20 interface / ERC20 (0) | 2022.07.22 |