2023. 6. 14. 11:49ㆍBlockchain/Cosmos
※ 원글 작성 : 22년 6월 22일
Cosmos SDK 기반 체인 구성
[Blockchain/Cosmos] - Cosmos SDK 기반 체인 로컬 테스트넷 구성
[Blockchain/Cosmos] - Cosmos SDK 기반 체인 다중 validator 환경 구성
Cosmos SDK나 Ignite CLI를 통해 생성한 Tendermint 기반 블록체인은 gaiad(Cosmos HUB), wasmd(CosmWasm), terrad(Terra), bnbchaind(Binance chain) 처럼 쉽게 체인을 구성할 수 있는 데몬을 제공한다. 해당 데몬들을 이용해 로컬 테스트넷 구성을 해본다. gaiad를 기반으로 구성할 것이나, 다른 데몬들도 유사한 방식을 사용하여 비슷한 명령어로 사용하면 각 체인 구성이 가능할 것이다.
Install
Git clone으로 다운로드 받는다.
git clone https://github.com/cosmos/gaia
cd gaia
make install
설치를 하면 app.go
내의 DefaultNodeHome
에 따라 디렉토리가 생성되며, 디렉토리 내부에 config, keyring(backend) 등이 생성된다.
func init() {
userHomeDir, err := os.UserHomeDir()
if err != nil {
stdlog.Println("Failed to get home dir %2", err)
}
DefaultNodeHome = filepath.Join(userHomeDir, ".gaia")
}
config 내에 app.toml에서 minimum-gas-prices
를 설정해 주어야 한다. SDK v0.45 부터 error로 발생하기 때문에 값을 설정해주고, port 1317로 API 서버를 사용하기 위해서는 API configuration의 [api] - enable을 true로 변경시켜야 REST API 통신이 가능해진다.
Keyring
Daemon
로컬넷 account 생성이 필요하다. Account 생성 option은 os, file, memory, test가 있는데 선택 조건에 따라 DefaultNodeHome
내에 keyring 폴더가 생성된다. file의 경우 keyring-file
폴더가, test의 경우 keyring-test
폴더가 생성된다. 대부분의 docs에서 test로 생성을 하는데, file로 생성하는 것이 실제 product에도 사용가능하니 file 옵션으로 생성해 본다.
gaiad keys add myacc --keyring-backend file
비밀번호를 입력하면 아래와 같이 print 된다.
mnemonic도 생성이 되어서 보관이 필요하다.
key와 관련된 gaiad가 제공하는 기능은 아래와 같다.
// mnemonic을 통한 priv/pub key recovery
gaiad keys add --recover
// key 확인
gaiad keys show <account_name>
// validator 주소
gaiad keys show <account_name> --bech=val
// key 목록
gaiad keys list
// 연결된 노드의 validator pubkey
gaiad tendermint show-validator
또한 private key를 export하여 armored 된 key를 확인할 수 있다.
gaiad keys export myacc
Go SDK
Cosmos SDK는 keyring package가 존재한다. 데몬에서도 armored pri/pub key export 기능이 제공되지만, Go code 상에서도 key 쌍과 account를 생성할 수 있다.
import (
"github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/crypto/hd"
"github.com/cosmos/cosmos-sdk/crypto/keyring"
sdk "github.com/cosmos/cosmos-sdk/types"
)
// 새로운 keyring
kr, err := keyring.New("appname",
keyring.BackendFile,
sdk.FullFundraiserPath,
"",
hd.Secp256k1)
if err != nil {
// Err handling
}
// info : GetAddress, GetPubKey 등 확인 가능
// mnemonic : BIP39 Mnemonic 생성
info, mnemonic, err := kr.NewMnemonic("myacc", keyring.English, sdk.FullFundraiserPath, "", hd.Secp256k1)
// Armored pri/pub key export
priKeyArmor, _ := kr.ExportPrivKeyArmor(keyOwnerName, keypw)
pubKeyArmor, _ := kr.ExportPubKeyArmor(keyOwnerName)
Export된 armored private key를 통해 주소 생성이 가능하다.
import "github.com/cosmos/cosmos-sdk/crypto"
priv, _, err := crypto.UnarmorDecryptPrivKey(priKeyArmor, keypw)
addr, err := sdk.AccAddressFromHex(priv.PubKey().Address().String())
이를 통해 새로운 키 생성 및 account 생성을 할 수 있다.
Genesis
로컬 chain id를 설정하고, genesis.json 생성이 필요하다. genesis account를 추가하고, validator를 정의 후 collect-gentxs를 통해 실제 genesis를 생성한다. gentx를 실행 시에 validator가 될 수 있도록 충분한 양의 코인을 지급해야 한다.
gaiad init myacc --chain-id localnet
gaiad add-genesis-account <account_name> 1000stake,1000uatom --keyring-backend file
gaiad gentx myacc 1000stake --chain-id localnet --keyring-backend file
gaiad collect-gentxs
Run
마지막으로 실행하면 동작한다.
gaiad start
'Blockchain > Cosmos' 카테고리의 다른 글
Cosmos chain module 및 components (0) | 2023.06.14 |
---|---|
Cosmos SDK 기반 체인 configuration (1) | 2023.06.14 |
Cosmos [3] (Core, SDK, Smart contract) (1) | 2023.06.13 |
Cosmos [2] (Algorithm, Protocol) (0) | 2023.06.13 |
Cosmos [1] (Concept, Architecture) (0) | 2023.06.13 |