【链块技术40期】智能合约基础语言(四)——Solidity函数

本文详细介绍了Solidity中的函数定义、调用方式,包括internal和external调用、函数可见性(external、public、internal、private)、纯函数、只读函数、函数修改器、payable函数、回退函数以及构造函数等关键概念,帮助开发者更好地理解和应用智能合约。
摘要由CSDN通过智能技术生成

原文链接:智能合约基础语言(四):Solidity函数 下

 

一、目录

 

▪ 函数的定义

▪ 函数的调用方式

▪ 函数的可见性

▪ 函数修改器

▪ pure函数

▪ constant、view函数

▪ payable函数

▪ 回退函数

▪ 构造函数

▪ 函数参数

▪ 抽象函数

▪ 数学和加密函数

二、函数的定义

function关键字声明的,合约中的可执行单元,一个函数的完整定义如下:

 

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

三、函数的调用方式

Solidity封装了两种函数的调用方式internal(内部调用)和external(外部调用)。

3.1 internal(内部调用方式)

internal调用,实现时转为简单的EVM跳转,所以它能直接使用上下文环境中的数据,对于引用传递时将会变得非常高效(不用拷贝数据)。

在当前的代码单元内,如对合约内函数,引入的库函数,以及父类合约中的函数直接使用即是以internal方式的调用。我们来看个简单的例子:

 

pragma solidity ^0.4.24; contract Test {    
   function
f(){}        
   //以internal的方式调用    function
callInternally(){        f();    } }

在上述代码中,callInternally()以internal的方式对f()函数进行了调用。
简而言之,internal(内部调用方式)就是直接使用函数名去调用函数。

3.2 external(外部调用方式)

external调用,实现为合约的外部消息调用。所以在合约初始化时不能external的方式调用自身函数,因为合约还未初始化完成。下面来看一个以external方式调用的例子:

 

pragma solidity ^0.4.24; contract A{    
   function
f(){} } contract B{    
   //以external的方式调用另一合约中的函数    function
callExternal(A a){        a.f();    } }

虽然当前合约A和B的代码放在一起,但部署到网络上后,它们是两个完全独立的合约,它们之间的方法调用是通过消息调用。上述代码中,在合约B中的callExternal()以external的方式调用了合约A的f()。
简而言之,external(外部调用方式)就是使用合约实例名.函数名的方式去调用函数。

3.3 this

我们可以在合约的调用函数前加this.来强制以external方式的调用。

pragma solidity ^0.4.24;

contract A{   
    function f() external{}   
    
    function callExternally(){  
        this.f();
    }
}

3.4 调用方式说明

上面所提到的internal和external指的函数调用方式,请不要与后面的函数可见性声明的external,public,internal,private弄混。声明只是意味着这个函数需要使用相对应的调用方式去调用。

四、函数的可见性

Solidity为函数提供了四种可见性,external,public,internal,private。

4.1 external(外部函数)

▪ 声明为external的函数可以从其它合约来进行调用,所以声明为external的函数是合约对外接口的一部分。

▪ 不能以internal的方式进行调用。

▪ 有时在接收大的数据数组时性能更好。

pragma solidity ^0.4.24;

contract FuntionTest{    
     function externalFunc() external{}    

     function callFunc(){        
        //以`internal`的方式调用函数报错
        //
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值