컨트랙트 배포 및 상태변경 : Truffle

707·2022년 7월 12일
1

솔리디티

목록 보기
2/5
post-thumbnail

스마트 컨트랙트를 배포하는 방법에는 크게

  1. geth 콘솔 이용하기
  2. Remix IDE 이용하기
  3. web3 라이브러리
  4. Truffle 프레임워크 이용하기 (얘는 web3.js 라이브러리 기반)
  5. Hard Hat 프레임워크 이용하기 (얘는 ethers.js라이브러리 기반)

이런 방법이 있다.

이전시간에는 geth 콘솔을 이용해서 스마트컨트랙트를 배포하고 - 해당 컨트랙트주소로 트랜잭션을 보내 상태를 바꾸는 작업을 해보았다.

오늘은truffle을 이용하여 같은 작업을 해보면서 어떻게 간단하게 컨트랙트의 배포를 할 수 있는지 확인해보자.



Truffle

1. 환경설정

sudo npm i -g truffle
truffle version

truffle을 글로벌로 설치해준다. 터미널에서 truffle 명령어를 사용할 수 있게 됨.
잘 설치되었는지는 version으로 확인을 해보면 된다. 잘 설치되었다면 truffle을 비롯하여 solidity와 web3등의 버전 정보가 출력된다.

디렉토리를 하나 생성한다. 이름은 truffle_example로 하였다.
해당 디렉토리 내부에서 다음 명령어를 실행한다.

truffle init

truffle 프레임워크의 여러 디렉토리가 생성된다.

크게 contracts와 migrations로 나누어진다.

contracts에는 솔리디티로 작성한 컨트랙트 파일을,
migrations에는 컴파일된 컨트랙트를 geth에 올리는 파일을 작성한다.

또한 truffle-config.js 파일이 생성되는 데 여기서 내가 돌리고 있는 private geth 네트워크에 연결해주면 된다.

network 속성에서 주석처리가 되어있던 development 부분의 주석을 풀고
포트번호를 디폴트인 8545에서 내 geth 서버인 9000번으로 변경해주었다.


2. sol 파일

contracts 디렉토리에 HelloWorld.sol 파일을 생성하였다.
내용은 어제 작성했던 HelloWorld.sol 파일을 약간 변경하였다.

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

contract HelloWorld {
  string public value; //public 추가!

  constructor() {
    value = "Hello World!";
  }

  function setValue(string memory _v) public {
    value = _v;
  }
}

기존에 있던 getValue 함수를 지우고 상태변수 선언 시에 public 키워드를 추가해주었다.
이 부분은 typescript가 솔리디티와 다른 점인데, 다른 솔리디티에서는 변수를 public으로 선언 시에는 자동으로 getter 함수를 만들어준다고 한다.
따라서 기존의 getValue 함수를 굳이 만들지 않아도 된다.
(❗️ 타입스크립트에서는 private/public을 명시하지 않을 시에 디폴트로 public으로 지정이 되어있지만 솔리디티에선 public을 명시하지 않으면 게터는 생성되지 않는다.)


❗️게터 & 세터

class에서 객체를 생성했을 때
변수의 값을 가져오는 메소드를 getter,
변수의 값을 변경하는 메소드를 setter 라고 부름




3. 컴파일

.sol파일을 contracts에 추가했다면 아래의 명령어를 터미널에 입력한다.

truffle compile

그러면 build 디렉토리가 생성되고 내부에는 sol파일이 컴파일된 결과물인
HelloWorld.json 파일이 생성된다.

🔥 Truffle Compile Error

처음엔 컴파일이 안되어 애를 먹었다.
컴파일 시에 다음과 같은 에러메세지가 떴다.

"Could not find a compiler version matching 0.8.15"

분명히 sol 파일에 작성한 것과 같은 solc 버전이 설치되어있고,
truffle-config.js 파일도 다음과 같이 일치했었다.

해당 에러 해결과정은

  1. cmd+shift+p에서
    ">Solidity: Change global compiler version (remote)" 입력
    이 중에서 내가 원하는 버전인 0.8.15 선택

  2. 그래도 해결 안되면 아래와 같이 명령어 입력

sudo rm -rf ~/Library/Preferences/truffle-nodejs

(❗️참조 : https://stackoverflow.com/questions/70570669/could-not-find-a-compiler-version-matching-0-8-2-error-from-truffle-on-macos-w )

이렇게 하니까 해결됨.



4. migration

migrations 디렉토리에 파일을 작성한다.
여기서 파일명을 정할 때는 규칙이 있는데
번호_내용_컨트랙트이름의 구조로 만들어야 한다. 그리고 각각의 파일이 중복된 번호를 가지면 안된다.

이미 1번 파일이 있어서 해당 파일을 삭제하진 않고
2_deploy_HelloWorld.js 파일을 생성하였다.

const helloWorld = artifacts.require("HelloWorld"); 
// build 디렉토리 안의 HelloWorld.json 파일 가져옴

module.exports = function (deployer) {
  deployer.deploy(helloWorld);
};

간단한 코드로 배포가 가능하다 ㅎㅎ

이제 배포를 진행하여야 하는데 이때 필요한 조건이 바로 geth에서 마이닝 실행중일 것이다. 배포를 한다는 것은 블록체인 네트워크에 내가 작성한 스마트컨트랙트를 트랜잭션에 담아 올린다는 것이니까, 그러기 위해서는 트랜잭션이 발생하면 이를 담을 블록이 생성되야한다. 그래서 ❗️ 마이닝을 먼저 켜두고 ❗️ 아래의 코드를 실행한다.

truffle migration

이렇게 뜨면 배포가 완료된 것이다.



5. truffle console

배포가 된 컨트랙트를 확인해보자.
터미널에 다음과 같이 입력하면 콘솔창이 뜬다.

truffle console

이전까지 잘 사용했던 geth 콘솔과 마찬가지로 동작중인 geth에 attach되어 사용하는 콘솔이라고 생각하면 된다.

배포했던 컨트랙트명을 입력한 뒤 뒤에 .을 쓰고 탭을 두번 누르면 사용가능한 메소드의 목록을 확인할 수 있다. 잘 뜬다면 배포가 잘 된것이다.

truffle(development)> HelloWorld.address

배포한 컨트랙트의 CA가 뜬다.



6. 인스턴스 생성해서 상태변경하기

콘솔에서 컨트랙트의 상태변수 값을 변경할 수 있다.

// 인스턴스 생성
truffle(development)> HelloWorld.deployed().then(instance => hello = instance)

// getter, setter 메소드 사용
truffle(development)> hello.value() : 'hello world'
truffle(development)> hello.setValue('707') : 트랜잭션 발동함
truffle(development)> hello.value() : '707'

이전에 했던 것과 마찬가지로 인스턴스를 생성한 뒤, 만들어둔 메소드로 상태변수의 값을 읽거나 변경할 수 있다.
(❗️여기서 세터가 실행될 때는 트랜잭션이 발동해야 하므로 이때도 꼭 geth에서 마이닝이 실행되는 상태여야한다. )



7. 정리

이상으로 Truffle을 사용하여 컨트랙트의 배포 및 상태변경을 진행해보았다.
과정은 크게

  1. truffle init
  2. sol파일 작성 후 컴파일
  3. migration 파일 작성 후 배포
  4. console에서 상태변경

이렇게 나뉘고 트러플을 이용하면 짧은 코드로 편하게 이 과정을 진행할 수 있었다 👍





0개의 댓글