How to use Anchor to Retrieve Serum Staking Analytics(和訳)
※Anchor使ったSerumステーキングについてってことです。
Solanaブロックチェーンからデータを取り出すのは、本当に難しいです...いや、かつてはそうでした。Anchor、SolanaのSealevelフレームワーク(偉大で強力なhttps://twitter.com/armaniferrante によって開発された)のおかげで、これはかなりシンプルになりました。
このチュートリアルでは、Serum PulseチームがAnchorを使ってSRMとMSRMのステーキング報酬メトリクスを取得する方法を説明します。
必要なもの:
・nodeJS
・macOS
注** 使用するAnchorのバージョンは、プログラムの作成に使用したバージョンと一致する必要があります。この場合、serum staking repoではAnchor 0.4.4 https://github.com/project-serum/stake.git を使用しており、これを使用します。
このチュートリアルでは、ステークドロップとして配布されたリワードを取得します。
・まず、Solanaをインストールし、ウォレットランを作成する必要があります。
sh -c "$(curl -sSfL https://release.solana.com/v1.7.4/install)"
solana-keygen new
・次に、コードを格納するためのディレクトリを作成する必要があります。この作業が完了したら、index.jsファイルを作成し、"npm init"を実行します。すると、index.jsとpackage.jsonの2つのファイルが作成されます。
・次に、正しいパッケージをインストールしましょう。
npm install -s @project-serum/anchor@0.4.4
・最後に、IDLファイルを用意します。
"インターフェイス記述言語やインターフェイス定義言語(IDL)は、ある言語で書かれたプログラムやオブジェクトが、未知の言語で書かれた別のプログラムと通信するための言語の総称です"
取得するにはいくつかの方法があります。ステーキングコントラクトをクローンして生成する(https://github.com/project-serum/stake)か、"anchor idl fetch program_idcommand"を使って取得することができます。簡単にするために、ここではそれを添付しました。
このファイルを registry.json としてプロジェクトディレクトリに保存します。
・・・
それでは、リワードにアクセスするためのindex.jsのコードを書いてみましょう。
・ファイルの先頭に以下を追加します。
const anchor = require('@project-serum/anchor');
const provider = anchor.Provider.env();
anchor.setProvider(provider);
・次に、メインの関数を作りましょう。
async function main(){
}
・メインの中に以下を追加します。
const registry_idl = JSON.parse(require('fs').readFileSync('./registry.json', 'utf8'));
const programId = new anchor.web3.PublicKey('GrAkKfEpTKQuVHG2Y97Y2FF4i7y7Q5AHLK94JBy7Y5yv');
const registry = new anchor.Program(registry_idl, programId);
const allRewards = await registry.account.rewardVendor.all();
上記のコードでは、IDLを解析し、Anchorを使ってステーキングコントラクトのプログラムID"GrAkKfEpTKQuVHG2Y97Y2FF4i7y7Q5AHLK94JBy7Y5yv"に接続しています。
これにより、すべてのリワードを回収し始めることができます。
・次に、以下のコードを追加して、リワードを読み取り可能な形式に解析し、ログアウトさせます。
const parsedRewards = allRewards.map(x => {
return{
expired:x.account.expired,
expiryReceiver: x.account.expiryReceiver.toBase58(),
expiryTs:parseInt(x.account.expiryTs),
from:x.account.from.toBase58(),
kind:Object.keys(x.account.kind)[0],
mint:x.account.mint.toBase58(),
nonce:x.account.nonce,
poolTokenSuppy:parseInt(x.account.poolTokenSupply),
registar:x.account.registrar.toBase58(),
rewardEventQCursor:x.account.rewardEventQCursor,
startTS:parseInt(x.account.startTs),
total:parseInt(x.account.total),
vault:x.account.vault.toBase58(),
}
})
console.log(parsedRewards)
・最後に、ファイルの一番下に追加してください。
main()
・そしてそれをターミナルで実行してみてください。
ANCHOR_PROVIDER_URL=https://solana-api.projectserum.com node index.js
これでターミナルには、すべてのリワードのプリントアウトが表示されるようになります。簡単ですよね?
erumのエコシステムにクラス最高のアナリティクスを提供するこの旅に乗り出しながら、さらに多くのチュートリアルを公開していく予定です。Twitterでは、https://twitter.com/PulseSerumで、最新情報をお届けします。