Solidity 0.8.30 是一个重要的维护更新,与以太坊的 Pectra 网络升级保持一致。此版本确保与 Pectra 中引入的 Prague EVM 版本完全兼容,并包括关键增强功能、形式验证修复和更好的文档支持。主要变化包括:EVM 默认版本设置为 Prague,支持 Pectra 的 EIP,改进了 NatSpec 对枚举的支持,以及改进了 SMTChecker。
于 2025 年 5 月 7 日发布,Solidity 0.8.30 是一项重要的维护更新,与以太坊的 Pectra 网络升级保持一致。此版本确保与 Pectra 中引入的 Prague EVM 版本 完全兼容,并包括 关键增强、形式验证修复和更好的文档支持——使其成为智能合约开发者必不可少的更新。
无论你是在构建 DeFi 协议、NFT、DAO 还是钱包基础设施,了解 Solidity 0.8.30 中的更新对于与不断发展的以太坊生态系统保持同步至关重要。
Solidity 0.8.30 是一项重点更新,主要旨在支持 Ethereum Pectra 升级,带来:
这些变更中的每一个都有助于更流畅的开发者工作流程、增强的安全性以及改进的跨层兼容性。
变更内容:
默认 EVM 版本现在是 prague
,而不是 cancun
。
重要原因:
Pectra 引入了新的 EVM 行为、操作码和 gas 规则。通过使用 prague
EVM 进行编译,你可以确保你的合约在更新后的以太坊网络上按预期运行。
用例:
部署到以太坊主网或任何采用 Pectra 的 L2。
代码示例:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
// Compile for pre-Pectra networks
pragma evm-version cancun;
contract MyContract {
// Your logic here
}
实用技巧:
对于旧网络,请使用 --evm-version
标志(例如,--evm-version cancun
)或在 JSON 编译中指定 settings.evmVersion
。
🧮 EIP-7623:增加 Calldata 成本
变更内容:
Calldata 变得更加昂贵,以减少带宽使用,响应 EIP-7691 的区块大小调整。Solidity 的 ConstantOptimizer 现在考虑了这一点。
重要原因:
具有大型初始化数据或 calldata 密集型函数(如 NFT 铸造或预言机)的合约将看到 gas 成本增加。
代码示例:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
contract OptimizerExample {
function largeConstant() public pure returns (uint256) {
return 2**256 - 1;
}
实用技巧:
尝试使用不同的 --optimizer-runs
值:
50
:用于最小化部署成本。10000
:用于优化运行时 gas 使用。变更内容:
EIP-7702 引入了一种新的交易类型,使 EOA 能够将控制 委托 给合约,从而支持 账户抽象。Solidity 0.8.29 已经引入了用于在委托合约之间安全共享存储的功能。
重要原因:
通过允许 EOA 的行为与合约类似,使钱包更加智能——从而实现 gas 赞助、社交恢复和批量交易。
代码示例:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
contract DelegateStorage {
struct Data {
uint256 value;
}
mapping(address => Data) private userData;
function setValue(uint256 _value) external {
userData[msg.sender].value = _value;
}
function getValue(address _user) external view returns (uint256) {
return userData[_user].value;
}
}
实用技巧:
使用 显式存储布局 并在与 Pectra 兼容的测试网上测试委托逻辑,以避免数据冲突。
变更内容:
为 BLS12–381 操作添加了 预编译,允许链上 BLS 签名验证。Solidity 不提供直接语法,但允许 staticcall
。
重要原因:
大大降低了 签名聚合 的 gas 成本,适用于 staking、rollups 或 zk-proofs 等用例。
代码示例:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
contract BLSCall {
address constant BLS_PRECOMPILE = 0x0000000000000000000000000000000000000012;
function verifyBLSSignature(bytes calldata input) external view returns (bool) {
(bool success, bytes memory result) = BLS_PRECOMPILE.staticcall(input);
require(success, "BLS call failed");
return abi.decode(result, (bool));
}
}
实用技巧:
注意来自 OpenZeppelin 等库的支持。预编译地址可能有所不同——在实时 Pectra 测试网上进行测试。
变更内容:
枚举值现在支持 AST 中的 NatSpec 注释,使文档工具能够解析和显示它们。
重要原因:
提高了代码清晰度,并支持更好的自动生成文档(适用于 Hardhat、Foundry 或 Doxygen 等工具)。
代码示例:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
contract Governance {
/// @notice Proposal state enum
enum ProposalState {
/// @notice Voting ongoing
Open,
/// @notice Approved by voters
Approved,
/// @notice Rejected by voters
Rejected
}
ProposalState public currentState;
function setState(ProposalState _state) external {
currentState = _state;
}
}
实用技巧:
始终使用 NatSpec 记录枚举,以便在界面和审计中利用更好的用户体验。
变更内容:
三个主要修复:
--model-checker-contracts
时,子集分析 得到改进。bytesN
类型中的 字符串字面量。重要原因:
提高了 Solidity 形式验证的准确性,减少了误报和崩溃。对于任务关键型合约(如 DeFi、预言机或治理系统)至关重要。
代码示例:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
contract SafeBalance {
mapping(address => uint256) public balances;
function transfer(address _to, uint256 _amount) external {
require(balances[msg.sender] >= _amount, "Insufficient balance");
balances[msg.sender] -= _amount;
balances[_to] += _amount;
}
}
实用技巧:
使用 --model-checker-engine all
以最大化 SMTChecker 的覆盖率。运行子集分析时,请关注关键逻辑(如余额、所有权)。
要升级到 Solidity 0.8.30:
npm install solc@0.8.30npm install solc@0.8.30
2. 或者使用 Docker:
docker run ethereum/solc:0.8.30
3. 或者从 GitHub 下载:
Solidity 0.8.30 GitHub Release
🔁 始终在部署到主网之前,在测试网上重新编译并测试你的合约。
- 原文链接: medium.com/@ankitacode11...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!