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.conf
는 ken-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 statuskend 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.ipcWelcome 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 passphraseRepeat passphrase:"0x75a59b94889a05c03c66c3c84e9d2f8308ca4abd" # created account address
키스토어 파일은 kend.conf
에 설정된 EN 데이터 디렉터리 DATA_DIR
의 keystore
폴더에 생성됩니다. 빠른 시작 기본 지침을 따르는 경우 ~/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 unlockUnlock account 75a59b94889a05c03c66c3c84e9d2f8308ca4abdPassphrase: # enter your passphrasetrue
Baobab Faucet에서 테스트넷 KLAY 받기
-
KlaytnWallet에서 Baobab Faucet 사용하기.
-
월렛에서 새 계정을 생성하거나 위의 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 address1e+21 # 1000 KLAY
콘솔 종료하기
JavaScript 콘솔을 종료하려면 다음 명령을 실행합니다.
> exit$
개발 도구 설치
caver-js 설치하기
이렇게 klaytn 프로젝트 디렉터리를 생성하는 것이 좋습니다:
$ mkdir $HOME/klaytn
진행하려면
npm
과node.js
가 설치되어 있어야 합니다. 시스템에 설치하려면 get-npm 및 node.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/websocketnpm ERR! code EISGITnpm ERR! git /Users/username/klaytn/node_modules/websocket: Appears to be a git repo or submodule.npm ERR! git /Users/username/klaytn/node_modules/websocketnpm 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 저장소 - https://github.com/trufflesuite/truffle
- Truffle 문서 - https://trufflesuite.com/docs
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 개발 환경을 설정하는 방법을 소개합니다.
- vvisp 리포지토리 - https://github.com/HAECHI-LABS/vvisp
- vvisp 문서 - https://github.com/HAECHI-LABS/vvisp/blob/dev/README_KLAYTN.md
다음 명령어를 실행하여 npm 또는 yarn이 있는 경우 vvisp를 쉽게 설치할 수 있습니다:
$ npm install -g @haechi-labs/vvisp# or if you use yarn$ yarn global add @haechi-labs/vvisp
설치가 완료되면 vvisp 명령을 사용하여 제대로 설치되었는지 확인할 수 있습니다. 참고: v2.1.0 이상의 버전을 사용해야 합니다.
$ vvispUsage: vvisp <command> [options]where <command> is one of: compile, console, deploy-contract, deploy-service, flatten, gen-script, initOptions: -v, --version output the version number -h, --help output usage informationCommands: 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 --versionv2.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.jsmodule.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 --resetUsing 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 addressSaving successful migration to network... ... 0x14eb68727ca5a0ac767441c9b7ab077336f9311f71e9854d42c617aebceeec72Saving artifacts...
경고
: 계정이 잠겨 있으면 오류를 반환합니다.
Running migration: 1_initial_migration.js Replacing Migrations... ... undefinedError encountered, bailing. Network state unknown. Review successful transactions manually.Error: authentication needed: password or unlock
이렇게 계정을 잠금 해제할 수 있습니다.
> personal.unlockAccount('0x775a59b94889a05c03c66c3c84e9d2f8308ca4abd')Unlock account 0x75a59b94889a05c03c66c3c84e9d2f8308ca4abdPassphrase:true
이제 준비가 완료되었습니다. 다시 배포해 보세요.
배포 확인
caver-js를 사용하여 배포된 바이트 코드 확인하기
배포된 스마트 컨트랙트의 바이트 코드를 확인하려면 getCode
를 사용합니다.
먼저 테스트 파일을 만들어서 엽니다.
$ touch test-klaytn.js$ open test-klaytn.js
다음 테스트 코드를 작성합니다. 방금 배포한 컨트랙트 주소를 입력해야 합니다.
// test-klaytn.jsconst Caver = require('caver-js');const caver = new Caver('http://127.0.0.1:8551');// enter your smart contract addressconst contractAddress = '0x65ca27ed42abeef230a37317a574058ff1372b34'caver.klay.getCode(contractAddress).then(console.log);
코드를 실행합니다.
$ node test-klaytn.js0x60806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806341c0e1b514610051578063cfae321714610068575b600080fd5b34801561005d57600080fd5b506100666100f8565b005b34801561007457600080fd5b5061007d610189565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100bd5780820151818401526020810190506100a2565b50505050905090810190601f1680156100ea5780820380516001836020036101000a031916815260200191505b509250505060405180...
배포된 스마트 컨트랙트에서 함수 호출하기
JavaScript를 사용하여 컨트랙트에서 greet()
를 호출합니다.
참고: 스마트 컨트랙트에서 특정 함수를 호출하기 위해서는 ABI (Application Binary Interface) 파일이 필요합니다. Truffle은 컨트랙트를 배포할 때 ./build/contracts/
에 abi
속성이 포함된 .json 파일을 자동으로 생성합니다.
위에 작성한 테스트 코드에 다음 줄을 추가합니다.
// test-klaytn.jsconst Caver = require('caver-js');const caver = new Caver('http://127.0.0.1:8551');// enter your smart contract addressconst contractAddress = '0x65ca27ed42abeef230a37317a574058ff1372b34'caver.klay.getCode(contractAddress).then(console.log);// add linesconst KlaytnGreeter = require('./build/contracts/KlaytnGreeter.json');// enter your smart contract addressconst klaytnGreeter = new caver.klay.Contract(KlaytnGreeter.abi, contractAddress);klaytnGreeter.methods.greet().call().then(console.log);
테스트 코드를 실행합니다.
$ node test-klaytn.js0x60806040526004361061004c576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806341c0e1b514610051578063cfae321714610068575b600080fd5b34801561005d57600080fd5b506100666100f8565b005b34801561007457600080fd5b5061007d610189565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100bd5780820151... # This is from caver.klay.getCodeHello, Klaytn # This is from KlyatnGreeter.methods.greet()
"안녕하세요, 클레이튼입니다"라는 메시지가 표시되면 작업을 완료한 것입니다. 축하합니다!