Solidity之函数

163 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

函数的声明

关键字是function,和js类似,如下简单的声明一个函数

// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.8.7;//0.8.12

contract SimpleStorage {

    uint256 favouriteNumber;
   
   function store(uint256 _favoriteNumber){
       favouriteNumber=_favoriteNumber;
   }

}

如上声明了一个store的函数,接收一个uint256类型的值,然后赋值给我们声明的变量favouriteNumber。

函数的调用

函数的调用之前,我们得先部署这个合约,通过remix的环境部署,如果用上面这个合约编译会报下面的错误。

image.png

这个意思是要指明变量的可见性,按照提示,我们可以声明为public

image.png 如图加上,即可编译通过。

image.png

点击部署按钮,出现如下图日志,表示部署成功

image.png 部署完会出现合约地址,还有这个日志,包括了交易的各种信息,就是我们之前所说的交易详情里的那些字段都有。

image.png

最后点击部署的合约展开能看到下面的方法

image.png

我们在这里可以对合约的方法进行测试了,输入一个值20,点击橘黄色的store按钮,那么将会给我们这个合约的变量赋上一个值20,

image.png 同时可以看到对应的交易记录产生,点击变量favouriteNumber,就能读取到20,因为声明为public的变量默认都会有一个getter函数,返回对应的变量的值。

区块链中交易分为写入和读取,一旦涉及写入状态的操作,都是要花费gas的,所以要非常小心,写入的数据越多,做越多的操作,花费的gas越大,因此在区块链中,内存是很珍贵的。相反的只是读取状态是不用消耗gas。

函数的可见性

public 在合约外部和内部都可见。

private 只有合约内部可以使用。

external 只对合约外部可见。

internal 只对合约内部可见,只有合约内部或者继承它的合约可以读取。

不消耗gas的关键字

 function retrieve() public view returns(uint256){
       return favouriteNumber;
   }

solidity中存在2个关键字表示不会消耗gas,他们分别是view和pure。如果一个函数是view函数,意味着我们只会读取这个合约的状态,并且这个函数不允许修改任何状态。

pure函数也不允许修改状态,并且pure函数也不允许读取区块链数据,因此常用于一些计算结果。

但是注意的是如果一个需要改变状态的函数内部调用了view函数,那么它也是需要支付gas的。

总结

Solidity之函数跟js差不多的意思,就是封装对应的方法,书写我们的逻辑,这里我们介绍了函数的声明、调用、可见性的定义和区别。