Solidity基础语法

news2024/10/27 13:31:40

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,类型为 uint256
    uint256 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.coloradmin.cn/o/2210048.html

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

相关文章

【关系模型】关系完整性约束

按照上面的框架我们已经讲了关系数据结构还有关系操作,今天来补充这一章的关系完整性约束 关系完整性约束 完整性约束 完整性约束可以保证数据的一致性和元组的唯一性 实体完整性约束 比如在学生表中,每一个元组都应该是唯一并且元组之间是可以区分…

JavaScript(Web APIs 作用和分类,DOM数是什么,document是什么,根据css选择器来获取DOM元素,修改DOM元素的方式,边量声明)

变量声明 变量声明有三个 var let 和 const建议: const 优先,尽量使用const,原因是: const 语义化更好 很多变量我们声明的时候就知道他不会被更改了,那为什么不用 const呢? 实际开发中也是,…

【unity框架开发8】unity场景Scene的使用, 如何封装一个场景管理器

文章目录 一、场景基本操作1、加载切换场景2、获取场景信息3、激活场景4、场景基本属性获取5、已加载场景个数6、获取场景中所有物体7、创建新场景8、卸载销毁场景 二、使用协程方法来异步加载场景1、AsyncOperation相关的代码应写在一个协同程序中。2、allowSceneActivation加…

AI深湖DeepLate人工智能的数据集格式开源项目

人工智能的数据集格式 文档 • 入门 • API 参考 • 例子 • 博客 • Slack 社区 • Twitter(推特) 用其他语言阅读这篇文章: English 深湖 Deep Lake Deep Lake 是一种数据集格式,提供简单的 API 以用于创建、存储和协作处理任何规模的…

Spring Security 与 OAuth 2.0 登录实现指南

文章目录 一、项目概述二、环境准备三、创建GitHub OAuth应用四、项目依赖配置五、配置OAuth 2.0六、创建控制器七、创建视图八、运行应用九、用户界面展示十、总结 在现代的Web应用中,安全性是一个不可忽视的因素。OAuth 2.0作为一种流行的授权框架,提供…

浅析主流监控告警系统基本架构和原理

浅析主流监控告警系统基本架构和原理 一,监控系统的作用和目前主流监控系统 1,作用:监控系统一般有以下这几个作用 实时采集监控数据:包括硬件、操作系统、中间件、应用程序等各个维度的数据。实时反馈监控状态:通过…

论文笔记:RelationPrompt :Zero-Shot Relation Triplet Extraction

论文来源: ACL Findings 2022 论文链接:https://arxiv.org/pdf/2203.09101.pdf 论文代码:http://github.com/declare-lab/RelationPrompt 本篇论文是由阿里达摩院自然语言智能实验室于2022年发表的关于零样本关系抽取的顶会论文,本篇博客将记录我在阅读过程中的一些笔记…

AI自动生成PPT解决方案,AI生成PPT-PrensentationGen-Java实现

AI自动生成PPT解决方案,AI生成PPT-PrensentationGen-Java实现。 利用大语言模型生成PPT文件的SpringBoot Web应用,主要功能是自动化创建演示文稿,适用于快速制作演示材料,特色在于其高效的模板处理和文本替换技术。 点击视频观看…

Python入门:如何在Python中优雅地书写多行字符串!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 多行字符串📒📝 什么是多行字符串?📝 三重引号📝 字符串连接📝 反斜杠⚓️ 相关链接 ⚓️📖 介绍 📖 在编程过程中,时常会遇到需要使用多行字符串的场景。例如,在编写长参数、描述文本或代码文档时,多行字符串…

java生成日历数据列表并按日历格式导出到excel

日历格式输出 日历数据列表导出封装日历格式实体类效果 日历数据列表 /**** 封装日历数据* param year 年份* param month 月份*/public List<InspectionDailyStaffPlanCalendarData> selectCalendarDataList(int year,int month,List<InspectionDailyStaffPlan> …

centos7 Oracle 11g rac 静默安装(NFS配置共享存储)

1.环境信息准备 注意&#xff1a; 在配置网络时&#xff0c;Oracle RAC的每个节点必须具有至少两个以上的网卡&#xff0c;一张网卡对外提供网络服务&#xff0c;另一张网卡用于各个节点间的通信和心跳检测等。在配置RAC集群的网卡时&#xff0c;如果节点1的公共接口是eth0&…

随机变量及其分布

定义 1.随机变量是一个从样本空间&#xff08;所有可能结果的集合&#xff09;到实数集的函数。样本空间中的每个结果都对应于随机变量的一个值。随机变量的值可以是离散的&#xff0c;也可以是连续的。随机变量通常用大写字母表示&#xff0c;如 X、Y 或 Z。 2.随机变量和事…

难点:Linux 死机定位(进程虚拟地址空间耗尽)

死机定位(进程虚拟地址空间耗尽) 一、死机现象 内存富裕,但内存申请失败。 死机时打印: 怀疑是: 1、内存碎片原因导致。 2、进程虚拟地址空间耗尽导致。 3、进程资源限制导致。 二、内存碎片分析 1、理论知识:如何分析内存碎片化情况 使用 /proc/buddyinfo: /proc/…

Java-sec-code学习2

Java-Sec-Code学习1-文件上传漏洞 case1 url: http://127.0.0.1:8080/file/any 这是一个典型的上传页面&#xff0c;我们尝试上传一个文件试试看。 直接上传一个jsp文件&#xff0c;发现可以直接上传&#xff0c;非常顺利。这意味这后端和前端都没有对文件类型进行任何限制。…

[旧日谈]关于Qt的刷新事件频率,以及我们在Qt的框架上做实时的绘制操作时我们该关心什么。

[旧日谈]关于Qt的刷新事件频率&#xff0c;以及我们在Qt的框架上做实时的绘制操作时我们该关心什么。 最近在开发的时候&#xff0c;发现一个依赖事件来刷新渲染的控件会导致程序很容易异常和崩溃。 当程序在运行的时候&#xff0c;其实软件本身的负载并不高&#xff0c;所以…

【LeetCode每日一题】——724.寻找数组的中心下标

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目注意】六【题目示例】七【题目提示】八【解题思路】九【时间频度】十【代码实现】十一【提交结果】 一【题目类别】 前缀和 二【题目难度】 简单 三【题目编号】 724.寻找数组的中心下标 四【…

python基础路径的迁移

本人未安装anaconda或pycharm等&#xff0c;仅安装了某个python环境&#xff0c;因此以下方法仅针对基础python环境的迁移&#xff0c;不确保其他软件或插件正常运行 第一步将原python路径的整个文件夹剪切到新的路径下 第二步修改系统环境变量&#xff0c;将原来的python路径…

胤娲科技:AI绘梦师——一键复刻梵高《星空》

想象一下&#xff0c;你手中握有一张梵高的《星空》原图&#xff0c;只需轻轻一点&#xff0c;AI便能化身绘画大师&#xff0c;一步步在画布上重现那璀璨星河。 这不是科幻电影中的桥段&#xff0c;而是华盛顿大学科研团队带来的“Inverse Painting”项目&#xff0c;正悄然改变…

【软件工程】McCabe复杂度计算

文章目录 一、定义与公式二、计算步骤三、示例四、注意事项 McCabe复杂度&#xff0c;又称为环路复杂度&#xff08;Cyclomatic Complexity&#xff09;&#xff0c;是一种用来度量软件程序复杂度的经典方法。它通过计算程序中独立路径的数量&#xff0c;帮助开发人员理解代码的…

CMIP6数据处理 ▎单点降尺度、统计方法的区域降尺度、基于WRF模式的动力降尺度

CMIP6数据被广泛应用于全球和地区的气候变化研究、极端天气和气候事件研究、气候变化影响和风险评估、气候变化的不确定性研究、气候反馈和敏感性研究以及气候政策和决策支持等多个领域。这些数据为我们理解和预测气候变化&#xff0c;评估气候变化的影响和风险&#xff0c;以及…