Gnosis-Safe

將personal_sign 與WalletConnect 和Gnosis Safe 一起使用

  • February 1, 2022

我正在開發一個用於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提供幫助!

引用自:https://ethereum.stackexchange.com/questions/117935