首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修饰符与专用函数

问修饰符与专用函数
EN

Ethereum用户
提问于 2022-10-28 12:46:50
回答 3查看 226关注 0票数 1

有人建议我使用私有函数而不是修饰符,因为“私有方法在构建契约时不会占用额外的空间,而且修饰符就像宏一样”。如本例所示:

而不是

代码语言:javascript
复制
modifier onlyOwner {
    require(msg.sender == owner);
    _;
}

使用

代码语言:javascript
复制
function onlyOwner() private {
    require(msg.sender == owner);
}

这是真的吗?因为我在许多合同中看到,修饰符通常用于将函数仅限于所有者。另外,这种改性剂的性价比私人功能贵吗?

EN

回答 3

Ethereum用户

发布于 2023-04-26 09:43:23

我读了你的问题和下面的答复,我相信你的问题还没有得到真正的回答。

这是我对你问题的答复

有人建议您选择私有函数而不是修饰符的原因之一是:

用私有函数替换修饰符实际上有助于减少契约字节码大小

为什么-下面是

的一个快速解释

  1. 修饰符是内联展开的:
    • 当使用修饰符时,Solidity会将修饰符的整个代码复制到每个调用它的函数中。
    • 换句话说,Solidity编译器直接将修饰符代码添加到附加修饰符的函数中。这意味着修饰符代码成为函数的一部分,并包含在为该函数生成的字节码中。
    • 这在技术上意味着修饰符代码在使用修饰符的每个函数中都会被复制,这会增加契约字节码的大小。

  2. 私有函数只编写一次:相反,私有函数只编写一次,并且可以从合同中的多个地方调用,而不增加其大小。
    • 这使得它在不重复代码的情况下更有效地执行检查。

示例

  1. ModifierTest1st契约字节码为= 2324字符契约ModifierTest1st{地址公共所有者;构造函数(地址_owner){ owner = _owner;}修饰符onlyOwner(){ onlyOwner(所有者!=地址(0),“无效所有者”);_;}函数function_1()外部onlyOwner{ }函数function_2()外部onlyOwner{ }函数function_3()外部onlyOwner{ }
  2. ModifierTest2nd契约字节码仅为= 1804字符契约ModifierTest2nd{地址公共所有者;构造函数(地址_owner){ owner = _owner;}函数onlyOwnerPrivate()私有{ require(owner != address(0),“无效所有者”);}函数function_1()外部{ onlyOwnerPrivate();}函数function_2()外部{ onlyOwnerPrivate();}函数function_3()外部{ onlyOwnerPrivate();}}

,这是否意味着您应该避免使用修饰符?

哦,修饰符太棒了。他们坚持最佳实践,而且非常有帮助。如果你不避开他们会有帮助的。

事实上,如果您的合同相当小,并且非常低于24.576 kb的最大契约大小阈值,那么修饰符就不会是一个问题。

但是,考虑到在大型合同中应该多次使用检查/验证的场景,并且这不必要地增加了合同的大小,创建一个私有函数来执行检查通常是一个好主意。这可以帮助减少合同的规模,并有可能提高合同的性能。

对于这样庞大的契约,完全可以用私有函数替换修饰符,并为您可能想要添加的任何其他命令式函数节省一些空间。

票数 3
EN

Ethereum用户

发布于 2022-10-28 13:12:08

不,你在那里做的事是行不通的。占位符是只能与修饰符一起使用的语法。修饰符主要用于可读性。您可以调用在函数开始或结束时运行相同代码的内部函数。不要认为它会以任何方式影响气体,但不要引用我的话。

票数 1
EN

Ethereum用户

发布于 2023-05-05 12:25:47

添加到Zaryab的答案:您实际上可以使用两者在一个,并有两者的好处。

这意味着您可以从修饰符中调用私有函数。另外,您应该使用自定义错误,因为它们通常比require()更有效。

代码语言:javascript
复制
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() {
        // ...
    }
}
票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/138331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档