Solidity constant view pure关键字的区别与联系

本文探讨了Solidity中constant、view和pure关键字的差异和联系。这些修饰词用于表明函数不会修改或读取状态变量,从而节省gas成本。在v4.17之前,只有constant,后来被view和pure取代。view允许读取状态变量但不允许修改,而pure则禁止读写状态变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Solidity中constant、view、pure三个函数修饰词的作用是告诉编译器,函数不改变/不读取状态变量,这样函数执行就可以不消耗gas了(是完全不消耗!),因为不需要矿工来验证。所以用好这几个关键词很重要,不言而喻,省gas就是省钱!

 

这三个关键词有什么区别和联系,简单来说,在Solidity v4.17之前,只有constant,后来有人嫌constant这个词本身代表变量中的常量,不适合用来修饰函数,所以将constant拆成了view和pure。view的作用和constant一模一样,可以读取状态变量但是不能改;pure则更为严格,pure修饰的函数不能改也不能读状态变量,否则编译通不过。

测试代码:

pragma solidity ^0.4.21;

contract constantViewPure{
    string name;
    uint public age;
    
    function constantViewPure() public{
        name = "liushiming";
        age = 29;
    }
    
    function getAgeByConstant() public constant returns(uint){
        age += 1;  //声明为constant,在函数体中又试图去改变状态变量的值,编译会报warning, 但是可以通过
        return age;  // return 30, 但是!状态变量age的值不会改变,仍然为29!
    } 
### Solidity 中 `virtual` 关键字的作用使用场景 #### 1. 定义可被重写的函数 在 Solidity 中,`virtual` 关键字用于标记一个函数可以被派生合约所重写。这类似于其他面向对象编程语言中的概念,比如 C++ 或 Java 的虚函数机制。只有当函数被显式地标记为 `virtual` 时,它才能在其子合约中被覆盖[^1]。 ```solidity contract Base { function foo() public virtual returns (string memory) { return "Base"; } } ``` 在此示例中,`foo()` 方法被声明为 `virtual`,因此任何继承自 `Base` 合约的子合约都可以对该方法进行重新定义。 #### 2. 使用 `override` 明确指定重写 为了增强代码的清晰性和安全性,在派生合约中重写父级的虚拟函数时,建议使用 `override` 关键字来表明意图。这是 Solidity 推荐的最佳实践之一,有助于防止意外的行为或错误。 ```solidity contract Child is Base { function foo() public override returns (string memory) { return "Child"; } } ``` 这展示了一个名为 `Child` 的新合约,该合约从 `Base` 继承而来并提供了自己的 `foo()` 实现版本。 #### 3. 支持多重继承下的复杂交互 当涉及到多个基类或者复杂的继承结构时,`virtual` 和 `override` 结合起来能够很好地管理不同层次间的相互关系。例如: ```solidity abstract contract InterfaceA { function bar() public virtual returns (string memory); } abstract contract InterfaceB { function bar() public virtual returns (string memory); } contract Implementation is InterfaceA, InterfaceB { function bar() public override(InterfaceA, InterfaceB) returns (string memory) { return "Implementation"; } } ``` 在这个例子中,两个独立接口都要求实现同一个名称的方法 `bar()` 。通过运用 `virtual` 及相应的 `override` 声明,我们可以满足这些需求而不引发冲突。 #### 4. 配合修饰符(Modifiers) 值得注意的是,虽然 Solidity 不允许修饰符本身被重载[^2] ,但是它们仍然能带有 `virtual` 属性的函数一起工作得很好。这意味着可以在不影响原有逻辑的前提下调整执行流程控制策略。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智能体格

你的鼓将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值