⛓️

Solana オンチェーン分析のはじめかた

2024/12/20に公開

はじめに

はじめましてブロックチェーンエンジニアの@osaguildです。
普段は、暗号会計RIKYUという暗号資産向けの会計システムを作っています。
専門分野はオンチェーン分析で、様々なブロックチェーンのトランザクション分析を行っています。最近はsolanaのオンチェーン分析を進めていて、実践を通じた学びを発信していきます。

オンチェーン分析とは?

オンチェーン分析とは、その名の通りブロックチェーン上のトランザクションを分析することです。
身近な例だと、solscanを代表とするblock explorerが、オンチェーン分析を代表するプロダクトです。

block explorerのような大規模なものから、特定のprogramのメトリクス収集など様々な種類のオンチェーン分析がありますが、私は以下の一連のプロセスのことをオンチェーン分析と呼んでいます。

  1. ブロックチェーンのデータ取得
  2. 取得したデータを分析し、意味付けする
  3. 分析したデータをわかりやすい形式で提供する

まず、分析するためのデータをブロックチェーンから取得します。solanaのようなパブリックチェーンの場合は、無料で利用できるnodeを利用すれば誰でも簡単にデータを取得できます。
※大量にデータを取得する場合は、自分でnodeを運用する必要もあるのでご注意ください。

次に、取得したデータを分析し意味づけします。取得したデータ非常に難読で、理解するにはブロックチェーンの専門知識が必要です。OSSのlibraryなどを活用して分析することをお勧めします。

最後に、分析したデータをわかりやすい形式でユーザーに提供します。分析がうまくできてもユーザーにその価値が伝わらなければ意味がありません。どのように伝えるかも非常に重要です。

ブロックチェーンからデータを取得してみよう!

オンチェーン分析の概念も理解できたので、ブロックチェーンからデータを取得してみましょう。

ブロックチェーンのデータを取得する方法は大きく2種類です。

  1. nodeから直接取得する方法
  2. data provider経由でデータを取得する方法

1.nodeから直接取得する方法

nodeから直接データを取得する場合は、無料で利用できるnodeを利用するのがおすすめです。
無料のnodeはサービスレベルが低く、rate limitなどの制約がありますが、オンチェーン分析を始めるには無料のnodeで十分です。

私がおすすめするのはheliusです。他のnodeと比較してサービスレベルが高く、Freeプランでもスループットは10rpsなので個人開発ならheliusで十分だと思います。

nodeからデータを取得するには@solana/web3jsというOSSのlibraryを利用するのがおすすめです。

@solana/web3jsはsolanaのRPC nodeとインタラクションするための様々な実装を提供してくれていて、heliusのAPI-KEYを指定すれば簡単にリクエストできます。

サンプルとしてtypescriptでsolanaのtransactionを取得するため実装を書きましたがとても簡単です。

import { ConfirmedSignatureInfo, Connection } from '@solana/web3.js';

export const getTransaction = async (signature: ConfirmedSignatureInfo) => {
  const connection = new Connection(process.env.SOLANA_NODE_ENDPOINT!);
  const tx = await connection.getParsedTransaction(signature.signature, {
    commitment: 'finalized',
    maxSupportedTransactionVersion: 0,
  });

  return tx;
};

2.data provider経由で取得する方法

大体どのチェーンでも、ブロックチェーンのデータを扱いやすい形式に変換して提供してくれるdata providerがいます。solanaの場合はsolscan apishyftがdata providerに該当します。

data providerは事前にオンチェーン分析したデータを自社のdatabase(indexerと呼ぶ)に保持し、API経由で提供しています。
nodeから直接指定したデータは難読で扱いにくく、昇順でしかデータを取得できないなど様々な制約がありますが、data providerは独自のdatabaseに構造化したデータを保持することでこの課題を解決しています。

以下がnode経由で取得したデータを補正したものですが、どのような取引なのか直感的に理解するのは難しいのではないかと思います。

{
  "meta": {
    "fee": 5000,
    "innerInstructions": [
      {
        "index": 1,
        "instructions": []
      }
    ],
    "preBalances": [10000, 0],
    "postBalances": [0, 10000],
    "logMessages": [],
    "preTokenBalances": [],
    "postTokenBalances": [],
    "err": null,
    "computeUnitsConsumed": 0
  },
  "transaction": {
    "message": {
      "accountKeys": [
        {
          "pubkey": "hoge",
          "signer": true,
          "writable": true,
          "source": "transaction"
        }
        {
          "pubkey": "fuga",
          "signer": false,
          "writable": true,
          "source": "transaction"
        }
      ],
      "instructions": [
        {
          "parsed": {
            "info": {
              "destination": "fuga",
              "lamports": 10000,
              "source": "hoge"
            },
            "type": "transfer",
            "program": "system",
            "programId": "11111111111111111111111111111111",
            "stackHeight": null
          }
        }
      ]
    },
    "signatures": ["signature"]
  }
}

一方で、solscan apiから取得したデータは以下の様な構造になっています。このデータであれば直感的にどのような取引が発生したのか理解できるのではないでしょうか?

{
  "success": true,
  "data": [
    {
      "block_id": 100,
      "trans_id": "signature",
      "block_time": 1720171655,
      "time": "2024-07-05T09:27:35.000Z",
      "activity_type": "ACTIVITY_SPL_TRANSFER",
      "from_address": "hoge",
      "to_address": "fuga",
      "token_address": "So11111111111111111111111111111111111111112",
      "token_decimals": 9,
      "amount": 10000,
      "flow": "in"
    }
  ]
}

おすすめの方法

オンチェーン分析を始めたばかりの人には、2.data provider経由で取得する方法をおすすめしています。

理由は、nodeが提供するraw dataを分析するハードルが非常に高いことと、ほとんどのユースケースならdata provider経由でも十分だからです。

私もこれまでオンチェーン分析したことがないチェーンの分析をする場合はdata providerを探すところから始めます。

ただし、data providerを経由する場合は、data providerにオンチェーン分析の精度が依存してしまうことになるため、プロダクトが成熟してくると痒いところに手が届かなくなるので注意が必要です。

data providerの品質が問題になるころには、オンチェーン分析のスキルも習熟しているはずなので、そのタイミングでスイッチすることをおすすめしています。

まとめ

  • オンチェーン分析とは以下の一連のプロセスのことを指す。
    1. ブロックチェーンのデータ取得
    2. 取得したデータを分析し、意味付けする
    3. 分析したデータをわかりやすい形式で提供する
  • ブロックチェーンのデータを取得する方法は大きく2種類。おすすめはdata provider経由。
    1. nodeから直接取得する方法
    2. data provider経由でデータを取得する方法

今後もプロダクト開発で得た学びを発信していきます!オンチェーン分析で何か質問があれば気軽にご質問ください!

Discussion