Sig 工程 - 第六部分 - Sig SVM 的进展

  • syndica
  • 发布于 2025-03-20 18:42
  • 阅读 64

本文介绍了Sig在Solana虚拟机(SVM)实现方面的重要进展,包括eBPF虚拟机、原生程序、原生跨程序调用(CPI)和一致性测试的开发。Sig的SVM旨在实现Solana验证器中的交易执行层,重点介绍了runtime、sBPF虚拟机以及一致性测试,并分享了未来改进和优化的计划。

本文是我们定期发布的、概述 Sig 工程更新的多部分博客文章系列的第 6 部分。你可以在这里找到其他 Sig 工程文章 here .

这篇博文重点介绍了自我们 1 月份的上次更新以来,Sig 在一些主要成就。我们在 Solana 虚拟机(SVM)的实现方面取得了重大进展,包括 eBPF 虚拟机的开发、原生程序(其中一些仍在进行中)、原生跨程序调用(CPI)、一致性测试等等。

Solana 虚拟机(SVM)

Solana 虚拟机(SVM)是 Solana 验证器的交易执行层。从高层次上讲,SVM 由两个关键组件组成:运行时(runtime)和一个 sBPF 虚拟机。运行时协调交易及其指令的执行,而虚拟机则支持任意 sBPF 程序的执行。

注意: Solana 虚拟机(SVM)的精确定义经常被争论(如 Anza 的新 SVM API 博客文章中所述)。有些人认为它仅指 sBPF 虚拟机,而另一些人则认为它包括整个交易处理流程。

运行时(Runtime)

如前所述,运行时协调交易及其指令的执行。每个交易包含一个或多个指令,每个指令指定一个目标程序、一个供目标程序执行的命令以及一个要操作的账户列表。下图提供了运行时如何执行一批交易的高级说明。

注意:有关交易和指令的更多信息,请查看 Solana 的说明 here .

批处理中的交易按顺序执行,因为它们可能会修改相同的账户。如果交易失败,则会记录错误,并且运行时会继续处理下一个交易。同样,交易中的指令按顺序执行,但如果指令失败,则整个交易立即失败。

每个指令的执行首先将其推送到指令堆栈上。然后,处理器 从堆栈中读取指令,并尝试使用关联的账户和数据调用目标程序。在 Solana 中,每个程序要么由原生加载器(Native Loader)拥有,其实现定义在验证器中(例如,SystemProgram),要么由 BPF 加载器程序拥有,并定义为链上程序(例如,Jupiter Program)。

目前,运行时直接调用原生程序(即由原生加载器拥有的程序),方法是查找并调用相关的entrypoint。为了执行链上程序,运行时调用拥有的 BPF 加载器程序,然后该程序在配置的 sBPF 虚拟机中执行目标程序。

如果程序执行 CPI,则会创建一个相应的新指令并将其推送到堆栈以供执行。一旦指令完成,它就会从堆栈中弹出。如果堆栈为空,则下一个交易指令将被推送到堆栈中;否则,该指令必须由 CPI 调用触发,并且调用者的执行继续。

支持针对关键原生程序和基本 sBPF 程序的指令执行是 Sig 运行时开发的当前重点。下面概述了一些关键要求以及我们实现此目标的进展。

上图中省略了一些原生程序,因为由于它们包含在 Core BPF 迁移中并且当前状态,它们将自然地得到支持。

sBPF 虚拟机

SVM 的核心是扩展伯克利数据包过滤器(eBPF)虚拟机(VM)。

VM 是一个抽象的 CPU,它执行一组定义的指令。例如,它可以在寄存器之间移动值,在寄存器中添加值,跳转到不同的指令等。

eBPF 是一种字节码格式,它将指令编码成特定的字节序列。Solana 程序被编译成 Solana 修改后的 eBPF(sBPF)版本,并在符合 Solana 虚拟机指令集架构(SVM ISA)的 VM 上执行。

截至撰写本文时,Sig 现在完全支持 Solana 程序的验证和解析(包括 ELF 文件),以及执行 V1V2V3 中包含的所有 sBPF 指令。

Sig 的实现

通过 sBPF VM 执行指令首先由运行时从目标程序账户加载可执行文件,并将指令账户和数据序列化到内存映射中,该内存映射可以被 VM 解释和操作。然后将可执行文件和内存映射提供给 VM 以供执行。

Solana 程序通常以可执行和可链接格式(ELF)存储。ELF 文件包含“节”(sections),这些节是文件中专门用于存储某种类型数据的区域。例如,.TEXT 节存储 sBPF 指令,.RODATA(只读数据)节存储常量。

为了执行程序,我们首先解析 ELF 文件并解码 sBPF 指令、程序入口点、声明的函数和其他辅助引用。Sig 在没有堆分配的情况下完成此操作,确保快速可靠的过程。

一旦解析了 ELF 文件,就必须对其进行验证。此过程确保只有一个 .TEXT 节,节的数量有效,并且没有节重叠等等许多检查。目前,有三个版本的 sBPF:V1V2 使用更宽松的验证方案,而 V3 引入了更严格和更安全的方法

在 VM 中执行之前,sBPF 指令会经过静态验证。这将验证每个指令,甚至那些可能永远不会执行的指令。如果发现任何无效指令,程序将被拒绝。例如,具有零除数的“立即除法”指令是非法的,并且会导致程序被拒绝,即使该指令不可访问。

一旦 sBPF 指令已成功验证,它们将在 SVM 中执行。在执行期间,VM 检查运行时错误,例如越界内存访问或无效指令使用。VM 还处理系统调用,允许程序执行诸如 memcpymemset 之类的操作,以及记录用于调试的事件。在 VM 中运行的程序可以使用这些系统调用与链上数据交互,根据需要从其他帐户读取和写入。在整个执行过程中,VM 会仔细跟踪使用的计算单元数量,强制执行限制以防止过度消耗资源或无限循环程序。

sBPF 中的斐波那契数列

下面是一个用 sBPF 汇编编写的斐波那契数列程序示例,它演示了如何使用 Sig 的 VM 实现运行!

entrypoint:
    mov r0, 10
    call function_fib ; Compute the 10th Fibonacci number
    exit ; Returns the value in the r0 register

; Passes N in r0
; Returns the Nth Fibonacci number in r0
function_fib:
    mov r1, 0       ; Fib(0) = 0
    mov r2, 1       ; Fib(1) = 1

    jle r0, 1, done ; If N <= 1, return r0 (Fib(0) or Fib(1))
loop:
    add r1, r2      ; r1 = r1 + r2 (next Fib number)
    mov r3, r2      ; Store the old r2 value
    mov r2, r1      ; Update r2 to new Fib number
    mov r1, r3      ; Move the previous r2 into r1

    add r0, -1      ; Decrement N
    jgt r0, 1, loop ; Continue the loop if N > 1
done:
    mov r0, r2      ; Return the last computed Fibonacci number
    exit
$ zig build vm -- -a fib.asm
result: 55, count: 61

挑战和未来工作

为了改进和确保 VM 的正确性,下一步将涉及扩展测试套件,包括额外的单元测试和进一步模糊测试 SVM 和 sBPF VM 本身。模糊测试对于发现难以预测的罕见边缘情况至关重要,尤其是在像 SVM 这样复杂的系统中。

实现 SVM 的挑战之一是准确地复制 C 的隐式类型转换,尤其是在处理有符号与无符号行为时,因为它会引入难以重现的细微不一致。确保 VM 在不同实现中行为相同需要仔细处理和严格测试。

另一个探索领域是通过即时(JIT)编译优化执行。这种方法在执行之前将 sBPF 指令转换为本机机器指令,这可以大大提高性能。正在考虑的一种方法是“复制和修补”技术,其中本机机器指令序列是预先确定的,从而可以更快地生成这些指令并确保它们更安全。

一致性测试

我们利用 Firedancer 和 Asymmetric Research 开发的一致性测试框架和模糊测试基础设施,以确保符合 Solana 的隐式规范。Firedancer 的 solana-conformace 存储库提供了工具和测试工具,以针对 Solana 的 Agave 实现验证以下八个组件:

目前,我们正在通过 Elf Loader、Shred Parser 和 VM Validate 工具的所有公开可用的 测试向量,并且正在积极努力集成 VM Interpret、Syscall、CPI 和 Instruction 工具。公开可用的测试向量包括模糊输入,这些输入之前发现了 Firedancer 和 Agave 实现之间的一致性问题。虽然这是一个很好的起点,但它是不够的,因为可能会遗漏特定于 Sig 的问题。为了解决这个问题,我们还与 Asymmetric Research 合作,以建立对所有集成组件的持续模糊测试。

集成一致性测试代表了 SVM 成功开发的一个重大进步。在 Firedancer 和 Asymmetric Research 等团队的支持下,我们有信心我们将通过所有一致性测试,从而允许真正多样化的 SVM 实现共存。

结论

SVM 是 Solana 验证器的重要组成部分,它通过交易实现账户状态修改。它的实现标志着 Sig 开发的一个重要里程碑。虽然我们仍处于早期阶段,但我们的进展令我们感到鼓舞,并渴望应对未来的挑战。在接下来的几个月中,我们将开始指令执行的一致性测试,并将随着 SVM 的完成分享更多更新。

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

0 条评论

请先 登录 后评论
syndica
syndica
News & research from Syndica: low latency Solana RPC, data streams, Sig Validator & more