当前位置:网站首页>Solidity函数学习
Solidity函数学习
2022-07-07 15:37:00 【华为云】
目录
今天给大家分享一下Solidity中的函数的学习
函数
Solidity中的函数为:
它们可以在合约内部编写,也可以是自由函数(写在合约外)。
返回值(或称返回变量)
函数可以返回任意数量的值作为输出。有两种方法从函数返回变量:
1. 使用返回变量名:
2. 直接在return语句中提供返回值:
使用第二种方法,你可以省略返回变量的名称,而仅指定其类型。
支持的返回参数和类型
为了调用智能合约函数,我们需要使用ABI规范来指定要调用的函数并对参数进行编码,这些参数将包含在交易的数据字段中并发送给以太坊网络来执行。
ABI编码也用于事件和返回类型,更多详细信息可以在中找到。
注意: (如果你使用的是Solidity版本:0.7.5才可以使用 v2 版本。对于低于0.7.5的版本,我们需要使用实验版本:pragma experimental ABIEncoderV2;
)。
使用 Solidity 0.7.5 版本的示例。
可见性(Visibility)
函数的可见性有四种:
- Private(私有):限制性最强,函数只能在所定义的智能合约内部调用。
- Internal(内部):可以在所定义智能合约内部调用该函数,也可以从继承合约中调用该函数。
- External(外部):只能从智能合约外部调用。 (如果要从智能合约中调用它,则必须使用
this
。) - Public(公开):可以从任何地方调用。 (最宽松)
状态可变性(mutability)
- view:用
view
声明的函数只能读取状态,而不能修改状态。 - pure:用
pure
声明的函数既不能读取也不能修改状态。 - payable:用
payable
声明的函数可以接受发送给合约的以太币,如果未指定,该函数将自动拒绝所有发送给它的以太币。
交易与调用
用view
和pure
关键字定义的函数不会改变以太坊区块链的状态,这意味着当你调用这些函数时,你不会向区块链发送任何交易,因为交易被定义为从一个状态到另一个状态的状态栏变换。其仅仅是,你连接的节点通过检查其自己的区块链版本在本地执行函数代码,并将结果返回,而无需将任何交易广播到以太坊网络。
特殊函数
在本节中,我们将看到一些可以使用的特殊函数。
Getter 函数
定义为public的状态变量具有getter函数,该函数由编译器自动创建。该函数与变量具有相同的名称,并且具有外部可见性。
接收以太币函数
合约最多可以具有一个receive
函数。这个函数不能有参数,不能返回任何参数,并且必须具有receive
可见性和 payable
状态可变性。
当向合约发送Ether且未指定调用任何函数(calldata 为空)时执行。这是在普通的以太坊转账上执行的函数(例如,通过.send()
或.transfer()
转账)。
该函数声明如下:
Fallback函数
合约最多可以具有一个fallback
函数(一般翻译为回退函数)。这个函数不能有参数,不能返回任何参数,并且必须具有external
可见性。如果其他函数均不匹配给定的函数签名,或者根本没有提供任何数据并且没有receive
函数,则在调用合约时执行该函数。
你可以这样声明一个函数:
如果对一个没有实现
receive
函数或payable
回退函数的合约转账,则合约将抛出异常,以太币会退还。
可以在Remix中自行尝试一下,创建一个没有receive
或payable fallback
的合约,并向其中发送一些以太币。点击**Transact(交易)**后,你应该会看到一条类似以下的消息。
函数修饰器
当你要在执行函数之前检查某些条件时,可以使用修饰器。例如,如果你要检查发件人是否是合约的所有者,则可以编写以下内容:
使用修饰器,我们可以分离该代码,以便我们可以将其与其他函数复用,我们只需要声明修饰器,如下所示:
然后将修饰器名称添加到函数中:
通过在用空格分隔的列表中指定多个修饰器,可以将它们应用到一个函数,并按给出的顺序对其进行应用。
边栏推荐
- 在哪个期货公司开期货户最安全?
- dapp丨defi丨nft丨lp单双币流动性挖矿系统开发详细说明及源码
- Master this promotion path and share interview materials
- Seaborn数据可视化
- QT picture background color pixel processing method
- [Fantan] how to design a test platform?
- Skimage learning (3) -- adapt the gray filter to RGB images, separate colors by immunohistochemical staining, and filter the maximum value of the region
- 蓝桥杯 决赛 异或变换 100分
- 最新Android面试合集,android视频提取音频
- Sort out several important Android knowledge and advanced Android development interview questions
猜你喜欢
skimage学习(3)——使灰度滤镜适应 RGB 图像、免疫组化染色分离颜色、过滤区域最大值
【视频/音频数据处理】上海道宁为您带来Elecard下载、试用、教程
SlashData开发者工具榜首等你而定!!!
Reflections on "product managers must read: five classic innovative thinking models"
测试用例管理工具推荐
最新Android面试合集,android视频提取音频
《产品经理必读:五种经典的创新思维模型》的读后感
整理几个重要的Android知识,高级Android开发面试题
skimage学习(2)——RGB转灰度、RGB 转 HSV、直方图匹配
值得一看,面试考点与面试技巧
随机推荐
Sort out several important Android knowledge and advanced Android development interview questions
typescript ts 基础知识之类型声明
Flask搭建api服务
LeetCode 213. Home raiding II daily question
LeetCode 1654. 到家的最少跳跃次数 每日一题
LeetCode 1031. 两个非重叠子数组的最大和 每日一题
面向接口编程
ATM系统
typescript ts基础知识之tsconfig.json配置选项
SIGGRAPH 2022最佳技术论文奖重磅出炉!北大陈宝权团队获荣誉提名
浅浅理解.net core的路由
Skimage learning (2) -- RGB to grayscale, RGB to HSV, histogram matching
国内首创!Todesk将RTC技术融入远程桌面,画质更清晰操作更流畅
【Seaborn】组合图表:PairPlot和JointPlot
LeetCode 300. 最长递增子序列 每日一题
LeetCode 1981. Minimize the difference between the target value and the selected element one question per day
掌握这个提升路径,面试资料分享
AI来搞财富分配比人更公平?来自DeepMind的多人博弈游戏研究
Pychart ide Download
[designmode] flyweight pattern