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

打印 上一主题 下一主题

主题 981|帖子 981|积分 2943

目次

1.可见性
2.合约特别函数 constructor && getter
3. receive && fallback
4.view && pure
5.payable
6.自界说函数修饰符 modifier


1.可见性

public:内外部
private:内部
external:外部访问
internal:内部及继承
一样寻常默认是external
2.合约特别函数 constructor && getter

constructor:初始化逻辑
  1. constructor(address sender) {
  2. sender = msg.sender;
  3. }
复制代码
 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 费用和确保函数的幂等性(即多次实行结果相同)非常有用。
  1. function deposited(uint256 _pid, address _user) public view returns (uint256) {
  2.     UserInfo storage user = userInfo[_pid][_user];
  3.     return user.amount;
  4. }
复制代码


  • deposited 函数被声明为 public view,这意味着:

    • public:函数可以被任何外部调用者访问。
    • view:函数不会修改合约的状态,只读取数据。

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

  • 节流 Gas:view 函数不必要支付 gas 费用来更改状态,因此调用者可以以更低的本钱查询数据。
  • 安全性:由于 view 函数不会修改状态,它们通常被认为是安全的,不会引发意外的状态变化。
  • 优化:在设计合约时,合理利用 view 可以优化性能和本钱,使得查询操作更加高效。
总之,view 修饰符在智能合约中用于声明只读函数,这对于实现高效的数据查询和淘汰不须要的 gas 斲丧非常重要。
pure:
   在Solidity中,pure关键字用于声明函数是纯函数,即函数不读取或修改合约的状态变量,而且不与外部合约举行交互。纯函数只根据输入参数盘算结果,并返回一个值。利用pure关键字可以提供以下优点:在编译时举行静态查抄,确保函数不会修改状态或与外部合约交互;提供更好的可读性和可理解性,明确函数的行为和束缚;答应Solidity编译器举行更多的优化,进步代码实行效率。
  例如,以下是一个利用pure关键字的函数界说:
  1. function add(uint256 a, uint256 b) public pure returns (uint256) {
  2.     return a + b;
  3. }
复制代码
在这个例子中,add函数是一个纯函数,它不担当任何状态变量作为输入,也不会修改任何状态变量。它仅仅实行两个数的加法运算并返回结果。由于这个函数不涉及合约的状态,因此它被标记为pure,这有助于进步代码的安全性和实行效率。
5.payable

用payable修饰函数,体现调用函数可以被支付ETH
支付的ETH值,可以用msg.value获取
  1. // SPDX-License-Identifier: MIT
  2. pragma solidity ^0.8.0;
  3. contract PaymentProcessor {
  4.     address public owner;
  5.     event PaymentReceived(address indexed sender, uint amount);
  6.     constructor() {
  7.         owner = msg.sender;
  8.     }
  9.     // 这个函数可以用payable修饰,表示它可以接收ETH
  10.     function pay() public payable {
  11.         require(msg.value > 0, "Please send some ETH.");
  12.         
  13.         // 触发事件,记录支付信息
  14.         emit PaymentReceived(msg.sender, msg.value);
  15.     }
  16.     // 提款函数,只有合约拥有者可以调用
  17.     function withdraw() public {
  18.         require(msg.sender == owner, "Only the owner can withdraw.");
  19.         
  20.         // 提取合约中的所有ETH到拥有者地址
  21.         payable(owner).transfer(address(this).balance);
  22.     }
  23. }
复制代码
6.自界说函数修饰符 modifier

效果如图: 





免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大号在练葵花宝典

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表