区块链记账原理
区块链结构
区块链是由一个个区块构成的有序列表,每一个区块都记录了一系列交易,并且每一个区块都指向前一个区块从而形成一个链条。
区块链有以下几个特征:
- 区块链就是一个不断增长的全网总账本
- 每个节点都拥有完整的区块链
- 节点总是信任最长的区块链
-
伪造区块链需要拥有超过51%的全网算力!
区块结构图.png
每一个区块上都有一个hash标识:区块hash,同时该区块通过记录上一个区块的hash来指向上一个区块。区块还有一个Merkle hash用来确保该区块的所有交易记录,无法被篡改。区块的主要数据是交易记录。第一条记录Coinbase是矿工的挖矿奖励,后面的交易都是用户的交易。
区块链具有不可篡改的特性,是由哈希算法保证的。
什么是哈希算法/Hash:
- 哈希算法是一个单向函数:h = H(x)
- 它把任意长度的输入数据转化为固定长度的输出
MD5加密结果如下:
MD5("version1") = "966634ebf2fc135707d6753692bf4b1e";
MD5("version2") = "2e0e95285f08a07dea17e7ee111b21c8";
安全哈希算法的特点:
- 单向函数:
- 通过输入可以很容易的计算输出
- 通过输出无法反推输入,只能暴力穷举
- 碰撞率低:
- 如果X 不等于 y,而H(x) = H(y),则发生了碰撞。
- 因为输入数据的长度是不固定的,所以输入数据是一个无限集合,而输出数据的长度是固定的,所以是一个有限的集合。这样就必定会出现不同的输入导致相同的输出。当无限集合映射到有限集合时必定会出现碰撞。碰撞的概率和集合的大小有关,输出的hash位数越多,集合就越大,碰撞的概率就越低。
- 输出无规律:输入数据任意一个bit的改动,会导致输出完全不同,从而让攻击者无法猜出输入,只能依靠暴力穷举。
哈希算法的作用:
假设我们相信一个安全的哈希算法:如果H(x) = H(y),则x = y
- 如果两个文件的hash相同,说明文件没有被修改过
- 如果两份数据的哈希相同,说明两份数据相同
- 比特币是用哈希算法来记录所以的交易不可修改,就是计算并记录交易的哈希,如果交易被篡改,那么hash验证就不会通过,说明这个区块是无效的。
常用的哈希算法:
算法 | 输出长度 |
---|---|
MD5 | 128bit : 16bytes |
RipeMD160 | 160bit : 20bytes |
SHA-1 | 160bit : 20bytes |
SHA-256 | 256bit : 32bytes |
SHA-512 | 512bit : 64bytes |
比特币使用两种哈希算法:
- 两次SHA-256
- hash256 = sha256(sha256(data))
- 先计算SHA-256,再计算RipeMD160
-
hash160 = ripemd160(sha256(data))
区块头结构图.png
Merkle Hash:记录了本区块所以的Hash。
假设这个区块有5笔交易,首先,对每一笔交易进行第一hash,也就是2次SHA-256的运算,得到5个哈希值,也就是a1、a2、a3、a4、a5,这五个哈希值也可以看做是数据,将a1和a2拼起来、a3和a4拼起来,再计算出2个哈希值b1和b2。那a5怎么办呢?答案是将a5复制一份在与a5拼起来进行哈希计算得到b3;继续将b1和b2拼起来进行哈希运算得到c1,同样的b3会被复制一份再与b3拼起来进行哈希运算得到c2;最后将c1和c2拼起来进行哈希运算得到最终的哈希值,这个哈希值就是Merkle Hash。
从Merkle Hash的计算方法可以得出结论:修改任意一笔交易,哪怕是一个字节,或者交换两个交易的顺序,都会导致Merkle Hash验证失败,也就会导致这个区块本身是无效的。所以Merkle Hash记录在头部,它的作用就是保证交易记录永远不能够被修改。
区块本身用Block Hash来标识:Block Hash是区块唯一标识。一个区块的hash并没有记录在区块头部,而是通过计算区块的hash得到的。
区块的Prev Hash记录了上一个区块的Hash,这样就可以通过Prev Hash追踪到上一个区块,由于下一个区块的Prev Hash又会指向当前区块,这样每一个区块的Prev Hash都指向上一个区块,这些区块串起来就形成了区块链。如果一个攻击者恶意攻击了某一个区块的交易记录,那么这个区块的Merkle Hash验证就不会通过,所以攻击者只能重新计算Merkle Hash,然后把区块头的Merkle Hash也修改了,但是这个区块本身的Hash已经改变,那么下一个区块指向该区块的链接也断掉了。由于比特币区块的hash必须满足一定的难度值,所以攻击者只能把后面所以区块全部重新计算,并且伪造出来,才能修改整个区块链。
修改一个区块的成本已经非常高了,如果要修改整个区块链,那么其成本非常非常的高昂。在比特币网络中,伪造区块链需要拥有超过51%的全网算力。所以比特币网络运行了6年,从来没有被攻破过。