본문 바로가기
블록체인/블록체인 서비스 개발

[Klaytn] 설치부터 Deploy까지

by 마고커 2022. 1. 13.


비트코인 하나 사보지 않았지만, 무조건 비판하기보다 까더라도 뭘 알고 까자 생각해서 기본적인 블록체인 프로그래밍을 좀 보기로 했다. 회사 일에  엄청 흥미를 잃은 탓도 있지만.. 이더리움 쪽이 아무래도 시장이 더 넓겠지만, 클레이튼 쪽에 아는 분들도 좀 있고 자료도 한글화가 잘 되어 있을 것 같아서(아님), 아무튼 클레이튼을 좀 보기로 했다. 진짜 간단한 컨트랙트 하나 디플로이 하는데 고생 고생 개고생. 패키지 버전 호환성 다 맞춰줘야 하고, 개발환경 dependency 때문에 나는 에러들 인터넷 찾아서 다 해결해 줘야 하고.. 아무튼 최초 deploy는 성공했으니, 희망을 갖자. 참고로, 이 문서에서는 블록체인 컴퍼넌트들의 개념은 이야기하지 않고, 설치와 디플로이만 다룬다. 참고로 맥에서 테스트했고, 윈도우에서도 크게 다르지 않을 것이다.

 

1. node.js 설치

 

inflearn의 강의자료에서는 별 언급이 없었지만, 공식문서에는 10.16.0을 설치하라고 되어 있다. 이거 최신 버전 설치했다가, 뒤에 패키지 설치 하나도 안되어서 싹다 지우고 처음부터 다시 설치 ㅠ 10.16.0을 선택하면 npm은 6.9.0이 설치된다.

 

https://nodejs.org 에서 반드시 10.16.0 버전 선택

 

2. truffle 설치

 

공식문서에서 5.x 버전을 설치한다고 되어 있는데, 5.x의 최신버전을 설치하면, npm으로 node module을 설치할 때 오류를 일으키더라. 공식문서 예제처럼 5.0.27을 설치하면, 모듈 설치와 컴파일은 무사 통과하는데, baobab에 deploy하다가 klaytn 네트워크를 알지못한다고 오류를 일으킨다. inflearn 강의에서 추천하는 대로 4.1.15 버전을 설치한다. solidity version은 작성 예제에서 참고해야 한다.

 

> sudo npm uninstall -g truffle
> sudo npm install -g truffle@4.1.15
> truffle version
Truffle v4.1.15 (core: 4.1.15)
Solidity v0.4.25 (solc-js)

 

3. VS Code 설치 및 예제 fork

 

다른 개발 도구들도 있지만 vscode를 일단 사용한다. 설치는 https://code.visualstudio.com 에서 최신버전 받으면 된다. 다만, solidity  지원을 위해서 아래 확장팩(solidity)을 설치해 준다. 

 

 

예제의 내용은 설명하지 않는다. 따라서, 만들어진 예제를 가져오자. inflearn 강의에서 사용된 내용을 가져온다. 

 

> git clone https://github.com/kkagill/addition-game-starter.git

 

아래의 구조로 가져오는데, 빨간색 줄쳐진 부분은 수정하거나 추가해야 한다. deployedABI와 deployedAddress는 배포되는 ABI(App Binary Interface)와 주소를 기록하기 위한 파일으로, 그냥 해당 이름의 빈 파일 하나씩 만들어 준다. 

 

 

4. Node Module (Package) 설치

 

예제에서는 dependency가 있는 모듈들을 package.json에 정의하고 있다. VS code의 터미널을 하나 열어서, 위의 git이 설치된 디렉토리로 간 후, node module을 설치해 준다. 'npm install' 전에 관리자 권한으로 node-gyp을 먼저 설치해 준다. 그렇지 않으면, npm install 하다가 에러가 난다. node-gyp은 C++ 코드를 JS 애플리케이션에서 활용할 수 있게 .node로 묶어주는 모듈이라고 한다.

 

> sudo npm install --global node-gyp (중요!!) 
> npm install --global --production windows-build-tools (윈도우에서 VS Code를 사용하는 경우)
> cd <예제가설치된디렉토리>
> npm install

 

여기서 시간을 엄청 소모하는데, 첫번째가 1번에서 언급한 nodejs 버전 때문이었고, 그리고, 가끔씩 "Appears to be a git repo or submodule" 이라며 에러를 내 뱉어서 문제가 되었다. 그럴 때는 아래 명령으로 .git 디렉토리를 지워준다. 그러고 다시 npm install.

> rm -rf node_modules/*/.git/ (Linux or Mac)
> FOR /F %I in ('DIR /S /B /A:D .git') DO RD /S /Q %I (Window, node_module 디렉토리에서 실행)
> npm install

 

요 단계에서 엄청 시간을 썼다. ㅠ

 

5. 예제 수정

 

3번에 줄친 파일을 수정해 준다.

 

AdditionGame.sol

pragma solidity ^0.4.25;

contract AdditionGame {
    address public owner;

    constructor() public {
        owner = msg.sender;
    }
    
    function getBalance() public view returns (uint) {
        return address(this).balance;
    }

    function deposit() public payable {  
        require(msg.sender == owner);
    }   
  
    function transfer(uint _value) public returns (bool) {
        require(getBalance() >= _value);
        msg.sender.transfer(_value);
        return true;
    }
}

 

계약서 구현 모듈을 담고 있는 AdditionGame.sol은 가져온 파일에서 solidity verison(0.4.25)만 수정해 준다. 나머지 내용은 그대로 쓴다. 

 

2_deploy_contracts.js

const fs = require('fs')
const AdditionGame = artifacts.require('./AdditionGame.sol')

module.exports = function (deployer) {
  deployer.deploy(AdditionGame) 
    .then(() => {
        if (AdditionGame._json) {
            fs.writeFile('deployedABI', JSON.stringify(AdditionGame._json.abi),
                (err) => {
                    if (err) throw err;
                    console.log('파일에 ABI 입력 성공');
                }
            )

            fs.writeFile('deployedAddress', AdditionGame.address, 
                (err) => {
                    if (err) throw err;
                    console.log("파일에 주소입력 성공");
                }
            )
        }
    })
}

 

위 script는 계약서를 deploy하는 내용을 담고 있다. deployer가 deploy하는 모듈만 있으면 사실 할 일은 다 한건데, 제대로 수행됐는 지 파일에 기록하는 것이 .then() 이후 부분이다. 일단 복사해서 쓰자(git으로 받아온 내용에는 없다). 참고로 migration directory의 내용들은 truffle이 deploy할 때 파일이름의 숫자 순서대로 배포하게 된다. 

 

truffle.js

// truffle.js config for klaytn.
const PrivateKeyConnector = require('connect-privkey-to-provider')
const NETWORK_ID = '1001'
const GASLIMIT = '2000000'
const URL = 'https://api.baobab.klaytn.net:8651'
const PRIVATE_KEY = '0x1231231241241231' // 자신의 key로 수정

module.exports = {
    networks: {
        klaytn: {
            provider: new PrivateKeyConnector(PRIVATE_KEY, URL),
            network_id: NETWORK_ID,
            gas: GASLIMIT,
            gasPrice: null,
        }
    },
}

 

truffle.js는 klaytn에 contract을 실제로 배포하는 부분을 담고 있다. 위의 내용을 그대로 복사해서 일단 쓰자. 단, PRIVATE_KEY는 자신의 계정의 private key를 가져다 쓴다. klayton account는 여기에서 테스트넷 계정을 만들 수 있다.

 

6. 배포(deploy)

 

이제 필요한 모든 구성 요소는 만들어졌고 테스트넷에서 배포하는 일만 남았다. 

 

> truffle deploy --network klaytn
Using network 'klaytn'.

Running migration: 2_deploy_contracts.js
  Deploying AdditionGame...
  ... 0x429a341c0eda9a49d937b7606cce85329c99c24f8c9c1d99e3c79861046db1cd
  AdditionGame: 0x29784c3c11583d2db6c839b0d4c077286fd0da81
Saving successful migration to network...
파일에 ABI 입력 성공
파일에 주소입력 성공
  ... 0xdf9af3348e6359d00f2e3bfcaa11f5cee2067002cff8c64da0ac1beabccb82a6
Saving artifacts...

 

배포가 정상적으로 이루어졌는 지는 2_deploy_contract.js 에서 정의한 두 개(deployedABI, deployedAddress)의 파일 내용을 보면 된다. 

 

이제 어느 플랫폼이든 'hello, world' 찍는 것이 이렇게도 힘들어졌구나.. 



댓글