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:用于存储布尔值,即 true 或 false。
  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):
    • view 和 pure:用于标记函数,表示它们不会修改状态,并且可以安全地读取数据。

这些数据类型允许 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. The content of element type “web-app“ must match 解决方法

    报错原因 ‍ 问题描述 : 在创建 SpringMVC 时 , 选用 idea 的 webapp 模板来创建 , xml 配置文件中进行配置时发现提示警告 警告如下: ‍ ​ ​ 这错误大概的意思就是 ...

  2. 3. @RequestMapping注解

    1. @RequestMapping 注解的功能 ‍ @RequestMapping 注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系. ‍ SpringMVC 接收到指定的请求 , ...

  3. 信创优选,国产开源,Solon v2.3.6 发布

    Solon 是什么开源项目? 一个,Java 新的生态型应用开发框架.它从零开始构建,有自己的标准规范与开放生态(历时五年,已有全球第二级别的生态).与其他框架相比,它解决了两个重要的痛点:启动慢,费 ...

  4. kafka学习笔记01

      类似于京东商城这种电商系统,一般会在前端页面进行埋点记录仪用户的行为数据,包括浏览.点赞.收藏.评论等.这些行为会被记录到日志服务器中,使用Flume进行采集,然后传入Hadoop中.   Flu ...

  5. Sentieon | 每周文献-Population Sequencing-第一期

    群体基因组系列文章-1 标题(英文):The Impact of ACEs on BMI: An Investigation of the Genotype-Environment Effects o ...

  6. Atcoder ABC244E - King Bombee 题解

    原题: Atcoder ABC244E - King Bombee 题意 给你一张图,从 \(S\) 到 \(T\),经过 \(k\) 条边, 经过 \(X\) 号点偶数次的方案数. 做法 设 \(f ...

  7. 快速实现 CDN 直播

    功能简介 ZEGO Express SDK 支持推流到 CDN(Content Delivery Network,内容分发网络),包括转推 CDN 和直推 CDN 两种功能.开发者基于该功能可打通 R ...

  8. Int64针对32位架构是按照4字节还是8字节对齐?

    作为构建.NET的标准,CLI Spec(ECMA-335)针对基元类型的对齐规则具有如下的描述.按照这个标准,我们是这么理解的:8字节的数据类型(int64.unsigned int64和float ...

  9. 智能制造之路—从0开始打造一套轻量级MOM平台之仓库管理(WMS)

    一.前言 讲仓库管理(WMS)之前,我们先来谈一谈ERP.前一篇文章,大家可以看出,我在做MOM平台规划的时候并没有提到任何ERP的信息,并不是被忽略掉了:而是对于制造企业来说,ERP是重中之重. M ...

  10. Mysql高级1-存储引擎

    一.Mysql体系结构 1.1.连接层 最上层是一个客户端和链接服务,主要完成一些类似于链接处理,授权认证,及相关的安全方案,服务器也会为安全接入的而每个客户端验证它所具有的操作权限 1.2.服务层 ...