目前在看openSea的NFTexchange业务,在尝试自己部署的过程中,发现对于同一笔订单且数据完全相同来说,通过前端调用MetaMask的Sign Typed Data v4方法来生成的订单Hash,与合约执行hashToSign方法生成的Hash完全不同,
前端生成的hash为:0x124d53f05a8154614a3b5f7a93d472a0e92539fb6f3c5f40f0b7f03680538f5f5448993ead60f6c6c0085812b44fc90de1f8b2adfc11b239e2e584e50ac47a831c,
而调用合约生成的hash为:0xab19dd3b703cb47d53cd0d4e4107672fbf43e8eb4f66c64ebbed45729c058a49,
从而导致合约在验证来自前端的交易数据时,无法正常通过图二的ecrecover验证,从而导致交易失败。
图一
图二
因此,我想咨询一下为何通过Metamask对数据签名后返回的hash,与合约执行hashToSign通过keccake256方式生成的hash会有如此巨大的差距,该如何解决这个问题。
opensea 完成订单交易流程是
提交阶段:组装Offer,调用合约hashToSign()。获得bytes32 hash值后使用metamask进行签名获取ecdsa签名数组 rsv。提交服务器保存。同时调用tradeValid验证交易参数是否正常,不正常返回错误提示
验签阶段:买方,提交从服务器获取的 Offer,Signature(r,sv),交易接受地址。调用市场合约完成交易。合约会验证 \x19Ether xxx ${len} ${hash}\
的keccak256 的hash反解析签名 Signature(r,sv)是否来源于发布者的地址,来判断交易的真实性。最后转移买房和卖方各自资产完成交易。