首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >签字人的地址是什么?我被骗了吗?

签字人的地址是什么?我被骗了吗?
EN

Ethereum用户
提问于 2021-07-20 22:20:31
回答 1查看 86关注 0票数 0

我有一个人正在为我构建一个ERC721令牌,我遇到了这一行代码(请参阅“地址私有签名者”):

代码语言:javascript
复制
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;
    }
}

我很好奇私人签名人的地址是什么,它是做什么的?应该是我的钱包地址吗?在实际代码中,他在“钱包地址”部分有他的钱包地址,我不确定是否应该是这样。

EN

回答 1

Ethereum用户

发布于 2021-07-21 05:06:11

在提供的代码中,signer只有一种用途:

代码语言:javascript
复制
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或类似库一起使用。

我建议要求进行安全审计,以确保不再存在问题。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/103838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档