公共RPC端点是免费的,但存在重大生产风险:速率限制、数据不一致、安全漏洞以及无可用性保证。对于关键任务应用,请使用具有专用端点、身份验证和SLA的托管RPC提供商。
什么是公共RPC端点,为什么它们看起来有吸引力?
公共RPC端点是一种JSON-RPC或WebSocket端点,任何人都可以无需身份验证即可访问。例如,Solana文档中列出的端点以及各个项目提供的公共端点。它们之所以有吸引力,是因为它们是免费的,无需注册,并且易于测试。
然而,“免费”是有代价的。公共端点是共享基础设施,通常由社区成员或项目作为礼提供。它们并非为生产工作负载而设计。风险从速率限制到数据不一致,直接影响dApp的可靠性和用户信任。
要了解问题的规模,请考虑一个公共端点可能同时服务数千名并发用户,每个用户都有不同的使用模式。这种共享特性意味着一个用户的繁重负载会降低其他所有人的体验。此外,公共端点通常托管在适度的基础设施上,没有高可用性所需的冗余。它们可能运行在单个节点或小集群上,如果节点发生故障或需要维护,则容易发生中断。
另一个微妙的问题是,公共端点通常由项目或社区成员作为礼提供。这意味着它们可以随时被移除,而无需通知。例如,一个项目可能在重大升级后弃用其公共端点,使依赖它的开发人员争相寻找替代方案。这种缺乏稳定性对于任何需要持续访问区块链的应用来说都是一个关键风险。
- 没有身份验证意味着没有责任和服务级别协议(SLA)。
- 共享资源导致不可预测的性能和可用性。
- 公共端点可能在没有通知的情况下被弃用或关闭。
- 它们通常托管在有限的基础设施上,没有冗余,增加了停机风险。
速率限制:最直接的风险
公共RPC端点实施严格的速率限制以保护其基础设施免受滥用。这些限制通常没有文档记录,并且可能随时更改。例如,一个公共Solana端点可能只允许每个IP每秒几个请求,这对于任何具有真实用户流量的dApp来说都是不够的。
要自己观察速率限制,您可以使用curl发送一批请求并测量响应时间和错误代码。这是一个简单的测试:
for i in {1..20}; do curl -s -o /dev/null -w "%{http_code} %{time_total}\n" -X POST https://api.mainnet-beta.solana.com -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1,"method":"getHealth"}'; done数据一致性:多服务器的隐藏危险
公共RPC端点通常位于负载均衡器后面,将请求路由到多个后端节点。这些节点可能无法完美同步,尤其是在像Solana这样具有快速最终性的网络上。因此,根据处理请求的节点,您可能会对同一查询得到不同的响应。
例如,查询账户的getBalance可能会返回不同的值,如果节点处于不同的区块高度。这种不一致会破坏您的应用程序逻辑,特别是如果您依赖精确的账户状态进行交易。
要测试一致性,您可以多次发送相同的请求并比较结果。使用脚本查询公共端点和专用端点(例如来自OnFinality的端点),并比较result字段。您很可能会在公共端点上看到差异。
这种不一致的根本原因是由于网络传播延迟,节点可能处于不同的区块高度。虽然大多数网络都有机制确保最终一致性,但不一致的时间窗口可能很大,尤其是在高吞吐量的网络上。对于需要读取最新状态的应用,这可能导致错误,例如尝试基于过时数据签署交易。
此外,某些公共端点可能配置为从快照或滞后节点提供服务以减少负载,这可能会引入更大的差异。这对于需要基于当前账户状态构建交易的应用尤其危险,因为它们可能最终得到无效交易。
curl -s -X POST https://api.mainnet-beta.solana.com -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1,"method":"getSlot"}' && echo "" && curl -s -X POST https://solana-rpc.publicnode.com -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","id":1,"method":"getSlot"}'安全与身份验证:为什么无身份验证是风险
公共RPC端点不需要身份验证,这意味着任何人都可以使用它们。这为多种安全风险敞开了大门:
首先,如果您使用纯HTTP(尽管大多数公共端点使用HTTPS),您的请求不会端到端加密。更重要的是,没有身份验证,如果端点被入侵,您无法保护您的数据在传输过程中不被拦截或篡改。
其次,恶意行为者可以使用公共端点发起攻击,例如发送垃圾交易或利用漏洞。如果您的dApp依赖公共端点,您将受制于端点的安全态势。受感染的公共端点可能返回恶意数据,导致错误的交易签名或资金损失。
第三,公共端点经常成为攻击者的目标,因为它们是开放的且没有访问控制。它们可能被用来对底层节点发起拒绝服务(DoS)攻击,这可能导致端点对所有人不可用。这是公共基础设施的常见问题。
托管提供商通过提供带有API密钥的认证端点来缓解这些风险。例如,OnFinality的RPC助手允许您生成API密钥并限制访问。这确保只有您的应用程序可以使用该端点,并且如果密钥泄露,您可以撤销它们。
此外,托管提供商通常实施额外的安全措施,如IP白名单、请求签名和传输加密。这些功能对于保护敏感数据和确保请求的完整性至关重要。
可靠性与正常运行时间:无保证
公共RPC端点没有正常运行时间保证。它们可能因维护而停机,对所有人进行速率限制,或者干脆消失。这对于需要24/7可用性的生产应用来说是不可接受的。
要衡量可靠性,您可以设置一个简单的监控脚本,每分钟ping端点并记录响应时间和状态。在一周内,您很可能会看到高延迟或停机时段。要获得更系统的方法,请参阅我们的监控RPC端点指南。
相比之下,商业提供商提供具有正常运行时间承诺的SLA(例如99.9%或更高)。例如,OnFinality提供网络特定端点,具有冗余基础设施和自动故障转移。
缺乏保证也意味着公共端点可能会在没有事先通知的情况下进行维护窗口。例如,节点操作员可能需要升级软件并使端点离线几分钟。在此期间,您的dApp将无法访问区块链,导致用户停机。
此外,公共端点通常托管在单个服务器或小集群上,这意味着它们容易受到硬件故障、网络问题甚至断电的影响。没有冗余,任何故障都可能导致长时间停机。
何时使用公共端点与专用端点
公共端点适用于开发、测试和低流量原型。如果您正在构建黑客松项目或简单脚本,它们没问题。然而,对于任何生产dApp,您应该使用来自托管提供商的专用RPC端点。
这是一个决策清单:
- 如果您的dApp处理真实用户资金,请使用专用端点。
- 如果您期望每秒超过几个请求,请使用专用端点。
- 如果您需要一致的数据来构建交易,请使用专用端点。
- 如果您需要身份验证和访问控制,请使用专用端点。
- 如果您需要SLA和支持,请使用专用端点。
要进行更深入的比较,请阅读我们的文章如何选择RPC提供商和Web3项目的最佳RPC提供商。
如何从公共端点迁移到专用端点
迁移很简单。首先,注册像OnFinality这样的托管RPC服务。然后,为您的目标网络(例如Solana或Ethereum)创建一个端点。您将获得一个带有API密钥的URL。
更新您的应用程序配置以使用新端点。例如,在使用@solana/web3.js的JavaScript dApp中,您将更改Connection URL:
const connection = new Connection('https://solana-mainnet.onfinality.io/rpc?apikey=YOUR_API_KEY');权衡:成本与可靠性
主要的权衡是成本。专用端点不是免费的,但与停机或数据不一致的成本相比,它们通常便宜。例如,OnFinality提供灵活定价,具有用于开发的免费层和用于生产的负担得起的付费计划。
考虑公共端点故障的成本:如果您的dApp停机一小时,您可能会失去用户信任、收入,甚至面临安全事件。托管端点的成本与之相比微不足道。
要量化潜在影响,请考虑您的dApp每小时收入。如果您有1,000名活跃用户,每人每小时产生0.10美元收入,那么一小时的停机成本为100美元。托管RPC计划可能每月花费50美元,因此即使每月只有一小时的停机时间也足以证明费用的合理性。
此外,专用端点的成本不仅关乎正常运行时间;还包括一致数据、安全性和支持的价值。这些因素可以节省您的开发时间并防止代价高昂的错误。
总之,公共RPC端点是一个有风险的捷径。对于生产环境,投资于可靠、安全和一致的RPC基础设施。从探索OnFinality API服务和网络选项开始,为您的项目找到合适的方案。