- Published on
[Cosmos] Ignite CLI Tutorial (1)
- Authors
- Name
- 이민기
- Github
- @mingi3442
Intro
Ignite CLI Tutorial중 Hello World
, Blog Express Tutorial
에 대한 내용 실습 및 정리 글입니다.
아무래도 Tutorial 실습의 초반 부분이라 그런지 간단한 에제들이 많아서 금방 글을 작성할 수 있었습니다.
시작해 보겠습니다! 😀😀
Hello world
해당 튜토리얼에서는 Hello %s
로 사용자 정의 쿼리에 응답하는 기능을 구축합니다. %s
에서 쿼리에 전달된 이름을 의미하며 이를 통해 Cosmos SDK 블록체인에서 사용자 정의 쿼리를 생성하는 방법에 대한 이해를 기대할 수 있습니다.
Set Up
다음 명령어들을 사용해서 새로운 프로젝트를 생성합니다.
- Create Block Chain
ignite scaffold chain hello
- 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을 제외한 나머지 튜토리얼에 대한 내용을 가져오겠습니다. 😀😀