有人建议我使用私有函数而不是修饰符,因为“私有方法在构建契约时不会占用额外的空间,而且修饰符就像宏一样”。如本例所示:
而不是
modifier onlyOwner {
require(msg.sender == owner);
_;
}使用
function onlyOwner() private {
require(msg.sender == owner);
}这是真的吗?因为我在许多合同中看到,修饰符通常用于将函数仅限于所有者。另外,这种改性剂的性价比私人功能贵吗?
发布于 2023-04-26 09:43:23
我读了你的问题和下面的答复,我相信你的问题还没有得到真正的回答。
这是我对你问题的答复
有人建议您选择私有函数而不是修饰符的原因之一是:
的一个快速解释
哦,修饰符太棒了。他们坚持最佳实践,而且非常有帮助。如果你不避开他们会有帮助的。
事实上,如果您的合同相当小,并且非常低于24.576 kb的最大契约大小阈值,那么修饰符就不会是一个问题。
但是,考虑到在大型合同中应该多次使用检查/验证的场景,并且这不必要地增加了合同的大小,创建一个私有函数来执行检查通常是一个好主意。这可以帮助减少合同的规模,并有可能提高合同的性能。
对于这样庞大的契约,完全可以用私有函数替换修饰符,并为您可能想要添加的任何其他命令式函数节省一些空间。
发布于 2022-10-28 13:12:08
不,你在那里做的事是行不通的。占位符是只能与修饰符一起使用的语法。修饰符主要用于可读性。您可以调用在函数开始或结束时运行相同代码的内部函数。不要认为它会以任何方式影响气体,但不要引用我的话。
发布于 2023-05-05 12:25:47
添加到Zaryab的答案:您实际上可以使用两者在一个,并有两者的好处。
这意味着您可以从修饰符中调用私有函数。另外,您应该使用自定义错误,因为它们通常比require()更有效。
contract Owner {
address public owner;
error NotOwner(address sender);
constructor (address _owner) {
owner = _owner;
}
modifier onlyOwner() {
checkOnlyOwner();
_;
}
function checkOnlyOwner() internal view {
if (msg.sender != owner) {
revert NotOwner(msg.sender);
}
}
function doSomethingAsOwner() public onlyOwner() {
// ...
}
}https://ethereum.stackexchange.com/questions/138331
复制相似问题