如何在swift中实现eth_signTypedData?

cbwuti44  于 2023-03-07  发布在  Swift
关注(0)|答案(1)|浏览(222)

我正在开发一个加密钱包,我已经在swift中实现了personal_signeth_sign,如何实现eth_signTypedData,官方walletConnect文档中似乎没有相关信息。有什么想法吗?谢谢!

dgenwo3n

dgenwo3n1#

很晚的答案,但我会尝试张贴一些发现和代码在这里,希望它能帮助人们寻找它在未来。
首先提供一些初步信息:

  • eth_signTypedData至少有4个不同的版本,如www.example.com中所述https://docs.metamask.io/guide/signing-data.html#signtypeddata-v4。根据您希望支持签名的复杂对象的类型,或者您希望实现的完整程度,我的答案的某些部分可能会丢失或过时。我使用此实现的目标是在https://example.walletconnect.org/上通过eth_signTypedData测试
  • 此任务分为两部分:首先,在某个EIP 712 TypedData对象中解析接收到的JSON参数,该对象关心正确的解析、编码,并能够在最后公开要签名的正确数据。其次,实际签名此数据,这在很大程度上取决于您使用钱包凭据签名时使用的swift库。我将重点介绍第一部分。

您将需要https://github.com/muratogat/wallet-connect-swift/tree/master/WalletConnect/Models/EIP-712中的所有文件这是WalletConnect(v1)的派生版本,我从https://github.com/trustwallet/trust-core/tree/833ec3f263bb9b257b6ec04359cb98d1bae7cf17/Sources/Ethereum/Solidity中复制了支持EIP-712所需的文件
这里的重要文件是EIP 712 TypedData,其他文件是它所依赖的模型。

  • Trust Wallet SDK对keccak 256使用Crypto.hash()。我没有包括他们的加密库,但用data.sha3(.keccak256)替换了对keccak 256的所有调用,这是keccak 256的web 3swift方式,我已经在我的项目中使用了。
  • 已将“EthereumAddress”重命名为“EthereumAddressEncoding”,以避免项目中的类型冲突
  • 修复了Trust Wallet“bytes”编码中的一个错误,TW通过将字符串表示转换为字节来编码字节,其中错误地包含0x,从而给出错误的哈希。

如果您设法在您的项目中使用此功能并修复可能遇到的任何其他警告/错误,则应该能够调用:

let decodedEIP712TypedData = new JSONDecoder().decode(EIP712TypedData.self, from: params[1].data(using: .utf8)!)

这里params是从WalletConnect JSONRPCRequest获得的有效负载字符串数组,其中第一个字符串是地址,第二个字符串是结构化数据JSON对象。
后来

decodedEIP712TypedData.signHash

应该会给予你一个byte[]来做标记。
然后,根据您的web 3 swift库,您可以实际签署这个byte[]并响应WC请求。注意,您不应该使用添加以太坊签名消息前缀的personal_sign。如果您的web 3 swift库没有直接签署数据的方便方法,您可以手动检查此数据,并使用较低级别的SECP256K1.signForRecovery手动使用您的私钥对其进行签名。
祝你好运。

相关问题