BCH测试网上出现第一个UTXO证明

微信图片_20180606181915.jpg

我们都知道我们看到的比特币现金的余额其实都来自于UTXO,即未花费的交易输出。正是因为采用了UTXO才让我们的交易全部都记录在区块链上,保证了去中心化。

基于此,一个名为Tomas 的人提出了UTXO证明。他认为使用UTXO证明可以允许完整节点的快速同步,因为完整节点可以下载UTXO集而不是历史区块,而且不会降低安全性。昨天,他在社交平台上Yours上发布文章表示在BCH测试网上出现第一个UTXO证明。以下是此文的译文。

如果你仔细检查了BCH测试网上的每一个区块,你可能会注意到一个奇怪的现象。在区块1237565中,coinbase的交易包含一个额外的输出:

OP_RETURN [5554583011007bc4426b03824ccca5912bb147bd9f6847b670a08f24b79a4b5ed0b36393]

这个元数据就是UTXO证明,它目前正在比特币现金网络中被开发。让我们看看它是如何工作的。

快速同步节点

目前新的完整节点需要下载整个历史区块。这不仅会在初始设置中引起烦人的延迟,而且还会导致现有节点负担过重,以至于需要花很大一部分带宽来为这些旧的区块服务。

为什么完整节点需要这些?他们并没有实际验证这些区块。大多数implementations都包含一个名为“assumevalid”的参数,其中包含一个硬编码的默认值:

微信图片_20180606181920.jpg

这并没有像听起来那样可信。当你去验证这些区块的时候,你将会根据软件中写入的规则进行验证。所有这些被声明的硬编码值都是假定有效的,因此这些区块都将遵循同样软件中编程的规则。这只是一个“预编译验证”,不会增加信任或降低安全性。

这些完整节点需要整个历史区块的唯一原因是启动他们的记账本。因为为了验证传入的交易和区块,他们必须知道哪些交易的输出目前未用完。他们必须创建一个未使用的交易输出集或UTXO集。生成此集合需要他们浏览所有的区块收集所有的输出,并去掉输入所消耗的输出。

如果完整节点能够下载UTXO集(?2GB)而不是整个历史记录(?140GB),这将是一个巨大的改进。

UTXO证明:第一次尝试

数据集的证明是为该数据集确定性计算的值。

一个很好的例子是如何将交易提交到区块中。当我们通俗地说交易是在一个区块中的时候,我们实际上是指交易提交给了的交易证明(“merkle root”)。这意味着只能使用该交易构建证明。这允许节点下载交易并且和他们一起进行验证并构建证明,从而确定交易是否在区块中。

我们可以对UTXO集做同样的事情。如果我们在区块中的某处(在coinbase输出中)创建整个UTXO证明,则新的完整节点可以下载UTXO集并根据此证明进行验证。

构建证明的一个简单方法是按某个键排列所UTXO,然后将它们整理在一起:

微信图片_20180606181923.jpg

这种证明(24d0 …)将用于完整节点的同步。这个集合具有唯一确定性,所以新的完整节点可以下载UTXO集并根据此证明进行验证。

但它有一个主要缺陷:节点将需要从整个UTXO集的每个区块中完全重构它。这可能会花费很长时间才能实现。

使其重复

我们需要构建一个重复的证明:implementations应该能够从区块的交易中更新证明,而不需要完全重构它。

微信图片_20180606181930.jpg

简单的改变就可以实现这个目的。我们要做的是分别对每个UTXO进行哈希处理,将这些哈希值作为数字处理,然后简单地将它们加在一起:

新的同步节点就可以像以前一样对其进行验证,但相同的证明还可以在每个区块中更新。implementations可以简单地减去花费的输出的散列,并添加新的输出,并且结果证明与当前集合构造时相同。

新的同步节点就可以像以前一样对其进行验证,但相同的证明还可以在每个区块中更新。implementations可以简单地减去花费的输出的散列,并添加新的输出,并且结果证明与当前集合构造时相同。

然而,这也有一个缺陷:它不是独一无二的。攻击者可能构造一个相同结构的UTXO集从而导致相同的证明。虽然证明量太大而无法尝试每种组合,但攻击者可能会滥用这个事实,即我们使用简单的加法应用和巧妙的算法来轻松找到这样的组合。

确保安全

幸运的是,让它迭代不需要我们使用加法。不过我们也可以使用像加法一样的东西。只要我们有一个可交换的操作并且有一些方法可以将它反向应用,它就可以工作。我们可以使用任何组,对于具有比加法更好的安全性的组来说,一个好的候选方法是secp256k1椭圆曲线及其组运算。

我们可以将每个哈希值设定为x ,然后去找y ,使得y = x3 + 7 ,而不是简单将哈希值加在一起。(x,y)则是曲线上的一个点,我们可以使用椭圆曲线组操作“⊕”组合这些点。(除了例外情况,A⊕B = C意味着找到C使得存在与A,B和C匹配的线性方程)。

微信图片_20180606181933.jpg

这种结构被称为椭圆曲线多重散列哈希(ECMH)。

这种方法需要注意的一点是:对于许多x 值,曲线方程是没有结果的。大概只有一半能够找到结果。

为了解决这个问题,我们只需要在哈希中添加一个数字(一个“nonce”),然后再次哈希,只要算法失败就增加数字:

微信图片_20180606181937.jpg

现在我们有一个安全的证明,可以重复地更新每一个区块,并且可以用于新的完整节点来检查他们接收到的UTXO集合。这是证明,它可以在测试网络的区块中找到。

下一步的计划

在进行快速同步节点之前,还有一些工作要做。

主要是4个步骤:

1、维护并将一条信息性的UTXO证明列入到coinbase中。

2、实现utxo / getutxo P2P消息以允许传输UTXO集。

3、将验证UTXO证明作为块验证规则的一部分。

4、推出快速同步引导方法。

我们在区块1237565中看到的是对于步骤1的代码的初始测试,其目前正在由各种implementations进行审查和讨论。

未来的版本

UTXO证明将对全节点初始同步提供方便。但是它并未启用UTXO包含或排除证明。虽然我们可以根据证明验证整个集合,但无法以这种方式验证单个UTXO。

UTXO包含和排除证明可能会让有些人感兴趣,可以允许一种新型的钱包不依赖追踪区块来查找离线时的交易,而且可以同步当前的余额。

未来版本可能会使这成为可能。例如,可以将UTXO集分为区域,其中每个区域维护其自己的ECMH,并且这些区域散列在树形中。

第一个版本的证明主要集中在主要目标上:使整个节点的初始同步速度非常快,并减少向新节点提供旧块的带宽负担。