我们都知道我们看到的比特币现金的余额其实都来自于UTXO,即未花费的交易输出。正是因为采用了UTXO才让我们的交易全部都记录在区块链上,保证了去中心化。
基于此,一个名为Tomas 的人提出了UTXO证明。他认为使用UTXO证明可以允许完整节点的快速同步,因为完整节点可以下载UTXO集而不是历史区块,而且不会降低安全性。昨天,他在社交平台上Yours上发布文章表示在BCH测试网上出现第一个UTXO证明。以下是此文的译文。
如果你仔细检查了BCH测试网上的每一个区块,你可能会注意到一个奇怪的现象。在区块1237565中,coinbase的交易包含一个额外的输出:
OP_RETURN [5554583011007bc4426b03824ccca5912bb147bd9f6847b670a08f24b79a4b5ed0b36393]
这个元数据就是UTXO证明,它目前正在比特币现金网络中被开发。让我们看看它是如何工作的。
快速同步节点
目前新的完整节点需要下载整个历史区块。这不仅会在初始设置中引起烦人的延迟,而且还会导致现有节点负担过重,以至于需要花很大一部分带宽来为这些旧的区块服务。
为什么完整节点需要这些?他们并没有实际验证这些区块。大多数implementations都包含一个名为“assumevalid”的参数,其中包含一个硬编码的默认值:
这并没有像听起来那样可信。当你去验证这些区块的时候,你将会根据软件中写入的规则进行验证。所有这些被声明的硬编码值都是假定有效的,因此这些区块都将遵循同样软件中编程的规则。这只是一个“预编译验证”,不会增加信任或降低安全性。
这些完整节点需要整个历史区块的唯一原因是启动他们的记账本。因为为了验证传入的交易和区块,他们必须知道哪些交易的输出目前未用完。他们必须创建一个未使用的交易输出集或UTXO集。生成此集合需要他们浏览所有的区块收集所有的输出,并去掉输入所消耗的输出。
如果完整节点能够下载UTXO集(?2GB)而不是整个历史记录(?140GB),这将是一个巨大的改进。
UTXO证明:第一次尝试
数据集的证明是为该数据集确定性计算的值。
一个很好的例子是如何将交易提交到区块中。当我们通俗地说交易是在一个区块中的时候,我们实际上是指交易提交给了的交易证明(“merkle root”)。这意味着只能使用该交易构建证明。这允许节点下载交易并且和他们一起进行验证并构建证明,从而确定交易是否在区块中。
我们可以对UTXO集做同样的事情。如果我们在区块中的某处(在coinbase输出中)创建整个UTXO证明,则新的完整节点可以下载UTXO集并根据此证明进行验证。
构建证明的一个简单方法是按某个键排列所UTXO,然后将它们整理在一起:
这种证明(24d0 …)将用于完整节点的同步。这个集合具有唯一确定性,所以新的完整节点可以下载UTXO集并根据此证明进行验证。
但它有一个主要缺陷:节点将需要从整个UTXO集的每个区块中完全重构它。这可能会花费很长时间才能实现。
使其重复
我们需要构建一个重复的证明:implementations应该能够从区块的交易中更新证明,而不需要完全重构它。
简单的改变就可以实现这个目的。我们要做的是分别对每个UTXO进行哈希处理,将这些哈希值作为数字处理,然后简单地将它们加在一起:
新的同步节点就可以像以前一样对其进行验证,但相同的证明还可以在每个区块中更新。implementations可以简单地减去花费的输出的散列,并添加新的输出,并且结果证明与当前集合构造时相同。
新的同步节点就可以像以前一样对其进行验证,但相同的证明还可以在每个区块中更新。implementations可以简单地减去花费的输出的散列,并添加新的输出,并且结果证明与当前集合构造时相同。
然而,这也有一个缺陷:它不是独一无二的。攻击者可能构造一个相同结构的UTXO集从而导致相同的证明。虽然证明量太大而无法尝试每种组合,但攻击者可能会滥用这个事实,即我们使用简单的加法应用和巧妙的算法来轻松找到这样的组合。
确保安全
幸运的是,让它迭代不需要我们使用加法。不过我们也可以使用像加法一样的东西。只要我们有一个可交换的操作并且有一些方法可以将它反向应用,它就可以工作。我们可以使用任何组,对于具有比加法更好的安全性的组来说,一个好的候选方法是secp256k1椭圆曲线及其组运算。
我们可以将每个哈希值设定为x ,然后去找y ,使得y = x3 + 7 ,而不是简单将哈希值加在一起。(x,y)则是曲线上的一个点,我们可以使用椭圆曲线组操作“⊕”组合这些点。(除了例外情况,A⊕B = C意味着找到C使得存在与A,B和C匹配的线性方程)。
这种结构被称为椭圆曲线多重散列哈希(ECMH)。
这种方法需要注意的一点是:对于许多x 值,曲线方程是没有结果的。大概只有一半能够找到结果。
为了解决这个问题,我们只需要在哈希中添加一个数字(一个“nonce”),然后再次哈希,只要算法失败就增加数字:
现在我们有一个安全的证明,可以重复地更新每一个区块,并且可以用于新的完整节点来检查他们接收到的UTXO集合。这是证明,它可以在测试网络的区块中找到。
下一步的计划
在进行快速同步节点之前,还有一些工作要做。
主要是4个步骤:
1、维护并将一条信息性的UTXO证明列入到coinbase中。
2、实现utxo / getutxo P2P消息以允许传输UTXO集。
3、将验证UTXO证明作为块验证规则的一部分。
4、推出快速同步引导方法。
我们在区块1237565中看到的是对于步骤1的代码的初始测试,其目前正在由各种implementations进行审查和讨论。
未来的版本
UTXO证明将对全节点初始同步提供方便。但是它并未启用UTXO包含或排除证明。虽然我们可以根据证明验证整个集合,但无法以这种方式验证单个UTXO。
UTXO包含和排除证明可能会让有些人感兴趣,可以允许一种新型的钱包不依赖追踪区块来查找离线时的交易,而且可以同步当前的余额。
未来版本可能会使这成为可能。例如,可以将UTXO集分为区域,其中每个区域维护其自己的ECMH,并且这些区域散列在树形中。
第一个版本的证明主要集中在主要目标上:使整个节点的初始同步速度非常快,并减少向新节点提供旧块的带宽负担。