All Articles

Scaffold a Blockchain

Cosmos SDK 공식 튜토리얼을 정리한 내용으로, 최신 내용은 Cosmos SDK 공식 문서에서 확인 할 수 있습니다.

StarportCosmos-SDK를 이용해 블록체인 프로젝트를 개발할 때 기본적인 구성을 생성하며, 손쉽게 블록체인 애플리케이션을 개발항 수 있도록 지원하는 도구 입니다.

프로젝트 생성하기

starport app github.com/violetstair/planet

starport app 명령을 통해 프로젝트의 모든 파일을 포함하는 프로젝트 디렉토리를 생성하고 local git repository를 초기화 할 수 있다

첫 번째 인자로 입력되는 URL은 Go 모듈의 경로이며, 동시에 git repository의 주소이기도 하다.

디렉토리 구조

  • app : 애플리케이션 기능들의 연결하는 파일들
  • cmd : 노드 바이너리 생성을 위한 디렉토리
  • proto : 사용자 정의 모듈을 위한 Protocol Buffer 파일
  • x : 사용자 정의 모듈들이 위치하는 디렉토리
  • vue : 테스트용 웹 애플리케이션
  • config.yml : starport 설정 파일

애플리케이션별 로직

블록체인을 구성하는 대부분의 로직은 사용자 지정 모듈에 작성되며 각 모듈은 독립적인 기능을 효율적으로 캡슐화 합니다.

사용자 정의 모듈은 x 디렉토리에 저장되며, starport app 명령어로 생성된 프로젝트는 기본적으로 프로젝트 이름과 동일한 이름을 가진 모듈을 생성합니다.

proto file

Cosmos SDK 모듈들의 모든 데이터 구조, 메시지, 쿼리, RPC 등은 Protocol buffer 파일로 정의 합니다. x 디렉토리의 사용자 모듈은 proto 디렉토리 아래 각각 proto 파일로 저장됩니다.

전역 설정

블록체인 전역 설정과 관련한 내용은 app 디렉토리 안의 파일에 정의 합니다. 3rd-part 모듈의 import, 모듈간의 관계 설정, 블록체인 설정 등이 포함됩니다.

설정

config.yml 파일에는 starport를 이용해 개발중인 블록체인 노드의 빌드, 노드 초기화, 노드 실행 등을 사용하는데 필요한 옵션을 지정할 수 있습니다.

Address Prefix

Cosmos SDK 기븐 블록체인의 주소 앞에는 prefix가 붙습니다. 예를 들어 Cosmos Hub 블록체인의 기본 prefix는 cosmos를 사용하기 때문에 주소는 cosmos12fjzdtqfrrve7zyg9sv8j25azw2ua6tvu07ypf와 같은 형태를 가집니다.

새로운 블록체인 상에서 주소 Prefix 바꾸기

블록체인 프로젝트를 생성할 때 --address-prefix를 이용해 변경할 수 있습니다

starport app github.com/violetstair/planet --address-prefix moonlight

prefix를 moonlight로 지정할 경우 생성된 블록체인은 moonlight12fjzdtqfrrve7zyg9sv8j25azw2ua6tvu07ypf 와 같은 주소 형태를 사용합니다.

사용 중인 블록체인의 주소 Prefix 바꾸기

app/prefix.go 파일의 AccountAddressPrefix 값을 변경해 이미 생성된 블록체인 프로젝트의 prefix를 변경할 수 있습니다.

vue 웹 애플리케이션의 경우 /vue/.env 파일의 VUE_APP_ADDRESS_PREFIX 값을 변경해 변경할 수 있습니다.


Type

starport type 명령을 통해 CRUD(Create, Read, Update, Delete) 기능을 하는 사용자 정의의 새로운 type을 생성할 수 있습니다.

starport type [type_name] [field1] [field2] ... [flags]

type_name : 새로운 type의 이름으로 한 모듈 안에 중복된 값을 가질 수 없다. field : type의 각 field는 데이터 유형을 지정할 수 있으며, 콜론(amount:int) 구문으로 필드와 유형을 정의할 수 있다. 지원되는 유형은 string, bool, int, uint이며 지정하지 않을 경우 문자열로 설정 된다. --module: type을 생성할 모듈을 지정한다. 지정하지 않을 경우 프로젝트의 이름과 동일한 이름을 가진 기본 모듈에 생성된다.

type을 통해 생성되는 파일과 디렉토리

  • proto: SDK 메시지 및 쿼리용 서비스, HTTP endpoints
  • x/module_name/keeper: gRPC 메시지 서버 및 쿼리 handler
  • x/module_name/types: 메시지 types, keys
  • x/module_name/client/cli: CLI의 CRUD 액션
  • x/module_name/client/rest: HTTP endpoint
  • vue/src/views: Vue 구성 요소, type과 상호 작용하기 위한 CRUD 형식

CLI 명령어

type과의 CURD 상호작용을 위한 CLI 명령어 들이 생성 됩니다.

예를 들어 빌드된 바이너리의 이름이 appd이고 type이 post 이면, CLI 명령어들을 사용할 수 있습니다.

  • transaction 생성
appd tx blog create-post [title] [content]
appd tx blog delete-post [id]
appd tx blog update-post [id] [title] [content]
  • 쿼리 명령어를 통해 저장된 데이터 조회
appd q blog list-post
appd q blog show-post [id]

type 생성 예제

게시물을 등록하는 post라는 type을 생성해 봅시다. 게시물의 제목과 내용을 의미하는 titlebody는 string 형식을 가지며, 댓글 유무를 확인하는 comment는 bool, 댓글의 숫자를 의미하는 count는 inteager 형식을 지정할 경우 다음과 같은 명령어로 생성할 수 있습니다.

starport type post title body comments:bool count:int32 --module blog

이 type은 blog 모듈안에 생성됩니다.


Module

module은 Cosmos SDK 블록체인을 구성하는 블록입니다.

module은 로직을 캡슐화 하고, 프로젝트간 기능을 공유할 수 있습니다.

module 빌드에 대한 내용은 Cosmos SDK 모듈 소개에서 확인할 수 있습니다.

module 생성

starport module 명령어를 통해 module을 생성할 수 있습니다.

starport module create [name] [flags]

name은 모듈의 이름을 의미하며, 프로젝트 내에서는 중복된 값을 가질 수 없습니다.

module 명령에 의해 생성되는 파일과 디렉토리

  • proto : query 및 message 서비를 위한 proto 파일을 포함하는 디렉토리
  • x : module이 생성되는 디렉토리
  • app/app.go : module을 import 하고 초기화 합니다

IBC 기능 활성화

IBC(Inter-Blockchain Communication protocol)는 Cosmos SDK 생태계의 중요한 부분입니다. module에 IBC 대한 로직을 포함해 생성하려면 --ibc 플래그를 사용하면 됩니다.

module 생성 예제

다음과 같은 명령어로 IBC 기능을 활성화한 blog 모듈을 생성할 수 있습니다.

starport module create blog --ibc

Message

message는 블록체인의 상태를 변경한다.

message는 트랜젝션으로 묶이고, 브로드캐스트된 트랜젝션은 블록으로 묶이게 되며, 블록은 블록체인을 만들게 됩니다.

type이 각 CRUD 작업에 대한 메시지를 구성하고 CRUD 로직을 구현하는 반면, message는 로직 없이 단일 message를 구성합니다.

Cosmos SDK message 구조

starport message 명령어로 새로운 message를 생성할 수 있습니다.

message에 대한 자센한 설명은 Cosmos SDK messages에서 확인할 수 있습니다.

starport message [name] [field1] [field2] ... [flags]

messaeg 명령에 의해 생성되는 파일과 디렉토리

  • proto : message의 type
  • x/module_name/keeper : gRPC message 서버
  • x/module_name/types : message type 정의 및 message key 생성
  • x/module_name/client/cli : message와 함께 트랜젝션을 브로드캐스트 하는데 사용되는 CLI 명령어

옵션 플래그

message는 --desc--response 두 가지 옵션이 있으며, 각각의 기능은 다음과 같습니다.

  • --desc : message와 함께 트랜젝션을 브로드캐스트 하는 CLI 명령에 대한 설명
  • --response : message의 응답 필드를 지정하며, 공백 없이 쉼표로 구분된 필드 목록 형태

message 생성 예제

두 개의 응답 값을 가지는 cancelSellOrder 메시지 생성 예제

starport message cancelSellOrder port channel amountDenom priceDenom orderID:int --desc "Cancel a sell order" --response id,amount --module ibcdex

Packet

packet은 IBC(Inter-Blockchain Communication) 채널을 통해 다른 블록체인으로 전송됩니다. IBC packet은 시퀀스 관련 메타데이터와 패킷 데이터라고 확인하기 어려운 값 필드가 있는 데이터 구조 입니다. packet의 의미는 application layer에 의해 정의 됩니다.(ex> 토큰 수량 및 금액) IBC에 대한 자세한 설명은 IBC 문서에서 확인할 수 있습니다.

packet

packet은 IBC 모듈에서만 사용할 수 있습니다.

starport packet [packetName] [field1] [field2] --module [module_name] [flags]

사용자 지정 acknowledgement 유형

acknowledgement 필드는 --ack 플래그로 설정할 수 있으며, 이름과 자료형이 콜론(:)으로 구분된 필드쌍이 공백없이 쉼표로 구분된 필드 목록을 사용하여 정의할 수 있습니다.

packet 명령에 의해 생성되는 파일과 디렉토리

  • proto : packet 데이터, acknowledgement type, message type을 정의
  • x/module_name/keeper : IBC 후크, gRPC 메시지 서버
  • x/module_name/types : message type, IBC 이벤트
  • x/module_name/client/cli : packet과 함께 message가 포함된 트랜잭션을 브로드캐스트하는 CLI 명령

packet 생성 예제

다음 명령은 remainingAmount:intpurchase:int 필드에 대한 사용자 지정 acknowledgements과 함께 amountDenomremainingAmount 필드에 대한 IBC 지원 buyOrder 패킷을 생성합니다.

starport packet buyOrder amountDenom amount:int priceDenom price:int --ack remainingAmount:int,purchase:int --module ibcdex

Published Jul 13, 2021

Right Thoughts, Right Words, Right Action