我正在尝试使用Uniswap的Permit2 (AllowanceTransfer)开发一个端到端的系统。
为了达到这个目的,在Permit2津贴之后,我必须签署一条消息并验证它的诚信合同方。有符号消息将由3个元素组成:域、类型和值。
const domain = {name: "Permit2", chainId: 5, verifyingContract: 0xPERMIT2ONGOERLI};
const types = {
PermitSingle: [{ name: "details", type: "PermitDetails" }, { name: "spender", type: "address" }, { name: "sigDeadline", type: "uint256" }],
PermitDetails: [{ name: "token", type: "address" },{ name: "amount", type: "uint160" },{ name: "expiration", type: "uint48" },{ name: "nonce", type: "uint48" }],
};
const values = {
details: {
token: 0xDAI,
amount: 1000 * 10^18,
expiration: 168384570,
nonce: 0,
},
spender: 0xMYCONTRACT,
sigDeadline: 168384570,
};
我继续将这些数据发送到签名者的signTypedData
实用程序(不管是来自以太、wagmi等的工具)。并将它很好地打包为我想要的事务的一个参数,在0xMYCONTRACT
中实现。
在合同的签名验证流程中,ecrecover
将返回一个完全无关的地址,显然不是消息的实际签名者(这里,应该是msg.sender
)。
有没有人处理过类似的情况?如果是的话,对于这种签名不匹配,有什么可能的解决办法呢?
发布于 2023-05-15 10:43:30
这个问题已经得到解决,并被证明只是一个由不明确的契约API引起的集成错误。
用于重新构建哈希的值(例如,amount、nonce、令牌地址)必须与签名中包含的值匹配1:1。作为一项建议,应当将上下文特定值(例如转让金额)与许可特定值(签名中允许的最大金额)分开。
最简单的方法是:避免在您自己的契约中抽象PermitSingle参数逻辑。要求从客户端获得一个完整的许可结构,该结构与其他上下文事务细节是分开的。
https://ethereum.stackexchange.com/questions/150087
复制相似问题