Solidity从入门到精通-Remix的基本使用和Solidity的基本数据类型

Solidity从入门到精通-Remix的基本使用和Solidity的基本数据类型

讲了那么多理论,相信大家对区块链/web3也有了一定认知;这时候可能就问有人会问了如何把理论变成实际的代码实现。

这就来了接下来会给大家分享Solidity入门教程

这时候就会有同学问了Solidity是什么

Solidity 是一种用于编写以太坊虚拟机(EVM)智能合约的编程语言;掌握Solidity是参与链上项目的必备技能。

Solidity 两大特点 :基于对象,高级

  1. “基于对象”:学会Solidity后,可以轻松的找到一些区块链领域的好工作
  2. “高级”:不会Solodity,会很low

相信大家接触过编程的第一行代码都是"Hello World",无论是学C语言的,还是学Java的,还是学Python的,那我们今天也就从"Hello World"开始本次的Solidity。

一、Solidity编程工具介绍-Remix

相信大家写代码都是使用编程应用来的,当然了有一些大佬用notepad++,记事本;本人是菜鸟就用编程应用来写了。接下来我介绍一下Solidity的编程工具-Remix。

这时候就会有同学问了为什么要选择Remix呢

  1. Remix是以太坊官方推荐的智能合约集成开发环境(IDE)
  2. 适合新手,可以快速开发和部署合约,无需在本地安装任何程序

我们使用Java,C,Python都要本地安装环境,对新手非常不友好,但是Remix自己集成了环境直接上手。

Remix 网址:https://remix.ethereum.org

可以直接网页打开

在这里插入图片描述

Remix的使用上手

在Remix中,左侧菜单栏有六个按钮,分别对应文件夹(存放编写的代码文件)、搜索工具、编辑(允许代码)、部署(将合约部署到链上)、Dubug(断点查看程序运行bug)和Git代码分支。

在这里插入图片描述

二、第一个Solidity程序

我们新建一个文件给他命名“helloWeb3.sol”;新建完成后他就是一个简单的空白文件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来写代码

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;
contract HelloWeb3{string public _string = "Hello Web3!";
}

代码分析

第一行代码是注释,说明代码中所使用的软件许可(license),这里使用的是MIT许可。如果不写许可会有警告出现(warning),但是不影响程序的运行。Solidity 注释 以“//”开头,后面跟上注释的内容,注释的代码不会被EVM执行

// SPDX-License-Identifier: MIT

第二行代码声明源文件所使用的Solidity的版本,因为不同的版本的语法有差异。这行代码表示源文件将不允许小于0.8.21或大于等于0.9.0的编译。(第二个条件由 ^ 提供)。Solidity 语句以分号(;)结尾。

pragma solidity ^0.8.21;

第三四行代码。创建合约使用(contract),并声明合约名为 “HelloWeb3”。然后声明一个string(字符串)变量,复制为“Hello Web3”。

contract HelloWeb3 {string public _string = "Hello Web3!";
}
编译部署代码

代码写完之后 ctrl+s保存代码Remix就会自动编译;然后编译模块会有绿色的✅出现,编译成功

在这里插入图片描述

编译成功后我们进入部署界面;选择对应的合约,然后点击部署
在这里插入图片描述

我们可以看到下方有一个“已部署和合约”,看到_string的参数值为“Hello Web3!”

在这里插入图片描述

三、Solidity的数据类型

Solidity中的数据类型有三大类型

  1. 值类型(Value Type):包括布尔型,整数型,地址类型等等;这类变量赋值时候直接传递数值。
  2. 引用类型(Reference Type):包括数组和结构体,这类变量占空间大,赋值时候直接传递地址(类似于Java的地址值,指针)
  3. 映射类型(Mapping Type):Solidity中存储健值对的数据结构,可以理解为哈希表。(和Java中的map一个用法)

我们本次就介绍常用的类型,一些不常用的就不介绍了,大家遇到了可以去查阅资料。

一、值类型
1.布尔型

布尔型是两值变量,值为“true”或“false”

bool public _bool = true;

布尔值的运算符包括:

  • ! (逻辑非)
  • && (逻辑与,“and”)
  • || (逻辑或,“or”)
  • == (等于)
  • != (不等于)
    bool public _bool1 = !_bool; //取非bool public _bool2 = _bool && _bool1; //与bool public _bool3 = _bool || _bool1; //或bool public _bool4 = _bool == _bool1; //相等bool public _bool5 = _bool != _bool1; //不等

这一块和所有的编程语言都是一样的;我们可以看到编译后的结果数据

在这里插入图片描述

2.整型

整型是Solidity中的整数(Java中的int类型),最常用的

    // 整型int public _int = -1; //整数,包括负数uint public _uint = 1;  //无符号uint256 public _number = 20220330;

常用的整型运算符包括:

  • 比较运算符(返回布尔值): <=<==!=>=>
  • 算术运算符: +-*/%(取余),**(幂)
    //整数运算uint256 public _number1 = _number + 1;uint256 public _number2 = 2**2;uint256 public _number3 = 7%2;bool public _numberbool = _number2 > _number3;

在这里插入图片描述

3.地址型

地址类型(address)有两类:

  • 普通地址(address): 存储一个 20 字节的值(以太坊地址的大小)。
  • payable address: 比普通地址多了 transfersend 两个成员方法,用于接收转账。
    // 地址address public _address = 0x7A58c0Be72BE218B41C608b7Fe7C5bB630736C71;address payable public _address1 = payable(_address);  // payable address 可以用于转账、查余额// 地址类型的成员uint256 public balance = _address1.balance; //balance of address

在这里插入图片描述

4.长字节数组

字节数组分为定长和不定长两种:

  • 定长字节数组: 属于值类型,数组长度在声明之后不能改变。根据字节数组的长度分为 bytes1, bytes8, bytes32 等类型。定长字节数组最多存储 32 bytes 数据,即bytes32
  • 不定长字节数组: 属于引用类型(之后的章节介绍),数组长度在声明之后可以改变,包括 bytes 等。
    // 固定长度的字节数组bytes32 public _btye32 = "MiniSolidity";bytes1 public _byte = _btye32[0];

在上述代码中,字符串 MiniSolidity 以字节的方式存储进变量 _byte32。如果把它转换成 16 进制,就是:0x4d696e69536f6c69646974790000000000000000000000000000000000000000

_byte 变量的值为 _byte32 的第一个字节,即 0x4d

5.枚举

枚举(enum)是 Solidity 中用户定义的数据类型。它主要用于为 uint 分配名称,使程序易于阅读和维护。它与 C 语言 中的 enum 类似,使用名称来代替从 0 开始的 uint

// 用enum将uint 0, 1, 2表示为Buy, Hold, Sell
enum ActionSet { Buy, Hold, Sell }
// 创建enum变量 action
ActionSet action = ActionSet.Buy;

复制代码

枚举可以显式地和 uint 相互转换,并会检查转换的无符号整数是否在枚举的长度内,否则会报错:

// enum可以和uint显式的转换
function enumToUint() external view returns(uint){return uint(action);
}

enum 是一个比较冷门的数据类型,几乎没什么人用。

二、引用类型

我们来讲讲一讲在Solidity中两个重要的引用类型:数组array和结构体struct

数组array

数组(Array)是Solidity常用的一种变量类型,用来存储一组数据(整数,字节,地址等等)。数组分为固定长度数组和可变长度数组两种:

  • 固定长度数组:在声明时指定数组的长度。用T[k]的格式声明,其中T是元素的类型,k是长度,例如:
// 固定长度 Array
uint[8] array1;
bytes1[5] array2;
address[100] array3;
  • 可变长度数组(动态数组):在声明时不指定数组的长度。用T[]的格式声明,其中T是元素的类型,例如:
// 可变长度 Array
uint[] array4;
bytes1[] array5;
address[] array6;
bytes array7;

注意bytes比较特殊,是数组,但是不用加[]。另外,不能用byte[]声明单字节数组,可以使用bytesbytes1[]bytesbytes1[] 省gas。

创建数组的规则

在Solidity里,创建数组有一些规则:

  • 对于memory修饰的动态数组,可以用new操作符来创建,但是必须声明长度,并且声明后长度不能改变。例子:
```solidity
// memory动态数组
uint[] memory array8 = new uint[](5);
bytes memory array9 = new bytes(9);
```
  • 数组字面常数(Array Literals)是写作表达式形式的数组,用方括号包着来初始化array的一种方式,并且里面每一个元素的type是以第一个元素为准的,例如[1,2,3]里面所有的元素都是uint8类型,因为在Solidity中,如果一个值没有指定type的话,会根据上下文推断出元素的类型,默认就是最小单位的type,这里默认最小单位类型是uint8。而[uint(1),2,3]里面的元素都是uint类型,因为第一个元素指定了是uint类型了,里面每一个元素的type都以第一个元素为准。
下面的例子中,如果没有对传入 `g()` 函数的数组进行 `uint` 转换,是会报错的。```solidity
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;contract C {function f() public pure {g([uint(1), 2, 3]);}function g(uint[3] memory _data) public pure {// ...}
}
```
  • 如果创建的是动态数组,你需要一个一个元素的赋值。
```solidity
uint[] memory x = new uint[](3);
x[0] = 1;
x[1] = 3;
x[2] = 4;
```
数组成员
  • length: 数组有一个包含元素数量的length成员,memory数组的长度在创建后是固定的。
  • push(): 动态数组拥有push()成员,可以在数组最后添加一个0元素,并返回该元素的引用。
  • push(x): 动态数组拥有push(x)成员,可以在数组最后添加一个x元素。
  • pop(): 动态数组拥有pop()成员,可以移除数组最后一个元素。
结构体struct

Solidity支持通过构造结构体的形式定义新的类型(有点类似于Java中的对象)。结构体中的元素可以是原始类型,也可以是引用类型;结构体可以作为数组或映射的元素。创建结构体的方法:

// 结构体
struct Student{uint256 id;uint256 score; 
}Student student; // 初始一个student结构体

给结构体赋值的四种方法:

//  给结构体赋值
// 方法1:在函数中创建一个storage的struct引用
function initStudent1() external{Student storage _student = student; // assign a copy of student_student.id = 11;_student.score = 100;
}

结构体我们需要通过Debug的方式来看到对应的数据信息;如下图,这样我们就可以清楚的看到结构体里面的数据信息了。

在这里插入图片描述

三、映射类型

接下来我们来介绍一下映射类型Mapping,Solidity中存储键值对的数据结构,可以理解为哈希表。

在映射中,人们可以通过键(Key)来查询对应的值(Value),比如:通过一个人的id来查询他的钱包地址。

声明映射的格式为mapping(_KeyType => _ValueType),其中_KeyType_ValueType分别是KeyValue的变量类型。例子:

mapping(uint => address) public idToAddress; // id映射到地址
mapping(address => address) public swapPair; // 币对的映射,地址到地址
映射的规则
  • 规则1**:映射的_KeyType只能选择Solidity内置的值类型,比如uintaddress等,不能用自定义的结构体。而_ValueType可以使用自定义的类型。下面这个例子会报错,因为_KeyType使用了我们自定义的结构体:
// 我们定义一个结构体 Struct
struct Student{uint256 id;uint256 score; 
}
mapping(Student => uint) public testVar;
  • 规则2:映射的存储位置必须是storage,因此可以用于合约的状态变量,函数中的storage变量和library函数的参数。不能用于public函数的参数或返回结果中,因为mapping记录的是一种关系 (key - value pair)。

  • 规则3:如果映射声明为public,那么Solidity会自动给你创建一个getter函数,可以通过Key来查询对应的Value

  • 规则4*:给映射新增的键值对的语法为_Var[_Key] = _Value,其中_Var是映射变量名,_Key_Value对应新增的键值对。例子:

function writeMap (uint _Key, address _Value) public{idToAddress[_Key] = _Value;
}
映射原理
  • 原理1: 映射不储存任何键(Key)的资讯,也没有length的资讯。
  • 原理2*: 对于映射使用keccak256(h(key) . slot)计算存取value的位置。感兴趣的可以去阅读 WTF Solidity 内部规则: 映射存储布局
  • 原理3: 因为Ethereum会定义所有未使用的空间为0,所以未赋值(Value)的键(Key)初始值都是各个type的默认值,如uint的默认值是0。

在这里插入图片描述

总结

本文介绍了Solidity编程语言的基础知识和开发工具Remix的使用。首先讲解了Solidity的特点及其在区块链开发中的重要性,然后详细介绍了Remix IDE的使用方法,包括如何编写、编译和部署第一个智能合约"HelloWeb3"。接着重点讲解了Solidity的三种数据类型:值类型(布尔型、整型、地址型、长字节数组和枚举)、引用类型和映射类型,通过代码示例展示了各种类型的具体用法和运算操作。文章为初学者提供了Solidity编程的入门指引,帮助读者快速掌握编写智能合约的基本技能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84408.shtml

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

相关文章

ArcGIS Pro+ArcGIS给你的地图加上北回归线!

今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等&#xff0c;设置经线、纬线都以10间隔显示。 2、需要插入背会归线&#xf…

在.NET Core控制器中获取AJAX传递的Body参数

.Net Core是支持前后端不分离式的开发的&#xff0c;如果在原始系统中采用不分离式开发&#xff0c;后面需要在原系统中增加功能&#xff0c;并且新的服务采用其他语言开发&#xff0c;且系统原来功能保持原样&#xff0c;这样前端系统可以单独调用新开发的接口。 但是&#x…

ubuntu24安装opencv过程

1.访问opencv官网&#xff0c;下载源代码。 opencv 2.选择相应版本的源码下载 我这里用的是4.8.1版本的源码进行安装&#xff0c;opencv-4.8.1.tar.gz 安装命令 tar xvf opencv-4.8.1.tar.gz #在当前文件夹创建build文件&#xff0c;并进入 mkdir build && cd build …

Kubernetes ClusterIP 端口深度解析:虚拟服务与流量转发机制

事情的起因是创建了一个 NodePort 类型 Service&#xff0c;其端口映射关系为 8000:30948/TCP。既然30948是在每个node开的端口&#xff0c;那8000是开在哪的呢&#xff1f;出于好奇回顾了一下K8s的Cluster IP和Service 端口映射关系解析 在 Kubernetes 的 NodePort Service 中…

C++左值与右值及引用的总结

前言 在C中&#xff0c;理解左值&#xff08;lvalue&#xff09;和右值&#xff08;rvalue&#xff09;是掌握现代C核心特性的关键。左值通常指代具名的、持久存在的对象&#xff0c;可以取地址&#xff1b;而右值则是临时的、即将销毁的值&#xff0c;如字面量或表达式结果。…

学习记录:DAY31

Java课设&#xff1a;数字水印处理与解析器开发 前言 想养成写日记的习惯真不容易。最近比较懒散&#xff0c;复习不想复&#xff0c;项目又做完了&#xff0c;处于一种能干些什么&#xff0c;但是不太想干&#xff0c;但是不干些什么又浑身难受的处境。其实完全就不是匀不出…

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…

系统模块与功能设计框架

系统模块与功能设计框架&#xff0c;严格遵循专业架构设计原则&#xff0c;基于行业标准&#xff08;如微服务架构、DDD领域驱动设计&#xff09;构建。设计采用分层解耦模式&#xff0c;确保可扩展性和可维护性&#xff0c;适用于电商、企业服务、数字平台等中大型系统。 系统…

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …

Prompt工程学习之自我一致性

自我一致性 &#xff08;Self-consistency&#xff09; 概念&#xff1a;该技术通过对同一问题采样不同的推理路径&#xff0c;并通过多数投票选择最一致的答案&#xff0c;来解决大语言模型&#xff08;LLM&#xff09;输出的可变性问题。通过使用不同的温度&#xff08;temp…

gh hugging face使用

install sudo dpkg -i gh_2.74.0_linux_amd64.deb gh auth login gh auth login ? Where do you use GitHub? GitHub.com ? What is your preferred protocol for Git operations on this host? HTTPS ? Authenticate Git with your GitHub credentials? Yes ? How wo…

2025.6.9总结(利与弊)

凡事都有两面性。在大厂上班也不例外。今天找开发定位问题&#xff0c;从一个接口人不断溯源到另一个 接口人。有时候&#xff0c;不知道是谁的责任填。将工作内容分的很细&#xff0c;每个人负责其中的一小块。我清楚的意识到&#xff0c;自己就是个可以随时替换的螺丝钉&…

数据集-目标检测系列- 口红嘴唇 数据集 lips >> DataBall

贵在坚持&#xff01; * 相关项目 1&#xff09;数据集可视化项目&#xff1a;gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview 2&#xff09;数据集训练、推理相关项目&#xff1a;GitHub - XIAN-HHappy/ultralytics-yolo-webui: ultralytics-yo…

[论文阅读] 人工智能+项目管理 | 当 PMBOK 遇见 AI:传统项目管理框架的破局之路

当PMBOK遇见AI&#xff1a;传统项目管理框架的“AI适配指南” 论文信息 arXiv:2506.02214 Is PMBOK Guide the Right Fit for AI? Re-evaluating Project Management in the Face of Artificial Intelligence Projects Alexey Burdakov, Max Jaihyun Ahn Subjects: Software …

CentOS7关闭防火墙、Linux开启关闭防火墙

文章目录 一、firewalld开启、关闭防火墙1、查看防火墙状态 一、firewalld开启、关闭防火墙 以下命令在linux系统CentOS7中操作开启关闭防火墙 # 查询防火墙状态 systemctl status firewalld.service # 开启防火墙 systemctl start firewalld.service # 开机自启动防火墙 syste…

Spring是如何实现无代理对象的循环依赖

无代理对象的循环依赖 什么是循环依赖解决方案实现方式测试验证 引入代理对象的影响创建代理对象问题分析 源码见&#xff1a;mini-spring 什么是循环依赖 循环依赖是指在对象创建过程中&#xff0c;两个或多个对象相互依赖&#xff0c;导致创建过程陷入死循环。以下通过一个简…

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…

基于 Spring Boot 策略模式的短信服务提供商动态切换实现

一、整体设计思路 为了实现在短信服务提供商变更时,不修改现有代码就能无缝切换到新服务实现,可采用策略模式结合依赖注入以及配置中心化管理的方式来设计软件系统。 二、 具体实现步骤 1. 定义统一接口(以短信服务为例,接口命名为 SmsService) 创建一个抽象的接口,用…