区块链:
-区块链就是一个不断增长的全网总账本
-每个完全节点都拥有完整的区块链
-节点总是信任最长的区块链
-伪造区块链需要拥有超过51%的全网算力
区块链为什么不可篡改?
区块链的结构:区块链是由一个个区块,构成的有序链表,每一个区块,都记录了一系列交易,并且每个区块都指向前一个区块,从而形成一个链条。
如果我们观察一个区块,就会发现每个区块都有一个唯一的哈希标识(区块哈希);同时区块通过记录上一个区块的哈希,来指向上一个区块;
Merkle Hash用来确保该交易的所有交易记录无法被篡改;
区块的主要数据就是一系列交易,第一条交易是Conbase交易(矿工的挖矿奖励),后面的交易都是用户的交易。
区块链的不可篡改特性是怎么保证的?
是通过哈希算法(又称散列算法)
-哈希算法是一个单向函数:h = H(x)
-它把任意长度的输入数据转化为固定长度的输出
例如对“morning”和“bitcoin”进行某种哈希运算,得到的结果是固定长度的数字(通常用16进制表示哈希的输出)
哈希算法的特点:
--单项函数:
通过输入可以很容易地计算输出
通过输出无法反推输入,只能暴力穷举
--碰撞率低:
如果x ≠ y,而H(x) = H(y),则发生碰撞(输入数据不同,却计算出相同的哈希值)
因为输入数据的长度是不固定的,所以输入的数据是一个无限大的集合,而输出数据的长度是固定的,所以输出数据是一个有限的集合。把一个无限集合中的每一个元素变成到一个有限的集合中,就必然存在某些不同的输入好得到相同的输出。
--输出无规律
输入数据任意一个bit的改动,会导致输出完全不同
哈希算法的作用:
假设我们相信一个安全的哈希算法:如果H(x)=H(y),则x = y,如果两个文件或数据的hash相同,说明文件相同,没有被改动过。
比特币使用哈希算法来保证所有交易的不可篡改,就是计算并且记录交易的哈希,如果交易被篡改那么哈希验证将不能通过,说明这个区块是无效的。
常用的哈希算法:
Merkle Hash:本区块的交易的hash
Merkle Hash字段,他记录了本区块所有交易的Merkle Hash。
Merkle Hash是一系列数据的哈希,通过一个简单算法,变成一个汇总的哈希
如果交易的数量不恰好是4个,如只有三个时,三笔交易计算出a1,a2,a3,a1和a2可计算出b1,a3和谁组合计算?没关系再把a3复制一份即可,a3和a3计算出b2。总之,在每层的计算中,如果存在单数,就把最后一份数据复制在计算。
从merkle hash的计算方法可以得出结论:修改人一个交易,哪怕一个字节或者交换两个交易的顺序,都会导致Merkle hash验证失败,也就会导致这个区块本身是无效的,所以Merkle Hash记录在区块头部,它的作用就是保证交易记录永远无法被修改。
区块本身用Block Hash来标识,block hash并没有记录在区块头部,而是计算区块头部所记录的所有哈希得到的。
区块头部的Prev Hash记录了上一个区块的哈希,这样就可以追踪到上一个区块,这样每个prev hash都指向上一个区块,这样串起来就形成了区块链。
如果一个攻击者修改了区块中的某个交易,这样这个区块的Merkle hash就不会验证通过,所以攻击者只能重新计算和修改区块头部的Merkle hash,这时候区块本身的hash就变了,所以下一个区块指向它的链接就断掉了,由于比特币区块的哈希值要满足一个难度值,因此攻击者必须重新计算这个区块的哈希,然后把后续所有区块全部重新计算并且伪造出来,才能伪造整个区块链。
修改一个区块的成本就已经非常非常高了,伪造区块链需要拥有超过51%以上的全网算力才行,所以修改区块链的难度是非常非常大的,并且区块链在不断的增长,修改它的难度会随着时间的推移而不断的增加。
得出结论:
--区块链依靠安全的哈希算法保证所有区块数据不可更改
--工作量证明机制保证修改区块链的难度非常巨大从而无法实现