Solidity中的pure和view修饰符的区别是什么?什么时候添加pure和view修饰符?

这篇具有很好参考价值的文章主要介绍了Solidity中的pure和view修饰符的区别是什么?什么时候添加pure和view修饰符?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Solidity是一种用于编写智能合约的编程语言,它被广泛应用于以太坊区块链上的智能合约开发。在Solidity中,有两种函数修饰符,即“pure”和“view”,它们被用来指示函数的行为。这篇文章将深入探讨“pure”和“view”的含义,以及它们在Solidity中的应用。

什么是“pure”函数

“pure”是一种函数修饰符,它用于标识一个函数不会访问或修改合约的状态,并且不会与其他合约进行交互。在Solidity中,如果一个函数被声明为“pure”,则编译器将确保该函数仅依赖于其参数,并且不会在执行过程中改变任何状态。

下面是一个简单的“pure”函数的例子:

pragma solidity ^0.8.0;

contract MyContract {
    function add(uint256 a, uint256 b) public pure returns (uint256) {
        return a + b;
    }
}

在这个例子中,函数“add”被声明为“pure”。该函数不涉及合约的状态,也不与其他合约进行交互。因此,它被标识为“pure”。

使用“pure”函数有一些优点。首先,它们具有高度可预测性,因为它们不会受到合约状态的影响。这意味着它们总是会返回相同的结果,无论何时调用它们。此外,因为“pure”函数不会修改状态,它们也不会产生任何 gas 费用。

什么是“view”函数

与“pure”函数类似,“view”也是一种函数修饰符,它用于标识一个函数不会修改合约的状态。然而,“view”函数与“pure”函数的区别在于,“view”函数可以访问合约的状态,但不会修改它。

下面是一个使用“view”函数的例子:

pragma solidity ^0.8.0;

contract MyContract {
    uint256 public myNumber = 10;

    function doubleMyNumber() public view returns (uint256) {
        return myNumber * 2;
    }
}

在这个例子中,函数“doubleMyNumber”被声明为“view”。虽然它可以访问合约的状态(即“myNumber”变量),但它不会修改它。因此,它被标识为“view”。

使用“view”函数的优点与“pure”函数类似。因为它们不会修改状态,所以它们具有高度可预测性,并且不会产生任何 gas 费用。此外,因为它们可以访问合约状态,它们可以提供一些有用的信息,例如合约中存储的数据。

“pure”和“view”的应用

现在我们已经了解了“pure”和“view”的含义以及优点,接下来让我们来看一下它们在Solidity中的应用。

提高安全性

使用“pure”和“view”函数可以提高智能合约的安全性。因为这些函数不会修改合约的状态,所以它们无法对合约产生任何负面影响。这可以帮助防止合约遭受攻击,保证合约的正确性和安全性。

减少 gas 费用

使用“pure”和“view”函数还可以减少智能合约的 gas 费用。因为这些函数不会修改状态,所以它们不需要消耗 gas 来更新状态。这可以帮助减少合约的执行成本,使智能合约更具经济性。

提高可重用性

使用“pure”和“view”函数可以提高智能合约的可重用性。因为这些函数仅依赖于其参数,所以它们可以在多个合约中使用。这可以减少代码的重复性,并提高代码的可读性和可维护性。

优化性能

使用“pure”和“view”函数还可以优化智能合约的性能。因为这些函数不会修改状态,所以它们可以在不需要进行状态变更的情况下进行计算。这可以提高智能合约的执行效率,并使其更快速和响应。

限制访问权限

使用“pure”和“view”函数还可以限制访问权限。因为这些函数不会修改合约的状态,所以它们可以被声明为“external”,这意味着只有外部合约才能调用它们。这可以帮助保护合约的安全性,并防止内部合约进行未经授权的操作。

示例

下面是两个使用“pure”和“view”函数的示例。

例1:计算平方根

在这个示例中,我们将使用“pure”函数来计算数字的平方根。由于计算平方根不需要修改合约的状态,所以我们可以使用“pure”函数来定义该功能。

pragma solidity ^0.8.0;

contract Math {
    function sqrt(uint256 x) public pure returns (uint256) {
        uint256 z = x / 2 + 1;
        uint256 y = x;
        while (z < y) {
            y = z;
            z = (x / z + z) / 2;
        }
        return y;
    }
}

在上面的代码中,我们使用了“pure”函数来定义了一个名为“sqrt”的函数,该函数接受一个名为“x”的无符号整数参数,并返回一个无符号整数。该函数使用牛顿迭代法来计算数字的平方根,而不修改合约的状态。

例2:检查余额

在这个示例中,我们将使用“view”函数来检查用户的余额。由于检查余额不需要修改合约的状态,所以我们可以使用“view”函数来定义该功能。

pragma solidity ^0.8.0;

contract Bank {
    mapping (address => uint256) private balances;
    
    function getBalance(address account) public view returns (uint256) {
        return balances[account];
    }
}

在上面的代码中,我们使用了“view”函数来定义了一个名为“getBalance”的函数,该函数接受一个名为“account”的地址参数,并返回一个无符号整数。该函数使用一个名为“balances”的映射来存储每个账户的余额,并返回指定账户的余额,而不修改合约的状态。

结论

在Solidity中,使用“pure”和“view”函数可以提高智能合约的安全性、减少 gas 费用、提高可重用性、优化性能和限制访问权限。这些函数提供了一种简单而有效的方式来定义不修改状态的函数。因此,在编写智能合约时,应该考虑使用这些函数来提高代码的可读性、可维护性和安全性,同时提高智能合约的执行效率和响应能力。文章来源地址https://www.toymoban.com/news/detail-702593.html

到了这里,关于Solidity中的pure和view修饰符的区别是什么?什么时候添加pure和view修饰符?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Solidity 小白教程:11. 构造函数和修饰器

    这一讲,我们将用合约权限控制( Ownable )的例子介绍 solidity 语言中构造函数( constructor )和独有的修饰器( modifier )。 构造函数( constructor )是一种特殊的函数,每个合约可以定义一个,并在部署合约的时候自动运行一次。它可以用来初始化合约的一些参数,例如初始

    2024年04月17日
    浏览(33)
  • C# 中,接口和抽象类的区别,分别在什么时候使用

    在C#中,接口和抽象类都可用于创建可由子类实现和继承的规范。尽管它们有相似之处,但在使用场景和行为上存在显著差异。以下是你需要知道的接口和抽象类的区别以及它们各自的使用场景: 定义与目的 : 接口(Interface) :接口定义了一组方法的签名,但不包含方法的

    2024年01月20日
    浏览(42)
  • v-if 和 v-show的区别是什么? 什么时候使用v-if更好? 什么时候用v-show更好?

    v-show 是通过控制display属性来进行DOM的显示与隐藏,主要用于频繁操作; v-if 是真正意义上的条件渲染(销毁和创建元素),条件为true时创建DOM,条件为false时销毁DOM,主要用于大量数据渲染到页面(符合条件就将数据渲染),频繁使用会消耗性能。 性能区别: 1、v-if有更高

    2024年02月11日
    浏览(50)
  • 浅显易懂-Verilog中什么时候用wire?什么时候用reg?wire与reg只有又有啥区别?如何去选择性的使用呢?

    在使用FPGA的时候我们经常会遇到这样一个问题,这个信号我们到底是定义成wire类型还是定义成reg类型,如果定义不对编译软件也会通不过,有时候你通过编译软件的的提示将它改了回来,但你却并不明白是为什么会报错,而且下次还会再出现,当它再次出现时,我们又得重

    2024年02月04日
    浏览(36)
  • mysql中在一个表中新增字段的时候,使用alter table的时候,add和add column的区别是什么?

    在 MySQL 中使用 ALTER TABLE 语句来修改表结构,包括添加新的字段。**在 ALTER TABLE 语句中,可以使用 ADD 或 ADD COLUMN 来添加新的字段。**它们的区别主要在于语法上的不同,实际上 ADD 和 ADD COLUMN 是等价的,都可以用来添加新的字段。 在 MySQL 中,ADD 和 ADD COLUMN 两种

    2024年02月07日
    浏览(35)
  • go语言中的init() 函数是什么时候执行的?

    在main函数之前执行 init()函数是go初始化的一部分,由runtime初始化每个导入的包,初始化不是按照从上到下的导入顺序,而是按照解析的依赖关系, 没有依赖的包最先初始化 。   每个包首 先初始化包作用域的常量和变量 (常量优先于变量),然 后执行包的 init() 函数 。同

    2024年02月15日
    浏览(41)
  • 在Qt中List View和List Widget的区别是什么,以及如何使用它们

    2023年10月29日,周日晚上 目录 List View和List Widget的区别 如何使用QListView 如何使用QListWidget 在Qt中,QListView 和 QListWidget 是用于显示列表数据的两个常用控件,它们有一些区别和特点。 1. 数据模型:         QListView 使用 QAbstractItemModel 数据模型来管理和显示列表数据,而

    2024年02月08日
    浏览(45)
  • Django rest_framework Serializer中的create、Views中的create/perform_create的区别

    对于后端来说,前后端分离的方式能让前后端的开发都爽。和所有的爽一样,每爽一次都要付出一定的代价。而前后端分离的代价,就是后端要面对巨量的模块化的功能组件以及这些组件的常规用法与重写复用。有一点经验,关于[Django rest_framework ] Serializer 中的create()、 Vie

    2024年02月13日
    浏览(34)
  • 微信小程序scroll-view滑动的时候滑动到指定位置

    效果实现 1.滑动的时候调动滑动事件bindscroll=\\\"scroll\\\" scroll-with-animation 过渡动画 scroll-top=\\\"{{scrolltop}}\\\" 距离顶部多少高度 2.在调用scroll里面的事件函数 这里使用的是获取手机屏幕大小的宽度 res.screenWidth 来自适应头部悬浮的位置的显示与隐藏 opacity:( 1 - e.detail.scrollTop / 100 / 3).to

    2024年02月16日
    浏览(41)
  • MyBatis中的#和$有什么区别

    MyBatis是一款优秀的持久层框架,特别是在国内(国外据说还是 Hibernate 的天下)非常的流行,我们常说的SSM组合中的M指的就是MyBatis。 MyBatis支持定制化SQL、存储过程以及高级映射等多种特性,单纯从代码上来看,MyBatis避免了几乎所有的JDBC代码和手动设置参数以及手动处理结果

    2024年02月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包