Solidity v0.8.11 添加了语言服务器的第一个实现,允许更安全地执行 ABI 编码,并修复了多个 bug。
重要新功能
语言服务器预览
语言服务器协议 是一项倡议,允许 IDE 与编译器之间,或者更一般地,语言诊断工具之间更好地互操作。其理念是,无需为每种 IDE 和语言的组合编写不同的插件,每个 IDE 都实现单个客户端,每个编译器都实现单个服务器,由于两者都使用相同的协议,因此可以将它们相互组合。
Solidity 0.8.11 包含一个集成语言服务器的第一个版本,这意味着所有支持语言服务器的 IDE 都将开箱即用地支持 Solidity。
由于我们首先想专注于完善接口,此版本包含最少的功能集:它只能报告错误和警告。
话虽如此,我们预计未来功能将很快完成。我们预计在 2022 年第一季度将添加“跳转到定义”、“重命名”、“查找所有引用”、“显示悬停提示”、“语义高亮”等等。
不幸的是,一个需要更多努力的功能可能是您最期待的功能:自动完成。此功能更加复杂,因为自动完成需要编译器在不完整代码(因为它不完整)中执行符号查找和类型解析。我们有一个可以处理不完整代码的原型,但我们还不知道它有多有用。
如何使用 LSP
如何将您的 IDE 连接到 Solidity LSP 取决于您的 IDE。LSP 目前仅适用于 Solidity 的原生二进制文件(即,如果您通过 javascript/npm 安装 Solidity,则它不起作用)。您需要下载二进制文件并将其路径提供给您的 IDE,再加上以下选项--lsp.
QtCreator:选择工具 → 选项 → 语言客户端。单击“添加”,然后提供 solc 可执行文件的路径和 --lsp 作为选项。
vim/neovim:您需要 coc 插件,并添加以下内容到 coc-settings.json 文件
{ // ... "languageserver": { // ... "solidity": { "command": "/path/to/solc", "args": [ "--lsp" ], "rootPatterns": [".git/"], "filetypes": ["solidity"] } } }
VSCode:具有讽刺意味的是,启动 LSP 项目的 IDE 没有一个通用的插件可以与任意语言服务器结合使用。我们预计 LSP 功能将很快添加到现有的 VSCode Solidity 插件中。在此之前,您可以尝试使用 Christian Parpart 创建的插件 来展示我们的 LSP。
请提供反馈!
我们很高兴发布 Solidity 语言服务器的第一个预览版,并且非常想知道您对此的看法。请告诉我们您的想法!
- 您认为哪些未来功能最重要?
- LSP 对您有用吗?
- 它是否易于安装?
- 您是否正在开发一个将从语言服务器中受益的插件或 IDE?
您可以通过 Matrix 或我们 自述文件标题 中链接的其他方式与我们联系。
abi.encodeCall
使用 abi.encodeWithSelector 创建函数调用的调用数据是一种常见模式,这种调用数据仅在稍后执行,例如在多重签名钱包或更复杂的委托合约中。
abi.encodeWithSelector 的问题是,编译器不会检查提供的 value 是否真正与被调用函数的预期类型匹配。
因此,我们添加了 abi.encodeCall,它类似于 abi.encodeWithSelector,只是它执行了这些类型检查。
abi.encodeCall(contractName.functionName, (arg1, arg2, arg3)) 与 abi.encodeWithSelector(contractName.functionName.selector, arg1, arg2, arg3) 相同,区别在于编译器会检查 arg1、arg2、arg3 的类型是否与 contractName.functionName(arg1, arg2, arg3) 形式的调用兼容。
完整变更日志
语言功能
- 通用:新的内置函数 abi.encodeCall(functionPointer, (arg1, arg2, ...)),它会对参数进行类型检查并返回 ABI 编码的函数调用数据。
编译器功能
- 命令行界面:添加 --lsp 选项,让 solc 充当通过 stdio 通信的语言服务器 (LSP)。
错误修复
- 代码生成器:修复使用 @use-src 并从 Yul 编译到 ewasm 时发生的崩溃。
- SMT 检查器:修复在不安全目标被多次解决且反例消息不同的情况下发生的内部错误。
- SMT 检查器:修复分配的存储/内存局部指针的健全性,这些指针没有擦除足够多的知识。
- 修复在函数具有包含内部类型的 calldata 结构体参数时发生的内部错误。
- IR 生成器:修复在复制函数的存储数组时发生的 IR 语法错误。
感谢所有帮助实现此版本的贡献者!
在此下载 Solidity 的新版本:此处。