Solidity基础语法

devtools/2024/10/17 20:12:14/

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.ppmy.cn/devtools/126549.html

相关文章

春日技术辅导:Spring Boot课程答疑

3系统分析 3.1可行性分析 通过对本课程答疑系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本课程答疑系统采用JAVA作为开发语言,Spring Boot框…

Caffeine Cache解析(一):接口设计与TinyLFU

Caffeine is a high performance Java caching library providing a near optimal hit rate. 自动加载value, 支持异步加载基于size的eviction:frequency and recency基于时间的过期策略:last access or last write异步更新valuekey支持weak referenceva…

如何安装和使用 Git Large File Storage (LFS)

在现代软件开发中,我们经常需要处理大型文件,如图像、音频、视频或二进制文件。Git 在处理这些大文件时可能会遇到性能问题,因为 Git 会存储文件的每一个版本。为了解决这个问题,Git Large File Storage (LFS) 应运而生。Git LFS …

【排序】——2.快速排序法(含优化)

快速排序法 递归法 霍尔版本(左右指针法) 1.思路 1、选出一个key,一般是最左边或是最右边的。 2、定义一个begin和一个end,begin从左向右走,end从右向左走。(需要注意的是:若选择最左边的数据作为key,则…

适合女生的热门行业 女生上大学十大热门专业推荐

篇1:适合女生的热门行业 女生上大学十大热门专业推荐 1、高校老师 很多在校的学生,一直对教师这个职业不怎么看好。觉得工资低,一辈子就在一个地方了,发展缓慢。其实这个想法在你毕业后不久就会改变的。很多毕业去外面的人都很想很想再回到学校。 在高校当老师,压力不大…

【力扣 | SQL题 | 每日4题】力扣1164,3293,1308,1270

4 mid,四题都比较简单,没什么难度。 1. 力扣1164:指定日期的产品价格 1.1 题目: 产品数据表: Products ------------------------ | Column Name | Type | ------------------------ | product_id | int | | new_p…

Flythings学习(四)串口通信

文章目录 1 串口编程基本步骤1.1 打开串口1.2 配置串口 1.3 读串口1.4 发送串口1.5 关闭串口 2 综合使用3 如何在软件上保证串口稳定通信4 flythings中的串口通讯5 协议接收部分使用和修改方法6 通讯协议数据怎么和UI控件对接 1 串口编程基本步骤 串口通信有5个步骤 1.打开串口…

制造企业上云桌面需要考虑那些因素?

在江苏这片充满活力的经济热土上,制造业作为传统优势产业,正经历着前所未有的数字化转型浪潮。随着云计算技术的日益成熟和普及,越来越多的江苏制造企业开始将目光投向云桌面,以期通过这一创新技术实现降本增效、提升管理水平和增…