Solana 编程语言

Solana 的主要编程语言是Rust,但也支持C、C++甚至Python 。
Solana 编码语言以类似的方式使用 Rust、C 和 C++。我们将在后面的部分讨论 Python。
Rust 是一门编译型语言,如果你在电脑上编译 Rust,它最终会变成 LLVM-IR(低级虚拟机中间表示),LLVM 会把它变成可以在你的机器(x86、arm64 等)上运行的字节码。

在 Solana 中,该序列如下所示:
1)将 Rust 编译为 LLVM-IR,然后编译为 BPF(伯克利数据包过滤器),并将字节码存储在区块链上。
2)验证器 JIT 编译(即时编译)BPF 为与其硬件兼容的指令集,通常是 x86,但 arm64 可能是另一个常见目标。

你可能会问,数据包过滤器?Solana 编程语言为什么要与互联网数据包有关?
这实际上是 Solana 的一个聪明的设计选择。

用户空间与内核空间

Linux 有内核空间和用户空间的概念。如果你想要执行诸如打开文件或启动另一个进程之类的操作,你的可执行文件需要请求操作系统替它执行这些操作。假设你编写了一个 Python 脚本来打开一个文件并打印出每个偶数行。文件字节码的实际加载发生在内核空间中,但是一旦将字节码提供给脚本,对 ASCII 的解释以及确定行号是偶数还是奇数就会发生在用户空间中。

这种抽象存在的原因有很多,但其中一个明显的原因就是安全性。并非每个用户或可执行文件都应该能够打开或执行任意文件。操作系统决定允许使用哪些“API”。(顺便说一句,打开文件的“API”在操作系统术语中技术上称为“系统调用”)。

同样,程序和可执行文件不应被允许任意访问传入的互联网数据包。默认情况下,它们必须进行系统调用,以请求操作系统允许查看只能从内核空间访问的数据包。

这里必须强调一个重要概念:在用户空间和内核空间之间来回转换通常很慢。

如果您正在过滤传入的互联网数据包,那么用户空间和内核空间之间就会有很多来回跳转。想象一下将每个传入数据包从内核空间复制到用户空间。这将产生大量开销。

这就是 BPF 被发明的原因。你可以在内核空间内运行可执行文件来避免这种跳跃

但是,如果您对拥有内核特权有所了解,您就会知道这非常危险!如果出现错误,控制内核(操作系统)可能会导致计算机崩溃。更糟糕的是,如果执行了恶意代码,则损害是无限的。

当然,BPF 设计者已经想到了这一点。在执行 BPF 代码之前,会对其进行验证,以确保其运行一段固定的时间,即必须终止、只能访问指定的内存区域,并遵循其他适当的限制

顺便说一句,自从 BPF 发明以来,它的用途就已不仅限于过滤数据包,但它的名字却一直沿用至今。

为什么 Solana 语言使用 BPF

通过利用现有的确保 BPF 程序安全的研究,Solana 可以在运行速度最快的地方运行智能合约 — 内核内部!仔细想想,这真是太了不起了。您可以在操作系统最敏感(但最高效)的部分 — 操作系统内核中运行任何人都可以编写的不受信任的智能合约。Solana 可以利用数十年来在该领域的研究和投资来获得良好的性能提升。

BPF 不是机器指令;它仍然是自己的一组字节码。但是,它可以被 JIT 编译为各种 CPU 架构。

Solana 链上程序通过LLVM 编译器基础结构编译 为 可执行和可链接格式 (ELF),其中包含伯克利数据包过滤器 (BPF)字节码 的变体 。
由于 Solana 使用 LLVM 编译器基础架构,因此可以使用任何能够针对 LLVM 的 BPF 后端的编程语言编写程序。
BPF 提供了一套高效的 指令集,可以在解释型虚拟机中执行,也可以作为高效的即时编译的本机指令执行。

回到 Rust、C 和 C++

这三种编程语言早已得到 LLVM 的支持。这是 Solana 可以利用数十年投资的另一个领域(是的,用几十年来谈论技术有点奇怪,但LLVM 早在 2003 年就问世了)。

您可以使用 C 或 C++ 作为 Solana 编程语言,但工具支持会少得多。通常建议您使用 Rust,即使您是 C 或 C++ 专家。如果您已经精通 C++,那么 Rust 将很容易学习。

你需要了解多少 Rust 才能编写 Solana 程序?

不是很多,但仍然需要一些学习。Rust 不是一种可以“谷歌一下”的语言。例如,假设您从 Java 或 Scala 背景开始使用 Ruby 编程。在这种情况下,您可以很容易地向 Google 询问等效的编程模式(您的代码可能看起来不太符合惯用语,但它可读且功能齐全)。如果(当)您从 Stackoverflow 复制和粘贴代码,您仍然会对代码的作用有很好的直觉。

但是,如果你使用 Rust 来做这件事,你会遇到一些令人沮丧的障碍。Rust 的语法很难查找(试着在搜索引擎中查找“#”),并且它有一些其他编程语言中没有的概念。

Rust 是一种广泛的语言。但是,您只需要了解它的一个子集。我们的Solana 开发课程会同时教授 Rust 和 Solana,这样您就可以只关注 Rust 中您需要的部分。

Solana 如何使用 Python

将 Rust、C 或 C++ 编译为 BPF 非常简单。对于 Python,情况则截然不同;显然,Python 是一种解释型语言,而不是一种可以用 LLVM 编译的语言。

简单来说,Python 被转换成 Rust,然后一切都按上面的方式运行。

如果你想要确切的工作流程,可以在seahorse-lang github上查看详细的文档

Solana 程序通常不是用原始 Rust 编写的;大多数开发人员使用 Anchor Framework。因此,尽管 Seahorse 执行相当典型的转译,但它也利用了计划中的框架相似性。

Seahorse 框架与 Anchor 框架紧密建模,因此 Python 代码可以转换为 Rust 代码,而 Rust 代码的编写方式与 Anchor 框架中的编写方式紧密建模。

请注意,该项目目前处于测试阶段。

Solana 使用 solidity 吗?

是的,可以用 Solidity 编写 Solana 应用程序,但有些实验性。solang solidity 编译器是为了支持将 Solidity 编译为 BPF 而构建的。

Solana 客户端编程语言

Solana 客户端本身(即在为区块链提供支持的节点上运行的程序,而不是程序(智能合约))是用 Rust 编写的。目前,Jump Crypto 正在重新实现 Solana 客户端firedancer,该客户端完全用 C 语言编写。

附录:Rust 正在将 BPF 迁移到 SBF。

自 2022 年 10 月起,Solana 开始从 BPF 迁移到 SBF(Solana 二进制格式)。截至撰写本文时,有关此更改的文档非常稀少,但这不会影响大多数开发人员。如果您的构建工具配置为编译为 BPF,您将收到弃用警告,但一切仍将运行。只需更改您的构建标志即可。

资源

https://www.kernel.org/doc/html/latest/bpf/instruction-set.html
https://docs.rs/solana_rbpf/latest/solana_rbpf/ebpf/index.html
https://www.youtube。 com/watch?v=5jQvuPWpzcE
https://ebpf.io/what-is-ebpf/
https://www.youtube.com/watch?v=Q8eY67hDvkc

原文:https://www.rareskills.io/post/solana-smart-contract-language