NFT 개발 맛보기 (스마트 컨트랙트)

heeung·2023년 7월 15일
0
post-thumbnail

NFT 개발 맛보기 (스마트 컨트랙트)

❗️ 스마트 컨트랙트 개발을 찍어먹기 했습니다. 다루는 키워드에 대한 자세한 설명은 생략 하고 only 과정만 담았습니다.

테스트 환경

  • MacOs
  • VScode 사용
  • Node.js 필요
  • VScode Extentions
    • solidity
    • solidity contract flattener
    • solidity extended

📌 Solidity

  • 이더리움에서 스마트 컨트렉트를 개발하기 위해서 만들어진 고수준 정적 컨트랙트 지향 언어
  • 원래는 이더리움을 위해 만들어 졌으나, 이더리움을 포크하여 만들어진 다른 블록체인도 사용이 가능

📌 Smart Contract

  • 계약 코드를 통해 스스로 실행되는 전산화 계약
  • 사전에 정해진 계약자 간의 규칙에 따라 디지털 자산을 자동으로 이동하는 시스템

📌 트러플 (truffle)

  • 굉장히 유용한 npm 설치형 모듈
  • 이더리움 스마트 컨트랙트를 개발하고, 컴파일, 테스트, 배포를 쉽게 해준다 .

⚒️ 과정

  1. 트러플 설치 (기본적으로 node.js 설치가 되어있어야 함)

    sudo npm install -g truffle

  2. 스마트 컨트랙트 개발을 위한 디렉토리 안에서 명령어 입력

    truffle init
    • 명령어를 입력하면 개발을 위한 구조가 자동으로 만들어 지게 된다.
      ├── contracts
      ├── migrations
      ├── test
      └── truffle-config.js
      • contract : 스마트 컨트랙트 파일을 저장하는 디렉토리
      • migrations : 개발한 스마트 컨트랙트를 배포할 때 필요한 파일을들 저장하는 디랙토리
      • truffle-config.js : 트러플 설정 파일
      ❗️contract/Migrations.sol 파일은 삭제 x

  3. 오픈제플린 (open zeppelin) 설치

    ```bash
    npm install @openzeppelin/contracts
    ```
    
    - 설치하게 되면 많은 양의 파일들이 생성된다. 추후 스마트 컨트랙트 구현에 이용됨.

  4. contracts디렉토리에 DigitalPicture.sol 파일 만들기

    truffle create contract DigitalPicture
    • 위 명령어로 만들게 되면 기본 solidity 코드가 담긴 파일이 생성됨.
    ├── contracts
    │   └── DigitalPicture.sol

  5. DigitalPicture.sol 코드 작성

    // contracts/DigitalPicture.sol
    
    // SPDX-License-Identifier: MIT
    pragma solidity >=0.4.22 <0.9.0;
    
    import "../node_modules/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
    import "../node_modules/@openzeppelin/contracts/utils/Counters.sol"; //순차 적인 발급을 위한.
    
    contract DigitalPicture is ERC721URIStorage {
      using Counters for Counters.Counter;
      Counters.Counter private _tokenIds;
    
      constructor() ERC721("DigitalPicture", "NDP") {}
    
      // public 으로 해야만 web3.js 에서 이용할 수 있다.
      // address : 지갑 주소 정보
      // NFT 를 발행 할때마다 increment 되면서 순차적으로 키 생성
      function publishItem(address creator, string memory tokenURI) public returns (uint256){
        _tokenIds.increment(); // 1
    
        uint256 newTokenId = _tokenIds.current();
    
        // 해당 지갑 주소를 가지고 있는 사람한테 NFT 토큰 한개를 전달해주는 함수
        _mint(creator, newTokenId);
        // tokenURI : 창작자의 그림이 저장되어있는 특정 위치
        _setTokenURI(newTokenId, tokenURI);
    
        return newTokenId;
      }
    }

  6. 컴파일하기

    truffle compile
    • 컴파일 하게되면 build/contracts에 파일들이 생성된다.
    ├── build
    │   └── contracts
    │       ├── Address.json
    │       ├── Context.json
    │       ├── Counters.json
    │       ├── DigitalPicture.json
    │       ├── ERC165.json
    │       ├── ERC721.json
    │       ├── ERC721URIStorage.json
    │       ├── IERC165.json
    │       ├── IERC4906.json
    │       ├── IERC721.json
    │       ├── IERC721Metadata.json
    │       ├── IERC721Receiver.json
    │       ├── Math.json
    │       ├── SignedMath.json
    │       └── Strings.json

  7. migration 파일 생성하기

    • migrations 디렉토리 안에 1_contract_migrations.js 파일을 생성한다. (파일 앞에 붙는 숫자는 파일마다 달라야 함)
      // migrations/1_contract_migrations.js
      
      const DigitalPicture = artifacts.require("DigitalPicture");
      
      module.exports = function (deployer) {
        deployer.deploy(DigitalPicture);
      };

  8. 테스트 해보자

    Ganache - Truffle Suite

    • 위 사이트에서 가네쉬 다운로드 (가상의 이더리움 테스트 공간)

  • QUICKSTART로 진행

    • test/DigitalPicture.test.js 파일 생성
      // test/DigitalPicture.test.js
      
      const DigitalPicture = artifacts.require("DigitalPicture");
      
      contract("DigitalPicture", async function (accounts) {
        const [owner] = accounts;
      
        // 각각 테스트 케이스를 실행하기 전 무조건 실행되는 코드
        beforeEach(async function () {
          this.token = await DigitalPicture.new();
        });
      
        it("publish item", async function () {
          const tokenId = await this.token.publishItem(owner, "http://dev.sample.com/a/b/abc.jpg");
      
          console.log(tokenId);
        });
      });
    • truffle-config.js 파일 수정
      // development 주석 해재후
      
      ...
      
      development: {
           host: "127.0.0.1",     // Localhost (default: none)
           port: 7545,            // Standard Ethereum port (default: none)
           network_id: "*",       // Any network (default: none)
      },
      
      ...
    • 해당 포트번호는 가니쉬 프로그램에서의 포트번호와 동일해야한다.


  • 테스트 명령어로 테스트

    truffle test ./test/DigitalPicture.test.js

    • 테스트에 성공한 모습
profile
Android Developer

0개의 댓글