好好学习,天天向上,一流范文网欢迎您!
当前位置: >> 体会 >> 教学心得 内容页

UTXO比特币系统的全节点要维护叫UTXO的数据结构

区块链是一种去中心化的账本,比特币采用基于交易的账本[ledger]模型。系统不会显示每个帐户中有多少钱。

未交易输出

比特币系统的全节点需要维护一个叫做UTXO(未花费交易输出)的数据结构。区块链上有很多交易,交易的输入是付款人,输出是新的持币人。有些交易输出可能已经在其他交易中花费了,有些还没有花费。所有未被花费的币的集合称为UTXO。

一笔交易可能有多个输出。如果 A 给 B 5 个比特币,B 会花掉它们。A还给了C 3个比特币,C没有花掉。此时5个比特币不计入UTXO,而是3个比特币计入。UTXO 集合中的每个元素都应该给出生成输出的交易的哈希值,以及它在这个交易中是哪个输出。这两条信息可以用来定位UTXO币的来源。但注意UTXO只维护每笔交易的输出项,不维护账户余额。我们无法直接查看每个账户的余额,只能通过 UTXO 间接计算。

UTXO 集合有什么作用?- 为了检测双重支出。即检测新发出的交易是否合法。第 3 节提到比特币每笔交易的输入部分包含硬币的来源。有了UTXO,我们只需要验证币源是否在UTXO集合中即可。

除了比特币基于交易的模型,还有基于账户的账本模型,比如以太坊系统。在这种模式下,系统将显示并记录每个账户中有多少硬币。

比特币基于交易模型,具有更好的隐私保护。缺点是比特币的转账交易需要说明币种来源,而账户模式则不需要。

怎么样获得比特币_比特币怎么获得_比特币怎么获得

交易费用

注意:每笔交易可以有多个输入和输出,所有输入金额的总和必须等于输出金额的总和。即总投入=总产出。所以一笔交易可能来自多个地址,可能有多个签名。

也有一些交易的总投入略大于总产出。如果输入1个比特币,输出0.99个比特币,另外0.01个比特币作为交易手续费给获得记账权的节点发布区块。

想一想,为什么发布区块的节点非要把你的交易打包到区块里呢?他们还需要验证您交易的合法性。如果交易多了,占用的带宽就比较大,网络传输速度也会变慢。所以只有区块奖励是不够的。

因此,比特币系统设计了第二种激励机制:交易手续费。也就是你把我的交易打包在区块里,我给你提示。交易手续费一般很小,区块奖励一般是它的几百倍;也有一些简单的交易没有手续费。但随着时间的推移,区块奖励逐渐减少,手续费将成为主要激励。

挖矿双层循环:extra nonce

比特币怎么获得_比特币怎么获得_怎么样获得比特币

nonce 只有 2 到 32 个可能的值。比特币现在很流行,加了很多算力。为了保持平均十分钟的出块时间,挖矿难度调得很高。实际情况是很有可能遍历输入空间(2的32次方值),找不到满足条件的nonce。那我们该怎么办呢?然后在区块头中找到另一个可以调整的字段。

回忆一下区块头中的各个字段:比特币协议的版本号、上一个区块的区块头的哈希值、默克??尔树的根哈希值、区块生成的时间戳、目标阈值,以及随机数 nonce。

想了想,只有默克尔树的根哈希值适合调整,这样整个区块头的哈希值就满足拼图了。

在每个区块中比特币怎么获得,都有一个铸币交易,为打包者提供专属的区块奖励。它有一个可以写入任何内容的 coinbase 字段。这个域名对我们有什么用?

上图是区块头中根哈希值对应的Merkle树,左下角的交易是铸币交易,包括coinbase字段。改变 coinbase 的内容来改变 Merkle 树的根哈希值。可以使用coinbase字段的前八个字节作为额外的nonce,加上区块头中的nonce(4个字节),这样搜索空间就增加到2的96次方。

比特币怎么获得_比特币怎么获得_怎么样获得比特币

所以实际挖矿的时候只有两层循环,外层循环调整coinbase域的extra nonce。在计算出区块头中的根哈希值后,内循环调整区块头中的随机数。

恶意攻击

比特币解决的难题,除了算力之外,没有其他实际意义。比特币的稀缺性是人为的。

虽然挖矿解谜本身没有实际意义,但对维护比特币系统的安全至关重要。挖矿提供了一种通过计算能力进行投票的有效方式。只要大部分算力掌握在诚实节点手中,系统的安全性就可以得到保证。

假设好矿工占算力的90%,坏矿工占算力的10%。那么记账权就有10%的概率落入恶意矿工手中。

第一个问题

怎么样获得比特币_比特币怎么获得_比特币怎么获得

不行,因为他没有办法伪造别人的签名,这笔交易是非法的,诚实的节点是不会接受这个区块的。

第二个问题

如果他把M→A交易写在一个区块里,现在他已经获得了记账权,他再发布一个交易,再花钱,也就是M→M',把这个交易的区块打包在叉子。这显然是双重支出。

这样生成的两条区块链都是合法的。主要看其他节点沿着哪条链向下扩展,最后一个获胜,另一个失效。事务被回滚。这次攻击的目的是什么?如果 M→A 交易产生了一些不可逆的外部影响,然后 M→M' 回滚 M→A 交易,那么 M 就可以从中不正当获利。

如何防止这种攻击?如果 M→A 交易所在的区块与其他区块相连,则这种攻击的难度会大大增加。如果要回滚M→A交易,还是需要在它之前插入一个区块,然后想办法成为最长的合法链。这个难度很大。因为诚实节点不会沿着它产生的恶意攻击区块向下扩展(最长合法链协议)。所以,防止这种攻击的方法就是多等几个区块比特币怎么获得,或者多等几个确认。当 M→A 交易刚刚写入区块时,我们称之为一次确认。这时候后面加入的区块依次称为二次确认、三次确认……在比特币协议中,直到六次确认,M→A 的交易才被认为是不可变的。平均等待时间为一个小时。

比特币怎么获得_比特币怎么获得_怎么样获得比特币

区块链是一个不可变的账本。那是否意味着写入区块链的内容永远无法更改?从上面的分析可以看出,这种不可篡改只是概率上的保证。刚写入区块链的内容比较容易被更改。经过一段时间的等待,或者接下来的几个区块被确认后,被篡改的概率会显着下降(指数下降)。

第三个问题

这个有可能。比特币协议并没有规定哪些交易必须由有记账权的节点在区块中公布。但如果出现这种情况问题不大,因为这些合法的交易肯定会被写入下一个区块,并且总有诚实的节点愿意发布这些交易。

在区块链的正常运行下,也会出现合法交易不被计入的情况。根据比特币协议,每个区块的大小是有限制的,最多不能超过 1MB。所以如果交易太多,有些交易可能要等到下一个区块才能发布。

这会发生吗?M→M'交易所在区块的链条虽然短,但是先秘密生成比上面更多的区块,然后等上面的链条公布后再发布,会不会比上面的更好以上块?这种方法称为自私挖矿。

一般情况下,当一个区块被挖出时,它会立即被释放。原因是如果你不发布,别人可能会发布,你就得不到区块奖励。而自私挖矿是先隐藏后不发布,是分叉攻击的一种手段。但是这种方式成功的概率并不高,因为恶意节点算力占比不高,产生更多的区块非常困难。

以上是自私挖矿的目的之一,它还有另外一个目的。如果 A 挖了两个区块都没有释放出来,但是 B 挖了一个区块后马上发布了,那么 B 挖出的区块就会失效。这样做的好处是减少竞争,因为当A在挖第二个区块的时候,其他人还在挖第一个区块(前提是A的算力够强,可以连续挖两个区块)。