当前位置: 首页 > news >正文

【Solidity】基础介绍

数据类型

值类型

值类型的变量在赋值或作为函数参数传递时会被复制。

  1. 布尔类型:bool
  2. 整数类型:
    • 无符号:uint8uint16、…、uint256 (uint256 可简写为 uint)
    • 有符号:int8int16、…、int256 (int256可简写为 int)
  3. 地址类型:address (存储以太坊地址,占 20 字节)
  4. 定长字节类型:bytes1bytes2、…、bytes32
  5. 枚举类型:用于为一组相关的常量赋予可读的标签,示例 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
}

引用类型

引用类型的变量在赋值或作为函数参数传递时不会被复制,而是传递引用。

  1. 字符串类型:string
  2. 动态字节数组类型:bytes
  3. 数组类型:
    • 固定大小数组:uint[5] 表示包含 5 个无符号整数的数组
    • 动态大小数组:uint[] 表示大小可变的无符号整数数组
  4. 映射类型:存储键值对,示例 mapping(address => uint) 表示从地址到无符号整数的映射
  5. 结构体类型:用于将不同类型的数据组合在一起,示例 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 提供的特殊变量,用于获取区块链相关的信息。

  1. 区块属性
    • block.basefee (uint):当前区块的基础费用。
    • block.chainid (uint):当前链的 ID。
    • block.coinbase (address):当前区块的矿工地址。
    • block.difficulty (uint):当前区块的难度。
    • block.gaslimit (uint):当前区块的 gas 限额。
    • block.number (uint):当前区块号。
    • block.timestamp (uint):当前区块的时间戳。
  2. 交易属性
    • tx.gasprice (uint):交易的 gas 价格。
    • tx.origin (address):交易发起者的地址。
  3. 消息属性
    • msg.data (bytes):完整的调用数据 (calldata)。
    • msg.sender (address):调用者的地址。
    • msg.sig (bytes4):调用数据的前 4 个字节 (即函数选择器)。
    • msg.value (uint):随调用发送的以太币数量 (以 wei 为单位)。
  4. 编码 & 解码
    • abi.encode(...) returns (bytes):对给定的参数进行 ABI 编码。
    • abi.decode(bytes memory encodedData, (...)) returns (...):对给定的参数进行 ABI 解码。
  5. 其他函数
    • 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】基础介绍

数据类型 值类型 值类型的变量在赋值或作为函数参数传递时会被复制。 布尔类型&#xff1a;bool整数类型&#xff1a; 无符号&#xff1a;uint8、uint16、…、uint256 (uint256 可简写为 uint)有符号&#xff1a;int8、int16、…、int256 (int256可简写为 int) 地址类型&…...

【SpringBoot3】双向实时通讯 websocket

文章目录 一、Websocket使用步骤二、示例1&#xff1a;继承抽象类 AbstractWebSocketHandler后端代码前端代码 三、示例2&#xff1a;使用注解ServerEndpoint后端代码前端代码 四、前端代码封装 一、Websocket使用步骤 在Spring Boot中使用WebSocket是一个常见的需求&#xff…...

搭建内网开发环境(一)|基于docker快速部署开发环境

引言 最近因需要搭建一套简易版的纯内网的开发环境&#xff0c;服务器采用 centos8.0&#xff0c;容器化技术采用 docker 使用 docker-compose 进行容器编排。 该系列教程分为两大类&#xff1a; 软件安装和使用&#xff0c;这类是开发环境常用的软件部署和使用&#xff0c;涉…...

MATLAB R2023b配置Fortran编译器

MATLAB R2023b配置Fortran编译器 引言1. 安装Visual Studio 20192. 安装Intel API20243. 配置xml文件文件4. 设置环境变量5. MATLAB编译Fortran 引言 当我们需要用到MATLAB编译Fortran代码后进行调用计算时&#xff0c;整个配置流程较繁琐。下面以MATLAB R2023b为例&#xff0…...

2024新型数字政府综合解决方案(七)

新型数字政府综合解决方案通过集成人工智能、大数据、区块链和云计算技术&#xff0c;创建了一个高度智能化和互联互通的政府服务平台&#xff0c;旨在全面提升行政效率、服务质量和透明度。该平台实现了跨部门的数据整合与实时共享&#xff0c;利用人工智能进行智能决策支持和…...

搭建高可用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分页内容截断问题

代码地址&#xff1a;https://github.com/HFQ12333/export-pdf.git html2canvas jspdf方案是前端实现页面打印的一种常用方案&#xff0c;但是在实践过程中&#xff0c;遇到的最大问题就是分页截断的问题&#xff1a;当页面元素超过一页A4纸的时候&#xff0c;连续的页面就会…...

14 地址映射

14 地址映射 1、地址划分2、相关函数2.1 ioremap/iounmap2.2 mmap地址映射 3、总结 1、地址划分 明确&#xff1a;在linux系统中,不管是应用程序还是驱动程序&#xff0c;都不允许直接访问外设的物理地址,要想访问必须将物理地址映射到用户虚拟地址或者内核虚拟地址&#xff0…...

Java Resilience4j-RateLimiter学习

一. 介绍 Resilience4j-RateLimiter 是 Resilience4j 中的一个限流模块&#xff0c;我们对 Resilience4j 的 CircuitBreaker、Retry 已经有了一定的了解&#xff0c;现在来学习 RateLimiter 限流器&#xff1b; 引入依赖&#xff1b; <dependency><groupId>io.g…...

Nginx--地址重写Rewrite

一、什么是Rewrite Rewrite对称URL Rewrite&#xff0c;即URL重写&#xff0c;就是把传入Web的请求重定向到其他URL的过程 URL Rewrite最常见的应用是URL伪静态化&#xff0c;是将动态页面显示为静态页面方式的一种技术。比如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的配置装配参考&#xff1a; WebFlux是Spring 5.0框架推出的…...

ipad作为扩展屏的最简单方式

将iPad用作扩展屏幕有几种简单而有效的方法。以下是几种常见的方式&#xff1a; 1. Sidecar&#xff08;苹果官方功能&#xff09; 适用设备&#xff1a;iPad和Mac&#xff08;macOS Catalina及以上版本&#xff09;。功能&#xff1a;Sidecar 是苹果官方的功能&#xff0c;可…...

【卡码网Python基础课 17.判断集合成员】

目录 题目描述与分析一、集合二、集合的常用方法三、代码编写 题目描述与分析 题目描述&#xff1a; 请你编写一个程序&#xff0c;判断给定的整数 n 是否存在于给定的集合中。 输入描述&#xff1a; 有多组测试数据&#xff0c;第一行有一个整数 k&#xff0c;代表有 k 组测…...

生物研究新范式!AI语言模型在生物研究中的应用

–https://doi.org/10.1038/s41592-024-02354-y 留意更多内容&#xff0c;欢迎关注微信公众号&#xff1a;组学之心 Language models for biological research: a primer 研究团队及研究单位 James Zou–Department of Biomedical Data Science, Stanford University, Stan…...

python语言day08 属性装饰器和property函数 异常关键字 约束

属性装饰器&#xff1a; 三个装饰器实现对私有化属性_creat_time的get&#xff0c;set&#xff0c;del方法&#xff1b; 三个装饰器下的方法名都一样&#xff0c;通过message.creat_time的不同操作实现调用get&#xff0c;set&#xff0c;del方法。 __inti__&#xff1a; 创建并…...

day01JS-数据类型-01

1. 浏览器内核 通常所谓的浏览器内核也就是浏览器所采用的渲染引擎&#xff0c;渲染引擎决定了浏览器如何显示网页的内容以及页面的格式信息。不同的浏览器内核对网页编写语法的解释也有不同&#xff0c;因此同一网页在不同的内核的浏览器里的渲染&#xff08;显示&#xff09;…...

MATLAB 手动实现一种高度覆盖值提取建筑物点云的方法(74)

专栏往期文章,包含本章 MATLAB 手动实现一种高度覆盖值提取建筑物点云的方法(74) 一、算法介绍二、算法实现1.代码2.效果总结一、算法介绍 手动实现一种基于高度覆盖值的建筑物点云提取方法,适用于高大的城市建筑物,比只利用高度提取建筑物的方法更加稳定和具有价值,主要…...

git的下载与安装(Windows)

Git是一个开源的分布式版本控制系统&#xff08;Distributed Version Control System&#xff0c;简称DVCS&#xff09;&#xff0c;它以其高效、灵活和强大的功能&#xff0c;在现代软件开发中扮演着至关重要的角色。 git官网&#xff1a;Git (git-scm.com) 1.进入git官网 2…...

腾讯云AI代码助手 —— 编程新体验,智能编码新纪元

阅读导航 引言一、开发环境介绍1. 支持的编程语言2. 支持的集成开发环境&#xff08;IDE&#xff09; 二、腾讯云AI代码助手使用实例1. 开发环境配置2. 代码补全功能使用&#x1f4bb;自动生成单句代码&#x1f4bb;自动生成整个代码块 3. 技术对话3. 规范/修复错误代码4. 智能…...

使用 ESP32 和 TFT 屏幕显示实时天气信息 —— 基于 OpenWeatherMap API

实时监测环境数据是一个非常常见的应用场景&#xff0c;例如气象站、智能家居等。这篇博客将带你使用 ESP32 微控制器和一个 TFT 屏幕&#xff0c;实时显示当前城市的天气信息。通过 OpenWeatherMap API&#xff0c;我们能够获取诸如温度、天气情况以及经纬度等详细的天气数据&…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...