最后更新:
Solidity 是一种大括号、高级且面向对象的编程语言,专为设计和实现智能合约而创建。[3][6]
Solidity 是一种大括号语言,受到了几种知名编程语言的影响和启发。Solidity 受 C++ 的影响最为深远,但也借鉴了 Python、JavaScript 等语言的概念。[6]
Solidity 是一种面向合约的编程语言,由 Ethereum 网络团队设计,用于实现 smart contracts。它从 C++、Python 和 JavaScript 等编程语言中汲取灵感。Solidity 源代码被编译为 Ethereum Virtual Machine 字节码,用于为 Ethereum 和 EVM 兼容网络编写 smart contracts。[1][2]
Solidity 的基本概念围绕着使开发者能够在 blockchain 网络上创建 decentralized applications (DApps) 和自执行合约展开。
2014 年 8 月,Ethereum 联合创始人 Gavin Wood 提出了 Solidity 的构想。随后,在 Christian Reitwiessner 的领导下,Ethereum 项目的 Solidity 团队创建并开发了该语言。[7][8]
Solidity 于 2015 年 8 月 7 日首次发布,版本号为 0.1.0。最初,该语言的功能较为基础且有限,但随着时间的推移,Solidity 经历了无数次的改进和发展。
Solidity 迅速在 Ethereum 开发者中流行起来,成为开发 smart contracts 的主要语言。通过 Solidity,开发者可以编写在 Ethereum blockchain 上执行的代码,以执行各种功能和服务。
Solidity 已被用于各种 blockchain 项目和 decentralized applications (dApps)。用 Solidity 编写的 Smart contracts 可以实现多种用途,包括 ERC-20 代币、投票系统、时间锁定资金等。[9]
Solidity 编译器 v0.8.27 于 2024 年 9 月 4 日发布。[4] Solidity v0.8.28 于 2024 年 10 月 9 日发布,在两个编译器流水线中都增加了对值类型瞬态存储(transient-storage)状态变量的全支持。在某些基准测试中,它还将 IR 编译内存使用量减少了高达 80%,运行时间减少了高达 25%。[11]
Solidity v0.8.31 于 2025 年 12 月 3 日发布,将 Osaka 定为默认 EVM 目标,增加了对 CLZ 操作码的支持(该操作码用于计算 256 位字中前导零的个数),并扩展了存储布局说明符以允许常量变量。它还开始对计划在具有破坏性的 0.9.0 版本中移除的功能发布弃用警告,向开发者发出需要处理的兼容性变更信号。[12]
Solidity v0.8.34 于 2026 年 2 月 18 日发布,修复了一个影响 0.8.28 至 0.8.33 版本的严重 IR 代码生成器漏洞。当使用 --via-ir 编译时,在瞬态状态变量上使用 delete 的代码可能会导致编译器在清除相同类型的持久变量和瞬态变量时发出错误的存储操作码。[13]
Solidity v0.8.35 发布于 2026 年 4 月 29 日,增加了 erc7201(一个用于 ERC-7201 命名空间存储的编译时内置功能),并通过 --experimental 选项正式确定了实验模式。它还引入了一个实验性的 SSA 形式控制流图代码生成器,旨在解决 stack-too-deep 错误和 IR 编译缓慢的问题。SSA 生成器仍处于早期阶段,并非默认的 --via-ir 流水线。该版本还描述了计划在 0.9.0 中成为关键字的标识符的弃用警告。[14]
Solidity v0.8.36 发布于 2026 年 7 月 9 日,为仍处于实验性、非默认的 SSA 生成器增加了栈到内存的溢出处理(stack-to-memory spilling),并修复了一个涉及递归函数的不稳健溢出问题。由于 EOF 在 Fusaka 升级中被拒绝且没有 mainnet 支持,该版本还移除了实验性的 EOF 后端。[15]
Solidity v0.8.37 发布于 2026 年 9 月 10 日,是截至 2026 年 10 月 21 日最新的稳定编译器版本。它增加了对 Amsterdam EVM SLOTNUM 操作码的支持,在为 Amsterdam 编译时,该操作码在 Solidity 中表现为 [block](https://iq.wiki/wiki/block).slotnum,在 Yul 中表现为 slotnum();Amsterdam 目标仍处于实验阶段。该版本还用规划算法替换了实验性 SSA 生成器的贪婪栈混洗器。[16]
版本 0.8.37 还修复了几个具有不同受影响范围和条件的重要编译器错误。在旧版流水线中,对内存 bytes 数组元素执行 delete 可能会将后续多达 31 个字节清零;这影响了直至 0.8.36 的版本。在 IR 流水线中,当使用 --via-ir 时,0.7.2 到 0.8.36 版本中的某些互递归函数可能会发生栈到内存溢出的冲突。该版本还修复了在 IR 流水线中将自定义错误的命名参数传递给 require 时,revert 数据中参数顺序错误的问题。[16]
从 C++ 的影响中可以看出变量声明的语法、for 循环、函数重载的概念、隐式和显式类型转换以及许多其他细节。[6]
Solidity 曾部分受到 JavaScript 的影响。这是由于变量的函数级作用域以及关键字 'var' 的使用。从 0.4.0 版本开始,JavaScript 的影响有所减少。现在,与 JavaScript 剩下的主要相似之处是使用关键字 'function' 来定义函数。[6]
Solidity 还支持与 JavaScript 中类似的导入语法和语义。除了这些点之外,Solidity 看起来像大多数其他大括号语言,不再有主要的 JavaScript 影响。[6]
Solidity 的另一个影响来自 Python。Solidity 的修改器(modifiers)是在尝试模拟 Python 的装饰器(decorators)时添加的,但功能受限得多。[6]

以下是 Solidity 的一些基本概念。[3]
Solidity 可用于以下智能合约平台:[5]
Ethereum 与 Solidity 的结合使开发者能够创建各种复杂的应用程序。随着 Ethereum 提供去中心化平台以及 Solidity 提供强大的编程语言,开发者拥有了创建安全、高效且透明的智能合约所需的工具。
开发者使用 Solidity 编写智能合约,然后将其部署在 Ethereum 区块链上。一旦智能合约部署完成,它就独立于任何其他合约或应用程序而存在。它拥有自己的以太坊地址和余额,并且可以像以太坊网络上的任何其他参与者一样发起和接收交易。
当交易触发智能合约时,以太坊网络会执行该合约的代码。这些代码可以执行广泛的操作,从转账资金到与其他合约进行交互。[10]
另一个挑战是应对 Ethereum 的可扩展性和效率问题,这限制了智能合约的吞吐量和速度,并增加了 gas 成本,即在网络上执行交易所需的费用。[8]
此外,随着新平台和语言的出现,为智能合约开发提供了不同的特性和权衡,紧跟 blockchain 领域的创新和竞争也是另一项挑战。
为了应对这些挑战并满足社区的需求和期望,Solidity 多年来通过定期的更新和增强不断演进和改进。
一些最重大的变化包括引入了新的类型(如结构体、枚举和映射),支持继承、接口和库,增加了修饰符、事件和错误处理,实施了安全检查和最佳实践(如 require 和 revert 函数),优化了 gas 使用和字节码生成,以及与外部源和系统的集成(如预言机和跨链通信)。[8]