如何安全地切换 RPC 端点

2026-09-03

如何安全地切换 RPC 端点

你的钱包并不保存一份链的副本。它去问一个节点,而它问的那个地址,就是躺在网络设置里的那个端点。改掉这个地址只要几秒钟,却会换掉那个回答你关于自己余额的每一个问题的人。所以这件事值得刻意去做,而不是顺手就做。

如何安全地切换 RPC 端点:要点一览

网络设置里的那个端点是什么

远程过程调用端点,是你的钱包把问题发过去的一个网址。这个地址上有没有资金、现在一笔交易要花多少、这一笔被打包了没有、请把这个已签名的对象转发给网络。端点作答,而它的回答就是你屏幕上看到的东西。

那个地址背后的机器是一个 RPC 节点,它同时对外暴露一个公开接口,好让钱包与应用不必自己跑一个。下文把这项设置简称为端点。

这套安排会引出两件方向相反的事。端点不是链的一部分,所以换掉它,不会改变你的密钥、你的地址,也不会改变账上记着的余额。端点又是你看见链的唯一凭借,所以换掉它,会改变你被展示的一切。

你为什么会去换一个

最寻常的理由,是现在这个已经答不好了。一个宕机的、在对你限流的、或者落后于链头的节点,不会把这些宣告出来。它给出的是过期的余额、一笔已确认却仍显示为待处理的交易,或者一次在连接上就失败的广播 —— 而你的账户本身毫无问题。

第二个理由是覆盖面。钱包内置的网络清单很短,清单之外的链得手工添加,端点也一并添加。添加网络与添加端点,是在同一个对话框里完成的同一个动作。

第三个理由是隐私。你发出的每一个请求都经过同一个运营方,于是这个运营方能把你的多个地址彼此关联、也能与一个 IP 地址关联。换到另一个提供方,是把这种可见性挪个位置,而不是把它消掉,所以要把这个选择当成挑选谁在看,而不是当成隐身。

端点能改变什么,不能改变什么

分界线是签名。你的钱包在本地构造交易,并用一把从不离开设备的密钥签名,所以端点收到的是一个成品对象 —— 它一改就失效。它可以拒绝转发、可以拖延、可以转发到别处,但它改不了里面的金额和收款方。

它能做的,是塑造你据以决策的输入。余额、代币清单、手续费估算与确认状态,全都经端点抵达,而一个怀有恶意的端点,尽可以报出干脆编出来的数字。真正的危险在这里:不是密钥被偷,而是决策建立在一幅假的图景上。

你正在看的东西 恶意端点能不能伪造 靠什么判定
余额与代币清单 在第二个来源上读同一个地址
手续费估算 签名前核对钱包显示的费用
交易历史 一个自己跑基础设施的区块浏览器
确认状态 换一个端点重查一遍
你签下的那份内容 不能 签名覆盖了整个载荷
你的私钥 不能 它从不被发往任何地方

由此得到的实际结论是:一个端点值得你用审视一个要连钱包的网站那样去审视。从客服聊天里粘来的、或由搜索广告送到你面前的地址,与一个假冒加密网站属于同一类东西,理由也一样。

链 ID 是抓住错网络的那道检查

每一条网络都带着一个标识符,它就活在被签名的交易内部。EIP-155 引入它,是为了阻止一笔为某条链签好的交易在另一条链上仍然有效;做法是把链 ID 折进参与哈希与签名的数据里。在一个链 ID 下做出的签名,在使用另一个链 ID 的链上毫无意义。

这给了你一道不必信任任何人的检查。eth_chainId 方法返回的是用于签署防重放交易的链 ID,所以你可以直接问端点:它认为自己在服务哪条网络。如果这个答案与你钱包为该网络条目存下的链 ID 不一致,两者说的就不是同一条链。

EIP-3085,那份用程序方式添加链的接口提案,把同一道比对写进了钱包。它要求:当声明的链 ID 与所提供端点报出的不一致时,请求必须被拒绝;并且写明,这些端点不能被假定为诚实的、正确的,甚至不能假定它们指向同一条链。在签名这一侧,它的指令还要更窄:只使用钱包已经持有的链 ID,绝不使用从端点收来的那一个。

在把任何东西路由过去之前,先检查这个端点

四道检查,按代价从低到高。先确认链 ID,因为这是唯一一个不存在程度问题的答案。然后拿它报出的区块高度,与一个独立来源对一对。一个远远落后于链头的节点不是恶意的,它只是过期,而过期已经足以让它告诉你的其余一切都是错的。

接着比一件你已经知道的事。打开一个你能在别处核实余额的地址,看两边的视图是否一致。此刻出现出入,就是叫你在签任何东西之前停下 —— 尽管它还没告诉你原因是延迟还是恶意。

最后,当这个端点对你是新的、而金额对你不是新的,就先发一笔小额交易,看着它确认。要点不在于风险有多小,而在于一次完整的往返会同时演练广播与回读 —— 这正是一个坏端点会分别弄坏的那两半。

手工添加一个,而不弄坏钱包

要添加,不要覆盖。凡钱包允许你为同一条链保留多个条目,把那个原本能用的留着,就意味着一次糟糕的切换只需选回上一个条目即可撤销,而不必去重打一个你已经没有了的网址。给每个条目起一个说明由谁运营的名字,好让选择器读起来是一份运营方名单,而不是一份彼此相同的链名清单。

条目的其余部分,从网络自己的文档里填,不要从把端点交给你的那个人那里填。链 ID、币种符号和区块浏览器,都属于钱包之后会显示的东西;一个端点填对、符号填错的条目,会悄悄给你看的每一笔金额贴错标签。

然后在保存之后检查这个条目,而不是在保存之前。对话框校验的是你打进去的字;真正要紧的是这个已保存的条目做了什么。切换到它,让余额加载完,确认它们与上一个条目显示的一致。一个在你自己余额这件事上与前任不一致的网络条目,正在告诉你一些事情,而知道它的时机是在你签名之前。

什么时候换端点不是解法

新端点改变的是你能看见什么,所以它修的是由信息缺失或过期造成的问题。它够不到链上已经发生的事。一笔交易一旦被广播,它就待在每一个收到它的节点的内存池里,而换掉你钱包对话的那个节点,并不能把它召回。

同样的界限也适用于链已经记录下来的失败。一笔执行了又被回滚的交易是 reverted,这个结果被写进一份收据,任何诚实的端点报出来都一样。从两个互相独立的端点都看到它,意味着答案不是再去找第三个。

夹在这两种情形之间的,是另一类换端点确实能清掉的报错,因为它来自一份缓存的视图,而不是来自链。一个在换网络或重装之后报 Nonce 太高的钱包,是在拿它自己的计数与某个端点告诉它的东西比对;通过一个健康的节点重新连上,能让它从一个足够新的来源重新读一遍这个计数。

小结

端点不是链的一部分,也不是你钱包密钥安全的一部分,但它就是你能看见的全部;而一个建立在编造数字上的决策,代价与一个密钥被偷之后的决策一样大。切换端点是针对过期或无响应网络的常规修复,而让它安全的纪律很小:知道你要添加的这个由谁运营、确认链 ID、并且保留那个原本就能用的条目。

链 ID 那道检查是四道里最便宜的,也是该最先跑的一道。问端点它服务的是哪条链,再与你钱包已经持有的比一比 —— 这一次比对同时抓住两件事:添加错网络这个诚实的失误,以及一个想让你相信自己身在别处的端点这个不诚实的情形。想系统学习更多加密基础知识,可以关注 Bitbase(币贝)学院的后续内容。

相关阅读

币贝上与本主题相关的其他文章:

- 最高交易费超限:钱包这条警告到底在说什么

- RPC 速率限制超出:原因与应对

- 什么是加密货币二维码?

- fill or kill、immediate or cancel 与 all or none 详解

- 比特币与股票、黄金或风险偏好存在相关性吗?

风险披露:本文为 Bitbase(币贝)学院的科普内容,仅供教育与信息参考,不构成任何投资、交易、税务或财务建议。加密资产波动剧烈,请自行评估风险。本文撰写于 2026 年 9 月,请以官方最新信息为准。

参考资料

[1] Ethereum Improvement Proposals,EIP-155: Simple replay attack protection,状态 Final eips.ethereum.org

[2] Ethereum Improvement Proposals,EIP-3085: wallet_addEthereumChain RPC Method,状态 Stagnant eips.ethereum.org

[3] ethereum.org 开发者文档,JSON-RPC API,eth_chainId 方法 ethereum.org

相关推荐

更多推荐