Technology, Tutorials

클레이튼 네트워크에 스마트 컨트랙트 배포하기

이 튜토리얼의 목적은 클레이튼 개발 환경을 구축하고 이런저런 실험을 해보는 것입니다. 클레이튼 네트워크에 스마트 컨트랙트를 배포하는 가장 간단한 방법을 보여줍니다.

첫째, 로컬 네트워크에 스마트 컨트랙트를 배포할 것입니다.

다음으로는 클레이튼의 테스트넷인 바오밥에 스마트 컨트랙트를 배포해 보겠습니다.

1. 준비: 필요한 툴 준비

일단 시작하기에 앞서 기본적으로 필요한 툴이 있습니다. 아래 링크에서 다운 받아 보겠습니다:

git을 설치하고 get — version를 통해 버전을 확인합니다.

docker를 설치하고 동작하는 것을 확인합니다

Node v10.21.0 이상을 설치하고 node — version를 통해 버전을 확인합니다.

Jq를 설치하고 jq — version를 통해 버전을 확인합니다.

Screenshot

이제 본격 개발을 해보겠습니다.

2. 클레이튼 샌드박스 다운로드

클레이튼 샌드박스는 개발자들이 클레이튼에서 Dapp 개발을 시작할 수 있도록 도와주는 보일러플레이트 코드입니다. 샌드박스는 Truffle 프레임워크를 사용해 스마트코드를 컴파일, 배포, 테스팅할 수 있게 해줍니다.

이제 샌드박스 리포지토리를 클론하고 필요한 라이브러리들을 설치해보겠습니다.

git clonehttps://github.com/Krustuniverse-Klaytn-Group/klaytn-dev-sandbox.git
cd klaytn-dev-sandbox
npm install
npm install -g truffle@v5.1.61

VsCode와 같은 에디터에서 klaytn-dev-sandbox 폴더를 열어 주세요. 그러면 아래와 같은 폴더 구조가 보입니다.

contracts 폴더에는 예시 스마트 컨트랙트 몇 가지가 있습니다

migrations 폴더에는 스마트 컨트랙트 배포할 수 있는 deployment 스크립트가 있습니다

network 폴더에는 로컬 클레이튼 네트워크를 시작할 수 있는 스크립트가 있습니다

src 폴더에는 Dapp UI 개발을 위한 코드가 있습니다

3. 로컬 클레이튼 네트워크 부팅하기

컨트랙트 배포를 할 수 있는 환경이 필요합니다. 개발을 위해서는 Ganache와 흡사한 로컬 블록체인을 사용하는 것이 더 나을 수 있습니다. 여러분의 컴퓨터에서 동작하며, 인터넷이 필요하지 않고 트랜잭션 실행을 위해 테스트 계정 10개를 제공합니다.

아래와 같이 간단하게 로컬 클레이튼 네트워크를 배포할 수 있습니다. 기본 설정으로 한 개의 클레이튼 컨센서스 노드를 배포합니다. 로컬 네트워크를 실행하는 것에 대한 더 많은 정보는 이 포스팅을 참고하세요.

npm run run:klaytn

. 실행 로그를 확인하기 위해서는 npm run run:klaytn:log을 실행하세요

. 네트워크를 멈추기 위해서는 npm run run:klaytn:stop을 실행하세요

. 네트워크를 재개하기 위해서는 npm run run:klaytn:resume을 실행하세요

. 네트워크를 완전히 멈추기 위해서는 npm run run:klaytn:terminate을 실행하세요

. 로그 파일을 삭제하기 위해서는 npm run run:klaytn:cleanlog를 실행하세요

4. 컨트랙트 작성하기

우리 프로젝트의 컨트랙트 디렉토리에 몇 가지 샘플 컨트랙트가 있습니다. 아래는 FT, NFT 그리고 멀티토큰을 생성할 수 있는 표준 컨트랙트들입니다. 이 샘플 컨트랙트를 네트워크에 배포하여 토큰을 전송할 수 있습니다.

1. ERC-20 토큰 컨트랙트와 유사한 KIP7

2. ERC-721 토큰 컨트랙트와 유사한 KIP17

3. ERC-1155 토큰 컨트랙트와 유사한 KIP37

기존의 스마트 컨트랙트에 더해 컨트랙트 폴더에 자체적인 스마트 컨트랙트를 작성할 수 있습니다. 아래에 매우 단순한 greeter 컨트랙트가 있습니다:

KlaytnGreeter는 인사 메시지를 반환하는 단순한 컨트랙트로, 컨트랙트 배포 시에 메시지를 설정할 수 있습니다.

pragma solidity ^0.8.0;
contract KlaytnGreeter {
/* Define variable greeting of the type string */
string greeting;
/* This runs once when the contract is created */
constructor (string memory _greeting) public {
greeting = _greeting;
}
/* Main function */
function greet() public view returns (string memory) {
return greeting;
}
}

위의 코드를 컨트랙트 폴더의 KlaytnGreeter.sol 파일에 저장합니다. 다음 단계는 로컬 네트워크에 스마트 컨트랙트를 컴파일하고 배포하는 것입니다.

5. 로컬 네트워크에 컨트랙트 배포하기

Migrations 디렉토리에는 모든 배포를 위한 스크립트가 있습니다. 기본값으로 토큰 컨트랙트를 위한 배포 스크립트가 있습니다.

  1. 우선 새로 생성된 스마트 컨트랙트를 위한 배포 스크립트를 추가해보겠습니다. 아래의 코드는 로컬 네트워크에 KlaytnGreeter 컨트랙트를 컴파일하고 배포하며 abi와 배포된 주소를 src 폴더에 저장합니다.
const fs = require(‘fs’)
var greeter = artifacts.require(‘KlaytnGreeter’)
module.exports = function (deployer) {
deployer.deploy(greeter, ‘Welcome to Klaytn!’).then(() => {
if (greeter._json) {
fs.mkdir(‘./src/deployed’, { recursive: true }, (err) => {
if (err) throw err
})
// Save the deployed abi to greeterABI file in the src folder.
fs.writeFile(‘./src/deployed/greeterABI’, JSON.stringify(greeter._json.abi, 2), (err) => {
if (err) throw err
})
}
// Save the deployed address to greeterAddress file in the src folder.
fs.writeFile(‘./src/deployed/greeterAddress’, greeter.address, (err) => {
if (err) throw err
console.log(
`The deployed contract address * ${greeter.address} * is recorded on deployedAddress file`
)
})
})
}

위의 코드를 복사해서 5_greeter_migration.js로 저장할 수 있습니다. 아래 커맨드를 실행하고 컨트랙트를 배포합니다.

truffle migrate — f 5 — network klaytn

성공적으로 배포되고 나면 아래의 로그가 보일 것입니다.

  1. 이제 네트워크에 이 샘플 컨트랙트 중 하나를 배포해 보겠습니다. 아래 커맨드를 실행하면 FT 컨트랙트를 컴파일하고 배포할 수 있습니다.
npm run deploy:klaytn:kip7

성공적으로 배포되었다면 src 및 배포 폴더에 ABI 및 주소 파일이 생성되어 있을 것입니다.

6. 테스트 네트워크에 컨트랙트 배포하기

테스트 네트워크에 배포하는 것은 로컬 네트워크와 비슷하지만 약간의 설정 변경이 필요합니다. Baobab은 이더리움의 Ropsten과 같은 클레이튼의 테스트넷입니다.

테스트넷에 접근하기 위한 가장 쉬운 방법은 이더리움의 Infura와 비슷한 퍼블릭 노드 서비스인 KAS (Klaytn API Service)를 이용하는 것입니다. KAS는 테스트넷 사용을 위한 퍼블릭 클레이튼 노드에 접근을 가능하게 해주며, 무료 및 유료 플랜을 통해 메인넷을 이용할 수도 있습니다.

  1. Klaytn API Service에 가입해서 Baobab 테스트넷에 연결하기 위한 Access key와 Secret key를 받을 수 있습니다.
  2. 다음 단계는 테스트넷 설정을 업데이트하기 위해 truffle-config.js를 설정하는 것입니다.
kasBaobab: {
provider: () => {
const option = {
headers: [
{ name: ‘Authorization’, value: ‘Basic ‘ + Buffer.from(accessKeyId + ‘:’ + secretAccessKey).toString(‘base64’) }, { name: ‘x-chain-id’, value: ‘1001’ }
],
keepAlive: false,
}
return new HDWalletProvider(privateKey, new Caver.providers.HttpProvider(“<https://node-api.klaytnapi.com/v1/klaytn>", option)) },
network_id: ‘1001’, //Klaytn baobab testnet’s network id
gas: ‘8500000’,
gasPrice:’25000000000'
}

샌드박스에 truffle-config.js 파일은 이미 설정이 되어 있습니다.

  1. 제1 단계에서 받은 Access key와 Secret key를 .env 파일에 추가합니다.
ACCESS_KEY_ID=KASKY9YK7JE3NEXQZN6PWT86
SECRET_ACCESS_KEY=nO14rGPiz1QDpDdjWGcYoVTueC3ksJTcZ_eg3887
KAS_TESTNET_API_URL=https://node-api.klaytnapi.com/v1/klaytn
  1. 이제 Baobab 테스트 네트워크에 배포할 모든 설정 업데이트들이 있습니다. 아래 커맨드를 실행하면 배포할 수 있습니다.
truffle migrate — f 1 — to 2 — network kasBaobab

아래 결과에서 src/deployed 폴더에 ABI 및 주소 파일들을 확인할 수 있습니다.

7. 결론

로컬 노드를 구축하고 스마트 컨트랙트를 성공적으로 배포하셨습니다! 이제 다음 단계는 컨트랙트를 호출해보는 것입니다. 이 튜토리얼을 참고하면 프론트엔드 앱을 개발하는 데 도움이 될 겁니다. 혹시 문제가 생겼을 경우 Discord/Gitter 채널에 문의 주세요.