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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • k8s ingress配置wss编排模板

    前段时间遇到了一个k8s配置websocket的问题 需要配置一下 由于wss比较安全 结合tls证书才能配置成功 如果是ws则无法在https的网站上面直接使用 wss才行 下面给出配置文件 希望帮助到需要的伙伴 配置一个新的单独为所有w

随机推荐

  • 【学习笔记】——appium移动端自动化测试实战

    最近学习了appium移动端自动化测试 以qq登录模块的功能进行实战学习 主要涉及到的技术有 python appium unittest 数据驱动 weditor查看元素定位 断言 测试报告 最后以pom模式呈现效果 在学习过程中 除了元
  • java类的静态变量调用_Java学习笔记八---类的静态变量与静态方法的访问与调用方式...

    静态变量又称类变量 静态方法又称类方法 它们统称为静态成员或类成员 静态成员由static修饰 是属于整个类的 所有的对象共享这些静态成员 不需要创建任何对象 静态成员在类装载时就已初始化了 整个运行期间其内存位置不变 直到类卸载 鉴于静态
  • apache 插件开发之过滤器 (filter)

    过滤器 filter A filter is a process that is applied to data that is sent or received by the server Data sent by clients to
  • Unity实现Camera和Audio数据的低延迟RTMP推送技术探讨

    关于Unity实现RTMP直播推送技术方案 之前零散的写过几篇介绍 得到了好多开发者的关注 以Android平台为例 目前视频这块 我们demo实现的是Camera数据的采集 然后编码投递到底层 如果设备没有性能瓶颈 可达到高帧率 60帧
  • 自动化测试的类型​以及自动化测试的几个误区!

    有三种主要类型的自动化测试 一 自动化单元测试 编辑 自动化单元测试在代码级别上进行测试 bug是在开发人 员编写的函数 方法和例程中识别出来的 一些公司要求开发人员自己进行单元测试 而有些公司则雇用专门的测试自动化资源 这些资源可以访问源
  • 2021最新Apache漏洞分析

    漏洞简介 2021年9月16日 Apache官方发布了Apache httpd mod proxy SSRF漏洞CVE 2021 40438 影响v2 4 48及以下版本 该漏洞影响范围较广 危害较大 利用简单 不得不引起重视 漏洞搭建 d
  • R for data science 之 stringr包

    作者简介Introduction 邬书豪 车联网数据挖掘工程师 R语言中文社区专栏作者 微信ID wsh137552775 知乎专栏 https www zhihu com people wu shu hao 67 activities 往
  • C语言 —— 合并两个有序数组

    C语言解决数组相关问题 合并有序数组 一 问题描述 二 解题思路 三 图文描述 四 代码展示 一 问题描述 给定两个有序整形数组arr1 和 arr2 将arr1 与 arr2合并或者有序输出成为一个有序数组 二 解题思路 1 给定的是两个
  • 16_Nginx_http请求处理的11个阶段

    文章目录 http 请求处理时的11个阶段 11个阶段的顺序处理 http 请求处理时的11个阶段 post read realip server rewrite rewrite find config rewrite rewrite po
  • 动力节点王鹤SpringBoot3笔记——第五章 说说Web服务

    目录 第五章 说说Web服务 5 1 高效构建Web应用 5 1 1 html页面视图 5 1 2 JSON视图 5 1 3 给项目加favicon 5 2 Spring MVC 5 2 1 控制器Controller 5 2 1 1 匹配
  • Oracle的大字段Clob类型的查询,Clob转为varchar展示

    1 Oracle中将clob字段数据转化为字符串 借鉴学习地址 Oracle的CLOB大数据字段类型 Grand Jon 博客园 查询 将CLOB转成字符类型 采用 dbms lob substr 查询 将CLOB转成字符类型 SELECT
  • 亚稳态学习小结

    亚稳态学习小结 一 亚稳态是什么 要知道亚稳态的定义 首先要知道时钟上升沿采样中的建立时间 setup time 和保持时间 hold time 1 1 建立时间 Tsu 保持时间 Th 建立时间 在触发器时钟上升沿到来之前 数据需要保持稳
  • xssgame靶场通关记录

    文章目录 靶场地址 第一关 第二关 第三关 第四关 第五关 第六关 第七关 第八关 html编码绕过 第九关 href属性js伪协议 第十关 第十一关 第十二关 第十三关 第十四关 Angular JS 第十五关 url编码 靶场地址 国光
  • UI设计原则背后的认知心理学 优漫动游

    了解人的感官和大脑是如何工作的 去衡量及判断那些设计原则更靠谱 UI设计师需要确定哪个设计原则更适用于给定的环境 从而优选应用 UI设计师必须深思熟虑 而不是盲目的应用设计原则 应该理解其基本原则并有过应用经验的人来使用和诠释 UI设计原则
  • vue3中使用echarts实现自定义纹理3d地图

    效果图 npm下载echarts 在main文件中全局引入 npm install echarts S import as Echarts from echarts app config globalProperties Echarts E
  • 使用htmlWebpackPlugin添加代码版本信息

    不知道你是不是这样的场景哈 或者曾经是 你提交完代码 部署然后测试去测 测试说你这个bug改了吗 怎么还是一样 然后你就纳闷 改过了啊代码也提交了 然后你自己去点一遍验证提交的代码有没有部署上去 这是一个痛点 可能也都习惯了哈 其实 这里有
  • OrCAD Capture学习笔记

    1 OrCAD Capture文件类型 OrCAD Capture是Cadence公司用来进行原理图绘制的一个EDA软件 能用这个软件打开的常用的几个文件后缀名为 dsn opj olb lib net 这些文件后缀具体表示的意思如下 这些
  • php 万能密码,网络安全系列之十 万能密码登录网站后台

    在登录网站后台时 有一个比较古老的 万能密码 漏洞 即利用一个我们精心构造的用户名 即使不用输入密码 也可以登录后台 其原理仍属于SQL注入的范畴 假设数据库中存放用户信息的表是admin 其中存放用户名的字段是username 存放密码的
  • git报错ssh: connect to host github.com port 22: Connection timed out

    碰到了git拉代码时报出的一个错误 通过查阅资料尝试了几种方法之后解决了 在这做个记录 首先需要检查一下SSH是否能够连接成功 输入以下命令 ssh T git github com 若还是报这个错ssh connect to host g
  • Solidity中的pure和view修饰符的区别是什么?什么时候添加pure和view修饰符?

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