Solana 智能合约编程语言

文章介绍了Solana区块链的主要编程语言Rust,以及如何使用C、C++和Python进行开发。详细解释了Rust编译过程、LLVM、BPF等技术,并探讨了Solana如何利用这些技术提高智能合约的执行效率。文章还提到了Python的转换过程及Solana对Solidity的支持。

Rust 代码来自 Metaplex 库

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 架构。

回到 Rust、C 和 C++

这三种编程语言长期以来都被 LLVM 支持。这是 Solana 可以利用数十年投资的另一个领域(是的,从技术上讲,讲技术以十年为单位是奇怪的,但 LLVM 于 2003 年问世)。

你可以使用 C 或 C++ 作为 Solana 编程语言,但在工具的支持上会少得多。通常建议即使你是 C 或 C++ 专家,也要使用 Rust。如果你已经熟练掌握 C++,学习 Rust 将会很容易。

你需要知道多少 Rust 才能编写 Solana 程序?

其实不需要太多,但仍然需要一些学习。Rust 不是一个你可以“通过谷歌搜索”解决的语言。例如,假设你在从 Java 或 Scala 背景编程时使用 Ruby,在这种情况下,你可以很容易地向谷歌询问相应的编程模式(你的代码可能看起来不太地道,但它可读且功能完备)。如果你从 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 框架。因此,尽管 Seahorse 进行了相对典型的转译,但它也正在利用计划框架的相似性。

Seahorse 框架紧密模拟 Anchor 框架,以便 Python 代码可以被翻译成 Rust 代码,该代码与在 Anchor 框架中的编写方式十分接近。

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

Solana 是否使用 Solidity?

是的,可以用 Solidity 编写 Solana 应用程序,但这有些实验性。solang Solidity 编译器 旨在支持将 Solidity 编译为 BPF。

Solana 客户端编程语言

Solana 客户端 本身是运行在区块链节点上的程序,而不是程序(智能合约),它是用 Rust 编写的。目前正在进行中的 Solana 客户端重构 firedancer 由 Jump Crypto 完全用 C 编写。

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

截至 2022 年 10 月,Solana 开始将 BPF 迁移到 SBF(Solana 二进制格式)。在撰写本文时,关于这一变化的文档相当稀少,但这不会影响大多数开发者。如果你的构建工具配置为编译为 BPF,你将收到弃用警告,但一切仍然可以运行。只需更改你的构建标志。

从 RareSkills 学到更多

想要掌握以太坊开发?请查看我们的 Solidity Bootcamp

资源

<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>

原文首次发布于 2022 年 12 月 1 日

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

0 条评论

请先 登录 后评论
RareSkills
RareSkills
https://www.rareskills.io/