区块链笔记4--BTC实现

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

1 UTXO

区块链是一个去中心化的账本比特币采用了 基于交易的账本模式 。然而系统中并无显示记录账户包含BTC数实际上其需要通过交易记录进行推算。在比特币系统中全节点需要维护一个名为 UTXO(UnspentTransaction Output尚未被花掉的交易输出) 数据结构。

如图A转给B五个BTC转给C3个BTCB将5个BTC花掉则该交易记录不保存在UTXO中C没有花掉则该交易记录保存在UTXO中

UTXO集合中每个元素要给出产生这个输出的交易的哈希值以及其在交易中是第几个输出。通过这两个信息便可以定位到UTXO中的输出。

1.1为什么要维护这样一个数据集合

原因为了防止“双花攻击”判断一个交易是否合法要查一下该交易所需的BTC是否在该集合中只有在集合中才是合法的。如果想要花掉的BTC不在UTXO中说明这个BTC要么根本不存在要么已经被花过。所以全节点需要再内存中维护这样一个UTXO集合从而快速检测是否有double spending双花攻击

每个交易会 消耗输出也会 产生新的输出。如图A转给B5个BTC之后B将其转给D则UTXO中会删掉A->B这一交易记录同时会添加B->D这一交易记录。
假如有人收到BTC转账但一直不花那么这个信息会一直保存在UTXO中。这种情况可能是该用户不想花这些BTC(如中本聪) 也有可能是忘记了私钥导致无法花掉。所以UTXO是逐渐增大的但该数据目前来说一个普通的服务器硬盘中是可以完全保存这些数据的。每个交易可以有多个输入也可以有多个输出但输入之和要等于输出之和total inputs = total outputs。 存在一些交易的total inputs 略大于 total outputs这部分差额便作为交易费给了获得记账权的节点。

1.2如果仅仅设置出块奖励那么会不会存在节点只想发布区块获得出块奖励而不想打包交易

解答BTC系统设计了Tranction fee交易费对于获得记账权节点来说除了出块奖励之外

还可以得到打包的交易费。但目前来说交易费远远小于出块奖励。等到未来出块奖励变少可能区块链的维护便主要依赖于交易费了。

平均每隔十分钟产生一个新区块每21万个区块出块奖励减半大约每隔四年半出块奖励就会减半

2 BTC区块的具体信息

Block header

看到nonce是一个32位的无符号整型数据在挖矿时候是通过不断调整nonce进行的但可以看到nonce的取值最多为2^32 种。但并非将这些nonce全部遍历一遍就一定能找到符合要求的nonce。由于近年来挖矿人员越来越多挖矿难度已经调整的比较大了关于难度调整请关注后续博文会有专门一篇介绍难度调整而 2^32这一搜索空间太小所以仅调整nonce很大可能找不到正确的结果。

3 铸币交易coinbase:

每个发布区块者可以得到出块奖励也就是可以在区块中发布一个 铸币交易(coinbase交易),这也是BTC系统中产生新比特币的唯一方式。下为一个铸币交易的内容

可以看到有一个coinbase域其中可以写入任何内容在这里写什么都没有影响。所以可以在这里添加一些信息便可以实现无法篡改也无法删除

4挖矿过程的概率分析

挖矿本质上是不断尝试各种nonce来求解这样一个puzzle。每次尝试nonce可以视为一次伯努利试验。最典型的伯努利试验就是投掷硬币正面和反面朝上概率为p和1-p。在挖矿过程中一次伯努利试验成功的概率极小失败的概率极大。挖矿便是多次进行伯努利试验且每次随机。这些伯努利试验便构成了a sequence of independentBernoulli trials(一系列独立的伯努利试验)。根据概率论相关知识知道伯努利试验本身具有无记忆性。也就是说无论之前做多少大量试验对后续继续试验没有任何影响。 对于挖矿来说便是多次伯努利试验尝试nonce最终找到一个符合要求的nonce。在这种情况下可以采用泊松分布进行近似由此通过概率论可以推断出系统出块时间服从指数分布。(需要注意的是出块时间指的是整个系统出块时间并非挖矿的个人)

系统平均出块时间为10min该时间为系统本身设计通过难度调整维护其平均出块时间。 指数分布本身也具有无记忆性。也就是说对整个系统而言已经过去10min仍然没有人挖到区块那么平均仍然还需要等10min很不符合人的直觉。也就是说将来要挖多久和已经挖多久无关。

虽然这样看起来是一个冷酷的事情过去的工作可能都会白做。但实际上这才是挖矿公平性的保障。对算力有优势的矿工来说其之前所做大量工作仍有可能会白费。

5 BTC系统安全性分析

5.1 可否偷币

答案不能。因为转账交易需要签名恶意节点无法伪造他人签名。加入其获得记账权并硬往区块中写入该交易大多数用户会认为其是一个非法区块大多数算力将不认可该区块从而沿着其他路径挖矿随着时间推移拥有大多数算力的 诚实的节点将会仍然沿着原来区块挖矿从而形成一条“最长合法链”该区块变成孤儿区块。对于攻击者来说不仅不能偷到其他人的比特币而且得不到出块奖励还浪费了挖矿花费的电费等成本。

5.2可否将已经话过的币再花一遍

如下图1若M已经将BTC转给B现在想再转给自己假设其获得记账权若按照图1方式很明显为一个非法区块不会被其他节点承认。 所以M只能选择图2方式将M转账给B的记录回滚掉。这样就有了两条等长合法链取决于哪一个会胜出。如果上面交易产生不可逆的外部效果下面交易回滚便又拿回钱从而不当获益

需要注意的是再挖矿之初便要选择上一个区块是谁。也就是说并不是获得记账权之后才选择插入到哪一个区块之后。

5.3 可否故意不包含合法交易

可以但是可以等待后续区块包含所以问题不大。实际运行中可能由于某段时间实际交易数太多而一个区块包含交易数存在最大值导致某些合法交易并未被写入区块链等待后续区块写入。

5.4 可否挖到矿但不发布

selfifish mining 提前挖到但不发布继续挖下去等到想要攻击的交易等了6次确认认为安全之后将整条链发布出去试图回滚原来记录。这种情况需要恶意节点掌握系统中半数以上算力才行否则无法成为最长合法链。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: 区块链