gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:34:57 26 4
gpt4 key购买 nike

在 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);

谢谢你的帮助,本

最佳答案

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

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

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

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

关于solidity - MekaVerse NFT 智能合约正在使用 ECDSA,但我不明白它是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70005355/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com