1. solidity 简介

Solidity(中文名称:Solidity 语言)是一种面向智能合约(Smart Contracts)的高级编程语言,最初由以太坊(Ethereum)的团队开发并用于以太坊平台上的智能合约编写。Solidity 的设计目标是简化以太坊智能合约的开发,使开发者能够创建安全、可靠的去中心化应用程序(DApps)。

以下是 Solidity 的一些关键特点和重要概念:

  1. 静态类型语言:Solidity 是一种静态类型语言,这意味着在编译时必须指定变量的数据类型。这有助于提高代码的安全性和可读性。
  2. 以太坊智能合约:Solidity 主要用于编写以太坊智能合约,这些合约是以太坊区块链上的自执行代码。合约可以定义规则、存储数据和执行操作。
  3. 面向对象:Solidity 支持面向对象编程(OOP)的概念,包括合约、继承、结构体和枚举等。合约可以像类一样包含状态变量和函数,可以被实例化和继承。
  4. 智能合约开发:使用 Solidity,开发者可以创建自定义的智能合约,这些合约可以处理数字货币(以太币)的交易、管理数字资产、实现投票系统、构建去中心化应用等。
  5. 安全性:Solidity 强调智能合约的安全性,但也容易引入漏洞,如重入攻击、整数溢出和逻辑错误。因此,开发者需要小心编写合约,并经常进行审查和测试。
  6. 事件驱动:Solidity 支持事件,可以在合约状态发生变化时触发事件,允许 DApps 监听和响应合约的活动。
  7. Gas 费用:在以太坊上运行智能合约需要支付 Gas 费用,Solidity 允许开发者优化合约以降低执行成本。
  8. 集成开发环境(IDE):开发者可以使用 Solidity 集成开发环境,如 Remix 和 Truffle,来编写、测试和部署智能合约。
  9. ERC-20 和 ERC-721 标准:Solidity 用于实现 Ethereum 的 ERC-20 和 ERC-721 标准,这些标准定义了代币和非同质代币(NFT)合约的接口规范。
  10. 社区支持:Solidity 拥有广泛的社区支持和文档资源,方便开发者学习和解决问题。

2. solidity 常用数据类型

Solidity 是一种用于编写智能合约的编程语言,它具有多种数据类型,用于定义合约中的变量和数据。以下是 Solidity 中常见的数据类型:

  1. 整数类型(Integer Types):

    • uint:无符号整数类型,可以存储正整数。
    • int:有符号整数类型,可以存储正整数和负整数。
    • 可以指定位数,例如 uint8 表示一个8位的无符号整数。
  2. 地址类型(Address Types):
    • address:用于存储以太坊地址的数据类型,通常用于存储用户地址或合约地址。
    • address payable:与 address 类似,但还可以接收以太币(ether)的转账。
  3. 布尔类型(Boolean Type):
    • bool:用于存储布尔值,即 truefalse
  4. 固定大小字节数组(Fixed-size Byte Arrays):
    • bytes1, bytes2, ..., bytes32:用于存储固定大小的字节数组,可以存储原始字节数据。
  5. 动态大小字节数组(Dynamic-size Byte Arrays):
    • bytes:用于存储动态大小的字节数组,可以存储变长字节数据。
  6. 字符串类型(String Type):
    • string:用于存储文本字符串,支持 UTF-8 编码的字符串。
  7. 数组类型(Array Types):
    • type[]:用于存储具有相同数据类型的元素的数组,可以是固定大小或动态大小的。
    • 例如,uint[] 表示一个存储无符号整数的数组。
  8. 映射类型(Mapping Types):
    • mapping(keyType => valueType):用于创建键-值映射,类似于哈希表。
    • 映射中的 keyType 必须是可哈希的类型,而 valueType 可以是任何类型。
  9. 结构体类型(Struct Types):
    • struct:用于自定义数据结构,可以包含多个字段,每个字段可以有不同的数据类型。
  10. 枚举类型(Enum Types):
    • enum:用于定义一组有限的命名常量。每个枚举值都可以与一个整数值相关联。
  11. 函数类型(Function Types):
    • function:用于存储函数的引用,通常用于回调函数或将函数作为参数传递。
  12. 不可变引用类型(Immutable References):
    • viewpure:用于标记函数,表示它们不会修改状态,并且可以安全地读取数据。

这些数据类型允许 Solidity 开发者定义合约中的变量、函数参数和返回值。合约中的数据类型选择取决于合约的需求和逻辑。 Solidity 还支持用户自定义的复杂数据类型,如结构体和枚举,以便更好地组织数据。合理选择和使用数据类型是 Solidity 智能合约开发中的关键部分。

3. 入门合约1

下面是一个简单的 Solidity 合约示例,它实现了一个简单的数字存储合约,允许用户设置和获取一个整数值。这个合约将帮助你了解 Solidity 合约的基本结构和语法。

// 指定 Solidity 的版本
pragma solidity ^0.8.0; // 定义一个合约
contract SimpleStorage {
// 声明一个状态变量,用于存储整数值
uint256 private storedData; // 定义一个事件,用于记录状态变量的变化
event ValueChanged(uint256 newValue); // 合约构造函数,在部署合约时执行一次,用于初始化状态变量
constructor() {
storedData = 0;
} // 设置整数值的函数,只有合约的拥有者可以调用
function set(uint256 newValue) public {
storedData = newValue;
emit ValueChanged(newValue);
} // 获取整数值的函数,可以被任何人调用
function get() public view returns (uint256) {
return storedData;
}
}

在这个示例中,我们创建了一个名为 SimpleStorage 的合约。这个合约包括以下要点:

  1. 使用 pragma solidity 指令指定 Solidity 的版本。
  2. 声明了一个名为 storedData 的状态变量,用于存储整数值。这个变量是私有的,只能在合约内部访问。
  3. 定义了一个 ValueChanged 事件,用于记录状态变量的变化。
  4. 在构造函数中,将 storedData 初始化为 0。
  5. 实现了一个 set 函数,允许合约的拥有者设置整数值,并触发 ValueChanged 事件。
  6. 实现了一个 get 函数,允许任何人查看存储的整数值。

要使用这个合约,你需要执行以下步骤:

  1. 部署合约:使用以太坊钱包或 Solidity 开发工具,将这个合约部署到以太坊网络上。
  2. 设置值:使用合约的拥有者地址调用 set 函数,设置存储的整数值。
  3. 获取值:任何人都可以使用 get 函数查看存储的整数值。

这只是一个非常简单的示例,但它涵盖了 Solidity 合约的基本结构,包括状态变量、构造函数、函数、事件等。你可以根据需要扩展这个示例,创建更复杂的智能合约。注意,智能合约的开发需要谨慎,特别是在处理资金和重要数据时,请务必小心编写和测试代码。

4. 入门合约2

下面的合约实现了一个简单的数字投票系统。合约允许用户为不同的候选人投票,并且可以查询每个候选人的得票数。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0; // 声明一个智能合约
contract SimpleVoting {
// 声明候选人结构体
struct Candidate {
uint256 id;
string name;
uint256 voteCount;
} // 使用数组存储候选人列表
Candidate[] public candidates; // 用于存储每个地址的投票记录
mapping(address => bool) public voters; // 添加候选人
function addCandidate(string memory _name) public {
// 检查调用者是否已投票
require(!voters[msg.sender], "You can only add one candidate."); uint256 candidateId = candidates.length;
candidates.push(Candidate(candidateId, _name, 0));
voters[msg.sender] = true;
} // 进行投票
function vote(uint256 _candidateId) public {
// 检查调用者是否已投票
require(!voters[msg.sender], "You can only vote once."); // 检查候选人是否存在
require(_candidateId < candidates.length, "Candidate does not exist."); // 增加候选人的得票数
candidates[_candidateId].voteCount++; // 标记调用者已投票
voters[msg.sender] = true;
} // 查询候选人的得票数
function getVotes(uint256 _candidateId) public view returns (uint256) {
require(_candidateId < candidates.length, "Candidate does not exist.");
return candidates[_candidateId].voteCount;
}
}

这个合约包括以下主要部分:

  1. 候选人结构体 Candidate:包括候选人的ID、姓名和得票数。
  2. 候选人列表 candidates:用于存储候选人的数组。
  3. 投票者记录 voters:用于记录哪些地址已经投票,防止重复投票。
  4. addCandidate 函数:允许任何地址添加候选人。
  5. vote 函数:允许任何地址投票给特定的候选人。
  6. getVotes 函数:允许查询特定候选人的得票数。

合约的调用者可以通过调用函数来添加候选人、投票和查询候选人的得票数。这只是一个非常简单的示例,用于演示 Solidity 合约的基本构建块。在实际应用中,你可以根据需求扩展和优化合约。确保在以太坊测试网络上进行测试和部署合约,以确保其正常运行。

5. 使用 Remix 进行调试

Remix IDE 是一个基于 Web 的区块链智能合约开发环境,它提供了许多有用的功能,包括智能提示(代码补全)功能,以帮助开发者更高效地编写 Solidity 智能合约。智能提示可以在你输入代码时,自动显示可能的选项,从而加速代码编写和减少错误。

以下是如何在 Remix IDE 中调试智能合约的步骤:

  1. 打开 Remix IDE

    访问 Remix IDE 的网站:https://remix.ethereum.org/
  2. 创建或打开合约

    在 Remix IDE 中,你可以创建新的合约或打开已有的合约文件。选择左侧菜单栏中的 "File Explorer",然后点击 "Open" 按钮,选择你的 Solidity 合约文件,或者点击 "Create" 创建一个新的合约文件。
  3. 选择 Solidity 版本

    在左上角的选择框中,选择你要使用的 Solidity 版本。选择一个你熟悉的版本,通常会是最新的版本。
  4. 编写代码

    在代码编辑区域中,开始编写 Solidity 智能合约。当你输入代码的时候,智能提示会自动弹出。
  5. 保存合约

    在完成代码编写后,记得点击左上角的保存按钮,将合约保存到 Remix IDE 的本地存储中。
  6. 运行合约

    一旦合约编写完成,你可以使用 Remix IDE 提供的 "Deploy & run transactions" 功能来部署和测试你的合约。

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

Author: mengbin

blog: mengbin

Github: mengbin92

cnblogs: 恋水无意


solidity入门的更多相关文章

  1. Solidity 入门

    基本语法 版本指令 所有Solidity源码都必须指明版本,用于标明Solidity编译器的版本,这是为了避免将来新的编译器破坏代码 pragma solidity ^0.4.20; // 声明版本 ...

  2. Solidity中的基本类型转换

    Solidity中的基本类型转换(十四)|入门系列 2017/4/29 posted in Solidity入门系列 点击查看原文,获得优化的排版. 隐式转换 如果一个运算符能支持不同类型.编译器会隐 ...

  3. 《区块链DAPP开发入门、代码实现、场景应用》笔记2——Solidity实现简单的智能合约

    本节仅以一个简单的智能合约示例,介绍智能合约的基本组成元素,本合约定义一个uint类型的变量,以及对应这个变量的读写函数. 01 pragma solidity >=0.4.0 <0.6. ...

  4. 区块链入门到实战(38)之Solidity – 条件语句

    Solidity支持条件语句,让程序可以根据条件执行不同的操作.条件语句包括: if if...else if...else if 语法 if (条件表达式) { 被执行语句(如果条件为真) } 示例 ...

  5. 区块链入门到实战(37)之Solidity – 循环语句

    与其他语言类似,Solidity语言支持循环结构,Solidity提供以下循环语句. while do ... while for 循环控制语句:break.continue. Solidity – ...

  6. 区块链入门到实战(36)之Solidity – 运算符

    Solidity – 算术运算符 Solidity 支持的算术运算符,如下表所示: 假设变量A的值为10,变量B的值为20. 序号 运算符与描述 1 + (加)求和例: A + B = 30 2 – ...

  7. 区块链入门(5)Truffle 项目实战,Solidity IDE, 智能合约部署

    在上一张我们学习了Truffle项目的创建,部署等相关内容,今天我们就来实战一下. 今天我们要做3件事: 1) 学习搭建一个Solidity IDE(Remix). 2) 使用这个Solidity I ...

  8. Solidity 文档--第一章:智能合约入门

    一个简单的智能合约 先从一个非常基础的例子开始,不用担心你现在还一点都不了解,我们将逐步了解到更多的细节. 存储 contract SimpleStorage { uint storedData; f ...

  9. 区块链入门到实战(35)之Solidity – 变量作用域

    局部变量的作用域仅限于定义它们的函数,但是状态变量可以有三种作用域类型. Public – 公共状态变量可以在内部访问,也可以通过消息访问.对于公共状态变量,将生成一个自动getter函数. Inte ...

  10. 区块链入门到实战(34)之Solidity – 变量

    Solidity 支持三种类型的变量: 状态变量 – 变量值永久保存在合约存储空间中的变量. 局部变量 – 变量值仅在函数执行过程中有效的变量,函数退出后,变量无效. 全局变量 – 保存在全局命名空间 ...

随机推荐

  1. 代码发布平台jenkins中Check-out Strategy选项功能意义

    第一个选项:Use'svn update' as much as possible  这个选项能实现快速发布:Use 'svn update' whenever possible, making th ...

  2. fdisk 命令 创建分区 实现扩容

    fdisk 命令 创建分区 实现扩容 Linux fdisk命令简介 Linux fdisk 是一个创建和维护分区表的程序,它兼容 DOS 类型的分区表.BSD 或者 SUN 类型的磁盘列表. 菜单操 ...

  3. 【Python】爬虫-Xpath

    Xpath 文章参考:https://www.cnblogs.com/mxjhaima/p/13775844.html#案例 安装 pip install lxml 引用 from lxml impo ...

  4. SDK 接入|游戏语音之“范围语音”接入实践

    语音是线上游戏用户的主要交流方式,大多数用户会通过游戏中的内置语音功能与其他玩家沟通,而一些用户在游戏没有内置语音功能的情况下,通过其他语音软件与玩家沟通. 并且,游戏语音在玩家开黑时承担着至关重要的 ...

  5. DDD架构为什么应该首选六边形架构?

    一.传统分层架构 分层架构的一个重要原则是:每层只能与位于其下方的层发生耦合. 分层架构分两种:一种是严格分层架构,规定某层只能与直接位于其下方的层发生耦合:另一种是松散分层架构,允许任意上方层与任意 ...

  6. FreeBSD 内核模块和硬盘相关

    查看已加载的内核模块 使用命令:kldstat 加载驱动: kldload xx 查看识别到的硬盘 使用命令:dmesg | grep sector freeBSD 查看硬件信息 使用命令:dmesg ...

  7. 2021-10-09 Core学习

    控制器学习 如果有ID参数,根据前面定义的{controller=Home}/{action=Index}/{id?} 可以换成一下格式 页面学习 视图 基架搭建 然后在nuget控制台添加 Add- ...

  8. 文心一言 VS 讯飞星火 VS chatgpt (67)-- 算法导论6.5 6题

    文心一言 VS 讯飞星火 VS chatgpt (67)-- 算法导论6.5 6题 六.在 HEAP-INCREASE-KEY 的第 5 行的交换操作中,一般需要通过三次赋值来完成.想一想如何利用IN ...

  9. 角度新奇!第一次看到这样使用MyBatis的,看得我一愣一愣的。

    你好呀,我是歪歪. 这期给大家分享一个读者给我分享的一个关于 MyBatis 的"编程小技巧",说真的,这骚操作,直接把我看得一愣一愣的. 我更情愿叫它:坑你没商量之埋雷大法. D ...

  10. 继copilot之后,又一款免费帮你写代码的插件

    写在前面 在之前的文章中推荐过一款你写注释,它就能帮你写代码的插件copilot copilot写代码的能力没得说,但是呢copilot试用没几天之后就收费了 传送门:你写注释她帮你写代码 按理说这么 ...