본문 바로가기
프로그래밍/solidity

[220712] 트러플로 스마트 컨트랙트 만들기

by 한코코 2022. 7. 12.

트러플 설치하기

install을 한 후에 잘 설치되었으면 truffle version의 결과가 나온다.

 

$ npm init -y
// 편한대로 둘 중에 하나 골라서 설치
$ npm install truffle
$ npm install -g truffle (전역설치)

$ truffle version // 이게 안되면 아래코드 사용
$ npx truffle version //트러플이 전역설정이 안 되어있어서 npx를 사용하는것

 

 

 

메타마스크에 ganache 네트워크 생성해서 계정 불러오기

 

 

 


트러플 세팅하기

$ npx truffle init

코드를 작성하면 트러플로 개발환경을 만들어주는데, 다음과 같은 파일과 디렉토리가 생성된다.

여기서 트러플을 사용하는 목적이 솔리디티 코드 작성과 배포관리라는 것을 알 수 있다.

  • build(나중에 생성됨) : 솔리디티 코드가 컴파일 된 내용을 넣는 공간
  • contracts : 솔리디티 코드를 넣는 공간
  • migration : deploy 배포를 할 수 있는 코드를 넣는 공간
  • test : 배포된걸 실행시켜보는 공간
  • truffle-config.json : 네트워크 설정값

 

 

 

 

truffle-config.js 파일 수정

truffle-config.json에서 어떤 네트워크에서 배포할지 설정해주자.

private 네트워크를 사용한다던가 여러가지를 사용할때 이 곳을 수정해주면된다.

예) ws로 geth를 실행할때, websockets: true로 사용하면 됨.

  networks: {
    development: {
      host: "127.0.0.1", // Localhost (default: none)
      port: 8545, // RPC 통신을 위한 포트
      network_id: "*", // 사용하고있는 chainId
   // websockets: true,     웹소켓 프로토콜을 사용하고 있는 경우
    },

 

 

 


트러플로 사용할 코드 작성하기

컴파일을 하기위해 새 솔리디티 파일 HelloWorld와 Migration을 만들어 contracts에 넣어주었다.

// contracts/HelloWorld.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;

contract HelloWorld{
  // public -> getter파일 생김 -> abi파일이 생겨야함 -> 어디서든지 꺼내쓸 수 있어야하니까
  string public value;

  constructor(){
    value="Hello World";
  }
  
  function setValue(string memory _v)public{
    value = _v;
  }
}

 

// contract/Migration
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;

contract Migration{
  address public owner = msg.sender;
  uint public last_completed_migration;
  
  modifier restricted(){
    require(
      msg.sender == owner,
      "This function is restricted to the contract's owner"
    );
    _;
  }
  
  function setCompleted(uint completed) public restricted{
    last_completed_migration = completed;
  }
}

 

 

 

트러플로 솔리디티 compile하기

다음 코드로 컴파일 해주면 아까는 없었던 build 디렉토리가 생기고, abi파일과 바이트코드 같은 정보들이 담겨있는 json 파일들이 생긴다.

$ npx truffle compile

 

 

가끔 이 상태에서 컴파일이 안되는 경우가 있는데,

HelloWorld 솔리디티 파일에 적어놓은 솔리디티 버젼과

truffle-config.json에 적혀있는 솔리디티 버젼이 달라서 생기는 이슈일 수 있다.

truffle-config.json에 현재 사용하고 있는 솔리디티 버젼으로 바꿔서 수정해주자.

  compilers: {
    solc: {
        // version: "0.5.4", 수정하기 전
        version: "0.8.15", //수정한 코드

 

 

 

 


migration으로 스마트 컨트랙트 배포하기

build/contracts 디렉토리 안에 있는 json파일을 가져오는 migration 파일을 생성하자.

  • articatcts.require("") : 솔리디티 코드를 컴파일한 json 파일 명
  • deploy : 트러플이 제공하는 배포를 위한 tool
  • deployer.deploy : 위에서 읽어온 계약 내용
// migrations/2_deploy_HelloWorld.js
// build/contracts/HelloWorld를 가져오는 코드
const helloWorld = artifacts.require("HelloWorld");

module.exports = function (deployer) {
    //abi파일과 바이트코드가 담겨있는 helloWorld를 배포할것이다.
    deployer.deploy(helloWorld);
};

 

 

migration 디렉토리를 보면 파일이 하나 만들어져있는데 파일명에 법칙이 있다.

번호만 겹치지 않는다면 다른것들은 중복되어도 괜찮다.

[번호]\_내용\_컨트랙트이름  ---->  1_initial_migration.js

 

 

컴파일 후 만들어진 build/contracts 안의 파일들을 불러오는 코드다.

이 파일들 안에는 abi파일과 바이트코드의 내용들이 들어있다.

 

 

설정이 끝났으면 다음 코드로 배포를 해주자.

( ganache 서버가 켜져있는지 확인하기! )

배포를 할때, migration.json이 먼저 배포되고 다음으로 다른 파일들이 배포된다.

$ npx truffle migration

// 싱글톤 인스턴스라서 update기능이 없다.
// 수정하려면 새로 배포해야한다.
$ npx truffle migration --reset

 

 

다음과 같은 결과가 나왔다면 무사히 스마트컨트랙트가 끝나고 마이닝도 끝났다는 뜻이다.

 

 

 

 

메타마스크를 확인하면 계정에 잔액이 줄어있는걸 확인할 수 있다.

스마트 컨트랙를 사용해서 거래를 했기때문에 사용료인 gas비를 냈기때문이다.

댓글