重新创造比特币7:UTXO

作者:何岩,由 recreating.org发行。

0.前言 #

Bitcoin的第二个版本已经上线,运行正常。

重要的改变包括:

1.加入数字签名。

2.公钥替代用户名。

3.将签名加入交易模型。

4.删除了账号模型。

本篇在讲如何重新定义交易。

交易是经济学理论的核心,交易是一切。

交易即承载着每个个体的起心动念,交易也承载着整个世界的斑驳陆离。

对交易这个概念的认知高度,决定了Bitcoin系统的高度。

如何认知交易,就表现在如何定义交易。

1.Bug出现! #

新版本上线后, 系统看起来一切正常。

不过,只要是人写的程序就会有Bug。

这一天Alice找到中本聪,说自己的余额忽然归零了,怀疑自己的私钥泄漏了。

中本聪赶紧登陆到服务器上,查看账本中的交易记录,发现了Alice的交易记录有异常。

怎么会有重复的交易记录呢?(见下图)

图片 1.png

账本

中本聪问:“Alice,你最近做了几次转账?”

Alice说:“就一次,昨天给Carol转账20个Bitcoin”

中本聪说:“可是,在账本里我查到了3笔给Carol的转账(公钥C代表Carol的公钥)”

中本聪找来Gilfoyle,两人一起分析,很快找到了问题所在。

原来是Carol搞的鬼,Carol截获了Alice的交易请求,并重复的将其发送给服务端,服务端错误的认为是Alice在多次请求转账,结果就是将Alice的余额全
部转给了Carol。(见下图)

图片 1.png

Carol在搞鬼

2.分析Bug #

问题的根源是什么呢?

原来问题出在签名上,在现在的设计中,同一用户在不同交易中,签名没有变化。

服务端只会验证签名真伪,只要签名是真的,交易就成立。

黑客会重复发送伪造的交易请求,直到用户的余额小于交易金额。

那么签名为什么没有变化呢?

这是因为签名是将公钥加密,公钥不变,所以签名就不变。

签名不变,就意味着,签名的权利空间为用户的所有余额。

分析到了这里,中本聪对Gilfoyle说:“我们得让每笔交易中的签名都不同,最好是每笔交易的签名是系统唯一的”

如何做到让签名在每笔交易都是变化,且唯一的呢?

Gilfoyle说:“加密整个交易数据,因为交易数据每笔都不同”。

这个方案,乍看上去不错,但是仔细一想还是有漏洞。

中本聪说:”如果用户的正常需求就是,同一时刻发出两笔相同的交易请求,难道服务端还要拒绝吗?如果服务端不拒绝,万一是黑客在重复请求呢,就像前面Alice遇到的那个bug。”

Gilfoyle说:“那我们改造一下交易模型,加一个随机数的字段,约定好浏览器在创造交易数据的时候,需要填写一个随机数。这样每笔交易就不会重复了”。

中本聪说:“这个思路还是太传统了,不够优雅。况且,随机数也可能碰巧相同啊,虽然概率很小”。

“该怎么办呢?“中本聪闭上了眼睛,进入了自己的世界。

3.颠覆传统的优雅方案 #

最初的问题,是由于签名锁定到余额。

变更之后,签名锁定到交易。

但是新的问题来了,交易数据可能重复。

现在问题卡在了这里:如何让交易成为唯一?

交易的本质究竟是什么?

交易的本质是描述Bitcoin的所有权的变更,即,n个Bitcoin的所有权,由付款者变成了收款者。

例如Alice给Bob转账3个Bitcoin,本质就是:“3个Bitcoin的所有权,由Alice变成了Bob。”,这句话如何变成唯一呢?

Alice不会变,Bob不会变。3个Bitcoin也不会变。
等等!3个Bitcoin是可以变的!如果给每个Bitcoin都加上编号, 那么每个
Bitcoin都不同,都是唯一的。

假设Alice的余额中有6枚Bitcoin,编号为:Bitcoin001~Bitcoin006。

那么这笔交易的描述就变成了:“编号分别是Bitcoin001、Bitcoin002、Bitcoin003的Bitcoin的所有权,由Alice变成了Bob”

下一笔,Alice如果还想再给Bob转3个Bitcoin,描述就变成了:“编号分别是Bitcoin004、Bitcoin005、Bitcoin006的所有权,由Alice变成了Bob”

看到了吗,只要给Bitcoin加上编号,之前无法区分的交易,就可以区分开了,交易的描述,在语义上实现了唯一。

4.每笔交易都要先融化再铸造 #

交易是经济学理论的核心,交易是一切。

交易即承载着每个个体的起心动念,交易也承载着整个世界的斑驳陆离。

对交易这个概念的认知高度,决定了Bitcoin系统的高度。

如何认知交易,就表现在如何定义交易。

中本聪感觉找对了方向,不过现在的方案太粗糙,还需要进一步打磨。

给Bitcoin以编号,每一枚Bitcoin就可以看成一枚硬币。Bitcoin的最小单位就是整数1,不可再分割。

每笔交易都要明确的写出,自己引用的具体Bitcoin的编号。

这样虽然能实现交易的语义唯一,但是同时会带来两个问题:

第一个问题:如果不支持Bitcoin的小数分割,就太不灵活了。就像美元没有了美分。

第二个问题:如果交易金额很大,例如10万枚Bitcoin,就需要引用太多的Bitcoin编码,交易数据会过于庞大。这就像美元中只有1美元的面额。

突然,中本聪来了灵感:

如果我们每一次交易都等于是一次铸币呢,就是将多枚硬币融化成一个大块的硬币。

这样,每一笔交易产生的大硬币,就可以被下一笔交易所引用,且仅可以被引用一次。(如果被不同的交易引用,就是传说中的"双花",这个概念留给后面讨论)

当然,当前交易也要引用之前的一笔(或者多笔)交易的铸币。(见下图)

图片 1.png

UXTO

被交易引用后的一个(或者多个)大硬币就等同于被融化了(IN),然后再铸造新的大硬币(OUT)。

我们就称账本中,未被引用的大硬币:未花费的交易输出。

对应的英文:Unspent Transaction Output,我们用TX代表transaction,所以最终简写为:UTXO。

一个人的余额,本质上就是他能够引用的UTXO的总和。

Gilfolye说:“精彩!那么如何处理找零呢?Alice引用了一个金额为5的大硬币,但是只想给Bob,3.5Bitcoin”

中本聪说:“铸造成2个OUT(大硬币)就可以啦。在这里就是生成两个OUT(大硬币),分别是3.5和1.5,其中3.5给Bob,1.5给自己,这就是我们日常生活中的破零钱嘛。”(见下图)

图片 1.png

UTXO中的找零给自己

每一笔交易都引用过去交易生成的UTXO,同时创造出新的UTXO,等着未来交易来引用。

所有交易首尾相连,成为了一条连绵不绝的河流,从唯一的源头开始,中途经过分分合合的支流,永远朝着东方的大海前进,这就是所谓的,万折必东。

从这个角度来看,Bitcoin系统就是,一个条由交易组成的时间长河。

描述这类数据结构的专业名词称为:有向无环图。英文全称: Directed Acyclic Graph(简写为:DAG)。(见下图)

图片 1.png

有向无环图

中本聪在脑子里,模拟运行着新的设计:“现在的设计应该没有大的缺陷了,可以进入交易模型的设计啦”。

GIlfoyle:“UTXO的确优雅,交易模型的改动会很大”

所谓交易模型的设计,就是说,通过重构交易模型来承载UTXO机制。

5.后记 #

UXTO的设计部分就写完了,下一篇开始写,交易数据模型的重构,还会引入锁定和解锁脚本的机制。

“语义唯一”与“语法唯一” #

语义的意思是,一句话想表达的意义是什么。

语法的意思是,以什么形式来组织语言。

语义是本质,语法是外表。

语义唯一,即,一句话表达的意义是确定性不变的。就拿这句话:“编号分别是Bitcoin001、Bitcoin002、Bitcoin003的Bitcoin的所有权,由Alice变成了Bob”,不论谁来说,重复说多少次,什么时候说,谁来解释,都不会有歧义,即便服务端多次执行这句话,多次将这句话写入账本,Alice的余额也只会减少3枚Bitcoin,不会丢币。

而之前描述方式,是语义模糊的:“3个Bitcoin的所有权,由Alice变成了Bob”。如果服务端收到重复请求,无法确定其精确意义:究竟是Alice真的想付款多笔,还是客户端出了毛病(一笔交易发出了多次请求),还是黑客截获消息后的攻击。

传统的解决思路是,用语法上的唯一,来代替语义唯一。

什么是语法唯一,就是变着花的说话同一个意思,这样看上去就是不同的句子。

加随机数就是实现方法之一,像这样:
“随机数001, 3个Bitcoin的所有权,由Alice变成了Bob”
“随机数002, 3个Bitcoin的所有权,由Alice变成了Bob”
“随机数003, 3个Bitcoin的所有权,由Alice变成了Bob”

这样,服务端就就可以认为,重复的请求是异常数据,可以抛弃不理。

所以当前系统的漏洞,在本质上是交易的定义上存在漏洞,即,不是语义唯一。

下一篇:重新创造比特币8:基于UTXO的系统重构

相关链接 #

重新创造比特币:前言

Part One : 交易
重新创造比特币1:从一个简单的web交易系统开始
重新创造比特币2:第一个版本上线啦
重新创造比特币3:舍弃账户模型
重新创造比特币4:数字签名
重新创造比特币5:公钥和私钥
重新创造比特币6:第二个版本上线啦
重新创造比特币7:UTXO
重新创造比特币8:基于UTXO的系统重构
重新创造比特币9:万物皆交易
重新创造比特币10:交易脚本

Part Two : 群系统
重新创造比特币11:群系统(上)
重新创造比特币12:群系统(下)
重新创造比特币13:P2P网络
重新创造比特币14:交易的同步
重新创造比特币15:账本的同步
重新创造比特币16:Block Chain
重新创造比特币17:网络的弹性
重新创造比特币18:工作量证明(上)
重新创造比特币19:工作量证明(下)
重新创造比特币20:分叉之重组与分裂

书面设计矢量图_36.png

英文版Amazon.com在售 : Recreating Bitcoin

BSV打赏:
1Djc4TdVBi8urzmSXKHwg8cpEAYKcRQxgY

©2019 - Recreating.org all rights reserved

 
5
Kudos
 
5
Kudos

Now read this

重新创造比特币10:交易脚本

作者:何岩,由 recreating.org发行。 0.前言 # Gilfolye冒出了疯狂的想法,将Bitcoin改造为世界通用计算机。 中本聪和Gilfoyle已经有了大体的设计思路。 接下来就是将其落地。 1.交易的数据模型 # 中本聪:“那么如何将交易函数化,这个点子落地呢?” Gilfoyle说出了自己的具体改造思路。 当前交易的数据模型包括这4个部分: 1.TXID:交易的Hash值 2.IN部分:本交易引用的所有UTXO 3.OUT部分:... Continue →