Sealevel——Solana可以并行处理数千智能合约的秘诀

1,085 阅读6分钟

Solana是世界上性能最强的公链,在Solana测试网的当前迭代中,一个由200个不同的物理节点组成的网络在使用GPU运行时,支持每秒超过50,000笔交易的持续吞吐量。实现这样的目标需要实施一些优化和新技术,其结果是网络能力的突破,标志着区块链发展的一个新阶段。

在这篇文章中,我们将探讨Sealevel,Solana的并行智能合约runtime。在我们开始之前,需要考虑的一件事是,EVM和EOS的基于WASM的运行时都是单线程的。这意味着一次有一个合约修改区块链的状态。我们在Solana中建立的是一个运行时,可以并行处理数以万计的合约,充分利用Validator可用的核心数。

Solana之所以能够并行处理事务,是因为Solana事务描述了一个事务在执行时将读取或写入的所有状态。这不仅允许不重叠的事务并发执行,而且允许只读取相同状态的事务也并发执行。

Programs and Accounts

Cloudbreak,我们的账户数据库,是公钥与账户的映射。帐户保持余额和数据,其中数据是一个字节的向量。账户有一个 "owner"字段。所有者是管理账户状态转换的程序的公钥。Program是代码,没有状态。它们依靠分配给它们的Account中的数据向量进行状态转换。

  1. Program只能改变他们所拥有的Account的数据。
  2. Program只能借记他们拥有的Account。
  3. 任何Program都可以记入任何Account。
  4. 任何Program都可以读取任何Account。

默认情况下,所有账户开始时都是由System Program拥有的。

  1. System Program是唯一可以分配Account所有权的程序。
  2. System Program是唯一可以分配零初始化数据的程序。
  3. Account所有权的分配在一个帐户的生命周期内只能发生一次。

一个用户定义的程序由加载器程序(BPF Loader)加载。装载器程序能够将账户中的数据标记为可执行。用户执行以下事务来加载一个自定义程序。

  1. 创建一个新的公钥。
  2. 将代币转移到该地址上。
  3. 告诉系统程序分配内存。
  4. 告诉系统程序,将账户分配给加载器。
  5. 将字节码分块上传到内存中。
  6. 告诉加载器程序,将内存标记为可执行。

在这一点上,加载器验证了字节码,字节码被加载到的账户可以作为可执行程序使用。新账户可以被标记为由用户定义的程序拥有。

这里的关键是,程序是代码,在我们的键值存储中,存在一些键的子集,该程序和只有该程序有写入权限。

Transactions

交易指定一个指令向量。每条指令都包含了程序、程序指令和事务要读写的账户列表。这个接口的灵感来自于设备的低级别操作系统接口。

size_t

**readv**(int d, const struct iovec *iov, int iovcnt);

struct iovec {

char *iov_base; /* Base address. */

size_t iov_len; /* Length. */

};

像readv或writeev这样的接口会提前告诉内核所有用户想要读取或写入的内存。这允许操作系统预取,准备设备,并在设备允许的情况下同时执行操作。

在Solana上,每条指令都会提前告诉虚拟机它要读和写哪些账户。这是我们对虚拟机进行优化的根源。

  1. 对数以百万计的待处理事务进行排序。
  2. 将所有不重叠的事务并行处理。

更重要的是,我们可以利用CPU和GPU硬件的设计方式。 image.png SIMD指令允许单段代码在多个数据流上执行。这意味着Sealevel可以执行一个额外的优化,这是Solana设计所特有的。

  1. 按程序ID对所有指令进行排序。
  2. 在所有账户上同时运行同一个程序。

为了了解为什么这是一个如此强大的优化,请看一下《CUDA开发者指南》。

"CUDA架构是围绕可扩展的多线程流式多处理器(SM)阵列建立的。当主机CPU上的CUDA程序调用内核网格时,网格的块被列举出来并分配给具有可用执行能力的多处理器。"

一个现代的Nvidia GPU有4000个CUDA核心,但大约有50个多处理器。虽然一个多处理器一次只能执行一条程序指令,但它可以在80个不同的输入上并行执行该指令。因此,如果被Sealvel加载的传入事务都调用相同的程序指令,比如CryptoKitties::BreedCats,Solana可以在所有可用的CUDA核心上并发执行所有的事务。

在性能方面没有免费的午餐,所以为了使SIMD优化可行,所执行的指令应该包含少量的分支,而且应该都采取相同的分支。多处理器受到批量中执行的最慢路径的约束。即使有这样的考虑,通过Sealevel的并行处理,与单线程运行时相比,区块链网络的运作方式呈现出基础性的发展,能够实现极高的吞吐量和实用性。

Solana对Sealevel的实施,以及像历史证明(Proof of History)、复制证明(Proof of Replication)和湾流(Gulf Stream)这样的创新,共同创造了世界上性能最强的区块链。Solana的测试网主网如今都已经上线。出于成本考虑,我们在测试网上只运行少量的节点。然而,我们已经在AWS、GCE和Azure的23个数据中心的许多实例上运行了超过200个物理上不同的节点(不是在共享硬件上),以进行基准测试。

该运行时间今天已经开始运作,开发人员现在就可以在测试平台上部署代码了。开发人员今天可以用C语言和Rust构建智能合约。Rust将成为Solana智能合约开发的旗舰语言。Rust工具链作为Solana Javascript SDK的一部分已经公开,我们正在进一步迭代软件开发工具包。

Solana将很快推出一个公开测试版,激励验证者通过Tour de SOL运行节点--类似于Cosmos的赌注游戏--挑战广大公众测试Solana网络的极限,同时赚取代币。