如何实时监控 Solana

  • Shyft_to
  • 发布于 2023-11-11 20:48
  • 阅读 8

本文介绍了如何使用 Shyft Callback API 监控 Solana 链上的 Jupiter swap 交易和 Merkle tree 数据更新。通过注册交易回调和账户回调,可以实时接收链上事件的通知,并将数据存储在 Supabase 数据库中,然后在前端展示实时数据。Shyft Callback API 简化了从 Solana 区块链获取事件数据并将其转换为易于理解的格式的过程。

在本集中,我们将探讨使用交易回调和账户回调来监控 Jupiter 交换交易和 Merkle 树数据更新的过程。

了解区块链上何时以及发生了哪些事件对于 web3 和去中心化应用程序至关重要。这些事件就像信号,驱动应用程序内的更新和交互,使它们更具活力。Solana 区块链保留了详细的事件日志,记录了区块中的交易详情,并允许外部访问重要的事件数据。

然而,应用程序经常面临一个巨大的挑战:将这种复杂的事件信息转化为人们可以轻松阅读的内容。这就是我们创建 Shyft Callback API 的原因。 回调就像你在 Solana 区块链上的耳朵,让你监听激动人心的事件,例如销售、挂单或交换。我们的回调会为你完成工作,而无需你不断检查区块链以查看是否发生了什么。一旦区块链上发生事件,我们就会向你提供的网址(回调 URL)发送 POST 请求。

Shyft 提供四种类型的回调:

  • 交易回调:这包括解析的和原始的交易。(我们会识别交易类型、NFT 销售、挂单、交换等,解码并解析数据,以便你可以轻松使用。查看此处支持的交易类型及其响应结构 here
  • 账户回调:我们会监控单个账户地址或给定程序的全部程序账户,只要账户数据更新,我们就会通过原始数据或解析的数据来通知你。
  • Discord:你可以直接在你的 Discord 服务器中获得带有图像(如果适用)的丰富响应结构。
  • Anchor 事件:给定一个 IDL,我们会自动检测交易中发出的 anchor 事件,并将其添加到回调响应中。

在今天的 #solanabrainfood 节目中,我们将使用交易回调账户回调来监控 Jupiter 上的交换事件,以及 Merkle 树账户数据的更新。

阅读 SHYFT API 文档 here

开始之前

要开始,我们需要一些东西。

注册你的 Shyft 账户并获取你自己的 Shyft API 密钥。

x-api-key 是一个身份验证参数,它使你可以访问 Shyft APIs你可以从 Shyft 网站上 your own API 密钥。 只需在此处使用你的电子邮件 ID 注册,你就可以免费获得它。如果你已经拥有一个 Shyft API 密钥,请跳过此步骤。

创建 Supabase 账户

我们需要一个地方来存储我们的回调数据,前端可以随后查询并在网站上展示。在本教程中,我们将使用 Supabase 来达到这个目的,尽管你可以自由选择你喜欢的任何数据库。如果你有兴趣使用 Next.js 项目设置 Supabase,你可以在此 link 中找到详细的说明。

你可以从这个 repo 中克隆本文的完整源代码。

注册交易回调

Shyft 允许我们为特定地址注册交易回调。 这意味着,只要使用这些地址发生任何链上事件,Shyft 都会立即通知我们相关的事件数据。在我们的例子中,为了演示,我们将为 Jupiter 程序地址 注册交易回调,并监听交换事件。

要注册回调,你可以选择手动调用 Shyft’s callback register API 或者通过提供必要的数据来使用 Shyft JS SDK。 在我们的教程中,为了方便起见,我们将选择 Shyft JS SDK。有关回调 API 的更多详细信息,你可以在此 link 中找到更多信息。

// setup Shyft client
import { Network, ShyftSdk } from "@shyft-to/js"

const shyft = new ShyftSdk({
  apiKey: process.env.NEXT_PUBLIC_SHYFT_API_KEY!,
  network: Network.Mainnet,
});

const trackEvents = async () => {
  try {
    setTracking(true);
    const result = await shyft.callback.register({
      network: Network.Mainnet,
      // Jupiter program address
      addresses: ["JUP4Fb2cqiRUcaTHdrPC8h2gNsA2ETXiPDD33WcGuJB"],
      // The URL of your API that listens for the callback event.
      // We will be set up in the next step.
      callbackUrl: `${window.location.href.replace(
        window.location.pathname,
        ""
      )}/api/transaction-callbacks`,
      // In this tutorial, we are only interested in SWAP event, but you can provide as many events as you like.
      events: [TxnAction.SWAP],
    });

    setCallbackId(result.id);

    console.log("success");
  } catch (error) {
    console.error(error);
  }
};

设置 API 以接收回调

此 API 是一个标准的 POST API。我们在上一步中向 Shyft 提供了此 API 的 URL。当事件发生时,Shyft 将调用此 API 并将数据发送给我们。 我们的责任包括检查数据并将其存储在数据库中。你可以自由选择要存储的数据部分;此决定取决于你的应用程序的逻辑。在我们的教程中,我们将插入交易的 timestamp ,交易的 signatures ,以及 action 对象(以 JSON 形式), 它保存着此交易的信息。要进一步了解回调数据的结构,你可以参考此 link

import { supabase } from "@/lib/supabase";
import { CallbackDataType } from "@/types";
import { NextApiResponse } from "next";
import { NextRequest } from "next/server";
import { TxnAction } from "@shyft-to/js";

export async function POST(req: NextRequest, res: NextApiResponse) {
  const body = (await req.json()) as CallbackDataType;

  if (!body.type || !body.actions || TxnAction.SWAP !== body.type)
    return res.status(400).json({ message: "Invalid callback data" });

  const action = body.actions.find((action) => action.type === body.type);

  if (body.status !== "Success") return;

  if (!action)
    return res.status(400).json({ message: "Invalid callback data" });

  const { error } = await supabase.from("shyft_jupiter_swap_events").insert({
    timestamp: body.timestamp,
    signatures: body.signatures,
    action,
  });

  if (error) return res.status(500).json({ message: "Insert error" });

  return Response.json(body);
}

在前端显示实时数据。

正如本文开头提到的,为了保持简单,我们将使用 Supabase 的实时功能在前端获取实时数据。当插入新记录时,Supabase 将立即通知我们。有关 Supabase Realtime 的更多信息,请访问以下 link

useEffect(() => {
  const channel = supabase
    .channel("shyft_jupiter_swap_events")
    .on(
      "postgres_changes",
      {
        event: "INSERT",
        schema: "public",
        table: "shyft_jupiter_swap_events",
      },
      (payload) => {
        console.log(payload);
        setTransactions((txs) => [payload.new as CallbackDataModel, ...txs]);
      }
    )
    .subscribe();

  return () => {
    channel.unsubscribe();
  };
}, []);

在设置好一切并运行应用程序后,我们收到的结果如下面的视频所示。

交易回调

注册账户回调

在 Solana 中,程序将其数据存储在账户中。可能有一些账户更新非常频繁,你可以设置回调来监听这些实时的变化,而不是持续轮询。

使用 Shyft 账户回调,这变得非常容易。你可以在你的程序 ID(或你感兴趣的账户地址)上注册一个回调,并在你的账户数据发生变化时开始接收到你后端的 POST 请求。 有关账户回调的更多信息,请访问以下 link

与交易回调一样,要注册账户回调,你也可以选择手动调用 Shyft’s callback register API 或者通过提供必要的数据来使用 Shyft JS SDK。 在我们的教程中,为了方便起见,我们将选择 Shyft JS SDK

const trackEvents = async () => {
  try {
    if (!merkleTree) return;

    setTracking(true);
    const result = await shyft.callback.register({
      network: Network.Devnet,
      // We want to monitor the updates on the Merkle tree address.
      addresses: [merkleTree],
      type: "ACCOUNT",
      callbackUrl: `${window.location.href.replace(
        window.location.pathname,
        ""
      )}/api/account-callbacks`,
      encoding: "PARSED",
    });

    setCallbackId(result.id);

    console.log("success");
  } catch (error) {
    console.error(error);
  }
};

在注册账户回调后,我们还需要设置一个 API 来接收回调,然后在前端显示数据。我们已经在上面介绍了这些步骤。在设置好一切并运行应用程序后,我们收到的结果如下面的视频所示。

账户回调

结论

总之,我们探讨了 Shyft 交易回调和账户回调在监控 Solana 以获取实时更新中的重要作用。了解区块链上何时以及发生了哪些事件对于 web3 和去中心化应用程序至关重要。这些事件就像是动态应用程序交互的命脉,确保实时更新和用户参与。

我们真诚地希望你喜欢阅读这篇博文!如果你有任何疑问或想法,请不要犹豫访问我们的 Discord 社区。

非常感谢你花时间阅读它!

资源

  • 原文链接: blogs.shyft.to/how-to-mo...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Shyft_to
Shyft_to
在 Solana上更快更智能地构建,使用Shyft的SuperIndexer、gRPC、RPC、API和SDK