当前位置: 首页 > article >正文

Solidity入门: 函数

函数

Solidity语言的函数非常灵活,可以进行各种复杂操作。在本教程中,我们将会概述函数的基础概念,并通过一些示例演示如何使用函数。

我们先看一下 Solidity 中函数的形式:

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

在这里插入图片描述

到底什么是 Pure 和View?

刚开始学习 solidity 时,pure 和 view 关键字可能令人费解,因为其他编程语言中没有类似的关键字。solidity 引入这两个关键字主要是因为 以太坊交易需要支付气费(gas fee)。合约的状态变量存储在链上,gas fee 很贵,如果计算不改变链上状态,就可以不用付 gas。包含 pure 和 view 关键字的函数是不改写链上状态的,因此用户直接调用它们是不需要付 gas 的(注意,合约中非 pure/view 函数调用 pure/view 函数时需要付gas)。

在以太坊中,以下语句被视为修改链上状态:
在这里插入图片描述
在这里插入图片描述

练习代码

1. pure 和 view

我们在合约里定义一个状态变量 number,初始化为 5。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;
contract FunctionTypes{
    uint256 public number = 5;
}

定义一个 add() 函数,每次调用会让 number 增加 1。

// 默认function
function add() external{
    number = number + 1;
}

如果 add() 函数被标记为 pure,比如 function add() external pure,就会报错。因为 pure 是不配读取合约里的状态变量的,更不配改写。那 pure 函数能做些什么?举个例子,你可以给函数传递一个参数 _number,然后让他返回 _number + 1,这个操作不会读取或写入状态变量。

在这里插入图片描述
如果 add() 函数被标记为 view,比如 function add() external view,也会报错。因为 view 能读取,但不能够改写状态变量。我们可以稍微改写下函数,读取但是不改写 number,返回一个新的变量。


// view: 看客
function addView() external view returns(uint256 new_number) {
    new_number = number + 1;
}

在这里插入图片描述

2. internal v.s. external

// internal: 内部函数
function minus() internal {
    number = number - 1;
}

// 合约内的函数可以调用内部函数
function minusCall() external {
    minus();
}

我们定义一个 internal 的 minus() 函数,每次调用使得 number 变量减少 1。由于 internal 函数只能由合约内部调用,我们必须再定义一个 external 的 minusCall() 函数,通过它间接调用内部的 minus() 函数。

在这里插入图片描述

3. payable

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

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

在这里插入图片描述

总结

在这一讲,我们介绍了 Solidity 中的函数。pure 和 view 关键字比较难理解,在其他语言中没出现过:view 函数可以读取状态变量,但不能改写;pure 函数既不能读取也不能改写状态变量。

所有代码

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

contract functionTypes{
    uint256 public number = 5;

    function add() external{
    number = number +1;
    }

    function addPure(uint256 _number) external pure returns (uint256 new_number){
        new_number = _number+1;
    }

    //view:看客
    function addView() external view returns (uint256 new_number){
        new_number = number+1;
    }
    // intarnal:内部函数
    function minus() internal{
        number = number -1;
    }

    // 合约内的函数可以调用内部函数

    function minusCall() external {
        minus();
    }

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

}




http://www.kler.cn/a/502059.html

相关文章:

  • python检测gitlab中某个标签在一个月内添加和移除了多少次
  • 【深度学习入门_基础篇】概率论
  • Java QueryWrapper groupBy自定义字段,以及List<Map>转List<Entity>
  • Git撤销指定commit并更新远端仓库
  • 【开发日记】Docker修改国内镜像源
  • docker-compose方式部署单机版RocketMQ
  • 小程序自定义底部tabbar,并且解决遮罩层无法遮挡住底部tabbar问题
  • type 属性的用途和实现方式(图标,表单,数据可视化,自定义组件)
  • 《零基础Go语言算法实战》【题目 2-8】defer 和 return 语句
  • 逆向分析的小短文
  • 6Hive Sql 大全-Hive 函数
  • 【MySQL】基础语法详解:SELECT, INSERT, UPDATE, DELETE轻松上手
  • leetcode(hot100)10、11、12
  • 【HTML+CSS+JS+VUE】web前端教程-29-清除浮动
  • Spring Data Elasticsearch简介
  • 鸿蒙UI开发——颜色选择器
  • 【Ubuntu与Linux操作系统:七、系统高级管理】
  • 【论文速读】| 利用大语言模型在灰盒模糊测试中生成初始种子
  • Django Admin 中为自定义操作添加权限控制
  • Folder Icons v2.0.2 文件/文件夹图标美化 支持M、Intel芯片
  • 【南京工业大学主办 | JPCS独立出版 | 高届数、会议历史好 | 投稿领域广泛】第八届智能制造与自动化国际学术会议(IMA 2025)
  • Rank-Analysis——LOL 排位战绩查询分析器
  • 【LeetCode: 763. 划分字母区间 + 贪心】
  • Bash语言的语法糖
  • 对React中类组件和函数组件的理解?有什么区别?
  • ansible 检查目录大小