Solidity数据类型之函数类型

solidity中函数的形式

 function <function name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns (<return types>)]

每个关键字的意思(方括号里面的写不写都可以)

function: 声明函数时的固定用法,想写函数,就要以function关键字开头。
function name: 函数名
(parameter types): 圆括号里写函数的参数,就是要传到函数的变量类型和变量名字。
{internal|external|public|private}: 函数可见性说明符,一共4种。合约之外的函数,即"自由函数",始终具有隐含internal可见性。

  • public:内部外部均可见。
  • private:只能从本合约内部访问,继承的合约也不能用。
  • external:只能从合约外部访问(但是可以用this.f()来调用,f是函数名)。
  • internal:只能从合约内部访问,继承的合约可以用。(类似于java里面的private)

小提示

  • 如果没有标明可见性类型的函数,默认为public。
  • public|private|internal 也可用于修饰状态变量。 public变量会自动生成同名的getter函数,用于查询数值。
  • 没有标明可见性类型的状态变量,默认为internal。
    [pure|view|payable]: 决定函数权限/功能的关键字。payable(可支付的)很好理解,带着它的函数,运行的时候可以给合约转入ETH。
    [returns ()]: 函数返回的变量类型和变量名称。

什么是Pure和View

solidity加入这两个关键字,个人感觉是因为gas fee。合约的状态变量存储在链上,gas fee很贵,如果不改变链上状态,就不用付gas。包含pure跟view关键字的函数是不改写链上状态的,因此用户直接调用他们是不需要付gas的(合约中非pure/view函数调用它们则会改写链上状态,需要付gas)。

在以太坊中,以下语句被视为修改链上状态

  • 写入状态变量。
  • 释放事件。
  • 创建其他合约。
  • 使用selfdestruct。
  • 通过调用发送以太币。
  • 调用任何未标记view或pure的函数。
  • 使用低级调用(low-level calls)。
  • 使用包含某些操作码的内联汇编。

关于以太坊是什么这方面的内容我感觉这篇文章讲很好

以太坊是什么 - 以太坊开发入门指南

pure与view的作用

  • pure,中文意思是“纯”,在solidity里理解为“纯纯牛马”。包含pure关键字的函数,不能读取也不能写入存储在链上的状态变量。
  • view,“看”,在solidity里理解为“看客”。包含view关键字的函数,能读取但也不能写入状态变量
  • 不写pure也不写view,函数既可以读取也可以写入状态变量。
    在这里插入图片描述
    含有pure返回的是一个新的变量,_number是1,传入的new_number最后被加了1
    在这里插入图片描述
    如果add()包含view,比如function add() external view,也会报错。因为view能读取,但不能够改写状态变量。可以稍微改写下方程,让他不改写number,而是返回一个新的变量。

view函数可以读取状态变量,因此可以读取到number,返回的是number+1

在这里插入图片描述

internal v.s. external

minus()由于是internal,只能由合约内部调用,而外部不能。因此,我们必须再定义一个external的minusCall()函数,来间接调用内部的minus()。

    // internal: 内部function minus() internal {number = number - 1;}// 合约内的函数可以调用内部函数function minusCall() external {minus();}

在这里插入图片描述

payable

我们定义一个external payable的minusPayable()函数,间接的调用minus(),并且返回合约里的ETH余额(this关键字可以让我们引用合约地址)。 我们可以在调用minusPayable()时,往合约里转入1个ETH(设置转账数值)。
在这里插入图片描述

// payable: 递钱,能给合约支付eth的函数
function minusPayable() external payable returns(uint256 balance) {minus();    balance = address(this).balance;
}

我们可以在返回的信息中看到,合约的余额是1 ETH。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/161237.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全防御——二、ENSP防火墙实验学习

安全防御 一、防火墙接口以及模式配置1、untrust区域2、trust区域3、DMZ区域4、接口对演示 二、防火墙的策略1、定义与原理2、防火墙策略配置2.1 安全策略工作流程2.2 查询和创建会话 3、实验策略配置3.1 trust-to-untrust3.2 trust-to-dmz3.3 untrust-to-dmz 三、防火墙的区域…

c面向对象编码风格(上)

面向对象和面向过程的基本概念 面向对象和面向过程是两种不同的编程范式&#xff0c;它们在软件开发中用于组织和设计代码的方式。 面向过程编程&#xff08;Procedural Programming&#xff09;是一种以过程&#xff08;函数、方法&#xff09;为核心的编程方式。在面向过程…

【漏洞复现】Apache_HTTPD_多后缀解析漏洞

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞复现1、基础环境2、漏洞验证 1.3、深度利用GetShell 1.4、修复建议 1.1、漏洞描述 Apache HTTPD 支持一个文件拥有多个后缀&#xff0c;并为不同后缀执…

【安全】Java幂等性校验解决重复点击(6种实现方式)

目录 一、简介1.1 什么是幂等&#xff1f;1.2 为什么需要幂等性&#xff1f;1.3 接口超时&#xff0c;应该如何处理&#xff1f;1.4 幂等性对系统的影响 二、Restful API 接口的幂等性三、实现方式3.1 数据库层面&#xff0c;主键/唯一索引冲突3.2 数据库层面&#xff0c;乐观锁…

思维模型 霍布森选择效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。这是一个设计好的陷阱&#xff0c;也许你认为你有选择&#xff0c;然后冥冥之中你的选择却很少&#xff0c;尽在所谓的“命运”掌握之中。 1 霍布森选择效应的应用 1.1 iphone的营销策略之…

chrome好用的阅读工具【推荐】

1、插件名称&#xff1a;Circle 下载地址&#xff1a; circlereader.com/ Circle 可以提取网页中的内容信息&#xff0c;并进行重新排版&#xff0c;是浏览文章、新闻等内容的神器 看各大网站VIP &#xff1a; 2、油猴&#xff1a; 下载地址&#xff1a; https://www.tampe…

Docker Swarm实现容器的复制均衡及动态管理:详细过程版

Swarm简介 Swarm是一套较为简单的工具&#xff0c;用以管理Docker集群&#xff0c;使得Docker集群暴露给用户时相当于一个虚拟的整体。Swarm使用标准的Docker API接口作为其前端访问入口&#xff0c;换言之&#xff0c;各种形式的Docker Client(dockerclient in go, docker_py…

mermaid学习第一天/更改主题颜色和边框颜色/《需求解释流程图》

mermaid 在线官网&#xff1a; https://mermaid-js.github.io/ 在线学习文件&#xff1a; https://mermaid.js.org/syntax/quadrantChart.html 1、今天主要是想做需求解释的流程图&#xff0c;又不想自己画&#xff0c;就用了&#xff0c;框框不能直接进行全局配置&#xff0…

【Spring Security】Spring Security 认证过程源码分析

项目启动 我们在前面有了解到可以在application.yml中配置用户名密码,那么可以猜想:肯定是在项目启动的时候加载的,我们通过鼠标点击 进入SecurityProperties,我们在User中的getName上打断点,这样项目启动的时候就可以走到这里 之后我们通过点击:Drop Frame可以往回走进…

【带头学C++】----- 三、指针章 ---- 3.5 字符串与指针

在 C 中&#xff0c;字符串可以通过指针来表示和操作。C 的字符串是由字符组成的字符数组&#xff0c;而指针则用于引用和操作内存中的数据。 1. 字符数组 1. 字符数组: 字符数组是最基本的字符串表示方式。可以使用字符数组来存储字符串&#xff0c;并使用指针来引用它。字符…

若依笔记(三):权限控制与数据隔离

目录 数据隔离/权限控制 用户/权限/部门/岗位 ​数据隔离 mybatis的maaper写法 注解和切面 前端路由拦截 已知若依单体的前端采用vue-element-admin&#xff0c;在前端的专栏系列vue-element-admin的动态路由已详细拆解&#xff0c;其最大特点是使用后端返回数据控制前端…

[黑马程序员SpringBoot2]——运维实用篇

目录&#xff1a; 工程打包与运行打包插件Boot工程快速启动&#xff08;Linux版本&#xff09;临时属性配置文件4级分类自定义配置文件多环境开发(yaml版)多环境开发多文件版&#xff08;yaml版&#xff09;多环境开发多文件版&#xff08;properties版&#xff09;多环境分组…