当前位置: 首页 > ai >正文

【solidity基础】一文说清楚合约函数的大小事

在 Solidity 里,函数是合约的关键构成部分,用于执行特定任务或操作的代码块,可以包含逻辑、访问状态变量、进行计算,并且可以接受参数和返回值。

但是solidity 的函数与其他语言不太一样,经常会有同学搞混,这里开一篇文章完整介绍一下 solidity 函数的用法。

1. 函数定义与声明

function functionName(parameterType1 parameterName1, parameterType2 parameterName2, ...) visibility modifiers returns (returnType1, returnType2, ...) {// 函数体
}
  • function 关键字声明函数
  • functionName:函数的名称。
  • parameterType 和 parameterName:函数的参数,可包含多个参数,参数之间用逗号分隔。
  • visibility:函数的可见性,如 public、private、internal、external。
  • modifiers:可选的修饰符,如 pure、view、payable 等。
  • returns:指定函数的返回值类型,可返回多个值。

2. 函数的修饰符

2.1 函数的可见性

函数可见性修饰符可以用来修饰状态变量和函数,决定了函数的访问权限,具体如下:

  • public: 函数可以被合约内外的任何代码调用。默认为 public。
  • private:函数只能在定义它的合约内部被调用,在派生合约里也是无法访问的。
  • internal:函数只能在定义它的合约及其派生合约中被调用。
  • external:函数只能从合约外部调用,不能在合约内部直接调用,但可以使用 this.functionName() 的方式调用。

2.2 函数状态的可见性

函数状态可变性修饰符用于描述函数是否会修改合约的状态变量,主要用于定义函数的行为和特性。具体有以下几种:

  • pure:函数既不读取也不修改合约的状态变量(即完全不访问状态变量),通常用于执行纯数学计算等操作。

    • 不允许访问thismsg对象。
    • 可以在编译时被内联优化。
    • 不能发送以太币。
    function add(uint a, uint b) public pure returns (uint) {return a + b;
    }
    
  • view:函数只读取合约的状态变量,但不修改它们。

    • 可以调用其他 viewpure函数
    • 不允许修改状态变量
    • 不允许发送以太币
    contract MyContract {uint public myVariable = 10;function getMyVariable() public view returns (uint) {return myVariable;}
    }
    
  • payable:函数可以接收 Ether,当调用该函数时,可以附带一定数量的 Ether。

    • 允许接收以太币
    • 可以调用其他payable函数
    function calculate(uint a, uint b) public pure returns (uint sum, uint product) {sum = a + b;product = a * b;return (sum, product);
    }
    
  • virtaul:函数可以被派生合约重写覆盖

    • 在父合约中声明函数为 virtual,表示该函数可以在派生合约中被重写。
    • 派生合约中可以使用 override 关键字重写 virtual 函数。
    • virtual 函数可以有默认实现
http://www.xdnf.cn/news/3071.html

相关文章:

  • HFI笔记
  • 数据库与大数据技术教程资料
  • 麒麟(Kylin)系统下安装MySQL 8.4.5(离线版)
  • 09 Python字典揭秘:数据的高效存储
  • 基于Docker的内网穿透实战:frp 0.68 + Nginx最佳实践
  • SQL Server数据库提权的几种方法——提权教程
  • Spring Data JPA 提供的功能在性能方面有哪些需要注意的地方?
  • 完美解决 mobile-ffmpeg Not overwriting - exiting
  • Ubuntu ZLMediakit的标准配置文件(rtsp->rtmp->hls)
  • 用于实时辐射场渲染的3D高斯溅射——3D Gaussian Splatting for Real-Time Radiance Field Rendering
  • 2025华东杯B题华东杯数学建模思路代码成品讲解工序安排问题
  • 芯片软错误概率探究:基于汽车芯片安全设计视角
  • 机器学习,深度学习
  • 直播美颜SDK是什么?跨平台美颜SDK开发与接入全解析
  • iOS HTTPS 抓包踩坑记:几种方案尝试与替代工具记录
  • 硬件工程师面试常见问题(10)
  • Tailwind CSS实战技巧:从核心类到高效开发
  • Kafka的Topic分区数如何合理设置?
  • 基于LangChain构建最小智能体(Agent)实现指南
  • nvm for windows 安装低版本 node 丢失 npm 安装
  • 智驾赛道的诺曼底登陆,Momenta上海车展雄起
  • [4301]新版码点餐外卖配送餐饮小程序系统
  • 碳化硅(SiC)MOSFET桥式电路应用中米勒钳位功能的重要性
  • 卫星变轨轨迹和推力模拟(单一引力源)MATLAB
  • python实战项目67:空气质量在线检测平台js逆向
  • CCM/TCM在STM32中的含义和用途
  • Arduino程序结构详解与嵌入式开发对比指南
  • 电容的作用
  • Java学习手册:Spring MVC 架构与实现
  • 【上海大学数据库原理实验报告】MySQL基础操作