[Tech]코스모스 앱체인 만들기(ignite)

Tech At CHANNEL-iN
@CHANNEL-iN
Published in
8 min readFeb 6, 2024
  1. cosmos chain overview
  2. 코스모스 앱체인 만들기(ignite)
  3. 월렛 연결과 어플리케이션 상호작용 (keplr)

지난 포스팅에서 klaytn<>Finchia 병합이슈를 두고
가볍게 Finchia의 네트워크의 구조와
기술 기반이 되는 cosmos에 대해 다루었다.

이번 포스팅에서 Finchia와 같이
cosmosSDK를 이용하여 네트워크를 구축해보도록 하고
왜 그간 cosmos는 SDK에 공을 들였는지에 대해
몸소 체험해 보고 그에 따른 편리함을 느껴보도록 하자.

cosmosSDK Github Contribute Status(https://github.com/cosmos/cosmos-sdk/graphs/contributors)

cosmosSDK의 공식문서에 따르면,
cosmosSDK를 이용한 블록체인을 앱체인으로 명칭한다.

Cosmos SDK는 다중 자산 공개 지분 증명(PoS)을 구축하기 위한
오픈 소스 프레임워크입니다.
블록체인, Cosmos Hub 및 허가된 PoA(Proof-of-Authority) 블록체인과
같습니다. Cosmos SDK로 구축된 블록체인을
일반적으로 애플리케이션별 블록체인 이라고 합니다 .

앱체인은 단일 서비스 운영을 위한 맞춤화된 블록체인이다.
빌더는 서비스 운영에 필요로 하는 최적의 환경을 설계하여
서비스만을 위한 체인을 앱체인이라고 명칭한다.

여기서 참고하고 넘어가면 좋을 키워드는
모놀리틱 블록체인과 모듈러 블록체인이다.

모놀리틱 블록체인의 경우
블록체인에 필요한 합의,실행,데이터에 관련된 모든 것들을
단일 주체가 해결한다.

반대로 모듈러 블록체인의 경우엔
단일 주체가 모든 작업을 하기보다
필요한 레이어별로 해당 주체가 해결토록 분업화 한다.

더 자세한 차이점을 서칭하고자 한다면
해당 아티클을 읽어보자

이전에 포스팅 했던 cosmos chain overview를 살펴보면

cosmosSDK를 이용하면
빌더는 application layer에 해당하는 부분만 구축을 하면 되도록
모듈화된 블록체인이기 때문에 편리성 이점을 살려 구축할 수 있다.
해당 포스팅은 cosmos 공식 tutorial 문서를 기반으로
작성되고 진행한다.
더욱 자세한 내용을 필요로 한다면 공식문서를 참고하자.

자, 이제 독자적인 체인을 만들어보자.
재밌게도 cosmosSDK만으로도 정말 강력한 SDK이지만
더욱 심플하게 체인을 구성할 수 있는 tool이 있다.
바로 ignite CLI이다.

ignite는 cosmosSDK를 기반으로 조금 더 쉽고
front client app까지 쉽게 구축할 수 있도록 scaffold를 지원한다.
ignite팀의 서포트도 공식 discord에서 활발히 이루어지고 있기때문에
많은 도움을 받을 수 있었다.

cosmosSDK를 이용한 앱체인 tutorial

ignite CLI를 이용한 앱체인 tutorial

우리는 ignite를 이용하여 구축하자.

준비물

curl https://get.ignite.com/cli! | bash
  • ignite CLI가 정상적으로 설치 되었는지 확인
ignite version
tech_at_channelin % ignite version
Ignite CLI version: v28.1.1
Ignite CLI build date: 2024-01-16T09:10:21Z
Ignite CLI source hash: c1804c6d7419b1dc61450f7b84f112abc2ed9dcb
Ignite CLI config version: v1
Cosmos SDK version: v0.50.3
Your OS: darwin
Your arch: amd64
Your Node.js version: v20.8.0
Your go version: go version go1.21.6 darwin/amd64
.
.
.

위와 같이 버전 정보가 정상적으로 출력된다면 성공이다.

chain 초기 템플릿 만들기

ignite scaffold chain chin
6_createChain % ignite scaffold chain chin     

⭐️ Successfully created a new blockchain 'chin'.
👉 Get started with the following commands:

% cd chin
% ignite chain serve

Documentation: https://docs.ignite.com

channel-in을 줄여서 chin이라 칭하고 설정하여 셋팅했다.
위와 같이 성공했다는 터미널 문구가 나오면 완료다.

해당 폴더로 이동한 뒤에 ignite chain serve를 실행해보자.

cosmos SDK를 이용한 install 및 setting 후 running

놀랍게도 끝이다. 물론 메인으로 publish 하기전인
local에서 개발을 위한 네트워크 환경을 구축한 것 뿐이다.

tendermint node에 대한 셋팅,
appchain을 이용하기위한 스웨거 api 문서,
token faucet까지 전부 제공 한다.

이렇게만 하면 아쉬우니 간단하게
chin 네트워크의 쿼리를 하나 만들어보자.

ignite scaffold query hello name --response name

hello라는 이름의 명령은 name를 받아 name를 반환하는 쿼리다.

proto/chin/chin/query.proto 에는 쿼리 요청 및 구조가 추가되고
x/chin/keeper/query_hello.go 에는 작성하고자 하는 코드를 작성하면 된다.

x/chin/keeper/query_hello.go

package keeper

import (
"chin/x/chin/types"
"context"
"fmt"

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

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

ctx := sdk.UnwrapSDKContext(goCtx)

// TODO: Process the query
_ = ctx

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

return에 req의 인풋으로 들어온 name을 반환해주는 걸로 변환 했다.

ignite chain serve를 재시작하고 쿼리를 날려보자

chind q chin hello channel-iN

스웨거 API 에도 정상적으로 추가되어
작동되는 것을 확인할 수 있다. http://0.0.0.0:1317/

다음 포스팅엔 로컬 노드를 이용하여 월렛 연결을 진행해보도록 하자.
해당 코드는 아래 깃헙에서 찾아볼 수 있다.

--

--