我试图用Metamask和一个小玩具例子来理解eth_signTypedMessage。
浏览器中的代码(使用Metamask和Chrome):
ethereum.request({ method: 'eth_signTypedData', params: [
[
{
type: 'string',
name: 'testname',
value: '1234567890'
}
],
publicAddress
] }).then((signedData) => {
SendSignedDataToBackend(signedData);
});
我试图弄清楚如何计算类型化数据的消息散列,但我不能用the standard直接计算:
后端php代码(使用旧的php ECRecover):
$typeHash = Keccak::hash('(string testname)',256); // Also no success without the brackets
$encodeData = keccak::hash("1234567890",256);
$typedMsgHash = keccak::hash(hex2bin($typeHash.$encodeData),256);
$ecRecover = new EcRecover();
$address = $ecRecover->personalEcRecover($typedMsgHash,$signedData);
这会导致错误的公共地址。有什么建议吗?
2条答案
按热度按时间4bbkushb1#
在浏览了Metamask的代码之后,似乎Metamask签署了普通消息:
和我想的不一样
这似乎并不遵循EIP-712,但也许我误解了它。在服务器上删除“\x19Ethereum...”的额外哈希计算解决了这个问题。$typeHash计算是没有括号的代码中的问题。我还需要在我的代码中添加一个额外的“0x”:
uqdfh47h2#
也许还不算太晚,两年后登陆这里,仍然没有解决方案,我不得不写一个包来解决这个问题。sleepfinance/eip712
根据EIP-712指定的JSON模式格式化数据。例如: