再学:函数可见性、特殊函数、修饰符

ops/2025/3/19 8:55:05/

目录

1.可见性

2.合约特殊函数 constructor && getter

3. receive && fallback

4.view && pure

5.payable

6.自定义函数修饰符 modifier


1.可见性

public:内外部

private:内部

external:外部访问

internal:内部及继承

一般默认是external

2.合约特殊函数 constructor && getter

constructor:初始化逻辑

constructor(address sender) {
sender = msg.sender;
}

 getter:所有public状态变量创建getter函数

3. receive && fallback

receive“接受以太币时回调

fallback:没有匹配函数标识符时,fallback会被调用,如果是转账时,可以用receive也可以用fallback。也就是如果没有receive函数就会调用fallback函数

receive 函数用于处理接收到的以太币且没有附带数据的情况

fallback 函数用于处理接收到的以太币且附带数据的情况,或者处理没有匹配函数名的调用。 

transfer完后,receive一下,告诉合约,记录一下谁给我转账等等细节。 

4.view && pure

view:不修改状态,只做读取

pure:不读取状态,只是做一些计算逻辑

view:

在以太坊智能合约中,view 是一个状态修饰符(state mutability modifier),它用于声明函数在执行时不会修改合约的状态。换句话说,view 函数可以读取合约的状态变量,但不允许写入或改变这些变量。

使用 view 修饰符的函数通常用于查询操作,例如返回某些数据或计算某些值,而不会触发任何状态变化。这对于减少 gas 费用和确保函数的幂等性(即多次执行结果相同)非常有用。

function deposited(uint256 _pid, address _user) public view returns (uint256) {UserInfo storage user = userInfo[_pid][_user];return user.amount;
}
  • deposited 函数被声明为 public view,这意味着:

    • public:函数可以被任何外部调用者访问。

    • view:函数不会修改合约的状态,只读取数据。

这个函数的作用是查询特定用户在特定池(由 _pid 标识)中的存款数量。它通过访问 userInfo 映射来获取用户信息,然后返回用户的 amount 属性。

为什么使用 view

  1. 节省 Gasview 函数不需要支付 gas 费用来更改状态,因此调用者可以以更低的成本查询数据。

  2. 安全性:由于 view 函数不会修改状态,它们通常被认为是安全的,不会引发意外的状态变化。

  3. 优化:在设计合约时,合理使用 view 可以优化性能和成本,使得查询操作更加高效。

总之,view 修饰符在智能合约中用于声明只读函数,这对于实现高效的数据查询和减少不必要的 gas 消耗非常重要。

pure:

在Solidity中,pure关键字用于声明函数是纯函数,即函数不读取或修改合约的状态变量,并且不与外部合约进行交互。纯函数只根据输入参数计算结果,并返回一个值。使用pure关键字可以提供以下好处:在编译时进行静态检查,确保函数不会修改状态或与外部合约交互;提供更好的可读性和可理解性,明确函数的行为和约束;允许Solidity编译器进行更多的优化,提高代码执行效率。

例如,以下是一个使用pure关键字的函数定义:

function add(uint256 a, uint256 b) public pure returns (uint256) {return a + b;
}

在这个例子中,add函数是一个纯函数,它不接受任何状态变量作为输入,也不会修改任何状态变量。它仅仅执行两个数的加法运算并返回结果。由于这个函数不涉及合约的状态,因此它被标记为pure,这有助于提高代码的安全性和执行效率。

5.payable

用payable修饰函数,表示调用函数可以被支付ETH

支付的ETH值,可以用msg.value获取

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract PaymentProcessor {address public owner;event PaymentReceived(address indexed sender, uint amount);constructor() {owner = msg.sender;}// 这个函数可以用payable修饰,表示它可以接收ETHfunction pay() public payable {require(msg.value > 0, "Please send some ETH.");// 触发事件,记录支付信息emit PaymentReceived(msg.sender, msg.value);}// 提款函数,只有合约拥有者可以调用function withdraw() public {require(msg.sender == owner, "Only the owner can withdraw.");// 提取合约中的所有ETH到拥有者地址payable(owner).transfer(address(this).balance);}
}

6.自定义函数修饰符 modifier

效果如图: 


http://www.ppmy.cn/ops/166990.html

相关文章

贪心算法——c#

贪心算法通俗解释 贪心算法是一种"每一步都选择当前最优解"的算法策略。它不关心全局是否最优,而是通过局部最优的累积来逼近最终解。优点是简单高效,缺点是可能无法得到全局最优解。 一句话秒懂 自动售货机找零钱:用最少数量的…

代码随想录算法训练营第六十五天| 图论10

Bellman_ford 队列优化算法(又名SPFA) 代码随想录 import collectionsdef main():n, m map(int, input().strip().split())edges [[] for _ in range(n 1)]for _ in range(m):src, dest, weight map(int, input().strip().split())edges[src].append…

进程间通信--匿名管道

进程间通信介绍 进程间通信目的 数据传输:一个进程需要将它的数据发送给另一个进程资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件&…

网络安全运维应急响应与溯源分析实战案例

在日常运维过程中,网络安全事件时有发生,快速响应和精准溯源是保障业务稳定运行的关键。本文将通过一个实际案例,详细解析从发现问题到溯源定位,再到最终解决的完整流程。 目录 一、事件背景 二、事件发现 1. 监控告警触发 2…

后端 - java - - 权限修饰符

权限修饰符(访问修饰符)-- 控制类、方法、变量、构造函数的访问权限 1、public 所有成员皆可访问 用于库中的公共API接口或类 开放级别最高 2、protected 同一包中可访问 不同包中继承的子类可访问 用于继承场景,允许子类访问特定的字…

Git下载安装(保姆教程)

目录 1、Git下载 2、Git安装(windows版) (1)启动安装程序 (2)阅读许可协议 (3)选择安装路径 (4)选择组件 (5)选择开始菜单文件夹…

非洲能源商会:架起中非能源合作的桥梁

在全球能源转型与南南合作深化的背景下,非洲能源商会(African Energy Chamber,简称AEC) 以其独特的战略定位与实践成果,成为推动非洲能源发展与中非合作的关键力量。作为非洲领先的能源行业倡导组织,AEC自成立以来始终致力于促进非洲能源价值链的可持续发展,通过政策对话、行业…

python 入门笔记7-面向对象

1. 面向对象基础概念 类(Class):对象的蓝图,定义对象的属性和方法。 对象(Object):类的实例,具有具体的属性和行为。 属性(Attribute):对象的状…