我是靠谱客的博主 勤恳歌曲,这篇文章主要介绍[solidity入门】3. 函数类型 Function Type,现在分享给大家,希望可以做个参考。

Solidity中的变量类型

数值类型 Value Type

此类变量赋值时直接传递数值:布尔型、整数型……

引用类型 Reference Type

此类变量占空间大,赋值时直接传递地址(类似指针):数组、结构体

映射类型 Mapping Type

solidity中的哈希表

函数类型 Function Type

solidity文档中将函数类型归为数值类型(课程作者认为其差别较大故单独分类)

Function Type

函数形式

复制代码
1
2
3
4
// solidity中的函数形式 function <funtion name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns(<return types>)] // 方括号内是可写可不写的关键字
  1. function:声明函数时的固定用法,写函数就要以function开头
  2. <function name>:函数名
  3. (<parameter types>) :圆括号里为函数的参数,即要输入到函数的变量类型和名字
  4. {internal | external | public | private} :函数可见性说明符,共4种

——没标明函数类型的默认internal

——public:内部外部均可见(也可用于修饰变量,public变量会自动生成getter函数,用于查询数值

——private:只能从合约内部访问,继承的合约也不能用(也可用于修饰状态变量)

——external:只能从合约外部访问(但可用”this.f() “调用,”f“是函数名)

——internal:只能从合约内部访问,继承的合约可以用(也可用于修饰状态变量)

      5. [pure | view | payable] :决定函数权限/功能的关键字

——payable:可支付的,运行时可以给合约转入ETH

——pure与view见下方

      6. [returns ()] :函数返回的变量类型和名称

pure与view

  1. 别的语言没有类似的pure与view的关键字,课程作者认为solidity加入它们是因为gas fee

——合约的状态变量存储在链上,gas fee很贵,如果不改变链上状态,就不用付gas

——包含pure与view关键字的函数是不改写链上状态的,因此用户调它们不用付gas

——合约中非pure/view函数调用它们则会改写链上状态,需要付gas

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

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

      3. 教程作者用马里奥做了一个很有趣的比喻:

——碧池公主:看作存储在链上的合约中的状态变量 (state variables in solidity contract)

——小怪:看不到也摸不到公主,包含pure关键字的函数,不能读取也不能写入存储在链上的状态变量(pure:cannot read or write)

——马里奥:只能看到公主但得不到,view可以理解为“看客”,包含view关键字的函数,能读取但不能写入状态变量(view:can read but not write)

——boss:可以拥有公主,不写pure也不写view,即函数既可以读取也可以写入状态变量(can read and write)

pure与view的代码

  1. 在合约里定义一个状态变量 number = 5
复制代码
1
2
3
4
5
6
// SPDX-License-Identifier:MIT pragma solidity ^0.8.4; contract FunctionTypes{ uint256 public number = 5; }

     2. 定义一个 add () 函数,每次调用,每次给 number + 1

复制代码
1
2
3
4
function add() external{ number = number + 1; }

     3. 如果 add () 包含了pure关键字,如:function add () pure external,就会报错,因为pure不读取合约的状态变量更不改写

     4. 那pure可以做什么呢?可以给函数传递一个参数_number,然后让它返回_number1

复制代码
1
2
3
4
5
// pure function addPure(uint256 _number)external pure returns(uint256 new_number){ new_number = _number + 1; }

Example: WTF-Solidity/3-3.png at main · AmazingAng/WTF-Solidity · GitHub

     5. 如果add()包含view,如:function add () view external,也会报错,因为view能读取但不能改写状态变量

     6. 可以稍微改写一下方程,让它不改写number,而是返回一个新的变量

复制代码
1
2
3
4
5
// view function addView() external view return(uint256 new_number){ new_number = number + 1; }

Example: WTF-Solidity/3-4.png at main · AmazingAng/WTF-Solidity · GitHub

internal vs. external代码

复制代码
1
2
3
4
5
6
// internal:内部 function minus() internal { number = number - 1; } // 定义一个internal的minus()函数,每次调用时number变量减1
复制代码
1
2
3
4
5
6
7
// 合约内的函数可以调用内部函数 function minusCall() external { minus(); } // 由于internal只能由合约内部调用,而外部不能 // 因此必须在定义一个external的minusCall()函数,可以间接调用内部的minus()

Example: WTF-Solidity/3-1.png at main · AmazingAng/WTF-Solidity · GitHub

payable代码

复制代码
1
2
3
4
5
6
7
8
9
// payable:递钱,能给合约支付eth的函数 function minusPayable() external payable returns(uint256 balance){ minus(); balance = address(this).balance; } // 定义一个 external payable 的 minusPayable() 函数,间接调用minus() // 且返回合约里的ETH余额(this关键字让我们引用合约地址) // 可以在调用 minusPayable() 时,往合约里转入1个ETH

Example: WTF-Solidity/3-2.png at main · AmazingAng/WTF-Solidity · GitHub

最后

以上就是勤恳歌曲最近收集整理的关于[solidity入门】3. 函数类型 Function Type的全部内容,更多相关[solidity入门】3.内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部