比特币-学习札记

接触区块链有2个月的时间了,做了一个比特币和区块链的钱包应用,但是是纯粹的应用开发,对底层了解甚少了。现在回过头来,认真看看比特币的官方文档,做个笔记。
以下内容都翻译自 https://bitcoin.org/en/developer-guide#block-chain,同时也加入了自己的理解。

区块链

区块链为比特币提供了公开账本,记录了有序可追溯的所有交易。主要目的是防止多花(double spending)和篡改历史交易。

比特币的每一个full-node节点都各自记录本节点验证过的区块。当多数节点记录了相同的区块链,就可以认为是达成了共识(说的是这些区块以及区块内的交易生效了)。验证规则也被称为共识规则。

区块链概览

比特币-学习札记_第1张图片
简化版本的区块链

上图描述了一个简化版本的区块链。区块包含头(header)和数据(data),若干个新的交易被收集打包到区块的数据区域。区块内的交易被哈希,配对,再哈希,再配对,一直到只剩下1个哈希,也就是梅克尔树(merkle root). 生成规则可以看这里 https://blog.csdn.net/wo541075754/article/details/54632929

merkle root存储在block的header。每一个block还存储了前一个block的hash,然后就形成了一个block的chain,也就是区块链。这样如果篡改了某一个交易,那么包含该交易的block的merkle root就变化了,进而导致block的hash也变化了,相应的后续所有的block都会跟着变化(因为后续block存储了前一个block的hash),所以也就是51%算力,代价巨大。从而保证了区块链的不可篡改性。

交易Transaction逻辑意义上也是被串起来的(这里暂不考虑挖矿交易coinbase),所有交易的input都必须指向另一个交易的output,并且一个output最多被一个input引用。


比特币-学习札记_第2张图片
逻辑意义上的交易链

如上图,每个交易可以创建多个output,所以就能同时给多个地址转账。但是每一个output至多被一个input引用。output是和交易id(TXIDs)绑定再一起的,多个output从0开始计数。output可以分类:未花费的(UTXO,未被任何input引用)和已花费的。一个有效交易的所有input都必须是其它交易的UTXO。

交易的output之和必须>=input之和,并且output之和减去input之和就是交易费,也就是矿工的打包费。

工作量证明

区块链是由网络上无数个端点协同维护的,网络环境错综复杂,不排除有不怀好意的端点。所以比特币找到了一种方法,让不怀好意的端点很难去修改block数据。也就是block的验证很简单,但是修改却很困难,这样就pow工作量证明。
区块的链式结构保证了很难修改一个结点,因为修改一个节点之后,必须把所有后续的节点也全部修改掉。与此同时,这条连在不断增长,所以更进一步的增加了修改的难度。
比特币的工作量证明使用了密码学的伪随机性算法。一个好的哈希算法应该足够随机,哪怕是输入的任意一处小小的改动,都会产生完全不可预知的哈希值。为了证明你确实为产生新区快做了努力,你必须提供一个不超过某个具体值的区块头哈希,例如确定的值是123344,你可以提供一组数据,这组数据的哈希值<123344,以此证明你确实做了工作。
比特币系统中,这个值被称为难度值,难度值是动态调整的,用来保证平均10分钟产生一个区块。这个值每隔2016个区块调整一次。20160分钟也就是2周。每隔2016个区块的时候,看看这2016个区块用了多久,例如只用了1周,那就难度翻倍。如果用了3周,难么难度就调整为三分之二。

你可能感兴趣的:(比特币-学习札记)