3.2 테스트넷을 이용한 스마트 컨트랙트 배포

로컬 환경에서 배포한 스마트 컨트랙트는 Ram 구매, CPU, NET 스테이킹(Staking) 등을 전혀 고려하지 않고 사용할 수 있었습니다. 하지만 실제 메인 네트워크에서는 그렇지 않습니다. 배포할 컨트랙트의 크기, 멀티 인덱스 테이블(Multi Index Table) 크기 등을 종합적으로 고려해 RAM을 구입해야 합니다. 이용자(User)의 자원 사용, 컨트랙트 운영을 고려해 CPU, NET에 EOS를 넉넉하게 스테이킹해야 합니다. 게다가 메인넷의 상황에 따라서는 사용량이 유동적으로 변합니다. 이러한 기능은 로컬 네트워크에서는 테스트할 수조차 없고, 메인넷에서 테스트하기에는 비용이 부담스럽습니다. 다행히도 정글(Jungle) 테스트넷, 기린(Kylin) 테스트넷 등에서 메인넷과 같은 환경을 구축해 개발자들이 메인넷에 컨트랙트를 배포하기 전에 테스트할 수 있게 지원해 줍니다. 이 장에서는 테스트넷을 이용하여 제작한 스마트 컨트랙트를 배포, 테스트, 검증한 후 이를 메인넷에 배포하여 제대로 작동하는지 실습해 봅니다.

정글 테스트넷(Jungle Testnet)

정글 테스트넷(http://jungle.cryptolions.io)은 크립토라이언(CryptoLions)이 운영하는 테스트 네트워크입니다. 블록을 생성하는 BP들이 존재하며 스스로 BP가 되어 블록을 생성할 수도 있습니다. BP를 선출하는 투표 기능도 있습니다. 테스트넷은 메인넷과 거의 같은 환경이므로, 보통 컨트랙트를 메인넷에 바로 배포하지 않고 테스트넷에서 충분한 검토한 후 메인넷에 배포합니다.

정글넷 계정 생성

먼저 계정을 생성해 보겠습니다. 정글넷 홈페이지에 접속합니다. 여기에는 생성되는 블록, BP 정보 등 다양한 정보를 확인할 수 있습니다.

 < 정글넷 메인페이지 화면 > 

상단에는 BP로 등록, 계정 생성, 계정 정보 확인 등의 메뉴가 있습니다. [Create Account]에서 계정을 생성할 수 있습니다.

 < 정글넷의 다양한 메뉴 버튼 > 

계정 생성 시에는 계정명으로 a-z, 1~5로 구성된 12개의 문자를 조합한 이름과 Owner Public Key, Active Public Key를 입력해야 합니다.

 < 정글넷 create account 화면 > 

계정에 사용할 Owner Public Key, Active Public Key는 다음 명령이나, EOS Key Generation 사이트(https://nadejde.github.io/eos-token-sale/)에서 생성할 수 있습니다.

```
$ cleos create key --to-console

```

이외에도 추후 설명할 스캐터(Scatter) 프로그램으로도 생성이 가능합니다. 다시 본론으로 돌오가면, 정글넷에서 모든 사항을 기입하고 [Create] 버튼을 클릭하면 다음과 같이 트랜잭션을 확인할 수 있습니다.

 < 정글넷 account 생성완료 화면 > 

정글넷 상단의 메뉴인 Account Info 탭에서 생성한 계정 정보를 확인할 수 있습니다.

 < 정글넷 계정정보 화면 > 

지갑 생성 및 정글넷 계정 연결

기존 로컬넷에서는 다음의 과정을 통해 계정을 생성했습니다.

정글넷에서는 로컬에서 계정을 만들던 과정에 없는 지갑을 생성하고 지갑에 Key를 임포트하는 추가 과정이 있었습니다.

cleos 명령어로 자신의 로컬 하드웨어에 지갑을 생성합니다.

```
$ cleos wallet create -n [계정 이름]

```

```
// 예시
$ cleos wallet create -n junglenet

```

정글넷 계정의 Key를 지갑에 임포트하면 정글넷 계정을 내 지갑으로 사용할 수 있습니다. 다음의 명령어로 지갑에 Key를 임포트합니다.

```
$ cleos wallet import -n [지갑 이름]

```

```
// 예시
$ cleos wallet import -n junglenet

```

Owner Key와 Active Key 그리고 로컬넷에서 사용했던 EOS.IO Key까지 Key 3개를 임포트합니다.

정글넷 Endpoint 설정

EOS는 BP 21명이 사용자가 요청한 트랜잭션이 담긴 블록을 메인 체인 네트워크에 생성하는 방식으로 네트워크를 운영합니다. 사용자가 트랜잭션을 생성하려면 BP가 생성하는 블록을 찾아 자신의 트랜잭션을 보내야 합니다. 모든 BP는 bp.json 파일에 API endpoint를 게시하고 있습니다. 사용자는 해당 Endpoint를 이용하여 BP들의 블록에 트랜잭션을 보냅니다.

cleos의 -u 또는 --url 옵션에 URL을 입력하면 endpoint를 변경할 수 있습니다.

```
$ cleos -u [Endpoint URL]
$ cleos --url [Endpoint URL]

```

```
// 예시
$ cleos -u https://127.0.0.1:8888 get table devtooth devtooth accounts

```

cleos의 기본 로컬 endpoint는 https://127.0.0.1:[port]입니다. 따라서 별도의 옵션이 필요하지 않지만, 정글넷이나 기린넷, 메인넷 같은 다른 endpoint를 사용하려는 경우 옵션을 추가해야 합니다.

정글넷의 API endpoints를 이용해 봅시다. 먼저 정글넷 홈페이지(http://jungle.cryptolions.io/) 상단 메뉴의 [API endpoints]를 클릭합니다.

 < 정글넷 API endpoints 버튼 > 

다음과 같은 정글넷에서 사용 가능한 endpoint 목록이 나타날 것입니다. 이중 마음에 드는 endpoint를 사용하면 됩니다. 여기서는 CryptoLions.io의 http://jungle.cryptolions.io:18888 endpoint를 사용해 보겠습니다.

 < 정글넷 API endpoints 목록 > 

간단한 명령어로 테스트를 진행해 봅시다. 정글넷에서 미리 생성해둔 계정 정보를 다음 명령어로 출력합니다.

```
$ cleos -u http://jungle.cryptolions.io:18888 get account [정글넷 계정 이름]

```

```
// 예시
$ cleos -u http://jungle.cryptolions.io:18888 get account devtoothlab2

```

해당 endpoint에 접속하여 정글넷의 블록 접근에 성공했다면 다음 같이 계정 정보를 확인할 수 있습니다.

 < 정글넷 cleos 명령어로 계정정보 가져오기 > 

```
devtooth@DESKTOP-2:~$ cleos -u http://jungle.crytolions.io:18888 get account devtoothlab2
created: 2018-11-19TO8:50:24.500
permissions:
	owner	1:     1  EOS5BcsToMSJU2iCusRZsZmi8n4cYiqfT816NP8HzrTXFs8Rxak64
         active  1:     1  EOS7YJaveyJ7zcZwtc472EpJc7tvSneEdbYifQphLfa9cQyuSkW5e
memory:
	quota:     5.346 KiB    usded:     3.365 KiB
net bandwidth:
	staked:      100.0000 EOS              (total stake delegated from account to self)
         delegated:     0.0000 EOS            (total staked delegated to account from others)
         used:                 0 bytes
         available:         18.42 MiB
         limit:               18.42 MiB

cpu bandwidth:
	staked:      100.0000 EOS              (total stake delegated from account to self)
         delegated:     0.0000 EOS            (total staked delegated to account from others)
         used:                 0 bytes
        available:         3.639 sec
        limit:               3.639 sec
producers:     

```

정글넷에서 EOS 받기

정글넷은 메인넷 환경과 거의 같습니다. 메인넷과 마찬가지로 테스트를 위해서는 자원과 EOS가 필요합니다. 정글넷은 Faucet를 통해 테스트에 필요한 EOS를 제공합니다. 정글넷 홈페이지에 접속합니다.

http://jungle.cryptolions.io/

정글넷 상단 메뉴에서 [Faucet]을 클릭합니다.

 < 정글넷 Faucet 버튼 > 

Jungle Faucet 팝업창에 나타납니다. 여기에 EOS를 받을 계정을 입력하고 [Send Coins]를 클릭하면 정글넷에서만 사용 가능한 EOS를 받을 수 있습니다.

 < 정글넷 Faucet 버튼 상세 화면 > 

get account 명령어로 계정에서 EOS가 입금됐는지 확인합니다. EOS balances에서 송금된 EOS 100개를 확인할 수 있습니다.

 < 정글넷 cleos 명령어로 계정정보 가져왔을 때 balances 확인 > 

devtooth@DESKTOP-2:~$ cleos -u http://jungle.crytolions.io:18888 get account devtoothlab2
created: 2018-11-19TO8:50:24.500
permissions:
	owner	1:     1  EOS5BcsToMSJU2iCusRZsZmi8n4cYiqfT816NP8HzrTXFs8Rxak64
         active  1:     1  EOS7YJaveyJ7zcZwtc472EpJc7tvSneEdbYifQphLfa9cQyuSkW5e
memory:
	quota:     5.346 KiB    usded:     3.365 KiB
net bandwidth:
	staked:      100.0000 EOS              (total stake delegated from account to self)
         delegated:     0.0000 EOS            (total staked delegated to account from others)
         used:                 0 bytes
         available:         18.24 MiB
         limit:               18.24 MiB

cpu bandwidth:
	staked:      100.0000 EOS              (total stake delegated from account to self)
         delegated:     0.0000 EOS            (total staked delegated to account from others)
         used:                 0 bytes
        available:         3.639 sec
        limit:               3.639 sec
EOS balances :
        liquid:              100.0000 EOS
        staked:             200.0000 EOS
      unstaked:               0.0000 EOS
          total:             300.0000 EOS
producers:     

EOS를 이용한 RAM 구매와 판매

EOS 블록체인 상에서 스마트 컨트랙트를 배포하거나, 해당 스마트 컨트랙트에서 Table에 데이터를 저장할 때에는 EOS 네트워크의 RAM 자원을 이용합니다. 계정 정보 또한 RAM을 필요로 합니다. 즉, 메인넷에서 계정을 만들려면 0.4kb의 RAM이 필요합니다.

RAM은 필요한 만큼 사고 팔 수 있습니다. 스마트 컨트랙트를 배포하기 위해서는 컨트랙트 파일 크기의 10배 만큼의 RAM이 필요하므로, 배포에 앞서 파일 크기를 확인하고 RAM을 넉넉하게 구입해야 합니다.

RAM 구입은 이렇게 합니다.

$ cleos system buyram [구매자 계정 이름] [램 이용자 계정 이름] [EOS]
// 예시
$ cleos system buyram devtooth devtooth "3 EOS"
$ cleos -u http://jungle.cryptolions.io:18888 system buyram devtooth devtooth "3 EOS"

EOS에서 RAM을 본인이 직접 구매할 수도 있지만, 다른 사람을 대신해 RAM을 구입하고 보낼수도 있습니다. 첫 인자값으로 RAM 값을 지불할 사람의 계정, 두번째 인자값으로 구매한 RAM을 받을 사람의 계정, 마지막 인자값으로 구매할 RAM의 양을 입력합니다. 구매에 성공하면 다음과 같은 화면이 출력됩니다.

 < 정글넷 cleos 명령어로 램 구매 화면 > 

devtooth@DESKTOP-2:~$ cleos -u http://jungle.cryptolions.io:18888 system buyram devtoothlab2 devtoothlab2 "3 EOS"
exected transaction:  180e47688d125ebad621b4bb2483703220471cbbf3d88d4b2764727fe56bfc61   128 bytes  1739 us
#	eosio<=eosio::buyram	{"payer":"devtoothlab2","receiver":"devtoothlab2","quant":"3.0000 EOS"}
#  eosio.token<=eosio.token::transfer	{"from":"devtoothlab2","to":"eosio.ram","quantity":2.9850 EOS", "memo":"buy ram"}
#  devtoothlab2<=eosio.token::transfer	{"from":"devtoothlab2","to":"eosio.ram","quantity":2.9850 EOS", "memo":"buy ram"}
#  eosio.ram<=eosio.token::transfer	{"from":"devtoothlab2","to":"eosio.ram","quantity":2.9850 EOS", "memo":"buy ram"}
# eosio.token<=eosio.token::transfer	{"from":"devtoothlab2","to":"eosio.ramfee","quantity":"0.0150 EOS","memo":"ram fee"}
# devtoothlab2<=eosio.token::transfer	{"from":"devtoothlab2","to":"eosio.ramfee","quantity":"0.0150 EOS","memo":"ram fee"}
# eosio.ramfee<=eosio.token::transfer	{"from":"devtoothlab2","to":"eosio.ramfee","quantity":"0.0150 EOS","memo":"ram fee"}
warning: transaction executed locally, but may not be confirmed by the network yet   ]

계정 정보를 살펴보면, 사용 가능한 RAM 용량이 늘어난 것을 확인할 수 있습니다.

 < cleos 명령어로 계정 정보 확인 (변경된 ram 값) > 

devtooth@DESKTOP-2:~$ cleos -u http://jungle.crytolions.io:18888 get account devtoothlab2
created: 2018-11-19TO8:50:24.500
permissions:
	owner	1:     1  EOS5BcsToMSJU2iCusRZsZmi8n4cYiqfT816NP8HzrTXFs8Rxak64
         active  1:     1  EOS7YJaveyJ7zcZwtc472EpJc7tvSneEdbYifQphLfa9cQyuSkW5e
memory:
	quota:     43.62 KiB    usded:     3.49 KiB
net bandwidth:
	staked:      100.0000 EOS              (total stake delegated from account to self)
         delegated:     0.0000 EOS            (total staked delegated to account from others)
         used:                 0 bytes
         available:         18.24 MiB
         limit:               18.24 MiB

cpu bandwidth:
	staked:      100.0000 EOS              (total stake delegated from account to self)
         delegated:     0.0000 EOS            (total staked delegated to account from others)
         used:                 0 bytes
        available:         3.639 sec
        limit:               3.639 sec
EOS balances :
        liquid:              97.0000 EOS
        staked:             200.0000 EOS
      unstaked:               0.0000 EOS
          total:             297.0000 EOS
producers:     

자신이 보유한 RAM을 다시 팔수도 있습니다. 명령어는 다음과 같습니다.

$ cleos system sellram [계정 이름] [용량]

// 사용 예
$ cleos system sellram devtoothlab2 1000
$ cleos -u http://jungle.cryptolions.io:18888 system sellram devtoothlab2 1000

실행한 결과는 다음과 같습니다.

 < 정글넷 cleos 명령어로 계정정보 확인(변경된 ram값) > 

devtooth@DESKTOP-2:~$ cleos -u http://jungle.crytolions.io:18888 get account devtoothlab2
created: 2018-11-19TO8:50:24.500
permissions:
	owner	1:     1  EOS5BcsToMSJU2iCusRZsZmi8n4cYiqfT816NP8HzrTXFs8Rxak64
         active  1:     1  EOS7YJaveyJ7zcZwtc472EpJc7tvSneEdbYifQphLfa9cQyuSkW5e
memory:
	quota:     42.65 KiB    usded:     3.49 KiB
net bandwidth:
	staked:      100.0000 EOS              (total stake delegated from account to self)
         delegated:     0.0000 EOS            (total staked delegated to account from others)
         used:                 0 bytes
         available:         18.24 MiB
         limit:               18.24 MiB

cpu bandwidth:
	staked:      100.0000 EOS              (total stake delegated from account to self)
         delegated:     0.0000 EOS            (total staked delegated to account from others)
         used:                 0 bytes
        available:         3.639 sec
        limit:               3.639 sec
EOS balances :
        liquid:              97.0757 EOS
        staked:             200.0000 EOS
      unstaked:               0.0000 EOS
          total:             297.0757 EOS
producers:     

그런데 RAM을 팔기 이전보다 1000bytes(약 1KB) 정도의 RAM이 줄은 것을 확인할 수 있습니다. RAM이 부족하면 스마트 컨트랙트가 올바르게 배포되지 않거나 데이터를 Table에 저장하지 못할 수도 있어 주의해야 합니다.

Stake와 Unstake

EOS에는 스테이크(Stake)라는 개념이 존재합니다. EOS를 맡기고 그에 상응하는 자원을 임대받는 개념입니다. 임대받을 수 있는 자원으로는 CPU와 NET(bandwidth)이 있으며, Unstake를 하면 EOS를 돌려받고 자원을 되돌려줍니다.

CPU를 스테이킹(Staking)하면 CPU 사용 시간을 임대받습니다. 이 시간은 메인넷에서 트랜잭션을 처리하는 데 걸리는 시간을 뜻합니다. 트랜잭션을 요청할 때마다 CPU 사용 시간이 점점 축적되며, CPU가 부족하면 트랜잭션을 처리할 시간이 없으므로 트랜잭션이 거부당합니다.

NET는 데이터를 얼마나 많이 주고 받을 수 있는가를 의미합니다. CPU만큼 많이 필요하진 않고 유저풀에 따라 적정하게 스테이크하면 됩니다.

스테이크 명령어는 다음과 같습니다.

$  cleos sytem delegatebw [구매자 계정 이름] [스테이크를 받을 계정 이름] [NET 양] [CPU 양]

// 예시
$ cleos system delegatebw devtooth debttoothlab2 "1 EOS" "5 EOS"
$ cleos -u http://jungle.cryptolions.io:18888 system delegatebw devtooth devtooth "1 EOS" "5 EOS"

system의 delegatebw 함수를 이용하여 스테이크합니다. 맡기는 사람과 자원을 임대받는 사람은 다를수 있습니다. 예컨대 A라는 계정이 B라는 계정에 자신의 EOS를 스테이크해 B 계정에 자원을 임대할 수 있습니다.

delegatebw 사용법은 이렇습니다. 첫 번째 인자에 EOS를 스테이크할 계정 이름을, 두번째 인자에 자원을 임대받을 계정 이름을, 세번째 인자에는 NET에 스테이크할 EOS 양을 각각 입력합니다. 마지막으로 네 번째 인자에는 CPU에 스테이크할 EOS 양을 입력합니다.

스테이크 트랜잭션이 잘 처리됐는지 계정 정보로 확인해 봅시다. NET이나 CPU가 증가한 것을 확인할 수 있습니다.

 < 정글넷 cleos 명령어로 계정정보 확인 (변경된 net,cpu bandwidth) > 

devtooth@DESKTOP-2:~$ cleos -u http://jungle.crytolions.io:18888 get account devtoothlab2
created: 2018-11-19TO8:50:24.500
permissions:
	owner	1:     1  EOS5BcsToMSJU2iCusRZsZmi8n4cYiqfT816NP8HzrTXFs8Rxak64
         active  1:     1  EOS7YJaveyJ7zcZwtc472EpJc7tvSneEdbYifQphLfa9cQyuSkW5e
memory:
	quota:     42.65 KiB    usded:     3.49 KiB
net bandwidth:
	staked:      101.0000 EOS              (total stake delegated from account to self)
         delegated:     0.0000 EOS            (total staked delegated to account from others)
         used:               242 bytes
         available:         18.42 MiB
         limit:               18.42 MiB

cpu bandwidth:
	staked:      105.0000 EOS              (total stake delegated from account to self)
         delegated:     0.0000 EOS            (total staked delegated to account from others)
         used:              1.529 ms
        available:          3.819 sec
        limit:               3.821 sec
EOS balances :
        liquid:              91.0757 EOS
        staked:             206.0000 EOS
      unstaked:               0.0000 EOS
          total:             297.0757 EOS
producers:     

스테이크된 자원을 되돌려받고 싶을 땐 Unstake해야 합니다. 명령어는 다음과 같습니다.

$ cleos system undelegatebw [Unstake 실행한 계정 이름] [Unstake될 계정 이름] [NET 양] [CPU 양]

// 예제
$ cleos system undelegatebw devtooth devtooth "1 EOS" "5 EOS"
$ cleos -u http://jungle.cryptolions.io:18888 system undelegatebw devtooth devtooth "1
 EOS" "5 EOS"

system의 undelegatebw 함수를 이용하여 언스테이크(Unstake)합니다. Stake는 맡기는 사람과 자원을 임대받는 사람이 다를 수 있었습니다. Unstake 또한 임대 한 사람에게 임대해준 사람이 다시 회수할 수 있습니다.

undelegatebw 사용법은 첫 번째 인자값으로 언스테이크할 계정 이름을 입력합니다. 두번째 인자값에는 언스테이크될 계정 이름을 입력, 세 번째에는 NET에 언스테이크할 EOS 양을, 마지막 인자에는 CPU에 Unstake할 EOS 양을 입력합니다.

Unstake 트랜잭션이 성공적으로 처리돼 NET 또는 CPU가 감소했는지 cleos로 확인해 봅시다.

 < 정글넷 cleos 명령어로 계정 정보확인 (변경된 net,cpu bandwidth 와 EOS balances) > 

devtooth@DESKTOP-2:~$ cleos -u http://jungle.crytolions.io:18888 get account devtoothlab2
created: 2018-11-19TO8:50:24.500
permissions:
	owner	1:     1  EOS5BcsToMSJU2iCusRZsZmi8n4cYiqfT816NP8HzrTXFs8Rxak64
         active  1:     1  EOS7YJaveyJ7zcZwtc472EpJc7tvSneEdbYifQphLfa9cQyuSkW5e
memory:
	quota:     42.65 KiB    usded:     3.49 KiB
net bandwidth:
	staked:      100.0000 EOS              (total stake delegated from account to self)
         delegated:     0.0000 EOS            (total staked delegated to account from others)
         used:               418 bytes
         available:         18.24 MiB
         limit:               18.24 MiB

cpu bandwidth:
	staked:      100.0000 EOS              (total stake delegated from account to self)
         delegated:     0.0000 EOS            (total staked delegated to account from others)
         used:              23.21 ms
        available:          3.615 sec
        limit:               3.639 sec
unstaking tokens:
	time of unstake request:  2018-11-20TO3:38:35 (funds will be available in 72 hr)
	from net bandwidth:			1.0000 EOS
	from cpu bandwidth:			5.0000 EOS
	total:					6.0000 EOS
EOS balances :
        liquid:              91.0757 EOS
        staked:             200.0000 EOS
      unstaked:               6.0000 EOS
          total:             297.0757 EOS
producers:     

해당 네트워크의 계정에 자원만 충분하다면 로컬넷처럼 Endpoint만 바꿔 정글넷 또는 기린넷 또는 메인넷으로 스마트 컨트랙트를 배포할 수 있습니다.


Prev | Next