---
title: "什么是 Solidity？"
description: "Solidity 简介：Web3 中最流行的编程语言"
---

# 什么是 Solidity？

随着 web3 行业的发展，开发者可以选择的[web3 编程语言](https://www.alchemy.com/overviews/web3-programming-languages)越来越多。每种语言在编写智能合约时都有不同的优势和取舍。语言之间的差异可能体现在对特定区块链的支持上，也可能体现在速度、可读性或安全性等特性上。

作为以太坊区块链的智能合约语言而开发，[Solidity](https://www.alchemy.com/dapps/solidity) 是一种功能强大的编程语言，用于为区块链行业中最大的开发者生态系统创建[去中心化应用](https://www.alchemy.com/dapps/top/defi-dapps)。

在本文中，我们将从 Solidity 的历史、语言影响来源和用途等方面对其进行介绍。最后，我们会提供一些优质的开发者资源，供你通过[免费的 Solidity 课程](https://www.alchemy.com/university/courses/solidity)和[web3 开发学习资源](https://www.alchemy.com/overviews/learn-solidity)继续学习。

## **什么是 Solidity？**

**Solidity 于 2014 年提出，是一种面向对象的高级编程语言，用于实现运行在**[**以太坊虚拟机（EVM）**](https://www.alchemy.com/overviews/what-is-the-ethereum-virtual-machine-evm)**上的智能合约。** Solidity 受到了 C++ 和 JavaScript 等知名编程语言的影响。作为 web3 开发者，学习 Solidity 有助于学习 [web3 开发](https://www.alchemy.com/overviews/how-to-learn-web3-development)。

本节将向你介绍 Solidity 的历史，说明 Solidity 与其他编程语言之间的相似之处，并解释 Solidity 的主要用途。

### **Solidity 是谁创建的？**

**2014 年，以太坊的 CTO Gavin Wood 提出了 Solidity，作为满足以太坊对编写智能合约所需的图灵完备编程语言需求的一种语言。**

以太坊的创始人 **Vitalik Buterin** 提出，以太坊是一种协议，旨在扩展比特币开创的区块链功能，并加入了[智能合约的功能](https://www.alchemy.com/overviews/solidity-smart-contract)。按照他的构想，以太坊能够运行一个由智能合约组成的复杂网络，这些智能合约是在分布式全球计算机网络上有条件执行的代码片段。智能合约使开发者能够创建新的加密货币、构建 DeFi 应用等等。

Solidity 项目团队由 **Christian Reitwiessner** 领导，他们成功创建了一种用于实现智能合约的图灵完备的面向对象编程语言。作为一种高级语言，这意味着开发者在创建智能合约时无需操作内存或字节码等系统级信息来执行计算。

图灵完备性是指数据操作系统（在此指编程语言）模拟图灵机行为的能力。从理论上讲，Solidity 需要能够执行开发者可能需要的任何计算。

### **Solidity 基于哪些编程语言？**

Solidity 在开发过程中借鉴并受到了多种现有编程语言的影响，包括 C++、Python 和 JavaScript。

#### **Solidity 与 C++ 的相似之处**

Solidity 在变量声明和 for 循环方面使用了与 C++ 相同的语法。此外，Solidity 还支持 C++ 风格的[函数重载](https://www.alchemy.com/overviews/solidity-functions)，即当两个函数名称相同但接受的参数不同时所需的特性。

此外，Solidity 允许隐式和显式类型转换。这意味着变量类型既可以通过开发者显式编写代码来转换，也可以在计算需要时自动转换。

#### **Solidity 与 JavaScript 的相似之处**

Solidity 过去曾深受 JavaScript 的影响。如今，最明显的相似之处在于 Solidity 使用 “function” 关键字来定义函数。

对于熟悉 Solidity 主要影响来源的开发者来说，学习 Solidity 会相对容易。此外，Solidity 是静态类型语言，支持使用库，也支持创建复杂类型。

#### **Solidity 与 Python 的相似之处**

Solidity 受 Python 的影响在语法上不太明显，但与 Python 类似，Solidity 使用 C3 线性化、多重继承，并保留了 “super” 关键字。

[Vyper 与 Solidity 类似](https://www.alchemy.com/overviews/solidity-vs-vyper)，采用 Python 式语法，其设计目的是提高在兼容 EVM 的区块链上使用的智能合约的安全性。

### **Solidity 是如何使用的？**

由于其作为区块链编程语言的本质，Solidity 从一开始就是为了在以太坊虚拟机（EVM）上编译而设计的。因此，Solidity 能够为任何兼容 EVM 的区块链编写安全的、兼容以太坊的智能合约。

这种广泛的兼容性，加上其易于理解和灵活的功能，使 Solidity 成为该行业中使用最广泛的区块链开发语言。

## **Solidity 是如何工作的？**

Solidity 开发者编写智能合约，这些合约是运行在 EVM 上的程序。与其他语言中的类类似，智能合约可以拥有多个函数、内部状态和公开声明。

Solidity 合约会被[编译成字节码](https://www.alchemy.com/overviews/solidity-compiler)，供 EVM 读取。编译完成后，Solidity 合约与用 Vyper 或 **Huff** 等其他 EVM 智能合约语言编写的合约看起来并无区别。

与其他开发者工具一样，Solidity 也会定期进行版本更新。需要注意的是，由于智能合约一旦部署并加入区块链就不可逆转，Solidity 的版本限制只在创建时才有意义。

虽然[Solidity 开发者](https://www.alchemy.com/overviews/how-to-become-a-solidity-developer)理论上可以直接用字节码编写以太坊智能合约，但像 Solidity 这样的高级语言可以让工程师更高效地编写合约，而无需进行任何底层操作。

### **Solidity 是如何与 EVM 交互的？**

以下总结了 Solidity 如何改变 EVM 状态的工作方式：

1. 用 Solidity 编写智能合约
1. Solidity 智能合约被编译成字节码
1. 字节码被转换为 EVM 操作码
1. EVM 操作码改变 EVM 的状态

EVM 是以太坊“全球计算机”的一台*虚拟状态机*和记录保存者。简单来说，EVM 维护着网络的全局状态，包括地址、账户余额和代币持有情况。

Solidity 智能合约的编写目的是对 EVM 的全局状态进行更改。EVM 的全局状态会因铸造代币、发送和接收代币或释放资产等操作而改变。

一系列编码为[EVM 操作码](https://ethereum.org/en/developers/docs/evm/opcodes/)的 EVM 操作会触发这些全局状态的变化。每个 EVM 操作码都被设计用来促使 EVM 执行特定类型的状态变化，例如将代币从一个地址发送到另一个地址、铸造代币，甚至销毁智能合约。

在最后一步中，EVM 将智能合约的字节码转换为 EVM 操作码，从而对区块链进行必要的更改。

每个操作码都伴随着一定的 *gas 费用*，以 ETH 计费，用于降低恶意行为者用大量请求堵塞网络的风险。因此，一笔交易的总 gas 成本由单位 gas 价格乘以该交易所有操作码的总 gas 成本计算得出。

## **哪些兼容 EVM 的区块链支持 Solidity？**

Solidity 能够为任何兼容 EVM 的区块链编写智能合约，包括 Polygon、Arbitrum 和 Optimism 等 L2。由于 Solidity 灵活且易于使用，许多其他区块链也支持它。以下是一些支持 Solidity 的大型项目：

### 1. Polkadot

Polkadot 是一条专注于通过中继链将多条区块链（即平行链）整合到一条链上的区块链。Polkadot 的目标是让各平行链实现互操作性，从而提升可扩展性并增加带宽。Polkadot 平行链的一个例子是[Astar](https://www.alchemy.com/astar)，Alchemy 对其提供支持。

### **2. Avalanche**

Avalanche 是以太坊的竞争对手之一，支持 Solidity 开发。Avalanche 的架构基于由三条区块链组成的网络：一条用于发行和交易资产（X Chain），一条用于协调网络验证者（P-Chain），还有一条支持智能合约创建（C Chain）。

### **3. BNB Chain（原币安智能链）**

[Binance](https://www.alchemy.com/dapps/binance) Smart Chain 最初是以太坊上的一个 ERC-20 代币，为了支持其日益增长的应用生态系统，币安智能链（BSC）网络应运而生。BSC 及其代币在智能合约中使用 Solidity。如今，币安智能链已更名为 BNB Chain。

## **Solidity 的普及程度如何？**

Solidity 是区块链行业中最流行的智能合约编程语言。Solidity 是创建兼容 EVM 的智能合约的原生语言。即使在 EVM 之外，也有一些项目内置了对以太坊虚拟机的支持，例如 Neon Labs 的[Solana EVM](https://www.alchemy.com/overviews/solana-evm)。

由于区块链行业仍在发展中，与其他所有编程语言相比，Solidity 的使用量可能看起来较少。然而，在这个行业内，Solidity 是应用最广泛的智能合约语言。Solidity 在许多链上以及增长最快的 web3 dApp 生态系统中都有强大的应用场景。

根据 **The Next Web 旗下 Hard Fork** 的一份报告，在带有 blockchain 标签的问题中，Solidity 出现的次数是排名第二的语言的两倍。JavaScript 的占比仅为 4.8%，而 Solidity 的占比为 9.5%。

## Solidity 在以太坊上是如何使用的？

通过一些 Solidity 在以太坊中应用的例子，你可以很好地了解 Solidity 代码在创建灵活智能合约方面的简洁性。官方[Solidity 文档](https://docs.soliditylang.org/en/v0.8.16/)中的代码示例是学习该语言的很好入门材料。

### **智能合约**

以下是 Solidity 文档中的一个简单代码示例，用于在以太坊上创建一种简单的货币。

<ImageBlock
  src="https://media.alchemy.com/1704182488-solidity-code-example.png"
  alt="Ethereum 上简单货币智能合约的 Solidity 代码示例"
  width={836}
  height={1384}
  caption="这段代码创建了一种货币。"
/>

请注意合约中的函数声明，以及私有和公开变量。函数使合约能够执行不同的链上操作，在本例中是将代币从一个地址发送到另一个地址，以及铸造代币。

公开变量可以从合约外部访问，并会自动生成 **getter 函数**，用于获取这些变量的值。*event* 关键字使客户端应用程序能够[监听合约引发的变化](https://www.alchemy.com/overviews/solidity-events)。

在这个例子中，客户端会看到 *sent* 事件，该事件表明地址 *msg.sender* 向地址 *receiver* 发送了一定*数量*的代币。

### **什么是 Solidity 的 ERC 标准？**

**Solidity 智能合约的设计基础是 ERC（Ethereum Request for Comment）标准，这些标准旨在改进并规范不同类型以太坊代币的实现方式。**

ERC 标准是通过 EIP（以太坊改进提案）提出的。一旦 ERC 标准获得批准并最终确定，就会成为编写 Solidity 合约的标准，从而为构建智能合约提供通用的[Solidity 接口](https://www.alchemy.com/overviews/solidity-interface)模板。当 Solidity 开发者构建的代币遵循现有 ERC 标准时，他们就能够确保这些代币在区块链上的行为符合预期。

一些应用最广泛的 ERC 标准包括：

- [ERC-20](https://www.alchemy.com/overviews/solidity-events) - 同质化代币标准
- [ERC-721](https://www.alchemy.com/docs/how-to-interact-with-erc-721-tokens-in-solidity) - 非同质化代币标准
- [ERC-1155](https://www.alchemy.com/blog/comparing-erc-721-to-erc-1155) - 半同质化代币标准
- [ERC-4626](https://www.alchemy.com/overviews/erc-4626) - 生息金库标准

## **如何学习 Solidity 编程**

现在你已经了解了什么是 Solidity，那么该如何开始学习 Solidity 呢？作为最流行的智能合约语言，网上有大量资源可供你开始学习 Solidity 开发。

学习 Solidity 的最佳方式之一是参加 Alchemy University 的[为期 7 周的 Solidity 训练营](https://university.alchemy.com/?a=0950a65be4)，该训练营最初由领先的 web3 工程师团队 ChainShot 创建，并在 Alchemy 于 2022 年 8 月收购 ChainShot 后由 Alchemy 重新设计。

这个以太坊开发者训练营原本是一门售价 3000 美元的认证课程，现在完全免费。快去预约，加入 Alchemy University 吧。

## **Solidity 资源**

本节为你提供了一些学习 Solidity 开发的优质在线资源。

1. Solidity 官方文档——将其作为学习 Solidity 开发的主要资源。
1. Solidity by Example——收录了从“Hello World”程序到钱包应用和 DeFi 的各种 Solidity 示例。
1. **Clean Contracts** —— 关于如何用 Solidity 代码示例编写安全且行为可预测的智能合约的指南。
1. [OpenZeppelin](https://www.alchemy.com/dapps/openzeppelin) 出品的 Ethernaut——一款基于智能合约的战争游戏，每一关都需要破解一个智能合约。

## **开始使用 Solidity 进行构建**

本文向你介绍了 Solidity，并提供了开始学习 Solidity 开发的资源。Solidity 是一种极其灵活且强大的语言，可用于在以太坊及兼容 EVM 的区块链上开发去中心化应用。

一旦你对自己的知识感到有信心，不妨在 Goerli 测试网上部署一个应用、参加 web3 黑客松，并开始尝试打造一个 web3 创业项目！
