当前位置:首页 » 比特币问答 » 比特币的双花

比特币的双花

发布时间: 2024-10-23 15:43:54

A. 在区块链中,双花问题是什么问题呢

  • 什么是双花问题呢?

双花问题,简单讲就是一笔钱能被花两次三次很多次。为什么双花问题会成为比特币系统里面一个这么重要的问题呢?

原因就在于:比特币,是虚拟货币,它是虚拟的,通过代码形式呈现出来的,是可以被复制下来的。一旦被攻破了代码漏洞,那么就可以循环使用同一笔比特币,这样一来,比特币这种“钱”就会变得很鸡肋。

我们想一下,要是一笔钱可以花很多次,你有500块钱,你去买一件500块钱的衣服,还能循环使用,再去买一双500块钱的鞋,这样一来,钱还能叫钱吗?

所以,中本聪在设定比特币系统的时候,他所有的技术手段基本上都是围绕着解决

“双花问题”的,来保护比特币作为一种货币,它自身的一个支付手段职能。

其实,这个双花问题在我们现在的中心化世界里面根本不是问题,因为有银行,钱的交易结算都是通过银行,很安全,有问题直接找银行。

但是,在去中心化世界里面呢,没有银行这样一个中心机构,还必须保证一笔钱只能花一次,怎么样实现在去中心化的前提下,杜绝“双花问题”呢,这是一个难题。

这里插一句,中本聪为什么如此执着的追求“去中心化”呢,自找烦恼吗?不是,他希望能够通过去中心化,来解决一些社会问题,其中最主要的问题就是:因为权力机构过量发行货币造成的通货膨胀。

所以,我们总结一下他的逻辑:中心化的货币增发导致通货膨胀——所以我们要实现去中心化——去中心化要面临很多问题,最大的问题是双花问题——所以我们要解决双花问题——怎么解决双花问题?

这里,中本聪就引入了UTXO和“时间戳”概念,依靠这两种手段来解决双花问题。

B. 比特币机制研究

现今世界的电子支付系统已经十分发达,我们平时的各种消费基本上在支付宝和微信上都可以轻松解决。但是无论是支付宝、微信,其实本质上都依赖于一个中心化的金融系统,即使在大多数情况这个系统运行得很好,但是由于信任模型的存在,还是会存在着仲裁纠纷,有仲裁纠纷就意味着不存在 不可撤销的交易 ,这样对于 不可撤销的服务 来说,一定比例的欺诈是不可避免的。在比特币出来之前,不存在一个 不引入中心化的可信任方 就能解决在通信通道上支付的方案。
比特币的强大之处就在于:它是一个基于密码学原理而不是依赖于中心化机构的电子支付系统,它能够允许任何有交易意愿的双方能直接交易而不需要一个可信任的第三方。交易在数学计算上的不可撤销将保护 提供不可撤销服务 的商家不被欺诈,而用来保护买家的 程序化合约机制 也比较容易实现。

假设网络中有A, B ,C三个人。
A付给B 1比特币 ,B付给C 2比特币 ,C付给A 3比特币
如下图所示:

为了刺激比特币系统中的用户进行记账,记账是有奖励的。奖励来源主要有两方面:

比特币中每一笔交易都会有手续费,手续费会给记账者

记账会有打包区块的奖励,中本聪在08年设计的方案是: 每10分钟打一个包,每打一个包奖励50个比特币,每4年单次打包的奖励数减半,即4年后每打一个包奖励25个比特币,再过四年后就奖励12.5个比特币... 这样我们其实可以算出比特币的总量:

要说明打包的记录以谁为准的问题,我们需要引入一个知名的 拜占庭将军问题 (Byzantine failures)。拜占庭将军问题是由莱斯利·兰伯特提出的点对点通信中的基本问题。含义是在存在消息丢失的不可靠信道上试图通过消息传递的方式达到一致性是不可能的。

假设有9个互相远离的将军包围了拜占庭帝国,除非有5个及以上的将军一起攻打,拜占庭帝国才能被打下来。而这9个将军之间是互不信任的,他们并不知道这其中是否有叛徒,那么如何通过远距离协商来让他们赢取战斗呢?

口头协议有3个默认规则:
1.每个信息都能够被准确接收
2.接收者知道是谁发送给他的
3.谁没有发送消息大家都知道
4.接受者不知道转发信息的转发者是谁
将军们遵循口头规则的话,那就是下面的场景:将军1对其他8个将军发送了信息,然后将军2~9将消息进行转达(广播),每个将军都是消息的接受者和转发者,这样一轮下来,总共就会有9×8=72次发送。这样将军就可以根据自己手中的信息,选择多数人的投票结果行动即可,这个时候即便有间谍,因为少数服从多数的原则,只要大部分将军同意攻打拜占庭,自己就去行动。
这个方案有很多缺点:
1.首先是发送量大,9个将军之间要发送72次,随着节点数的增加,工作量呈现几何增长。
2.再者是无法找出谁是叛徒,因为是口头协议,接受者不知道转发信息的转发者是谁,每个将军手里的数据仅仅只是一个数量的对比:

这里我们假设有3个叛徒,在一种最极端的情况下即叛徒转发信息时总是篡改为“不进攻”,那么我们最坏的结果就如上图所示。将军1根据手里的信息可以推出要进攻的结论,却无法获知将军里面谁是叛徒。
这样我们就有了方案二:书面协议。

书面协议即将军在接受到信息后可以进行签字,并且大家都能够识别出这个签字是否是本人,换种说法就是如果有人篡改签字大家可以知道。书面协议相对比口头协议就是增加了一个认证机制,所有的消息都有记录。一旦发现有人所给出的信息不一致,就是追查间谍。
有了书面协议,那么将军1手里的信息就是这样的:

可以很明显得看出,在最坏的一种情况——叛徒总是转发“不进攻”的消息之下,将军7、8、9是团队里的叛徒。
这个方案解决了口头协议里历史信息不可追溯的问题,但是在发送量方面并没有做到任何改进。

在我们的示例中,比特币系统里的每个用户发起了一笔交易,都会通过自己的私钥进行签名,用数学公式表示就是:

所以之前的区块就变成了这样:

这样每一笔交易都由交易发起者通过私钥进行数字签名,由于私钥是不公开的,所以交易信息也就无法被伪造了。

如书面协议末尾所说的那样,书面协议未能解决信息交流过多的问题。当比特币系统中存在上千万节点的时候,如果要互相广播验证,请求响应的次数那将是一个非常庞大的数字,显然势必会造成网络拥堵、节点处理变慢。为了解决这个问题,中本聪干脆让整个10分钟出一个区块,这个区块由谁来打包发出呢?这里就采用了工作量证明机制(PoW)。工作量证明,说白了就是解一个数学题,谁先解出来数学题,谁就能有打包区块的权力。换在拜占庭将军的例子中就是,谁先做出数学题,谁就成为将军们里面的总司令,其他将军听从他发号的命令。

首先,矿工会将区块头所占用的128字节的字符串进行两次sha256求值,即:

这样求得一个值Hash,将其与目标值相比对,如果符合条件,则视为工作量证明成功。
工作量证明成功的条件写在了区块链头部的 难度数 字段,它要求了最后进行两次sha256运算的Hash值必须小于定下的目标值;如果不是的话,那就改变区块头的 随机数 (nonce),通过一次次地重复计算检验,直到符合条件为止。

此外, 比特币有自己的一套难度控制系统,使得比特币系统要在全网不同的算力条件下,都保持10分钟生成一个区块的速率。这也就意味着:难度值必须根据全网算力的变化进行调整。难度调整的策略是由最新2016个区块的花费时长与期望时长(期望时长为20160分钟即两周,是按每10分钟一个区块的产生速率计算出的总时长)比较得出的,根据实际时长与期望时长的比值,进行相应调整(或变难或变易)。也就是说,如果区块产生的速率比10分钟快则增加难度,比10分钟慢则降低难度。

PoW其实在比特币中是做了以下的三件事情。

这样可以防止一台高性能机器同时跑上万个节点,因为每完成一个工作都要有足够的算力。

有经济奖励就会加速整个系统的去中心化,也鼓励大家不要去作恶,要积极地按照协议本来的执行方式去执行。(所以说,无币区块链其实是不可行的,无币区块链一定导致中心化。)

也就是说,每个节点都不能以自身硬件条件去控制出快速度。现在的比特币上平均10分钟出一个块,性能再好的机器也无法打破这个规则,这就能够保证 区块链是可以收敛到共同的主链上的 ,也就是我们所说的共识。

综上,共识只是PoW三个作用中的一点,事实上PoW设计的作用有点至少有这么三种。

默克尔树的概念其实很简单,如图所示

这样,我们区块的结构就大致完整了,这里分成了区块头和区块体两部分。

区块链的每个节点,都保存着区块链从创世到现在的每一区块,即每一笔交易都被保存在节点上,现在已经有几百个GB了。
每当比特币系统中有一笔新的交易生成,就会将新交易广播到所有的节点。每个节点都把新交易收集起来,并生成对应的默克尔根,拼接完区块头后,就开始调整区块头里的随机数值,然后就开始算数学题

将算出的result和网络中的目标值进行比对,如果是结果是小于的话,就全网广播答案。其他矿工收到了这个信息后,就会立马放下手里的运算,开始下一个区块的计算。
举个例子,当前A节点在挖38936个区块,A挖矿节点一旦完成计算,立刻将这个区块发给它的所有相邻节点。这些节点在接收并验证这个新区块后,也会继续传播此区块。当这个新区块在网络中扩散时,每个节点都会将它作为第38936个区块(前一个区块为38935)加到自身节点的区块链副本中。当挖矿节点收到并验证了这个新区块后,它们会放弃之前对构建这个相同高度区块的计算,并立即开始计算区块链中下一个区块的工作。
整个流程就像下一张图所展示的这样:

简单来说,双花问题是一笔钱重复花了两次。具体来讲,双花问题可分为两种情况:
1.同一笔钱被多次使用;
2.一笔钱只被使用过一次,但是通过黑客攻击或造假等方式,将这笔钱复制了一份,再次使用。
在我们生活的数字系统中,由于数据的可复制性,使得系统可能存在同一笔数字资产因不当操作被重复使用的情况,为了解决双花问题,日常生活中是依赖于第三方的信任机构的。这类机构对数据进行中心化管理,并通过实时修改账户余额的方法来防止双重支付的出现。而作为去中心化的点对点价值传输系统,比特币通过UTXO、时间戳等技术的整合来解决双花问题。

UTXO的英文全称是 unspent transaction outputs ,意为 未使用的交易输出 。UTXO是一种有别于传统记账方式的新的记账模型。
银行里传统的记账方式是基于账户的,主要是记录某个用户的账户余额。而UTXO的交易方式,是基于交易本身的,甚至没有账户的概念。在UTXO的记账机制里,除了货币发行外,所有的资金来源都必须来自于前面某一个或几个交易。任何一笔的交易总量必须等于交易输出总量。UTXO的记账机制使得比特币网络中的每一笔转账,都能够追溯到它前面一笔交易。
比特币的挖矿节点获得新区块的挖矿奖励,比如 12.5 个比特币,这时,它的钱包地址得到的就是一个 UTXO,即这个新区块的币基交易(也称创币交易)的输出。币基交易是一个特殊的交易,它没有输入,只有输出。
当甲要把一笔比特币转给乙时,这个过程是把甲的钱包地址中之前的一个 UTXO,用私钥进行签名,发送到乙的地址。这个过程是一个新的交易,而乙得到的是一个新的 UTXO。
这就是为什么有人说在这个世界上根本没有比特币,只有 UTXO,你的地址中的比特币是指没花掉的交易输出。
以Alice向Bob进行转账的过程举例的话:

UTXO 与我们熟悉的账户概念的差别很大。我们日常接触最多的是账户,比如,我在银行开设一个账户,账户里的余额就是我的钱。
但在比特币网络中没有账户的概念,你可以有多个钱包地址,每个钱包地址中都有着多个 UTXO,你的钱是所有这些地址中的 UTXO 加起来的总和。
中本聪发明比特币的目标是创建一个点对点的电子现金,UTXO 的设计正可以看成是借鉴了现金的思路:我们可能在这个口袋里装点现金,在那个柜子角落里放点现金,在这种情况下不存在一个账户,你放在各处的现金加起来就是你所有的钱。
采用 UTXO 设计还有一个技术上的理由,这种特别的数据结构可以让双重花费更容易验证。对比一下:

C. 比特币出现漏洞,手把手带你发起攻击,万一暴富了呢

针对所有的支付系统,有一种攻击方式叫作 双花攻击 。所谓双花攻击就是指一笔资金被花费多次,攻击者先将资金转出,获得收益后通过攻击的手段撤销该笔转账,让资金重新回到攻击者的账户上。那么我们能否对比特币发起双花攻击并从中获利呢?答案是肯定的!下面让我带你一起对比特币系统发起攻击。

在带领大家发起攻击之前,我们需要先了解一下比特币的转账原理,这是我们发起攻击的预备知识。

在比特币系统中,用户想要发起一笔转账,首先要把转账信息组装好,就像填写银行支票一样,写好付款方账户,收款方账户,转账金额,然后使用加密技术对转账信息签名,我们把这种签名好的转账请求叫作交易。交易被比特币系统处理以后,付款方的账户就会被扣除指定金额,收款方的账户就会增加指定金额。

用户的交易会被发送给比特币系统中的节点,节点收到交易后将其放在一个新的区块中,然后对这个区块进行哈希计算,也就是之前文章所说的计算数学题。哪一个节点优先计算出了这个区块的数学题答案,就获得了这个区块的打包权,被这个节点打包进区块的交易就相当于成交了,然后所有的节点会在新区块的基础上开始计算下一个区块的数学题。

知道了比特币的转账原理,下面我们就来看一下比特币的漏洞到底在哪里!

刚才我们说谁先算出答案谁负责打包区块,那如果有两个节点同时做出了同一个区块的答案该怎么办呢?为了解决这个问题,比特币系统设计了一个特殊的机制,叫作最长链原则。

通过上面的描述我们可以看出,比特币的这条链是有可能分叉的,分叉以后会以最长的链为准,那么在较短的分叉上的区块就被废弃了。 这不正为我们攻击比特币系统带来了可能性吗!

你可能已经想到了,既然比特币系统只认最长的那条链,我们是不是可以通过这样的方式对比特币进行双花攻击:

至此,你之前转出的比特币还在你的账户上,并且得到了你想要的东西,所以你的攻击成功了。

对比特币的攻击真的这么简单吗?答案当然是否定的!虽然我们说可以通过上述方法对比特币发起攻击,但是攻击是要付出代价的。

所以,如果你想要创建一个新的分叉,并且超过主链的区块长度,那么你需要比主链上所有节点的计算速度加在一起都要快。要想实现这样的结果,唯一的做法就是你要收买比特币系统中超过51%的节点算力,这就是比特币的51%攻击原理。

想要攻击比特币系统并不是不可能,但是需要付出的代价可能远远超过作恶所获得的收益。在比特币系统中,节点越多,算力越强,攻击比特币系统的成本就越高,比特币系统就越安全。比特币越安全,它的价值就越高,就会吸引更多的节点加入来竞争比特币奖励。更多的节点进一步促进了系统的安全性,这是一个正向循环。

51%攻击不只是针对比特币的,所有采用 工作量证明共识算法 的区块链都面临着这个问题。对于已经日趋成熟的比特币系统来说,攻击比特币确实是不划算的,而且随着系统节点的越来越多,攻击比特币几乎成为了不可能的事情。但是一些新的链,在其刚起步的时候节点和算力还不多,这种攻击确实是真实有效的,并且这种攻击事件时有发生。

D. “双花”是什么

POW算法是唯一经过时间检验运行较为稳定的算法,这从比特币诞生到现在的较稳定的运行就可以看出。

上次说到POW的共识算法的部分运作原理。把上次所讲的内容简单总结一下,那就是POW通过哈希加密算法解决了“凭什么帮你记账”的问题。

其实,POW共识算法的目的,是可以保证任意节点被入侵、篡改,其数据信息不会被其它节点所接受,换句话说,POW要通过运行机制保障主链的安全性。

因此,仅仅解决“凭什么帮你记账”的问题对一个成熟稳定的共识算法来讲还是远远不够的,它还需要解决其它一些问题,比如双花问题。

双花问题(Double Spending)即双重支付,是指一笔数字现金在交易中被重复使用的现象。我们都知道,数字现金的走向只能是线性的,也就是同一笔钱一次只能转给一个人,不能同时转给两个或者以上的人。一旦数字现金的走向发生了偏差,离开了线性轨道的约束,成为发散状态,那么双花问题就会出现。

举个例子,小明一早出门只带了10元钱,他来到肯德基吃早餐,点了10元的套餐,把钱付给了肯德基的收银员,这10元钱得到收银员的确认。小明吃完早餐出门,发现自己并没有吃饱(小明饭量有点大),抬头一看有个麦当劳,于是他走进麦当劳,想再点一个10元的汉堡。这时候,如果小明想用之前买肯德基套餐的那10元钱买麦当劳汉堡,可能吗?当然不可能。因为那10元钱是独一无二的(有编号),已经被花出去了。

但如果小明使用的不是现金,而是数字货币呢?这就另当别论。这是因为现金的复制成本太高(法律成本、制作成本等等),而数字货币则不然,它具有十分经济的可复制性,使得系统可能存在同一笔数字资产因不当操作被重复利用的问题。

双花问题在有中介的前提下是不容易发生的,因为每次消费都要经过第三方(中介方)的确认才会完成,比如支付宝。

而比特币作为一个去中心化的点对点现金系统,是没有中介和第三方的,它主要依靠未花费的交易输出(UTXO)和时间戳两大利器来解决双花问题。

未花费的交易输出(UTXO)可以被简单地理解为一个用户拥有的比特币的余额。这个余额是无法伪造的,因为一个用户拥有的比特币实际上会被当作UTXO分散到数百个交易和数百个区块中。

双花问题是这样解决的:

首先每笔交易都要先确认对应的比特币之前的情况,要检查它是否存在于付款人的UTXO中。

其次,同一笔UTXO付出去,系统节点按照时间戳只会确认先接收到的那一笔。

最后,当两笔时间上很近的交易被不同节点确认,区块链将发生分叉。当其中一笔交易被6个节点确认后,它将获得最终的确认,成为最长链。

本文仅供学习参考之用,不构成任何投资建议。

E. 入门科普:什么是双花

想要了解区块链,首先要熟悉区块链相关的各种名词。就比如我们今天讲到的“双花”,可能有人就要问,双花是什么花?哈哈哈,开玩笑,让我们来学习一下什么是“双花”吧。

01

“双花”是什么?

双重支付又名“双花”,也就是双重花费的意思。 举个例子:如果我钱包里面有100元,我可以去购买等值的物品。当我去商店后,发现台灯和桌子都是100元,那我只能买其中一样东西。而我们所说的双花问题,正好与之相反,同样的100元,我可以购买两样东西。

在加密货币系统中,由于数据的可复制性,使得系统可能存在同一笔数字资产被重复使用的情况 ,这也称之为双花,又叫双重消费攻击。

02

双花问题是如何发生的?

在区块链系统中,双花问题会在以下情况下出现:

1、由于共识机制导致区块确认时间长,用一个数字货币去进行一次交易,可以在这笔交易还未被确认完成前,进行第二笔交易。

2、 控制算力来实现双花 ,第一次交易被验证通过并被记录入区块后,在该网络中有更高的算力验证出新的更长链条,在该链条中这笔钱被第二次花费,由于第二次花费的区块链条更长使第一次交易区块所在链条为无效链条,这样一来,第一次交易所在的区块链被区块链网络放弃,第一次花费的钱就又回到自己账户了,就导致了双花问题。

03

比特币如何避免双花问题?

为了解决双花问题,我们日常的数字资产使用依赖于第三方信任机构进行。这类机构对数据进行中心化管理,并通过实时修改账户余额的方法来防止双重支付的出现。而作为去中心化的点对点价值传输系统, 比特币通过UTXO、时间戳等技术的整合来解决双花问题。

1、首先每笔交易都要先确认对应比特币之前的情况,要检查它是否存在于用户的UTXO中。如果不在,那么该交易会被系统拒绝。

2、如果用户用同一笔UTXO付给两个人,系统中的节点只确认先接收到的那一笔。

3、当两笔时间上很接近的交易被不同节点确认,区块链将发生分叉。剩余节点选择在他们认为的最长链上构建新的区块。

4、当其中一笔交易被6个节点确认后,它将成为系统最长链,可以认为这笔交易获得了最终的确认。

F. ‘双花’攻击

什么是双花?

“双花”,即一笔钱被花了两次或者两次以上,也叫“双重支付”。通俗的理解,“双花攻击”(double spend attack)又叫“双重消费攻击”,即同一笔资金,通过某种方式被花费了两次,取得了超过该笔资金的服务。

在数字货币系统中,由于数据的可复制性,使得系统可能存在同一笔数字资产因不当操作被重复使用的情况。

双花是如何发生的?

众所周知,区块链节点始终都将最长的链条视为正确的链条,并持续工作和延长它。如果有两个节点同时广播不同版本的新区块,那么将在率先收到的区块基础上进行工作,但也会保留另外一个链条,以防后者变成最长的链条。等到下一个工作量证明被发现,其中的一条链条被证实为是较长的一条,那么在另一条分支链条上工作的节点将转换阵营。

双花简单说就是花两次。双花是如何实现的呢?分为两种情况:

(1)在确认前的双花。零确认的交易本来就可能最后没有写入区块链。除非小额,最好至少等确认即可规避此类双花。

(2)在确认后的双花。这就要控制超50%算力才能实施。即类似于一个小分叉,将给一个商店的交易放入孤立区块中。这种确认后双花,很难实施,只是理论上可行。

双花攻击案例

2018年曾经发生了比特币黄金(BTG)的双花攻击。BTG当时是全球第27大加密货币,流通市值为50亿人民币。2018年5月16日以来,攻击者对BTG网络成功实施了双花攻击,谋取了超过38.8万的BTG的暴利。

攻击者控制BTG网络上51%以上的算力,控制算力期间,把一定数量的BTG发给自己在交易所的钱包,这条分支我们命名为分支A。同时,又把这些BTG发给另一个自己控制的钱包,这条分支我们命名为分支B。分支A上的交易被确认后,攻击者立马卖掉BTG,拿到现金。随后,攻击者在分支B上进行挖矿,由于其控制了51%以上的算力,很快分支B的长度就超过了分支A的长度,分支B就会成为主链,分支A上的交易就会被回滚恢复到上一次的状态。攻击者之前换成现金的那些BTG又回到了自己手里,这些BTG就是交易所的损失。这样,攻击者就凭借50%以上的算力控制,实现了同一笔加密货币的“双花”。

热点内容
比特币的双花 发布:2024-10-23 15:43:54 浏览:157
以太坊htc风险 发布:2024-10-23 15:34:14 浏览:802
huc游戏区块链 发布:2024-10-23 15:19:56 浏览:878
区块链一般有多少个节点 发布:2024-10-23 15:19:51 浏览:325
币圈涨幅潜力 发布:2024-10-23 15:19:43 浏览:804
华硕trx40e供电 发布:2024-10-23 15:16:39 浏览:38
莱比特矿池怎么挖 发布:2024-10-23 14:30:26 浏览:239
币圈频繁操作好吗 发布:2024-10-23 14:30:25 浏览:991
猪来了买挖矿工划算吗 发布:2024-10-23 14:29:47 浏览:99
区块链应用营销 发布:2024-10-23 14:22:08 浏览:426