跳转到主要内容
在本指南中,您将构建一个仪表板,显示任何 Solana 地址的持有情况和当前活动。您将通过单次 DAS 调用提取其完整的代币、NFT 和 SOL 投资组合,使用 Helius 独有的 getTransactionsForAddress 加载交易历史,并通过 transactionSubscribe 实时流式传输新活动。您将首先以嵌入式演示形式尝试,然后将其构建为完整的 Next.js 应用程序。

实时尝试

粘贴您的 API 密钥和任何钱包地址,以查看投资组合、历史记录和实时供稿三部分如何协同工作。这是您的应用程序将渲染的相同数据。

将其构建为 Next.js 应用程序

在 GitHub 上获取完整应用程序

克隆完整的入门应用程序 — 本次演练的完成版 Next.js 应用程序,已准备好 npm install && npm run dev
上述小部件直接从浏览器调用 Helius,从而暴露了您的 API 密钥。在真实应用中,您需将密钥保存在服务器上。本次演练使用 Next.js 应用路由及两个路由处理器,因此 您的密钥不会到达客户端:一个代理 RPC 调用,另一个将 WebSocket 供稿作为服务端事件传递。
先决条件: Node.js 18+ 和一个 Helius API 密钥
1

搭建项目

您将使用 Helius SDK 进行 RPC 调用,并使用 ws 进行实时 WebSocket 供稿。将您的密钥添加到 .env.local
.env.local
2

通过路由处理器代理 RPC 调用

这会将您的 API 密钥保留在服务器端。客户端在此处发布一个方法和参数,处理器通过 Helius SDK 运行它们,该 SDK 会附加您的密钥并为您构建请求。
app/api/helius/route.ts
3

通过服务端事件传递实时供稿

浏览器无法在没有密钥的情况下打开 Helius WebSocket。相反,在服务器上打开 WebSocket,并通过 SSE 将签名流式传输到客户端。
app/api/stream/route.ts
4

渲染仪表板

页面通过代理加载投资组合和历史记录,然后订阅 SSE 供稿以获取实时更新。
app/page.tsx
5

运行

打开 http://localhost:3000,粘贴一个钱包地址,然后点击 Load。您会立即看到投资组合和历史记录,并且实时供稿将随着新交易触及钱包而完成。

发生了什么

一个 DAS 调用即可获取整个投资组合

getAssetsByOwnershowFungible: trueshowNativeBalance: true 会在单个响应中返回可替代代币、NFT(标准和压缩)以及原生 SOL 余额,因此您不需要单独的 getBalancegetTokenAccountsByOwner 调用。通过 itemsinterface 分割以对代币和 NFT 进行分组。 每个项目都带有自己的元数据,因此同一调用可以为两个列表提供支持。使用 content.metadata.name 获取名称,使用 content.links.image 获取标识或艺术作品。可替代代币还包括一个 token_info 对象,内含原始 balancedecimalssymbol — 将 balance 除以 10 ** decimals 以获得易于理解的金额。并非每种代币都会附带名称或标识,因此在缺失时请优雅地降级处理。

一次请求完成完整历史

getTransactionsForAddress 返回钱包的交易历史,通过 filters.tokenAccounts: "balanceChanged" 它还包括钱包的关联代币账户上的转账,这是普通 getSignaturesForAddress 所遗漏的活动。使用 transactionDetails: "full" 获取完整的交易数据而不仅仅是签名。

无需轮询的实时更新

每当交易触及钱包时,transactionSubscribe 会推送一条消息,因此您无需轮询。在筛选器中添加 tokenAccounts: "balanceChanged" 还可以匹配钱包的代币账户,因此传入的 SPL 转账会出现在供稿中 — 正是历史调用计算的活动。通过服务器端路由处理器中继订阅可防止您的 API 密钥泄露到客户端。

下一步

getAssetsByOwner

所有显示选项、分页和完整资产响应格式。

getTransactionsForAddress

按时间、槽位、代币、方向和金额的高级过滤。

transactionSubscribe

实时 WebSocket 供稿的过滤选项和有效负载格式。

部署您自己的程序

下一步:通过 Helius 将 Solana 程序部署到 devnet。