본문 바로가기

Blockchain/EOSIO

Elemental Battles로 시작하는 EOS dApp 개발 (1)

LESSON 0. Before You Start

https://battles.eos.io/tutorial/lesson0/chapter1

 

튜토리얼에서는 각 단계별로 Elemental Battles라는 EOSIO game dApp을 개발하기 위한 설명과 코드가 제공됩니다. 튜토리얼에서 소개되는 코드는 크게 두 종류인데 한 가지는 블록체인에서 작동하는 스마트 컨트랙트에서 사용되는 것이며, 다른 한 가지는 JavaScript에 기반한 eosjs를 이용하여 블록체인과 통신하는 프론트 엔드 코드입니다. 모든 코드들은 아래의 링크의 Github을 통하여 다운로드 받을 수 있으며, 최종 버전을 다운로드 받았다면 코드를 빌드하여 Elemental Battels가 실제로 작동하게 할 수 있습니다.

 

EOSIO/eosio-card-game-repo

https://github.com/EOSIO/eosio-card-game-repo

 

개발을 시작하기에 앞서 블록체인에 대한 전반적인 소개와 스마트 컨트랙트를 배포할 EOSIO가 어떤 플랫폼인가에 대해 간단히 살펴보도록 하겠습니다. 아래의 글은 튜토리얼에서 제공된 설명으로 원문은 하단 링크를 참고하시기 바랍니다.

 

Blockchain / EOSIO Intro

https://battles.eos.io/tutorial/lesson0/chapter2

 

블록체인이란?

블록체인은 트랜잭션 데이터를 분산 저장하는 탈중앙화 시스템이라고 할 수 있습니다. 블록체인Blockchain에서는 주기적으로 새로운 블록Block이 생성되며, 기존의 블록에 연결Chain됩니다. 많은 컴퓨터들은 블록과 그에 기록된 트랜잭션을 공유하고 저장하게 되는데 이를 통해 분산된 시스템을 완성합니다. 또한 분산된 시스템은 정보를 하나의 소유자에 한정짓는 것이 아니라 다양한 사용자가 소유하게 함으로써 탈중앙성을 완성합니다. 암호화와 합의는 트랜잭션의 불변성을 보장하고, 이를 통해 블록체인은 신뢰를 담보할 수 있습니다. 블록체인은 복원력과 투명성을 제공합니다. 탈중앙화와 분산 저장 방식은 블록체인의 수많은 복사본이 존재한다는 것을 의미하며 어느 누구나 어디서든 블록체인을 들여다 볼 수 있다는 것을 의미합니다.

 

EOSIO의 이점

EOSIO는 수직적, 수평적인 확장이 가능하도록 설계된 새로운 블록체인입니다. EOSIO는 DPos라는 합의 알고리즘을 사용한다는 것과 자원 을 할당 받기 위해 EOS를 staking해야한다는 점에서 다른 블록체인들과 차이가 있습니다. 좀 더 깊이 있는 셜명을 원하신다면 하단의 링크를 참고하시기 바랍니다.

 

What is EOSIO?

https://developers.eos.io/eosio-home/docs/10-big-picture

 

EOSIO는 Centos, Ubuntu 등의 리눅스 운영체제와 MacOS 등의 환경에서 작동이 가능합니다. 지원하는 OS별 버전은 튜토리얼을 참고하시기 바랍니다. 요구되는 하드웨어 스펙으로는 7GB의 RAM과 20GB의 디스크 공간을 요구하고 있습니다. 튜토리얼은 현재 시점 기준으로 Docker version 17, EOSIO version 1.7.3, eosio.cdt version 1.6.1, eosjs version 20.0.0을 사용하여 작성되었습니다. 

 

개발환경 세팅

개발환경을 세팅하기 위하여 eosio 바이너리 배포 버전을 설치하면 nodeos, cleos, keosd 등 총 세 개의 프로그램을 확인할 수 있습니다. eosio 설치는 아래의 링크를 참고하시기 바랍니다.

 

Before You Begin

https://developers.eos.io/eosio-home/docs/setting-up-your-environment

 

EOSIO 설치가 완료되면 로컬 개발환경을 위한 싱글 노드를 작동시킬 수 있습니다.

 

Start Your Node & Setup

https://developers.eos.io/eosio-home/docs/getting-the-software

 

EOSIO dApp 개발을 위해서는 EOSIO 개발 툴킷인 eosio.cdt를 설치해야 합니다. 

 

Install the CDT

https://developers.eos.io/eosio-home/docs/installing-the-contract-development-toolkit

 

eosio.cdt를 이용하여 EOSIO 플랫폼 상에 스마트 컨트랙트를 편리하게 배포할 수 있습니다.

 

툴과 프로그램

dApp을 개발하기 위해서는 EOSIO를 구성하고 있는 프로그램과 툴에 대해 이해하고 있어야 합니다. 앞서 언급된 nodeos, cleos, keosd, eosio.cdt를 간략히 살펴보도록 하겠습니다.

 

nodeos는 사용자가 블록체인의 노드로서의 역할을 담당할 수 있도록 하는 프로그램으로 실제 EOSIO 블록체인과의 접점에 있는 프로그램이라고 이해하시면 됩니다. cleos는 command line 인터페이스 방식의 툴로서 필요한 명령을 nodeos에서 제공하는 REST API를 통해 호출하는 프로그램입니다. 이는 월렛, 계정, 키, 트랜잭션 및 스마트 컨트랙트 등 전반적인 기능을 포함하고 있습니다. keosd는 가벼운 클라이언트 지갑으로 사용자 개인 키를 안전하게 저장하고 이러한 키를 사용하여 트랜잭션을 서명하여 권한을 부여합니다. eosio.cdt는 WebAssembly (WASM)를위한 툴체인이며 EOSIO 플랫폼에 대한 계약 작성을 용이하게하는 일련의 도구입니다.

 

계정과 월렛

블록 체인에서 작업을 수행하려면 트랜잭션 호출자가 해당 작업을 수행 할 권한이 있는지 확인하기 위해 인증이 필요합니다. 이 인증은 계정을 사용하여 수행됩니다. 계정과 계정 공개 키는 계정 생성시 블록 체인에 저장됩니다. 계정이 생성되면 계정 소유자 개인 키로 서명 된 트랜잭션은 계정 공용 키를 통해 블록 체인에 의해 인증 될 수 있습니다.

 

개인 키 자체는 지갑 (keosd)에 저장됩니다. 개인 키 저장 외에도 지갑은 계정 소유자 개인 키와의 트랜잭션에 자동으로 서명하는 데 사용됩니다.

 

트랜잭션과 액션

컨트랙트와 계정은 액션의 형태로 소통합니다. 액션은 한건씩 처리되는 작업의 단위이고 트랜잭션은 적어도 하나 이상의 액션으로 구성됩니다.

 

낮은 대기 시간

EOSIO 블록 체인의 가장 중요한 특징 중 하나는 트랜잭션이 처리되는 속도입니다. 2초 미만의 블록 시간으로 EOSIO는 트랜잭션 대기 시간을 최소화하고 dApp의 사용자 경험을 대폭 개선합니다. TPS (초당 트랜잭션 속도)가 높고 대기 시간이 짧기 때문에 기업 규모의 dApp을 EOSIO 블록 체인에서 실행할 수 있습니다.

 

스마트 컨트랙트

EOSIO 스마트 컨트랙트는 블록 체인에 등록 된 소프트웨어이며 EOSIO 노드에서 실행됩니다. 스마트 컨트랙트는 "계약서"의 의미를 구현하고 액션 요청은 블록 체인에 자동 저장됩니다. 스마트 계약서는 인터페이스 (actions, parameters, data structures) 및 인터페이스를 구현하는 코드를 정의합니다. 이 코드는 WebAssembly 용으로 컴파일되어 노드에서 실행할 수 있습니다. 간단히 말해서 스마트 컨트랙트는 모든 사용자로부터 트리거되고 실행될 수 있는 함수 또는 액션의 모음입니다.

 

EOSIO 스마트 컨트랙트는 액션과 타입 정의로 구성되어 있습니다. 액션에 대한 정의는 컨트랙트가 어떻게 동작하는가를 정의하고 구현하는 것인 반면 타입 정의는 필요한 내용과 구조를 정의합니다. EOSIO 스마트 컨트랙트의 액션은 사용자가 UI에서 호출하는 경우 작동할 수 있고, 다른 스마트 컨트랙트가 호출하는 경우에도 작동합니다.

 

인라인 액션과 지연된 액션

EOSIO는 인라인 액션과 지연된 액션, 두 가지 형태의 커뮤니케이션 모델을 지원합니다. 인라인 액션은 트랜잭션을 통해 즉각적으로 작동하는 것을 의미하고 지연된 액션은 정의된 미래의 특정 시점에 실행되는 것입니다.

 

인라인 액션은 다른 액션들이 작동하도록 요청하는 형태로 되어있으며, 트랜잭션의 권한과 범위 내에서 작동한다. 지연된 액션은 peer 트랜잭션으로 전달되는 통지 형태를 갖고 있습니다. 지연된 액션은 나중에 액션을 생성해낸 사람의 의도에 따라 작동하되도록 예약됩니다.

 

스마트 컨트랙트 어플리케이션 바이너리 인터페이스The Smart Contract Application Binary Interface (ABI)

ABI는 런타임시 JSON과 바이너리 표현간에 사용자 액션을 변환하기위한 JSON 기반 설명입니다. 스마트 컨트랙트를 ABI로 서술하게되면 개발자와 사용자는 JSON을 통해 스마트 컨트랙트와 상호 작용할 수 있습니다.

 

EOSIO 스마트 컨트랙트 빌드

스마트 컨트랙트 소스 코드는 WASM(WebAssembly) 컴파일러가 지원하는 어떤 언어로도 개발이 가능합니다. EOSIO는 현재 C, C++ 언어를 지원하고 있습니다. 

 

코드를 작성한 후, 스마트 컨트랙트는 eosio.cdt를 사용하여 컴파일 됩니다. eosio.cdt는 WebAssembly 코드를 작성해주는 도구입니다. eosio.cdt를 사용하여 컴파일할 때 -o 옵션을 주게되면 .wasm 파일을 생성할 수 있으며, -abigen 옵션을 주게 되면 .abi 파일을 생성할 수 있습니다.

eosio-cpp -o destination.wasm source.cpp -abigen

 

스마트 컨트랙트가 컴파일되고 ABI가 생성되어지면  cleos의 set contract 호출을 통하여 블록체인에 업로드할 수 있습니다.

cleos set contract account_name ../contract_dir -p account_name@active

 

자세한 설명을 원한다면 eosio 개발문서를 참고하시기 바랍니다.

 

ABI 생성

eosio.cdt로 스마트 컨트랙트를 컴파일하려면 .abi 파일을 위한 힌트가 코드에 포함되어 있어야 합니다. 힌트를 위한 코드는 C ++ 11 스타일로 작성됩니다. 

struct [[eosio::table]] table_name { 
  uint64_t key; 
  /*more fields here*/ 
    
  auto primary_key() const { 
    return key; 
  } 
};

 

또한 작업을 올바르게 호출 할 수 있도록 매크로를 사용합니다. 이것은 일반적으로 스마트 계약의 맨 아래에 위치하며 스마트 컨트랙와 액션명으로 작성합니다.

EOSIO_DISPATCH(nameofclass, (action1)(action2)(action3))

 

간단한 형태의 EOSIO 스마트 컨트랙트 구조는 다음과 같습니다.

#include <eosiolib/eosio.hpp>

class [[eosio::contract]] nameofclass : public eosio::contract {
  public:
  [[eosio::action]]
  void action1(/*action parameters*/) {
    /*action body*/
  };

  private:
  struct [[eosio::table]] table_name {
    uint64_t key;
    /*more fields here*/

    auto primary_key() const { return key; }
  };
};

EOSIO_DISPATCH( nameofclass, (action1) )

 

액션 호출

스마트 컨트랙트를 개발하고 이를 블록체인 상에 업로드하게 되면 cleos의 push action 명령을 사용하여 액션을 호출할 수 있습니다.

cleos push action contract_name action_name '["action_parameter"]' -p authorizer_account

 

여기까지가 EOSIO dApp을 개발하기 위한 준비과정이었습니다. 블록체인에 대한 기초적인 지식부터 dApp의 개발에 대한 배경지식까지 포함되어 있다보니 쉽게 와닿지 않을 수 있습니다. 하지만 dApp 개발자로서 기본적으로 갖춰야할 지식이니 어느 정도는 이해하고 넘어가시기를 추천드립니다. 다음 포스팅부터는 실제 코드를 작성해보면서 dApp 개발을 해보도록 하겠습니다.