Aderyn的语言服务器:提升Solidity安全性 - Cyfrin

  • cyfrin
  • 发布于 2024-12-27 15:44
  • 阅读 5

Aderyn's Language Server通过实时安全诊断和最佳编码实践提升了Solidity开发者的体验。其最新版本0.3.0引入了基于Language Server Protocol (LSP)的功能,简化了代码检查流程,支持多种编辑器并提供实时反馈。文章详细介绍了LSP的工作原理、技术实现以及未来的扩展计划。

介绍 Aderyn 的语言服务器:通过实时反馈提升 Solidity 安全性

Aderyn 的语言服务器通过在任何代码编辑器中提供实时安全诊断和编码最佳实践,提升 Solidity 开发者的体验。

发布版本 v0.3.0

我们很高兴地宣布,Aderyn 在版本 0.3.0 发布中取得了重大里程碑,该版本推出了 Aderyn 的内置 LSP 服务器。这次更新让我们更接近我们的最终愿景:一个统一的 Aderyn,能够无缝整合 Aderyn 的 CLI 和 即将推出的 VS Code 扩展,以便在开发者编写 Solidity 代码时提供实时反馈。

Cyfrin Aderyn 的标志和字标。

迭代的挑战

到目前为止,使用 Aderyn 需要在 Solidity 项目的根目录手动运行该工具。这会生成一个 markdown 报告,类似于传统的安全审查格式。这种方法的最大缺点是重复性——每当代码更改时,你都需要重新运行命令并重新查看报告。这种工作流很快会变得繁琐和低效,尤其是在进行迭代更新时。

为了解决这个问题,我们最初在 Aderyn 中引入了 watch command,该命令监视项目变更并自动更新报告。然而,这种解决方案也有其自身的一系列局限性。

Watch Command 的不足之处

  1. 对多个编辑器的支持:要支持多个编辑器,需要为每个编辑器构建和维护单独的扩展,并为每个环境定制问题诊断。
  2. 命令管理:每个扩展需要处理启动和管理命令,这涉及权限和进程控制等复杂性。
  3. 性能影响:将命令输出反序列化为可用的诊断信息是扩展的责任。这在 JavaScript 环境中显著减慢了处理速度。

进入语言服务器协议 (LSP)

[语言服务器协议](https://microsoft.github.io/language-server-protocol/#:~:text=The%20Language%20Server%20Protocol%20(LSP,definition%2C%20find%20all%20references%20etc) (LSP),最初由微软提出,为 Watch Command 的挑战提供了强有力的解决方案。LSP 已成为行业标准,许多现代编辑器(如 VS Code)内置了 LSP 客户端,能够与 LSP 服务器进行通信以接收和显示诊断信息。

这种方法简化了一切:

  • 无需多个扩展:由于编辑器已经实现了 LSP 客户端,Aderyn 可以专注于一个 LSP 服务器,大大减少了维护需求。
  • 性能提升:由于 LSP 客户端处理服务器的启动,因此权限和启动逻辑不再由扩展管理。
  • 编辑器本地体验:诊断和问题报告直接通过 LSP 客户端交付给编辑器,遵循用户的设计偏好,无需额外工作。

要激活 Aderyn 的 LSP 服务器,只需运行 aderyn --lsp

Aderyn 的 LSP 如何在幕后工作

Aderyn 的 LSP 服务器 基于强大且文档齐全的 tower_lsp crate,这是一个在 Rust 中实现 语言服务器协议 的流行选择。利用这个 crate,Aderyn 的 LSP 服务器遵循 LSP 规范,确保与已经具备原生 LSP 客户端支持的多种编辑器(如 VS Code、Sublime、Vim 等)兼容。

tower_lsp 的优势

tower_lsp crate 通过提供一个处理客户端(编辑器)与服务器(Aderyn)之间的 JSON-RPC 通信等常见任务的框架,简化了 LSP 服务器的创建。它抽象出了 LSP 生命周期的复杂性,包括初始化、消息处理和方法注册。

Aderyn 的 LSP 服务器利用这个框架:

  • 发布实时诊断:每当代码被修改时,LSP 服务器会扫描它,并在检测到安全问题时将诊断推送给 LSP 客户端。这些诊断会立刻在编辑器中反映出来,问题以行内方式高亮,消除了手动生成报告和审查的需要。
  • 支持未来的可扩展性:使用 tower_lsp 的一个关键优势是可以轻松添加新功能。未来,我们计划引入 代码操作,使 Aderyn 能够高亮脆弱性并在编辑器中直接建议快速修复。
  • 异步处理:Rust 的 async/await 功能结合 Tokio 的异步运行时,使 Aderyn 的 LSP 服务器能够高效处理多个请求。即使在处理大型 Solidity 项目或同时进行诊断请求的情况下,Aderyn 也能快速执行,不会阻塞其他进程。异步运行时确保诊断与用户交互并行生成,使编辑体验保持流畅和响应迅速。

可扩展性和效率

Aderyn 的 LSP 服务器建立在 Tokio 上,Tokio 是 Rust 最成熟和高性能的异步运行时之一,旨在构建快速和可靠的系统。这使得 Aderyn 能够处理多个文件、进行诊断请求,甚至处理未来的实时修复功能。

使用 Tokio 为 Aderyn 的 LSP 服务器带来的主要好处包括:

  • 并发性:开发者在编码时不会遇到减速,因为多个请求可以同时处理。例如,扫描文件的同时处理来自编辑器的 LSP 消息。
  • 非阻塞 I/O:Aderyn 频繁与文件系统进行交互(读取 Solidity 文件和报告诊断)。Tokio 的非阻塞 I/O 能力确保这些任务高效执行,不会阻碍关键进程。

Aderyn 的 LSP 服务器诊断流程

工作流程包括:

  1. 文件变更检测:当文件变更时,Aderyn LSP 服务器会通过 https://github.com/notify-rs/notify 接收到通知(例如,Solidity 合同被更新)。
  2. AST 分析:Aderyn 会为修改后的 Solidity 文件生成抽象语法树(AST),并运行其脆弱性检测器。检测器分析 AST 节点的模式,以指示潜在的安全缺陷(例如重入风险、未检查的外部调用等)。
  3. 诊断报告:在识别到问题时,服务器将其格式化为 LSP 兼容的诊断,内容包括:
  • 范围:发现问题的具体行和列。
  • 严重性:问题是警告还是信息。
  • 消息:对问题的清晰描述以及为什么它构成风险。

实时反馈:诊断会发送到编辑器的 LSP 客户端,作为警告或错误展示在开发者的编辑器中。这一切都是实时发生的,使开发者在编码时获得即时反馈。

可扩展性和未来增强

使用 tower_lsp 还使 Aderyn 能够支持更多的 LSP 特性,超越诊断功能。在未来版本中,我们计划加入:

  • 代码操作:根据检测到的脆弱性建议自动代码修复或改进。例如,如果 Aderyn 标记了一个危险的外部调用,它可以通过将其包装在 require 语句中来自动修复,以确保其安全性。
  • 悬停文档:当用户悬停在标记的代码片段上时,显示关于特定 Solidity 函数或脆弱性的上下文信息,从而更容易理解潜在问题。
  • 重构建议:提供以安全为导向的重构选项,可能改善合同安全性。

简而言之,这一与 tower_lspTokio 的集成为 Aderyn 不仅在实现实时诊断方面奠定了基础,还让其演变为 Solidity 开发者的综合安全助手。

结论

版本 0.3.0 的发布是 Aderyn 的一个转折点。原生 LSP 服务器的推出让 Aderyn 更接近一个真正统一的平台,并简化了编写基于 Solidity 的智能合约的开发者体验。

我们很期待社区对这一新功能的看法以及他们如何使用它。在我们继续扩展 Aderyn 功能的同时,我们的目标始终不变:让区块链开发对每个人来说更安全。

开始吧,访问 Aderyn 仓库 在 GitHub 上。

  • 原文链接: cyfrin.io/blog/introduci...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
cyfrin
cyfrin
Securing the blockchain and its users. Industry-leading smart contract audits, tools, and education.