Bitcoin中的交易

双花攻击与UTXO

Posted by Emo on April 10, 2022

比特币笔记

EMO’s Blog

双花攻击

介绍

双花攻击是数字货币中比较常见的需要解决的问题。因为基于签名的数字货币很难被伪造,但是却很容易被复制。比如央行发布了一款数字货币,每一个货币都是用央行拥有的私钥去进行签名的。这样所有拥有这个货币的用户都可以很用的使用央行的公钥去验证货币的真伪,所以这样的一个数字货币是基本上不可能被伪造的。但是,如果我们只是复制呢?这样一个数字本质上也只是一串网络上的信息,我们虽然无法为造出一个一样的货币,但是我们却可以简单的拷贝出一个一摸一样的货币。比如A手上有一张十块钱的数字货币,它可以不停的复制出一摸一样的十块钱货币去不停的使用,这便是double spending(双花问题)。

传统数字货币系统中如何解决双花

想要解决这种问题,我们只需要给每张货币一个编号然后创建一个数据库去记录每个编号的货币存在于哪一个用户的手上就行了。比如用户A将编号为X111的货币给了B,这时数据库中就会记录{ X111:B },如果A复制了X111这个货币,想要将这张复制的货币使用出去的时候,就行不通了,因为数据库上记录了X111这个货币在B的手上。但是这是一个中心化的数字货币系统,在比特币这样的去中心化的数字货币系统中,我们无法构建这样一个中心化的数据库服务,要如何解决双花问题呢?

比特币中解决双花问题

在比特币这样一个去中心化的系统中,我们很难去维护这样一个中心化的数据库,所以比特币将货币的形式转换为了一笔交易,巧妙地将拥有者的信息嵌入到了货币当中。比如有这样一个笔交易,B用户转账给了A用户10块钱写作B –> A (10)。于是B –> A(10)这笔交易就是一个货币,它包含了货币的金额也记录了货币的所有者。这时候如果C用户复制了这一个货币,他是无法使用的,因为他不是所有者A。所以比特币中每一次发起交易的时候,需要说明转账的币的来源,也就是说B –> A(10)存在,A用户想要转钱给C用户10块钱A –> C(10)需要注明这笔钱来自于之前的B –> A(10)这个交易。下图是一个比较简单的流程图。

其实这样的结构不仅解决了双花攻击,也解决了重放攻击。双花攻击是指支付方重复的花一笔钱,而重放攻击是指收款方重复的发布转账交易以达到重复收多份钱的目的。因为重放攻击和双花攻击一样会产生复数的指向,从而被检测出来。重放攻击一般是针对基于账户的账本系统。

UTXO

上面说的这种交易模式就是比特币当中使用的,你可以把它当作是货币的销毁与生成,每一张货币都包含了金额和拥有者的信息,一旦货币被交易了,这个货币就需要被销毁,然后产生一个或多个总金额相等但是所有者不同的新货币。但被销毁的旧货币其实并没有被删除,他只是被标注为不可使用了。这样所有货币的销毁与产生都是可追溯的。为了实现这一模式,比特币的每个Transaction事务中都引入了两个字段,input和output,input中装入了这次交易中需要被使用的货币,output中记录了这次交易后会产生的新货币。那么如果我们把所有的transaction input构成的集合记做TXI,那么transaction output构成的集合就是TXO,至于Unspent transaction output,UTXO就是TXO和TXI的差集。我们在维护UTXO集合的时候,其实只需要动态的删除新区块中的所有TXI,并加入新区块中的所有TXO就行了。


{ % if page.mermaid % } { % endif % }