目录

Solidity数据类型之函数类型

solidity中函数的形式

java 复制代码
 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()。

java 复制代码
    // internal: 内部
    function minus() internal {
        number = number - 1;
    }

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

payable

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

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

我们可以在返回的信息中看到,合约的余额是1 ETH。

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
代码的乐趣19 分钟前
支持selenium的chrome driver更新到135.0.7049.42
chrome·python·selenium
SsummerC3 小时前
【leetcode100】数组中的第K个最大元素
python·算法·leetcode
伊玛目的门徒3 小时前
解决backtrader框架下日志ValueError: I/O operation on closed file.报错(jupyternotebook)
python·backtrader·量化·日志管理·回测
java1234_小锋4 小时前
一周学会Pandas2 Python数据处理与分析-编写Pandas2 HelloWord项目
python·pandas·python数据分析·pandas2
凯强同学5 小时前
第十四届蓝桥杯大赛软件赛省赛Python 大学 C 组:7.翻转
python·算法·蓝桥杯
独好紫罗兰8 小时前
洛谷题单3-P1217 [USACO1.5] 回文质数 Prime Palindromes-python-流程图重构
开发语言·python·算法
1alisa8 小时前
Pycharm v2024.3.4 Windows Python开发工具
ide·python·pycharm
独好紫罗兰8 小时前
洛谷题单2-P1424 小鱼的航程(改进版)-python-流程图重构
开发语言·python·算法
萧大侠jdeps8 小时前
主流Web3公链的核心区别对比
区块链
程序员小赵同学8 小时前
AI Agent设计模式二:Parallelization
开发语言·python·设计模式