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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:智能合约基础语言(四):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`的
### Solidity 智能合约实战示例项目教程 #### 创建一个简单的投票系统智能合约 为了展示如何构建和部署Solidity智能合约,下面将介绍一个简单却实用的例子——基于区块链的投票系统。 该系统的功能包括但不限于: - 添加候选人 - 投票给指定候选人 - 查询候选人的得票数 ```solidity // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Voting { struct Candidate { string name; uint voteCount; } mapping(uint => Candidate) public candidates; uint public candidatesCount; event votedEvent ( uint indexed _candidateId ); function addCandidate (string memory _name) private { candidatesCount++; candidates[candidatesCount] = Candidate(_name, 0); } constructor () { addCandidate("Alice"); addCandidate("Bob"); } function vote (uint _candidateId) public { require(_candidateId > 0 && _candidateId <= candidatesCount); candidates[_candidateId].voteCount++; emit votedEvent(_candidateId); } } ``` 此代码片段展示了如何利用结构体`struct`来存储候选人信息以及通过事件机制记录每次投票行为。此外,在构造函数中预先设定了两位初始候选人[^1]。 对于希望进一步深入了解并实践更多复杂场景下的Solidity编程技巧而言,建议访问GitHub上的[MisoCoin](https://github.com/kendricktan/misocoin),这是一个专门为初学者准备的学习资源集合,涵盖了从基础概念到高级特性的全面讲解。 同时也可以参考其他优秀的开源项目如OpenZeppelin所提供的标准化库,这有助于提高所编写合约的安全性和可靠性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值