我有一个人正在为我构建一个ERC721令牌,我遇到了这一行代码(请参阅“地址私有签名者”):
contract SingleToken is Ownable, IERC721, IERC721Metadata, ERC721Burnable, ERC721Base {
address private signer = "wallet address";
mapping(uint8 => mapping(bytes32 => mapping(bytes32 => bool))) isUsed;
constructor (string memory name, string memory symbol, address newOwner, string memory contractURI, string memory tokenURIPrefix) public ERC721Base(name, symbol, contractURI, tokenURIPrefix) {
_registerInterface(bytes4(keccak256('MINT_WITH_ADDRESS')));
transferOwnership(newOwner);
}
function mint(uint256 tokenId, Fee[] memory _fees, string memory tokenURI, bytes32 signedMessage, uint8 v, bytes32 r, bytes32 s) public {
require(isUsed[v][r][s] == false, 'SingleToken: used signature');
require(signer == ecrecover(signedMessage, v, r, s), 'SingleToken: invalid signer');
isUsed[v][r][s] = true;
_mint(msg.sender, tokenId, _fees);
_setTokenURI(tokenId, tokenURI);
tokenStatus[tokenId] = STATUS.BASIC;
}
function setTokenURIPrefix(string memory tokenURIPrefix) public onlyOwner {
_setTokenURIPrefix(tokenURIPrefix);
}
function setContractURI(string memory contractURI) public onlyOwner {
_setContractURI(contractURI);
}
function setTokenOnSale(uint256 tokenId) external {
require(_isApprovedOrOwner(msg.sender, tokenId) == true, 'Not owner or approved.');
tokenStatus[tokenId] = STATUS.SALE;
}
function cancelTokenSale(uint256 tokenId) external {
require(_isApprovedOrOwner(msg.sender, tokenId) == true, 'Not owner or approved.');
tokenStatus[tokenId] = STATUS.BASIC;
}
function setTokenOnAuction(uint256 tokenId) external {
require(_isApprovedOrOwner(msg.sender, tokenId) == true, 'Not owner or approved.');
tokenStatus[tokenId] = STATUS.AUCTION;
}
function setTokenOnBasic(uint256 tokenId) external {
require(_isApprovedOrOwner(msg.sender, tokenId) == true, 'Not owner or approved.');
tokenStatus[tokenId] = STATUS.BASIC;
}
}我很好奇私人签名人的地址是什么,它是做什么的?应该是我的钱包地址吗?在实际代码中,他在“钱包地址”部分有他的钱包地址,我不确定是否应该是这样。
发布于 2021-07-21 05:06:11
在提供的代码中,signer只有一种用途:
function mint(uint256 tokenId, Fee[] memory _fees, string memory tokenURI, bytes32 signedMessage, uint8 v, bytes32 r, bytes32 s) public {
require(isUsed[v][r][s] == false, 'SingleToken: used signature');
require(signer == ecrecover(signedMessage, v, r, s), 'SingleToken: invalid signer');
isUsed[v][r][s] = true;
_mint(msg.sender, tokenId, _fees);
_setTokenURI(tokenId, tokenURI);
tokenStatus[tokenId] = STATUS.BASIC;
}来自signer的有效签名将允许薄荷令牌。
从安全性的角度来看,我不喜欢signedMessage是一个与tokenId、发送方和令牌地址(this)无关的bytes32 blob。
另一个问题是,ecrecover存在一些可延展性问题,即人所共知。建议将其与添加额外验证的OpenZeppelin或类似库一起使用。
我建议要求进行安全审计,以确保不再存在问题。
https://ethereum.stackexchange.com/questions/103838
复制相似问题