Signature

為什麼要使用簽名消息來驗證發件人?

  • May 19, 2022

Ghost 契約中,他們有:

   function mint(uint8 quantity, bytes calldata signature)
       public
       payable
       callerIsUser
   {
       require(DA_ACTIVE == true, "DA isnt active");
       if (!directMintAllowed) {
           require(
               daSigner ==
                   keccak256(
                       abi.encodePacked(
                           "\x19Ethereum Signed Message:\n32",
                           bytes32(uint256(uint160(msg.sender)))
                       )
                   ).recover(signature),
               "Signer address mismatch."
           );
       }
       ...
   }

我覺得我錯過了什麼。這不是等價的嗎:

   function mint(uint8 quantity)
       public
       payable
       callerIsUser
   {
       require(DA_ACTIVE == true, "DA isnt active");
       if (!directMintAllowed) {
           require(daSigner == msg.sender, "Signer address mismatch.");
       }
       ...
   }

在這裡添加簽名消息檢查有什麼價值?

它們根本不等價:

require(
        daSigner ==
            keccak256(
                abi.encodePacked(
                    "\x19Ethereum Signed Message:\n32",
                    bytes32(uint256(uint160(msg.sender)))
                )
            ).recover(signature),
        "Signer address mismatch."
);

確保signature引用來自daSigner內容設置為地址的簽名消息msg.sender

任何持有daSigner 包含其地址的簽名消息的人都可以通過此檢查。daSigner可以通過簽署適當的消息將其選擇的任何地址授予鑄幣廠。然後使用者將該簽名帶到智能合約並被允許鑄造。在這種情況下,daSigner授權使用者進行鑄幣,但使用者正在支付費用,因為他將與合約進行互動。

在第二種情況下:

require(daSigner == msg.sender, "Signer address mismatch.");

確保msg.sender只有daSigner可以daSigner通過此檢查。在這種情況下,daSigner將為使用者造幣並支付費用。

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