两类账户 · 一切交互的根基
EVM 公链(ETH / BSC / Polygon / Arbitrum…)只存在两种账户,没有第三种。所有链上行为——部署、转账、调用、Swap——全部基于这两者实现。
EOA · 外部拥有账户
由私钥 / 公钥加密生成的人类可控账户,就是你 MetaMask 里那个地址。
- 唯一能主动发起链上交易的账户——所有操作的源头
- 拥有私钥,可签名交易、支付 Gas
- 自带 Nonce(交易序号,防重放、定顺序)
- 可持有链原生代币(ETH / BNB / MATIC)
- 无代码、无合约逻辑、无持久化存储
CA · 合约账户
由 EOA 的部署交易生成的独立链上程序,一段跑在链上的代码。
- 无私钥,无法主动发起任何交易,只能被动被调用
- 拥有独立 Bytecode(代码)+ 独立 Storage(持久存储)
- 可持有原生代币,以及所有 ERC-20 代币
- 无自主意识、无决策能力,仅执行预设代码逻辑
- 被调用时,代码在每个节点的 EVM 里确定性地执行
合约生命周期 · 源码到调用
一个合约从 Solidity 源码到能被调用,要走完编译、部署、初始化三关。点下面的标签逐步查看每一关内部发生了什么。
权限的本质 · 默认人人平等
最反直觉、也最重要的一点:EVM 底层不存在合约归属和默认管理员。部署完成后,合约就是个独立账户,和部署者没有任何底层绑定。
底层无天然归属
- 合约部署后是独立账户,和部署者 EOA 无底层绑定
- 不写权限代码 = 全网所有 EOA 完全平等
- 唯一差异:初始代币铸在部署者钱包(资产差异 ≠ 权限差异)
管理员权限
- 手动在 Storage 存一个 owner 地址
- 用
require(msg.sender==owner)限制专属操作 - 没有这行代码,就没有管理员——特权是人为写出来的
税费 / 分润逻辑
- 代码内置交易抽成(如每笔 swap 抽 x%)
- 自动把抽成转给部署者或指定地址
- 同样是代码定义,链本身不会替谁收钱
调用链路 · 谁在调用谁
新手最大误区:以为调用别人部署的合约,要「经过」部署者。其实链路是直的。切换下面两种场景,看 msg.sender 与 tx.origin 在每一跳如何取值。
⚠ 安全延伸 · 为什么不能用 tx.origin 做权限校验
msg.sender 是直接调用者,tx.origin 是整笔交易最源头的 EOA(永远是钱包,不会是合约)。若某钱包合约用 require(tx.origin==owner) 鉴权,攻击者可诱导 owner 去调用一个恶意合约 M,M 再回调该钱包——此时 tx.origin 仍是 owner,鉴权被绕过。正确做法是用 msg.sender,这也是 tx.origin 极少用于授权的原因。
XYK 恒定乘积模型 · 亲手做一笔 Swap
DEX 池子的全部数学,浓缩在一条双曲线 x·y=k 里。下面是一个真实运行的模拟器:拖动滑块卖出代币 X,看曲线上的点如何滑动、价格如何变化、滑点从哪来;再用按钮加减流动性,看池子深度(k)如何改变。
x · y = k 瞬时价格 P = y / x
提示:Swap 只改变比例、k 不变;加/减流动性等比缩放、只改变深度(k),价格不变。
Swap 兑换
- 资产此消彼长(x↑y↓ 或 x↓y↑)
- 无手续费时 k 绝对恒定
- 价格随供需自动涨跌,产生滑点
- 只改变比例,不改变池子总体量
LP 增 / 减流动性
- 添加:x、y 等比同步增大 → k 变大 → 池子加深、滑点降
- 移除:x、y 等比同步减小 → k 变小 → 池子变浅、滑点升
- 价格不变,仅改变池子深度
池子深度本质
- 池子深度 = k 值大小
- k 越大:流动性越深,大额交易滑点越小
- k 越小:流动性浅,小额也会剧烈「插针」
- 滑点只和 k 有关,和代币总发行量无关
EVM vs Solana · 同一套数学,两种工程
跨链最常见的误解是以为「模型不同」。其实 XYK 数学模型通用不变,两条链的差别只在逻辑与存储如何组织。
EVM(ETH / BSC)
Solana
XYK 数学模型通用不变,仅工程实现不同。
高频误区 · 100% 避坑清单
这七条几乎覆盖新手 99% 的误解,逐条对照纠正。
极简记忆口诀
把整份全景图压缩成六句话,随时回忆。