Ethereum / User security / Lesson 20.03

你没有把钱转走,资产为什么还是会消失?

因为“控制资产”不只有转账这一条路。泄露私钥会交出身份控制权, 钓鱼界面会歪曲你正在批准什么,授权会把未来转移权交给第三方, 而交易排序会改变你最终成交的价格

  • 正式目录:用户风险
  • 约 60 分钟
  • 4 个本地实验
  • 6 题自检
01 / SIGNATURE IS AUTHORITY

链只验证授权是否有效,不理解你的真实意图。“我没点转账”不能推翻一份有效授权。

02 / PERMISSION OUTLIVES UI

断开网站不等于撤销链上权限。Allowance、operator 与 Permit 各有自己的有效边界。

03 / QUOTE IS NOT EXECUTION

报价只是某一时刻的状态快照。价格冲击、滑点容忍和 MEV 是三个不同概念。

01 / THREAT MODEL

先问“哪一层失守”,再问“用了什么钱包”

同一个损失结果,可能来自四条完全不同的控制路径

以太坊不会替你判断页面是否诚实、授权是否合算、成交是否公平。它只按协议规则验证签名、 执行代码并确定状态。因此,用户安全的第一步不是记住某个“防骗技巧”,而是建立可复用的威胁模型。

LAB 01 / AUTHORIZATION SURFACE

这件事究竟碰到了哪一层?

选择一种事件,观察它改变的控制权、持续时间和第一响应。

主要层级 界面层 / 观察面
链上权力变化 没有直接变化
持续时间 到断开连接;链上无记录

第一响应:查看网站请求了哪些后续操作。连接会暴露地址和允许请求弹窗,但本身不是转账或代币授权。

静态阅读结论:只连接不会自动授予代币转移权;助记词泄露影响整个派生账户树; 错误授权持续到额度耗尽、被撤销或协议定义的终点;夹击影响成交,不等于私钥泄露。

02 / KEYS & ACCOUNTS

钱包不是账户,助记词也不在链上

把恢复材料、签名密钥、地址和界面拆开,安全判断才不会混乱

对普通外部账户(EOA)而言,资产并不“装在钱包 App 里”。链上状态把余额与一个地址关联, 网络用数字签名判断某项操作是否由该地址的控制者授权。[1]

四个对象,四种边界

助记词 / 恢复短语
便于人备份的恢复材料,通常能确定性派生多个私钥。泄露一组助记词,不只是泄露当前屏幕上的一个地址。
私钥
为某个账户生成有效签名的秘密数值。知道它的人,无需你的手机、密码或指纹即可在别处重建控制权。
地址 / 账户
链上状态的公开索引。EOA 由私钥控制;合约账户由代码规则控制,可能要求多签、限额或其他验证逻辑。
钱包
管理密钥、读取链上状态、构造请求并展示签名内容的工具。换钱包软件不会自动换账户;导入同一恢复材料仍是同一控制根。

私钥和助记词不应该输入网页、表单、客服对话或“同步验证”窗口。合法应用只需要你在钱包中批准请求, 不需要读取恢复短语。钱包与账户的基础关系可参照 Ethereum.org 的 钱包说明安全指南[2]

03 / WHAT ARE YOU SIGNING?

“弹出了钱包”不是一种操作

连接、交易、普通消息、结构化消息、Approve 和 Permit 的后果完全不同

每次确认前都先回答五个问题:在哪条链、给谁、调用什么、范围多大、何时失效。 如果钱包无法把这些字段清楚显示出来,就把“不理解”视为风险信号,而不是流程障碍。

动作 立即上链 / 付 gas 直接效果 真正要核对
连接账户 向站点暴露所选地址,并允许它继续提出请求 域名、所选地址;它不是代币授权
发送交易 执行 to / value / data 指定的链上调用 链、接收方、ETH 数量、方法、参数、模拟变化
普通消息签名 签名时否 产生可验证证明;服务或合约可能据此执行后续动作 原文、域、用途、nonce、过期时间;避免不透明哈希
EIP-712 结构化签名 签名时否 对带类型字段与域分隔的数据签名 chainIdverifyingContract、主体、金额、deadline
ERC-20 approve 设置某代币合约内 owner → spender 的可用额度 代币合约、spender、金额;不是“给网站连接权限”
ERC-2612 permit 签名时否 签署一个可由别人提交的 ERC-20 allowance 变更 owner、spender、value、nonce、deadline 与验证合约

“不花 gas”只说明签名动作本身没有广播交易,不代表签名没有经济权力。EIP-712 改善了结构化展示与域绑定,但不会判断接收方是否值得信任。[8]

CHAIN COUNTERPARTY METHOD SCOPE EXPIRY

04 / PHISHING

钓鱼不是一张假网页,而是一条授权流水线

诱饵负责让你开始,界面负责让你误解,签名负责把误解变成可执行权力

最常见的六个误解

“网址看起来一样”

相似字符、子域名和广告位都能制造熟悉感。书签或项目公开渠道比肉眼猜域名可靠。

“没有 gas,所以无害”

Permit 与其他离链授权在签名时不付 gas,提交者可以稍后替你广播。

“硬件钱包会拦住骗局”

硬件设备保护密钥不被复制,却仍会签署你明确确认的恶意内容。

“Disconnect 就撤销了”

断开只移除站点与钱包会话;链上的 allowance 和 operator 不会因此改变。

“模拟显示绿色就绝对安全”

模拟依赖当时状态、解码能力与调用路径;升级、延迟提交或条件分支都可能改变结果。

“只批了一个 NFT”

setApprovalForAll 通常覆盖该合约中 owner 的全部 NFT,而不是当前页面展示的一件。

LAB 02 / SCENARIO DIAGNOSIS

读提示,不读按钮文案

按钮可以写“登录”,真正的权力在签名字段里。

情景 A · “无 gas 领取空投” 高风险

钱包显示 Permit:spender 为陌生地址,value 为最大整数,deadline 在一年后;页面按钮写着“Claim”。

真实动作
签署可被提交的 ERC-20 无限额度授权
关键证据
spender、value、deadline 与页面叙述不匹配
正确处理
拒绝签名,关闭页面,从项目官方渠道重新核对域名

静态判断法:先忽略“Claim / Verify / Login”等前端文案,只读钱包中的方法、接收方、金额、 NFT operator、nonce 与截止时间;任何无法解释的字段都足以暂停。

05 / ALLOWANCE & OPERATORS

Approve 不搬钱,它铺了一条以后可以搬钱的路

所有权没变,不等于控制面没变

ERC-20 的 approve(spender, value) 写入额度;之后 spender 可通过 transferFrom(owner, recipient, amount) 在额度与余额允许的范围内转移代币。 这就是“没有再次点转账,资产仍然消失”的典型机制。[4]

ERC-20、ERC-721 与 ERC-1155 的授权半径

机制 范围 通常如何结束 最容易误读的点
ERC-20 allowance 某代币合约、某 owner、某 spender、一个数量 额度花完、owner 重设,或实现中的特殊规则 余额以后增加,未撤销的无限额度也可能覆盖新增余额
ERC-721 单件 approval 某一 tokenId 转移、重新授权或清除 与全局 operator 授权不是一回事
ERC-721 / 1155 operator 某 NFT 合约下 owner 的全部资产 setApprovalForAll(operator, false) 页面展示一件,不代表权限只覆盖一件
ERC-2612 Permit 用签名设置 ERC-20 allowance nonce 防重放、deadline 过期;已建立额度仍需另行重设 “签名没上链”不等于攻击者不能替你提交

LAB 03 / BLAST RADIUS

有限额度与无限额度,爆炸半径差多少?

模型只计算当前单一 ERC-20 余额可被触达的上限。

选择授权方式
Allowance250 token
当前可触达上限250 token
占当前余额2.50%

有限额度把当前单一代币的最大可触达量限制在 250 token;完成后仍应检查剩余额度。

有限授权上限约为 min(余额, 剩余额度)
无限授权对当前余额通常是 100%,未来进入该地址的同代币也可能继续暴露

简化边界:模型不代表实际损失承诺,不计恶意代币的非标准行为、多个 token 合约、 NFT operator、代币价格变化或 spender 自身的权限控制。

06 / MEV

你签的是交易,别人竞争的是它的位置

最大可提取价值来自包含、排除或重排交易的能力

MEV(Maximal Extractable Value,最大可提取价值)是区块生产者在标准区块奖励和 gas 之外, 通过选择交易是否进入区块以及如何排序所能提取的价值;更广义地,搜索者、构建者与提议者共同参与这条供应链。 [3]

ARBITRAGE

套利

在不同市场间纠正价差。它可能改善价格一致性,但竞争会消耗区块空间并产生外部性。

LIQUIDATION

清算

偿还低抵押头寸的债务并获得激励。它帮助借贷协议维持偿付能力,也会引发排序竞争。

SANDWICH

夹子交易(夹击)

攻击者先做与用户同方向的交易挤动池价,用户以更差价格成交,再做反方向交易;价值直接来自用户允许的执行空间。

“公开 mempool”是常见路径,不是所有交易的唯一传播方式。私有提交、受保护 RPC 或意图系统可能减少公开暴露, 但会引入对中继、构建者、执行承诺和失败处理的新信任假设。Flashbots Protect 明确提醒: 把交易发送给 builder,就在信任其不抢跑也不泄露;fast 模式还会把交易发给全部注册 builder。 在钱包确认前切换 RPC,也可能触发向公共 mempool 重发。私有提交不是绝对隐私或必然入块。 [13]

07 / EXECUTION QUALITY

价格冲击、滑点和 MEV,不是三个同义词

先分清机制,才能选择正确的保护参数

PRICE IMPACT

价格冲击

你的交易沿 AMM 曲线消耗流动性,自身就会改变边际价格。交易越大、池越浅,冲击通常越大。

SLIPPAGE TOLERANCE

滑点容忍

你给交易设置的执行边界,例如最低接收量。它是许可上限,不是系统承诺“只会损失这么多”。

MEV

排序提取

第三方利用可见意图和排序权改变你的前置状态。夹击可把成交推向你允许的最低边界。

恒定乘积池: x · y = k
含手续费的精确输入输出: amountOut = y · (amountIn · 0.997) / (x + amountIn · 0.997)

LAB 04 / SANDWICH SIMULATION

在恒定乘积池里,看见夹击怎样吃掉执行空间

固定初始池:1,000 ETH / 2,000,000 USDC;手续费 0.30%。

没有夹击的报价 39,100.34 USDC 自身曲线冲击(不含手续费):1.96%
最低接收量 38,513.83 USDC 由报价 × (1 − 滑点容忍) 得出
被抢先后的实际输出 38,564.67 USDC 相对报价少得 535.67 USDC
攻击者往返结果 +0.2361 ETH 已计池手续费;未计 gas、构建者付款与失败风险

该夹击后的输出仍高于最低接收量,因此在这个简化模型中用户交易会成交。

重要简化:这里只模拟单池、单区块、确定顺序、恒定乘积公式和固定 0.30% 手续费; 不寻找攻击者最优规模,不计集中流动性、其他交易、gas、优先费、构建者付款、竞争、价格预言机、 代币税或私有订单流。结果用于理解机制,不能用于交易决策。

保护不是把滑点调到零

过宽的滑点给夹击留下空间;过窄则可能因正常价格移动或抢跑而频繁回滚并浪费 gas。 更稳健的做法是减小单笔规模、选择更深流动性、检查价格冲击、设置合理的最低接收量, 并在理解信任边界后使用具备 MEV 保护的提交路径。任何“绝不被夹”的承诺都需要审查其执行与失败条件。

08 / INCIDENT RESPONSE

先识别事件,再争分夺秒

撤销授权修不好泄露的私钥,换钱包 App 也修不好链上的 operator

事件发生后最危险的动作,是用一个熟悉的按钮处理所有问题。先记录哪种材料被泄露、哪种操作已签、 是否已上链、影响哪些合约与地址,再选择响应路径。

观察到的事件 先假设什么 优先动作 不要误以为
只连接可疑站点,未签名也未发交易 站点看到了公开地址并能继续提出请求,但通常尚无链上花费权 断开站点或 WalletConnect 会话;检查是否有待处理请求;停止继续交互 仅凭连接就已经把私钥或全部代币交给站点
助记词 / 私钥已泄露 相关派生账户的签名根已失守 在干净设备上生成全新恢复材料;把剩余资产转到新地址;逐链核查 改钱包密码、断开网站或撤销单个授权能恢复旧地址安全
恶意转账已确认 状态变化通常不可逆 保存交易哈希与页面证据;保护其他账户;向相关平台和执法/合规渠道报告 “取消交易”能撤销已最终确认的转账
恶意 ERC-20 allowance 已建立 spender 可能随时调用 transferFrom 用可信界面或直接合约调用将额度设为 0;有竞速风险时优先转移高价值资产 Disconnect 会改变 allowance
恶意 NFT operator 已建立 该集合中全部资产可能可转移 调用 setApprovalForAll(operator, false);检查同地址其他集合 只需撤销页面上显示的那一枚 NFT
Permit 已签但未见上链 签名可能在 deadline 前仍可被提交 核对 nonce / deadline 与具体实现;使用协议支持的失效机制;无法确认时优先迁移相关代币 普通 approve(0) 必然使尚未提交的 Permit 失效
怀疑设备或剪贴板被控 后续显示与地址输入都不可信 停止签名;在干净设备生成新控制根;通过独立渠道核对收款地址 卸载一个插件就足以证明环境已干净
一次交换疑似被夹击 执行质量问题,不自动等于密钥失守 比较前后交易与最低接收量;缩小规模、收紧合理滑点、评估保护提交路径 轮换助记词能阻止排序攻击

09 / OPERATING MODEL

把资产分层,比“每次都小心”更可靠

三钱包模型用结构限制单次错误的爆炸半径

01
VAULT / 金库钱包

保存,不探索

  • 长期资产与重要身份
  • 硬件隔离或多签;尽量不连接陌生前端
  • 只向自己的操作钱包补充预算
  • 不做无限授权,不领取未知空投
02
ACTIVE / 操作钱包

交易,有预算

  • 只保留近期需要的资金
  • 与已核验协议交互
  • 有限授权、定期核对 allowance / operator
  • 独立记录常用合约与官方入口
03
BURNER / 沙盒钱包

试验,可放弃

  • 探索新站点、测试签名流程
  • 不存放重要资产或身份凭证
  • 只从操作钱包获得小额预算
  • 出现异常即可停用,不回流未知代币

三个地址如果都由同一份已经泄露的助记词派生,隔离就只剩表面。因此,金库与日常/沙盒至少应有独立的控制根; 备份位置也要分离。分层不能让恶意签名变安全,但能让一次界面判断错误不至于触达全部资产。

10 / RECAP

把安全从直觉,变成检查顺序

先判断控制面,再读取字段,最后限制持续时间和资产半径

  1. 01

    助记词是恢复一组密钥的根;钱包是工具,地址是链上索引。换 App 不等于换控制权。

  2. 02

    连接、交易和签名不是同一种动作。“无 gas”不代表“无权限”。

  3. 03

    ERC-20 allowance 允许 spender 以后主动转移;NFT operator 往往覆盖整个集合。

  4. 04

    Permit 用离链签名建立 allowance;nonce 防重放,deadline 限时,但都不替你判断 spender。

  5. 05

    价格冲击来自自己的交易,滑点是允许边界,MEV 来自可见意图与排序。

  6. 06

    事件响应必须对症:密钥泄露要换控制根,错误授权要撤销权限,夹击要改善执行路径。

KNOWLEDGE CHECK / 6 QUESTIONS

六题自检

每题选择最准确的一项。答案解析也可在无脚本环境中展开。

01只点击“连接钱包”,通常直接改变了什么?

选择一项查看解析。

查看答案

答案 B。连接不是链上授权,但站点可以继续请求交易或签名。

02助记词泄露后,最稳妥的风险假设是什么?

选择一项查看解析。

查看答案

答案 C。应在干净环境建立全新控制根并迁移剩余资产。

03持有 1,000 token 且给陌生 spender 无限额度,当前近似爆炸半径是?

选择一项查看解析。

查看答案

答案 A。approve 先建立路径,spender 可稍后调用 transferFrom。

04关于 ERC-2612 Permit,哪项最准确?

选择一项查看解析。

查看答案

答案 B。无 gas 签名仍可能携带可执行的经济权限。

05哪项正确区分了价格冲击、滑点与夹击?

选择一项查看解析。

查看答案

答案 C。把三个机制分开,才能调整交易规模、边界和提交路径。

06私钥已经泄露,为什么只撤销 allowance 不够?

选择一项查看解析。

查看答案

答案 A。需要把剩余资产迁移到由全新恢复材料控制的地址。

11 / GLOSSARY & PRIMARY SOURCES

术语不是装饰,它们决定响应动作

EOA
Externally Owned Account,由私钥签名控制的外部账户。
助记词
用于恢复确定性钱包密钥树的人类可备份材料;不是网站登录密码。
Spender
在代币授权中,被 owner 允许调用转移能力的地址。
Allowance
ERC-20 中 owner 授予 spender 的剩余可转移数量。
Operator
ERC-721 / ERC-1155 中可代表 owner 操作某合约内全部资产的地址。
Permit
用签名设置 allowance 的模式;ERC-2612 是 ERC-20 的标准化版本。
Nonce
一次性序号,用于阻止同一授权被重复执行;不同协议的 nonce 规则不同。
Deadline
签名或交易参数允许执行的最后时间;长时限会扩大泄露后的机会窗口。
Mempool
节点持有的待处理交易集合;不存在一个全网完全一致的单一池。
MEV
通过包含、排除或排序交易,在标准区块奖励与费用之外可提取的价值。
价格冲击
交易本身消耗流动性并沿定价曲线改变边际价格造成的执行差异。
滑点容忍
用户允许报价与最终执行之间偏离的边界,常编码为最低接收量或最高支付量。

一手资料

本课只列协议规范、Ethereum.org 与 Flashbots 官方技术文档。标准描述接口,不为任何具体网站、 合约实现或钱包界面的安全性背书。

  1. Ethereum.org — Ethereum accountsEOA、合约账户与账户字段。
  2. Ethereum.org — Ethereum wallets钱包作为账户交互工具的基础说明。
  3. Ethereum.org — Maximal extractable value (MEV)MEV、套利、清算与 sandwich trading。
  4. EIP-20 — Token StandardapproveallowancetransferFrom
  5. EIP-721 — Non-Fungible Token Standard单件 approval 与 operator approval。
  6. EIP-1155 — Multi Token StandardsetApprovalForAll 的多代币授权语义。
  7. EIP-191 — Signed Data Standard带前缀签名数据的基本格式。
  8. EIP-712 — Typed structured data hashing and signing类型化数据与域分隔;规范本身不提供重放保护。
  9. EIP-2612 — Permit Extension for EIP-20 Signed ApprovalsPermit 字段、nonce 与 deadline。
  10. EIP-1271 — Standard Signature Validation Method for Contracts合约账户验证签名的标准接口。
  11. Ethereum.org — Transactions交易字段、签名与状态改变。
  12. Ethereum.org — Ethereum security and scam prevention助记词、钓鱼与常见骗局防护。
  13. Flashbots Docs — Protect Quick Startbuilder 信任、fast 模式与切换 RPC 的公开重发风险。
  14. Flashbots Docs — Protect Overview受保护交易提交的目标与边界。
  15. EIP-1559 — Fee market change费用字段与区块 gas 目标;gas 竞价不等同于完整排序规则。
  16. EIP-7702 — Set EOA account code现代 EOA 委托代码能力带来的新增授权表面。
  17. Ethereum Foundation — Clear Signing announcement以 ERC-7730 描述交易、减少盲签的 2026 协作计划。
  18. ERC-7730 — Structured Data Clear Signing Format供钱包呈现可验证人类语义的描述格式。
  19. Ethereum.org — Scam help and reporting资产保护、授权撤销、证据保存与恢复骗局提醒。