この記事は株式会社 株式会社Gincoのテックブログとして書いています。
はじめに
私は普段、エンタープライズウォレットを開発しており、Cosmos Hubというブロックチェーンを取り扱っています。
Cosmos Hubはコミュニティによって運営されており、日々様々な提案が上げられています。
提案が承認された場合は、アプリケーションコードの改修や設定値の変更をしなければいけません。
こうした対応を効率化するために、Cosmos Hubへの改善提案をウォッチする仕組みを実装していきたいと思います。
実現するための方法をChatGPTに質問
早速ですが、ChatGPTに聞いてみました。
1のexplorerの利用は、具体的にはmintscan.ioのようなexplorerで、proposalsの一覧を確認することができます。
最もコストを掛けずに監視するならこの方法ですね。
しかし、前回確認した分との差分がわかりにくく、無駄に確認回数が増えてしまいそうです。
そこで、今回は2のRESTful APIを用いた方法を採用します。
Cosmos Hubには、REST APIがあり、proposalsの一覧を取得するAPIも用意されています。
使用するAPI
GET /cosmos/gov/v1beta1/proposals
curlでvoting periodの提案を取得する例:
curl -X GET "https://lcd-cosmoshub.keplr.app/cosmos/gov/v1beta1/proposals?proposal_status=2" -H "accept: application/json"
レスポンス
{
"pagination": {
"next_key": null,
"total": "4"
},
"proposals": [
{
"content": {
"@type": "/ibc.core.client.v1.ClientUpdateProposal",
"description": "Due to an unforeseen relayer issue that resulted in the subject client exceeding the trusting period, the IBC client 07-tendermint-1157 used by channel-726 for ATOM transfers from Cosmoshub to Realio is currently in an expired state. If accepted, this proposal will update client 07-tendermint-1157 with the data from 07-tendermint-1189 which is created newly, so that users may continue to take advantage of both the established channels.",
"subject_client_id": "07-tendermint-1157",
"substitute_client_id": "07-tendermint-1189",
"title": "IBC Client Update: Expired Client to Realio Chain"
},
"deposit_end_time": "2023-12-12T08:56:53.722526361Z",
"final_tally_result": {
"abstain": "0",
"no": "0",
"no_with_veto": "0",
"yes": "0"
},
"proposal_id": "855",
"status": "PROPOSAL_STATUS_VOTING_PERIOD",
"submit_time": "2023-11-28T08:56:53.722526361Z",
"total_deposit": [
{
"amount": "250000000",
"denom": "uatom"
}
],
"voting_end_time": "2023-12-12T09:34:21.773919644Z",
"voting_start_time": "2023-11-28T09:34:21.773919644Z"
}
]
}
実装するもの
Cosmos Hubが新しい提案を受けた場合に通知を受るための仕組みを実装していきます。
実装するものの仕様
今回は以下のようにしたいと思います。
- Cloud Schedulerなどで一定期間ごとにCloud Functionsの関数を実行する
- 関数の中で、curlでCosmosのAPIを叩いて、proposalsの一覧を取得し、slackに通知する
- 前回通知していないものだけを通知したい
- 提案の時間を見て判別する
- (今回はやらない: 通知済みの提案をDBに格納する)
- それぞれのフェーズで通知する
- submitされたら通知、votingに入ったら通知、など
- slackへ送るメッセージは、explorerへのリンクにする
slack通知の動作確認
上の仕様で実装しました。
スケジューラが起動して関数を実行したあと、slackに以下のようなメッセージが送信されました。
コード
今回のプログラムコードは、以下のリポジトリをご覧ください。
まとめ
今回は、Cosmos-HubのREST APIを用いて、新しい提案が出現した時に通知を送るslack botを実装しました。皆様のアプリケーションの運用負荷を下げる一助になれば幸いです。
株式会社Ginco ではブロックチェーンを学びたい方、ウォレットについて詳しくなりたい方を募集しています。下記 link から是非ご応募ください。
参考
- Cloud Functionsのデプロイ: https://cloud.google.com/functions/docs/create-deploy-http-go?hl=ja
- slackに通知: https://zenn.dev/kou_pg_0131/articles/slack-api-post-message