繁体   English   中英

OpenZeppelin 的可拥有合约 vs 需要 msg.sender

[英]OpenZeppelin's ownable contract vs require msg.sender

我目前正在通过 CryptoZombies 学习 solidity,我遇到了一个点,他们说,“setKittyContractAddress 是外部的”,所以任何人都可以调用它,这意味着任何调用 function 的人都可以更改 CryptoKitties 合约的地址。 并为所有用户破坏我们的应用程序。

我们确实希望能够在我们的合约中更新这个地址,但我们不希望每个人都能够更新它。

为了处理这样的情况,出现的一种常见做法是使合约成为可拥有的——这意味着它们有一个拥有特殊特权的所有者(你)。 这是 function:

function setKittyContractAddress(address _address) external {
kittyContract = KittyInterface(_address);
}

现在我的问题是,我们能否不只是为此目的使用 msg.sender。

我不太清楚该怎么做。

难道我们不能仅仅为了这个目的使用 msg.sender

这正是 OpenZeppelin Ownable在后台所做的。 通过一系列步骤,它设置owner变量,然后根据它验证msg.sender

modifier onlyOwner() {
    require(owner() == _msgSender(), "Ownable: caller is not the owner");
    _;
}

owner() function 返回当前所有者地址,而_msgSender() function 是msg.sender全局变量的包装器。

来源: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.5.0/contracts/access/Ownable.sol#L43

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM