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

微信图片_20180606181915.jpg

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

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

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

OP_RETURN [5554583011007bc4426b03824ccca5912bb147bd9f6847b670a08f24b79a4b5ed0b36393]微信

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

快速同步节点区块链

目前新的完整节点须要下载整个历史区块。这不只会在初始设置中引发烦人的延迟,并且还会致使现有节点负担太重,以致于须要花很大一部分带宽来为这些旧的区块服务。测试

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

微信图片_20180606181920.jpg

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

这些完整节点须要整个历史区块的惟一缘由是启动他们的记帐本。由于为了验证传入的交易和区块,他们必须知道哪些交易的输出目前未用完。他们必须建立一个未使用的交易输出集或UTXO集。生成此集合须要他们浏览全部的区块收集全部的输出,并去掉输入所消耗的输出。blog

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

UTXO证实:第一次尝试

数据集的证实是为该数据集肯定性计算的值。

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

咱们能够对UTXO集作一样的事情。若是咱们在区块中的某处(在coinbase输出中)建立整个UTXO证实,则新的完整节点能够下载UTXO集并根据此证实进行验证。

构建证实的一个简单方法是按某个键排列所UTXO,而后将它们整理在一块儿:

微信图片_20180606181923.jpg

 

这种证实(24d0 ...)将用于完整节点的同步。这个集合具备惟一肯定性,因此新的完整节点能够下载UTXO集并根据此证实进行验证。

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

使其重复

咱们须要构建一个重复的证实:implementations应该可以从区块的交易中更新证实,而不须要彻底重构它。

简单的改变就能够实现这个目的。咱们要作的是分别对每一个UTXO进行哈希处理,将这些哈希值做为数字处理,而后简单地将它们加在一块儿:微信图片_20180606181930.jpg

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

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

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

确保安全

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

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

这种结构被称为椭圆曲线多重散列哈希(ECMH)。微信图片_20180606181933.jpg

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

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

微信图片_20180606181937.jpg

如今咱们有一个安全的证实,能够重复地更新每个区块,而且能够用于新的完整节点来检查他们接收到的UTXO集合。这是证实,它能够在测试网络的区块中找到。

下一步的计划

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

主要是4个步骤:

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

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

三、将验证UTXO证实做为块验证规则的一部分。

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

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

将来的版本

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

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

将来版本可能会使这成为可能。例如,能够将UTXO集分为区域,其中每一个区域维护其本身的ECMH,而且这些区域散列在树形中。

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

相关文章
相关标签/搜索