Signature
為什麼要使用簽名消息來驗證發件人?
在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
將為使用者造幣並支付費用。