Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions .gitbook/docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -1116,6 +1116,30 @@
"redirects/https_testnet_blockscout_injective_network_blocks"
]
},
{
"group": "인프라",
"icon": "network-wired",
"expanded": false,
"pages": [
"ko/infra/index",
{
"group": "노드와 상호작용",
"expanded": false,
"pages": [
"ko/infra/interact-node/index",
"ko/infra/interact-node/command-line",
"ko/infra/interact-node/grpc",
"ko/infra/interact-node/go",
"ko/infra/interact-node/rest"
]
},
"ko/infra/run-node",
"ko/infra/set-up-keyring",
"ko/infra/join-a-network",
"ko/infra/cosmovisor",
"ko/infra/upgrade-node"
]
},
"ko/faq",
"ko/glossary",
"ko/references"
Expand Down
171 changes: 171 additions & 0 deletions .gitbook/ko/infra/cosmovisor.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
---
title: Injective 네트워크를 위한 Cosmovisor 설정 가이드
---

Cosmovisor는 바이너리(체인) 업그레이드 관리를 단순화하는 Cosmos SDK 기반 블록체인용 프로세스 관리자입니다. 이 가이드는 Injective 네트워크 노드에 Cosmovisor를 설정하는 단계별 지침을 제공합니다.

> **참고:** 이 지침은 기존 체인 바이너리(예: `injectived`)와 소스에서 Cosmovisor를 설치하려는 경우 작동하는 Go 환경이 이미 있다고 가정합니다. 특정 설정에 맞게 이름과 경로를 조정하세요.

---

## 목차

1. [설치](#installation)
- [Go를 통한 설치](#installing-via-go)
2. [환경 변수](#environment-variables)
3. [디렉터리 구조](#directory-structure)
4. [Cosmovisor 실행](#running-cosmovisor)
5. [체인 업그레이드 처리](#handling-chain-upgrades)
6. [Systemd 서비스로 Cosmovisor 실행](#running-cosmovisor-as-a-systemd-service)

---

## 설치

### Go를 통한 설치

Go가 설치되어 있으면 다음 명령으로 Cosmovisor를 설치할 수 있습니다:

```bash
go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@v1.5.0
```

> **팁:** Go 바이너리 설치 경로(일반적으로 `$GOPATH/bin` 또는 `$HOME/go/bin`)가 시스템의 `PATH`에 추가되어 있는지 확인하세요. 다음을 실행하여 설치를 확인할 수 있습니다:
>
> ```bash
> which cosmovisor
> ```

## 환경 변수

Cosmovisor가 실행할 바이너리와 위치를 알 수 있도록 다음 환경 변수를 설정합니다:

- **`DAEMON_NAME`**
체인 바이너리의 이름입니다(예: `injectived`).

- **`DAEMON_HOME`**
노드의 홈 디렉터리입니다(예: `~/.injectived`).

이러한 변수를 쉘의 프로필(`~/.bashrc` 또는 `~/.profile`)에 설정하거나 터미널 세션에서 직접 내보낼 수 있습니다:

```bash
export DAEMON_NAME=injectived
export DAEMON_HOME=~/.injectived
```

---

## 디렉터리 구조

Cosmovisor는 노드의 홈 디렉터리에서 특정 폴더 구조를 예상합니다:

1. **Genesis 디렉터리 생성**

이 디렉터리는 초기(genesis) 바이너리를 보관합니다.

```bash
mkdir -p $DAEMON_HOME/cosmovisor/genesis/bin
```

2. **현재 바이너리 복사**

현재 체인 바이너리(예: `injectived`)를 genesis 폴더에 넣습니다. 파일 이름이 `DAEMON_NAME` 값과 일치하는지 확인하세요(다음 섹션 참조).

```bash
cp $(which injectived) $DAEMON_HOME/cosmovisor/genesis/bin/injectived
```

---

## Cosmovisor 실행

체인의 바이너리를 직접 실행하는 대신 다음을 실행하여 Cosmovisor로 노드를 시작합니다:

```bash
cosmovisor run start
```

Cosmovisor는:

- `$DAEMON_HOME/cosmovisor/genesis/bin`(또는 적절한 업그레이드 폴더)에서 바이너리를 찾습니다.
- 해당 바이너리를 사용하여 노드를 시작합니다.
- 온체인 업그레이드 신호를 모니터링하고 필요할 때 자동으로 바이너리를 전환합니다.

---

## 체인 업그레이드 처리

업그레이드가 온체인에서 발표되면 Cosmovisor가 자동으로 전환할 수 있도록 새 바이너리를 준비합니다:

1. **업그레이드 디렉터리 생성**

온체인에서 제공된 업그레이드 이름을 사용합니다(예: `v1.14.0`):

```bash
mkdir -p $DAEMON_HOME/cosmovisor/upgrades/<upgrade_name>/bin
```

2. **새 바이너리 배치**

새 바이너리를 컴파일하거나 다운로드한 다음 업그레이드 디렉터리에 복사합니다. 바이너리 이름이 `DAEMON_NAME`과 일치하는지 확인하세요.

```bash
cp /path/to/new/injectived $DAEMON_HOME/cosmovisor/upgrades/<upgrade_name>/bin
cp /path/to/new/libwasmvm.x86_64.so $DAEMON_HOME/cosmovisor/upgrades/<upgrade_name>/bin
```

> **팁:** GitHub에서 `injectived` 바이너리 패키지를 다운로드한 경우 `libwasmvm.x86_64.so`를 업그레이드 `bin` 디렉터리에 복사합니다. 이 디렉터리를 `LD_LIBRARY_PATH`에 추가하는 환경 변수가 나중에 systemd 서비스에 추가됩니다.

3. **업그레이드 프로세스**

업그레이드 높이에 도달하면 Cosmovisor가 예약된 업그레이드를 감지하고 해당 업그레이드 폴더에 있는 바이너리로 자동 전환합니다.

---

## Systemd 서비스로 Cosmovisor 실행

프로덕션 환경에서는 노드를 systemd 서비스로 실행하는 것이 일반적입니다. 아래는 예시 서비스 파일입니다.

1. **서비스 파일 생성**

다음 내용으로 파일(예: `/etc/systemd/system/injectived.service`)을 생성합니다. 경로와 `<your_username>`을 적절히 조정하세요:

```ini
[Unit]
Description=Injective Daemon managed by Cosmovisor
After=network-online.target

[Service]
User=<your_username>
ExecStart=/home/<your_username>/go/bin/cosmovisor run start
Restart=always
RestartSec=3
Environment="DAEMON_NAME=injectived"
Environment="DAEMON_HOME=/home/<your_username>/.injectived"
Environment="PATH=/usr/local/bin:/home/<your_username>/go/bin:$PATH"
Environment="DAEMON_ALLOW_DOWNLOAD_BINARIES=false"
Environment="DAEMON_RESTART_AFTER_UPGRADE=true"
Environment="UNSAFE_SKIP_BACKUP=true"
Environment="LD_LIBRARY_PATH=/home/<your_username>/.injectived/cosmovisor/current/bin"

[Install]
WantedBy=multi-user.target
```

2. **서비스 활성화 및 시작**

```bash
sudo systemctl daemon-reload
sudo systemctl enable injectived.service
sudo systemctl start injectived.service
```

3. **로그 확인**

서비스가 원활하게 실행되는지 확인합니다:

```bash
journalctl -u injectived.service -f
```

---
8 changes: 8 additions & 0 deletions .gitbook/ko/infra/index.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
description: >-
이 섹션은 노드 운영자 및 검증자가 센트리/검증자 노드를 실행, 업그레이드 및 유지 관리하는 데 도움을 제공합니다.
title: 개요
---

* [메인넷 검증자](/ko/infra/validator-mainnet/)
* [테스트넷 검증자](/ko/infra/validator-testnet/)
7 changes: 7 additions & 0 deletions .gitbook/ko/infra/interact-node/command-line.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
title: CLI를 사용하여 노드와 상호작용
---

`injectived` CLI를 사용하여 노드와 상호작용할 수 있습니다. 로컬 프라이빗 네트워크의 노드와 상호작용하는 경우, CLI를 사용하기 전에 터미널에서 노드가 실행 중인지 확인하세요.

`injectived` 사용 방법에 대한 자세한 내용은 [injectived 사용하기](/developers/injectived/use/ "mention")를 참조하세요.
88 changes: 88 additions & 0 deletions .gitbook/ko/infra/interact-node/go.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
---
title: Go를 사용하여 프로그래밍 방식으로 노드와 상호작용
---

<Callout icon="info" color="#07C1FF" iconType="regular">
다음 예제는 Go로 작성되었지만, Python 및 TS SDK를 사용하여 프로그래밍 방식으로 노드/Injective와 상호작용할 수도 있습니다.

* [TypeScript 예제](/developers-native/examples/)
* [Python 예제](https://github.com/InjectiveLabs/sdk-python/tree/master/examples)
</Callout>

다음 스니펫은 Go 프로그램 내에서 gRPC를 사용하여 상태를 쿼리하는 방법을 보여줍니다. 아이디어는 gRPC 연결을 만들고 Protobuf로 생성된 클라이언트 코드를 사용하여 gRPC 서버를 쿼리하는 것입니다.

```go
import (
"context"
"fmt"

"google.golang.org/grpc"

sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/tx"
)

func queryState() error {
myAddress, err := sdk.AccAddressFromBech32("inj...")
if err != nil {
return err
}

// gRPC 서버에 연결을 생성합니다.
grpcConn := grpc.Dial(
"127.0.0.1:9090", // gRPC 서버 주소.
grpc.WithInsecure(), // SDK는 전송 보안 메커니즘을 지원하지 않습니다.
)
defer grpcConn.Close()

// x/bank 서비스를 쿼리하기 위한 gRPC 클라이언트를 생성합니다.
bankClient := banktypes.NewQueryClient(grpcConn)
bankRes, err := bankClient.Balance(
context.Background(),
&banktypes.QueryBalanceRequest{Address: myAddress, Denom: "inj"},
)
if err != nil {
return err
}

fmt.Println(bankRes.GetBalance()) // 계정 잔액을 출력합니다

return nil
}
```

#### **Go를 사용한 과거 블록 쿼리**

과거 블록을 쿼리하려면 gRPC 요청에 블록 높이 메타데이터를 추가합니다.

```go
import (
"context"
"fmt"

"google.golang.org/grpc"
"google.golang.org/grpc/metadata"

grpctypes "github.com/cosmos/cosmos-sdk/types/grpc"
"github.com/cosmos/cosmos-sdk/types/tx"
)

func queryState() error {
// --snip--

var header metadata.MD
bankRes, err = bankClient.Balance(
metadata.AppendToOutgoingContext(context.Background(), grpctypes.GRPCBlockHeightHeader, "12"), // 요청에 메타데이터 추가
&banktypes.QueryBalanceRequest{Address: myAddress, Denom: denom},
grpc.Header(&header), // 응답에서 헤더 검색
)
if err != nil {
return err
}
blockHeight = header.Get(grpctypes.GRPCBlockHeightHeader)

fmt.Println(blockHeight) // 블록 높이를 출력합니다 (12)

return nil
}
```
62 changes: 62 additions & 0 deletions .gitbook/ko/infra/interact-node/grpc.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
---
title: gRPC를 사용하여 노드와 상호작용
---

Protobuf 생태계는 `*.proto` 파일에서 다양한 언어로 코드를 생성하는 도구를 포함하여 여러 사용 사례를 위한 도구를 개발했습니다. 이러한 도구를 통해 클라이언트를 쉽게 구축할 수 있습니다. 종종 클라이언트 연결(즉, 전송)은 쉽게 교체할 수 있습니다. 인기 있는 전송 방법인 gRPC를 살펴보겠습니다.

코드 생성 라이브러리는 대부분 여러분의 기술 스택에 따라 다르므로, 두 가지 대안만 제시합니다:

* 일반적인 디버깅 및 테스트를 위한 `grpcurl`
* Go, Python 또는 TS를 통한 프로그래밍 방식

## grpcurl

[grpcurl](https://github.com/fullstorydev/grpcurl)은 `curl`과 비슷하지만 gRPC용입니다. Go 라이브러리로도 사용할 수 있지만, 여기서는 디버깅 및 테스트 목적의 CLI 명령으로만 사용합니다. 설치하려면 이전 링크의 지침을 따르세요.

로컬 노드가 실행 중이라고 가정하면(로컬넷이든 라이브 네트워크에 연결되어 있든), 다음 명령을 실행하여 사용 가능한 Protobuf 서비스를 나열할 수 있습니다. `localhost:9090`을 다른 노드의 gRPC 서버 엔드포인트로 대체할 수 있으며, 이는 `app.toml` 내의 `grpc.address` 필드에서 구성됩니다:

```bash
grpcurl -plaintext localhost:9090 list
```

`cosmos.bank.v1beta1.Query`와 같은 gRPC 서비스 목록이 표시됩니다. 이것을 리플렉션이라고 하며, 사용 가능한 모든 엔드포인트에 대한 설명을 반환하는 Protobuf 엔드포인트입니다. 이들 각각은 서로 다른 Protobuf 서비스를 나타내며, 각 서비스는 쿼리할 수 있는 여러 RPC 메서드를 노출합니다.

서비스에 대한 설명을 얻으려면 다음 명령을 실행하세요:

```bash
# 검사하려는 서비스
grpcurl \
localhost:9090 \
describe cosmos.bank.v1beta1.Query
```

노드에서 정보를 쿼리하기 위해 RPC 호출을 실행할 수도 있습니다:

```bash
grpcurl \
-plaintext
-d '{"address":"$MY_VALIDATOR"}' \
localhost:9090 \
cosmos.bank.v1beta1.Query/AllBalances
```

## grpcurl을 사용한 과거 상태 쿼리

일부 [gRPC 메타데이터](https://github.com/grpc/grpc-go/blob/master/Documentation/grpc-metadata.md)를 쿼리에 전달하여 과거 데이터를 쿼리할 수도 있습니다: `x-cosmos-block-height` 메타데이터에 쿼리할 블록이 포함되어야 합니다. 위의 grpcurl을 사용하면 명령은 다음과 같습니다:

```bash
grpcurl \
-plaintext \
-H "x-cosmos-block-height: 279256" \
-d '{"address":"$MY_VALIDATOR"}' \
localhost:9090 \
cosmos.bank.v1beta1.Query/AllBalances
```

해당 블록의 상태가 아직 노드에서 정리되지 않았다면, 이 쿼리는 비어 있지 않은 응답을 반환해야 합니다.

## 트랜잭션 전송

gRPC 및 REST를 사용하여 트랜잭션을 전송하려면 몇 가지 추가 단계가 필요합니다: 트랜잭션 생성, 서명, 그리고 마지막으로 브로드캐스트.

자세한 내용은 [트랜잭션](/defi/transactions/ "mention")에서 확인할 수 있습니다.
10 changes: 10 additions & 0 deletions .gitbook/ko/infra/interact-node/index.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
title: 노드와 상호작용
---

이 섹션에서는 Injective 노드와 상호작용하는 다양한 방법을 다룹니다.

- [명령줄](/ko/infra/interact-node/command-line)
- [gRPC](/ko/infra/interact-node/grpc)
- [Go](/ko/infra/interact-node/go)
- [REST](/ko/infra/interact-node/rest)
Loading