[EOS] Smart Contract 개발 준비 3 - 샘플 스마트 컨트랙트 실행
안녕하세요. 개발자 모도리입니다.
[EOS] Smart Contract 개발 준비 1 - EOS 노드 설치
[EOS] Smart Contract 개발 준비 2 - 설치 확인, 환경설정 그리고 노드 실행
지난 글들에 이어서 오늘은 실행 된 노드에서 샘플 스마트 컨트랙트를 실행해 보겠습니다.
eosiod 실행
eosiod 실행 방법 세가지
- GUI 환경의 Ubuntu
- terminal 창 하나에는 eosiod를 실행하고, terminal을 하나 더 띄워서 나머지를 실행
- CLI 환경의 Ubuntu
eosiod &> eosiod.log &
- 백그라운드에서 eosiod를 실행시키셔 로그 기록
- 종료 후 재시작 시 문제가 발생하는 경우가 있음
- Putty 등의 terminal 프로그램으로 접속
- 2번 접속해서 창 2개를 띄워놓고 실행
지갑 생성
eosioc wallet create
생성되는 패스워드 잘 보관해 놓고 지갑을 lock/unlock 할 때 사용해야 합니다.
계정 생성
테스트 계정의 private key import
~/testnode/data-dir/config.ini
에 설정되어 있는 test 계정의 private key를 지갑에 import 합니다.
(눈치 채셨을지 모르겠지만 inita ~ initu까지 모든 계정의 키가 동일합니다.)
eosioc wallet import 5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3
imported private key for: EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
메세지가 나오면 성공
계정에게 할당 할 두 쌍의 키를 생성
eosioc create key
eosioc create key
같은 명령어를 두 번 실행해서 나오는 키 쌍을 기록해 놓습니다.
Private key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Public key: EOSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
키를 두 쌍이나 만든 이유는 Owner Key, Active Key 를 각각 할당해 줘야 하기 때문인데요, 스팀잇 사용자라면 많이 익숙하실 겁니다. 스팀잇에는 4종류(Post, Active, Owner, Memo)의 키가 있죠.
계정 생성 요청
currency 라는 이름의 계정을 만들어 보겠습니다.
계정을 생성할 때에는 해당 계정을 만들어 주는 계정(servant 라고 명시되어 있습니다.) 정보가 함께 담겨 있어야 합니다.
아래 명령에서는 inita가 servant가 됩니다. (아까 지갑에 inita의 private key를 import한 이유가 여기서 밝혀지네요. 계정 생성시 servant의 private key를 이용한다.)
servant 계정 이름, 새로 만들 계정 이름, owner public key, active public key를 입력 합니다. public key는 EOS로 시작합니다.
eosioc create account inita currency PUBLIC_KEY_1 PUBLIC_KEY_2
이런 화면이 나오면 정상적으로 계정이 생성 된 것입니다.
eosioc get account currency
다시 한번 계정 정보를 확인 합니다.
샘플 컨트랙트 업로드
Private Key import
컨트랙트 업로드를 위해서는 계정의 private key가 필요합니다. currency 계정으로 컨트랙트를 업로드 할 것이기 때문에 계정의 active key의 private key를 wallet에 import 합니다.
eosioc wallet import [ACTIVE PRIVATE KEY]
그리고 업로드 전에 현재 currency라는 컨트랙트의 코드를 확인해 봅니다.
업로드 전 코드 확인
eosioc get code currency
명령어를 입력하면 아래 처럼 000000이 나올 겁니다. 아무런 코드도 업로드 되어 있지 않다는 것입니다.
code hash: 0000000000000000000000000000000000000000000000000000000000000000
* 제가 좀 헷갈렸던 부분이 있는데 여기서 조회하는데 계정의 코드인가? 스마트 컨트랙트의 코드인가? 뭐지?? 라는 생각을 이 예제 작성하는 내내 생각해 봤는데요. 다른 코드 예제를 보면서 확인한 결과는 코드 작성할 때 컨트랙트 이름을 지정하고 계정 컨트랙트 이름의 계정을 생성해서 컨트랙트를 업로드해야 한다 였습니다. (이 부분은 다음에 제가 조금 더 공부해서 확실히 설명드리겠습니다.)
업로드
우리가 처음에 빌드를 위해서 git에서 다운 받았던 파일들에 샘플 코드가 포함되어 있습니다. 아래에서 경로를 확인하실 수 있습니다.
해당 스마트 컨트랙트는 토큰을 만드는 컨트랙트입니다. 토큰을 발행하고 전송하는 것까지 해 보겠습니다.
eosioc set contract currency ~/eos/build/contracts/currency/currency.wast ~/eos/build/contracts/currency/currency.abi
업로드 후 코드 확인
eosioc get code currency
코드가 바뀌어 있는 것을 확인할 수 있습니다.
code hash: 135bb95927600a21dcc701223a107215e3b25cb19b196e0c38fa7d7f2082c869
샘플 컨트랙트 실행
토큰 발행
currency 라는 컨트랙트의 issue action을 실행해서 currency 계정에 1000.0000 CUR 토큰을 발행하라. 라는 명령어입니다.
(여기에서 currency, currency가 여러번 나와서 헷갈렸습니다. 확인 차 currency가 아닌 다른 계정을 만들어서 시도해 봤는데, 정상 실행이 안되더군요.) currency계정의 active 권한을 사용합니다.
eosioc push action currency issue '{"to":"currency","quantity":"1000.0000 CUR"}' --permission currency@active
계정 잔고 확인
eosioc get table currency currency account
balance에 10000000이 찍혀 있는 것을 확인하실 수 있습니다. 그런데 아까 1000 CUR를 발행하라고 했는데 왜 0이 4개나 더 붙어 있을까요??? (이거는 추후에 다뤄 볼 floating point와 연관되어 있는 내용입니다. @sirin418 님께서 질문해 주셨던 내용과 연관되네요.)
토큰 전송
currency 계정이 가지고 있는 토큰 중 20.0000(뒤에 0을 붙여야 정상 실행 됩니다.) CUR을 inita에게 전송해 봅니다. 역시 currency 계정의 active 권한을 사용합니다.
eosioc push action currency transfer '{"from":"currency","to":"inita","quantity":"20.0000 CUR","memo":"my first transfer"}' --permission currency@active
계정 잔고 확인
eosioc get table currency currency account
eosioc get table inita currency account
간단한 샘플 컨트랙트를 업로드하고 실행까지 해봤습니다. 샘플 컨트랙트를 수정하거나 직접 간단한 컨트랙트를 작성해 볼까 합니다. 이번 주에는 사정이 있어서 포스팅이 어려울 것 같고 다음 주 중으로 공부 열심히해서 올려볼 수 있도록 해보겠습니다. 감사합니다.
앞으로 정주행 하겠습니다~ 잘부탁드립니다 ^^
감사합니다. 앞으로 꾸준히 올리겠습니다! 저도 잘
부탁드립니다. ^^