函数类型

函数也是一种类型(值类型),它是函数的调用方式。函数类型可以被赋值吗,作为参数和返回结果。函数可以分为两类:内部函数(Internal)和外部函数(External)。

  • 内部函数Internal(默认)
    只能在当前合约内被调用(在当前的代码块内,包括内部库函数,和继承的函数中)。
  • 外部函数External
    由地址和函数方法签名两部分组成,可作为外部函数调用的参数,或返回值。
function (<parameter types>) {internal|external} [pure|constant|view|payable] [returns (<return types>)]

external调用时,实际是向目标合约发送一个消息调用。消息中的函数定义部分是24字节大小的消息体。其中20字节为地址,4字节为函数签名。

有两个方式访问函数,一种是直接用函数名a(), 一种是this.a(), 前者用于内部函数,后者用于外部函数。

pragma solidity ^0.4.0;contract Test {function a() public {} function b() external {}function c() public {a();//b();//编译报错,不允许在合约的内部调用一个外部的函数.this.b();}}

函数可见性分析

函数的可见性,表明了函数的可以被访问的级别。

  • public(默认)
    public的函数既允许以internal的方式调用,也允许external的方式调用。
    public函数由于被外部合约访问,是合约对外接口的一部分。
  • private
    只能在当前函数中被调用。这禁止了其它合约的访问和修改数据。
  • internal
    只能在当前的合约或者继承的子孙合约中,只允许以internal的方式调用。
  • external
    仅能够被外部合约调用。在内部合约访问时,也只能用外部访问方式访问。
pragma solidity ^0.4.0;contract Test {uint[10] arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];//内部类型函数function a(uint[10] x) public returns(uint) {return x[9] * 2;} //外部类型函数function b(uint[10] x) external returns(uint) {return x[9] * 2;}function c() public {a(arr);}function d() public {this.b(arr);}}

运行代码。观察分析耗费的gas值。

transact to Test.a pending ... execution cost     491 gas transact to Test.b pending ... execution cost     317 gas transact to Test.c pending ... execution cost     2934 gas transact to Test.d pending ... execution cost     4705 gas

a()和b()比较,可以发现:public函数开销更大。
为什么?
当使用public 函数时,Solidity会立即复制数组参数数据到内存, 而external函数则是从calldata读取,而分配内存开销比直接从calldata读取要大的多。
那为什么public函数要复制数组参数数据到内存呢?是因为public函数可能会被内部调用,而内部调用数组的参数是当做指向一块内存的指针。
对于external函数不允许内部调用,它直接从calldata读取数据,省去了复制的过程。

所以,如果确认一个函数仅仅在外部访问,请用external。

c()和d()比较,可以发现:d()的开销要大。
它采用了this.b()的方法去调用当前合约的内部函数,会有一个大开销的CALL调用,并且它传参的方式也比内部传递开销更大。

因此,当需要内部调用的时候,请用public。

类比Java

  • Java:
作用域 当前类 同一package 子孙类 其他package
public
protected x
default x x
private x x x
  • Solidity:
作用域 当前合约 子孙合约 外部合约
public
private x x
internal x
external x (可以this方式访问) x

参考文档

Solidity官方文档-类型

Solidity的函数类型以及可见性分析(类比Java)相关推荐

  1. 【Kotlin】Kotlin 中使用 Lambda 表达式替代对象表达式原理分析 ( 尾随 Lambda - Trailing Lambda 语法 | 接口对象表达式 = 接口#函数类型对象 )

    文章目录 一.尾随 Lambda - Trailing Lambda 语法 二.Kotlin 中使用 Lambda 表达式替代对象表达式原理 1.Lambda 替换对象表达式 2.原理分析 3.示例分 ...

  2. 【Kotlin】函数类型 ( 函数类型 | 带参数名称的参数列表 | 可空函数类型 | 复杂函数类型 | 带接收者函数类型 | 函数类型别名 | 函数类型实例化 | 函数调用 )

    文章目录 I . 函数类型 II . 带参数名的参数列表 III . 可空函数类型 IV . 复杂函数类型解读 V . 函数类型别名 VI . 带 接收者类型 的函数类型 VII . 函数类型实例化 ...

  3. 9.IDA-重新设置函数类型、创建数组结构

    1.重新设置函数类型 写一个简单的代码做测试: [cpp] view plaincopy int fun(int a, double b) { return 0; } int _tmain(int a ...

  4. 【Solidity】3.类型 - 深入理解Solidity

    索引 [Solidity]1.一个Solidity源文件的布局 [Solidity]2.合约的结构体 [Solidity]3.类型 [Solidity]4.单位和全局可变量 [Solidity]5.表 ...

  5. Java 可重入锁内存可见性分析

    转载自 深度好文 | Java 可重入锁内存可见性分析 一个习以为常的细节 之前在做 ReentrantLock 相关的试验,试验本身很简单,和本文相关的简化版如下:(提示:以下代码均可左右滑动) p ...

  6. python函数定义与参数_Python函数的定义方式与函数参数问题实例分析

    本文实例讲述了Python函数的定义方式与函数参数问题.分享给大家供大家参考,具体如下: 涉及内容: 函数的定义方式 函数的文字描述 空操作语句 位置参数 默认参数 关键参数 可变长度参数 函数的定义 ...

  7. java玩转区块链-基础篇-solidity语法-基础类型

    java玩转区块链-基础篇-solidity语法-基础类型 java环境配置 代码准备 maven 完整solidity 执行步骤 基础类型 布尔类型 类型标识: 字面常量值: 运算符: 短路规则: ...

  8. 使用typedef语句定义函数类型和函数指针

    首先我们要先明白一个概念,函数名是不是指针?也就是说一个函数名可不可以代表一个地址?以及什么是函数类型? 经过查找,函数名就是一个指针,但是意义是不一样的,如同于数组a[],a和&a其实都是一 ...

  9. 函数类型和函数指针类型

    在C语言中,函数也是一种类型,可以定义指向函数的指针.我们知道,指针变量的内存单元存放一个地址值,而函数指针存放的就是函数的入口地址(位于.text段).下面看一个简单的例子: #include &l ...

最新文章

  1. Visual Studio UML Use Case Diagram(2)
  2. 三十一、MySQL 及 SQL 注入
  3. metasploit 目录结构
  4. 建立Full Trust的Browser Application
  5. [转载]AxureRP 7.0部件详解(一)
  6. 《天天数学》连载45:二月十四日
  7. Python中列表的增、删、改、查、排序
  8. Spring Boot 你为什么这么耗内存?
  9. Win11、Linux 双系统安装方法
  10. 深度学习之CNN反向传播
  11. 计算机处理器(CPU)基础
  12. 使用sikuli测试web网页实例
  13. Python爬虫-爬取开心网主页(有登录界面-利用cookie)
  14. nginx配置-优化静态资源
  15. oracle 会话数上不去_(一)UDS诊断服务中的诊断会话控制(DiagnosticSessionControl,0x10)...
  16. Linux无线AP隔离功能分析
  17. MySQL必知必会(1)
  18. 达梦数据库使用小记录【关于 无效的列】
  19. ****you do not have the permissions necessary t...
  20. 闲人闲谈PS之五——项目型企业核算方式选择

热门文章

  1. fcntl的详细使用
  2. Vue3 的状态管理库(Pinia)
  3. 长城wifi服务器没响应,wifi设置网站进不去怎么办,教你一招轻松解决
  4. 每日新闻摘要:TrueCaller的隐私含义
  5. 超越Excel,使用Python进行数据分析!
  6. 机器学习案例(十二):花卉识别
  7. QIIME 2教程. 06沙漠土壤分析AtacamaSoil(2021.2)
  8. 笔记本cpu温度多少算正常
  9. 第10章 网络安全技术
  10. 足下教育日精进自动提交