Cosmos SDK 공식 튜토리얼을 정리한 내용으로, 최신 내용은 Cosmos SDK 공식 문서에서 확인 할 수 있습니다.
Starport
는 Cosmos-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
명령어로 생성된 프로젝트는 기본적으로 프로젝트 이름과 동일한 이름을 가진 모듈을 생성합니다.
Cosmos SDK 모듈들의 모든 데이터 구조, 메시지, 쿼리, RPC 등은 Protocol buffer 파일로 정의 합니다.
x
디렉토리의 사용자 모듈은 proto
디렉토리 아래 각각 proto 파일로 저장됩니다.
블록체인 전역 설정과 관련한 내용은 app
디렉토리 안의 파일에 정의 합니다.
3rd-part 모듈의 import, 모듈간의 관계 설정, 블록체인 설정 등이 포함됩니다.
config.yml
파일에는 starport를 이용해 개발중인 블록체인 노드의 빌드, 노드 초기화, 노드 실행 등을 사용하는데 필요한 옵션을 지정할 수 있습니다.
Cosmos SDK 기븐 블록체인의 주소 앞에는 prefix가 붙습니다.
예를 들어 Cosmos Hub 블록체인의 기본 prefix는 cosmos
를 사용하기 때문에 주소는 cosmos12fjzdtqfrrve7zyg9sv8j25azw2ua6tvu07ypf
와 같은 형태를 가집니다.
블록체인 프로젝트를 생성할 때 --address-prefix
를 이용해 변경할 수 있습니다
starport app github.com/violetstair/planet --address-prefix moonlight
prefix를 moonlight
로 지정할 경우 생성된 블록체인은 moonlight12fjzdtqfrrve7zyg9sv8j25azw2ua6tvu07ypf
와 같은 주소 형태를 사용합니다.
app/prefix.go
파일의 AccountAddressPrefix
값을 변경해 이미 생성된 블록체인 프로젝트의 prefix를 변경할 수 있습니다.
vue 웹 애플리케이션의 경우 /vue/.env
파일의 VUE_APP_ADDRESS_PREFIX
값을 변경해 변경할 수 있습니다.
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을 생성할 모듈을 지정한다. 지정하지 않을 경우 프로젝트의 이름과 동일한 이름을 가진 기본 모듈에 생성된다.
proto
: SDK 메시지 및 쿼리용 서비스, HTTP endpointsx/module_name/keeper
: gRPC 메시지 서버 및 쿼리 handlerx/module_name/types
: 메시지 types, keysx/module_name/client/cli
: CLI의 CRUD 액션x/module_name/client/rest
: HTTP endpointvue/src/views
: Vue 구성 요소, type과 상호 작용하기 위한 CRUD 형식type과의 CURD 상호작용을 위한 CLI 명령어 들이 생성 됩니다.
예를 들어 빌드된 바이너리의 이름이 appd
이고 type이 post
이면, CLI 명령어들을 사용할 수 있습니다.
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]
게시물을 등록하는 post
라는 type을 생성해 봅시다.
게시물의 제목과 내용을 의미하는 title
과 body
는 string 형식을 가지며,
댓글 유무를 확인하는 comment
는 bool, 댓글의 숫자를 의미하는 count
는 inteager 형식을 지정할 경우 다음과 같은 명령어로 생성할 수 있습니다.
starport type post title body comments:bool count:int32 --module blog
이 type은 blog 모듈안에 생성됩니다.
module은 Cosmos SDK 블록체인을 구성하는 블록입니다.
module은 로직을 캡슐화 하고, 프로젝트간 기능을 공유할 수 있습니다.
module 빌드에 대한 내용은 Cosmos SDK 모듈 소개에서 확인할 수 있습니다.
starport module
명령어를 통해 module을 생성할 수 있습니다.
starport module create [name] [flags]
name
은 모듈의 이름을 의미하며, 프로젝트 내에서는 중복된 값을 가질 수 없습니다.
proto
: query 및 message 서비를 위한 proto 파일을 포함하는 디렉토리x
: module이 생성되는 디렉토리app/app.go
: module을 import 하고 초기화 합니다IBC(Inter-Blockchain Communication protocol)는 Cosmos SDK 생태계의 중요한 부분입니다.
module에 IBC 대한 로직을 포함해 생성하려면 --ibc
플래그를 사용하면 됩니다.
다음과 같은 명령어로 IBC 기능을 활성화한 blog
모듈을 생성할 수 있습니다.
starport module create blog --ibc
message는 블록체인의 상태를 변경한다.
message는 트랜젝션으로 묶이고, 브로드캐스트된 트랜젝션은 블록으로 묶이게 되며, 블록은 블록체인을 만들게 됩니다.
type
이 각 CRUD 작업에 대한 메시지를 구성하고 CRUD 로직을 구현하는 반면, message는 로직 없이 단일 message를 구성합니다.
starport message
명령어로 새로운 message를 생성할 수 있습니다.
message에 대한 자센한 설명은 Cosmos SDK messages에서 확인할 수 있습니다.
starport message [name] [field1] [field2] ... [flags]
proto
: message의 typex/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의 응답 필드를 지정하며, 공백 없이 쉼표로 구분된 필드 목록 형태두 개의 응답 값을 가지는 cancelSellOrder
메시지 생성 예제
starport message cancelSellOrder port channel amountDenom priceDenom orderID:int --desc "Cancel a sell order" --response id,amount --module ibcdex
packet은 IBC(Inter-Blockchain Communication) 채널을 통해 다른 블록체인으로 전송됩니다. IBC packet은 시퀀스 관련 메타데이터와 패킷 데이터라고 확인하기 어려운 값 필드가 있는 데이터 구조 입니다. packet의 의미는 application layer에 의해 정의 됩니다.(ex> 토큰 수량 및 금액) IBC에 대한 자세한 설명은 IBC 문서에서 확인할 수 있습니다.
packet은 IBC 모듈에서만 사용할 수 있습니다.
starport packet [packetName] [field1] [field2] --module [module_name] [flags]
acknowledgement 필드는 --ack
플래그로 설정할 수 있으며, 이름과 자료형이 콜론(:
)으로 구분된 필드쌍이 공백없이 쉼표로 구분된 필드 목록을 사용하여 정의할 수 있습니다.
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 명령다음 명령은 remainingAmount:int
및 purchase:int
필드에 대한 사용자 지정 acknowledgements과 함께 amountDenom
및 remainingAmount
필드에 대한 IBC 지원 buyOrder
패킷을 생성합니다.
starport packet buyOrder amountDenom amount:int priceDenom price:int --ack remainingAmount:int,purchase:int --module ibcdex