MekaVerse NFT 智能合约正在使用 ECDSA,但我不明白它是如何工作的

Posted

技术标签:

【中文标题】MekaVerse NFT 智能合约正在使用 ECDSA,但我不明白它是如何工作的【英文标题】:MekaVerse NFT smart contract is using ECDSA, but I don't understand how it works 【发布时间】:2021-12-28 11:41:58 【问题描述】:

在 MekaVerse 的智能合约中,我可以看到这些行来启用白名单,但我不了解其背后的理论以及如何使用它。

function mint(uint256[] memory _tokensId, uint256 _timestamp, bytes memory _signature) public payable saleIsOpen 

    uint256 total = totalToken();
    require(_tokensId.length <= 2, "Max limit");
    require(total + _tokensId.length <= MAX_ELEMENTS, "Max limit");
    require(msg.value >= price(_tokensId.length), "Value below price");

    address wallet = _msgSender();

    address signerOwner = signatureWallet(wallet,_tokensId,_timestamp,_signature);
    require(signerOwner == owner(), "Not authorized to mint");

    require(block.timestamp >= _timestamp - 30, "Out of time");

    for(uint8 i = 0; i < _tokensId.length; i++)
        require(rawOwnerOf(_tokensId[i]) == address(0) && _tokensId[i] > 0 && _tokensId[i] <= MAX_ELEMENTS, "Token already minted");
        _mintAnElement(wallet, _tokensId[i]);
    



function signatureWallet(address wallet, uint256[] memory _tokensId, uint256 _timestamp, bytes memory _signature) public view returns (address)

    return ECDSA.recover(keccak256(abi.encode(wallet, _tokensId, _timestamp)), _signature);


我不明白的有趣部分在这里:

address signerOwner = signatureWallet(wallet,_tokensId,_timestamp,_signature);
require(signerOwner == owner(), "Not authorized to mint")

这里:

function signatureWallet(address wallet, uint256[] memory _tokensId, uint256 _timestamp, bytes memory _signature) public view returns (address)

return ECDSA.recover(keccak256(abi.encode(wallet, _tokensId, _timestamp)), _signature);

感谢您的帮助, 本

【问题讨论】:

【参考方案1】:

MekaVerse 合约使用 OpenZeppelin ECDSA 实现,特别是它的 recover() 函数。 ECDSA 代表“椭圆曲线数字签名算法”,基本上,它允许使用私钥对消息进行签名,并在不提供私钥的情况下检查签名的有效性。

在这种情况下,recover() 函数采用 2 个参数:bytes32(32 字节数组)hash 签名消息,bytes(动态长度字节数组)signature。然后根据 ECDSA 验证 hashsignature 是否匹配。如果是,则返回签名者地址。如果验证失败,则返回零地址(0x0)。

请注意,签名是使用私钥签署消息的结果 - 但它不是私钥。

您可以在sign() 函数的 web3 文档中了解有关签署消息的更多信息。如果您对 ECDSA(或一般的密码学)更感兴趣,wiki page 会显示一些基本信息和其他来源的链接。

【讨论】:

以上是关于MekaVerse NFT 智能合约正在使用 ECDSA,但我不明白它是如何工作的的主要内容,如果未能解决你的问题,请参考以下文章

揭秘:NFT智能合约到底都干了什么?

手把手教你区块链java开发智能合约nft-第五篇(铸造第一个NFT)

如何判断 RSK 上的智能合约是不是为 NFT?

第124篇 NFT市场智能合约

哪些信息持有 NFT?

手把手教你区块链java开发智能合约nft-第一篇