作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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 验证 hash
和 signature
是否匹配。如果是,它返回签名者地址。如果验证失败,则返回零地址 (0x0
)。
请注意,签名是使用私钥对消息进行签名的结果 - 但它不是私钥。
您可以在 sign() 的 web3 文档中了解有关签名消息的更多信息功能。如果您对更深入的 ECDSA(或一般密码学)感兴趣,wiki page显示一些基本信息和其他来源的链接。
关于solidity - MekaVerse NFT 智能合约正在使用 ECDSA,但我不明白它是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70005355/
我是一名优秀的程序员,十分优秀!