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

news/2024/12/4 20:14:15/

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 费用、提高可重用性、优化性能和限制访问权限。这些函数提供了一种简单而有效的方式来定义不修改状态的函数。因此,在编写智能合约时,应该考虑使用这些函数来提高代码的可读性、可维护性和安全性,同时提高智能合约的执行效率和响应能力。


http://www.ppmy.cn/news/40448.html

相关文章

Vue——计算属性

目录 一、基础示例​ 二、计算属性缓存 vs 方法​ 三、可写计算属性​ 四、最佳实践​ Getter 不应有副作用​ 避免直接修改计算属性值​ 一、基础示例​ 模板中的表达式虽然方便&#xff0c;但也只能用来做简单的操作。如果在模板中写太多逻辑&#xff0c;会让模板变得臃…

SpringBoot + MyBatisPlus实现Yaml配置参数AES算法加密

文章目录SpringBoot MyBatisPlus实现Yaml配置参数AES算法加密1概述2 密钥加密3 Yaml参数配置4 使用方式SpringBoot MyBatisPlus实现Yaml配置参数AES算法加密 1概述 该功能为了保护数据库配置及数据安全&#xff0c;在一定的程度上控制开发人员流动导致敏感信息泄露。Mybati…

网络安全从业人员应该如何提升自身的web渗透能力?

前言 web 渗透这个东西学起来如果没有头绪和路线的话&#xff0c;是非常烧脑的。 理清 web 渗透学习思路&#xff0c;把自己的学习方案和需要学习的点全部整理&#xff0c;你会发现突然渗透思路就有点眉目了。 程序员之间流行一个词&#xff0c;叫 35 岁危机&#xff0c;&am…

归并排序(非递归实现) 计数排序

上一期我们说了归并排序的递归是如何实现的&#xff0c;但是递归如果层次太多的话容易栈溢出&#xff0c;所以我们还需要掌握非递归的实现&#xff0c;但是我们非递归需要如何实现&#xff1f; 下面我们就来看一下非递归的实现 归并排序的非递归实现他并不需要栈队列这些东西…

有趣的小知识(四)从基站到天线:深入了解如何优化网站速度的关键技术

一、全面认识基站 1.1 基站的定义 基站是一种通信设施&#xff0c;用于提供无线通信服务。它通常由一座塔、天线、收发信设备、电源和辅助设备等组成&#xff0c;可以与移动设备&#xff08;如手机、平板电脑等&#xff09;进行无线通信。基站是是无线终端(如手机)接入互联网…

IDEA虚拟机参数配置【自我总结】

idea内存溢出问题 最近自己在跑一个大一点的微服务项目时候,发生了这样的一个现象,就是启动idea的时候,首先发现电脑的CPU小风扇急速的飞转,电脑的运行内存也快要飙升到100%了,而且最重要的是光是加载项目就加载了几分钟啊(我当时就炸锅锅)像下图一样,一直加载一直加载 想了想,…

Response输出字符流(中文乱码问题及解决办法)

目录代码中文乱码原因解决办法1. 获取流对象之前&#xff0c;设置流的编码&#xff0c;由默认编码ISO-8859-1设置为GBK2.告诉浏览器&#xff0c;服务器发送的消息体数据的编码。建议浏览器使用该编码解码3.更简便的方法&#xff08;重点&#xff09;最终代码代码 步骤 获取字符…

DnCNN-pytorch版本代码运行环境配置

一、DnCNN-pytorch相关下载 (1)DnCNN-pytorch版本代码下载 https://download.csdn.net/download/qq_41104871/87457414 (2)GPU版本的torch0.4.1下载 https://download.csdn.net/download/qq_41104871/87658469 (3)相对应的torchvision0.2.1下载 https://download.csdn…