Logo
Published on

[Cosmos] Ignite CLI Tutorial (1)

Authors

Intro

Ignite CLI Tutorial중 Hello World, Blog Express Tutorial에 대한 내용 실습 및 정리 글입니다.

아무래도 Tutorial 실습의 초반 부분이라 그런지 간단한 에제들이 많아서 금방 글을 작성할 수 있었습니다.

시작해 보겠습니다! 😀😀


Hello world

해당 튜토리얼에서는 Hello %s로 사용자 정의 쿼리에 응답하는 기능을 구축합니다. %s에서 쿼리에 전달된 이름을 의미하며 이를 통해 Cosmos SDK 블록체인에서 사용자 정의 쿼리를 생성하는 방법에 대한 이해를 기대할 수 있습니다.

Set Up

다음 명령어들을 사용해서 새로운 프로젝트를 생성합니다.

  1. Create Block Chain
ignite scaffold chain hello
  1. Navigate to the BlockChain Directory
cd hello

Add Custom Query

다음 명령어를 이용해서 이름과 입력을 허용하고, 응답을 반환하는 say-hello 쿼리에 대한 코드를 생성합니다.

ignite scaffold qeury say-hello name --response name

명령어가 정상적으로 실행되면 위의 화면이 출력됩니다.

  • proto/hello/hello/query.proto : request와 response의 구조를 정의합니다
  • x/hello/module/autocli.go: 쿼리에 대한 CLI 명령을 포함하고 있습니다.
  • x/hello/keeper/query_say_hello.go: query response에 대한 로직을 수행합니다.

Customizing the Query Response

Cosmos SDK에서 Query란 블록체인의 정보에 대한 요청으로 블록체인의 현재 상태 또는 거래 세부 정보와 같은 데이터에 액세스하는 데 사용됩니다. SDK는 여러 가지 기본 Query 방법을 제공하지만 개발자는 특정 데이터 검색이나 복잡한 작업에 대한 사용자 지정 Query를 작성할 수도 있습니다. 이전 명령어로 생성된 x/hello/keeper/query_say_hello.go 를 수정하여 커스텀 Qeury 생성합니다.

// x/hello/keeper/query_say_hello.go
package keeper

import (
	"context"
	"fmt"

	"hello/x/hello/types"

	sdk "github.com/cosmos/cosmos-sdk/types"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
)



func (k Keeper) SayHello(goCtx context.Context, req *types.QuerySayHelloRequest) (*types.QuerySayHelloResponse, error) {
	if req == nil {
	return nil, status.Error(codes.InvalidArgument, "invalid request")
	}

	ctx := sdk.UnwrapSDKContext(goCtx)

	// TODO: Process the query
	_ = ctx

	// return &types.QuerySayHelloResponse{}, nil
	return &types.QuerySayHelloResponse{Name: fmt.Sprintf("Hello %s!", req.Name)}, nil
}

Running the Blockchain

1. Start BlockChain

ignite chain serve

2. Test the Query

hellod q hello say-hello world

명령어가 정상적으로 실행되면 위의 화면이 출력됩니다.


Module Basic:Blog / Express Tutorial

해당 튜토리얼에서는 데이터를 쓰고 읽을 수 있는 모듈을 사용하여 블로그 게시물을 작성하고 읽는 기능을 구현합니다. 이를 통해 블록체인에 데이터를 보내고 해당 데이터를 다시 읽을 수 있는 피드백 루프를 생성하고 학습하는 것에 목표가 있다고 합니다.

먼저 Blog Tutorial을 위한 새로운 프로젝트를 생성합니다.

ignite scaffold chain blog

먼저 Blog 애플리케이션에 대한 간단한 요구사항을 정의합니다.

우리는 애플리케이션이 Post 유형의 객체를 블록체인에 저장하기를 원합니다. 이러한 개체에는 제목과 본문이라는 두 가지 속성이 있어야 한다고 가정합니다.

블록체인에 게시물을 저장하는 것 이외에도 게시물에 대한 CRUD 작업을 수행할 수 있어야 합니다.

ignite CLI에서는 기본 CRUD 기능을 구현하는 코드를 생성하는 기능을 제공합니다. 이는 애플리케이션에서 데이터를 생성, 읽기, 업데이트 및 삭제하는 데 필요한 코드를 간단하게 생성하는 스캐폴딩 명령어를 통해서 제공합니다.

blog directory로 전환하고 ignite scaffold list 명령을 실행합니다.

cd blog
ignite scaffold list post title body

명령어를 실행하면 위의 파일들이 만들어 집니다.

명령어를 실행 후 나오는 파일에 대한 간단한 설명입니다.

proto/blog/blog

출력 화면에서 볼 수 있다시피 post.proto를 제외한 다른 파일들은 생성된게 아닌 수정된 것입니다.

  • post.proto: 제목, 본문, ID 및 작성자에 대한 필드가 있는 게시물 유형을 정의하는 프로토콜 버퍼 파일입니다.
  • tx.proto: 이 파일은 세 가지 RPC인 CreatePost, UpdatePost 및 DeletePost를 포함하도록 수정되었습니다. 이러한 RPC 각각은 게시물에서 해당 CRUD 작업을 수행하는 데 사용할 수 있는 Cosmos SDK msg에 해당합니다.
  • query.proto: 이 파일은 Post 및 PostAll이라는 두 가지 쿼리를 포함하도록 수정되었습니다. Post 쿼리는 ID로 단일 게시물을 검색하는 데 사용할 수 있으며, PostAll 쿼리는 페이지가 매겨진 게시물 목록을 검색하는 데 사용할 수 있습니다.
  • genesis.proto: 이 파일은 블록체인이 처음 시작될 때 초기 상태를 정의하는 모듈의 생성 상태에 게시물을 포함하도록 수정되었습니다.

x/blog/keeper

x/blog/keeper내부 파일들은 모두 새롭게 생성되었습니다.

  • sg_server_post.go: 이 파일은 CreatePost, UpdatePost 및 DeletePost 메시지에 대한 keeper method를 구현합니다. 이러한 method는 해당 메시지가 모듈에서 처리될 때 호출되며 각 CRUD 작업에 대한 특정 로직을 처리합니다.
  • query_post.go: 게시물 목록으로 개별 게시물을 검색하는 데 사용되는 Post 및 PostAll 쿼리를 구현합니다.
  • post.go: 이 파일은 키퍼 메소드가 의존하는 기본 기능을 구현합니다. 이러한 기능에는 store에 게시물 추가, 게시물 가져오기, 게시물 수 가져오기 및 애플리케이션에서 게시물을 관리하는 데 필요한 기타 작업이 포함됩니다.

x/blog/types

x/blog/types내부 파일은 messages_post.go만 생성되었고 나머지는 모두 수정되었습니다.

  • messages_post.go: 이 새 파일에는 Route(), Type(), GetSigners(), GetSignBytes()ValidateBasic()과 같은 Cosmos SDK 메시지 생성자와 관련 메서드가 포함되어 있습니다.
  • keys.go: 이 파일은 블로그 게시물을 저장하기 위한 주요 접두어를 포함하도록 수정되었습니다. 키 접두사를 사용하면 블로그 게시물의 데이터가 데이터베이스의 다른 유형의 데이터와 별도로 유지되고 필요할 때 쉽게 액세스할 수 있습니다.
  • genesis.go: 이 파일은 블로그 모듈의 Gesnesis 상태를 정의하고 이 초기 상태를 검증하기 위한 Validate() 함수를 정의하도록 수정되었습니다.
  • codec.go: 이 파일은 메시지 유형을 encoder에 등록하여 네트워크를 통해 전송될 때 적절하게 직렬화 및 역직렬화되도록 수정되었습니다.
  • *.pb.go: 애플리케이션에서 사용되는 메시지, RPC 및 쿼리에 대한 유형 정의가 포함되어 있습니다. 이 파일들은 protoBuffer를 통해 *.proto파일들로 부터 생성되며 이를 통해 언어에 구애받지 않는 방식으로 데이터 구조를 정의할 수 있습니다.

Running the Blockchain

생성된 프로젝트가 정상적으로 실행되는지 확인합니다.

1. Start BlockChain

ignite chain serve

2. Create Post

blogd tx blog create-post 'Hello, World!' 'This is a blog post' --from alice --chain-id blog

명령어가 정상적으로 실행되면 위의 화면이 출력됩니다.

--form 플래그를 사용해서 서명에 사용될 계정을 지정합니다. 해당 계정을 이용해서 transaction을 브로드캐스트할 때도 사용하며 유효한 서명이 없으면 블록체인에서 거래가 승인되지 않습니다.

사용 가능한 계정 목록은 config.yml파일에서 확인 가능합니다.

3. Get Posts

blogd q blog list-post

명령어가 정상적으로 실행되면 위의 화면이 출력됩니다.

4. Update Post

blogd tx blog update-post 0 'Hello, World!' 'This is a blog post from Alice' --from alice --chain-id blog

명령어가 정상적으로 실행되면 위의 화면이 출력됩니다.

수정 후 조회 결과

5. Delete Post

다음은 삭제하는 작업을 진행하기 전 다른 계정으로 삭제를 진행해보겠습니다.

blogd tx blog delete-post 0 --from bob --chain-id blog

명령어가 정상적으로 실행되었으나, 여전히 삭제는 되지 않았습니다.

다음은 다시 alice로 삭제를 진행해보겠습니다.

blogd tx blog delete-post 0 --from alice --chain-id blog

명령어가 정상적으로 실행되었으며, 삭제도 정상적으로 되었습니다.


Outro

여기까지 Ignite CLI Document의 Hello World Tutorial, Module Basic:Blog / Express Tutorial에 대한 내용 실습 및 정리 글입니다.

다음 포스팅에서는 Module Basic:Blog / Express Tutorial을 제외한 나머지 튜토리얼에 대한 내용을 가져오겠습니다. 😀😀


Reference