๐ Cosmos Hub WebSocket ํธ๋์ญ์ ์์ง ํด๋ผ์ด์ธํธ (Go)
์ด ํ๋ก์ ํธ๋ Go ์ธ์ด๋ก ์์ฑ๋ ๊ฐ๋จํ WebSocket ํด๋ผ์ด์ธํธ์ ๋๋ค. Cosmos Hub (Atom)์ Tendermint RPC ๋ ธ๋์ ์ฐ๊ฒฐํ์ฌ ์ค์๊ฐ ํธ๋์ญ์ ์ด๋ฒคํธ๋ฅผ ๊ตฌ๋ ํ๊ณ , ์์ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ธ๋ก ๋์ด๋ณ๋ก ๋ถ๋ฅํ์ฌ JSON ํ์ผ๋ก ์ ์ฅํฉ๋๋ค.
โจ ์ฃผ์ ๊ธฐ๋ฅ
์ค์๊ฐ ๊ตฌ๋ : ์์ ์ ์ธ ๊ณต์ฉ Tendermint RPC ์๋ํฌ์ธํธ์ WebSocket์ผ๋ก ์ฐ๊ฒฐํ์ฌ tm.event='Tx' ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ๋ ํฉ๋๋ค.
๋ฐ์ดํฐ ํ์ฑ: Cosmos/Tendermint ์ด๋ฒคํธ ๋ฉ์์ง(Result ํ๋์ ๋ฐ์ดํฐ ํฌํจ)๋ฅผ ๋ถ์ํ์ฌ ํธ๋์ญ์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํฉ๋๋ค.
๋ธ๋ก ๋จ์ ์บ์ฑ: ๋์ผํ ๋ธ๋ก ๋์ด์ ํธ๋์ญ์ ์ ๋ฉ๋ชจ๋ฆฌ์ ์์๋ก ์บ์ํฉ๋๋ค.
๋ธ๋ก ์ ํ ๊ฐ์ง ๋ฐ ์ ์ฅ: ์๋ก์ด ๋ธ๋ก ๋์ด๊ฐ ๊ฐ์ง๋๋ฉด ์ด์ ๋ธ๋ก์ ๋ชจ๋ ํธ๋์ญ์ ์ ./save ํด๋์ JSON ํ์ผ๋ก ์๋ ์ ์ฅํฉ๋๋ค.
ํ๋ก๊ทธ๋จ ์ข ๋ฃ ์ ์ต์ข ์ ์ฅ: Ctrl+C ๋๋ SIGINT ์ ํธ ์์ ์ ์บ์์ ๋จ์์๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ์ ์ฅํฉ๋๋ค.
๐ ๏ธ ๊ฐ๋ฐ ํ๊ฒฝ ์ค์
์ ์ ์กฐ๊ฑด (Prerequisites)
Go (Golang) (๋ฒ์ 1.18 ์ด์ ๊ถ์ฅ)
Git (์์ค ์ฝ๋ ๊ด๋ฆฌ๋ฅผ ์ํด)
ํ๋ก์ ํธ ์คํ
์ ์ฅ์ ํด๋ก :
git clone https://github.com/๋น์ ์_์์ด๋/cosmos-ws-client.git cd cosmos-ws-client
์ข ์์ฑ ๋ค์ด๋ก๋: Gorilla WebSocket ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
go mod init cosmos-ws-client # ํ๋ก์ ํธ ๋ชจ๋ ์ด๊ธฐํ (์ด๋ฏธ ๋์ด ์๋ค๋ฉด ์๋ต) go get github.com/gorilla/websocket
ํด๋ผ์ด์ธํธ ์คํ:
go run main.go
ํ๋ก๊ทธ๋จ์ด ์ฑ๊ณต์ ์ผ๋ก ์ฐ๊ฒฐ๋๋ฉด ์ค์๊ฐ ํธ๋์ญ์ ์ ์์ ๋๊ธฐํฉ๋๋ค.
๐ ๊ฒฐ๊ณผ๋ฌผ ๋ฐ ํด๋ ๊ตฌ์กฐ
ํด๋ผ์ด์ธํธ๊ฐ ํธ๋์ญ์ ์ ์์งํ๊ณ ๋ธ๋ก ์ ํ์ ๊ฐ์งํ๋ฉด, ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ save ํด๋๊ฐ ์์ฑ๋๊ณ , ๊ทธ ์์ JSON ํ์ผ์ด ์ ์ฅ๋ฉ๋๋ค.
cosmos-ws-client/ โโโ main.go # ๋ฉ์ธ Go ํด๋ผ์ด์ธํธ ์ฝ๋ โโโ go.mod # Go ๋ชจ๋ ํ์ผ โโโ go.sum # Go ๋ชจ๋ ์ฒดํฌ์ฌ ํ์ผ โโโ .gitignore # Git์ด ๋ฌด์ํ ํ์ผ ์ ์ โโโ save/ # โจ ํธ๋์ญ์ ๋ฐ์ดํฐ ์ ์ฅ ํด๋ โโโ [BlockHeight].json # ์: 28572307.json โโโ [BlockHeight].json
JSON ์ถ๋ ฅ ์์ ([BlockHeight].json)
์ ์ฅ๋๋ JSON ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค.
{ "block_height": "28572307", "total_txs": 3, "transactions": [ { "query": "tm.event='Tx'", "data": { "type": "tendermint/event/Tx", "value": { "TxResult": { "height": "28572307", "log": "[{"msg_index":0,"events":[...]}", "tx": "CoqiAQqIogEKIy9pYmMuY29yZS5jbGllbnQudjEuTXNnV..." } } }, "capture_time": "2025-11-25T20:00:00+09:00" } // ... ๋๋จธ์ง ํธ๋์ญ์ ] }
โ๏ธ ์ค์ ๋ฐ ๋ง์ถคํ
main.go ํ์ผ ์๋จ์ ์ ์๋ ์์๋ฅผ ์์ ํ์ฌ ํด๋ผ์ด์ธํธ์ ๋์์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
RPC ์๋ํฌ์ธํธ ๋ณ๊ฒฝ
ํ์ฌ wss://cosmos-rpc.polkachu.com/websocket์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ค๋ฅธ Tendermint RPC ๋ ธ๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด rpcEndpoint ์์๋ฅผ ๋ณ๊ฒฝํ์ธ์.
// main.go ํ์ผ ๋ด const rpcEndpoint = "wss://cosmos-rpc.polkachu.com" const wsPath = "/websocket" // ๋๋ถ๋ถ์ ๋ ธ๋์์ ์ด ๊ฒฝ๋ก๋ ๊ทธ๋๋ก ์ ์ง๋ฉ๋๋ค.
๊ตฌ๋ ์ฟผ๋ฆฌ ๋ณ๊ฒฝ
ํน์ ์ด๋ฒคํธ๋ง ๊ตฌ๋ ํ๋ ค๋ฉด subscribeQuery ์์๋ฅผ ์์ ํ์ธ์.
// ๋ชจ๋ ํธ๋์ญ์ ์ด๋ฒคํธ ๊ตฌ๋ (๊ธฐ๋ณธ ์ค์ ) const subscribeQuery = "tm.event='Tx'"
// ํน์ ๋ชจ๋์ ๋ฉ์์ง ์ ํ๋ง ๊ตฌ๋ (์: Bank ๋ชจ๋์ ์ก๊ธ ๋ฉ์์ง) // const subscribeQuery = "message.action='/cosmos.bank.v1beta1.MsgSend'"