【Solidity】基础介绍
数据类型
值类型
值类型的变量在赋值或作为函数参数传递时会被复制。
- 布尔类型:
bool - 整数类型:
- 无符号:
uint8、uint16、…、uint256(uint256可简写为uint) - 有符号:
int8、int16、…、int256(int256可简写为int)
- 无符号:
- 地址类型:
address(存储以太坊地址,占 20 字节) - 定长字节类型:
bytes1、bytes2、…、bytes32 - 枚举类型:用于为一组相关的常量赋予可读的标签,示例
enum Status { Pending, Rejected, Approved }
contract Demo {// 布尔类型bool public isActive; // 默认为 false// 有符号整数类型int public signedInt; // 默认为 0// 无符号整数类型uint public unsignedInt; // 默认为 0// 地址类型address public owner; // 默认为 0x0000000000000000000000000000000000000000// 定长字节数组类型bytes1 public dataHash1; // 默认为 0x00bytes2 public dataHash2; // 默认为 0x0000// 枚举类型enum Status { Pending, Rejected, Approved }Status public status; // 默认为 Pending, 即 0
}
在 Solidity 中可以直接通过 API 获取指定数字类型的最大最小值:
contract Demo {uint public maxUint = type(uint).max; // 2^256-1uint public minUint = type(uint).min; // 0int public maxInt = type(int).max; // 2^255-1int public minInt = type(int).min; // -2^255
}
引用类型
引用类型的变量在赋值或作为函数参数传递时不会被复制,而是传递引用。
- 字符串类型:
string - 动态字节数组类型:
bytes - 数组类型:
- 固定大小数组:
uint[5]表示包含 5 个无符号整数的数组 - 动态大小数组:
uint[]表示大小可变的无符号整数数组
- 固定大小数组:
- 映射类型:存储键值对,示例
mapping(address => uint)表示从地址到无符号整数的映射 - 结构体类型:用于将不同类型的数据组合在一起,示例
struct Person { string name; uint age; }
contract Demo {// 字符串类型string public stringData;// 动态字节数组类型bytes public byteData;// 固定大小数组类型uint[3] public fixedArray;// 动态大小数组类型uint[] public dynamicArray;// 映射类型mapping(address => uint) public balances;// 结构体类型struct Person {string name;uint age;}Person public person;
}
变量
状态变量
状态变量是存储在区块链上的数据。
contract Demo {uint public count;
}
局部变量
局部变量是在函数内部声明的变量,只在函数执行期间存在。
contract Demo {function calculateSum(uint a, uint b) public pure returns (uint) {uint sum = a + b;return sum;}
}
全局变量
全局变量是 Solidity 提供的特殊变量,用于获取区块链相关的信息。
- 区块属性
block.basefee (uint):当前区块的基础费用。block.chainid (uint):当前链的 ID。block.coinbase (address):当前区块的矿工地址。block.difficulty (uint):当前区块的难度。block.gaslimit (uint):当前区块的 gas 限额。block.number (uint):当前区块号。block.timestamp (uint):当前区块的时间戳。
- 交易属性
tx.gasprice (uint):交易的 gas 价格。tx.origin (address):交易发起者的地址。
- 消息属性
msg.data (bytes):完整的调用数据 (calldata)。msg.sender (address):调用者的地址。msg.sig (bytes4):调用数据的前 4 个字节 (即函数选择器)。msg.value (uint):随调用发送的以太币数量 (以 wei 为单位)。
- 编码 & 解码
abi.encode(...) returns (bytes):对给定的参数进行 ABI 编码。abi.decode(bytes memory encodedData, (...)) returns (...):对给定的参数进行 ABI 解码。
- 其他函数
gasleft() returns (uint):返回当前剩余的 gas 数量。blockhash(uint blockNumber) returns (bytes32):返回指定区块的哈希值(仅适用于最近的 256 个区块)。
contract Demo {function getGlobalVariables() public view returns (address, uint) {address sender = msg.sender; // 调用者的地址uint timestamp = block.timestamp; // 当前区块的时间戳return (sender, timestamp);}
}
流程控制
条件判断
if-else:
function testIf(uint a, uint b) public pure returns (uint) {if (a > b) {return a;} else {return b;}
}
三元运算符:
function testTernary(uint a, uint b) public pure returns (uint) {return a > b ? a : b;
}
注意:Solidity 不支持 switch-case 语句
循环
for 循环:
function forLoop() public pure returns (uint) {uint sum = 0;for (uint i = 0; i < 10; i++) {if (i == 3) continue;if (i == 5) break;sum += i;}return sum;
}
while 循环:
function whileLoop() public pure returns (uint) {uint sum = 0;uint i = 0;while (i < 10) {if (i == 3) {i++;continue;}if (i == 5) break;sum += i;i++;}return sum;
}
do while 循环:
function doWhileLoop() public pure returns (uint) {uint sum = 0;uint i = 0;do {if (i == 3) { i++; continue; }if (i == 5) break;sum += i;i++;} while (i < 10);return sum;
}
注意:在 Solidity 中需要控制好循环的次数,因为循环得越多 消耗的 gas 就越多 ~
相关文章:
【Solidity】基础介绍
数据类型 值类型 值类型的变量在赋值或作为函数参数传递时会被复制。 布尔类型:bool整数类型: 无符号:uint8、uint16、…、uint256 (uint256 可简写为 uint)有符号:int8、int16、…、int256 (int256可简写为 int) 地址类型&…...
【SpringBoot3】双向实时通讯 websocket
文章目录 一、Websocket使用步骤二、示例1:继承抽象类 AbstractWebSocketHandler后端代码前端代码 三、示例2:使用注解ServerEndpoint后端代码前端代码 四、前端代码封装 一、Websocket使用步骤 在Spring Boot中使用WebSocket是一个常见的需求ÿ…...
搭建内网开发环境(一)|基于docker快速部署开发环境
引言 最近因需要搭建一套简易版的纯内网的开发环境,服务器采用 centos8.0,容器化技术采用 docker 使用 docker-compose 进行容器编排。 该系列教程分为两大类: 软件安装和使用,这类是开发环境常用的软件部署和使用,涉…...
MATLAB R2023b配置Fortran编译器
MATLAB R2023b配置Fortran编译器 引言1. 安装Visual Studio 20192. 安装Intel API20243. 配置xml文件文件4. 设置环境变量5. MATLAB编译Fortran 引言 当我们需要用到MATLAB编译Fortran代码后进行调用计算时,整个配置流程较繁琐。下面以MATLAB R2023b为例࿰…...
2024新型数字政府综合解决方案(七)
新型数字政府综合解决方案通过集成人工智能、大数据、区块链和云计算技术,创建了一个高度智能化和互联互通的政府服务平台,旨在全面提升行政效率、服务质量和透明度。该平台实现了跨部门的数据整合与实时共享,利用人工智能进行智能决策支持和…...
搭建高可用k8s集群
高可用 Kubernetes V1.28.10 安装 文章目录 1. 环境介绍2. 准备工作2.1 修改主机名称2.2 修改hosts文件2.3 关闭防火墙和SLinux2.4 配置SSH免密访问2.4.1 主机名称: k8s-master-01 操作 2.5 配置yum源2.6 禁用Swarp分区2.7 同步时间2.8 配置内核转发及网桥过滤2.9 安装 IPVS 3…...
完美解决html2canvas + jsPDF导出pdf分页内容截断问题
代码地址:https://github.com/HFQ12333/export-pdf.git html2canvas jspdf方案是前端实现页面打印的一种常用方案,但是在实践过程中,遇到的最大问题就是分页截断的问题:当页面元素超过一页A4纸的时候,连续的页面就会…...
14 地址映射
14 地址映射 1、地址划分2、相关函数2.1 ioremap/iounmap2.2 mmap地址映射 3、总结 1、地址划分 明确:在linux系统中,不管是应用程序还是驱动程序,都不允许直接访问外设的物理地址,要想访问必须将物理地址映射到用户虚拟地址或者内核虚拟地址࿰…...
Java Resilience4j-RateLimiter学习
一. 介绍 Resilience4j-RateLimiter 是 Resilience4j 中的一个限流模块,我们对 Resilience4j 的 CircuitBreaker、Retry 已经有了一定的了解,现在来学习 RateLimiter 限流器; 引入依赖; <dependency><groupId>io.g…...
Nginx--地址重写Rewrite
一、什么是Rewrite Rewrite对称URL Rewrite,即URL重写,就是把传入Web的请求重定向到其他URL的过程 URL Rewrite最常见的应用是URL伪静态化,是将动态页面显示为静态页面方式的一种技术。比如http://www.123.com/news/index.php?id123 使用U…...
webflux源码解析(1)-主流程
目录 1.关键实例的创建1.1 实例创建1.2 初始化 2.处理请求的关键流程2.1 从ReactorHttpHandlerAdapter开始2.1 DispatcherHandler的初始化2.2查找mapping handler2.3 处理请求(执行handler)2.4 返回结果处理 3.webflux的配置装配参考: WebFlux是Spring 5.0框架推出的…...
ipad作为扩展屏的最简单方式
将iPad用作扩展屏幕有几种简单而有效的方法。以下是几种常见的方式: 1. Sidecar(苹果官方功能) 适用设备:iPad和Mac(macOS Catalina及以上版本)。功能:Sidecar 是苹果官方的功能,可…...
【卡码网Python基础课 17.判断集合成员】
目录 题目描述与分析一、集合二、集合的常用方法三、代码编写 题目描述与分析 题目描述: 请你编写一个程序,判断给定的整数 n 是否存在于给定的集合中。 输入描述: 有多组测试数据,第一行有一个整数 k,代表有 k 组测…...
生物研究新范式!AI语言模型在生物研究中的应用
–https://doi.org/10.1038/s41592-024-02354-y 留意更多内容,欢迎关注微信公众号:组学之心 Language models for biological research: a primer 研究团队及研究单位 James Zou–Department of Biomedical Data Science, Stanford University, Stan…...
python语言day08 属性装饰器和property函数 异常关键字 约束
属性装饰器: 三个装饰器实现对私有化属性_creat_time的get,set,del方法; 三个装饰器下的方法名都一样,通过message.creat_time的不同操作实现调用get,set,del方法。 __inti__: 创建并…...
day01JS-数据类型-01
1. 浏览器内核 通常所谓的浏览器内核也就是浏览器所采用的渲染引擎,渲染引擎决定了浏览器如何显示网页的内容以及页面的格式信息。不同的浏览器内核对网页编写语法的解释也有不同,因此同一网页在不同的内核的浏览器里的渲染(显示)…...
MATLAB 手动实现一种高度覆盖值提取建筑物点云的方法(74)
专栏往期文章,包含本章 MATLAB 手动实现一种高度覆盖值提取建筑物点云的方法(74) 一、算法介绍二、算法实现1.代码2.效果总结一、算法介绍 手动实现一种基于高度覆盖值的建筑物点云提取方法,适用于高大的城市建筑物,比只利用高度提取建筑物的方法更加稳定和具有价值,主要…...
git的下载与安装(Windows)
Git是一个开源的分布式版本控制系统(Distributed Version Control System,简称DVCS),它以其高效、灵活和强大的功能,在现代软件开发中扮演着至关重要的角色。 git官网:Git (git-scm.com) 1.进入git官网 2…...
腾讯云AI代码助手 —— 编程新体验,智能编码新纪元
阅读导航 引言一、开发环境介绍1. 支持的编程语言2. 支持的集成开发环境(IDE) 二、腾讯云AI代码助手使用实例1. 开发环境配置2. 代码补全功能使用💻自动生成单句代码💻自动生成整个代码块 3. 技术对话3. 规范/修复错误代码4. 智能…...
使用 ESP32 和 TFT 屏幕显示实时天气信息 —— 基于 OpenWeatherMap API
实时监测环境数据是一个非常常见的应用场景,例如气象站、智能家居等。这篇博客将带你使用 ESP32 微控制器和一个 TFT 屏幕,实时显示当前城市的天气信息。通过 OpenWeatherMap API,我们能够获取诸如温度、天气情况以及经纬度等详细的天气数据&…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
