본문으로 건너뛰기

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

시작하기 전에 몇 가지 클레이튼 관련 용어에 대해 알아봅시다.

  • 엔드포인트 노드 (EN): 클레이튼 네트워크에 대한 JSON-RPC API 요청을 처리하는 노드입니다. 엔드포인트 노드는 컨센서스에 참여하지 않습니다.
  • KLAY: 클레이튼 네이티브 코인.
  • caver-js: 클레이튼 JSON-RPC API의 JavaScript 구현.
  • Baobab: 클레이튼 테스트넷
  • Cypress: 클레이튼 메인넷

이 단계별 가이드는 Baobab 테스트넷의 엔드포인트 노드 (EN)을 시작하고 새 계정으로 기본 스마트 컨트랙트를 구축하는 과정을 단계별로 안내합니다. 이 튜토리얼은 EN을 설정하는 방법과 EN을 통해 스마트 컨트랙트를 배포하는 방법의 두 부분으로 구성되어 있습니다.

스마트 컨트랙트를 배포하고 트랜잭션을 제출하려면 KLAY에서 트랜잭션 수수료가 필요하기 때문에 본 가이드에서는 Baobab 테스트넷을 사용합니다. 개발 목적으로 테스트넷 KLAY는 Baobab Faucet에서 받을 수 있습니다.

엔드포인트 노드 시작

엔드포인트 노드 다운로드 및 초기화(EN)

제공된 ken 바이너리 패키지의 압축을 풀고 파일을 klaytn 폴더에 복사합니다.

참고: ken으로 시작하는 적절한 패키지를 다운로드하세요.

Mac 사용자의 경우, 다음 명령으로 다운로드한 파일의 압축을 풉니다.


$ tar zxf ken-baobab-vX.X.X-X-darwin-amd64.tar.gz
$ export PATH=$PATH:$PWD/ken-darwin-amd64/bin

Linux 사용자의 경우, 다음 명령으로 다운로드한 파일의 압축을 풉니다.


$ tar zxf ken-baobab-vX.X.X-X-linux-amd64.tar.gz
$ export PATH=$PATH:$PWD/ken-linux-amd64/bin

블록체인 데이터를 저장할 데이터 디렉터리를 만들어야 합니다. 이 튜토리얼에서는 홈 디렉터리에 kend_home 폴더를 만들겠습니다.


$ mkdir -p ~/kend_home

EN 구성하기

구성 파일인 kend.confken-xxxxx-amd64/conf/ 아래에 있습니다. 설정 가능한 파라미터에 대한 자세한 내용은 EN 구성 가이드를 참고하시기 바랍니다. Baobab 테스트넷의 EN을 실행하려면 아래와 같이 kend.conf 파일을 업데이트합니다.


# cypress, baobab is only available if you don't specify NETWORK_ID.
NETWORK="baobab"
# if you specify NETWORK_ID, a private network is created.
NETWORK_ID=
...
RPC_API="klay,net" # net module should be opened for truffle later on.
...
DATA_DIR=~/kend_home

EN 론칭하기

EN을 실행하려면 다음 명령을 실행합니다.


$ kend start
Starting kend: OK

EN 확인

EN이 실행 중인지 확인하려면 다음 명령을 실행하세요.


$ kend status
kend is running

EN 로그 확인하기

EN의 로그를 확인하려면 다음 명령을 실행하세요.


$ tail -f ~/kend_home/logs/kend.out
...
INFO[03/26,15:37:49 +09] [5] Imported new chain segment blocks=1 txs=0 mgas=0.000 elapsed=2.135ms mgasps=0.000 number=71340 hash=f15511…c571da cache=155.56kB
...

문제 해결

클레이튼 엔드포인트 노드 실행에 문제가 있는 경우 문제 해결을 참고하시기 바랍니다.

계정 충전하기

콘솔에 연결하기

클레이튼 엔드포인트 노드는 JavaScript 콘솔과 함께 제공됩니다. 콘솔 명령줄에서 EN에 클레이튼 API 호출의 일부를 시작할 수 있습니다. JavaScript 콘솔에 접속하려면 다음 명령을 실행하세요.


$ ken attach ~/kend_home/klay.ipc
Welcome to the Klaytn JavaScript console
!instance: Klaytn/vX.X.X/XXXX-XXXX/goX.X.X
datadir: ~/kend_home
modules: admin:1.0 debug:1.0 governance:1.0 istanbul:1.0 klay:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0
>

참고: 모든 블록을 다운로드할 때까지 기다려야 합니다. Enter klay.blockNumber in a console and check whether it matches the current block number here

참고: 사용 가능한 기능 목록을 보려면 klay 또는 personal을 입력하세요.

클레이튼 계정 생성하기

JavaScript 콘솔에서 새 클레이튼 계정을 생성하려면 다음 명령을 실행합니다. 입력한 비밀번호로 개인키가 암호화됩니다.


> personal.newAccount()
Passphrase: # enter your passphrase
Repeat passphrase:
"0x75a59b94889a05c03c66c3c84e9d2f8308ca4abd" # created account address

키스토어 파일은 kend.conf에 설정된 EN 데이터 디렉터리 DATA_DIRkeystore 폴더에 생성됩니다. 빠른 시작 기본 지침을 따르는 경우 ~/kend_home/keystore/가 되어야 합니다.


$ ls ~/kend_home/keystore/
UTC--2019-06-24T11-20-15.590879000Z--75a59b94889a05c03c66c3c84e9d2f8308ca4abd

클레이튼 계정 잠금 해제하기

생성한 계정을 잠금 해제하려면 다음 명령을 실행합니다. 300초 동안 계정이 잠금 해제됩니다.

Note: If you want to manually set the unlock duration, refer to this link.

경고: 계정 잠금 해제는 신중하게 수행하지 않으면 매우 위험할 수 있습니다. 해커가 EN을 해킹하면 해커가 토큰을 탈취할 가능성이 있습니다. 더 안전한 방법을 사용하려면 개인키를 사용한 배포 가이드를 참조하세요.


> personal.unlockAccount('75a59b94889a05c03c66c3c84e9d2f8308ca4abd') # account address to unlock
Unlock account 75a59b94889a05c03c66c3c84e9d2f8308ca4abd
Passphrase: # enter your passphrase
true

Baobab Faucet에서 테스트넷 KLAY 받기

  • KlaytnWallet에서 Baobab Faucet 사용하기.

  • https://baobab.wallet.klaytn.foundation에 접속합니다.

  • 월렛에서 새 계정을 생성하거나 위의 EN JavaScript 콘솔에서 생성한 키스토어 파일을 사용하여 월렛에 로그인할 수 있습니다.

  • 왼쪽 창 메뉴에서 "KLAY Faucet"로 이동하여 "Run Faucet" 버튼을 클릭하고 150 KLAY를 받습니다.

    KLAY Faucet은 24시간에 한 번씩 실행할 수 있습니다.

  • KLAY를 받기 위해 새 계정을 생성한 경우, EN에서 생성한 계정으로 KLAY를 보내세요.

계정 잔액 확인하기

계정 잔액을 확인하려면 다음 명령을 실행하세요.

기본 단위는 peb (1 KLAY = 10^18 peb)입니다. KLAY 단위에 대한 자세한 정보는 KLAY 단위에서 확인할 수 있습니다.


> klay.getBalance('75a59b94889a05c03c66c3c84e9d2f8308ca4abd') # enter your account address
1e+21 # 1000 KLAY

콘솔 종료하기

JavaScript 콘솔을 종료하려면 다음 명령을 실행합니다.


> exit
$

개발 도구 설치

caver-js 설치하기

이렇게 klaytn 프로젝트 디렉터리를 생성하는 것이 좋습니다:


$ mkdir $HOME/klaytn

진행하려면 npmnode.js가 설치되어 있어야 합니다. 시스템에 설치하려면 get-npmnode.js를 참조하세요.

caver-js는 클레이튼 네트워크를 위한 JSON RPC 프레임워크입니다(이더리움의 web3.js에 해당). caver-js를 설치에 앞서에 npm init 명령어를 통해 package.json 파일을 생성한 후, npm install caver-js를 입력해 caver-js를 설치해야 합니다.


$ npm init # initialize npm at the klaytn project directory
$ npm install caver-js

참고: caver-js를 이미 설치한 경우 최신 버전으로 업데이트하세요.


$ npm cache clean --force # initialize npm cache
$ npm install caver-js@latest # update caver-js to the latest version

caver-js를 업데이트하는 동안 다음과 같은 오류가 발생하면 websocket 디렉터리에서 .git 폴더를 제거하세요.


npm ERR! path /Users/username/klaytn/node_modules/websocket
npm ERR! code EISGIT
npm ERR! git /Users/username/klaytn/node_modules/websocket: Appears to be a git repo or submodule.
npm ERR! git /Users/username/klaytn/node_modules/websocket
npm ERR! git Refusing to remove it. Update manually,
npm ERR! git or move it out of the way first.
npm ERR! A complete log of this run can be found in:
npm ERR! /Users/username/.npm/_logs/2019-06-25T01_49_37_032Z-debug.log​
$ rm /Users/username/klaytn/node_modules/websocket/.git

참고: web3.js에서 web3.eth...로 시작하는 모든 함수 호출의 경우 caver.klay...로 대체해야 합니다.

web3.eth.sendTransaction({ ... }) (X)

caver.klay.sendTransaction({ ... }) (O)

Truffle 설치하기

이 튜토리얼에서는 Truffle을 사용하여 Solidity로 작성된 스마트 컨트랙트를 컴파일하고 배포합니다. 현재 Klaytn은 Truffle 버전 4.1.15를 지원합니다. Truffle에 대한 자세한 내용은 다음 사이트를 참고하세요:

Truffle을 전역적 또는 지역적으로 설치할 수 있습니다.

  • 전역적으로 설치하려면 다음 명령을 실행합니다.

$ sudo npm install -g truffle@4.1.15
$ cd /usr/local/lib/node_modules/truffle
$ sudo npm install solc@0.5.6
$ cd -

또는

  • 지역적으로 설치하려면 다음 명령을 실행합니다.

# Assuming you are in $HOME/klaytn/.
$ npm install truffle@4.1.15
$ cd node_modules/truffle
$ npm install solc@0.5.6
$ cd -
$ ln -s node_modules/truffle/build/cli.bundled.js truffle
$ export PATH=`pwd`:$PATH

vvisp 설치하기

vvisp는 스마트 컨트랙트 개발을 위한 사용하기 쉬운 CLI 도구/프레임워크이며, HEACHI LABS에서 제공합니다. 명령어 하나로 클레이튼 스마트 컨트랙트의 환경 설정, 배포, 실행을 쉽게 할 수 있습니다. Truffle 프레임워크를 지원하므로 Truffle에 익숙한 개발자도 어려움 없이 vvisp를 사용할 수 있습니다.

여기서는 vvisp를 설치하고 이를 이용해 클레이튼 dApp 개발 환경을 설정하는 방법을 소개합니다.

다음 명령어를 실행하여 npm 또는 yarn이 있는 경우 vvisp를 쉽게 설치할 수 있습니다:


$ npm install -g @haechi-labs/vvisp
# or if you use yarn
$ yarn global add @haechi-labs/vvisp

설치가 완료되면 vvisp 명령을 사용하여 제대로 설치되었는지 확인할 수 있습니다. 참고: v2.1.0 이상의 버전을 사용해야 합니다.


$ vvisp
Usage: vvisp <command> [options]
where <command> is one of: compile, console, deploy-contract, deploy-service, flatten, gen-script, init
Options:
-v, --version output the version number
-h, --help output usage information
Commands:
compile [files...] compile the smart contracts
console [script-api-path] run interactive shell to execute contract scripts
deploy-contract <file> [arguments...] deploy the smart contracts
deploy-service deploy or upgrade smart contract service using the deployment configure file
flatten <files...> flatten the smart contracts
gen-script [files...] generate javascript libraries communicating the smart contracts
init [name] initialize directory to use vvisp
# you can check installed version.
$ vvisp --version
v2.1.0

스마트 컨트랙트 배포

이제 클레이튼 스마트 컨트랙트를 개발하고 배포할 준비가 되었습니다!

프로젝트 디렉터리 만들기

먼저 소스 코드가 있는 디렉터리를 만듭니다.


$ mkdir klaytn-testboard
$ cd klaytn-testboard

Truffle 초기화하기

컨트랙트 배포를 위해 Truffle을 초기화합니다.


$ truffle init

Solidity에서 간단한 스마트 컨트랙트 작성하기

klaytn-testboard/contracts 디렉터리에 KlaytnGreeter.sol을 생성합니다.


$ cd contracts
$ touch KlaytnGreeter.sol
$ vi KlaytnGreeter.sol

KlaytnGreeter.sol에 다음 코드를 작성합니다.


pragma solidity 0.5.6;
contract Mortal {
/* Define variable owner of the type address */
address payable owner;
/* This function is executed at initialization and sets the owner of the contract */
constructor () public { owner = msg.sender; }
/* Function to recover the funds on the contract */
function kill() public payable { if (msg.sender == owner) selfdestruct(owner); }
}
contract KlaytnGreeter is Mortal {
/* Define variable greeting of the type string */
string greeting;
/* This runs when the contract is executed */
constructor (string memory _greeting) public {
greeting = _greeting;
}
/* Main function */
function greet() public view returns (string memory) {
return greeting;
}
}

마이그레이션 스크립트 수정하기


$ cd ..
$ cd migrations
$ vi 1_initial_migration.js

1_initial_migration.js`를 다음과 같이 수정합니다.


const Migrations = artifacts.require("./Migrations.sol");
const KlaytnGreeter = artifacts.require("./KlaytnGreeter.sol");
module.exports = function(deployer) {
deployer.deploy(Migrations);
deployer.deploy(KlaytnGreeter, 'Hello, Klaytn');
};

Truffle을 사용하여 스마트 컨트랙트 배포하기

Truffle.js에 클레이튼의 네트워크 정보를 입력합니다.

경고: 현재 Klaytn Baobab 네트워크의 가스 가격은 25Gpeb (다른 숫자를 사용하려고 하면 오류를 반환합니다)로 고정되어 있습니다.


$ cd ..
$ vi truffle-config.js

아래와 같이 구성을 수정합니다.


// truffle-config.js
module.exports = {
networks: {
klaytn: {
host: '127.0.0.1',
port: 8551,
from: '0x75a59b94889a05c03c66c3c84e9d2f8308ca4abd', // enter your account address
network_id: '1001', // Baobab network id
gas: 20000000, // transaction gas limit
gasPrice: 25000000000, // gasPrice of Baobab is 25 Gpeb
},
},
compilers: {
solc: {
version: "0.5.6" // Specify compiler's version to 0.5.6
}
}
};

다음 명령을 사용하여 컨트랙트를 배포합니다.

참고: 배포할 네트워크를 선택하려면 --network를 사용하고 덮어쓰려면 --reset을 사용합니다.

참고: 클레이튼 노드가 실행 중인지 확인하세요.

컨트랙트 주소 뒤에 KlaytnGreeter'가 표시됩니다:


$ truffle deploy --network klaytn --reset
Using network 'klaytn'.
Running migration: 1_initial_migration.js
Deploying Migrations...
... 0x0f5108bd9e51fe6bf71dfc472577e3f55519e0b5d140a99bf65faf26830acfca
Migrations: 0x97b1b3735c8f2326a262dbbe6c574a8ea1ba0b7d
Deploying KlaytnGreeter...
... 0xcba53b6090cb4a118359b27293ba95116a8f35f66ae50fbd23ae1081ce9ffb9e
KlaytnGreeter: [SAVE THIS ADDRESS!!] # this is your smart contract address
Saving successful migration to network...
... 0x14eb68727ca5a0ac767441c9b7ab077336f9311f71e9854d42c617aebceeec72
Saving artifacts...

경고: 계정이 잠겨 있으면 오류를 반환합니다.


Running migration: 1_initial_migration.js
Replacing Migrations...
... undefined
Error encountered, bailing. Network state unknown. Review successful transactions manually.
Error: authentication needed: password or unlock

이렇게 계정을 잠금 해제할 수 있습니다.


> personal.unlockAccount('0x775a59b94889a05c03c66c3c84e9d2f8308ca4abd')
Unlock account 0x75a59b94889a05c03c66c3c84e9d2f8308ca4abd
Passphrase:
true

이제 준비가 완료되었습니다. 다시 배포해 보세요.

배포 확인

caver-js를 사용하여 배포된 바이트 코드 확인하기

배포된 스마트 컨트랙트의 바이트 코드를 확인하려면 getCode를 사용합니다.

먼저 테스트 파일을 만들어서 엽니다.


$ touch test-klaytn.js
$ open test-klaytn.js

다음 테스트 코드를 작성합니다. 방금 배포한 컨트랙트 주소를 입력해야 합니다.


// test-klaytn.js
const Caver = require('caver-js');
const caver = new Caver('http://127.0.0.1:8551');
// enter your smart contract address
const contractAddress = '0x65ca27ed42abeef230a37317a574058ff1372b34'
caver.klay.getCode(contractAddress).then(console.log);

코드를 실행합니다.


$ node test-klaytn.js
0x60806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806341c0e1b514610051578063cfae321714610068575b600080fd5b34801561005d57600080fd5b506100666100f8565b005b34801561007457600080fd5b5061007d610189565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100bd5780820151818401526020810190506100a2565b50505050905090810190601f1680156100ea5780820380516001836020036101000a031916815260200191505b509250505060405180...

배포된 스마트 컨트랙트에서 함수 호출하기

JavaScript를 사용하여 컨트랙트에서 greet()를 호출합니다.

참고: 스마트 컨트랙트에서 특정 함수를 호출하기 위해서는 ABI (Application Binary Interface) 파일이 필요합니다. Truffle은 컨트랙트를 배포할 때 ./build/contracts/abi 속성이 포함된 .json 파일을 자동으로 생성합니다.

위에 작성한 테스트 코드에 다음 줄을 추가합니다.


// test-klaytn.js
const Caver = require('caver-js');
const caver = new Caver('http://127.0.0.1:8551');
// enter your smart contract address
const contractAddress = '0x65ca27ed42abeef230a37317a574058ff1372b34'
caver.klay.getCode(contractAddress).then(console.log);
// add lines
const KlaytnGreeter = require('./build/contracts/KlaytnGreeter.json');
// enter your smart contract address
const klaytnGreeter = new caver.klay.Contract(KlaytnGreeter.abi, contractAddress);
klaytnGreeter.methods.greet().call().then(console.log);

테스트 코드를 실행합니다.


$ node test-klaytn.js
0x60806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806341c0e1b514610051578063cfae321714610068575b600080fd5b34801561005d57600080fd5b506100666100f8565b005b34801561007457600080fd5b5061007d610189565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100bd5780820151... # This is from caver.klay.getCode
Hello, Klaytn # This is from KlyatnGreeter.methods.greet()

"안녕하세요, 클레이튼입니다"라는 메시지가 표시되면 작업을 완료한 것입니다. 축하합니다!

Make this page better