深入探讨 CoW 协议签名方法

深入探讨 CoW Protocol 签名方法 (第一部分)
然而,进入流动池并非易事;用户需要 7 种代币,且比例正确。研究最佳执行方案使我转向了全球市场:即时铸造和赎回,继承自传统市场的流动性。基于 RFQ 的模式,这正是意图协议的优势所在。
我已经熟悉 @CoWSwap 协议,因此在此基础上构建 zap 是一个自然而然的选择。意图对用户体验非常有益:更少的点击,更好的执行。
问题是:在 CoW 上进行 7 笔订单意味着 7 次签名。
这让我陷入了深思。
首先,CoW Swap 上的订单究竟是什么?
当你在 CoW Protocol 上交易时,你并非直接发送交易。你正在签署一个意图——一条消息,表示“我希望在这些条件下将 X 兑换为 Y”。该意图被提交到链下订单簿,求解器竞争来完成它,然后才会在链上发生一些事情。
关键词是签名。在 CoW 转移你的资金之前,它需要验证订单确实来自你。在 CoW 上有四种方法可以实现这一点:
签名方法 1: eth_sign
最古老、支持最广泛的方法。你的钱包使用一个前缀签署订单摘要。几乎所有以太坊库都支持此方法。
简单,随处可用,但用户体验很差——你的钱包显示的是一个原始哈希,而不是实际订单详情。你本质上是在盲签。对于开发者/测试而言尚可,但对用户来说不佳。
仅适用于 EOA。智能合约无法使用此方法。
签名方法 2: EIP-712
推荐用于 EOA 的方法。你签署的是结构化数据,而不是原始哈希——你的钱包可以实际显示“出售 1000 USDC,购买 WETH,有效期至 X”。大多数现代钱包都能正确渲染此信息。
底层机制仍然是 ECDSA 签名,只是使用结构化消息格式和一个域分隔符,以防止跨链和跨合约的重放攻击。
仍然仅限 EOA。仍然每笔订单一个签名。
签名方法 3: PreSign
一个例外。你不是使用链下签名,而是直接在结算合约上调用 setPreSignature(orderUid, true)。签名字段实际上是空字节——链上调用即授权。
适用于 EOA 和智能合约。问题在于:每笔订单都需要一次链上交易。对于一个 7 笔订单的 zap,这意味着在交易开始前就需要 7 笔交易。
链上意味着不是无 Gas 费的。这与我的用例目的相悖。
签名方法 4: ERC-1271
ERC-1271 是一个用于智能合约验证签名的标准接口。结算合约不是检查 ecrecover(hash, signature) == owner,而是在智能合约上调用 isValidSignature(orderHash, signature) 并检查一个魔法返回值。
签名字段可以是任何内容——完全由合约来解释。你可以在其中放入一些订单参数、一个 Merkle 证明、对链上状态的引用,无论你的合约逻辑需要什么。
限制是:智能合约需要成为订单的所有者。普通的 EOA 不能直接使用 ERC-1271。直到最近,这意味着你需要一个 Safe 或其他智能合约。
那么我该怎么办?
对于我的 zap:eth_sign 和 EIP-712 每笔订单需要一个签名。PreSign 每笔订单需要一次链上交易。ERC-1271 是一种一次性签署 N 笔订单的途径,但它需要一个智能合约作为订单所有者。
CoW Protocol 中出现了一些令人兴奋的进展,彻底改变了这种局面。
第二部分即将推出。🐮
- 原文链接: x.com/mendesfabio/status...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!