첫 스마트 컨트랙트 작성과 테스트넷 배포 [TIL / 이더리움]

알락·2022년 11월 9일
1

이더리움

목록 보기
1/16

solidity banner

본격적으로 스마트 컨트랙트를 배우기 앞서, 실험을 해보고 싶었다. 어떤 식으로 스마트 컨트랙트가 테스트넷에 배포되는지에 대해서 말이다.
사실 이전에도 여러번 시도를 해봤는데, 에러가 속출해서 다른 공부 때문에 접어두었다. 하지만 이제 정말 때가 된 것 같다.

테스트넷

준비해야 할 프레임워크가 있다. 바로 TruffleGanache다. 둘 다 먹는 것을 이름으로 지었는데 Ganache 특히 맛있어 보여 매번 군침이 돈다. 내가 이해한 바, Truffle은 EVM을 이용하는 새로운 네트워크를 만들어 개발자가 만든 스마트 컨트랙트를 시험해볼 수 있는 환경을 만들어 준다. 특히 Ganache는 새로운 네트워크 생성과 관리를 간편하게 해주어 Truffle과 같이 사용하고 있다.
Remix IDE도 자체적으로 이를 제공해주고 물론 설정도 가능하겠지만, TruffleGanache는 로컬에서 돌리는 느낌이라 더 가벼운 느낌이다.
이더리움에는 유명한 테스트넷이 많은데 이를테면 Ropsten이 있다. PoW였을 때는 채굴 난이도를 대폭 낮춰 실제로 채굴도 가능하다고 했었는데, 현재는 어떤지 모르겠다. 그보다 내가 로컬에서 Ganache로 만든 로컬 이더리움 네트워크도 테스트넷이라고 해도 될 지 고민이다. 일단은 이 글과 한동안은 일반적인 용어와 내가 생각하는 용어로 동일하게 쓰도록 하겠다.


Truffle && Ganache 설치

우선 최신 버전의 Node가 설치되어 있어야 한다!

> npm install -g truffle ganache-cli

Ganache-cli 실행하기

우선 ganache-cli를 돌려보자.

> ganache-cli

run ganache-cli

위와 같은 화면이 나오면 성공적으로 작동하고 있는 것이다. 잠깐 화면에 표시된 내용을 살펴본다.

  • Avaliable Accounts : 만들어진 지갑 주소들이다. 각각에 100ETH이 있다.
  • Private Keys : 값 지갑의 개인키 목록이다.
  • HD Wallet : 0번 지갑에 해당하는 니모닉 주소와 HD지갑 경로를 확인할 수 있다.
  • Gas Price : 가스 당 지불할 비용
  • Gas Limit : 작업에 이용될 가스

사실 GUI도 제공하고 있기 때문에 굳이 이 방법을 사용할 필요는 없다. 하단부에 어떤 포트에서 작동하고 있는지가 중요하다.


스마트 컨트랙트 작업공간 만들기

아무 폴더 경로에 들어가 초기 설정을 해준다. 본인 같은 경우는 최종폴더의 이름이 "helloworld"이다. 해당 폴더에서 다음과 같은 명령을 실행한다.

/helloworld > truffle init

그럼 해당 작업공간에 다음과 같은 구조로 디렉터리가 만들어질 것이다.

+-- helloworld
	+-- build
    +-- contracts
    +-- migrations
    +-- test
    +-- truffle-config.js
  • build 디렉터리 : 배포된 스마트 컨트랙트 각각의 정보를 저장하고 있다.
  • contracts 디렉터리 : 우리가 직접 작성하는 스마트 컨트랙트들이 저장될 디렉터리다.
  • migrations 디렉터리 : 작성한 스마트 컨트랙트를 어떻게 배포할 것인지 설정을 하는 파일들을 모은 곳이다.
  • truffle-config.js 파일 : truffle 관련 설정을 담고 있는 파일이다.

먼저 truffle-config.js 파일의 설정을 해줘야 한다. 본인의 경우는 안쪽의 있는 내용을 다 지워도 되는지 몰라서 우선 "development" 부분만 다음과 같이 수정해주었다. 현재 실행되고 있는 Ganache 네트워크와 연결하는 것이다.

module.exprots = {
 development : {
   host : "127.0.0.1",
   port : 8545,
   network_id: "*",
 }
}

스마트 컨트랙트 작성하기

우선 contractsTruffleTutorial.sol라는 파일을 만들어 다음과 같이 작성해주었다.

[TruffleTutorial.sol]

pragma solidity >= 0.4.22 < 0.9.0;

contract TruffleTutorial {
    address public owner = msg.sender;
    string public message;

    constructor() public{
        message = "Hello World";
    }

    modifier ownerOnly(){
        require(
            msg.sender == owner,
            "This function is restrictied to the contarcts's owner"
        );
        _;
    }

    function setMessage(string memory _message)
        public
        ownerOnly
        returns(string memory)
    {
        require(bytes(_message).length > 0);
        message = _message;
        return message;
    }
    
}

간단히 작성된 스마트 컨트랙트를 설명하겠다. 컨트랙트명은 TruffleTutorial이다. 스마트 컨트랙트가 처음 생성이 될 때 주소값을 저장하는 owner에는 네트워크에 스마트 컨트랙트를 배포한 유저의 주소값을 저장했다. 그리고 그리고 message 변수에는 "Hello World"를 저장하였다.
ownerOnly라는 함수는 수정자인데, 현재는 조건문 같은 함수라고 생각하면 될 것 같다. 이 스마트 컨트랙트가 배포된 이후에 실행이 될 때, 실행시킨 사람의 주소가 해당 스마트 컨트랙트를 생성한 사람인지 확인하는 함수다. 다른 함수를 생성할 때 상속하듯이 사용하면 ownerOnly 함수에서 명시하고 있는 조건이 갖춰줘야만 함수가 실행된다.
setMessage는 간단히 메시지에 새로운 메시지 값을 저장하는 함수다. 스마트 컨트랙트 배포자가 맞는지 확인이 된 경우에만 새로운 메시지를 저장할 수 있다. 잘 저장된 메시지는 반환된다.


스마트 컨트랙트 배포하기

이제 만든 스마트 컨트랙트를 Ganache 테스트넷에서 배포해보자.
이전에 해야될 일이 있다. migrations 폴더에서 Truffle이 작성한 스마트 컨트랙트를 인지하고 배포시키게 설정해줘야 한다. 이유를 모르겠지만 여기서 작성되는 설정은 앞에 중복되지 않는 숫자값을 가져야 한다. 본인은 1_TruffleTutorial_migration.js라고 제목을 설정하여 작성해주었다.

[1_TruffleTutorial_migration.js]

const TruffleTutorial = artifacts.require("TruffleTutorial");

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

이상 모든 배포 준비는 끝났다. 본격적으로 배포 명령만 하면 된다.

배포 명령

> truffle migration --reset

위의 명령이 작업 공간에서 실행이 되면 다음과 같은 출력화면을 볼 수 있다.

truffle output

다음은 Ganache의 화면이다.

Ganache output

위와 같은 화면을 모두 확인할 수 있다면 배포도 무사히 마친 것이다.


스마트 컨트랙트 실행

그럼 이제 스마트 컨트랙트를 실행해보자. 우선 truffle 로 접속한다.

> truffle consoloe
truffle(develop) > // 여기서 모든 명령 실행

smart contract execution

위와 같이 테스트넷에 배포된 스마트 컨트랙트 TruffleTutorial에 접근하여 실행이 가능하다. 테스트넷에서 실행한다고 해도, 가스비를 내는 것을 확인할 수 있다. 메시지도 바꿔봤다. 배포할 때와 트러플 CLI를 사용할 때 별다른 설정이 없으면 모두 동일한 계정을 소유한 유저가 기본값이 되는 것 같다.


소감

이상으로 처음 스마트 컨트랙트를 테스트넷에 배포하여 실행까지 해봤다. 이제 슬슬 개념으로만 익혀온 블록체인의 실체에 가까워진 느낌이다. 기본적인 사용방법은 알았으니 솔리디티Truffle, Ganache가 제공하는 다른 기능들을 배워나가야 할 것 같다.

profile
블록체인 개발 공부 중입니다, 프로그래밍 공부합시다!

0개의 댓글