摘要:钱包确认页里的 Balance changes 或 Simulate,是发送前的一次预演,不等于已经到账。结合 MetaMask 帮助中心和 ethereum.org 中文文档,看余额变化、Added protection 和 eth_call 各在说什么;标准模拟不保证和链上一致,勾选保护后网络费可能更高。
你在钱包确认页上,有时会看到 Balance changes(余额变化)。有的钱包把这一步写成 Simulate 或模拟。它是发送前的一次预演,用来估计这笔交易可能带来的余额变化,并不等于链上已经成交。站内 授权额度是什么 讲的是 Approve 点下去会发生什么;Max fee per gas 是什么 讲的是费用栏怎么看。本篇只把模拟这一栏看清楚:它预告什么、和真正上链差在哪,以及开启 Added protection(附加保护)时,网络费为什么会变高。
一、帮助中心怎么写,确认页样例里看哪几栏
MetaMask 帮助中心「What are transaction simulations?」 开篇写:当你准备交易时,MetaMask 会尝试预测账户的预计余额变化,让你更好理解即将提交的交易结果。你可能会看到预览,例如会收到多少 ETH,或哪些代币会移动。同一页把交易模拟定义成对这笔交易的一次试运行(test run);这类标准模拟是额外的安全功能,并且默认开启。本场打开的是英文页,界面文案以你当时的语言设置为准。
同一页里放了一张确认页样例,标题是 Transaction request。本场打开时可以看到这些字段(这些是帮助中心样例上的数字和地址,不是你钱包里的报价,会随页面改版和实际交易而变):
- Balance changes / You receive:+ 0.28 ETH,下方写着 $600.32。
- Added protection:标记为 OPTIONAL,样例里勾选了。说明写的是你正在与未知地址交互,这有助于防止恶意交易。
- Network:Ethereum;Request from:newdapp121.xyz;Interacting with:0x23421...3Y812。
- Network fee:$8.56,并注明 Includes $6.21 for added protection;Speed 为 Market < 30 sec。
先抓住两件事。这一栏的余额变化是预演结果,还没上链;样例里的 0.28 ETH 和 $8.56 只用来对照字段,不能拿去当自己的到账金额或手续费。费用栏怎么看,见 Max fee per gas 是什么,这里不重写。

二、要先打开基础功能,链上模拟也只在部分网络
同一页的 Tip 写:要让这个功能生效,须在 Settings > Privacy 里开启 Basic Functionality(基础功能)。如果你是用 Google、Apple 或 Telegram 注册的,这项会一直开着,并且关不掉。页里接着说明,目前几乎所有交易模拟都只在链下进行;只在链下模拟时,可能碰上更复杂的钓鱼手法(该页称为 red-pill attacks)。帮助中心的写法是:要想让模拟真正有用,必须在链上强制执行(enforced onchain)。扩展里的 MetaMask 智能账户默认支持这种附加保护。文档改写后会变,以你当时打开的页面为准。
「Networks supported for onchain simulations」这一框,本场打开时列出的是 Ethereum、Optimism、BNB、Polygon、Monad、HyperEVM、Sei、Tempo、MegaETH、Robinhood、Arc、Base、Arbitrum、Avalanche 和 Linea。这是帮助中心当天的名单,之后增删都以页面为准。不在名单上的网络,确认页里可能只有普通的链下预演,或暂时看不到这一栏。

三、普通模拟对不上时,Added protection 会怎样
帮助中心在「Added protection: how enforced simulations keep you safe」一节写:标准的链下模拟有帮助,但前提是合约在模拟里和链上执行时表现一样;实际情况并不总是如此。开启强制模拟后,交易会在签名前先模拟,相同条件会在链上执行时被强制核对;如果真实执行和模拟不一致,交易会自动回滚。该页写,此时你在确认页上看到的内容,才能保证和链上发生的事一致;不一致就不会成交,资金受到保护,你只需支付网络费。
「Why does gas increase when 'Added protection' is enabled?」一节写:在确认页勾选 Added protection 后,网络费可能会更高,这是预期现象,因为强制模拟会增加一个链上核对步骤,从而使用更多 Gas。该页的 Note 写:MetaMask 不会因开启此功能另行收费,你支付的只是交易要上链的网络费。紧接着「When should I use 'Added protection'?」写得很直白:请记住,标准模拟不保证和链上结果一致,只有强制模拟,也就是 Added protection,才能做到这一点。该页建议在这几种情况下格外小心并勾选:和未知的新 dapp 交互、签署复杂交易、以及移动较大金额。
「What kind of transactions are supported?」写:目前交易模拟可用于合约交互,你能看到涉及 ERC-20 代币,以及转入转出账户的 ERC-721、ERC-1155 NFT 的余额变化。下面的 Note 还写:此功能会使用 MetaMask 的中心化服务器来模拟交易并获取必要数据。如果你是用助记词(该页写 SRP)注册的,可以在 Settings > Privacy 里关掉 Basic Functionality;关掉后,Added protection 和其他重要功能也会一起停用。用 Google、Apple 或 Telegram 注册的,Basic Functionality 始终开启且关不掉。Approve 无限额要不要点,见 授权额度是什么,这里不展开。

四、官方文档里的模拟:不创建链上交易,也不消耗 Gas
钱包确认页里的预演,底层常常会走到节点提供的只读调用。 ethereum.org 中文「与智能合约交互」 的「模拟交易」一节写:在发送交易之前,你可以模拟它,检查会不会成功,并查看返回值,这一步不必消耗 Gas。这对于及早发现错误和预览结果很有用。该页还写,大多数客户端库通过 eth_call 支持此功能,并给出 Viem 里 simulateContract 的示例(函数名是 swap)。文档改写后会变,以你当时打开的页面为准。

同一站点的 JSON-RPC 文档 eth_call 把这种方法写得更具体:立即执行一个新的消息调用,而无需在区块链上创建交易。通常用于执行只读的智能合约函数,例如 ERC-20 合约的 balanceOf。参数说明里写:eth_call 消耗零 Gas,但某些执行可能需要提供 gas 参数。返回值是执行合约的返回值。文档里的 curl 示例结果是 0x,这只是该页的写法示例,不代表你这次调用的返回。它和真正发出去、已经出现哈希的交易不是同一步。发出去之后要看状态和确认数,见 浏览器里 Success 和 Pending 差在哪。

五、发送前先对这几项,预演通过也不等于已经到账
以后在确认页看到 Balance changes 或 Simulate,可以按下面对一下。帮助中心样例里的 0.28 ETH、$8.56 和 $6.21 不要直接套用,以你当时打开的官方说明和自己钱包里的数字为准。
- 先分清这是预演还是已经广播。确认页上的余额变化还没上链;有了交易哈希,再到区块浏览器里看状态。
- 对一下 You receive / 你将支付,以及代币名字和数量。数量明显不对、要付出的代币你没准备过,就先取消。
- 看 Request from 和 Interacting with 是不是你刚打开的那个站点、那份合约。样例里出现了 newdapp121.xyz 和未知地址提示,这类来源要多停一步。
- 如果是授权类操作,先核对额度。无限额 Approve 的风险,见 授权额度是什么。
- 记住帮助中心那句话:标准模拟不保证和链上结果一致。和陌生应用打交道、或金额较大时,再看一眼 Added protection 是否勾选,以及网络费是否因此变高。
- 模拟本身按官方文档可以不消耗 Gas;真要点 Confirm 发出去,仍要留一点 ETH 付网络费。原因见 为什么钱包要留一点原生币。
六、这几栏怎么对照
| 你要看的字段 | 它在说什么 | 新手先做什么 |
|---|---|---|
| Balance changes / Simulate | 发送前的预演,估计这笔交易可能带来的余额变化 | 对一下收入和支出的代币与数量,不要把它当成已经到账 |
| Added protection | 把模拟条件放到链上再核对一遍,对不上就回滚 | 看是不是勾选;勾选后网络费可能更高,帮助中心写这是预期现象 |
| Network fee 里的附加保护费用 | 样例里写 Includes $6.21 for added protection,数字会变 | 和未勾选时的费用对比一下,确认自己愿意为这次核对多付这一截 |
| Basic Functionality | 帮助中心写,须在 Settings > Privacy 开启,模拟才能工作 | 看不到预演时,先到隐私设置里核对此项;用第三方账号注册的可能关不掉 |
| eth_call | 节点上立即执行消息调用,不在链上创建交易,文档写消耗零 Gas | 用来理解钱包预演的底层做法;真发出去仍要看交易哈希和状态 |
帮助中心把交易模拟写成对这笔交易的一次试运行。确认页上的 +0.28 ETH 只是该页样例,不能当成自己已经收到的金额。
帮助中心写,标准模拟不保证和链上一致。只有强制模拟,也就是 Added protection,才会在对不上时让交易回滚,并且你仍要付网络费。
同一页写这是预期现象,因为多了链上核对。样例里的网络费是 $8.56,其中 $6.21 来自附加保护;MetaMask 不会因此另行收费。换一笔交易,数字会不一样。
官方文档里的 eth_call 不创建链上交易,也不消耗 Gas。你点 Confirm 广播之后,状态要到区块浏览器里核对。
浏览官方文档和钱包帮助中心本身不收费。以后若要在链上小额试一笔,需要留一点 ETH 付 Gas。可在 币安 或 欧易 准备。自托管钱包可以用欧易 Web3(邀请码 CHENGXULVTU)。