什么是 Solidity?
作者 Alchemy
随着 web3 行业的发展,开发者可以选择的 web3 编程语言也越来越多。每种语言在编写智能合约时都有不同的优势和权衡。语言之间的差异可能体现在对特定区块链的支持上,也可能体现在速度、可读性或安全性等特性上。
作为为 Ethereum 区块链设计的智能合约语言,Solidity 是一门功能强大的编程语言,用于为区块链行业最大的开发者生态系统构建去中心化应用。
在本文中,我们将通过 Solidity 的历史、语言渊源及用途来介绍这门语言。最后,我们还会提供一些优质的开发者资源,供你通过免费的 Solidity 课程以及学习 web3 开发的资源继续学习。
什么是 Solidity?
Solidity 于 2014 年提出,是一门面向对象的高级编程语言,用于实现运行在Ethereum Virtual Machine(EVM)上的智能合约。 Solidity 的设计受到 C++ 和 JavaScript 等知名编程语言的启发。作为 web3 开发者,学习 Solidity 对学习 web3 开发大有帮助。
本节将介绍 Solidity 的历史、它与其他编程语言之间的相似之处,并说明 Solidity 的主要用途。
Solidity 是谁创建的?
2014 年,Ethereum 的 CTO Gavin Wood 提出了 Solidity,旨在满足 Ethereum 对一门图灵完备的编程语言的需求,用于编写智能合约。
Ethereum 的创始人 Vitalik Buterin 提出将 Ethereum 作为一种协议,在 Bitcoin 开创的区块链功能基础上进行扩展,增加了智能合约的功能。按照他的设想,Ethereum 能够运行一套精细的智能合约网络,这些合约是运行在分布式全球计算机网络上的、按条件执行的代码。智能合约使开发者能够创建新的加密货币、构建 DeFi 应用等等。
Solidity 项目团队由 Christian Reitwiessner 领导,他们成功创建了一门图灵完备的面向对象编程语言,用于实现智能合约。作为一门高级语言,意味着开发者在编写智能合约时无需操作内存或字节码等系统级信息即可完成计算。
图灵完备指的是一个数据处理系统(在这里指编程语言)能够模拟图灵机行为的能力。从理论上讲,Solidity 需要能够执行开发者可能需要的任何计算。
Solidity 基于哪些编程语言?
Solidity 在开发过程中受到多种现有编程语言的影响,包括 C++、Python 和 JavaScript。
Solidity 与 C++ 的相似之处
Solidity 在变量声明和 for 循环上使用了与 C++ 相同的语法。此外,Solidity 还支持 C++ 风格的函数重载,即当两个函数同名但接受的参数不同时所需要的机制。
此外,Solidity 支持隐式和显式类型转换。也就是说,变量类型可以由开发者在代码中显式转换,也可以在计算需要时自动转换。
Solidity 与 JavaScript 的相似之处
Solidity 曾经深受 JavaScript 的影响。如今,最明显的相似之处体现在 Solidity 使用 “function” 关键字来定义函数。
对于熟悉 Solidity 部分主要影响来源语言的开发者来说,学习 Solidity 会相当容易上手。此外,Solidity 是静态类型语言,支持使用库,也支持创建复杂类型。
Solidity 与 Python 的相似之处
Solidity 受 Python 的影响在语法层面并不明显,但与 Python 类似,Solidity 使用 C3 线性化、多重继承,并保留了 “super” 关键字。
Vyper 与 Solidity 类似,采用 Python 风格的语法,其设计目的是提高 EVM 兼容区块链上智能合约的安全性。
Solidity 是如何被使用的?
由于其作为区块链编程语言的本质,Solidity 从一开始就被设计为可以在 Ethereum Virtual Machine(EVM)上编译执行。因此,Solidity 能够为任何 EVM 兼容的区块链编写安全的、与 Ethereum 兼容的智能合约。
这种广泛的兼容性,加上易于理解和灵活的功能,使 Solidity 成为该行业中使用最广泛的区块链开发语言。
Solidity 是如何运作的?
Solidity 开发者编写的智能合约是运行在 EVM 上的程序。与其他语言中的类类似,智能合约可以拥有多个函数、内部状态和公共声明。
Solidity 合约会被编译为字节码,供 EVM 读取。编译完成后,Solidity 合约与用 Vyper 或 Huff 等其他 EVM 智能合约语言编写的合约并无区别。
与其他开发工具一样,Solidity 也会定期进行版本更新。需要注意的是,由于智能合约一旦部署并加入区块链后就不可逆转,因此 Solidity 的版本限制只在创建时才有意义。
虽然从理论上讲,Solidity 开发者可以直接用字节码编写 Ethereum 智能合约,但像 Solidity 这样的高级语言让工程师能够更高效地编写合约,而无需进行任何底层操作。
Solidity 如何与 EVM 交互?
以下总结了 Solidity 如何改变 EVM 状态的工作流程:
- 使用 Solidity 编写智能合约
- Solidity 智能合约被编译为字节码
- 字节码被转换为 EVM 操作码(opcode)
- EVM 操作码改变 EVM 的状态
EVM 是 Ethereum “全球计算机”的一台_虚拟状态机_和记录保存器。简单来说,EVM 维护着网络的全局状态,其中包括地址、账户余额和代币持有情况。
Solidity 智能合约的编写目的是对 EVM 的全局状态进行更改。EVM 的全局状态会因铸造代币、发送和接收代币或释放资产等操作而改变。
大量 EVM 操作被编码为EVM 操作码,用来触发这些状态变化。每个 EVM 操作码都设计用于让 EVM 执行某种特定类型的状态变更,例如将代币从一个地址发送到另一个地址、铸造代币,甚至销毁智能合约。
在最后一步中,EVM 会将智能合约的字节码翻译为 EVM 操作码,从而对区块链进行必要的更改。
每个操作码都会产生一定的 gas 费用,以 ETH 计价收取,用以降低恶意行为者用大量请求堵塞网络的风险。因此,一笔交易的总 gas 成本,等于单位 gas 的价格乘以该交易所有操作码的总 gas 消耗量。
哪些 EVM 兼容区块链支持 Solidity?
Solidity 能够为任何 EVM 兼容的区块链编写智能合约,包括 Polygon、Arbitrum 和 Optimism 等 L2。由于 Solidity 灵活且易于使用,因此得到了大量其他区块链的支持。以下是一些支持 Solidity 的主要项目:
1. Polkadot
Polkadot 是一条专注于通过中继链(relay chain)将多条区块链(即平行链,parachain)整合到一条链上的链。Polkadot 的目标是让平行链之间实现互操作,以提升可扩展性并增加带宽。Polkadot 平行链的一个例子是Astar,Alchemy 也支持该链。
2. Avalanche
Avalanche 是 Ethereum 的一个竞争对手,支持 Solidity 开发。Avalanche 的架构基于三条区块链组成的网络:一条用于发行和交易资产(X Chain),一条用于协调网络验证者(P-Chain),还有一条用于创建智能合约(C Chain)。
3. BNB chain(前身为 Binance smart chain)
Binance Smart Chain 最初是 Ethereum 上的一个 ERC-20 代币,为了支持其不断增长的应用生态系统,Binance Smart Chain(BSC)网络应运而生。BSC 及其代币在智能合约中使用 Solidity。如今,Binance Smart Chain 已更名为 BNB Chain。
Solidity 有多受欢迎?
Solidity 是区块链行业中最受欢迎的智能合约编程语言。Solidity 是创建 EVM 兼容智能合约的原生语言。即使在 EVM 之外,也有一些项目内置支持 Ethereum 的虚拟机,例如 Neon Labs 的Solana EVM。
由于区块链行业仍在发展中,Solidity 与其他所有编程语言相比可能看起来使用较少。然而,在这个行业内,Solidity 是应用范围最广的智能合约语言。Solidity 在众多链上以及增长最快的 web3 dApp 生态系统中都有着强劲的应用场景。
根据 The Next Web 旗下 Hard Fork 的一份报告,在带有 blockchain 标签的问题中,Solidity 出现的频率是排名第二的竞争者的两倍。JavaScript 的占比仅为 4.8%,而 Solidity 的占比为 9.5%。
Solidity 在 Ethereum 上是如何使用的?
看一些 Solidity 在 Ethereum 上使用的示例,可以让你直观感受到用 Solidity 代码创建灵活智能合约的简洁性。官方Solidity 文档中的代码示例是很好的入门材料。
智能合约
以下是 Solidity 文档中的一个简单代码示例,它在 Ethereum 上创建了一种简单的货币。

注意其中的函数声明,以及合约中的私有和公共变量。函数让合约能够在链上执行不同的操作,在此例中即为从一个地址向另一个地址发送代币,以及铸造代币。
公共变量可以从合约外部访问,并会自动生成 getter 函数,用于获取这些变量的值。 event 关键字让客户端应用程序能够监听合约引发的状态变化。
在这个例子中,客户端会看到 sent 事件,它向监听者表明地址 msg.sender 向地址 receiver 发送了一定_数量_(amount)的代币。
什么是 Solidity ERC 标准?
Solidity 智能合约的设计基础是 ERC(Ethereum Request for Comment)标准,这些标准旨在改进和统一各类 Ethereum 代币的实现方式。
ERC 标准由 EIP(Ethereum Improvement Proposal)提出。ERC 标准一旦获得批准并最终确定,就会成为编写 Solidity 合约的标准。这为构建智能合约提供了一套通用的Solidity 接口模板。当 Solidity 开发者按照现有 ERC 标准构建代币时,他们就能清楚地知道这些代币在链上会如何正确运行。
一些应用最广泛的 ERC 标准包括:
如何学习 Solidity 编程
你已经了解了什么是 Solidity,但该如何开始学习呢?作为最受欢迎的智能合约语言,网上有大量资源可供你开始学习 Solidity 开发。
学习 Solidity 的最佳方式之一,是参加 Alchemy University 的7 周 Solidity 训练营。该课程最初由 ChainShot(一支领先的 web3 工程师团队)打造,Alchemy 于 2022 年 8 月收购 ChainShot 后对其进行了重新设计。
这个 Ethereum 开发者训练营最初是一门售价 3,000 美元的认证课程,现在已经免费开放。快去预约名额,加入 Alchemy University 吧。
Solidity 资源
本节为你提供一些学习 Solidity 开发的优质在线资源。
- Solidity 官方文档 - 将该文档作为你学习 Solidity 开发的主要资料。
- Solidity by Example - 收录了从“Hello World”程序到钱包应用和 DeFi 的一系列 Solidity 示例。
- Clean Contracts - 关于如何编写安全、可预测的智能合约的指南,附有 Solidity 代码示例。
- OpenZeppelin 出品的 Ethernaut - 一款基于智能合约的攻防游戏,每一关都需要你去攻破一个智能合约。
开始使用 Solidity 进行开发
本文向你介绍了 Solidity,并提供了开始学习 Solidity 开发所需的资源。Solidity 是一门极其灵活且强大的语言,可用于在 Ethereum 及其他 EVM 兼容区块链上开发去中心化应用。
当你对自己的知识有信心后,不妨在 Sepolia 测试网上部署一个应用、参加一场 web3 黑客松,开始尝试打造属于自己的 web3 创业项目吧!
相关概览

构建区块链应用
Alchemy 将最强大的 Web3 开发者产品和工具与资源、社区及专业支持结合在一起。


