Metamask

是否可以使用元遮罩對純文字消息進行簽名?

  • September 26, 2022

我已經找到了使用 Metamask 和 ethers 讓使用者簽署任意消息的機制,但它涉及計算消息的雜湊,將其排列,然後呼叫驗證消息。

像這樣的東西:

function signMessage(msg : string) : string { 
   let msgHash= ethers.utils.solidityKeccak256(['string'],[msg]);      
   let sig = await this.mySigner.signMessage(ethers.utils.arrayify(hash));
   return sig;
}

我要解決的問題是使用者在 Metamask 請求消息簽名時看到的內容,如下所示:

在此處輸入圖像描述

問題是最終使用者會看到雜湊,但無法知道他們被要求籤名的實際消息是什麼。如果我是使用者,我希望能夠閱讀要求我在 Metamask 中籤名的消息。有沒有一種方法可以請求對消息的明文進行簽名,而不是對消息的雜湊進行簽名?我嘗試向 etherssigner.signMessage函式提供一個字元串,但它會產生錯誤。

您可以查看此資源,了解如何使用元遮罩對純文字消息進行簽名。它取決於使用eth.personal_sign(fromAddress, hexEncodedUtf8Message).

請參閱:https ://medium.com/metamask/the-new-secure-way-to-sign-data-in-your-browser-6af9dd2a1527#:~:text=MetaMask%20can%20now%20render%20plain,他們的%20signature%20challenges%20human%20可讀

您正在使用正確的方法來簽署消息。但我不知道您為什麼要嘗試將 python 與 ether.js 一起使用。並且您在簽名時不需要散列消息。

這是範例:

const Message = async (message) => {
  const signer = ethers.getSigner();
  const signature = await signer.signMessage(message); 
} 

上述功能工作正常。由於 singMessage 返回的結果是雜湊,我們需要解決這個承諾。

為了更進一步,您可以使用 ether.js 中的另一種方法驗證簽名。

const Message = async (message) => {
      const signer = ethers.getSigner();
      const signature = await signer.signMessage(message); 
      const verify = ethers.utils.verifyMessage(message, signature)
   } 

如果您將驗證登錄到控制台,您將看到簽名者地址。那是你的乙太坊地址。

告訴我它是否有幫助!

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