Aptos:安全、可扩展和可升级的 Web3 基础设施
作者:Buidler DAO
摘要
随着全新的互联网基础设施区块链的崛起,开发者正以飞快的速度部署着数以万计的去中心化应用程序。遗憾的是,由于稳定性差、成本高、低吞吐量及一些安全问题,区块链尚未被广泛应用。为了能够在 Web3 时代被广泛使用,区块链基础设施应该效仿云基础设施的特点,即为众多的去中心化应用提供可信、可扩展、经济高效且持续优化的平台。
为应对这些挑战,我们以可扩展、安全、可靠和可升级为核心设计原则推出 Aptos 区块链。Aptos 区块链在过去三年中由全球 350 多名开发人员共同开发 [1]。它在共识、智能合约设计、系统安全、性能和去中心化方面提供了新的创新。这些技术的结合将为把 Web3 带向更广泛的人群提供一个坚实的基础:
-
Aptos 区块链原生集成并使用 Move 语言 来实现快速安全的交易执行 [2]。Move prover,一个用 Move 语言开发的智能合约形式化验证工具,为合约常量和运行提供额外保障。这种注重安全的做法,可以让开发人员能够更好地保护软件,以免受恶意实体的攻击。
-
Aptos 数据模型允许灵活的密钥管理和混合托管选项。这与签名前的交易透明性和实用的轻客户端协议一起,共同提供了更安全、更值得信赖的用户体验。
-
为了实现高吞吐量和低延迟,Aptos 区块链在交易处理的关键阶段使用了流水线和模块化方法。具体而言,事务分发、区块元数据排序、并行事务执行、批量存储和账本认证等操作会同时运行。这种做法充分利用了所有可用的硬件资源,提升了硬件效率,并实现了高度并行处理。
-
与需要读写前获取被读写数据而破坏交易原子性的并行执行引擎不同,Aptos 区块链没有对开发者设置这种限制。它通过保证复杂的交易的原子性,为应用程序提供更高的吞吐量和更低的延迟,并简化了开发。
-
Aptos 模块化架构保证了客户端的灵活性,并针对频繁的升级进行优化。此外,为了迅速部署新的技术创新和支持新的Web3使用案例,Aptos 区块链提供了嵌入式的链上变化管理协议。
-
Aptos 区块链正在试验未来超越单个验证器性能的举措:其模块化设计和并行执行引擎支持验证者的内部分片,而同质状态分片(homogeneous state sharding)提供了水平吞吐量可扩展的潜力,而不会给节点运营商带来额外的复杂性。
[1] 法律免责声明:本白皮书及其内容不是出售任何代币的要约,也不是诱导购买任何代币的要约。我们发布这份白皮书只是为了接受公众的反馈和意见。 本文件中的任何内容都不应被理解为对 Aptos 区块链或其代币(若有)将如何发展、利用或累积价值的保证或承诺。Aptos 仅概述了其目前的计划,这些计划可能会酌情改变,其成功与否将取决于其控制之外的许多因素。
这种未来的陈述必然涉及已知和未知的风险,这可能导致未来时期的实际表现和结果与我们在本白皮书中描述或暗示的有重大差异。Aptos 不承担更新其计划的义务。不能保证白皮书中的任何陈述将被证明是准确的,因为实际结果和未来事件可能有很大的不同。请不要过分依赖未来的声明。
一:序言
在 Web2 时代,诸如通讯、社交媒体、金融、游戏、购物以及音视频流媒体等服务, 是由掌握了用户数据权限的中心化公司来提供(例如 Google、Amazon、Apple 和 Meta)。针对目标用例,这些公司利用具备特定应用的软件,来优化开发基础设施,并利用云端基础设施向用户部署这些应用程序。
云端基础设施可提供虚拟或物理基础设施服务的访问,例如虚拟机(VM)租用和在世界各地数据中心内运行的裸机硬件(例如 AWS,Azure,和 Google Cloud)。因此,建立能够扩大到数十亿用户的 Web2 互联网服务从来没有像今天这样容易。然而,Web2 要求用户明确信任中心化实体,这一要求愈发引起社会的担忧。
为了消除这种担忧,新的互联网时代已经开始:Web3。在 Web 3 版本的互联网中, 出现了区块链来提供去中心化、不可篡改的账本,让用户能够安全可靠地相互交流,而不需要信任控制中间人或中心化实体。与 Web2 互联网服务和应用程序依赖云基础设施类似,去中心化的应用程序可以使用区块链作为去中心化的基础设施层,从而触达全世界数十亿用户。
然而,尽管现已存在许多条区块链,但是 Web3 尚未得到广泛采纳[3]。虽然技术不断地推动着行业发展,但现有的区块链仍是不可靠的。昂贵的交易费用,低吞吐量,因安全问题资产经常遭受损失,并且无法支持实时响应。与云端基础设施赋能 Web2 服务,成功触达数十亿人群相比,区块链还并没有使得 Web3 应用达到同样的高度。
二:Aptos 愿景
Aptos 的愿景是提供一个能够为 Web3 带来主流应用的区块链,并授权一个去中心化应用的生态系统来解决现实世界的用户痛点。我们的使命是通过提供灵活和模块化的区块链架构,推动区块链可靠性、安全性和性能方面的新高度。该架构应支持频繁升级,快速采用最新的技术,并能对新兴的用例提供一流支持。
我们设想建立社区管理运营的去中心化、安全和可扩展的网络。当世界各地对基础设施的需求增长时,区块链的计算资源就会横向和纵向扩展以满足这些需求。随着新的用例和技术进步的出现,网络应该在不干扰用户的情况下频繁地、无缝地升级。让用户不再关注基础设施相关问题。
开发人员和用户将可以访问许多不同的密钥恢复、数据建模、智能合约标准、资源使用权衡、隐私和可组合性选项。用户确信他们的资产是安全,可用,并且几乎可以成本费访问。任何人都能够安全、容易地与全世界不受信任的各方进行不可篡改的交易。区块链将像云基础设施一样无所不在。
为了实现这一愿景,必须在技术方面取得重大进展。过去三年里,我们开发,升级和部署 Diem 区块链(Aptos 区块链的前身)的经验已经证明,网络可以在不中断客户端的情况下持续升级协议[4]。2020 年初,Diem 主网被部署到拥有多个钱包供应商的十几个节点上。在之后一年,我们团队进行了共识协议和核心框架两次重大的升级。
两次升级都在用户不停机的情况下顺利完成。在 Aptos 区块链中,我们对技术栈进行了一系列彻底的改进,同时还受 Diem 区块链启发将安全、透明、以及可频繁的升级作为核心功能。我们特别强调新的交易处理方法(如第 7 节所述)以及去中心化和网络治理的新方法。

图1:Aptos 生态系统的组件
随着 Aptos 区块链的不断改善和发展,, 我们将不断更新协议和设计,届时发布最新版的白皮书。在下文中,我们描述了 Aptos 区块链的现状以及今后的计划。
三:概述
如图 1 所示,Aptos 区块链由 1 组验证者(Validator)组成,他们使用拜占庭容错(BFT),权益证明(POS)的共识机制来接收与处理用户的交易。代币持有人在他们选定的验证者(Validator)中锁定或者质押他们手上的代币。每个验证者的共识投票权重与所质押代币量成正比。一个验证者可以是活跃的状态,并参与到共识决策中。同样,一个验证节点如果没有足够的质押代币,或被从验证者集合中轮换出来,亦或在同步区块链状态时离线,再或共识协议因历史表现不佳而拒绝其参与共识,那么该验证节点也可能处于不活跃的状态。
客户端是系统中需要提交交易或查询区块链状态和历史的任何部分。客户端可以选择下载并验证那些被验证节点签署验证过的数据。*全节点(Full Node)*是从验证节点或网络中其他全节点复制交易和区块链状态的客户端。他们可能会根据需要裁剪掉一些交易历史和区块链状态记录,以重新获得充足的存储空间。轻客户端 只维护当前验证节点的集合,并且可以从全节点中安全地查询部分区块链状态。钱包是轻客户端的常见例子。
为了满足安全、快速、可靠和可升级的 Web3 基础设施的需求,以便被广泛采用,Aptos 区块链基于下列核心设计原则建立:
-
通过新的智能合约编程语言 Move [5],快速且安全地执行链上逻辑,以及保证简单的可审计性和程序上的可分析性。Aptos 区块链从 Diem 区块链中继承使用并不断发展 Move。
-
通过分批、流水线和并行化的交易处理方法实现了极高的吞吐量和低延迟。
-
与预先识别要读取/写入的数据且破坏交易原子性的现有并行执行引擎不同,Aptos 区块链创新性的使用 Block-STM 技术作为并行执行引擎,有效地支持了任意复杂交易的原子性。
-
通过快速的、权益质押验证节点的轮换以及对验证节点的信誉跟踪,实现对性能和去中心化治理的优化。
-
可升级性和可配置性是最重要的设计原则,从而使基础设施可以拥抱新的使用用例和最新的技术。
-
通过了诸如威胁建模在内的严格的组件级测试和无缝部署的模块化设计,保证了操作的高度安全性和可靠性。
-
保证去中心化的水平吞吐量可扩展性。源自程序与数据模型的分片(sharding)是水平扩展中的一个重要概念。
第 4 章解释了开发者如何通过 Move 语言与 Aptos 区块链进行交互。第 5 章描述了逻辑模型。第 6 章详细介绍了 Aptos 区块链如何通过强大的验证方法实现安全的用户体验。第 7 章描述了围绕流水线、批处理和并行化的关键性能创新。第 8 章详细介绍了不同类型的客户端与其他节点同步状态的各种选择。第 9 章描述了我们对社区所有权和治理的计划。最后,第 10 章讨论今后的业绩方向,同时保持去中心化。
四:Move 编程语言
Move 是一种注重安全和灵活性的新型智能合约编程语言。Aptos 区块链使用 Move 的对象模型来表示其账本状态(见第 5.5 节),并使用 Move 代码(模块)来编码状态转换的规则。用户提交的交易中,可以包括发布新模块、升级现有的模块、执行模块内定义的接口功能,以及可以直接与模块的公共接口互动的脚本。
Move生态系统包含一个编译器、一个虚拟机和许多其他的开发工具。Move 受到 Rust 编程语言的启发,该语言通过线性类型等概念来明确数据的所有权 Move 强调了资源的稀缺性、保存和访问控制。Move 模块定义了每个资源的生命周期、存储和访问模式。这确保了像 Coin 这样的资源不会在没有适当凭证的情况下产生,且不能被重复消费,也不会消失。
即使存在不受信的代码,Move 仍然可以利用字节码验证工具来保证类型和内存安全。为有助于编写更可信的代码,Move 包括了一个类型验证器,Move Prover [6],能够根据给定的规范,验证 Move 程序的功能正确性,该类型验证功能已经集成到了 Move 语言中。
除了用户帐户和相应的帐户内容,分布式账本的状态还包含 Aptos 区块链的链上配置。这个网络配置包括当前活跃状态的验证节点的集合,质押的属性,以及 Aptos 区块链内各种服务的配置。Move对模块可升级性和全面可编程性的支持实现了无缝的配置变化,并支持对 Aptos 区块链本身的升级(这两类升级已经在非公开的主网上执行了多次,并且没有宕机记录)。
Aptos 团队已经进一步增加了 Move 的特性,支持更广泛的 Web3 用例。如下文第 5.5 节所述,Aptos 区块链实现了细粒度的资源控制。这个特性不仅有效支持了并行执行,而且几乎固定了访问与更改数据的成本。此外,Aptos 区块链提供了建立在细粒度存储之上的表支持,这使得大规模的数据集(例如,大量的 NFT 集合)可以在一个账户中实现。同时,Aptos 支持完全在链上体现的共享或自动化账户。这使得复杂的去中心化自治组织(DAO)能够共享账户,以及将这些账户作为异质资源集合的容器。
五:逻辑模型
Aptos 区块链的 账本状态 代表了链上所有帐户的状态。账本状态使用一个无符号的 64 位整数进行版本划分,对应与当前系统所执行的交易数量。任何人都可以向 Aptos 区块链提交交易以修改账本状态。交易执行后,会生成一个交易输出 。一个交易的输出包含零个或多个操作来操纵账本状态(称为 write sets),一个由此产生的事件集合(见第 5.1.1 节),消耗的 gas,以及已执行的交易状态。
5.1 交易
一个经过签名的交易包含以下信息:
-
交易身份验证器: 发送者使用包括一个或多个数字签名的交易身份验证器来验证交易是否已被验证。
-
发送方地址: 发送方的帐户地址。
-
Payload:Payload 要么是指链上现有的接口函数,要么是指包含要作为内联字节码执行的函数(称为脚本)。此外,一组输入参数用字节数组编码。对于点对点交易,输入参数包含接收方的信息和转入金额。
-
Gas 价格(以指定货币/Gas 单位):这是发送方愿意为执行交易而支付的每单位 Gas 的金额。Gas 费指的是支付计算、联网和存储的费用。Gas 是一种抽象的计算单位,没有固有的实际价值。
-
最大 Gas 单位数(Maximum gas amount): 最大 Gas 是在交易中止前允许消耗的最大 Gas 单位数。帐户内必须至少有 Gas 单价乘以最大 Gas 单位数的余额,否则交易将在验证过程中被终止执行。
-
序列号: 交易的序列号。交易中的序列号必须与交易执行时发送方帐户中存储的序列号相匹配。交易成功执行后,将递增账户序列号,以防止重放攻击。
-
到期时间: 一个时间戳,过了这个时间戳,交易将不再有效。
-
区块链 ID: 识别区块链中的交易有效性,为用户提供进一步的保护,防止签署错误。
在每个版本 i,状态变化由元组(Ti, Oi, Si)表示,分别包含交易、交易输出和交易结束后的账本状态。给定一个确定性的函数 Apply,执行交易 Ti,账本状态 Si-1,产生交易输出 Oi 和新账本状态 Si。也就是说,Apply(Si-1*,Ti*) → ⟨Oi,Si⟩。
5.1.1 事件
事件是交易执行过程中发出的。每个 Move 模块可以定义自己的事件,并选择在执行时何时发出这些事件。例如,在转账期间,发送方和接收方的账户将分别发出 SentEvent 和 ReceivedEvent。数据会存储在账本内,可以通过 Aptos 节点进行查询。每个注册事件都有一个唯一的索引,该索引可用于查询事件详细信息。
向同一事件索引发出的多个事件会产生事件流,这是一个事件列表,每个条目包含一个从 0 开始依次增加的数字、类型和数据。每个事件必须以某种类型定义。会存在多个不同事件由相同或类似的类型定义,特别是在使用泛型的时候。事件有关联的数据。对于 Move 模块的开发者来说,通用原则是要包括所有必要的数据,以便理解在交易执行前后引起的底层资源变化,这些变化改变了数据并发送了事件。
交易只能生成事件,不能读取事件。这种设计使交易的执行只能以当前状态和当前交易的输入作为入参(而不是历史信息,例如,先前生成的事件)。
5.2 账户
每个账户都由一个独特的 256 位数值来识别,称为账户地址。在账本状态中创建一个新账户(见第 5.5 节),当现有账户发送交易会调用 create_account(addr) Move 函数就可以进行创建。这通常发生在一个交易试图将 Aptos 代币发送到一个尚未创建的账户地址。为了方便起见,Aptos 还支持一个transfer(from, to, amount) 函数,如果在转移之前账户不存在,则会默认创建一个账户。

图 2:链上 Move 模块示例
要创建一个新帐户,用户首先生成一个签名密钥对:(vk,sk)。接下来,将签名方案标识符(ssid)与公钥 vk 拼接在一起,通过加密哈希H得出特定签名方案的新账户地址:即 addr=H(vk,ssid)。
在地址 addr 处创建新账户后,用户可以签署将从 addr 处的账户发送的交易,使用私钥 sk 来签署。用户还可以轮换 sk,可以是主动更改 sk ,也可以是应对可能出现的私钥泄露。改变私钥的操作不会改变帐户地址,因为帐户地址的创建只来自于公钥。
Aptos 区块链并不将账户与现实世界的身份联系起来。一个用户可以通过生成多个密钥对创建多个账户。由同一用户控制的账户彼此之间没有内在联系。
然而,为了资产管理的简便化,单个用户仍然可以在一个钱包中管理多个账户 这种灵活性为用户提供了匿名性,同时我们在未来的版本中尝试使用更多隐私保护原语(privacy-preserving primitives)。如第 7.4 节所述,由一个用户或一组用户拥有的多个账户也提供了增加执行并发性的渠道。
5.3 Move 模块
一个 Move 模块包含声明数据类型(结构)和程序的 Move 字节码。它是由声明模块的账户地址和模块名称一起标识的。例如,图 2 中第一个货币模块的标识符是 0x1::coin。一个模块可以依赖于其它链上模块,如图 2 中的钱包模块所显示,可以复用其他模块的代码。
一个模块在一个账户内必须是唯一的,也就是说,每个帐户下模块名称必须保持唯一性。例如,图 2 中地址为 0x1 的账户无法声明另一个名为 coin 的模块。另一方面, 地址为 0x3 的帐户可以声明一个名为 coin 的模块,这个模块的标识符将是 0x3:coin。注意, 0x1::coin::Coin 和 0x3::coin::Coin 是不同的类型,不能互换使用,也不共享公共模块代码。相反,0x1::coin::Coin<0x2::wallet::USD> 和 0x1::coin::Coin<0x2::wallet::JPY>> 是同一通用类型的不同实例,不能互换使用,但可以共享公共模块代码。
相同地址下的模块将会被归并到同一个*软件包(package)*中 此地址的所有者将软件包作为一个整体进行链上发布,包括字节码和软件包元数据。软件包的元数据决定一个软件包是可以升级的还是不可改变的。对于可升级的软件包,在允许升级之前会进行兼容性检查:不能改变现有的接口函数,也不能在内存中储存任何资源。但是,升级可以添加新的函数和资源。
Aptos 框架由 Aptos 区块链的核心库和配置组成,被定义为一个可定期升级的模块包(见第 9.2 节)。

5.4 资源
与模块类似,账户地址也可以有与之相关的数据值。在每个账户地址中,数据值是由其类型决定的,每个账户下,每种类型的数据值都应保持唯一。以图 3 为例, 地址 0x50 持有一个单一值,其中 0x3::coin::Coin 是完全限定的类型。0x3 是存储 Coin 模块的地址,Coin 是模块的名称, Coin 是数据类型的名称。也可以使用泛型数据值,不同的泛型实例被视为不同的类型。这对可扩展性至关重要,允许不同的实例共享相同的功能代码。
变更、删除和发布一个值的规则被编码在定义数据类型的模块中。Move 的安全和验证规则防止其他代码或实体直接创建、修改或删除其他模块中定义的数据类型的实例。
一个地址下的每种类型最多只有一个顶层值,这听起来似乎很有局限性。然而,这在实践中并不是一个问题,因为开发者可以通过定义不同的封装类型,将相同类型数据作为成员变量,从而避免了任何限制。Wallet 结构(位于图 3 中)就是一个如何使用包装器类型的例子。
还应该注意的是,并非所有数据类型都能在链上储存。为了使数据实例有资格成为顶层值,数据类型必须具有 Key 的能力。同样,对于嵌套的值来说,Store 能力是必需的。具有两种能力的数据类型也被称为资源。
5.5 账本状态
从 Move 虚拟机(Move VM)的角度来看,每个账户由一组值和 key-value 数据结构组成。这些数据结构被称为表项,并以二进制规范化序列化格式(BCS)存储。这种数据结构设计可以使开发者编写在少量数据复制到大量账户的场景下,可以高效执行的智能合约;也可以编写大量数据集中在少量账户上场景下,可以高效执行的智能合约。Move 模块的存储方式与账户数据类似,但在一个独立的命名空间下。创世账本状态定义了区块链初始化时的初始账户集及其相关状态。
在启动时,Aptos 区块链将由一个单一的账本状态表示。然而,随着使用的普及和技术的发展,Aptos 将扩大分片的数量,以提高吞吐量(即启用多个账本状态),并支持跨分片移动或访问资产的交易。每个账本状态将维护特定分片的所有链上资产,并提供相同的账户模型,以及细粒度的 key 值数据存储,为存储访问提供近乎固定的成本。
六:安全的用户体验
为了覆盖数十亿互联网用户,Web3 的用户体验必须是安全便捷的。在该章节中,我们将描述 Aptos区块链为实现这一目标的几项创新。
6.1 交易可行性保护
签署交易意味着签名者授权区块链提交和执行该交易。有时候,用户会在不小心或者没有意识到交易会被操控的情况下签署交易。为了减少这种风险,Aptos 区块链对交易的可行性进行限制,并保护签名者避免陷入无限确认的操作中。目前 Aptos 提供了三种不同的保护措施:发送者的序列号、 交易过期时间和指定的链 ID。
交易的序列号对于每个发送者的帐户只能提交一次。因此,如果发送者发现当前账户序列号 ≥ 交易 t 的序列号,那么t已经被提交,或 t 永远不会被提交(因为 t 使用的序列号已经被另一个交易占用)。
区块链时间以高精度和高频率(通常为亚秒)推进,详情见第 7.3.1 节。如果区块链的时间超过交易t的到期时间,那么同样的,要么 t 已经被提交,要么 t 永远不会被提交。
每笔交易都有一个指定的链 ID,以防止恶意实体在不同区块链环境之间进行重放攻击(例如,跨测试网和主网)。
6.2 基于 Move 的密钥管理
正如第 5.2 节所述,Aptos 帐户支持密钥轮换(key rotation),这是一个重要的特性,可以降低私钥泄漏,远程攻击以及现有密码算法未来被破解的风险。此外 Aptos 的账户也足够灵活,可以支持新的混合托管模型, 用户可以将轮换帐户私钥的能力委托给一个或多个托管方以及其他可信实体。然后通过 Move 模块定义一个策略,使这些受信实体能够在特定情况下轮换密钥。例如, 实体可能是由许多受信任方持有的 kout-of-n 多签密钥,从而可提供密钥恢复服务以防止用户密钥丢失(例如,20% 的比特币目前被锁定密钥丢失的帐户中[7])。
此外,虽然许多钱包提供诸如云端备份私钥,多方计算和社会恢复等多种密钥恢复方案,但这些方案并非基于区块链实现(即链下的)。因此,每个钱包都要实现自己的密钥管理方案,对用户而言,密钥的管理变成了黑盒。相反, Aptos 中的密钥管理功能提供了完整透明的密钥管理操作,同时极大地降低了了实现钱包密钥管理方案的难度。
6.3 预签名交易透明度
如今,钱包对其所签署的交易几乎是不透明的。因此,经常有户被恶意交易欺骗,导致资金损失以及一系列严重的后果。即使是可以查询到每笔链上交易数据的区块链也无法避免这种损失。目前几乎没有用户保障措施,使得用户暴露于各种各样的攻击之下。
为了解决这个问题, Aptos 生态系统提供了 交易预执行服务:可在用户签名 之前 向他们提供交易结果(以人类可读的形式)。Aptos 将交易预执行服务与以往已知的攻击和恶意智能合约相结合,将有助于减少欺诈。此外,Aptos 还允许钱包在执行过程中规定对交易的限制。违反这些限制将导致交易被中止,以进一步保护用户免遭恶意应用程序或社会工程攻击。
6.4 实用的轻客户端协议
仅仅依靠 API 提供商的 TLS/SSL 证书在区块链客户端和服务器之间建立的信任并不能充分保护客户端。即使存在有效证书,钱包和客户端也无法保证所提供数据的真实性和完整性给他们。因此,API 提供商可能会返回错误或恶意区块链数据,欺骗第三方并进行双花攻击。

为了防止这种情况发生,Aptos 提供状态证明和轻客户端验证协议,钱包和客户端可以使用这些协议来验证由不可信的第三方服务器提供的数据的有效性。此外,如第 7.6.2 节所述,使用基于时间戳的状态证明,轻客户端可以通过跟踪网络配置中的变化(*epoch变更)*或从当前受信任的节点(*锚点)*同步最新状态[8],来保证账户状态的实时性(例如,在几秒钟内)。通过高频时间戳和低成本的状态证明,Aptos 为客户提供了安全的服务。
此外,Aptos节点还提供了丰富的高性能存储接口,未来进一步微调这些接口后,支持订阅链上特定数据和帐户的证明。这可以让轻客户端日后仅保留最小的可验证数据,而无需运行一个完节点或处理大量的交易。
<h3












