這次我們來說說關於 MetaMask 的簽名問題。
所謂簽名,就是用你保存在 MetaMask 中的 Private Key 去對某樣東西做簽署,從而認證「你就是你」,這和我們日常生活中簽署文件類似。
MetaMask 在不消耗 Gas Fee 的情況下(即簽名資料不上鏈),也是可以進行簽名認證的,這種簽名多用於網站登入,或者 Gasless MetaTransaction 等。例如 OpenSea 登入,會要求你對一段信息進行簽名認證,簽名後會得到一個 Hash,伺服器則可以根據這個 Hash 和你的 Public Key 即錢包地址去驗證這段 hash 是否由你簽署,從而完成「你就是你」的身分驗證。
目前 MataMask 提供的簽名方法大致有三種,不同的方式有不同的應用場景。
Personal Sign
Personal Sign 可以用於簽署一段 UTF-8 編碼的文字,因此可以清楚顯示被簽名的內容,這種方式常見於網站登入。
eth_sign
eth_sign _是早期的簽名方法,這個方法必須傳入一個 32 byte 的 message hash 以供簽名,message hash 可以是任何內容的 hash,因此,僅憑 message hash,簽名者不會知道自己正在簽署什麼內容,可能是一個交易資料,又或者其它任何內容,因此有潛在的被釣魚的風險,現在 MetaMask 已經開始對這類的簽名請求彈出紅色警告。
EIP712 Sign
EIP712 簽名是一種更安全的簽名標準,是根據 EIP712 標準為 signature 加入了如domain,contract address 等資訊,從而提高簽名的安全性。
EIP712 簽名標準規定了簽名數據的結構,也加入了對數據的作用域限制,如 domain,verify contract address 等。這個標準的好處是,簽名者可以清楚看到自己在簽署的內容,很大程度上降低被釣魚的風險。
ERC712 簽名經常會被用在執行 metatransaction 等合約執行中,例如 OpenSea NFT 上架,降低價格等過程都會出現 EIP712 簽名請求。
我為三種簽名都做了一個示例,有興趣的讀者可以去看看原始碼,親自嘗試一下。