主页 > imtoken钱包官方下载地址 > [比特币] 比特币的实现

[比特币] 比特币的实现

imtoken钱包官方下载地址 2023-02-15 07:17:18

比特币系统是一个基于交易的账本,这意味着账本中存储的是一笔交易。 那么比特币能当钱花吗,用户在进行转账交易时,首先需要保证用户持有的金额大于或等于待交易的金额。 这样做的目的是为了避免双花问题。

这种以交易为基础的账本的优点是有更好的隐私保护,缺点是每笔交易都需要说明币种的来源。

在比特币的全节点中,内存中会维护一个名为UTXO(Unspent Transaction Output)的数据结构——未花费交易输出,用于记录哪些交易输出已经被消费,哪些交易输出尚未被消费。 没有消耗。 已消费的交易输出将从 UTXO 中移除。

随着比特币系统交易量的不断增加,UTXO 的交易量也在不断增加。 虽然消耗的交易输出会被移除,但UTXO中也会有一些陈旧的交易输出。 有的是所有者不使用的(比如中本聪账户下的),有的是丢失私钥后无法使用。

因此,在执行交易的过程中,首先会从UTXO中获取,看交易中输入的比特币数量是否大于等于交易输出的数量,即(total quad inputs >= total quad输出),不同的是支付给记账节点的小费。 因此,比特币的奖励不仅仅是区块奖励,还有交易过程中支付的小费。 但在当前环境下,各节点争夺记账权主要是为了区块奖励。

解决难题

比特币中的区块头结构如下:

class CBlockHeader

空中比特币钱提不出来_比特币怎么卖出去变钱_比特币能当钱花吗

{ public: // header int32_t nVersion; // 当前使用的比特币版本,不可更改 uint256 hashPrevBlock; // 前一个区块的Hash,不可更改 uint256 hashMerkleRoot; // MerkleTree的根Hash

比特币怎么卖出去变钱_空中比特币钱提不出来_比特币能当钱花吗

uint32_t nTime; // 时间戳,因为比特币网络不要求绝对的时间同步,所以这个值可以小范围的调整 uint32_t nBits; // 目标阈值,根据协议定期调整 uint32_t nNonce; // 随机数 ...... }

比特币能当钱花吗_比特币怎么卖出去变钱_空中比特币钱提不出来

nonce 是一个无符号整数,这意味着它的值在 (0 sim 2^{32}) 范围内。 按照目前的挖矿难度,很可能所有的计算都找不到(2^{32})个值。 这个时候怎么办?

从上面比特币区块头的定义可以发现,除了nonce可以修改外,hashMerkleRoot也是可以修改的。

正如上一节所述,每个区块都包含一个铸造交易,其中包含一个 coinbase 字段。 在比特币交易中,这个字段是不勾选的,也就是说可以随意写入这个字段。 在《数据结构》一章介绍MerkleTree的时候提到过比特币能当钱花吗,修改MerkleTree的任意一个叶子节点,都会影响到MerkleTree的根Hash值。 因此,当区块头中的4字节nonce不够时,可以使用其他字节,比如使用coinbase字段的前8字节作为extra-nonce,这样搜索空间就扩大到(2 ^{ 96})。

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

在比特币中,解谜的过程也被称为“挖矿”,因为它就是在一个很大的空间里找到一个非常有价值的物品。

挖矿过程中的每一次尝试都可以看作是一次伯努利试验,这意味着每次计算的结果都不会影响下一次计算的结果。

空中比特币钱提不出来_比特币怎么卖出去变钱_比特币能当钱花吗

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

比特币系统安全分析

假设大部分算力掌握在诚实的矿工手中,我们能得到什么样的安全保障? 你能保证写入区块链的交易是合法的吗?

挖矿只提供概率保证。 只能说下一个区块由诚实矿工出块的概率比较大,但不能保证记账权不会落入恶意节点手中。

偷硬币

恶意节点可以盗币吗? 答案是否定的,因为他没有私钥,不能伪造别人的签名。

比特币能当钱花吗_比特币怎么卖出去变钱_空中比特币钱提不出来

如果恶意节点将盗币交易写入区块链,诚实节点将不会接受这个区块,因为它包含非法交易。 因此,诚实节点会沿着前一个区块继续挖掘,并产生新的区块来替代非法区块,其他诚实节点也会沿着这个合法区块继续挖掘。 比特币的要求是扩展正常的合法链。 结果不仅没有得到区块奖励,没有钱被盗,还浪费了算力。

双花

恶意节点能否实施双花攻击? 答案是不。 如果从M向A转账的交易已经写在一个区块中,此时他已经获得了记账权,他发起另一笔交易将转账给A的钱转给自己,发起双花攻击。 诚实节点不会接受这个块。

如果他还想发布这个区块,他只能把这个区块连接到记录上次转账交易区块的前一个区块上。 应该插入区块的位置在挖矿开始时就确定了,因为区块头需要填充上一个区块头的Hash。 这样就会生成两条链,两条链都是合法的。 之后就看其他节点往下扩展到哪条链上了。 最终只有一条链获胜,另一条链失效。

双花攻击的目的是将钱转给A获取某物后,将花掉的钱转给自己,从而达到不正当获利的目的。 但是按照上面的操作,只会有两种结果:支付比特币给A买东西,或者把钱转给自己,什么也得不到。 显然,这两个结果都没有达到双花攻击的目的。

那么在使用比特币支付商品时,如何避免上述问题呢?

在比特币协议中,默认情况下,包含交易的区块后面有6个新区块,只有这样才能认为交易成功。 以平均出块时间10分钟计算,交易发起后一小时需要确认交易。

免责声明:本作品采用署名-非商业性-相同方式共享4.0国际(CC BY-NC-SA 4.0)许可,使用时请注明出处。

[比特币] 比特币的实现