Solidity智能合约简介

  • Alchemy
  • 发布于 2022-11-27 12:58
  • 阅读 14

本文介绍了Solidity智能合约的概念、工作原理及其属性,详细讨论了Solidity的语法和数据类型,以帮助读者了解如何开始与Solidity智能合约进行交互。

Solidity 智能合约有多种用途,从多重签名钱包到去中心化交易所。Solidity 是为创建智能合约而特别构建的主要 web3 编程语言之一,因而其受欢迎程度稳步增加。

本文将向你介绍 Solidity 智能合约、它们如何工作以及其属性。我们还将详细讲解 Solidity 智能合约的语法和数据类型,以帮助你开始与 Solidity 智能合约互动,为你的下一个项目打下基础。要扩展你对 Solidity 的知识,请完成 Alchemy 大学的 免费 Solidity 语法课程

什么是 Solidity 智能合约?

Solidity 智能合约是一个 用 Solidity 编写的程序,部署在以太坊区块链上,并在以太坊虚拟机(EVM)中执行。以太坊在指定地址存储智能合约代码和数据(其状态)。

当满足预定条件时,存储在区块链上的程序或智能合约会被执行,且无需中介。换句话说,智能合约是控制以太坊状态中账户行为的程序。

你可以用 Solidity 或任何其他 EVM 兼容的编程语言编写智能合约。它们必须首先编译为字节码才能兼容 EVM。

Solidity 是一种面向对象的高级语言,用于编写智能合约。用 Solidity 编写的智能合约可以用于多种用途,如投票、众筹、盲拍和多重签名钱包。

智能合约如何工作?

智能合约是存储在区块链上的程序。智能合约以代码巩固各方之间的协议,并在预条件满足时自动执行规则。这意味着所有参与智能合约的各方都能立即确定结果,避免了时间损失或第三方的介入。智能合约还可以自动化工作流程,以在执行后触发下一个事件。

遵循 ERC20 标准 的智能合约被认为是 ERC20 代币。ERC20 代币允许在持有者之间转移代币。

Solidity 智能合约的属性是什么?

智能合约本质上是不可变的和确定性的。这意味着一旦智能合约在以太坊上部署或构建,它就永远不存在除非在其内部编程了触发自毁的条件。代码将始终按照编程设置的条件执行。

此外,由于每个网络节点能够在给定相同输入的情况下生成相同的结果,智能合约是确定性的。如果不同节点在执行智能合约时得出不同的输出,则共识协议被违反,智能合约就会变得不可用。

此外,智能合约是无权限的,这意味着任何拥有 ETH 并能上网的人都可以在以太坊上部署智能合约。

最后,智能合约是可组合的。这意味着你可以使用其他项目的智能合约作为你的项目的构建模块。智能合约可以被看作是开放的 API,其中用户无需编写自己的智能合约即可成为 dApp 开发者,用户只需知道 如何与它们互动

Solidity 智能合约语法

虽然有许多资源可帮助你 开始学习 Solidity,但本节将概述用于编写 Solidity 智能合约的语法。

1. 合约

Solidity 中的合约类似于面向对象语言中的类。每个合约可以包含状态变量、函数、函数修饰符、事件、错误、结构类型和枚举类型的声明。在本文中,我们将更详细地讨论构造函数、状态变量和整数变量。此外,合约可以继承其他合约。

还有一种特殊的合约称为库和 接口

2. 语义版本控制

Solidity 像大多数软件一样使用语义版本控制。这意味着除非你正在更新主要版本,否则不会有重大更改。你可以在文档中查阅每个 Solidity 版本引入的主要重大更改。截至 2022 年 8 月,最新版本的 Solidity 是 v0. 8.16

3. 构造函数

构造函数在部署或合约创建时仅被调用一次。构造函数是一个 可选函数,用构造函数关键字声明,允许你运行合约初始化代码。

在执行构造函数代码之前,状态变量如果在内联初始化,则初始化为其指定值;如果未初始化,则为其默认值。

构造函数运行后,合约的最终代码被部署到区块链上。

如果没有构造函数,合约将假定使用默认构造函数。

4. 状态变量

状态变量是其值存储在合约存储中的变量。每个函数都有自己的作用域,而状态变量应始终定义在该作用域之外。

状态变量遵循可见性。你可以使用 public 可见性关键字 将状态变量设置为公共,这提供了一个其他智能合约可以访问的 getter 函数。

5. 修饰符

在 Solidity 中, 修饰符以声明性方式修改函数的语义。换句话说,修饰符改变其附加函数的行为。修饰符在消除代码冗余方面非常有用,可以在智能合约中的多个函数中重用,以检查相同的条件。

6. 整数变量

Solidity 中有两种类型的整数变量:无符号整数 (uint) 和有符号整数 (int)。有符号整数是一种值数据类型,可以存储负值和正值。另一方面,无符号整数没有符号,因此是一种必须是非负的值数据类型。

Solidity 数据类型

与其他编程语言一样,Solidity 有多种分类的数据类型。然而,Solidity 独特之处在于各种基本数据类型可以结合形成更复杂的数据类型。本节概述了 Solidity 中的主要数据类型。

1. 布尔值

布尔值在 Solidity 中用 bool 表示,可能的值是常量 true 和 false。

2. 字符串

字符串字面量可以用双引号或单引号书写。字符串还可以分割成多个连续部分,这在处理长字符串时非常有用。

3. 数字

Fixedufixed 分别指有符号和无符号的固定点数,具有不同的大小。

4. 字节

在 Solidity 中,字节指的是 8 位有符号整数。位在内存中以二进制值 0 或 1 存储。在 Solidity 中,数据类型字节表示字节的序列。

Solidity 中有两种字节类型,固定大小字节数组动态大小字节数组。关键字 bytesX 用于定义变量,其中 X 表示从 1 到 32 的字节序列。

在 Solidity 中,字节表示一个动态字节数组。然而,它们不是值类型。

5. 地址

地址持有 20 字节的值,这是以太坊地址的大小。通过地址校验和测试的十六进制字面量属于地址类型。长度在 39 到 41 位之间且未通过校验和测试的十六进制字面量会产生错误。你可以在前面(对于整数类型)添加或在后面(对于 bytesNN 类型)添加零以去除错误。

6. 可支付地址

可支付地址,用 address payable 表示,类似于地址,但有额外的 transfer 和 send 成员。这一区别是必要的,因为普通地址可能是一个没有构建为接受以太币(ETH)的智能合约。可支付地址是一个你可以发送以太币的地址。

7. 枚举

枚举,也称为 Solidity 中的枚举值,是创建用户自定义类型的一种方式,允许创建常量值,例如整数常量的名称。与基本值类型相比,枚举使智能合约更易于阅读和维护。

枚举可以明确地转换为所有整数类型,反之亦然,但不允许隐式转换。从整数的显式转换在运行时检查该值是否在枚举范围内,否则会导致恐慌错误。因此,枚举减少了代码中错误发生的频率。

枚举至少需要一个成员,声明时其默认值为第一个成员。枚举不能有超过 256 个成员。

8. 数组

数组是 相同数据类型的变量组,每个变量都有一个唯一的索引。数组可以有编译时固定的大小,即固定数组,或者可以有动态大小,即动态数组

固定大小的数组在声明时具有预定义大小。不能使用 new 关键字引入附加的数组成员。相反,数据变量必须在内联时初始化。

动态大小的数组在声明时没有预定义大小。相反,它们的大小在运行时确定。

数组元素可以是任何类型,包括映射或结构,即用户定义的数据结构。

9. 映射

在 Solidity 中, 映射像哈希表一样工作或其他编程语言中的字典。映射作为引用类型工作,并以键值对的形式存储数据,其中键可以是任何内置数据类型,除了引用类型,值可以是任何类型。

如果映射类型的状态变量是公共的,Solidity会为你创建一个 getter 函数。

10. 结构体(用户定义类型)

结构体或结构允许你 定义新数据类型。结构类型可以在映射和数组内部使用,并且它们可以包含嵌套的映射和数组。然而,结构体不可以包含自身类型的成员,因为结构体的大小必须是有限的。

智能合约上下文是什么?

智能合约上下文提供有关交易正在运行的环境的信息。 当通过交易调用智能合约函数时,被调用的函数接收一些传递给它的额外信息。在智能合约函数内,你将可以访问这些上下文变量。

你可以访问消息发送者、Gas价格以及交易中的测试。因此,你可以访问一系列可以在代码逻辑中互换使用的上下文变量。

  • 原文链接: alchemy.com/overviews/so...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Alchemy
Alchemy
江湖只有他的大名,没有他的介绍。