钱包向网页播报什么:chainChanged 与 accountsChanged 事件逐项解释 图 1
钱包向网页播报什么:chainChanged 与 accountsChanged 事件逐项解释 · 图 1

网页上的应用有时会冒出一个从未见过的请求,钱包显示的也不像任何一笔转账。这类弹窗多半不是要发交易,而是钱包把链上或本地发生的某件事转述给页面——它由事件驱动,而不是由你的点击触发。分清谁在说话、说什么,才不会把系统通知误当成操作请求。

通道与请求是两回事

网页和钱包之间的标准接口由 EIP-1193 定义。这个规范把交互分成两类:一类是你或网站主动发起的请求,成功返回结果、失败返回带数字错误码的异常;另一类是钱包主动发出的事件,网站通过 on 方法监听,钱包在状态变化时通知页面。规范明确要求钱包实现四类基本事件:connectdisconnectchainChangedaccountsChanged,另有传递订阅通知等的 message 事件。你在界面上看到的“状态变了”,源头多数是这几路事件。

各路事件的语义并不含糊。chainChanged 在你切换到另一条链时携带十六进制的链标识通知页面;accountsChanged 在你于钱包里换选账户、增删账户时携带当前账户列表;connect 在钱包首次连上某条链、或断链后重新连上时触发并带上链标识;disconnect 表示与所有链断开,其错误码沿用网络断开连接的状态码约定。若你从未点过任何按钮而页面状态自己变了,合理猜测是其中一路事件被触发了——比如你刚在钱包扩展里切了网络。

事件本身不会动资产,但会影响“你接下来签什么”

事件只是通知,不上链、不签名、不花钱。真正的风险藏在事件的下游:网站收到 chainChanged 后会刷新它显示的余额和按钮,收到 accountsChanged 后会把它准备发起的交易改挂到新选中的账户上。最典型的事故场景是:你在钱包里切到另一个账户,页面没弹任何警告,你回头确认弹窗时看到的收款地址、费用显示其实都已经是新账户视角——而你以为还在操作原来那个。处理纪律是把事件当成“重新核对起点”:每次事件之后,凡是要签的东西都从头核对账户、网络、对象、金额四件事。

message 事件则常被用来转达订阅推送,例如基于 eth_subscribe 的新区块、地址事件通知。它也属于“报告”,不属于“请求”。辨认办法很简单:看钱包有没有弹出需要你批准的内容。事件驱动的更新不会要求你批准任何东西;任何要求批准的弹窗,无论页面上先出现过什么提示,本质都是新的请求,按核对流程逐项看。

网站能装出事件吗

页面自己可以伪造一条“看起来像事件”的界面提示——那只是网页文字,不经钱包。判断依据是看钱包本体:正规钱包对账户与链的变化有自己的一面(当前账户标识、当前网络标识),页面说什么不重要,钱包显示的账户和网络才决定签名最终发生在哪。担心网站利用假事件诱导点击,可以把浏览器地址栏、钱包当前账户、钱包当前网络三项同时核对一遍,三项对上再动作。

顺带一提断线场景:disconnect 后页面的行情、余额都会停在旧快照上,此时页面若催你“快点确认”,最稳妥的动作是先在钱包里确认连接恢复、再重新触发业务,而不是在它给出的旧数据上签字。

为什么值得懂一点事件模型

规范允许网站静默监听这些事件,也就是说“账户被换、链被换”这类关键变化在页面上可能没有任何提示,全看网站是否自觉地把事件展示给用户。理解事件模型后,你的核对责任就清晰了:页面沉默不代表状态没变,钱包显示才代表状态真变。养成两秒习惯——签任何东西前先看钱包自己显示的当前账户与当前网络,再对照弹窗内容;对长期挂着不关的去中心化应用标签页尤其如此,它可能在你没注意的几十分钟里经历过多路事件,页面上的“确认”按钮还停留在最初那份草稿上。

本文不构成投资建议;事件机制属安全使用知识,任何要求你在弹窗之外补签内容的引导都应视为危险信号。