Solidity基础语法

Solidity的在线编辑器:https://remix.ethereum.org/

一、合约结构

1、SPDX许可标识:指定代码的开源许可

2、pragma指令:声明Solidity版本

3、导入语句:引入其他合约或库

4、合约声明:使用contract关键字

5、状态变量:存储在区块链上的持久数据

6、事件:用于记录重要操作,可被外部监听

7、修饰符:用于修改函数行为的可重用代码

8、函数:合约的可执行代码单元

一个合约例子:变量赋值,获取值。

// SPDX-License-Identifier: MIT
// 编译器版本
pragma solidity ^0.8.26;
// 合约声明,声明一个名为SimpleStorage的合约
contract SmipleStorage {// 声明一个公开变量,名为storeData,类型为 uint256uint256 public storeData;// 声明一个结构体constructor(uint256 initialValue) {storeData = initialValue;}// 声明一个函数,名为set(),给变量赋值function set(uint256 x) public {storeData = x;}// 声明一个函数,名为get(),获取变量的值function get() public view returns(uint256) {return storeData;}}

 二、数据类型与数据结构

Solidity支持多种数据类型,包括基础类型(如:int、uint、bool),复杂类型(如:struct、enum、数组、映射)以及地址类型address

1、值类型

uint:无符号整数,uint256是默认类型,表示从0到2的256次方-1的整数,可以使用不同位宽

        ,如uint8、uint16、uint256等

int:有符号整数,范围 -(2的(n-1)次方)到(2的(n-1)次方)-1

bool:布尔类型,只有true和false两个值

address:20字节的以太坊地址,分为 address 和 address payable

                address:以太坊地址类型

                address payable:以太坊地址,可用于接收以太币

bytes1 ~ bytes32:固定大小字节数组

2、引用类型

string:动态大小的UTF-8编码字符串

bytes:动态大小的字符数组

数组:如 uint[] (动态大小)或 uint[5](固定大小)

结构体(struct):自定义的复杂数据类型,如

// 简单结构体
struct person {string name;uint age;
}

映射(mapping): 键值对存储:如,mapping(address => uint)

注:

(1)、mapping不支持直接遍历,需结合其他结构记录键值

(2)、动态数组操作(如,push)会增加Gas,尽量减少不必要的操作

三、函数修饰符与类型

函数修饰符决定了函数的可见性和行为

1、可见性修饰符

        public:内部和外部都可以调用

        private:只能在定义的合约内部调用(虽然在区块链上的数据是公开的,但限制了

                        其他合约的直接访问)

        internal:只能在内部和派生合约中调用

        external:只能从外部调用

2、状态修饰符

        view:不修改状态(但是可以读取)

        pure:不读取也不修改状态

3、支付相关

        payable:允许函数接收以太币

注:

(1)、使用private并不意味着数据绝对安全

(2)、external 比 public 消耗更少的Gas,适用于只需外部访问的函数

(3)、view 和 pure 声明的函数直接执行不消耗Gas,只调用不交易,但如果别的需要消耗Gas的函数调用了 view 或 pure 的函数,仍会消耗Gas

四、内存管理和数据位置

Solidity中的数据存储位置决定了数据的生命周期和Gas消耗

Storage:永久存储,数据保留在区块链上,默认的状态变量存储位置,Gas消耗高

Memory:临时数据位置,函数调用结束即释放,适合在函数内处理临时数据

Calldata:只读数据位置,通常用于外部函数调用的参数,不可修饰,效率高

注:

(1)、减少storage的读写次数以节省Gas

(2)、在复杂数据操作中,优先考虑memory

(3)、静态数据类型,如,固定大小的数组或基本类型不需要指定数据位置

(4)、 从storage中存取数据的Gas开销大于直接从memory中存取(相差3倍)

五、高级特性

使用 constant 和 immutable 优化Gas使用

constant:不允许赋值(除初始化以外),在编译时确定的常量,不占用存储空间

immutable:可在合约构造时赋值,之后不可更改,存储在代码中

六、特殊函数:receive 和 fallback

receive:receive的功能是当合约收到纯以太币(无数据)时,就会触发该函数,该函数

                还必须标记为 "payable"

例如:

receive() external payable {}

 fallback:当合约收到Ether并调用合约中不存在的合约时, 或交易不提供数据时,就会执行

                该函数,如果希望合约能以这种方式接收以太币,则必须将此函数标记为payable

例如:

fallback() external payable {}

七、修饰器(modifier)

修饰器用于在函数执行前后添加检查或修改行为

modifier 修饰名称(参数) {//前置条件检查require(条件, "错误信息");_;    // 表示被修饰函数的代码后置操作
}

 示例:

modifier OnlyOwner() {require(msg.sender == owner, "只有合约拥有者才能调用");_;
}
// 在函数中使用修饰器,这里函数执行会先执行修饰器中的内容,验证发送地址是不是合约拥有者,
// 是才会执行后续操作
funcation withdrawFunds() public OnlyOwner {// 提款逻辑
}

注:

(1)、可以组合多个modifier

(2)、执行顺序:从左到右依次执行modifier

(3)、可以在modifier中使用参数

(4)、_;  表示被修饰函数的代码插入点

八、错误处理与安全性

Solidity提供多种错误机制

require:用于输入验证和外部调用的错误检测

assert:用于内部一致性检测

revert:提供自定义错误信息、状态回滚

安全性注意事项:

        避免重入攻击:使用 “检查——效果——交互” 模式

        防止整数溢出,使用Solidity 0.8+的内置模式检查或SafeMath库

九、常用全局变量

msg对象

        msg.sender:当前调用者的地址,常用于权限验证

        msg.value:当前交易发送的以太币数量常用于支付逻辑

        msg.data:调用数据的完整字节,适用于低级调用

        msg.sig: 调用数据的前4哥字节函数选择器

block对象

        block.timestamp:当前区块的时间戳(Unix时间),常用于时间限制

        block.number:当前区块的编号,可用于获取链上的数据的时间顺序

        block.difficulty:当前区块的难度

tx对象

        tx.origin:交易发起者的原始地址,通常不建议用于权限验证(安全问题)

其他

        gasleft():剩余的Gas量,用于监控Gas消耗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/445657.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#自定义特性

特性的用处 一般用来影响某一个类的个别字段或者方法 定义特性 需要将类继承Attribute 可以通过构造函数的方式影响使用特性的方法 可以通过给自定义的特性通过加AttributeUsage特性的方法进行进一步管理 AttributeUsage特性默认传三个参数 第一个参数一般用来约束此自定义…

黑马程序员 javaWeb基础学习,精细点复习【持续更新】

文章目录 WEB开发一、HTML1.html介绍 二、CSS1.CSS介绍2.CSS导入方式3.CSS选择器4.CSS属性 三、JavaScript1.介绍2.浏览器3.js的三种输出方式4.js定义变量5.js数据类型6.js运算符7.全局函数8.函数定义9.js数组对象10.js正则对象11.字符串对象12.自定义对象13.BOM浏览器对象模型…

电脑无线网wifi和有线网同时使用(内网+外网同时使用)

一、要求 我这里以无线网wifi为外网,有线网卡为内网为例: 一、基本信息 无线wifi(外网):ip是192.168.179.235,网关是192.168.179.95有线网(内网):ip是192.168.10.25&…

系统思考与业务创新工作坊

圆满结束两天的新华三《系统思考与业务创新工作坊》项目!在这次工作坊中,我们不仅深入探讨了如何通过系统思维看清复杂的业务全貌,还一起探索了创新背后的逻辑与突破口。 系统思考不是一时的灵感,而是一种持久的思维模式&#xff…

折叠翼弹射无人机产品技术详解

折叠翼无人飞行器系统采用储存、运输、发射一体化设计,飞行器平台可以折叠入筒,采用筒式气体弹射方式发射,其搭载可见光/红外双光载荷与战斗部,可以对敌方中大型坦克、装甲或防御工事进行打击。产品技术详解如下: 一、…

无人机之视觉技术篇

一、视觉传感器的类型 摄像头: 最常见的视觉传感器,能够捕捉可见光图像和视频。 通过单目、双目或多目摄像头的组合,无人机能够实现立体视觉,从而估算距离、深度,并进行物体识别和追踪。 红外传感器: …

推荐几本编程入门书目

对于编程入门,推荐以下几本书籍,这些书籍覆盖了不同的编程语言,适合零基础的学习者逐步掌握编程基础: 1. 《Python编程快速上手——让繁琐工作自动化》 特点:以简单易懂的方式介绍了Python的基础知识和编程概念&#…

UE5 使用Animation Budget Allocator优化角色动画性能

Animation Budget Allocator是UE内置插件,通过锁定动画系统所占CPU的预算,在到达预算计算量时对动画进行限制与优化。 开启Animation Budget Allocator需要让蒙皮Mesh使用特定的组件,并进行一些编辑器设置即可开启。 1.开启Animation Budget…

智慧油田智能安全管控方案-AI助力油气田安全管控升级

在科技日新月异的今天,万物纵横科技凭借其前沿的智慧油田智能安全管控方案,正引领着油气田行业向智能化、高效化转型。该方案深度融合了AI视频智能分析与AIoT(物联网人工智能)技术,为采油场、油气场的设备运维、环境监…

记录使用appium+夜神模拟器测试多设备时selenium和appium版本不兼容带来的问题

记录使用appium夜神模拟器测试多设备时selenium和appium版本不兼容带来的问题 好不容易解决了selenium和appium的版本冲突问题(导致:AttributeError: ‘NoneType’ object has no attribute to_capabilities’异常发生) 第二天运行代码发现…

腾讯云Android 与 iOS 相关

移动端(Android/iOS)支持哪几种系统音量模式? 支持2种系统音量类型,即通话音量类型和媒体音量类型: 通话音量:手机专门为通话场景设计的音量类型,使用手机自带的回声抵消功能,音质…

2024免费mac苹果电脑清理垃圾软件CleanMyMac X4.15.8

对于苹果电脑用户来说,设备上积累的垃圾文件可能会导致存储空间变得紧张,影响电脑的性能和使用体验。尤其是那些经常下载和安装新应用、编辑视频或处理大量照片的用户,更容易感受到存储空间的压力。面对这种情况,寻找一种有效的苹…

【自动驾驶】控制算法(十二)横纵向综合控制 | 从理论到实战全面解析

写在前面: 🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝 个人主页:清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。 🔍 本文系 清流君 原创之作&…

MPA-SVM多变量回归预测|海洋捕食者优化算法-支持向量机|Matalb

目录 一、程序及算法内容介绍: 基本内容: 亮点与优势: 二、实际运行效果: 三、算法介绍: 四、完整程序下载: 一、程序及算法内容介绍: 基本内容: 本代码基于Matlab平台编译&am…

R语言从多波段tif数据中逐个提取单波段数据

在遥感和地理信息系统(GIS)领域,将多个波段存储在一个文件中可以更有效地进行数据压缩和管理,减少了存储空间的需求。 在R语言中,处理多波段栅格数据通常涉及以下步骤: 读取数据:使用raster包中…

蓝桥杯模块三:蜂鸣器和继电器的基本控制

模块训练题目: 一、蜂鸣器电路图 1.电路图 2.电路分析 138译码器控制Y5,Y5控制Y5C,Y5C低电平控制芯片开启P0口控制ULN2003继而控制蜂鸣器端口和继电器端口 二、程序代码 1.138译码器控制端口函数 建立初始化函数选择锁存器 2.实现题目功能 在LED代…

信号量(Semaphore)是什么,如何使用?

信号量(Semaphore)是 Java java.util.concurrent 包中的一种同步辅助类,用于控制对共享资源的访问。在并发编程中,信号量常用于限制同时访问特定资源的线程数量,避免过多线程同时访问可能导致的资源竞争或性能下降。 …

使用机器学习边缘设备的快速目标检测

论文标题:Fast Object Detection with a Machine Learning Edge Device 中文标题:使用机器学习边缘设备的快速目标检测 作者信息: Richard C. Rodriguez, MSDA Information Systems and Cyber Security Department, The University of Tex…

STM32学习--4-1 OLED显示屏

接线图 OLED.c #include "stm32f10x.h" #include "OLED_Font.h"/*引脚配置*/ #define OLED_W_SCL(x) GPIO_WriteBit(GPIOB, GPIO_Pin_8, (BitAction)(x)) #define OLED_W_SDA(x) GPIO_WriteBit(GPIOB, GPIO_Pin_9, (BitAction)(x))/*引脚初始化*/ void …

初识数据结构--时间复杂度 和 空间复杂度

数据结构前言 数据结构 数据结构是计算机存储、组织数据的方式(指不仅能存储数据,还能够管理数据-->增删改)。指相互之间存在一种或多种特定关系的数据元素的集合。没有单一的数据结构对所有用途都有用,所以我们要学习各种的数据结构,比…