目录
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?
-
节省 Gas:
view函数不需要支付 gas 费用来更改状态,因此调用者可以以更低的成本查询数据。 -
安全性:由于
view函数不会修改状态,它们通常被认为是安全的,不会引发意外的状态变化。 -
优化:在设计合约时,合理使用
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修饰,表示它可以接收ETH
function 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
效果如图:

















![STC89C52单片机学习——第25节: [11-1]蜂鸣器](https://i-blog.csdnimg.cn/direct/3e5c115f7a3341ebb84b8a29540d4c9d.png)



![[动手学习深度学习]26. 网络中的网络 NiN](https://i-blog.csdnimg.cn/direct/2991e4a0a2cf460ca769b28fa71f7668.png)