20 关于MeataMask签名生成的Hash与keccake256生成的hash不同,导致合约验证不通过。

目前在看openSea的NFTexchange业务,在尝试自己部署的过程中,发现对于同一笔订单且数据完全相同来说,通过前端调用MetaMask的Sign Typed Data v4方法来生成的订单Hash,与合约执行hashToSign方法生成的Hash完全不同,

前端生成的hash为:0x124d53f05a8154614a3b5f7a93d472a0e92539fb6f3c5f40f0b7f03680538f5f5448993ead60f6c6c0085812b44fc90de1f8b2adfc11b239e2e584e50ac47a831c,

而调用合约生成的hash为:0xab19dd3b703cb47d53cd0d4e4107672fbf43e8eb4f66c64ebbed45729c058a49,

从而导致合约在验证来自前端的交易数据时,无法正常通过图二的ecrecover验证,从而导致交易失败。

图一

image.png

图二

image.png

因此,我想咨询一下为何通过Metamask对数据签名后返回的hash,与合约执行hashToSign通过keccake256方式生成的hash会有如此巨大的差距,该如何解决这个问题。

请先 登录 后评论

最佳答案 2022-03-07 17:25

opensea 完成订单交易流程是 提交阶段:组装Offer,调用合约hashToSign()。获得bytes32 hash值后使用metamask进行签名获取ecdsa签名数组 rsv。提交服务器保存。同时调用tradeValid验证交易参数是否正常,不正常返回错误提示 验签阶段:买方,提交从服务器获取的 Offer,Signature(r,sv),交易接受地址。调用市场合约完成交易。合约会验证 \x19Ether xxx ${len} ${hash}\的keccak256 的hash反解析签名 Signature(r,sv)是否来源于发布者的地址,来判断交易的真实性。最后转移买房和卖方各自资产完成交易。

请先 登录 后评论

其它 2 个回答

663 - 合约
请先 登录 后评论
Tiny熊
  擅长:智能合约,以太坊
请先 登录 后评论
  • 3 关注
  • 1 收藏,2644 浏览
  • 大橙子 提出于 2022-03-06 11:58