风险提示:理性看待区块链,提高风险意识!

怎样防止一个比特币被使用两次?

2个回答

资深韭菜君2星评价

2020-11-04 15:28:25

怎样防止一个比特币被使用两次?

比特币区块链作为一个去中心化的点对点电子现金系统,主要依靠UTXO和时间戳来应对"双花"问题。"双花"是指同一笔款项被重复支付了两次,也就是双重支付的情况。

比特币区块链作为一个去中心化的点对点电子现金系统,主要依靠UTXO (UnspentTransaction Output)和时间戳来应对"双花"的问题。 当某一笔比特币交易被创建一签名一广播到区块链网络之中后,每一个节点(比特币交易参与者)会对这笔交易进行验证,看交易的输出是否存在于UTX0 (Unspent Transaction Output ),即"未花费过的交易输出"中。

如果A拥有的1BTC被证实确实是"未花费过的交易输出",他要是将这1BTC同时转账给Bl、B2两人,挖矿节点会选择性地记录一笔交易,或许是最先收到的,或许是手续费更高的。

如果这两笔交易是先后被挖矿节点接收到的,那依据时间戳,先被接收到的交易会被验证成功,而后被接收到的交易则会因交易输入己经不存在于UTX0而验证失败。

如果两个挖矿节点分别同时记录了 "From A To B1"和"From A To B2"这两笔交易,并且这两笔交易被分别证明是合法的,此时这两个挖矿节点会将各自挖到的新区块广播到全网。

这时链就会分叉。其他参与挖矿的节点会随机选择一条链继续挖矿,哪条链先产生了新区块,哪条链就会成为当前最长的链,记录在最长链上的交易最终会被认证是成功的,而记录在另一条链上的交易则不会被认证。

一笔交易创建后若未被记录进区块中,为0确认;若被记录进区块中,则为1确认。为防止恶意制造最长链来进行"双花",建议等待6个新区块产生,也就是"6确认"之后再完成交易。

一分自然卷4星评价

2020-10-14 16:06:05

一个区块要能够进入区块链, 该区块输入的比特币(就是区块里in的部分)必须是没有被其他区块用过(在主链中的其它任何区块的输入in中出现过)。如果该比特币已经在一个区块里作为输入(in),而且该区块已经在主链中了,这个比特币已经有记录被花掉了,就不可能被重复使用第二次。

这个问题应该问的应该是,在两个交易中同时使用同一个比特币,而这两个交易对应的区块都还没有经过其他矿工(一般是6个矿工)的验证,交易能不能做成?就是重复支付(double spending)的问题。

重复支付在比特币里的处理原则是不能阻止,但可以检测到。 最终进入主链的只有一个区块,而另一个区块成为孤块(orphan block)。举例来说,A拿同一个比特币同时向B和C购买上商品,只要B和C坚持等到支付的区块被验证并加入主链后才给A发货的话,在这种情况下,重复支付是不会成功的,因为这两个区块最终只有一个区块链被接收。

另一种情况,就是在51%攻击时,重复支付可能成功。例如,A用同一个比特币向用户B和用户C同时购买商品,分别产生两个区块X和Y。支付给B的区块X最先被接收进入主链,用户B发现区块X被接收后,就发货给A。但A控制了整个系统超过51%的算力,这时,A在区块X被接收后,快速挖矿,在区块Y之上,快速加上一个其它的区块,这时系统出现两个分支,区块X所在分支和区块Y所在分支。但区块Y所在的分支已经比区块X所在的分支长,最终被系统接收,这时用户C看到区块Y被接收,把商品送给A。A达到了一个比特币购买同时购买两个商品,重复支付成功。

控制51%的算力几乎是不可能的,但这的确是基于工作量(pow)的挖矿证明的一个缺点,而基于股票(POS)的挖矿证明可以稍微好些地解决51%算力被控制的问题。