本文介绍了Solana RPC的核心概念、JSON-RPC的使用方法,以及HTTP和WebSocket方法的区别。同时,详细讲解了请求参数、响应结构、解析响应和筛选标准等关键要素,并探讨了错误处理、公共与私有RPC端点,最后提供了丰富的开发者资源。
随着区块链技术的不断发展,Solana 已经成为构建可扩展和高性能去中心化应用程序(DApps)的领先平台。对于希望在 Solana 上进行构建的开发者来说,理解 Solana 远程过程调用(RPC)至关重要。本文提供了 Solana RPC 的高级概述,重点介绍开发者入门所需掌握的关键概念和工具。
远程过程调用是一种协议,它使一个程序能够在不同的地址空间(通常是共享网络中的另一台计算机)上执行一个过程。在区块链的上下文中,RPC 促进了网络不同组件之间的通信,从而实现了交易、数据检索和其他网络操作。这种机制对于客户端-服务器交互至关重要,其中客户端向服务器发送请求,服务器处理该请求并返回响应。
Solana 使用 RPC 来促进去中心化应用程序(DApps)与区块链之间的交互。与网络中去中心化节点的直接通信需要一个标准化、高效和安全的协议。RPC 节点 通过允许客户端(如 DApps 或钱包)通过网络向 Solana 节点发送命令来实现此目的。通过 RPC,开发者可以执行各种操作,例如查询账户余额、发送交易或获取区块链数据,而无需了解 Solana 网络的底层工作原理。
Solana RPC 节点使用 JSON-RPC 2.0 规范 接受 HTTP 请求。这个 API 允许开发者通过发送带有 JSON 格式数据的 HTTP POST 请求与 Solana 区块链进行交互。JSON 请求通常包括以下字段:
jsonrpc
: 一个字符串,指定 JSON-RPC 协议的版本。对于 Solana,它始终设置为 2.0
。id
: 请求的唯一标识符,可以是数字、字符串或 null。这有助于将响应与请求进行匹配。method
: 一个字符串,包含要调用的方法的名称。params
: 一个数组或对象,包含要传递给方法的参数。例如,获取账户余额的请求可能如下所示:
{
"jsonrpc": "2.0",
"id": 1,
"method": "getBalance",
"params": [\
"83astBRguLMdt2h5U1Tpdq5tjFoJ6noeGwaY3mDLVcri"\
]
}
响应将是一个 JSON 对象,包含所请求的数据或成功确认。例如,对上述请求的成功响应可能是:
{
"jsonrpc": "2.0",
"result": {
"context": {
"slot": 65340475
},
"value": 1000000
},
"id": 1
}
上面的结果相当简单,但 Solana RPC 方法也可以返回结构化为 JSON 对象的复杂响应,每个对象都包含特定的键值。常见的数据结构包括:
理解请求和结果中的每个字段对于构建能够与 Solana 无缝通信的应用程序非常重要。开发者应参考官方 Solana 文档 以了解每个方法的参数和响应结构。
Solana RPC API 包括许多不同的 RPC 方法,所有这些方法都使用基于 HTTP(请求和响应)的协议或 WebSocket(订阅)协议:
HTTP 和 WebSocket 协议分别适用于从区块链读取数据的不同方法。
getBalance
: 检索指定账户的余额。sendTransaction
: 将签名交易提交到网络以进行处理。getAccountInfo
: 获取有关特定账户的详细信息,包括其数据和状态。可以在 官方 Solana 文档 中找到 Solana HTTP 方法的完整列表。
accountSubscribe
: 订阅特定账户中的更改,并在账户数据被修改时发送更新。logsSubscribe
: 订阅来自交易的日志,允许客户端接收链上生成的日志更新。可以在 官方 Solana 文档 中找到 Solana WebSocket 方法的完整列表。
通过 RPC 与 Solana 交互时,开发者会经常使用一些关键参数,这些参数会极大地影响数据的检索和处理方式。此外,大多数 RPC 方法将包括执行特定操作所需的其他特定于方法的参数。
让我们探讨一些最重要的通用参数类型,这将使你更好地控制请求并更好地处理数据。
Solana 中的状态承诺是指区块链的特定状态被认为是最终状态的程度。当使用读取状态的 RPC 方法时,你可以指定三个承诺级别之一:finalized、confirmed 或 processed。
不同的承诺级别允许开发者在最新和确定的数据之间进行权衡。较低的级别(如 processed
)允许访问最新的状态更改,但存在潜在回滚的风险,而较高的级别(如 finalized
)提供更强的保证,即状态不会更改。
下面,我们简要描述三个承诺级别中的每一个。
processed
承诺级别表示节点查询其最新区块,该区块表示交易处理后的最新状态。此承诺级别提供最新的状态数据。但是,它附带一个警告,即此状态可能仍是分叉的一部分,并且可能会回滚。大约 5% 的区块属于此类别,使其适用于访问最新可用状态至关重要的读取操作,并且可以容忍偶尔的回滚。confirmed
承诺级别涉及节点查询已由集群的大多数验证者投票但尚未达到最终状态的最新区块。此级别在最近的状态更改与更高的确定性之间取得平衡。它通常仅比处理状态落后几秒钟,并且回滚的可能性非常低。尽管比 processed 更稳定,但 confirmed 状态仍然容易受到回滚的影响,尽管很少发生。finalized
承诺级别表示节点查询已由集群的超多数 (⅔ 的投票) 确认的最新区块,并且已达到最大锁定,从而确保该区块不会被重组。此级别提供最高的保证,即该状态不会被回滚。但是,与 processed 和 confirmed 级别相比,由于需要进行广泛的验证,因此等待最新更改达到此级别需要更长的时间。在正常情况下,最新 confirmed 区块和最新 finalized 区块之间通常至少有 32 个插槽的差异(约 13 秒)。带有 finalized
承诺级别的 getAccountInfo
请求示例:
{
"jsonrpc": "2.0",
"id": 1,
"method": "getAccountInfo",
"params": [\
"MJKqp326RZCHnAAbew9MDdui3iCKWco7fsK9sVuZTX2",\
{\
"commitment": "finalized"\
}\
]
}
对于大多数用例,confirmed
级别通过提供具有最小延迟的可靠状态来提供平衡的方法,而对于绝对确定性至关重要的操作,建议使用 finalized 级别。
有关承诺级别的更多信息,请参阅官方 Solana 文档。
RpcResponse 结构是 Solana RPC 交互的核心元素,由两个主要部分组成:context
和 value
。context
包括评估操作的插槽编号,提供区块链状态的快照。value
部分包含操作返回的实际数据。此结构旨在为开发者提供他们所需的数据以及理解该数据所需的上下文。
getAccountInfo
响应结构的示例:
{
"jsonrpc": "2.0",
"result": {
"context": {
"apiVersion": "1.18.22",
"slot": 293526550
},
"value": {
"data": "",
"executable": false,
"lamports": 598723268,
"owner": "11111111111111111111111111111111",
"rentEpoch": 18446744073709551615,
"space": 0
}
},
"id": 1
}
Solana RPC 中的已解析响应允许开发者接收人类可读的 JSON 格式的账户或指令数据,从而简化了开发过程。通过指定 "encoding":"jsonParsed"
,开发者可以使用更易于理解和集成到应用程序中的数据。各种原生和 SPL 程序支持 JSON 解析格式。
使用 base64
vs jsonParsed
编码的 getTokenAccountsByOwner
示例:
base64
请求:
{
"jsonrpc": "2.0",
"id": 1,
"method": "getTokenAccountsByOwner",
"params": [\
"MJKqp326RZCHnAAbew9MDdui3iCKWco7fsK9sVuZTX2",\
{\
"mint": "hntyVP6YFm1Hg25TN9WGLqM12b8TQmcknKrdu1oxWux"\
},\
{\
"encoding": "base64"\
}\
]
}
base64
响应:
{
"jsonrpc": "2.0",
"result": {
"context": {
"apiVersion": "1.18.22",
"slot": 293526928
},
"value": [\
{\
"account": {\
"data": [\
"CnMgk5GFYffdf8vsSr2FE97KGpZ/etejnWO0HtiTgIsFMzSY1a6krgCVhcQ/e4ww345wGH1KcT0TT5d/yN/gtQDEGScAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",\
"base64"\
],\
"executable": false,\
"lamports": 2039280,\
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",\
"rentEpoch": 18446744073709551615,\
"space": 165\
},\
"pubkey": "FSMJ7FwPp3JPUkjFNefTgikTWUsgMJw7t8dvZFP2Ve81"\
}\
]
},
"id": 1
}
jsonParsed
请求:
{
"jsonrpc": "2.0",
"id": 1,
"method": "getTokenAccountsByOwner",
"params": [\
"MJKqp326RZCHnAAbew9MDdui3iCKWco7fsK9sVuZTX2",\
{\
"mint": "hntyVP6YFm1Hg25TN9WGLqM12b8TQmcknKrdu1oxWux"\
},\
{\
"encoding": "jsonParsed"\
}\
]
}
jsonParsed
响应:
{
"jsonrpc": "2.0",
"result": {
"context": {
"apiVersion": "1.18.22",
"slot": 293527144
},
"value": [\
{\
"account": {\
"data": {\
"parsed": {\
"info": {\
"isNative": false,\
"mint": "hntyVP6YFm1Hg25TN9WGLqM12b8TQmcknKrdu1oxWux",\
"owner": "MJKqp326RZCHnAAbew9MDdui3iCKWco7fsK9sVuZTX2",\
"state": "initialized",\
"tokenAmount": {\
"amount": "656000000",\
"decimals": 8,\
"uiAmount": 6.56,\
"uiAmountString": "6.56"\
}\
},\
"type": "account"\
},\
"program": "spl-token",\
"space": 165\
},\
"executable": false,\
"lamports": 2039280,\
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",\
"rentEpoch": 18446744073709551615,\
"space": 165\
},\
"pubkey": "FSMJ7FwPp3JPUkjFNefTgikTWUsgMJw7t8dvZFP2Ve81"\
}\
]
},
"id": 1
}
通过允许开发者预先筛选 RpcResponse 对象中返回的数据,筛选条件提高了 Solana RPC 中数据检索的效率。诸如 memcmp
和 dataSize
之类的筛选器可以在程序账户数据中进行有针对性的搜索,从而减少了需要处理的无关数据的量。在开发者需要查询大型数据集但只需要该数据的特定子集的情况下,此参数尤其有价值。
使用筛选条件查找包含指定字节的账户的 getProgramAccounts
请求示例:
{
"jsonrpc": "2.0",
"id": 1,
"method": "getProgramAccounts",
"params": [\
"4Nd1mBQtrMJVYVfKf2PJy9NZUZdTAsp7D4xWLs4gDB4T",\
{\
"filters": [\
{\
"dataSize": 17\
},\
{\
"memcmp": {\
"offset": 4,\
"bytes": "3Mc6vR"\
}\
}\
]\
}\
]
}
你可以从以下指南中了解有关筛选程序数据的更多信息:
在使用 Solana 的 JSON-RPC API 时,了解各种错误代码的含义以及如何处理它们也很重要。
开发者应期望处理的各种 RPC 错误代码可以分为三个一般类别:标准 JSON-RPC 错误代码、Solana 错误代码和 RPC 提供程序专门定义的错误代码。
-32768
到 -32000
(包括)的错误代码保留给 JSON-RPC 2.0 规范中预定义的错误。例如:
-32601
:找不到方法(请求的方法不存在)-32602
:无效参数(请求的参数对方法无效)可以在 JSON RPC 规范文档 中找到标准 JSON-RPC 错误代码的列表。
-32000
到 -32099
之间的错误代码子集保留给实现定义的服务器错误。例如:
-32004
:请求的区块在节点上不可用,可能是因为它已从节点的存储中剪除-32005
:Solana 节点当前处于不健康状态,无法正确处理请求可以在 Solana 验证器存储库 中找到 Solana 特定的 JSON-RPC 错误代码的列表。
7700
:无效标头(与请求一起发送的标头无效)7429
:速率限制(已超过特定方法、命名空间等的速率限制)要查找这些代码,你应该查阅特定 RPC 提供程序的文档。我们的文档 包含 Syndica 使用的自定义错误代码。
此外,开发者还应了解 HTTP 和 WebSocket 协议以及潜在的错误,因为 Solana JSON-RPC API 使用这些协议来传输请求和响应数据结构。我们的文档 提供了 Syndica 使用的不同 HTTP 错误代码。
Solana 基金会和 Solana 生态系统中的其他团体提供公共 RPC 端点,这些端点对所有人开放,适用于简单的测试和基本连接。它们受到低速率限制的约束,并且仅提供标准的 RPC 方法集。公共 RPC 端点适用于教育目的和低容量用例,但由于其共享性质,它们经常遇到拥塞和性能问题。
对于生产级应用程序,需要具有可靠 RPC 提供程序的私有 RPC 端点。诸如 Syndica 之类的 RPC 提供程序提供弹性节点架构,该架构可以自动扩展 RPC 节点,并且可以在它们之间对请求进行负载均衡。此架构是专门为 Solana RPC 设计的。
通过 Syndica,开发者还可以访问各种功能以加速开发,包括:
监控和分析:Syndica 提供了一个监控仪表板,其中提供了有关你的 DApp 发出的所有 RPC 调用的见解。你可以搜索、筛选和分析这些调用,以调试和优化性能。
Solana RPC 文档:使用 Solana 的 RPC 方法与区块链交互的官方指南 - https://solana.com/docs/rpc。
JSON-RPC 2.0 规范:定义了 Solana RPC 使用的 JSON-RPC 通信的标准协议 - https://www.jsonrpc.org/specification。
Solana 公共 RPC 端点:列出了可用于访问 Solana 公共集群的可用 RPC 端点 - https://solana.com/docs/core/clusters。
Solana Stack Exchange:一个由社区驱动的问答平台,面向 Solana 开发者和用户 - https://solana.stackexchange.com/。
客户端库: 语言特定的 SDK,用于跨各种编程语言与 Solana 区块链进行交互。
语言 | SDK |
Rust | solana_sdk |
Typescript | @solana/web3.js |
Python | solders |
Java | solanaj |
C++ | solcpp |
Go | solana-go |
Kotlin | solanaKT |
Dart | solana |
正如我们在本指南中所探讨的那样,远程过程调用 (RPC) 不仅仅是 Solana 开发中的一个技术细节,它是连接你的应用程序与 Solana 区块链的关键接口。在你继续 Solana 开发之旅时,我们强烈建议你深入研究 Solana 的官方文档。它是一种宝贵的资源,提供了全面的见解和最佳实践,远远超出了我们在此处介绍的内容。
此外,请与 Solana 开发者社区保持互动。生态系统正在迅速发展,及时了解新的发展、工具和方法至关重要。
尝试并迭代。真正理解 RPC 的功能和局限性的最佳方法是通过实践经验。
–
Syndica 赋能推进 Solana 生态系统的主要企业和架构师。在构建 Web3 云时,我们提供一流的 RPC 节点基础设施、开发者 API、强大的端到端平台以及下一个尖端的 Solana 客户端验证器 Sig,使用 Zig 编写。我们的团队提供专门的支持、可靠性和以用户为中心的导向,以实现与 Solana 的无缝集成,使你能够完全专注于构建你的企业。
立即在 syndica.io 免费开始,并在此处查看我们的文档 here。
- 原文链接: blog.syndica.io/understa...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!