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.mzph.cn/pingmian/56802.shtml

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

相关文章

直流和交流变频压缩机工作原理

直流变频压缩机工作原理: 压缩机定子产生旋转磁场与转子永磁磁场直接作用,实现压缩机运转。转子是永磁体,没有线圈/绕组,无需外部供电,不产生电能损耗,效率高、节能;直流变频压缩机属于同步控制…

uboot中mmc是使用

进入uboot的界面后 mmc命令 mmc list #查看有哪些可用的mmc设备 mmc dev 0 #切换到mmc的0设备,一般是指SD卡 ls mmc 0:1 #查看mmc 0设备(sd卡)中1分区保存的信息 ls mmc 0:2 #查看mmc 0设备(sd卡)中2分区保存的信…

Leetcode 1129. 颜色交替的最短路径

1.题目基本信息 1.1.题目描述 给定一个整数 n,即有向图中的节点数,其中节点标记为 0 到 n – 1。图中的每条边为红色或者蓝色,并且可能存在自环或平行边。 给定两个数组 redEdges 和 blueEdges,其中: redEdges[i] …

顺序表算法题【不一样的解法!】

本章概述 算法题1算法题2算法题3彩蛋时刻!!! 算法题1 力扣:移除元素 我们先来看这个题目的要求描述: 把与val相同数值的元素移除掉,忽略元素的相对位置变化,然后返回剩下与val值不同的元素个数…

基于SpringBoot+Vue+uniapp的涪陵区特色农产品交易系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的视频演示 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不…

pytest中@pytest.fixture常用顺序function

ytest中pytest.fixture用法讲解 1、测试函数开始之前2、执行测试函数:3、测试函数结束后: 备注:内容来自chatGPT 在 pytest 中,pytest.fixture 是一个非常强大的功能,用于设置测试所需的环境和状态。它可以通过 scope…

AP上线的那些事儿(1)capwap建立过程、设备初始化以及二层上线

1、了解FITAP与AC的建立过程 之前我们已经知道了FATAP与FIT是一对双胞胎一样的兄弟,FAT哥哥能够直接独立使用当AP桥接、路由器等,而弟弟FIT则比较薄弱,独自发挥不出功效,需要一位师傅(AC)来带领&#xff0c…

ssm配置模式

新版 用Java类,全注解demo案例 1. AppConfig.java (Spring主配置类)package com.example.config;import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.cont…

MATLAB实现AM调制解调

1.基本概念 1.1 AM调制原理 调幅就是使载波的振幅随调制信号的变化规律而变化。基带信号m(t)与直流分量A0相加,然后和高频载波相乘实现AM信号的调制,如图1所示。 1.2 AM解调原理 AM信号经过信道传输,引入噪声后,再和载波相乘&…

OpenCV之换脸技术:一场面部识别的奇妙之旅

在这个数字化与智能化并进的时代,图像处理技术日益成为连接现实与虚拟世界的桥梁。其中,换脸技术作为一项颇受欢迎且富有挑战性的应用,不仅让人惊叹于技术的魔力,更在娱乐、影视制作等领域展现了无限可能。今天,我们就…

arp欺骗及其实验

ARP欺骗(ARP Spoofing)是一种网络攻击技术,攻击者通过伪造ARP(地址解析协议)消息,将其MAC地址与目标IP地址关联,从而实现对网络流量的截获、篡改或重定向。以下是ARP欺骗的详细信息:…

怎么修改编辑PDF的内容,有这4个工具就行了。

PDF 软件在现代的办公或者是学习当中的应用非常广泛,编辑PDF内容对很多人来说也是一件常有的事情。如果有了PDF 编辑软件,查看,编辑,修改,分享也会变得更加方便简单,所以今天要给大家介绍几款这样的工具。 …

python-库

python-库 常用库 仅个人笔记使用,感谢点赞关注 常用库 dill:对象序列化 目前仅专注于 NLP 大模型 机器学习和前后端的技术学习和分享 感谢大家的关注与支持!

vue特效,一片动态星空

vue实现漂亮星空&#xff0c;超级简单 1.创建vue项目&#xff1a; vue create demo 2.注册vuecli : npm i element-ui -S 3.加载依赖 &#xff1a;npm i 4.运行项目 :npm run serve <!DOCTYPE html> <html lang"en"> <head><…

Linux SSH免密登录

生成密钥-默认 出现三个提示步骤,直接回车即可 看到下图的提示的时候,你已经生成密钥成功 ssh-keygen -t rsa 生成密钥-定制化 与默认的步骤一致,唯一不同的是命令,话不多说,上命令 ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_new-t rsa&#xff1a;指定密钥类型为 RSA。…

FreeRTOS:任务通知

目录 一、简介 二、相关API 1.发送任务通知的API 2.获取任务通知的API 三、使用场景 1.代替消息队列 2.代替二值信号量 3.代替计数信号量 4.代替事件组 一、简介 FreeRTOS的任务通知&#xff08;Task Notifications&#xff09;是一个轻量级、快速的机制&#xff0c;用于…

【ELK】初始阶段

一、logstash学习 安装的时候最好不要有中文的安装路径 使用相对路径 在 Windows PowerShell 中&#xff0c;如果 logstash 可执行文件位于当前目录下&#xff0c;你需要使用相对路径来运行它。尝试输入以下命令&#xff1a; .\logstash -e ‘input { stdin { } } output { s…

详解23种设计模式——第一部分:概述+创建型模式

目录 1. 概述 2. 创建型模式 2.1 简单&#xff08;静态&#xff09;工厂模式 2.1.1 介绍 2.1.2 实现 2.2 工厂模式 2.3 抽象工厂模式 2.4 单例模式 2.4.1 饿汉模式 2.4.2 懒汉模式 2.4.3 线程安全的懒汉式 2.4.4 DCL单例 - 高性能的懒汉式 2.5 建造者模式 2.6 原…

kaptcha依赖maven无法拉取的问题

老依赖了&#xff0c;就是无法拉取&#xff0c;也不知道为什么&#xff0c;就是用maven一直拉去不成功&#xff0c;还以为是魔法的原因&#xff0c;试了好久发现不是&#xff0c;只好在百度寻求帮助了&#xff0c;好在寻找到了这位大佬的文章Maven - 解决无法安装 Kaptcha 依赖…

纯血鸿蒙!

纯血鸿蒙&#xff0c;这是哪个营销大师给起的名字啊&#xff01; 纯血&#xff01;象征着高贵、自信、自主、血性、英雄气概&#xff0c;都融入这纯血鸿蒙了&#xff01; 鸿蒙本就是开天辟地&#xff0c;加上纯血&#xff0c;真是荡气回肠&#xff01; 鸿蒙的推出背景 我们前…