重新创造比特币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

Recreating Bitcoin 19:Proof of Work (Part II)

Epilogue # Now let’s design a problem that requires Proof of Work to solve (POW). Looking for the Random Number Many times, in sleep you get the answer you would not get while awake. Satoshi was lucky to have experienced that. But it was... Continue →