本文介绍了Solana的sBPF虚拟机及其指令集。它阐述了sBPF作为基于eBPF的寄存器式虚拟机架构,详细描述了其11个寄存器的约定用途以及各类操作码(如算术、逻辑、数据移动、控制流和内存操作)。文章旨在帮助读者理解Solana程序中SBF指令的执行方式。
进入 模块 8
正如 计算单元教程 中所讨论的,Solana 程序调用消耗的计算单元等于执行的 SBF (Solana Bytecode Format) 指令数量加上任何系统调用的运行时成本。本文深入探讨了 SBF 指令集,并演示了如何使用执行跟踪和 agave-ledger-tool 来分析这些指令。
从 Rust 到 SBF 教程中我们了解到,Solana 程序会编译成 SBF (Solana Bytecode Format),并在 sBPF 虚拟机 上运行,sBPF 虚拟机是基于 eBPF 的 Solana 特有 VM。SBF 指令类似于传统的汇编语言,例如 x86 或 ARM,看起来像这样:
Copymov64 r0, 1 ; 将 1(64 位填充)移动到寄存器 0
mov64 r1, 2 ; 将 2(64 位填充)移动到寄存器 1
add64 r0, r1 ; 将寄存器 1 添加到寄存器 0,结果存储在寄存器 0 中
本文假设已完成以下内容:
在 Rust 到 SBF 编译教程中,我们解释了 Solana 程序如何经历三个主要阶段:Rust 到 LLVM IR 再到 SBF 字节码,最后到原生代码。本文涵盖了 Solana 的 VM 架构,并展示了如何在实践中分析 SBF 字节码。
Solana VM 是基于寄存器的,与基于堆栈的 Ethereum VM 不同。在基于寄存器的 VM 中,指令操作一组固定大小的存储槽,称为寄存器,并且每条指令都明确指定它从哪个寄存器读取数据和写入数据。在基于堆栈的 VM 中,指令隐式地操作堆栈数据结构的顶部,因此操作数必须被推入堆栈并从堆栈中弹出才能使用。
eBPF 定义了 11 个寄存器 (R0–R10),所有都是 64 位宽。Solana 的 sBPF VM 实现了这 11 个相同的寄存器,但内部维护了一个隐藏的第十二个寄存器 R11,用于程序计数器跟踪。由于 R11 在执行期间程序既不能读也不能写,因此只有原始的 11...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!