Gnosis-Safe
將personal_sign 與WalletConnect 和Gnosis Safe 一起使用
我正在開發一個用於
personal_sign
對使用者進行身份驗證的網站。我將“地址”和“簽名”發送到我的伺服器以驗證使用者擁有該地址。我目前正在添加 WalletConnect 支持,但遇到了 Gnosis Safe 的問題。使用 Gnosis Safe 簽名時,值signature
只是“0x”而不是完整簽名:const signature = await connector.signPersonalMessage([ convertUtf8ToHex(message), address, ]);
personal_sign
受 Gnosis Safe 支持嗎?當與 Ledger Live 或 Metamask 移動應用程序連接時,此技術適用於 WalletConnect。是否有其他方法可以驗證使用者是否擁有地址?謝謝你。
如果
safeProxyContract.isValidSignature(msgHash, signature)
(參見CompatibilityFallbackHandler.sol#L66)返回EIP1271魔術值,則帶有 的消息msgHash
已簽名。如果沒有,則沒有簽名const UPDATED_EIP1271_MAGIC_VALUE = '0x1626ba7e' let isValidSignature = await safeProxyContract.isValidSignature(msgHash, signature) // if isValidSignature() returns the EIP-1271 magic value, the signature is valid if (isValidSignature == UPDATED_EIP1271_MAGIC_VALUE) { signatureValid = true }
但我不知道什麼時候打電話給
isValidSignature()
. 因為WalletConnect模式實際上0x
在使用者發出 txn 後立即解決,而無需等待 txn 被確認。所以沒有辦法知道 txn 雜湊,也沒有辦法知道簽名消息 txn 何時/是否被探勘但是 GnosisSafe 合約在這些 txn 期間會發出一個事件。所以我
once
在合約中添加了一個事件監聽器來監聽那個事件,然後檢查isValidSignature()
const msgHash = ethers.utils.hashMessage(rawMessage) const getMessageHash = await wsSafeProxyContract.getMessageHash(msgHash) // login() only after the _signMessage() txn is mined and SignMsg(msgHash) event emitted wsSafeProxyContract.once(wsSafeProxyContract.filters.SignMsg(getMessageHash), async () => { await login() })
感謝@Richard提供幫助!