4 月 19 日,在迪拜 Token 2049 大会上,Gavin Wood 宣布了对下一代 Polkadot 技术的大胆愿景。与 Polkadot 为市场带来的其他突破性首创一样,这一新愿景将彻底改变 Web3 的未来。它将提供 Web3 所需的速度、规模、完全去中心化和易用性,以推动 Web3 乃至整个技术领域的深度创新。
这一愿景的核心是 JAM,它是 Polkadot 链的新版本,它将推动 Polkadot 的功能超越当前 Web3 的界限,同时使在 Polkadot 上部署广泛的技术成为可能。通过 JAM,目前只能通过 rollup 才能看到的突破性可扩展性被带到了共识层。
在开发完成后,JAM 将成为一台分布式计算机,可以运行几乎任何类型的任务,这些任务可以表示为服务。JAM 将 Polkadot 推向同步可组合性的世界,这将有助于减少碎片化并整合活动,因此 Polkadot 上的应用程序能够更好地利用整个生态系统的网络。这将为深度创新开启新的可能性,并为开发者提供一个强大的环境,让他们能够以前所未有的方式进行创作。
JAM 目前正处于研究和开发阶段。目前,Polkadot 社区有一项提案可供投票(公投 682 https://polkadot.polkassembly.io/referenda/682),以确认这一新方向并授权 Technical Fellowship 批准 JAM。
为了支持 JAM 的发展,并确保它本着真正的去中心化精神构建,Gavin 在演讲中与 Web3 基金会联合宣布设立 JAM 奖金,总共 1000 万 DOT 将用于激励 JAM 的其他实现的开发。
在演讲的同时,Gavin 还发布了一份技术灰皮书。如果你想深入了解该项目的愿景和技术细节,可以在新的 JAM Graypaper 网站上找到该论文:https://graypaper.com/。
Gavin 和 Polkadot 共同引领创新技术的创建,旨在实现创建自由开放网络的愿景。JAM 是不断发展的 Polkadot 故事的下一章。
以下是 Polkadot Wiki 中对于 JAM 的最新介绍,由 Gavin Wood 撰写。
JAM 的全称是 Join-Accumulate Machine,它是一种计划取代现有中继链的新设计。JAM 的名称源自 CoreJAM,表示 Collect Refine Join Accumulate,描述了机器所体现的计算模型,最初是由 Gavin Wood 在 RFC 中描述的。然而,在实际的链中,仅执行 Join 和 Accumulate,而 Collect 和 Refine 过程发生在链下。
与当前的迭代方法不同,JAM 将作为一个全面的单一升级引入。这样做的几个原因包括:
- 统一的升级可以精确限制升级后的操作,这在迭代方法中很难做到。
- 它减少了经常在几周或几个月内定期发生的小升级和重大更改。
虽然这一转变需要重大的突破性改变,但我们将努力将其影响降至可管理的水平。将多个较小的突破性变化整合到一个单一的过渡中是更好的选择,它引入了一个新的区块链概念,整合了各种现有的想法。
一条 Rollup 链
JAM 将是一个特定领域的链,用于处理特定领域的问题。在这种情况下,就是 rollup,以太坊社区称之为 optimistic roll-up。JAM 的 rollup 在安全性方面受到很大限制。这就是 Polkadot 在过去五年里一直在做的事情,它已经是一个高度特定领域的 rollup 链。JAM 本质上让它带有更少的预设偏好,变得更加通用。
JAM 链接受 rollup 的输出,更普遍地说,是在其他地方完成的计算位,将输出整合到共享状态中,类似于 Polkadot 中继链的功能。
JAM 链的任务是提供必要的设备,以确保输出在经过转换后正确反映输入。
与智能合约链的相似之处
JAM 与智能合约链有几个相似之处:
- JAM 链本身直接执行无需许可的代码。
- JAM 链的状态被组织成不同的封装。
- 除了状态的封装之外,还包括代码和余额的封装。
这些状态的封装被称为服务。因此,JAM 的状态被划分为服务。创建新服务是无需许可的,类似于在智能合约链上部署智能合约。因此,向 JAM 链添加新服务不需要任何权威的批准或遵守治理机制,这与基于 Substrate 的链不同,后者要求添加新 pallet 需要治理批准。服务包括代码、余额和某些状态组件,类似于智能合约链上常见的结构。
服务入口点
JAM 服务的代码分为三个不同的入口点:
- Refine 是执行大部分无状态计算的函数。它为特定服务的 rollup 定义转换。
- Accumulate 函数获取输出并将其折叠到服务的整体状态中
- OnTransfer 处理来自其他服务的信息。
工作包是服务的输入。工作包可以包含许多工作项。每个工作项都与一个服务相关联,并且它反映了该服务的实际输入。对于平行链服务,这是交易和所有区块链输入的输入处。
JAM 的安全装置包括两阶段处理,其中 Refine 函数接受工作项作为输入,并产生工作结果作为输出,然后进入 Accumulate 函数(先 Refine,后 Accumulate)。工作项被细化成工作结果,因此,包含许多工作项的工作包被细化成工作报告,工作报告是多个工作项对应的结果。可以分配一个工作包,在特定时间段(通常为 6 秒)内使用一个内核。
JAM 是无交易的
JAM 通过无交易(Transactionless)操作来区别于智能合约链。JAM 内没有交易;所有动作都是无需许可的,并且最初会经历 Refine 阶段。在这个阶段,服务预先细化输入数据,将其转换为包含工作结果的工作报告。随后,这些工作结果被传送到链上。
尽管没有交易,JAM 仍然接受特定格式的外部信息。有五种类型的外部信息:
1. 保证(Guarantees)
2. 保险(Assurances)
3. 判断(Judgments)
4. 原像(Preimages)
5. 票据(Tickets)
前三种类型是 JAM 链安全框架的一部分。"Guarantees"(保证)和 "Assurances"(保险)涉及到验证者集体证明某个工作结果在通过服务的 "Refine" 函数转换后,准确反映了其对应工作项的结果。
当工作结果的完整性受到质疑时,就会发生判断,此时大量验证者证明其有效性或缺乏有效性。在这种情况下,无效的工作项可能已经被整合到服务的状态中,可能需要进行回滚。判断必须在提交工作报告到链上的一小时内进行,期间区块终结暂时暂停。
原像是 JAM 链为 Refine 函数提供的一个特性。虽然 Refine 函数通常是无状态的,但它可以执行一个有状态操作:查找哈希的原像。这个特性是 Refine 函数的唯一有预设偏好的方面。
票据作为匿名条目进入区块生产机制。它们不是区块生产的直接要求;相反,系统提前两个时代(epoch)运作。这一机制是 SAFROL 算法的一部分,是原始 SASSAFRAS 算法的精炼版本。
Refine 函数
在 JAM 中,Refine 处理阶段可以在每个时间段接受高达 15 MB 的数据,每个时间段持续 6 秒。然而,Refine 产出的数据最大为 90 kB,由于可用性系统的分布式特性,需要进行大量的数据压缩。例如,在平行链的背景下,15 MB 的数据代表有效性证明(PoV),而 90 kB 的数据对应于候选收据。
Refine 可以使用高达 6 秒的 PVM Gas,相当于中继链的完整块周期。这一延长的执行时间,与 PVF 当前的两秒限制相比,是通过安全计量和其他优化来实现的。
Refine 也可以进行原像查找。如果相信某个哈希及其相关原像在 JAM 链上可用,可以通过提供哈希来请求原像。这一能力使得代码的高效存储和检索成为可能,例如通过在 JAM 链上存储平行链代码并在工作包中引用其哈希。
Refine 是主要的处理主力,处理大部分是无状态操作的任务。
Accumulate 函数
Accumulate 函数负责将 Refine 函数生成的输出整合到链状态中。Accumulate 可以接受来自 Refine 的多个输出,所有这些输出都来源于同一服务。Refine 和 Accumulate 都作为来自特定服务代码块的入口点。
Accumulate 每个输出的执行时间比 Refine 的时间短得多,通常最多只有 10 毫秒。然而,持续时间取决于工作包中工作项的数量。如果工作包包含多个项,可用时间就会在它们之间分配。
与 Refine 不同,Accumulate 是有状态的,它可以访问 JAM 链的状态。它可以从任何服务读取存储,写入其键值存储,转移资金,并在资金转移时包括备忘录。此外,Accumulate 可以创建新服务,升级其代码,并请求原像的可用性等等。
此外,Refine 可以调用 PVM 的子实例。这允许创建子实例或虚拟机,在其中可以部署代码和数据,自定义内存和堆栈配置,并在灵活的框架内执行计算。
onTransfer 函数
JAM 系统中的 onTransfer 函数也是有状态的,使其能够修改服务的状态。它具有检查其他服务状态并修改自身状态的能力。这一功能促进了服务之间的通信,尽管是以异步方式进行的。
与许多交互同步发生的智能合约平台不同,在 JAM 中,封装组件(例如本例中的智能合约或服务)之间的交互是异步发生的。消息和代币一起发送,并且在同一六秒执行周期内的某个时刻,接收服务会处理它们。没有立即的返回路径;如果需要返回路径,则发送服务必须发起另一次传输或以接收服务稍后可以解释的方式修改其状态。
Accumulate 和 onTransfer 都被设计为可并行执行,允许不同服务的 Accumulate 和转移同时发生。这种设计为未来的增强打开了可能性,例如分配超过当前 10 毫秒的 gas 输入。理论上,一个辅助核心可以用来执行某些 Accumulate,为它们提供更多的 gas 来利用。
JAM 链的通用化
正如原始 Polkadot 白皮书中所述,Polkadot 主要针对特定的服务配置文件进行定制:提供平行链。为了实现这项服务,Polkadot 开发了两个重要的子组件:
- 分布式数据可用性系统
- 为计算提供审计和保证的系统(即具有强大安全保证的 Optimistic rollup 系统)
与 Polkadot 相比,JAM 的预设偏好更少,提供了更高水平的抽象和概括。这有助于根据个人喜好更轻松地利用底层组件。
JAM 以无需许可的方式运作,类似于智能合约链,允许个人上传和预期代码的执行。此外,它托管数据,启用原像查找,并管理状态,类似于键值对系统。由于 JAM 缺乏直接接受交易的机制,JAM 的创世块包含一项促进新服务创建的服务。
JAM 内的服务没有对代码、数据或状态的数量设置预定义的限制。它们的能力由加密经济因素决定;存放的 DOT 代币越多,数据和状态的容量越大。例如,平行链服务在 JAM 上将所有 Polkadot 1.1 功能整合到一个服务中,其他服务也可以利用 Polkadot 的分布式可用性系统,以及计算的审计和保证系统。
Polkadot 虚拟机(PVM)
PVM 的设计基于 RISC-V 指令集架构(ISA),该架构以其简单性和多功能性而闻名。RISC-V ISA 提供了几个优势:
1. 易于转译成常见的硬件格式,如 x86、x64 和 ARM。
2. 得到像 LLVM 等工具的良好支持。
PVM 本身体现了简单性和安全性,具备沙盒化的能力并提供各种执行保证。它具有确定性、共识敏感且易于计量。与其他虚拟机相比,PVM 缺乏复杂性和过度的预设偏好。
WASM 虽然针对 Web 用例进行了优化,但也给堆栈管理带来了挑战,特别是在处理连续性方面。RISC-V 通过将堆栈放置在内存中来解决这个问题,从而自然地促进连续处理,而无需增加复杂性。
此外,PVM 在传统硬件上运行时,尤其是在 X64 和 ARM 上,展示了卓越的执行速度,提供了免费计量等优势,这与 WASM 相比具有优势。
支持 RISC-V 的连续性将为跨 JAM 等多核平台的可扩展编码建立新标准。异步并行架构对于硬件和软件平台的可扩展性越来越重要,这一趋势预计将扩展到区块链和共识算法。
SAFROLE
SAFROLE 是一个区块生产算法,简化了 SASSAFRAS。它排除了一些对平行链可能有用的组件。所以平行链可能会坚持使用 SASSAFRAS 而不是 SAFROLE。SAFROLE 会尽可能简单:
- 确保尽可能减少预设偏好,以最大化潜在的未来用例。
- 追随以太坊黄皮书的脚步,并真正尝试获得尽可能多的实现,以尝试和传播专业知识。
理解 Polkadot 1.0 的端到端工作方式很具挑战性。有了 JAM,能够阅读和理解黄皮书的人应该能够很快地阅读和理解 JAM 的工作方式。所以简单性至关重要。
SAFROLE 是一个基于 SNARK 的区块生产算法。它使用 SNARK 是因为其匿名特性。并且它提供几乎完全无分叉的恒定时间区块生产。可能发生分叉的几个实例基本上只有在出现网络分裂或有人故意恶意操作时才会发生。匿名的巨大价值不是为了保持验证者身份的秘密;实际上,当他们产生一个区块时,他们无论如何都会暴露自己的身份,这么做其实是为了确保区块生产机制本身的安全,基本上是为了避免垃圾交易攻击。
网络
JAM 的网络使用 QUIC 协议。这允许在大量验证者之间直接建立点对点连接。因此,Polkadot 上的 1000 多个验证者可以彼此保持持久连接,而不必担心可能的套接字问题。由于 JAM 不处理交易,所以基本上不需要八卦(gossip)。在需要分发不是点对点或在非常小的验证者子集中的情况下,将使用网格扩散,验证者被排列成一个网格,包按行发送,然后每个节点将其发送到其列的所有成员。
用于高效区块处理的流水线
在类似以太坊这样的基于状态的区块链中,区块的标题通常包含后状态根,总结了所有区块计算后的状态。因此,直到所有计算完成之前,块头不能发送。但是,可以在发送块头之前执行一些计算,因为它们的结果决定了区块的有效性。
然而,JAM 采用了不同的方法,将前状态根放在块头中,而不是后状态根。这意味着标题中显示的状态根比一个区块延迟。因此,可以执行大约占区块工作量或执行时间 5% 的轻量级计算,并可以立即分发区块。其余 95% 的区块计算,主要是 Accumulate 任务,可以随后完成。这使得在执行当前区块之前可以开始下一个区块。
这种方法允许更有效地利用区块之间的时间。在传统设置中,如 Polkadot 的六秒区块时间,后状态根必须提供,只能用部分时间进行计算。然而,通过 JAM 中的流水线,可以有效地利用整个区块时间进行计算,最大化效率。
虽然使用整个区块时间进行计算可能不是理想的,因为它可能会导致永久追赶和延迟区块导入,但与传统设置相比,JAM 的方法可以显着延长计算时间。这意味着可以实现大约三到三秒半的有效区块计算时间,这比当前设置有了很大的改进。
架构差异:JAM 与中继链
JAM 和中继链之间的一个架构上的区别在于功能的固定程度。虽然中继链固定了一些元素,例如用于定义协议的语言(WASM),但 JAM 在这方面走得更远。例如,它规定了用于编码区块标题和散列方案的类型,使得更改这些方面变得困难。
然而,JAM 通过其服务模型保留了与中继链中的 WebAssembly 元协议所实现的灵活性相当的灵活性。在这个模型中,将可升级性责任转移到服务上,使链本身免于承担升级的负担。支持这一决定的三个主要理由包括:
- 优先考虑简单性。维护不可升级的链显著减少了复杂性。
- 中继链倾向于引入复杂的功能,而不删除旧的功能,这使得事情变得复杂。由于升级容易实现,因此几乎没有简化 Substrate SDK 的动机。因此,复制 Polkadot 变得不切实际。
- JAM 的固定参数提供了优化潜力。通过清楚地了解 JAM 链必须执行的特定任务和能够设置固定参数,网络拓扑和时序等领域的优化变得可行。这与中继链高度可升级的本质形成对比,在那里,由于每次升级都可能进行频繁的更改,因此这些优化更复杂。
尽管存在这些差异,JAM 在应用级功能上保持了灵活性,如核心时间销售、质押和治理,所有这些都在服务内部管理。此外,JAM 通过将代币余额与服务关联,引入了一个新概念,为在纯粹可升级的链如中继链中不容易实现的经济模型调整提供了机会。
JAM Toaster
为了确保 JAM 符合其最初的期望,正在进行的一项工作包括为 JAM 链建立一个全面的测试环境。与在不可靠的硬件上运行小规模测试网络以管理云计算成本不同,这项举措涉及大量投资。
这里引入了 JAM Toaster,本质上是一个用于进行大规模试验和性能评估的测试平台。这解决了之前在开发 Polkadot 中继链期间遇到的挑战,当时我们了解到在如此规模上运作网络的紧急效应和动态证明是困难的。之前的尝试仅限于测试网络上的几十个节点以及 Kusama 网络,由于无法访问验证节点,Kusama 缺乏全面的监控能力。相比之下,小规模测试网络未能准确模拟大规模部署的网络动态。
JAM Toaster 旨在通过对整个 JAM 网络(包括 1023 个节点)进行深入研究来弥补这一差距。该平台有助于研究网络行为和性能特征,为开发人员提供有关平行链预期性能的宝贵见解。
JAM 和 Substrate
基准测试 vs 计量
在 JAM 中,基准测试或性能测试可以是可选的。虽然在某些情况下仍然可能需要基准测试,但 JAM 的计量系统通常可以避免频繁的基准测试需求。JAM 运行在一个计量系统上,允许用户在完成后评估计算工作量。此外,还有一个理论机制可以在区块构建时控制计算。
然而,在某些情况下,基准测试仍然是需要的。例如,当计量对于某些用例来说过于保守时,可能需要进行基准测试来提高性能。此外,基准测试对于需要延长执行时间的任务很有用,可确保它们不会运行过长。
XCMP
接下来是跨链消息传递 (XCMP),JAM 要求提供全面的 XCMP 支持。这是因为在中继链中,如果所有平行链始终传输所有数据,则可以通过候选收据传递更多数据。JAM 严格遵守规则,即使对于平行链服务也是如此,包括对 “Refine” 和 “Accumulate” 阶段之间的数据传输的限制。目前,使用水平中继链消息传递 (HRMP),所有消息都会遍历中继链,将数据有效负载限制为 4 kB 或更少,这可能不现实。因此,XCMP 只通过链中继消息头,而实际消息数据在链下传输,这是一项必要且早该进行的改进。
Accords
Accords 本质上封装了状态和逻辑,类似于智能合约,每个平行链都有多个实例。它们促进实例之间的消息交换并实现与平行链的同步交互。协议在平行链之间缺乏信任的场景中有用,例如代币转移。与涉及储备中介的现有方法不同,Accords 简化了平行链之间的直接代币传送,消除了对信任妥协的中介的需求。此外,Accords 可以充当 XCM 转发机制,即使通过第三方中介机构中继也能确保消息完整性,从而消除了对明确来源标记的需要。
提高效率
最后,JAM 采用更广泛、不太预设偏好的方法来利用底层共识机制,有助于实施更具创新性的解决方案。例如,对于像零知识证明这样的复杂任务,分布式可用性变得更加实用和高效。此外,JAM 支持混合资源消耗模型,其中工作包可以包含计算密集型任务和数据密集型操作。通过将需要大量计算的服务与需要高数据可用性的服务配对,JAM 优化了验证者资源的利用,从而降低成本。这种灵活的方法使得如分布式可用性和 SNARK 验证与平行链工作负载的组合成本更低,同时提高效率。
JAM 的增强和兼容性
JAM 的设计优先考虑与现有 Polkadot 1 平行链的兼容性。虽然它保持与 Polkadot SDK 的兼容性,但 Polkadot 验证者函数(PVF)进行了了重新定位。它将面向 Polkadot 虚拟机(PVM),而不是 WebAssembly。这一过渡得益于 PVM 是 RISC-V 的轻微修改,RISC-V 已经被正式确定为 LLVM 的一个目标。因此,在部署 JAM 之前,PVM 可能会成为正式的 LLVM 目标。
除了作为平行链的宿主外,JAM 引入了显著的增强功能。它提供了简化基准测试工作并减轻未来基准测试需求的潜力。此外,JAM 引入了协议、多实例、多分片智能合约的概念,用于管理和执行平行链之间的特定交互协议。此外,全面的跨链消息传递(XCMP)支持至关重要,使得可以消除平行链之间信息传输的限制,这通常是通过跨链消息(XCM)来促成的。
关于敏捷核心时间(Agile Coretime),JAM 保持了与现有设置的兼容性。然而,它引入了不仅在平行链上,而是可以在任意工作包组上定位核心时间的功能。这种灵活性增强了 JAM 生态系统内资源分配的多功能性和效率。