重新创造比特币7:UTXO
作者:何岩,由 recreating.org发行。
0.前言 #
Bitcoin的第二个版本已经上线,运行正常。
重要的改变包括:
1.加入数字签名。
2.公钥替代用户名。
3.将签名加入交易模型。
4.删除了账号模型。
本篇在讲如何重新定义交易。
交易是经济学理论的核心,交易是一切。
交易即承载着每个个体的起心动念,交易也承载着整个世界的斑驳陆离。
对交易这个概念的认知高度,决定了Bitcoin系统的高度。
如何认知交易,就表现在如何定义交易。
1.Bug出现! #
新版本上线后, 系统看起来一切正常。
不过,只要是人写的程序就会有Bug。
这一天Alice找到中本聪,说自己的余额忽然归零了,怀疑自己的私钥泄漏了。
中本聪赶紧登陆到服务器上,查看账本中的交易记录,发现了Alice的交易记录有异常。
怎么会有重复的交易记录呢?(见下图)
账本
中本聪问:“Alice,你最近做了几次转账?”
Alice说:“就一次,昨天给Carol转账20个Bitcoin”
中本聪说:“可是,在账本里我查到了3笔给Carol的转账(公钥C代表Carol的公钥)”
中本聪找来Gilfoyle,两人一起分析,很快找到了问题所在。
原来是Carol搞的鬼,Carol截获了Alice的交易请求,并重复的将其发送给服务端,服务端错误的认为是Alice在多次请求转账,结果就是将Alice的余额全
部转给了Carol。(见下图)
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美元的面额。
突然,中本聪来了灵感:
如果我们每一次交易都等于是一次铸币呢,就是将多枚硬币融化成一个大块的硬币。
这样,每一笔交易产生的大硬币,就可以被下一笔交易所引用,且仅可以被引用一次。(如果被不同的交易引用,就是传说中的"双花",这个概念留给后面讨论)
当然,当前交易也要引用之前的一笔(或者多笔)交易的铸币。(见下图)
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给自己,这就是我们日常生活中的破零钱嘛。”(见下图)
UTXO中的找零给自己
每一笔交易都引用过去交易生成的UTXO,同时创造出新的UTXO,等着未来交易来引用。
所有交易首尾相连,成为了一条连绵不绝的河流,从唯一的源头开始,中途经过分分合合的支流,永远朝着东方的大海前进,这就是所谓的,万折必东。
从这个角度来看,Bitcoin系统就是,一个条由交易组成的时间长河。
描述这类数据结构的专业名词称为:有向无环图。英文全称: Directed Acyclic Graph(简写为:DAG)。(见下图)
有向无环图
中本聪在脑子里,模拟运行着新的设计:“现在的设计应该没有大的缺陷了,可以进入交易模型的设计啦”。
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”
这样,服务端就就可以认为,重复的请求是异常数据,可以抛弃不理。
所以当前系统的漏洞,在本质上是交易的定义上存在漏洞,即,不是语义唯一。
相关链接 #
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:分叉之重组与分裂
英文版Amazon.com在售 : Recreating Bitcoin
BSV打赏:
1Djc4TdVBi8urzmSXKHwg8cpEAYKcRQxgY
©2019 - Recreating.org all rights reserved