EVM 协议介绍
说明
很高兴你能点开这份文档。本文档旨在为对 x402 和区块链感兴趣的读者们,提供我个人关于支付协议和区块链协议的学习经历,供刚接触区块链、代币支付或者对该领域感兴趣的读者们阅读。
注意:内容都是基于我个人的见解,仅供参考。如果有帮助到您,希望您可以给我的项目点一个 star。如果有错误的内容,欢迎指正,感激不尽。
在我最初接触以太坊签名和转账时,查阅文档映入眼帘的是一堆 "e" 开头的字符串:erc20、eip712,本来没什么感觉。但随着接触越来越多:erc4337、erc8004、eip2612,有些文档又叫 erc2612...
WTF?这是啥?那又是啥?两者有区别吗? 为了搞清楚这些事儿,我需要先恶补一些关于区块链的基础知识了。
钱包类型
目前先只介绍 2 种类型的钱包,这些钱包覆盖了目前版本的 x402-mock 的所有运行逻辑。
EOA 钱包(传统钱包)
相信大家最熟悉的钱包,就是传统的 EOA 钱包了,比如 MetaMask、欧易钱包等等。它们可以是 App 或者是浏览器插件的形式,全权由你的 私钥(Private Key) 来控制,当然也有 助记词 来防止密钥丢失。你的私钥就是你的钱包,它控制了一切。
在用它的时候,你会发现:比如,你在 ETH 主网上给别人转一笔 USDC,会消耗手续费(Gas)。这个手续费必须是你的 ETH 原生币,所以你必须持有足够的 ETH 来支付 Gas Fee,你光有 USDC 还不行。
AA 钱包(账户抽象钱包)
账户抽象钱包(Account Abstraction),简称 AA 钱包,算是解决了 EOA 钱包的一些痛点。它的本质是 "一段智能合约代码",具备私钥可找回、可全用代币支付(可以找别人帮你支付 Gas)、可自定义逻辑等功能。
它本质并没有改变整个区块链社区的运行逻辑,实际是在打包上链之前(Bundler),嵌套了一层逻辑。虽然它属于 "L2" 层,但体验很像 "L2" 层。协议参考:ERC-4337。
协议介绍
EIP 和 ERC 是什么?
以太坊改进提案(EIP) 是以太坊社区不断进步的基础,提出现有以太坊生态该如何改进的方案,流程为:提出 → 审查 → 讨论和修订 → 达成共识。EIP + 数字 代表提案的顺序,数字越小代表最早提出的提案。
以太坊意见征求稿(ERC) 其实是 EIP 的一种。刚提出时就是 EIP,当它被归类为 "应用层标准" 时,就变为了 ERC。所以,你平时看到的 erc{int} 和 eip{int} 实际上是一回事儿,具体怎么叫如何分类,暂时不纠结这个问题。
ERC-20 — 代币标准协议
ERC-20 是 Web3 世界最普及的资产协议。像 USDT、USDC 这种巨头资产,本质上都是在以太坊上通过智能合约,严格遵循 ERC-20 标准发行的数字货币。在链上,每一种代币都对应一个独一无二的合约地址(Token Address),就像代币的 "身份证号",确保了即便名字相似,资产的权属和逻辑也绝不会混淆。
EIP-712 — 结构化数据签名标准
EIP-712 是以太坊上一种结构化数据签名标准,它将原本难以辨认的十六进制原始数据转化为用户可读的表单格式,确保用户在签名时清楚地知道自己在授权什么。就好像银行固定格式的支票,你把要转账的信息内容都按银行提供的格式填好,并用你的私钥进行签名。
核心逻辑:用户 A 使用私钥对包含转账对象、金额、Nonce 和链 ID 等特定信息进行数学运算,生成由 v、r、s 三个分量组成的数字签名;验证者(如智能合约)通过这组 v、r、s 和原始信息进行反向推导,若还原出的地址确为 A,则证明该指令真实且未经篡改。
目前主流的 ERC-3009 和 Uniswap 的 Permit2 协议,本质上都是在 EIP-712 的框架下定义了不同的业务字段。
ERC-1271 — 智能合约签名验证
传统钱包(EOA)签名由私钥说了算。但智能合约钱包(比如 AA 钱包)没有私钥,怎么证明 "这是我签的字" 呢?ERC-1271 就是为此而生的 "签名验证官",它定义了一个标准接口:
function isValidSignature(bytes32 hash, bytes memory signature)
external view returns (bytes4 magicValue);
只要调用 isValidSignature 方法,如果是真的合约,它会返回一个固定的 Magic Value bytes 值 0x1626ba7e。
EIP-2612 — 代币许可协议
EIP-2612 是一个相对完整的代币签名 + 验证签名 + 完成转账的签名标准协议。它内置了一个 permit 方法,所有人都可以调用这个 permit 来完成转账操作,别人也可以帮你调用,这样 Gas Fee 别人就可以帮你支付了(这个叫做 Paymaster)。
存在的问题:nonce(每个地址已使用的签名次数)参数必须按顺序递增,每次都要查询具体的 nonce 是否正确,且不支持 USDT 这样的老牌代币。
ERC-3009 — Circle/Coinbase 签名转账标准
ERC-3009 是 Circle(USDC 发行方)与 Coinbase 设计的签名转账标准,与 EIP-2612 有所不同:nonce 不需要再按顺序来了,每笔转账都互不干扰;签名可取消,可调用 cancelAuthorization 方法;transferWithAuthorization 调用一次即可完成转账(而不是之前的 permit + Transfer),理论上更省 Gas Fee。
x402-mock 项目提示:如果签名代币为 "USDC",优先使用 ERC-3009 协议。
ERC-4337 — 账户抽象协议
ERC-4337(账户抽象) 彻底打破了传统 EOA 钱包必须依赖私钥控制一切的枷锁。它引入 UserOperation 对象,可以看作一份交给以太坊账户的 "待办事项列表",这些指令被发送到专门的内存池,由 Bundler(打包者) 进行批量"捆绑",将 N 个操作合并为一个链上交易。
验证逻辑从固化的私钥签名转变为可灵活编程的智能合约,可以实现社交恢复、多签校验、他人代付 Gas,真正实现了 "账户即合约"。
ERC-6492 — 预部署签名验证
ERC-6492 专门解决了智能合约钱包(AA)在正式部署前无法验证签名的痛点。
想象一下,你作为收款方,向一个 AI Agent 申请付款,这个 Agent 使用的是合约钱包,但为了省钱,它只有在第一次发交易时才会真正部署到链上。
ERC-6492 就像是一张 "预售收据",允许账户在完全没上链、没付过 Gas 的情况下,通过一种特殊的签名格式向你证明:谁来创建合约、初始化代码是什么、原始签名是什么。"虽然我现在还没在链上生成,但我保证这个地址就是我的,且我现在的签名在未来我'出生'后绝对有效。"
EIP-7702 — 临时合约化身协议
EIP-7702 是一种让传统私钥钱包(EOA)在交易期间 "临时变身" 为智能合约的协议。不像 ERC-4337 那样要求你彻底抛弃现有的私钥地址,它允许你在发起一笔支付时,通过一个数字签名将一段特定的合约代码 "附身" 在你的原始地址上,交易完成后,地址又会恢复成普通的私钥模式。
具备的能力:一次点击同时完成多个代币的组合支付(操作批处理)、让别人帮你付 Gas 费、设置每日支付限额。完美兼顾了私钥的控制权和合约的灵活性,是目前实现 "全民账户抽象" 最丝滑的路径。
Permit2 — Uniswap 下一代授权协议
Permit2 是由 Uniswap 实验室推出的一种下一代代币授权协议,它像是一个中间层的 "签名处理器",解决了传统 ERC-20 approve 机制低效且不安全的问题。你只需要对这个 Permit2 合约进行一次性的 "无限额授权",之后所有的代币转账、交易或跨链操作,都只需要通过离线签名即可完成。
兼容不支持 EIP-2612 的老牌代币(如 USDT);引入极其灵活的签名过期时间;支持批量转账功能;在支付场景下,让用户在享受 "签名即支付" 的丝滑体验时,不必再担心因过度授权而导致资产永久暴露在风险中。
引用
本文档仅仅做通俗形式的科普,协议详细内容及使用方式建议查看官方文档:
- ETH docs - 以太坊官方文档
- Uniswap Docs - Uniswap Permit2 协议文档
- 登链社区 - 中文区块链学习社区