1. 介绍和动机

分片曾被认为是区块链扩容的主要途径,但分片间交易原子化的问题一直无法得到根本解决,在分片过程中逐渐萌芽的模块化区块链成为一种更可行的方式。模块化区块链目前仍然处于非常早期的阶段,它甚至没有被严格定义。其基本思想是解耦单体区块链为消息层、共识层、数据可用性层等不同的领域,并通过调用不同的领域来安全地实现扩容,目前应用最广泛的架构设计为 Rollup 和铭文。

Untitled

虽然铭文并不被大众认为是模块化区块链,但从技术角度来看,它将单体区块链作为消息队列服务,已经符合模块化区块链的思想。铭文的优势在于所有节点在无需沟通的情况下即可达成共识,极大地扩展了区块链的吞吐量。但劣势也显而易见,消息服务层只能传递极少的信息,使得铭文系统难以扩展,例如智能合约功能。如果我们将数据安全地存储在另一个模块,只在消息层发布数据的指针,并确保所有节点都能在任意时刻对数据可用性保持一致,我们就能极大地扩展铭文系统,这在比特币、以太坊等单体区块链上非常有用。

Rollup 核心思想是将计算转移到链下,并在链上验证,Rollup 之间通过某种通信协议进行跨 Rollup 交易。虽然以太坊生态将 Rollup 作为一种过渡期方案,或者称之为一种 Layer2 方案,但 Rollup 本身有其不可替代的价值。不同的应用类型具有不同的价格需求弹性以及安全需求,在具有统一共识的区块链设计中,多样化的安全需求和多样化的价格弹性无法被满足。即,增加 TPS 、降低交易费用并没有优化资源分配,因为“一个交易被加速,必定有另一个交易变慢” 已经是帕累托最优。

不同细分的交易也具有不同的价格需求弹性,punk 和 无聊猿 等应用的价格需求弹性类似于奢侈品,而社交互动、DAO 类的应用则完全相反。这决定了他们在 Gas 费的敏感程度的差异。敏感型应用一部分转移到链下,对他们研究后不难发现,他们具有不同的安全假设,也有不同的共识需求。例如 Ceramic 类的应用安全性建立在“用户不会攻击自己的数据”的假设之上,而 Snapshot 类投票的应用则建立在“每个相关用户都可以简单验证” 的假设下。他们通过将数据生产转移到链下从而节省成本,但同时增加了另外的攻击向量,例如数据扣留攻击。同时,如果要在链上使用这些数据,需要引入额外的安全假设。另一种方式是使用较为便宜的其他侧链,但随着侧链交易量的增加交易费也会被同时抬高,敏感型应用类的交易将首先被用户放弃,另外这种模式同样需要引入额外的跨链安全假设。

考虑这样一种设计模式,在同一个结算层上的 Rollup 有不同的安全模型,他们通过某种协议进行交互,使得 Rollup 在相同成本的情况下实现了自适应的安全性。举例来说,用户期望社交网络类应用的交互是免费的,这要求“共识”要尽可能地轻。但社交网络产生的社交关系具有协议价值,被其他许多应用依赖,又要求“共识”尽可能地安全。为了解决这个矛盾,我们可以利用协议类应用大多数只需要要“只读”的特点,设计一种“只读”的跨 Rollup 协议,当被依赖的应用受到挑战而被削减时,所有在两步之内依赖它的应用都同样被削减 。因此,即便社交网络是基于许可区块链的,出于安全性考量,依赖于它的应用也会同时验证它。于是使用越广泛的应用安全性越高,这就带来了一个安全性自适应但并不增加用户成本的交易范式,而且同时保证了链上数据可用性(在同一个结算层)。

另外,为了使得“只读协议”更加灵活,应当允许应用动态地添加依赖项。这对结算层提出了新的设计要求,换句话说,它带来了结算层的多样性。这种多样性最终会被固定到底层协议中,而无须采用智能合约支持。

已有非常多的文献阐述了数据可用性在区块链扩容方面的重要性,它保障了乐观 Rollup 的欺诈证明得以进行,为zk-Rollup 的交易排序和抗审查提高保障,并极大了拓展了模块化区块链的设计空间。

目前已有以太坊celestia 致力于提供数据可用性方案,但它们最终都通过全节点或存储节点来存储数据,实际上背离了扩容的初衷。我们的主要成果在于引入了农名解决了对最小诚实者集的依赖,同时解决了“谁来重构数据,谁来存储数据,存储多久”的问题,并使得验证者像轻客户端一样工作,对未来的分片非常友好。

2. 数据可用性层

2.1 基本原理

在乐观 Rollup 中,Rollup 的区块生产者在链下计算,在一定期限后向链上提交一个断言。恶意的区块生产者通过扣留一部分数据,阻止其他用户重新计算状态根从而无法生成欺诈证明。在区块链环境中,任何一笔恶意的交易都可以是致命的,例如其可以为自己增发大量的货币。我们需要确保用来计算最终状态的数据是完整的。

对于零知识证明驱动的 Rollup ,数据扣留攻击会阻止其他验证器计算当前状态,同样会带来严重的副作用。并且,它们同样需要确保交易排序的健壮性,依然要求交易数据完整地公开。

为了达到这个目的,一种最直接的方式是下载完整的数据来验证其可用性,但这违背了 Rollup 技术的初衷。另一种方式是抽样,但是直接对原数据抽样只能概率性地保证大部分数据可用,更为可行的方式是采用纠删码。纠删码通过将长度为 $k$ 的数据,扩展为长度为 $n(n>k)$ 的数据,并可从 $n$ 个数据中的任意 $k$ 个恢复原始数据。

假设数据被正确地编码,那么轻客户端可以通过随机抽样一组数据,即可以概率性地确认数据的可用性。并且这不需要诚实多数假设,即便发生“51%攻击”,轻客户端采样的结果仍然是安全的。 我们采样了数据可用性问题原始论文中的安全框架并进行了扩展。

定义 1 (健全性). 如果一个诚实的轻客户端接受一个区块是可用的,那么节点能在不超过 $t_d$ 的延迟内获得完整的区块数据,其中 $t_d$ 是最大网络延迟。

定义 2 (一致性). 如果一个诚实的轻客户端接受一个区块是可用的,那么所有其他诚实的轻客户端将在不超过 $t_d$ 的延迟内,接受该区块是可用的,其中 $t_d$ 是最大网络延迟。

定义 3 (持久性). 任何人都可以在 $t_p$ 时间内的任意时刻获得完整数据,其中 $t_d$ 是数据持久化时间。

2.1.1 Reed-Solomon